bailian-cli-commands 2.4.0 → 2.5.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.
Files changed (3) hide show
  1. package/dist/index.d.mts +521 -179
  2. package/dist/index.mjs +118 -119
  3. package/package.json +3 -3
package/dist/index.mjs CHANGED
@@ -1,32 +1,32 @@
1
- import{createRequire as e}from"node:module";import{ASYNC_FLAG as t,BailianError as n,CONCURRENT_FLAG as r,DECISION_REGIONS as i,DEFAULT_DECISION_MODEL as a,DEFAULT_DECISION_REGION as o,DEFAULT_INSTALL_PS1_URL as s,DEFAULT_INSTALL_SCRIPT_URL as c,DEFAULT_LANGUAGE as l,DEFAULT_TRAINING_TYPE as u,DOCS_HOSTS as d,ExitCode as f,MAX_CPT_BYTES as p,MAX_DATASET_BYTES as m,MAX_DECISION_DATASET_BYTES as h,MAX_MEDIA_ZIP_BYTES as g,MODEL_LIST_API as _,Modalities as v,RAG_PATHS as y,REGIONS as b,SANDBOX_PATHS as x,SEMANTIC_TOP_K as S,STRATEGIES as ee,SUPPORTED_LANGUAGES as te,TRAINING_TYPES_CLI as ne,UsageError as C,agentStudioFilesPath as re,agentStudioHost as ie,analyzeIntent as ae,anonymousConsoleCall as oe,appCompletionPath as se,bailianMcpPath as ce,bailianMcpSsePath as le,buildAcsCanonicalQuery as ue,buildAsrContextMessages as de,buildAsrFlashRequest as fe,buildAsyncAsrLanguageFields as pe,buildDocLink as me,buildPrepaidInfo as he,buildReservationCapacity as ge,buildVocabularyRequest as _e,callConsoleGateway as ve,cancelCompressJob as ye,cancelFineTune as be,chatPath as xe,collectAsrTranscriptionItems as Se,computeSkillStatuses as Ce,createBailianControlUser as we,createCapacityInstance as Te,createCompressJob as Ee,createDeployment as De,createFineTune as Oe,createInstrumentedFetch as ke,createVocabulary as Ae,decisionPath as je,defaultDeployPlan as Me,defineCommand as w,deleteCapacityInstance as Ne,deleteCompressJob as Pe,deleteConfigProfile as Fe,deleteDataset as Ie,deleteDeployment as Le,deleteFineTune as Re,deleteVocabulary as ze,detectInstalledAgents as Be,detectModality as Ve,detectOutputFormat as T,effectiveConsoleGatewayConfig as E,estimateCptTokens as He,estimateSftDpoTokens as Ue,exportCheckpoint as We,extractAsrFlashText as Ge,fanOutSkillToAgents as Ke,fetchModelCapability as qe,fetchModelDetail as Je,fetchModelGroups as Ye,fetchModelGroupsAll as Xe,fetchModelListAll as Ze,fetchPredictConfig as Qe,fetchSkillsIndex as $e,fetchTrainingModelPrice as et,findDeploymentEntry as tt,findModelByName as nt,formatIssue as rt,generateCLIAccessToken as it,generateFilename as at,getApiKeyLoginKind as ot,getCapacityInstance as st,getCapacityOperation as ct,getCompressJob as lt,getCompressJobLogs as ut,getConfigDir as dt,getDataset as ft,getDeployment as pt,getFineTune as mt,getFineTuneLogs as ht,getHermesHome as gt,getModelProfilePreset as _t,getModels as vt,getProfile as yt,getSkillRegistryBaseUrl as bt,getSkillsDir as xt,getUpdateInstallMethod as St,hasPrepaidFlags as Ct,image2videoPath as wt,imageFileToDataUri as Tt,inspectDecisionQuestions as Et,inspectDecisionState as Dt,installSkillWithFanout as Ot,isApiKeyCapability as kt,isDashScopeGateway as At,isDecisionObject as jt,isLocalFile as Mt,isStreamableHttpUnsupported as Nt,isTrainingTypeCli as Pt,knowledgeChatEndpoint as Ft,knowledgeRetrievePath as It,knowledgeSearchEndpoint as Lt,listBailianControlWorkspaces as Rt,listCapacityInstances as zt,listCheckpoints as Bt,listCompressJobs as Vt,listCompressTemplates as Ht,listDatasets as Ut,listDeployableModels as Wt,listDeployments as Gt,listFineTunes as Kt,listIndependentDeployedModels as qt,listSkillDirsOnDisk as Jt,listSupportedTrainingTypes as Yt,listVocabularies as Xt,mapApiError as Zt,maskToken as Qt,maybeSyncWikiData as $t,mcpWebSearchPath as en,memoryAddPath as tn,memoryListPath as nn,memoryNodePath as rn,memorySearchPath as an,modelSupportsTrainingType as on,modelsLimitsPath as sn,modelsPermissionsPath as cn,normalizeConfigName as ln,normalizeModelBaseUrl as un,parseBooleanValue as dn,parseDatasetSchemaFlag as fn,parseInstantVocabulary as pn,parseSSE as mn,parseSkillNames as hn,parseVocabularyEntries as gn,pickPlanStrategy as _n,planUnlinkSkillFromAgents as vn,preflightBatchSizeGate as yn,profileSchemaPath as bn,queryVocabulary as xn,ragEndpoint as D,rankModels as Sn,readConfigFile as Cn,readSkillLock as wn,readTextFromPathOrStdin as Tn,recallSemantic as En,redactDataUri as Dn,removeSkillDir as On,renewCapacityInstance as kn,requestJson as An,resetBailianControlPolicies4Agent as jn,resolveAsrApi as Mn,resolveBooleanFlag as Nn,resolveImageEditApi as Pn,resolveImageGenerateApi as Fn,resolveOutputDir as In,resolveWatermark as Ln,responsesPath as Rn,runWithConcurrency as zn,sandboxApiPath as Bn,sandboxBaseUrl as Vn,sandboxInstanceActionPath as Hn,sandboxInstancePath as Un,sandboxTemplateBuildStatusPath as Wn,sandboxTemplatePath as Gn,scaleCapacityInstance as Kn,scaleDeployment as qn,securityAgentLogsEndpoint as Jn,securityGet as Yn,securityOverviewEndpoint as Xn,speechRecognizePath as Zn,speechSynthesizePath as Qn,speechVocabularyPath as $n,startModelService as er,stopModelService as tr,stripDecisionTrainingFields as nr,stripUndefined as rr,taskPath as ir,trackingHeaders as ar,trainingTypeMethodVariant as or,unlinkSkillFromAgents as sr,unwrapDecisionQuestions as cr,unwrapResponse as lr,updateDeployment as ur,updateDeploymentOverflow as dr,updateVocabulary as fr,uploadDataset as pr,userProfilePath as mr,validateDataset as hr,validatePrepaidFlags as gr,validateReservationCapacity as _r,videoGeneratePath as vr,workspaceMaaSBaseUrl as yr,writeConfigFile as br,writeSkillLock as xr}from"bailian-cli-core";import{API_KEY_PAGE as Sr,BOOL_FLAG_PROMPT_EXTEND_API_DEFAULT as Cr,BOOL_FLAG_PROMPT_EXTEND_CLI_TRUE as wr,BOOL_FLAG_PROMPT_EXTEND_IMAGE_GENERATE as Tr,BOOL_FLAG_WATERMARK as Er,VOICE_TTS_PAGE as Dr,ansi as O,collectPipelineHints as Or,collectPipelineIssues as kr,createSpinner as Ar,displayWidth as jr,downloadFile as Mr,downloadParallel as Nr,emitBare as k,emitRequestId as Pr,emitResult as A,executePipeline as Fr,fetchBinaryChannelVersion as Ir,fetchLatestVersion as Lr,formatBytes as Rr,formatTable as zr,getConcurrency as Br,initPipelineSteps as Vr,isValidUpdateTargetVersion as Hr,mcpMarketplaceDetailPage as Ur,normalizeBinaryVersion as Wr,padEnd as j,performBinaryUpdate as Gr,poll as Kr,refundConsolePage as qr,renderBoxTable as Jr,renderGauge as Yr,resolveImageSize as Xr,runConcurrent as Zr,streamPipelineEvents as Qr,supportsColor as $r}from"bailian-cli-runtime";import{createHash as ei,randomBytes as ti,randomUUID as ni,timingSafeEqual as ri}from"node:crypto";import ii from"node:http";import{execFile as ai,spawn as oi}from"node:child_process";import{copyFileSync as si,createWriteStream as ci,existsSync as li,mkdirSync as ui,readFileSync as di,renameSync as fi,statSync as pi,writeFileSync as mi}from"fs";import{basename as hi,dirname as gi,extname as _i,join as vi}from"path";import{createReadStream as yi,existsSync as M,lstatSync as bi,mkdirSync as xi,readFileSync as Si,readdirSync as Ci,statSync as wi,unlinkSync as Ti,writeFileSync as Ei}from"node:fs";import{basename as Di,dirname as Oi,extname as ki,join as N,relative as Ai,resolve as P,sep as ji}from"node:path";import{homedir as Mi}from"node:os";import{inflateRawSync as Ni}from"node:zlib";import Pi,{parseDocument as Fi}from"yaml";import{parse as Ii,stringify as Li}from"smol-toml";import{homedir as Ri,platform as zi}from"os";import{execSync as Bi}from"child_process";import{link as Vi,mkdir as Hi,readFile as Ui,rename as Wi,stat as Gi,unlink as Ki,writeFile as qi}from"node:fs/promises";import Ji from"boxen";import Yi,{Chalk as Xi}from"chalk";import*as Zi from"@openagentpack/sdk";import{AGENTS_PROVIDER_FIELDS as Qi,LocalFileStateBackend as $i,SessionEventSchema as ea,StateManager as ta,UserError as na,archiveRemoteSession as ra,bootstrapRuntimeCredentialsSync as ia,buildAgentDecl as aa,createManagedApiContext as oa,createMemory as sa,createProjectRuntime as ca,createRemoteWebhookEndpoint as la,createSessionForAgent as ua,createVaultCredentialWithStateBackend as da,deleteFile as fa,deleteMemory as pa,deleteRemoteWebhookEndpoint as ma,deleteSession as ha,destroyPlannedProjectResources as ga,disableRemoteWebhookEndpoint as _a,downloadRemoteFile as va,downloadRemoteSkill as ya,enableRemoteWebhookEndpoint as ba,executePlannedProject as xa,getFileInfo as Sa,getManagedAgentProviderCapabilities as Ca,getMemory as wa,getMemoryStore as Ta,getMemoryVersion as Ea,getRemoteAgent as Da,getRemoteDeployment as Oa,getRemoteDeploymentRun as ka,getRemoteEnvironment as Aa,getRemoteSkill as ja,getRemoteVault as Ma,getRemoteWebhookEndpoint as Na,getSession as Pa,importResource as Fa,inspectSkillSource as Ia,isTerminalSessionStatus as La,listMemories as Ra,listMemoryStores as za,listMemoryVersions as Ba,listRemoteAgentVersions as Va,listRemoteAgents as Ha,listRemoteDeploymentRuns as Ua,listRemoteDeployments as Wa,listRemoteEnvironments as Ga,listRemoteFiles as Ka,listRemoteSkillVersions as qa,listRemoteSkills as Ja,listRemoteVaults as Ya,listRemoteWebhookEndpoints as Xa,listRemoteWebhookEvents as Za,listSessionEvents as Qa,listSessionSummaries as $a,parseSessionResources as eo,parseStateAddress as to,planDestroyProjectContext as no,planProjectContext as ro,planProjectWithStateBackend as io,planVaultCredentialCreateWithStateBackend as ao,redactMemoryVersion as oo,resetRemoteWebhookSecret as so,resolveBailianApiBaseUrl as co,resolveProjectConfig as lo,resolveProjectConfigFromObject as uo,runRemoteDeployment as fo,sendRemoteSessionEvents as po,sendSessionMessagePolling as mo,sendSessionMessageStreaming as ho,setRemoteDeploymentPaused as go,startSessionRun as _o,startSessionRunPolling as vo,streamSessionEvents as yo,syncProjectResourcesWithStateBackend as bo,testRemoteWebhookEndpoint as xo,updateMemory as So,updateRemoteSession as Co,updateRemoteWebhookEndpoint as wo,uploadFile as To,validateProjectConfig as Eo}from"@openagentpack/sdk";import{promisify as Do}from"node:util";import{commitProjectBuild as Oo,createDirectoryWorkspaceVersionService as ko,executeProjectPublish as Ao,initializeDirectoryProject as jo,planProjectPublish as Mo,previewProjectBuild as No,resolveDirectoryProjectRoot as Po,validateDirectoryProject as Fo}from"@openagentpack/sdk/project-workspace";import{sanitizeSessionEvents as Io}from"@openagentpack/sdk/session-events";const Lo=/* @__PURE__ */ new Set([200,400,401,403,404,405]),Ro=[`cn-beijing`,`ap-southeast-1`,`cn-hongkong`,`ap-northeast-1`,`eu-central-1`,`us-east-1`],zo={ordinary:[`https://dashscope.aliyuncs.com`,`https://dashscope-intl.aliyuncs.com`,`https://dashscope-us.aliyuncs.com`,`https://cn-hongkong.dashscope.aliyuncs.com`],"token-plan":[`https://token-plan.cn-beijing.maas.aliyuncs.com`,`https://token-plan.ap-southeast-1.maas.aliyuncs.com`]};function Bo(e,t){let n=new URL(t===`token-plan`?`/compatible-mode/v1/models`:`/api/v1/models`,`${e}/`);return t===`ordinary`&&(n.searchParams.set(`page_no`,`1`),n.searchParams.set(`page_size`,`1`)),n.toString()}function Vo(e){return e===`unknown`?[`ordinary`,`token-plan`]:[e]}function Ho(e){return new URL(un(e)).hostname.startsWith(`token-plan.`)}function Uo(e,t,n,r){let i=un(n),a=Bo(i,r);t.has(a)||(t.add(a),e.push({baseUrl:i,kind:r,modelsUrl:a}))}function Wo(e,t){let n=ot(e),r=Vo(n),i=[],a=/* @__PURE__ */ new Set;if(t.explicitBaseUrl){for(let e of r)Uo(i,a,t.explicitBaseUrl,e);return i}if(t.storedBaseUrl){let e=Ho(t.storedBaseUrl);for(let o of r)(n===`unknown`||e===(o===`token-plan`))&&Uo(i,a,t.storedBaseUrl,o)}if(t.workspaceId&&r.includes(`ordinary`))for(let e of Ro)Uo(i,a,`https://${t.workspaceId}.${e}.maas.aliyuncs.com`,`ordinary`);for(let e of r)for(let t of zo[e])Uo(i,a,t,e);return i}function Go(e){if(!(e instanceof n))return!1;let t=e.api?.httpStatus;return t!==void 0&&Lo.has(t)}async function Ko(e,t,r){let i=Wo(t,r),a=await Promise.all(i.map(async n=>{try{return await An(e,{url:n.modelsUrl,headers:{Authorization:`Bearer ${t}`},timeout:Math.min(e.settings.timeout,5)}),{candidate:n}}catch(e){return{candidate:n,error:e}}})),o=a.find(e=>e.error===void 0);if(o)return{baseUrl:o.candidate.baseUrl,kind:o.candidate.kind};let s=a.find(e=>!Go(e.error));if(s?.error!==void 0)throw s.error;let c=r.explicitBaseUrl?`Check that the API key belongs to this Base URL.`:`For a workspace-specific or custom endpoint, retry with --base-url <url>.`;throw new n(`API key validation failed: the key was not accepted by any supported model endpoint.`,f.AUTH,c)}async function qo(e,t,n){let r=n.persistBaseUrl?un(n.persistBaseUrl):void 0;await e.authStore.login({...n.persistPatch,api_key:t,base_url:r,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,default_speech_model:n.defaultSpeechModel,default_speech_recognition_model:n.defaultSpeechRecognitionModel,api_key_capabilities:n.apiKeyCapabilities?[...n.apiKeyCapabilities]:void 0})}function Jo(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(/* @__PURE__ */ Error(`Expected TCP socket address`));return}n(t.port)})})}function Yo(e){return`"${e.replaceAll(`"`,`""`)}"`}function Xo(e,t=process.platform){return t===`win32`?{command:`cmd`,args:[`/d`,`/v:off`,`/s`,`/c`,`"${`start "" ${Yo(e)}`}"`],windowsVerbatimArguments:!0}:t===`darwin`?{command:`open`,args:[e]}:{command:`xdg-open`,args:[e]}}function Zo(e){let t=Xo(e);return new Promise((e,n)=>{ai(t.command,t.args,{windowsHide:!0,windowsVerbatimArguments:t.windowsVerbatimArguments},t=>{t?n(t):e()})})}function Qo(e){return Zo(e)}function $o(e,t){return typeof t==`string`?t:e.localize?e.localize(t):t[`en-US`]}const es=/* @__PURE__ */ RegExp(`\r
1
+ import{createRequire as e}from"node:module";import{ASYNC_FLAG as t,BailianError as n,CONCURRENT_FLAG as r,DECISION_REGIONS as i,DEFAULT_DECISION_MODEL as a,DEFAULT_DECISION_REGION as o,DEFAULT_INSTALL_PS1_URL as s,DEFAULT_INSTALL_SCRIPT_URL as c,DEFAULT_LANGUAGE as l,DEFAULT_TRAINING_TYPE as u,DOCS_HOSTS as d,ExitCode as f,MAX_CPT_BYTES as p,MAX_DATASET_BYTES as m,MAX_DECISION_DATASET_BYTES as h,MAX_MEDIA_ZIP_BYTES as g,MODEL_LIST_API as _,Modalities as v,RAG_PATHS as y,REGIONS as b,SANDBOX_PATHS as x,SEMANTIC_TOP_K as S,STRATEGIES as ee,SUPPORTED_LANGUAGES as te,TRAINING_TYPES_CLI as ne,UsageError as C,agentStudioFilesPath as re,agentStudioHost as ie,analyzeIntent as ae,anonymousConsoleCall as oe,appCompletionPath as se,bailianMcpPath as ce,bailianMcpSsePath as le,buildAcsCanonicalQuery as ue,buildAsrContextMessages as de,buildAsrFlashRequest as fe,buildAsyncAsrLanguageFields as pe,buildDocLink as me,buildPrepaidInfo as he,buildReservationCapacity as ge,buildVocabularyRequest as _e,callConsoleGateway as ve,cancelCompressJob as ye,cancelFineTune as be,chatPath as xe,collectAsrTranscriptionItems as Se,computeSkillStatuses as Ce,createBailianControlUser as we,createCapacityInstance as Te,createCompressJob as Ee,createDeployment as De,createFineTune as Oe,createInstrumentedFetch as ke,createVocabulary as Ae,decisionPath as je,defaultDeployPlan as Me,defineCommand as w,deleteCapacityInstance as Ne,deleteCompressJob as Pe,deleteConfigProfile as Fe,deleteDataset as Ie,deleteDeployment as Le,deleteFineTune as Re,deleteVocabulary as ze,detectInstalledAgents as Be,detectModality as Ve,detectOutputFormat as T,effectiveConsoleGatewayConfig as E,estimateCptTokens as He,estimateSftDpoTokens as Ue,exportCheckpoint as We,extractAsrFlashText as Ge,fanOutSkillToAgents as Ke,fetchModelCapability as qe,fetchModelDetail as Je,fetchModelGroups as Ye,fetchModelGroupsAll as Xe,fetchModelListAll as Ze,fetchPredictConfig as Qe,fetchSkillsIndex as $e,fetchTrainingModelPrice as et,findDeploymentEntry as tt,findModelByName as nt,formatIssue as rt,generateCLIAccessToken as it,generateFilename as at,getApiKeyLoginKind as ot,getCapacityInstance as st,getCapacityOperation as ct,getCompressJob as lt,getCompressJobLogs as ut,getConfigDir as dt,getDataset as ft,getDeployment as pt,getFineTune as mt,getFineTuneLogs as ht,getHermesHome as gt,getModelProfilePreset as _t,getModels as vt,getProfile as yt,getSkillRegistryBaseUrl as bt,getSkillsDir as xt,getUpdateInstallMethod as St,hasPrepaidFlags as Ct,image2videoPath as wt,imageFileToDataUri as Tt,inspectDecisionQuestions as Et,inspectDecisionState as Dt,installSkillWithFanout as Ot,isApiKeyCapability as kt,isDashScopeGateway as At,isDecisionObject as jt,isLocalFile as Mt,isStreamableHttpUnsupported as Nt,isTrainingTypeCli as Pt,knowledgeChatEndpoint as Ft,knowledgeSearchEndpoint as It,listBailianControlWorkspaces as Lt,listCapacityInstances as Rt,listCheckpoints as zt,listCompressJobs as Bt,listCompressTemplates as Vt,listDatasets as Ht,listDeployableModels as Ut,listDeployments as Wt,listFineTunes as Gt,listIndependentDeployedModels as Kt,listSkillDirsOnDisk as qt,listSupportedTrainingTypes as Jt,listVocabularies as Yt,mapApiError as Xt,maskToken as Zt,maybeSyncWikiData as Qt,mcpWebSearchPath as $t,memoryAddAsyncPath as en,memoryEndpoint as tn,memoryEventPath as nn,memoryListPath as rn,memoryNodePath as an,memorySearchPath as on,memorySkillExportPath as sn,modelSupportsTrainingType as cn,modelsLimitsPath as ln,modelsPermissionsPath as un,normalizeConfigName as dn,normalizeModelBaseUrl as fn,parseBooleanValue as pn,parseDatasetSchemaFlag as mn,parseInstantVocabulary as hn,parseSSE as gn,parseSkillNames as _n,parseVocabularyEntries as vn,pickPlanStrategy as yn,planUnlinkSkillFromAgents as bn,preflightBatchSizeGate as xn,profileSchemaItemPath as Sn,profileSchemaPath as Cn,queryVocabulary as wn,ragEndpoint as D,rankModels as Tn,readConfigFile as En,readSkillLock as Dn,readTextFromPathOrStdin as On,recallSemantic as kn,redactDataUri as An,removeSkillDir as jn,renewCapacityInstance as Mn,requestJson as Nn,resetBailianControlPolicies4Agent as Pn,resolveAsrApi as Fn,resolveBooleanFlag as In,resolveImageEditApi as Ln,resolveImageGenerateApi as Rn,resolveOutputDir as zn,resolveWatermark as Bn,responsesPath as Vn,runWithConcurrency as Hn,sandboxApiPath as Un,sandboxBaseUrl as Wn,sandboxInstanceActionPath as Gn,sandboxInstancePath as Kn,sandboxTemplateBuildStatusPath as qn,sandboxTemplatePath as Jn,scaleCapacityInstance as Yn,scaleDeployment as Xn,securityAgentLogsEndpoint as Zn,securityGet as Qn,securityOverviewEndpoint as $n,speechRecognizePath as er,speechSynthesizePath as tr,speechVocabularyPath as nr,startModelService as rr,stopModelService as ir,stripDecisionTrainingFields as ar,stripUndefined as or,taskPath as sr,trackingHeaders as cr,trainingTypeMethodVariant as lr,unlinkSkillFromAgents as ur,unwrapDecisionQuestions as dr,unwrapResponse as fr,updateDeployment as pr,updateDeploymentOverflow as mr,updateVocabulary as hr,uploadDataset as gr,userProfilePath as _r,validateDataset as vr,validatePrepaidFlags as yr,validateReservationCapacity as br,videoGeneratePath as xr,workspaceMaaSBaseUrl as Sr,writeConfigFile as Cr,writeSkillLock as wr}from"bailian-cli-core";import{API_KEY_PAGE as Tr,BOOL_FLAG_PROMPT_EXTEND_API_DEFAULT as Er,BOOL_FLAG_PROMPT_EXTEND_CLI_TRUE as Dr,BOOL_FLAG_PROMPT_EXTEND_IMAGE_GENERATE as Or,BOOL_FLAG_WATERMARK as kr,VOICE_TTS_PAGE as Ar,ansi as O,collectPipelineHints as jr,collectPipelineIssues as Mr,createSpinner as Nr,displayWidth as Pr,downloadFile as Fr,downloadParallel as Ir,emitBare as k,emitRequestId as Lr,emitResult as A,executePipeline as Rr,fetchBinaryChannelVersion as zr,fetchLatestVersion as Br,formatBytes as Vr,formatTable as Hr,getConcurrency as Ur,initPipelineSteps as Wr,isValidUpdateTargetVersion as Gr,mcpMarketplaceDetailPage as Kr,normalizeBinaryVersion as qr,padEnd as j,performBinaryUpdate as Jr,poll as Yr,refundConsolePage as Xr,renderBoxTable as Zr,renderGauge as Qr,resolveImageSize as $r,runConcurrent as ei,streamPipelineEvents as ti,supportsColor as ni}from"bailian-cli-runtime";import{createHash as ri,randomBytes as ii,randomUUID as ai,timingSafeEqual as oi}from"node:crypto";import si from"node:http";import{execFile as ci,spawn as li}from"node:child_process";import{copyFileSync as ui,createWriteStream as di,existsSync as fi,mkdirSync as pi,readFileSync as mi,renameSync as hi,statSync as gi,writeFileSync as _i}from"fs";import{basename as vi,dirname as yi,extname as bi,join as xi}from"path";import{createReadStream as Si,existsSync as M,lstatSync as Ci,mkdirSync as wi,readFileSync as Ti,readdirSync as Ei,statSync as Di,unlinkSync as Oi,writeFileSync as ki}from"node:fs";import{basename as Ai,dirname as ji,extname as Mi,join as N,relative as Ni,resolve as P,sep as Pi}from"node:path";import{homedir as Fi}from"node:os";import{inflateRawSync as Ii}from"node:zlib";import Li,{parseDocument as Ri}from"yaml";import{parse as zi,stringify as Bi}from"smol-toml";import{homedir as Vi,platform as Hi}from"os";import{execSync as Ui}from"child_process";import{link as Wi,mkdir as Gi,readFile as Ki,rename as qi,stat as Ji,unlink as Yi,writeFile as Xi}from"node:fs/promises";import Zi from"boxen";import Qi,{Chalk as $i}from"chalk";import*as ea from"@openagentpack/sdk";import{AGENTS_PROVIDER_FIELDS as ta,LocalFileStateBackend as na,SessionEventSchema as ra,StateManager as ia,UserError as aa,archiveRemoteSession as oa,bootstrapRuntimeCredentialsSync as sa,buildAgentDecl as ca,createManagedApiContext as la,createMemory as ua,createProjectRuntime as da,createRemoteWebhookEndpoint as fa,createSessionForAgent as pa,createVaultCredentialWithStateBackend as ma,deleteFile as ha,deleteMemory as ga,deleteRemoteWebhookEndpoint as _a,deleteSession as va,destroyPlannedProjectResources as ya,disableRemoteWebhookEndpoint as ba,downloadRemoteFile as xa,downloadRemoteSkill as Sa,enableRemoteWebhookEndpoint as Ca,executePlannedProject as wa,getFileInfo as Ta,getManagedAgentProviderCapabilities as Ea,getMemory as Da,getMemoryStore as Oa,getMemoryVersion as ka,getRemoteAgent as Aa,getRemoteDeployment as ja,getRemoteDeploymentRun as Ma,getRemoteEnvironment as Na,getRemoteSkill as Pa,getRemoteVault as Fa,getRemoteWebhookEndpoint as Ia,getSession as La,importResource as Ra,inspectSkillSource as za,isTerminalSessionStatus as Ba,listMemories as Va,listMemoryStores as Ha,listMemoryVersions as Ua,listRemoteAgentVersions as Wa,listRemoteAgents as Ga,listRemoteDeploymentRuns as Ka,listRemoteDeployments as qa,listRemoteEnvironments as Ja,listRemoteFiles as Ya,listRemoteSkillVersions as Xa,listRemoteSkills as Za,listRemoteVaults as Qa,listRemoteWebhookEndpoints as $a,listRemoteWebhookEvents as eo,listSessionEvents as to,listSessionSummaries as no,parseSessionResources as ro,parseStateAddress as io,planDestroyProjectContext as ao,planProjectContext as oo,planProjectWithStateBackend as so,planVaultCredentialCreateWithStateBackend as co,redactMemoryVersion as lo,resetRemoteWebhookSecret as uo,resolveBailianApiBaseUrl as fo,resolveProjectConfig as po,resolveProjectConfigFromObject as mo,runRemoteDeployment as ho,sendRemoteSessionEvents as go,sendSessionMessagePolling as _o,sendSessionMessageStreaming as vo,setRemoteDeploymentPaused as yo,startSessionRun as bo,startSessionRunPolling as xo,streamSessionEvents as So,syncProjectResourcesWithStateBackend as Co,testRemoteWebhookEndpoint as wo,updateMemory as To,updateRemoteSession as Eo,updateRemoteWebhookEndpoint as Do,uploadFile as Oo,validateProjectConfig as ko}from"@openagentpack/sdk";import{promisify as Ao}from"node:util";import{commitProjectBuild as jo,createDirectoryWorkspaceVersionService as Mo,executeProjectPublish as No,initializeDirectoryProject as Po,planProjectPublish as Fo,previewProjectBuild as Io,resolveDirectoryProjectRoot as Lo,validateDirectoryProject as Ro}from"@openagentpack/sdk/project-workspace";import{sanitizeSessionEvents as zo}from"@openagentpack/sdk/session-events";const Bo=/* @__PURE__ */ new Set([200,400,401,403,404,405]),Vo=[`cn-beijing`,`ap-southeast-1`,`cn-hongkong`,`ap-northeast-1`,`eu-central-1`,`us-east-1`],Ho={ordinary:[`https://dashscope.aliyuncs.com`,`https://dashscope-intl.aliyuncs.com`,`https://dashscope-us.aliyuncs.com`,`https://cn-hongkong.dashscope.aliyuncs.com`],"token-plan":[`https://token-plan.cn-beijing.maas.aliyuncs.com`,`https://token-plan.ap-southeast-1.maas.aliyuncs.com`]};function Uo(e,t){let n=new URL(t===`token-plan`?`/compatible-mode/v1/models`:`/api/v1/models`,`${e}/`);return t===`ordinary`&&(n.searchParams.set(`page_no`,`1`),n.searchParams.set(`page_size`,`1`)),n.toString()}function Wo(e){return e===`unknown`?[`ordinary`,`token-plan`]:[e]}function Go(e){return new URL(fn(e)).hostname.startsWith(`token-plan.`)}function Ko(e,t,n,r){let i=fn(n),a=Uo(i,r);t.has(a)||(t.add(a),e.push({baseUrl:i,kind:r,modelsUrl:a}))}function qo(e,t){let n=ot(e),r=Wo(n),i=[],a=/* @__PURE__ */ new Set;if(t.explicitBaseUrl){for(let e of r)Ko(i,a,t.explicitBaseUrl,e);return i}if(t.storedBaseUrl){let e=Go(t.storedBaseUrl);for(let o of r)(n===`unknown`||e===(o===`token-plan`))&&Ko(i,a,t.storedBaseUrl,o)}if(t.workspaceId&&r.includes(`ordinary`))for(let e of Vo)Ko(i,a,`https://${t.workspaceId}.${e}.maas.aliyuncs.com`,`ordinary`);for(let e of r)for(let t of Ho[e])Ko(i,a,t,e);return i}function Jo(e){if(!(e instanceof n))return!1;let t=e.api?.httpStatus;return t!==void 0&&Bo.has(t)}async function Yo(e,t,r){let i=qo(t,r),a=await Promise.all(i.map(async n=>{try{return await Nn(e,{url:n.modelsUrl,headers:{Authorization:`Bearer ${t}`},timeout:Math.min(e.settings.timeout,5)}),{candidate:n}}catch(e){return{candidate:n,error:e}}})),o=a.find(e=>e.error===void 0);if(o)return{baseUrl:o.candidate.baseUrl,kind:o.candidate.kind};let s=a.find(e=>!Jo(e.error));if(s?.error!==void 0)throw s.error;let c=r.explicitBaseUrl?`Check that the API key belongs to this Base URL.`:`For a workspace-specific or custom endpoint, retry with --base-url <url>.`;throw new n(`API key validation failed: the key was not accepted by any supported model endpoint.`,f.AUTH,c)}async function Xo(e,t,n){let r=n.persistBaseUrl?fn(n.persistBaseUrl):void 0;await e.authStore.login({...n.persistPatch,api_key:t,base_url:r,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,default_speech_model:n.defaultSpeechModel,default_speech_recognition_model:n.defaultSpeechRecognitionModel,api_key_capabilities:n.apiKeyCapabilities?[...n.apiKeyCapabilities]:void 0})}function Zo(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(/* @__PURE__ */ Error(`Expected TCP socket address`));return}n(t.port)})})}function Qo(e){return`"${e.replaceAll(`"`,`""`)}"`}function $o(e,t=process.platform){return t===`win32`?{command:`cmd`,args:[`/d`,`/v:off`,`/s`,`/c`,`"${`start "" ${Qo(e)}`}"`],windowsVerbatimArguments:!0}:t===`darwin`?{command:`open`,args:[e]}:{command:`xdg-open`,args:[e]}}function es(e){let t=$o(e);return new Promise((e,n)=>{ci(t.command,t.args,{windowsHide:!0,windowsVerbatimArguments:t.windowsVerbatimArguments},t=>{t?n(t):e()})})}function ts(e){return es(e)}function ns(e,t){return typeof t==`string`?t:e.localize?e.localize(t):t[`en-US`]}const rs=/* @__PURE__ */ RegExp(`\r
2
2
  \r
3
3
  |
4
4
 
5
- `),ts={domestic:`https://bailian.console.aliyun.com`,international:`https://modelstudio.console.alibabacloud.com`};function ns(e){return e&&ts[e]||ts.domestic}function rs(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>65536){n(/* @__PURE__ */ Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function is(e){let t=e.headers[`content-type`];return Array.isArray(t)?t[0]??``:typeof t==`string`?t:``}function as(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 os(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(es);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 ss(e){for(let t of[`access_token`,`accessToken`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function cs(e){for(let t of[`api_key`,`apiKey`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function ls(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=ss(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=ss(a);if(e)return e}return null}function us(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`multipart/form-data`)){let n=as(t);if(n){let t=os(e,n);if(t)return t}}if(n.includes(`application/json`)||n.includes(`text/json`)){let t=ls(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=ls(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=as(t);if(i){let t=os(e,i);if(t)return t}return null}function ds(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=cs(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=cs(a);if(e)return e}return null}function fs(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`application/json`)||n.includes(`text/json`)){let t=ds(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=ds(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 ps(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return null}function ms(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:ps(r,`base_url`,`baseUrl`),consoleSite:ps(r,`console_site`,`consoleSite`),consoleRegion:ps(r,`console_region`,`consoleRegion`),consoleSwitchAgent:ps(r,`console_switch_agent`,`consoleSwitchAgent`),workspaceId:ps(r,`workspace_id`,`workspaceId`)}:n}async function hs(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=is(e),f;try{f=await rs(e)}catch{return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l}}let p=n?.trim()||us(f,d),m=r?.trim()||fs(f,d),h=ms(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 gs(e){return Jo(e)}async function _s(e,t,r){let i=ti(16).toString(`hex`),a,o=!1,s=ii.createServer(async(e,n)=>{try{if(e.method===`OPTIONS`){n.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, PATCH, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),n.end();return}if(new URL(e.url??`/`,`http://127.0.0.1`).searchParams.get(`state`)!==i){n.writeHead(400,{"Content-Type":`text/plain; charset=utf-8`}),n.end(`bad state
6
- `);return}let{accessToken:r,apiKey:c,baseUrl:l,consoleSite:u,consoleRegion:d,consoleSwitchAgent:f,workspaceId:p}=await hs(e),m=r||l||u||d||f||p;if(m||c)try{let e={access_token:r||void 0,console_site:u||void 0,console_region:d||void 0,console_switch_agent:f?Number(f):void 0,workspace_id:p||void 0};c?(await qo(t,c,{persistBaseUrl:l||void 0,persistPatch:e}),process.stderr.write(`Config saved to ${t.authStore.path}\n`)):m&&(await t.authStore.login({...e,base_url:l||void 0}),o=!0,process.stderr.write(`Config saved to ${t.authStore.path}\n`))}catch(e){a=e,n.writeHead(500,{"Content-Type":`text/plain; charset=utf-8`}),n.end(`Failed to save credentials
5
+ `),is={domestic:`https://bailian.console.aliyun.com`,international:`https://modelstudio.console.alibabacloud.com`};function as(e){return e&&is[e]||is.domestic}function os(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>65536){n(/* @__PURE__ */ Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function ss(e){let t=e.headers[`content-type`];return Array.isArray(t)?t[0]??``:typeof t==`string`?t:``}function cs(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 ls(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(rs);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 us(e){for(let t of[`access_token`,`accessToken`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function ds(e){for(let t of[`api_key`,`apiKey`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function fs(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=us(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=us(a);if(e)return e}return null}function ps(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`multipart/form-data`)){let n=cs(t);if(n){let t=ls(e,n);if(t)return t}}if(n.includes(`application/json`)||n.includes(`text/json`)){let t=fs(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=fs(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=cs(t);if(i){let t=ls(e,i);if(t)return t}return null}function ms(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=ds(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=ds(a);if(e)return e}return null}function hs(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`application/json`)||n.includes(`text/json`)){let t=ms(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=ms(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 gs(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return null}function _s(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:gs(r,`base_url`,`baseUrl`),consoleSite:gs(r,`console_site`,`consoleSite`),consoleRegion:gs(r,`console_region`,`consoleRegion`),consoleSwitchAgent:gs(r,`console_switch_agent`,`consoleSwitchAgent`),workspaceId:gs(r,`workspace_id`,`workspaceId`)}:n}async function vs(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=ss(e),f;try{f=await os(e)}catch{return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l}}let p=n?.trim()||ps(f,d),m=r?.trim()||hs(f,d),h=_s(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 ys(e){return Zo(e)}async function bs(e,t,r){let i=ii(16).toString(`hex`),a,o=!1,s=si.createServer(async(e,n)=>{try{if(e.method===`OPTIONS`){n.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, PATCH, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),n.end();return}if(new URL(e.url??`/`,`http://127.0.0.1`).searchParams.get(`state`)!==i){n.writeHead(400,{"Content-Type":`text/plain; charset=utf-8`}),n.end(`bad state
6
+ `);return}let{accessToken:r,apiKey:c,baseUrl:l,consoleSite:u,consoleRegion:d,consoleSwitchAgent:f,workspaceId:p}=await vs(e),m=r||l||u||d||f||p;if(m||c)try{let e={access_token:r||void 0,console_site:u||void 0,console_region:d||void 0,console_switch_agent:f?Number(f):void 0,workspace_id:p||void 0};c?(await Xo(t,c,{persistBaseUrl:l||void 0,persistPatch:e}),process.stderr.write(`Config saved to ${t.authStore.path}\n`)):m&&(await t.authStore.login({...e,base_url:l||void 0}),o=!0,process.stderr.write(`Config saved to ${t.authStore.path}\n`))}catch(e){a=e,n.writeHead(500,{"Content-Type":`text/plain; charset=utf-8`}),n.end(`Failed to save credentials
7
7
  `),s.close();return}n.writeHead(200,{"Content-Type":`text/plain; charset=utf-8`,"Access-Control-Allow-Origin":`*`}),n.end(`OK
8
- `),(m||c)&&s.close()}catch{n.statusCode=500,n.end()}}),c;try{c=await gs(s)}catch(e){let t=e instanceof Error?e.message:String(e);throw new n(`Could not bind to 127.0.0.1 (no free port or permission denied): ${t}`,f.USAGE)}let l=`${e}/console-login?notice=127.0.0.1:${c}?state=${encodeURIComponent(i)}`;r?.needApiKey&&(l+=`&needapikey=true`);try{await Qo(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).
8
+ `),(m||c)&&s.close()}catch{n.statusCode=500,n.end()}}),c;try{c=await ys(s)}catch(e){let t=e instanceof Error?e.message:String(e);throw new n(`Could not bind to 127.0.0.1 (no free port or permission denied): ${t}`,f.USAGE)}let l=`${e}/console-login?notice=127.0.0.1:${c}?state=${encodeURIComponent(i)}`;r?.needApiKey&&(l+=`&needapikey=true`);try{await ts(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).
9
9
  `)}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(`
10
10
  This process keeps the local port open for the console; press Ctrl+C when finished (or wait for idle timeout).
11
- `)}if(await new Promise((e,t)=>{let n=!1,r=()=>{n||(n=!0,clearTimeout(i),e())},i=setTimeout(()=>{s.close()},9e5);s.once(`close`,r),s.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),a)throw a;if(r?.needApiKey&&o){let e=t.identity.binName;process.stderr.write(`${$o(t,{"en-US":`Saved the console session only. Model commands still need an API key: ${e} auth login --console, or ${e} auth login --api-key <key>`,"zh-CN":`仅保存了控制台会话。模型命令仍需要 API Key:${e} auth login --console,或 ${e} auth login --api-key <key>`})}\n`)}}function vs(e){return typeof e==`string`&&e.trim().length>0}var ys=w({description:{"en-US":`Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist)`,"zh-CN":`使用 API Key、控制台浏览器登录或 OpenAPI AK/SK 进行认证(多种凭证可共存)`},auth:`none`,usageArgs:`--api-key <key> | --console | --open-api --access-key-id <id> --access-key-secret <secret>`,flags:{apiKey:{type:`string`,valueHint:`<key>`,description:{"en-US":`Model API key to validate and store`,"zh-CN":`要校验并保存的模型 API Key`}},baseUrl:{type:`string`,valueHint:`<url>`,description:{"en-US":`Model API base URL to validate and store with --api-key`,"zh-CN":`与 --api-key 一并校验并保存的模型 API Base URL`}},console:{type:`switch`,description:{"en-US":`Sign in via browser (China by default; use --console-site international for the international site). Creates an ordinary API key if needed; subscription plans require --api-key`,"zh-CN":`通过浏览器登录(默认中国站;国际站使用 --console-site international)。需要时会创建普通 API Key;订阅计划必须使用 --api-key 登录`}},consoleSite:{type:`string`,valueHint:`<site>`,description:{"en-US":`Console site: domestic, international`,"zh-CN":`控制台站点:domestic、international`}},openApi:{type:`switch`,description:{"en-US":`Store Alibaba Cloud OpenAPI AK/SK credentials`,"zh-CN":`保存阿里云 OpenAPI AK/SK 凭证`}},accessKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Alibaba Cloud Access Key ID to store`,"zh-CN":`要保存的阿里云 Access Key ID`}},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:{"en-US":`Alibaba Cloud Access Key Secret to store`,"zh-CN":`要保存的阿里云 Access Key Secret`}}},exampleArgs:[`--console`,`--api-key sk-xxxxx`,`--open-api --access-key-id LTAIxxxxx --access-key-secret xxxxx`],validate:e=>{let t=vs(e.apiKey),n=e.console===!0,r=e.openApi===!0;if(!t&&vs(e.baseUrl))return`Use --base-url only with --api-key`;if(!n&&vs(e.consoleSite))return`Use --console-site only with --console`;if(!r&&(vs(e.accessKeyId)||vs(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&&(!vs(e.accessKeyId)||!vs(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,localize:e.localize},o=r.apiKey,s=r.baseUrl?un(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 _s(ns(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 it({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=await Ko(a,o,{explicitBaseUrl:s,storedBaseUrl:i.stored().baseUrl,workspaceId:n.workspaceId}),l=_t(c.kind===`token-plan`?`token-plan`:void 0);await qo(a,o,{persistBaseUrl:c.baseUrl,defaultTextModel:l?.defaultTextModel,defaultVideoModel:l?.defaultVideoModel,defaultImageToVideoModel:l?.defaultImageToVideoModel,defaultReferenceToVideoModel:l?.defaultReferenceToVideoModel,defaultImageModel:l?.defaultImageModel,defaultSpeechModel:l?.defaultSpeechModel,defaultSpeechRecognitionModel:l?.defaultSpeechRecognitionModel,apiKeyCapabilities:l?.apiKeyCapabilities}),process.stderr.write(`API key validated and saved to ${i.path}\n`)}}),bs=w({description:{"en-US":`Show current authentication state`,"zh-CN":`显示当前认证状态`},auth:`none`,exampleArgs:[``,`--output json`],async run(e){let{identity:t,settings:n,localize:r}=e,i=T(n.output),a=e.authStore.describe(),o=a.apiKey?{source:a.apiKey.source,masked:Qt(a.apiKey.token),base_url:a.apiKey.baseUrl}:void 0,s=a.console?{source:a.console.source,masked:Qt(a.console.token),region:a.console.region,site:a.console.site}:void 0,c=a.openapi?{source:a.openapi.source,access_key_id:Qt(a.openapi.accessKeyId),access_key_secret:Qt(a.openapi.accessKeySecret)}:void 0,l=!!(o||s||c),u=n.configName??`default`,d=e.authStore.path,f=o?void 0:r({"en-US":`No model API key is configured. Model commands need: ${t.binName} auth login --console, or ${t.binName} auth login --api-key <key>`,"zh-CN":`尚未配置模型 API Key。模型命令需要:${t.binName} auth login --console,或 ${t.binName} auth login --api-key <key>`});if(!l){A({authenticated:!1,config:u,config_file:d,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: ${Sr}`].join(`
12
- `)},i);return}if(i!==`text`){A({authenticated:!0,config:u,config_file:d,api_key:o,console:s,openapi:c,...f?{hint:f}:{}},i);return}k(`Config: ${u}`),k(`Config file: ${d}`),k(`Authentication Status:`),o?k(` API key (model): ${o.source} ${o.masked}`):(k(` API key (model): not configured`),f&&k(` ${f}`)),k(s?` Console gateway: ${s.source} ${s.masked} (${s.region}, ${s.site})`:` Console gateway: not configured (run ${t.binName} auth login --console)`),k(c?` OpenAPI (AK/SK): ${c.source} ${c.access_key_id}`:` OpenAPI (AK/SK): not configured (run ${t.binName} auth login --open-api)`)}}),xs=w({description:{"en-US":`Clear stored credentials; full logout also clears the model Base URL`,"zh-CN":`清除已保存的凭证;完整退出还会清除模型 Base URL`},auth:`none`,usageArgs:`[--console | --open-api] [--dry-run]`,flags:{console:{type:`switch`,description:{"en-US":`Only clear the console access_token, keep api_key intact`,"zh-CN":`仅清除控制台 access_token,保留 api_key`}},openApi:{type:`switch`,description:{"en-US":`Only clear OpenAPI AK/SK/STS credentials, keep other credentials intact`,"zh-CN":`仅清除 OpenAPI AK/SK/STS 凭证,保留其他凭证`}}},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.
11
+ `)}if(await new Promise((e,t)=>{let n=!1,r=()=>{n||(n=!0,clearTimeout(i),e())},i=setTimeout(()=>{s.close()},9e5);s.once(`close`,r),s.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),a)throw a;if(r?.needApiKey&&o){let e=t.identity.binName;process.stderr.write(`${ns(t,{"en-US":`Saved the console session only. Model commands still need an API key: ${e} auth login --console, or ${e} auth login --api-key <key>`,"zh-CN":`仅保存了控制台会话。模型命令仍需要 API Key:${e} auth login --console,或 ${e} auth login --api-key <key>`})}\n`)}}function xs(e){return typeof e==`string`&&e.trim().length>0}var Ss=w({description:{"en-US":`Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist)`,"zh-CN":`使用 API Key、控制台浏览器登录或 OpenAPI AK/SK 进行认证(多种凭证可共存)`},auth:`none`,usageArgs:`--api-key <key> | --console | --open-api --access-key-id <id> --access-key-secret <secret>`,flags:{apiKey:{type:`string`,valueHint:`<key>`,description:{"en-US":`Model API key to validate and store`,"zh-CN":`要校验并保存的模型 API Key`}},baseUrl:{type:`string`,valueHint:`<url>`,description:{"en-US":`Model API base URL to validate and store with --api-key`,"zh-CN":`与 --api-key 一并校验并保存的模型 API Base URL`}},console:{type:`switch`,description:{"en-US":`Sign in via browser (China by default; use --console-site international for the international site). Creates an ordinary API key if needed; subscription plans require --api-key`,"zh-CN":`通过浏览器登录(默认中国站;国际站使用 --console-site international)。需要时会创建普通 API Key;订阅计划必须使用 --api-key 登录`}},consoleSite:{type:`string`,valueHint:`<site>`,description:{"en-US":`Console site: domestic, international`,"zh-CN":`控制台站点:domestic、international`}},openApi:{type:`switch`,description:{"en-US":`Store Alibaba Cloud OpenAPI AK/SK credentials`,"zh-CN":`保存阿里云 OpenAPI AK/SK 凭证`}},accessKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Alibaba Cloud Access Key ID to store`,"zh-CN":`要保存的阿里云 Access Key ID`}},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:{"en-US":`Alibaba Cloud Access Key Secret to store`,"zh-CN":`要保存的阿里云 Access Key Secret`}}},exampleArgs:[`--console`,`--api-key sk-xxxxx`,`--open-api --access-key-id LTAIxxxxx --access-key-secret xxxxx`],validate:e=>{let t=xs(e.apiKey),n=e.console===!0,r=e.openApi===!0;if(!t&&xs(e.baseUrl))return`Use --base-url only with --api-key`;if(!n&&xs(e.consoleSite))return`Use --console-site only with --console`;if(!r&&(xs(e.accessKeyId)||xs(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&&(!xs(e.accessKeyId)||!xs(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,localize:e.localize},o=r.apiKey,s=r.baseUrl?fn(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 bs(as(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 it({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=await Yo(a,o,{explicitBaseUrl:s,storedBaseUrl:i.stored().baseUrl,workspaceId:n.workspaceId}),l=_t(c.kind===`token-plan`?`token-plan`:void 0);await Xo(a,o,{persistBaseUrl:c.baseUrl,defaultTextModel:l?.defaultTextModel,defaultVideoModel:l?.defaultVideoModel,defaultImageToVideoModel:l?.defaultImageToVideoModel,defaultReferenceToVideoModel:l?.defaultReferenceToVideoModel,defaultImageModel:l?.defaultImageModel,defaultSpeechModel:l?.defaultSpeechModel,defaultSpeechRecognitionModel:l?.defaultSpeechRecognitionModel,apiKeyCapabilities:l?.apiKeyCapabilities}),process.stderr.write(`API key validated and saved to ${i.path}\n`)}}),Cs=w({description:{"en-US":`Show current authentication state`,"zh-CN":`显示当前认证状态`},auth:`none`,exampleArgs:[``,`--output json`],async run(e){let{identity:t,settings:n,localize:r}=e,i=T(n.output),a=e.authStore.describe(),o=a.apiKey?{source:a.apiKey.source,masked:Zt(a.apiKey.token),base_url:a.apiKey.baseUrl}:void 0,s=a.console?{source:a.console.source,masked:Zt(a.console.token),region:a.console.region,site:a.console.site}:void 0,c=a.openapi?{source:a.openapi.source,access_key_id:Zt(a.openapi.accessKeyId),access_key_secret:Zt(a.openapi.accessKeySecret)}:void 0,l=!!(o||s||c),u=n.configName??`default`,d=e.authStore.path,f=o?void 0:r({"en-US":`No model API key is configured. Model commands need: ${t.binName} auth login --console, or ${t.binName} auth login --api-key <key>`,"zh-CN":`尚未配置模型 API Key。模型命令需要:${t.binName} auth login --console,或 ${t.binName} auth login --api-key <key>`});if(!l){A({authenticated:!1,config:u,config_file:d,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: ${Tr}`].join(`
12
+ `)},i);return}if(i!==`text`){A({authenticated:!0,config:u,config_file:d,api_key:o,console:s,openapi:c,...f?{hint:f}:{}},i);return}k(`Config: ${u}`),k(`Config file: ${d}`),k(`Authentication Status:`),o?k(` API key (model): ${o.source} ${o.masked}`):(k(` API key (model): not configured`),f&&k(` ${f}`)),k(s?` Console gateway: ${s.source} ${s.masked} (${s.region}, ${s.site})`:` Console gateway: not configured (run ${t.binName} auth login --console)`),k(c?` OpenAPI (AK/SK): ${c.source} ${c.access_key_id}`:` OpenAPI (AK/SK): not configured (run ${t.binName} auth login --open-api)`)}}),ws=w({description:{"en-US":`Clear stored credentials; full logout also clears the model Base URL`,"zh-CN":`清除已保存的凭证;完整退出还会清除模型 Base URL`},auth:`none`,usageArgs:`[--console | --open-api] [--dry-run]`,flags:{console:{type:`switch`,description:{"en-US":`Only clear the console access_token, keep api_key intact`,"zh-CN":`仅清除控制台 access_token,保留 api_key`}},openApi:{type:`switch`,description:{"en-US":`Only clear OpenAPI AK/SK/STS credentials, keep other credentials intact`,"zh-CN":`仅清除 OpenAPI AK/SK/STS 凭证,保留其他凭证`}}},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.
13
13
  `)):process.stderr.write(`No console access_token to clear.
14
14
  `);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.
15
15
  `)):process.stderr.write(`No OpenAPI AK/SK credentials to clear.
16
16
  `);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.
17
- `)}}),Ss=w({description:{"en-US":`Generate a CLI access token using OpenAPI AK/SK`,"zh-CN":`使用 OpenAPI AK/SK 生成 CLI Access Token`},auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> --security-token <token>`,flags:{accessKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Alibaba Cloud Access Key ID`,"zh-CN":`阿里云 Access Key ID`},required:!0},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:{"en-US":`Alibaba Cloud Access Key Secret`,"zh-CN":`阿里云 Access Key Secret`},required:!0},securityToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Alibaba Cloud STS Security Token to store (optional)`,"zh-CN":`要保存的阿里云 STS Security Token(可选)`}}},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 it({identity:t,settings:n,baseUrl:e.client.baseUrl,accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret,securityToken:r.securityToken||void 0});A(a,i)}});function Cs(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 ws(e){return e.type===`response.output_text.delta`?e.delta??``:``}function Ts(e){return typeof e==`object`&&e?e:void 0}function Es(e,t){let n=e?.[t];return typeof n==`string`&&n.trim()?n:void 0}function Ds(e){let t=Ts(Ts(e.response)?.error),n=Ts(e.error);return Es(t,`message`)??Es(n,`message`)??Es(e,`message`)}function Os(e){if(e.type===`response.failed`||e.type===`error`)throw new n(Ds(e)??`Response failed.`,f.GENERAL);if(e.type===`response.incomplete`){let t=Es(Ts(Ts(e.response)?.incomplete_details),`reason`);throw new n(Ds(e)??(t?`Response incomplete: ${t}`:`Response incomplete.`),f.GENERAL)}return{delta:ws(e),completed:e.type===`response.completed`}}function ks(e){if(!e)throw new n(`Stream disconnected before completion: stream closed before response.completed.`,f.GENERAL)}const As={prime:{type:`switch`,description:{"en-US":`Use Prime mode with a workspace-scoped endpoint`,"zh-CN":`使用工作空间专属 Endpoint 的 Prime 模式`}},workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for the default Prime endpoint (or set BAILIAN_WORKSPACE_ID)`,"zh-CN":`默认 Prime Endpoint 使用的 Workspace ID(也可设置 BAILIAN_WORKSPACE_ID)`}}};function js(e){if(e.workspaceId&&!e.prime)return`--workspace-id requires --prime.`;if(e.prime&&!e.model)return`--prime requires an explicit --model.`}function Ms(e,t){return e.client.url(t,()=>{let t=e.flags.workspaceId||e.settings.workspaceId;if(!t)throw new n(`Workspace ID is required for the default Prime endpoint.`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>. You can also override the endpoint with --base-url.`);return yr(t)})}const Ns={api:{type:`string`,valueHint:`<chat|responses>`,choices:[`chat`,`responses`],description:{"en-US":`API to call (default: chat)`,"zh-CN":`调用的 API(默认:chat)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen3.8-max)`,"zh-CN":`模型 ID(默认:qwen3.8-max)`}},message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Message text (repeatable, prefix role: to set role); or use --messages-file`,"zh-CN":`消息文本(可重复;可使用 role: 前缀指定角色),也可使用 --messages-file`}},messagesFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`JSON file with messages array (use - for stdin)`,"zh-CN":`包含 messages 数组的 JSON 文件(使用 - 从 stdin 读取)`}},system:{type:`string`,valueHint:`<text>`,description:{"en-US":`System prompt`,"zh-CN":`系统提示词`}},maxTokens:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum tokens to generate (default: 4096)`,"zh-CN":`最大生成 Token 数(默认:4096)`}},temperature:{type:`number`,valueHint:`<n>`,description:{"en-US":`Sampling temperature (0.0, 2.0]`,"zh-CN":`采样温度 (0.0, 2.0]`}},topP:{type:`number`,valueHint:`<n>`,description:{"en-US":`Nucleus sampling threshold`,"zh-CN":`核采样阈值`}},stream:{type:`switch`,description:{"en-US":`Stream response tokens (default: on in TTY)`,"zh-CN":`流式输出响应 Token(TTY 中默认开启)`}},tool:{type:`array`,valueHint:`<json-or-path>`,description:{"en-US":`Tool definition as JSON or file path (repeatable)`,"zh-CN":`JSON 格式的工具定义或文件路径(可重复)`}},enableThinking:{type:`switch`,description:{"en-US":`Enable thinking/reasoning mode (for qwen3/qwq models)`,"zh-CN":`启用思考/推理模式(适用于 qwen3/qwq 模型)`}},thinkingBudget:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max tokens for thinking (default: 4096)`,"zh-CN":`思考过程最大 Token 数(默认:4096)`}},...As};function Ps(e){let t=[],n;if(e.system&&(n=e.system),e.messagesFile){let r=Tn(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=/* @__PURE__ */ 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 Fs=w({description:{"en-US":`Send a text model request (OpenAI compatible, DashScope)`,"zh-CN":`发送文本模型请求(OpenAI 兼容,DashScope)`},auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:Ns,exampleArgs:[{"en-US":`--message "What is Qwen?"`,"zh-CN":`--message "通义千问是什么?"`},{"en-US":`--api responses --model qwen3.8-max --tool '{"type":"web_search"}' --message "Search for recent Alibaba Cloud news"`,"zh-CN":`--api responses --model qwen3.8-max --tool '{"type":"web_search"}' --message "搜索近期的阿里云新闻"`},{"en-US":`--model qwen-max --system "You are a coding assistant." --message "Write fizzbuzz in Python"`,"zh-CN":`--model qwen-max --system "你是一名编程助手。" --message "用 Python 编写 FizzBuzz"`},{"en-US":`--message "Hello" --message "assistant:Hi!" --message "How are you?"`,"zh-CN":`--message "你好" --message "assistant:你好!" --message "你好吗?"`},`--messages-file - --stream`,{"en-US":`--message "Hello" --output json`,"zh-CN":`--message "你好" --output json`},{"en-US":`--model qwq-plus --message "Solve 1+1" --enable-thinking`,"zh-CN":`--model qwq-plus --message "计算 1+1" --enable-thinking`},{"en-US":`--prime --workspace-id <id> --model glm-5.3-prime --message "Explain this code"`,"zh-CN":`--prime --workspace-id <id> --model glm-5.3-prime --message "解释这段代码"`}],notes:[{"en-US":`Prime mode requires an explicit model and currently supports only the Chat Completions API.`,"zh-CN":`Prime 模式必须显式指定模型,且当前仅支持 Chat Completions API。`},{"en-US":`Prime endpoint: configured --base-url, DASHSCOPE_BASE_URL, or profile base_url takes precedence; otherwise workspace is resolved from --workspace-id, BAILIAN_WORKSPACE_ID, then config workspace_id.`,"zh-CN":`Prime Endpoint:已配置的 --base-url、DASHSCOPE_BASE_URL 或 Profile base_url 优先;否则按 --workspace-id、BAILIAN_WORKSPACE_ID、配置项 workspace_id 解析工作空间。`}],validate:e=>{if(!e.message&&!e.messagesFile)return`Provide --message or --messages-file.`;let t=js(e);if(t)return t;if(e.prime&&e.api===`responses`)return`--prime currently supports only --api chat.`;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}=Ps(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;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));let d=n.prime?Ms(e,xe()):a===`responses`?Rn():xe();if(n.tool){let e=n.tool.map(e=>{try{return JSON.parse(e)}catch{let t=di(e,`utf-8`);return JSON.parse(t)}});u.tools=e}if(t.dryRun){A(n.prime?{endpoint:d,request:u}:{request:u},c);return}if(s){let t=await e.client.request({path:d,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,f=process.stdout,p=O(l);for await(let e of mn(t)){if(e.data===`[DONE]`)break;if(a===`responses`){let t;try{t=JSON.parse(e.data)}catch{continue}let r=Os(t);if(r.delta&&(n+=r.delta,o&&f.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(p.dim(`Thinking:
18
- `))),o&&l.write(t.reasoning_content)),t.content&&(o&&r&&(l.write(`${p.reset}\n\nResponse:\n`),r=!1),n+=t.content,o&&f.write(t.content))}}catch{}}a===`responses`&&ks(i),r&&l.write(p.reset),c===`json`?A({content:n},c):f.write(`
19
- `)}else if(a===`responses`){let n=await e.client.requestJson({path:d,method:`POST`,body:u}),r=Cs(n);t.quiet||c===`text`?k(r):A(n,c)}else{let n=await e.client.requestJson({path:d,method:`POST`,body:u}),r=n.choices?.[0]?.message?.content??``;t.quiet||c===`text`?k(r):A(n,c)}}});const Is=[{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 Ls(){let e=(e,t)=>e.padEnd(t);process.stdout.write(`
17
+ `)}}),Ts=w({description:{"en-US":`Generate a CLI access token using OpenAPI AK/SK`,"zh-CN":`使用 OpenAPI AK/SK 生成 CLI Access Token`},auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> --security-token <token>`,flags:{accessKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Alibaba Cloud Access Key ID`,"zh-CN":`阿里云 Access Key ID`},required:!0},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:{"en-US":`Alibaba Cloud Access Key Secret`,"zh-CN":`阿里云 Access Key Secret`},required:!0},securityToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Alibaba Cloud STS Security Token to store (optional)`,"zh-CN":`要保存的阿里云 STS Security Token(可选)`}}},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 it({identity:t,settings:n,baseUrl:e.client.baseUrl,accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret,securityToken:r.securityToken||void 0});A(a,i)}});function Es(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 Ds(e){return e.type===`response.output_text.delta`?e.delta??``:``}function Os(e){return typeof e==`object`&&e?e:void 0}function ks(e,t){let n=e?.[t];return typeof n==`string`&&n.trim()?n:void 0}function As(e){let t=Os(Os(e.response)?.error),n=Os(e.error);return ks(t,`message`)??ks(n,`message`)??ks(e,`message`)}function js(e){if(e.type===`response.failed`||e.type===`error`)throw new n(As(e)??`Response failed.`,f.GENERAL);if(e.type===`response.incomplete`){let t=ks(Os(Os(e.response)?.incomplete_details),`reason`);throw new n(As(e)??(t?`Response incomplete: ${t}`:`Response incomplete.`),f.GENERAL)}return{delta:Ds(e),completed:e.type===`response.completed`}}function Ms(e){if(!e)throw new n(`Stream disconnected before completion: stream closed before response.completed.`,f.GENERAL)}const Ns={prime:{type:`switch`,description:{"en-US":`Use Prime mode with a workspace-scoped endpoint`,"zh-CN":`使用工作空间专属 Endpoint 的 Prime 模式`}},workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for the default Prime endpoint (or set BAILIAN_WORKSPACE_ID)`,"zh-CN":`默认 Prime Endpoint 使用的 Workspace ID(也可设置 BAILIAN_WORKSPACE_ID)`}}};function Ps(e){if(e.workspaceId&&!e.prime)return`--workspace-id requires --prime.`;if(e.prime&&!e.model)return`--prime requires an explicit --model.`}function Fs(e,t){return e.client.url(t,()=>{let t=e.flags.workspaceId||e.settings.workspaceId;if(!t)throw new n(`Workspace ID is required for the default Prime endpoint.`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>. You can also override the endpoint with --base-url.`);return Sr(t)})}const Is={api:{type:`string`,valueHint:`<chat|responses>`,choices:[`chat`,`responses`],description:{"en-US":`API to call (default: chat)`,"zh-CN":`调用的 API(默认:chat)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen3.8-max)`,"zh-CN":`模型 ID(默认:qwen3.8-max)`}},message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Message text (repeatable, prefix role: to set role); or use --messages-file`,"zh-CN":`消息文本(可重复;可使用 role: 前缀指定角色),也可使用 --messages-file`}},messagesFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`JSON file with messages array (use - for stdin)`,"zh-CN":`包含 messages 数组的 JSON 文件(使用 - 从 stdin 读取)`}},system:{type:`string`,valueHint:`<text>`,description:{"en-US":`System prompt`,"zh-CN":`系统提示词`}},maxTokens:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum tokens to generate (default: 4096)`,"zh-CN":`最大生成 Token 数(默认:4096)`}},temperature:{type:`number`,valueHint:`<n>`,description:{"en-US":`Sampling temperature (0.0, 2.0]`,"zh-CN":`采样温度 (0.0, 2.0]`}},topP:{type:`number`,valueHint:`<n>`,description:{"en-US":`Nucleus sampling threshold`,"zh-CN":`核采样阈值`}},stream:{type:`switch`,description:{"en-US":`Stream response tokens (default: on in TTY)`,"zh-CN":`流式输出响应 Token(TTY 中默认开启)`}},tool:{type:`array`,valueHint:`<json-or-path>`,description:{"en-US":`Tool definition as JSON or file path (repeatable)`,"zh-CN":`JSON 格式的工具定义或文件路径(可重复)`}},enableThinking:{type:`switch`,description:{"en-US":`Enable thinking/reasoning mode (for qwen3/qwq models)`,"zh-CN":`启用思考/推理模式(适用于 qwen3/qwq 模型)`}},thinkingBudget:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max tokens for thinking (default: 4096)`,"zh-CN":`思考过程最大 Token 数(默认:4096)`}},...Ns};function Ls(e){let t=[],n;if(e.system&&(n=e.system),e.messagesFile){let r=On(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=/* @__PURE__ */ 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 Rs=w({description:{"en-US":`Send a text model request (OpenAI compatible, DashScope)`,"zh-CN":`发送文本模型请求(OpenAI 兼容,DashScope)`},auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:Is,exampleArgs:[{"en-US":`--message "What is Qwen?"`,"zh-CN":`--message "通义千问是什么?"`},{"en-US":`--api responses --model qwen3.8-max --tool '{"type":"web_search"}' --message "Search for recent Alibaba Cloud news"`,"zh-CN":`--api responses --model qwen3.8-max --tool '{"type":"web_search"}' --message "搜索近期的阿里云新闻"`},{"en-US":`--model qwen-max --system "You are a coding assistant." --message "Write fizzbuzz in Python"`,"zh-CN":`--model qwen-max --system "你是一名编程助手。" --message "用 Python 编写 FizzBuzz"`},{"en-US":`--message "Hello" --message "assistant:Hi!" --message "How are you?"`,"zh-CN":`--message "你好" --message "assistant:你好!" --message "你好吗?"`},`--messages-file - --stream`,{"en-US":`--message "Hello" --output json`,"zh-CN":`--message "你好" --output json`},{"en-US":`--model qwq-plus --message "Solve 1+1" --enable-thinking`,"zh-CN":`--model qwq-plus --message "计算 1+1" --enable-thinking`},{"en-US":`--prime --workspace-id <id> --model glm-5.3-prime --message "Explain this code"`,"zh-CN":`--prime --workspace-id <id> --model glm-5.3-prime --message "解释这段代码"`}],notes:[{"en-US":`Prime mode requires an explicit model and currently supports only the Chat Completions API.`,"zh-CN":`Prime 模式必须显式指定模型,且当前仅支持 Chat Completions API。`},{"en-US":`Prime endpoint: configured --base-url, DASHSCOPE_BASE_URL, or profile base_url takes precedence; otherwise workspace is resolved from --workspace-id, BAILIAN_WORKSPACE_ID, then config workspace_id.`,"zh-CN":`Prime Endpoint:已配置的 --base-url、DASHSCOPE_BASE_URL 或 Profile base_url 优先;否则按 --workspace-id、BAILIAN_WORKSPACE_ID、配置项 workspace_id 解析工作空间。`}],validate:e=>{if(!e.message&&!e.messagesFile)return`Provide --message or --messages-file.`;let t=Ps(e);if(t)return t;if(e.prime&&e.api===`responses`)return`--prime currently supports only --api chat.`;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}=Ls(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;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));let d=n.prime?Fs(e,xe()):a===`responses`?Vn():xe();if(n.tool){let e=n.tool.map(e=>{try{return JSON.parse(e)}catch{let t=mi(e,`utf-8`);return JSON.parse(t)}});u.tools=e}if(t.dryRun){A(n.prime?{endpoint:d,request:u}:{request:u},c);return}if(s){let t=await e.client.request({path:d,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,f=process.stdout,p=O(l);for await(let e of gn(t)){if(e.data===`[DONE]`)break;if(a===`responses`){let t;try{t=JSON.parse(e.data)}catch{continue}let r=js(t);if(r.delta&&(n+=r.delta,o&&f.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(p.dim(`Thinking:
18
+ `))),o&&l.write(t.reasoning_content)),t.content&&(o&&r&&(l.write(`${p.reset}\n\nResponse:\n`),r=!1),n+=t.content,o&&f.write(t.content))}}catch{}}a===`responses`&&Ms(i),r&&l.write(p.reset),c===`json`?A({content:n},c):f.write(`
19
+ `)}else if(a===`responses`){let n=await e.client.requestJson({path:d,method:`POST`,body:u}),r=Es(n);t.quiet||c===`text`?k(r):A(n,c)}else{let n=await e.client.requestJson({path:d,method:`POST`,body:u}),r=n.choices?.[0]?.message?.content??``;t.quiet||c===`text`?k(r):A(n,c)}}});const zs=[{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 Bs(){let e=(e,t)=>e.padEnd(t);process.stdout.write(`
20
20
  Omni output voices:
21
- `),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 Is)process.stdout.write(`${e(t.voice,12)} ${e(t.name,14)} ${e(t.desc,14)} ${t.lang}\n`);process.stdout.write(`\nTotal: ${Is.length} voices\n`)}const Rs={wav:`wav`,mp3:`mp3`,amr:`amr`,aac:`aac`,m4a:`aac`,ogg:`ogg`,"3gp":`3gp`,"3gpp":`3gpp`},zs=Object.keys(Rs);function Bs(e){let t=e.split(`?`)[0].split(`#`)[0],r=_i(t).slice(1).toLowerCase();if(!r)throw new n(`Cannot infer audio format from "${e}". Use a file/URL whose path ends with: ${zs.join(`, `)}.`,f.USAGE);let i=Rs[r];if(!i)throw new n(`Unsupported audio extension ".${r}" for "${e}". Supported extensions: ${zs.join(`, `)}.`,f.USAGE);return i}function Vs(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 Hs=w({description:{"en-US":`Multimodal chat with text + audio output (Qwen-Omni)`,"zh-CN":`支持文本输入与音频输出的多模态对话(Qwen-Omni)`},auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Message text (repeatable, prefix role: to set role)`,"zh-CN":`消息文本(可重复;可使用 role: 前缀指定角色)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen3.5-omni-plus)`,"zh-CN":`模型 ID(默认:qwen3.5-omni-plus)`}},system:{type:`string`,valueHint:`<text>`,description:{"en-US":`System prompt`,"zh-CN":`系统提示词`}},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL or local file (repeatable)`,"zh-CN":`图片 URL 或本地文件(可重复)`}},audio:{type:`array`,valueHint:`<url>`,description:{"en-US":`Audio URL or local file (.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`,"zh-CN":`音频 URL 或本地文件(.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`}},video:{type:`array`,valueHint:`<url>`,description:{"en-US":`Video file URL / local path, or comma-separated frame URLs`,"zh-CN":`视频文件 URL / 本地路径,或以逗号分隔的帧 URL`}},voice:{type:`string`,valueHint:`<voice>`,description:{"en-US":`Output voice ID (default: Tina). Use --list-voices to see all options`,"zh-CN":`输出音色 ID(默认:Tina)。使用 --list-voices 查看所有选项`}},listVoices:{type:`switch`,description:{"en-US":`List available output voices and exit`,"zh-CN":`列出可用的输出音色并退出`}},audioFormat:{type:`string`,valueHint:`<fmt>`,description:{"en-US":`Audio output format (default: wav)`,"zh-CN":`音频输出格式(默认:wav)`}},audioOut:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save audio to file (default: auto-generate)`,"zh-CN":`将音频保存到文件(默认:自动生成路径)`}},textOnly:{type:`switch`,description:{"en-US":`Output text only, no audio generation`,"zh-CN":`仅输出文本,不生成音频`}},maxTokens:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum tokens to generate`,"zh-CN":`最大生成 Token 数`}},temperature:{type:`number`,valueHint:`<n>`,description:{"en-US":`Sampling temperature (0.0, 2.0]`,"zh-CN":`采样温度 (0.0, 2.0]`}}},exampleArgs:[`--list-voices`,{"en-US":`--message "Hello, who are you?"`,"zh-CN":`--message "你好,你是谁?"`},{"en-US":`--message "Describe this image" --image ./photo.jpg`,"zh-CN":`--message "描述这张图片" --image ./photo.jpg`},{"en-US":`--message "What is this audio saying?" --audio https://example.com/audio.wav`,"zh-CN":`--message "这段音频说了什么?" --audio https://example.com/audio.wav`},{"en-US":`--message "Summarize this video" --video https://example.com/video.mp4`,"zh-CN":`--message "总结这段视频" --video https://example.com/video.mp4`},{"en-US":`--message "What is this video about?" --video ./local-video.mp4 --text-only`,"zh-CN":`--message "这段视频讲了什么?" --video ./local-video.mp4 --text-only`},{"en-US":`--message "Answer in Sichuan dialect: How's the weather today?" --voice Sunny`,"zh-CN":`--message "请用四川话回答:今天天气怎么样?" --voice Sunny`},{"en-US":`--message "Hello" --text-only --output json`,"zh-CN":`--message "你好" --text-only --output json`},{"en-US":`--message "Read this passage aloud" --audio-out greeting.wav`,"zh-CN":`--message "朗读这段文字" --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){Ls();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=/* @__PURE__ */ 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:Bs(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:xe(),method:`POST`,body:_,stream:!0}),y=``,b=``,x=process.stdout.isTTY,S=process.stdout;for await(let e of mn(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(`
22
- `);let ee;if(b&&!s){let e=Buffer.from(b,`base64`),r=Vs(e.length),i=Buffer.concat([r,e]),a=n.audioOut;if(!a){let{join:e}=await import(`path`);a=e(In(t,{subDir:`omni`}),`omni_${Date.now()}.wav`)}mi(a,i),ee=a,t.quiet||process.stderr.write(`Audio saved: ${a}\n`)}if(!x||c===`json`){let e={content:y};ee&&(e.audio_saved=ee,e.voice=a),A(e,c)}}});const Us={prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Image description`,"zh-CN":`图片描述`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen-image-3.0)`,"zh-CN":`模型 ID(默认:qwen-image-3.0)`}},size:{type:`string`,valueHint:`<W*H>`,description:{"en-US":`Image size: ratio (3:4, 16:9, 1:1) or pixels (2048*2048)`,"zh-CN":`图片尺寸:比例(3:4、16:9、1:1)或像素(2048*2048)`}},n:{type:`number`,valueHint:`<count>`,description:{"en-US":`Number of images per request (default: 1, max: 6)`,"zh-CN":`每次请求生成的图片数量(默认:1,最多:6)`}},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Tr},watermark:{type:`boolean`,valueHint:`<bool>`,description:Er},...t,...r,outDir:{type:`string`,valueHint:`<dir>`,description:{"en-US":`Download images to directory`,"zh-CN":`将图片下载到指定目录`}},outPrefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filename prefix (default: image)`,"zh-CN":`文件名前缀(默认:image)`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 3)`,"zh-CN":`等待任务时的轮询间隔(默认:3 秒)`}}};var Ws=w({description:{"en-US":`Generate images (Qwen-Image / wan2.x)`,"zh-CN":`生成图片(Qwen-Image / wan2.x)`},auth:`apiKey`,usageArgs:`--prompt <text> [flags]`,flags:Us,exampleArgs:[{"en-US":`--prompt "A cat in a spacesuit on Mars"`,"zh-CN":`--prompt "一只穿着宇航服的猫站在火星上"`},{"en-US":`--prompt "Logo design" --n 3 --out-dir ./generated/`,"zh-CN":`--prompt "Logo 设计" --n 3 --out-dir ./generated/`},{"en-US":`--prompt "Mountain landscape" --size 2688*1536`,"zh-CN":`--prompt "山地景观" --size 2688*1536`},{"en-US":`--prompt "A castle" --seed 42 --prompt-extend false`,"zh-CN":`--prompt "一座城堡" --seed 42 --prompt-extend false`},{"en-US":`--prompt "Logo" --watermark false`,"zh-CN":`--prompt "Logo" --watermark false`},{"en-US":`--prompt "An alien in the space" --watermark false`,"zh-CN":`--prompt "太空中的外星人" --watermark false`},{"en-US":`--prompt "sunset" --model wan2.6-t2i --async --quiet`,"zh-CN":`--prompt "日落" --model wan2.6-t2i --async --quiet`},{"en-US":`--prompt "plush doll" --model z-image-turbo --size 1024*1024`,"zh-CN":`--prompt "毛绒玩偶" --model z-image-turbo --size 1024*1024`},{"en-US":`--prompt "sunset" --model wanx2.0-t2i-turbo --size 1024*1024`,"zh-CN":`--prompt "日落" --model wanx2.0-t2i-turbo --size 1024*1024`},{"en-US":`--prompt "Pro quality" --model qwen-image-2.0-pro`,"zh-CN":`--prompt "专业品质" --model qwen-image-2.0-pro`},{"en-US":`--prompt "Product shots" --n 2 --concurrent 3 # 6 images in parallel`,"zh-CN":`--prompt "产品摄影" --n 2 --concurrent 3 # 并行生成 6 张图片`}],async run(e){let{settings:t,flags:n}=e,r=n.prompt,i=n.model||t.defaultImageModel||`qwen-image-3.0`,a=Fn(i),o=n.size||`1:1`,s=Xr(o,a.sizeProfile),c=n.n??1,l=Br(n),u=Nn(n.promptExtend,a.promptExtendDefault,`prompt-extend`),d=Ln(n.watermark,t.watermark),f={size:s,n:c,seed:n.seed,prompt_extend:u,watermark:d},p=a.inputStyle===`prompt`?{model:i,input:{prompt:r,negative_prompt:n.negativePrompt||void 0},parameters:f}:{model:i,input:{messages:[{role:`user`,content:[{text:r}]}]},parameters:{...f,negative_prompt:n.negativePrompt||void 0}},m=T(t.output);if(t.dryRun){A({request:p,mode:a.useSync?`sync`:`async`,path:a.path},m);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: ${a.useSync?`sync`:`async`}]\n`),a.useSync?await Gs(e.client,t,a.path,p,n,m,l):await Ks(e.client,t,a.path,p,n,m,l)}});async function Gs(e,t,r,i,a,o,s){let c=(await Zr(s,t,()=>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(c.length===0)throw new n(`Generation completed but no images returned.`,f.GENERAL);await qs(c,a,t,o)}async function Ks(e,t,r,i,a,o,s){let c=(await Zr(s,t,()=>e.requestJson({path:r,method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.async){A({task_ids:c},o);return}let l=a.pollInterval??3,u=c.map(n=>{let r=e.url(ir(n));return Kr(e,t,{url:r,intervalSec:l,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})}),d=await Promise.all(u),p=[];for(let e of d){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);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 n(`All tasks completed but no images returned.`,f.GENERAL);await qs(p,a,t,o,c.length===1?c[0]:void 0,c)}async function qs(e,t,n,r,i,a){let o=In(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),s=t.prompt||``,c=t.outPrefix||at(`image`,s),l=e.length>1?e.map((e,t)=>{let n=`${c}_${String(t+1).padStart(3,`0`)}.png`;return{url:e,destPath:vi(o,n)}}):[{url:e[0],destPath:vi(o,`${c}.png`)}],u=await Nr(l,Mr,{quiet:n.quiet});if(n.quiet)k(u.join(`
23
- `));else{let t={urls:e,saved:u,total:e.length};i&&(t.task_id=i),a&&a.length>1&&(t.task_ids=a),A(t,r)}}const Js={image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Source image URL or local file path (repeatable for multi-image merge)`,"zh-CN":`源图片 URL 或本地文件路径(多图融合时可重复)`},required:!0},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Edit instruction text`,"zh-CN":`编辑指令文本`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen-image-3.0)`,"zh-CN":`模型 ID(默认:qwen-image-3.0)`}},size:{type:`string`,valueHint:`<W*H>`,description:{"en-US":`Output image size: ratio (3:4, 16:9) or pixels (2048*2048)`,"zh-CN":`输出图片尺寸:比例(3:4、16:9)或像素(2048*2048)`}},n:{type:`number`,valueHint:`<count>`,description:{"en-US":`Number of images (default: 1, max: 6)`,"zh-CN":`图片数量(默认:1,最多:6)`}},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible results`,"zh-CN":`用于复现结果的随机种子`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},function:{type:`string`,valueHint:`<name>`,description:{"en-US":`wanx*-imageedit function (default: description_edit). Examples: stylization_all, description_edit`,"zh-CN":`wanx*-imageedit 功能(默认:description_edit)。例如:stylization_all、description_edit`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:wr},watermark:{type:`boolean`,valueHint:`<bool>`,description:Er},outDir:{type:`string`,valueHint:`<dir>`,description:{"en-US":`Download images to directory`,"zh-CN":`将图片下载到指定目录`}},outPrefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filename prefix (default: edited)`,"zh-CN":`文件名前缀(默认:edited)`}},...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 3)`,"zh-CN":`等待任务时的轮询间隔(默认:3 秒)`}}};var Ys=w({description:{"en-US":`Edit an existing image with text instructions (Qwen-Image / Wan 2.7)`,"zh-CN":`使用文本指令编辑现有图片(Qwen-Image / Wan 2.7)`},auth:`apiKey`,usageArgs:`--image <url> --prompt <text> [flags]`,flags:Js,exampleArgs:[{"en-US":`--image ./photo.png --prompt "Replace the background with a beach"`,"zh-CN":`--image ./photo.png --prompt "将背景替换为海滩"`},{"en-US":`--image https://example.com/logo.png --prompt "Change color to blue" --n 3`,"zh-CN":`--image https://example.com/logo.png --prompt "将颜色改为蓝色" --n 3`},{"en-US":`--image ./a.png --image ./b.png --prompt "Merge two images into one collage"`,"zh-CN":`--image ./a.png --image ./b.png --prompt "将两张图片合并成一张拼贴图"`},{"en-US":`--image https://example.com/photo.png --prompt "Remove the person" --model qwen-image-2.0-pro`,"zh-CN":`--image https://example.com/photo.png --prompt "移除人物" --model qwen-image-2.0-pro`},{"en-US":`--image ./photo.png --prompt "Change the style" --model wan2.7-image`,"zh-CN":`--image ./photo.png --prompt "更改图片风格" --model wan2.7-image`},{"en-US":`--image ./photo.png --prompt "Place the subject on a table" --model wan2.5-i2i-preview`,"zh-CN":`--image ./photo.png --prompt "将主体放在桌面上" --model wan2.5-i2i-preview`},{"en-US":`--image ./photo.png --prompt "Convert to a picture-book style" --model wanx2.1-imageedit --function stylization_all`,"zh-CN":`--image ./photo.png --prompt "转换成绘本风格" --model wanx2.1-imageedit --function stylization_all`},{"en-US":`--image ./photo.png --prompt "Replace the background with a beach" --watermark false`,"zh-CN":`--image ./photo.png --prompt "将背景替换为海滩" --watermark false`}],async run(e){let{settings:t,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||t.defaultImageModel||`qwen-image-3.0`,s=Pn(o),c=await Promise.all(i.map(t=>e.client.resolveImageInput(t,o))),l=r.n??1,u=Nn(r.promptExtend,s.promptExtendDefault,`prompt-extend`),d=Ln(r.watermark,t.watermark),p={size:Xr(r.size,s.sizeProfile),n:l,seed:r.seed,prompt_extend:u,watermark:d},m;if(s.inputStyle===`function-base-image`){let e=c[0];if(!e)throw new n(`wanx*-imageedit requires at least one --image as base_image_url.`,f.USAGE);m={model:o,input:{function:r.function||`description_edit`,prompt:a,base_image_url:e},parameters:p}}else if(s.inputStyle===`prompt-images`)m={model:o,input:{prompt:a,images:c,negative_prompt:r.negativePrompt||void 0},parameters:p};else{let e=c.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}}}rr(m.parameters);let h=T(t.output);if(t.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:Dn(e.image)}:e)}))}}:`images`in m.input?e={...m,input:{...m.input,images:m.input.images?.map(e=>Dn(e))}}:`base_image_url`in m.input&&(e={...m,input:{...m.input,base_image_url:Dn(m.input.base_image_url),mask_image_url:m.input.mask_image_url?Dn(m.input.mask_image_url):void 0}}),A({request:e,mode:s.useSync?`sync`:`async`,path:s.path},h);return}t.quiet||process.stderr.write(`[Model: ${o}] [Mode: ${s.useSync?`sync`:`async`}] [Images: ${c.length}]\n`);let g=Br(r);s.useSync?await Xs(e.client,t,s.path,m,r,h,g):await Zs(e.client,t,s.path,m,r,h,g)}});async function Xs(e,t,r,i,a,o,s){let c=(await Zr(s,t,()=>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(c.length===0)throw new n(`Edit completed but no images returned.`,f.GENERAL);await Qs(c,a,t,o)}async function Zs(e,t,r,i,a,o,s){let c=(await Zr(s,t,()=>e.requestJson({path:r,method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.async){A({task_ids:c},o);return}let l=a.pollInterval??3,u=c.map(n=>Kr(e,t,{url:e.url(ir(n)),intervalSec:l,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),d=await Promise.all(u),p=[];for(let e of d){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);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 n(`All tasks completed but no images returned.`,f.GENERAL);await Qs(p,a,t,o)}async function Qs(e,t,n,r){let i=In(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),a=t.outPrefix||at(`edited`,t.prompt),o=e.length>1?e.map((e,t)=>{let n=`${a}_${String(t+1).padStart(3,`0`)}.png`;return{url:e,destPath:vi(i,n)}}):[{url:e[0],destPath:vi(i,`${a}.png`)}],s=await Nr(o,Mr,{quiet:n.quiet});n.quiet?k(s.join(`
24
- `)):A({urls:e,saved:s,total:e.length},r)}var $s=w({description:{"en-US":`Generate a video from text or image (wan3.0-video / wan2.6-t2v / happyhorse-1.1-i2v)`,"zh-CN":`根据文本或图片生成视频(wan3.0-video / wan2.6-t2v / happyhorse-1.1-i2v)`},auth:`apiKey`,usageArgs:`--prompt <text> [--image <url>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: wan3.0-video)`,"zh-CN":`模型 ID(默认:wan3.0-video)`}},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Video description`,"zh-CN":`视频描述`},required:!0},image:{type:`string`,valueHint:`<url>`,description:{"en-US":`Input image URL for image-to-video generation`,"zh-CN":`图生视频使用的输入图片 URL`}},lastFrame:{type:`string`,valueHint:`<url>`,description:{"en-US":`Last frame image URL (with --image, enables kf2v first+last frame mode)`,"zh-CN":`尾帧图片 URL(与 --image 配合,启用 kf2v 首尾帧模式)`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},resolution:{type:`string`,valueHint:`<res>`,description:{"en-US":`Resolution: 720P or 1080P (default: 1080P)`,"zh-CN":`分辨率:720P 或 1080P(默认:1080P)`}},ratio:{type:`string`,valueHint:`<ratio>`,description:{"en-US":`Aspect ratio (e.g. 16:9, 9:16, 1:1)`,"zh-CN":`宽高比(例如 16:9、9:16、1:1)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Video duration in seconds (default: 5)`,"zh-CN":`视频时长,单位为秒(默认:5)`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Cr},watermark:{type:`boolean`,valueHint:`<bool>`,description:Er},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},download:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save video to file on completion`,"zh-CN":`完成后将视频保存到文件`}},file:{type:`string`,valueHint:`<url-or-path>`,description:{"en-US":`Reference file URL or local path for file-to-video (wan3.0-video only; mutually exclusive with --image/--last-frame)`,"zh-CN":`参考文件 URL 或本地路径,用于文件生视频(仅 wan3.0-video;与 --image/--last-frame 互斥)`}},...As,...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待任务时的轮询间隔(默认:5 秒)`}}},exampleArgs:[{"en-US":`--prompt "A person reading a book, static shot"`,"zh-CN":`--prompt "一个人正在读书,固定镜头"`},{"en-US":`--prompt "Ocean waves at sunset." --download sunset.mp4`,"zh-CN":`--prompt "日落时的海浪。" --download sunset.mp4`},{"en-US":`--image https://example.com/cat.png --prompt "Make the cat in the scene move"`,"zh-CN":`--image https://example.com/cat.png --prompt "让画面中的猫动起来"`},{"en-US":`--prompt "Mountain landscape" --resolution 720P --duration 5`,"zh-CN":`--prompt "山地景观" --resolution 720P --duration 5`},{"en-US":`--prompt "A cat playing with a ball" --watermark false`,"zh-CN":`--prompt "一只正在玩球的猫" --watermark false`},{"en-US":`--prime --workspace-id <id> --model wan3.0-video-prime --prompt "Ocean waves at sunset"`,"zh-CN":`--prime --workspace-id <id> --model wan3.0-video-prime --prompt "日落时的海浪"`}],notes:[{"en-US":`Prime mode requires an explicit model.`,"zh-CN":`Prime 模式必须显式指定模型。`},{"en-US":`Prime endpoint: configured --base-url, DASHSCOPE_BASE_URL, or profile base_url takes precedence; otherwise workspace is resolved from --workspace-id, BAILIAN_WORKSPACE_ID, then config workspace_id.`,"zh-CN":`Prime Endpoint:已配置的 --base-url、DASHSCOPE_BASE_URL 或 Profile base_url 优先;否则按 --workspace-id、BAILIAN_WORKSPACE_ID、配置项 workspace_id 解析工作空间。`}],validate:js,async run(e){let{settings:t,flags:r}=e,i=r.prompt,a=r.model||(r.image?t.defaultImageToVideoModel||`wan3.0-video`:t.defaultVideoModel||`wan3.0-video`),o=T(t.output),s=r.image,c=r.lastFrame,l=r.file;if(l&&(s||c))throw new n(`--file is mutually exclusive with --image/--last-frame.`,f.USAGE);let u;s&&(u=await e.client.resolveImageInput(s,a));let d;c&&(d=await e.client.resolveImageInput(c,a));let p=!!(u&&d),m=/^wan3\./i.test(a);if(l&&!m)throw new n(`--file is only supported by wan3.0-video.`,f.USAGE);let h;l&&(h=await e.client.uploadFile(l,a));let g=Ln(r.watermark,t.watermark),_=Nn(r.promptExtend,void 0,`prompt-extend`),v=p&&!m?wt():vr(),y=r.prime?Ms(e,v):v,b={model:a,input:{prompt:i,negative_prompt:r.negativePrompt||void 0,...h?{media:[{type:`file`,url:h}]}:p?m?{media:[{type:`first_frame`,url:u},{type:`last_frame`,url:d}]}:{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:_,watermark:g,seed:r.seed}};if(t.dryRun){let e=b;if(h)e={...b,input:{...b.input,media:[{type:`file`,url:Dn(h)}]}};else if(p){let t=Dn(u??``),n=Dn(d??``);e={...b,input:{...b.input,...m?{media:[{type:`first_frame`,url:t},{type:`last_frame`,url:n}]}:{first_frame_url:t,last_frame_url:n}}}}else if(u){let t=Dn(u);e={...b,input:{...b.input,.../wan[x]?2\.[1-6]/i.test(a)?{img_url:t}:{media:[{type:`first_frame`,url:t}]}}}}A(r.prime?{endpoint:y,request:e}:{request:e},o);return}let x=Br(r),S=(await Zr(x,t,()=>e.client.requestJson({path:y,method:`POST`,body:b,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||process.stderr.write(`[Model: ${a}]\n`),r.async){A(S.length===1?{task_id:S[0]}:{task_ids:S},o);return}let ee=r.pollInterval??5,te=S.map(n=>{let i=r.prime?Ms(e,ir(n)):e.client.url(ir(n));return Kr(e.client,t,{url:i,intervalSec:ee,timeoutSec:t.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}})}),ne=await Promise.all(te),C=[];for(let[e,t]of ne.entries()){let n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&C.push({taskId:S[e],videoUrl:n})}if(C.length===0)throw new n(`All tasks completed but no video URLs returned.`,f.GENERAL);if(r.download){let e=r.download,{size:n}=await Mr(C[0].videoUrl,e,{quiet:t.quiet});t.quiet?k(e):A({task_id:C[0].taskId,video_url:C[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Rr(n)},o);return}let re=In(t,{subDir:`videos`}),{join:ie}=await import(`path`),ae=[];await Promise.all(C.map(async({taskId:e,videoUrl:n})=>{let r=ie(re,`${e}.mp4`);await Mr(n,r,{quiet:t.quiet}),ae.push({task_id:e,video_url:n,saved:r})})),ae.length===1?A(ae[0],o):A({videos:ae,total:ae.length},o)}}),ec=w({description:{"en-US":`Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.)`,"zh-CN":`使用 happyhorse-1.0-video-edit 编辑视频(风格转换、对象替换等)`},auth:`apiKey`,usageArgs:`--video <url> --prompt <text> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: happyhorse-1.0-video-edit)`,"zh-CN":`模型 ID(默认:happyhorse-1.0-video-edit)`}},video:{type:`string`,valueHint:`<url>`,description:{"en-US":`Input video URL or local file (mp4/mov, 2-10s)`,"zh-CN":`输入视频 URL 或本地文件(mp4/mov,2–10 秒)`},required:!0},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Edit instruction (e.g. "Convert the scene to a claymation style")`,"zh-CN":`编辑指令(例如“将场景转换为黏土动画风格”)`}},refImage:{type:`string`,valueHint:`<url>`,description:{"en-US":`Reference image URL (up to 4, comma-separated)`,"zh-CN":`参考图片 URL(最多 4 个,以逗号分隔)`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},resolution:{type:`string`,valueHint:`<res>`,description:{"en-US":`Resolution: 720P or 1080P (default: 1080P)`,"zh-CN":`分辨率:720P 或 1080P(默认:1080P)`}},ratio:{type:`string`,valueHint:`<ratio>`,description:{"en-US":`Aspect ratio (16:9, 9:16, 1:1, 4:3, 3:4)`,"zh-CN":`宽高比(16:9、9:16、1:1、4:3、3:4)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Output video duration in seconds (2-10)`,"zh-CN":`输出视频时长,单位为秒(2–10)`}},audioSetting:{type:`string`,valueHint:`<mode>`,description:{"en-US":`Audio: auto (default) or origin (keep original)`,"zh-CN":`音频:auto(默认)或 origin(保留原音频)`},choices:[`auto`,`origin`]},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Cr},watermark:{type:`boolean`,valueHint:`<bool>`,description:Er},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},download:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save video to file on completion`,"zh-CN":`完成后将视频保存到文件`}},...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 15)`,"zh-CN":`等待任务时的轮询间隔(默认:15 秒)`}}},exampleArgs:[{"en-US":`--video https://example.com/input.mp4 --prompt "Convert the entire scene to claymation style"`,"zh-CN":`--video https://example.com/input.mp4 --prompt "将整个场景转换为黏土动画风格"`},{"en-US":`--video https://example.com/input.mp4 --prompt "Replace the outfit with the style shown in the image" --ref-image https://example.com/clothes.png`,"zh-CN":`--video https://example.com/input.mp4 --prompt "将服装替换为参考图片中的款式" --ref-image https://example.com/clothes.png`},{"en-US":`--video https://example.com/input.mp4 --prompt "Convert to anime style" --resolution 720P --download output.mp4`,"zh-CN":`--video https://example.com/input.mp4 --prompt "转换为动漫风格" --resolution 720P --download output.mp4`},{"en-US":`--video https://example.com/input.mp4 --prompt "Put clothes on the kitten in the video" --watermark false`,"zh-CN":`--video https://example.com/input.mp4 --prompt "给视频中的小猫穿上衣服" --watermark false`}],async run(e){let{settings:t,flags:r}=e,i=r.video,a=r.prompt,o=r.model||`happyhorse-1.0-video-edit`,s=T(t.output),c=[{type:`video`,url:await e.client.uploadFile(i,o)}],l=r.refImage;if(l){let t=l.split(`,`).map(e=>e.trim()).filter(Boolean);for(let n of t){let t=await e.client.uploadFile(n,o);c.push({type:`reference_image`,url:t})}}let u=Nn(r.promptExtend,void 0,`prompt-extend`),d=Ln(r.watermark,t.watermark),p={model:o,input:{prompt:a||void 0,negative_prompt:r.negativePrompt||void 0,media:c},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,audio_setting:r.audioSetting||void 0,prompt_extend:u,watermark:d,seed:r.seed}};if(t.dryRun){A({request:p},s);return}let m=Br(r),h=(await Zr(m,t,()=>e.client.requestJson({path:vr(),method:`POST`,body:p,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||(process.stderr.write(`[Model: ${o}]\n`),process.stderr.write(`Note: Video editing typically takes 5-8 minutes. Please be patient.
25
- `)),r.async){A(h.length===1?{task_id:h[0]}:{task_ids:h},s);return}let g=r.pollInterval??15,_=Math.max(t.timeout,600),v=await Promise.all(h.map(n=>Kr(e.client,t,{url:e.client.url(ir(n)),intervalSec:g,timeoutSec:_,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=[];for(let e=0;e<v.length;e++){let t=v[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&y.push({taskId:h[e],videoUrl:n})}if(y.length===0)throw new n(`All tasks completed but no video URLs returned.`,f.GENERAL);if(r.download){let e=r.download,{size:n}=await Mr(y[0].videoUrl,e,{quiet:t.quiet});t.quiet?k(e):A({task_id:y[0].taskId,video_url:y[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Rr(n)},s);return}let b=await import(`path`),x=In(t,{subDir:`videos`}),S=[];await Promise.all(y.map(async({taskId:e,videoUrl:n})=>{let r=b.join(x,`${e}.mp4`);await Mr(n,r,{quiet:t.quiet}),S.push({task_id:e,video_url:n,saved:r})})),S.length===1?A(S[0],s):A({videos:S,total:S.length},s)}}),tc=w({description:{"en-US":`Reference-to-video generation (wan3.0-video / happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice`,"zh-CN":`参考生视频(wan3.0-video / happyhorse-1.1-r2v / wan2.6-r2v):支持多主体、多镜头和语音`},auth:`apiKey`,usageArgs:`--prompt <text> --image <url>... [--ref-video <url>...] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: wan3.0-video)`,"zh-CN":`模型 ID(默认:wan3.0-video)`}},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Video description with reference markers (image1, video1, etc.)`,"zh-CN":`包含引用标记的视频描述(image1、video1 等)`},required:!0},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Reference image URL or local file (repeatable for multiple subjects)`,"zh-CN":`参考图片 URL 或本地文件(多个主体时可重复)`}},refVideo:{type:`array`,valueHint:`<url>`,description:{"en-US":`Reference video URL or local file (repeatable)`,"zh-CN":`参考视频 URL 或本地文件(可重复)`}},imageVoice:{type:`array`,valueHint:`<url>`,description:{"en-US":`Voice URL for corresponding image (pairs by position). On wan3.0-video emitted as reference_audio (refer to Audio 1, Audio 2 in prompt)`,"zh-CN":`对应图片的语音 URL(按位置配对)。在 wan3.0-video 上作为 reference_audio 条目发送(prompt 中用「音频1」「音频2」引用)`}},videoVoice:{type:`array`,valueHint:`<url>`,description:{"en-US":`Voice URL for corresponding ref-video (pairs by position). On wan3.0-video emitted as reference_audio (refer to Audio 1, Audio 2 in prompt)`,"zh-CN":`对应参考视频的语音 URL(按位置配对)。在 wan3.0-video 上作为 reference_audio 条目发送(prompt 中用「音频1」「音频2」引用)`}},resolution:{type:`string`,valueHint:`<res>`,description:{"en-US":`Resolution: 720P or 1080P (default: 1080P)`,"zh-CN":`分辨率:720P 或 1080P(默认:1080P)`}},ratio:{type:`string`,valueHint:`<ratio>`,description:{"en-US":`Aspect ratio (16:9, 9:16, 1:1)`,"zh-CN":`宽高比(16:9、9:16、1:1)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Video duration in seconds (default: 5)`,"zh-CN":`视频时长,单位为秒(默认:5)`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Cr},watermark:{type:`boolean`,valueHint:`<bool>`,description:Er},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},download:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save video to file on completion`,"zh-CN":`完成后将视频保存到文件`}},...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 15)`,"zh-CN":`等待任务时的轮询间隔(默认:15 秒)`}}},exampleArgs:[{"en-US":`--prompt "Image1 running on the grass" --image person.jpg`,"zh-CN":`--prompt "图片 1 中的人物在草地上奔跑" --image person.jpg`},{"en-US":`--prompt "Video 1 plays guitar, Image 1 walks over" --ref-video scene.mp4 --image person.jpg`,"zh-CN":`--prompt "视频 1 中的人物弹吉他,图片 1 中的人物走过来" --ref-video scene.mp4 --image person.jpg`},{"en-US":`--prompt "Image 1 speaks" --image person.jpg --image-voice voice.mp3 --resolution 1080P`,"zh-CN":`--prompt "图片 1 中的人物说话" --image person.jpg --image-voice voice.mp3 --resolution 1080P`},{"en-US":`--prompt "Image 1 and Image 2 have a conversation" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`,"zh-CN":`--prompt "图片 1 和图片 2 中的人物进行对话" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`},{"en-US":`--prompt "Image 1 drinks water" --image person.jpg --watermark false`,"zh-CN":`--prompt "图片 1 中的人物喝水" --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:t,flags:r}=e,i=r.prompt,a=r.image||[],o=r.refVideo||[],s=r.imageVoice||[],c=r.videoVoice||[],l=r.model||t.defaultReferenceToVideoModel||`wan3.0-video`,u=T(t.output),d=/^wan3\./i.test(l),p=[],m=[];for(let t=0;t<a.length;t++){let n={type:`reference_image`,url:await e.client.resolveImageInput(a[t],l)};if(s[t]){let r=await e.client.uploadFile(s[t],l);d?m.push({type:`reference_audio`,url:r}):n.reference_voice=r}p.push(n)}for(let t=0;t<o.length;t++){let n={type:`reference_video`,url:await e.client.uploadFile(o[t],l)};if(c[t]){let r=await e.client.uploadFile(c[t],l);d?m.push({type:`reference_audio`,url:r}):n.reference_voice=r}p.push(n)}if(d)for(let e of m)p.push(e);let h=Nn(r.promptExtend,void 0,`prompt-extend`),g=Ln(r.watermark,t.watermark),_={model:l,input:{prompt:i,media:p},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,prompt_extend:h,watermark:g,seed:r.seed}};if(t.dryRun){let e={..._,input:{..._.input,media:_.input.media.map(e=>({...e,url:Dn(e.url),reference_voice:e.reference_voice?Dn(e.reference_voice):void 0}))}};A({request:e},u);return}let v=Br(r),y=(await Zr(v,t,()=>e.client.requestJson({path:vr(),method:`POST`,body:_,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||(process.stderr.write(`[Model: ${l}]\n`),process.stderr.write(`Note: Reference-to-video typically takes 5-10 minutes. Please be patient.
26
- `)),r.async){A(y.length===1?{task_id:y[0]}:{task_ids:y},u);return}let b=r.pollInterval??15,x=Math.max(t.timeout,600),S=await Promise.all(y.map(n=>Kr(e.client,t,{url:e.client.url(ir(n)),intervalSec:b,timeoutSec:x,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}}))),ee=[];for(let e=0;e<S.length;e++){let t=S[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&ee.push({taskId:y[e],videoUrl:n})}if(ee.length===0)throw new n(`All tasks completed but no video URLs returned.`,f.GENERAL);if(r.download){let e=r.download,{size:n}=await Mr(ee[0].videoUrl,e,{quiet:t.quiet});t.quiet?k(e):A({task_id:ee[0].taskId,video_url:ee[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Rr(n)},u);return}let{join:te}=await import(`path`),ne=In(t,{subDir:`videos`}),C=[];await Promise.all(ee.map(async({taskId:e,videoUrl:n})=>{let r=te(ne,`${e}.mp4`);await Mr(n,r,{quiet:t.quiet}),C.push({task_id:e,video_url:n,saved:r})})),C.length===1?A(C[0],u):A({videos:C,total:C.length},u)}}),nc=w({description:{"en-US":`Query async task status`,"zh-CN":`查询异步任务状态`},auth:`apiKey`,usageArgs:`--task-id <id>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Async task ID`,"zh-CN":`异步任务 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:ir(r)});if(t.quiet){k(a.output.task_status);return}A(rr({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,scheduled_time:a.output.scheduled_time,end_time:a.output.end_time,code:a.output.code,message:a.output.message,request_id:a.request_id}),i)}}),rc=w({description:{"en-US":`Download a completed video by task ID`,"zh-CN":`通过任务 ID 下载已完成的视频`},auth:`apiKey`,usageArgs:`--task-id <id> --out <path>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Task ID to download from`,"zh-CN":`要下载的任务 ID`},required:!0},out:{type:`string`,valueHint:`<path>`,description:{"en-US":`Output file path`,"zh-CN":`输出文件路径`},required:!0}},exampleArgs:[`--task-id 3b256896-xxxx --out video.mp4`,`--task-id 3b256896-xxxx --out video.mp4 --quiet`],async run(e){let{settings:t,flags:r}=e,i=r.taskId,a=r.out,o=T(t.output);if(t.dryRun){A({task_id:i,action:`download`,out:a},o);return}let s=await e.client.requestJson({path:ir(i)});if(s.output.task_status!==`SUCCEEDED`){let e=s.output.task_status,t=s.output.message||s.output.code,r=t?`Task is not complete (status: ${e}): ${t}`:`Task is not complete (status: ${e}).`;throw new n(r,f.GENERAL,e===`FAILED`?void 0:`Wait for the task to complete before downloading.`)}let c=s.output.video_url||s.output.results&&s.output.results[0]?.url;if(!c)throw new n(`No download URL available for this task.`,f.GENERAL);let{size:l}=await Mr(c,a,{quiet:t.quiet});if(t.quiet){k(a);return}A({saved:a,size:Rr(l)},o)}});const ic=/* @__PURE__ */ new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function ac(e){let t=_i(e).toLowerCase().split(`?`)[0];return!!(ic.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function oc(e){return e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`oss://`)?e:Tt(e)}var sc=w({description:{"en-US":`Describe an image or video using Qwen-VL`,"zh-CN":`使用 Qwen-VL 描述图片或视频`},auth:`apiKey`,usageArgs:`--image <path-or-url> [--video <url>] [--prompt <text>]`,flags:{image:{type:`string`,valueHint:`<path-or-url>`,description:{"en-US":`Local image path or URL`,"zh-CN":`本地图片路径或 URL`}},video:{type:`array`,valueHint:`<url>`,description:{"en-US":`Video file URL or local path (mp4/mov/avi/mkv/webm)`,"zh-CN":`视频文件 URL 或本地路径(mp4/mov/avi/mkv/webm)`}},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Question about the content (default: auto-detected)`,"zh-CN":`针对内容的问题(默认:自动识别)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Vision model (default: qwen3-vl-plus)`,"zh-CN":`视觉模型(默认:qwen3-vl-plus)`}}},exampleArgs:[`--image photo.jpg`,{"en-US":`--image https://example.com/photo.jpg --prompt "What breed is this dog?"`,"zh-CN":`--image https://example.com/photo.jpg --prompt "这只狗是什么品种?"`},{"en-US":`--video https://example.com/video.mp4 --prompt "Summarize the video content"`,"zh-CN":`--video https://example.com/video.mp4 --prompt "总结视频内容"`},`--video ./local-video.mp4`,{"en-US":`--image photo.png --prompt "Extract the text" --model qwen3-vl-plus`,"zh-CN":`--image photo.png --prompt "提取文字" --model qwen3-vl-plus`}],validate:e=>!e.image&&!e.video?.length?`Provide --image or --video.`:void 0,async run(e){let{settings:t,flags:r}=e,i=r.image,a=r.video??[],o=r.model||(e.client.usesTokenPlanEndpoint()?t.defaultTextModel:void 0)||`qwen3-vl-plus`;i&&ac(i)&&(a.push(i),i=void 0);let s=a.length>0?`Describe the video.`:`Describe the image.`,c=r.prompt||s,l=T(t.output);if(t.dryRun){A({request:{prompt:c,image:i?Dn(i):void 0,video:a.length?a.map(Dn):void 0,model:o}},l);return}let u=[];if(a.length>0)for(let t of a){let r=t;if(Mt(t)){if(!li(t))throw new n(`Video file not found: ${t}`,f.USAGE);r=await e.client.uploadFile(t,o)}u.push({type:`video_url`,video_url:{url:r}})}if(i){let t=await oc(i),n=t;Mt(i)&&t.startsWith(`data:`)&&pi(i).size>5242880&&(n=await e.client.resolveImageInput(i,o)),u.push({type:`image_url`,image_url:{url:n}})}u.push({type:`text`,text:c});let d={model:o,messages:[{role:`user`,content:u}]},p=await e.client.requestJson({path:xe(),method:`POST`,body:d}),m=p.choices?.[0]?.message?.content;if(l!==`text`){A(p,l);return}k(m||``)}});function cc(e,t,r){return new n(e(t),f.USAGE,r?e(r):void 0)}function lc(e,t,n){try{return JSON.parse(e)}catch(e){let r=e instanceof Error?e.message:String(e);throw cc(n,{"en-US":`${t} is not valid JSON: ${r}`,"zh-CN":`${t} 不是合法的 JSON:${r}`})}}function uc(...e){return e.filter(e=>e!==void 0).length}function dc(e){if(e.requestFile!==void 0)return uc(e.state,e.stateFile,e.questions,e.questionsFile)>0?{"en-US":`--request-file cannot be combined with --state, --state-file, --questions, or --questions-file.`,"zh-CN":`--request-file 不能与 --state、--state-file、--questions、--questions-file 同时使用。`}:void 0;let t=uc(e.state,e.stateFile);if(t!==1)return{"en-US":t===0?`Provide --state, --state-file, or --request-file.`:`Use only one of --state or --state-file.`,"zh-CN":t===0?`请提供 --state、--state-file 或 --request-file。`:`--state 与 --state-file 只能选择一个。`};let n=uc(e.questions,e.questionsFile);if(n!==1)return{"en-US":n===0?`Provide --questions or --questions-file.`:`Use only one of --questions or --questions-file.`,"zh-CN":n===0?`请提供 --questions 或 --questions-file。`:`--questions 与 --questions-file 只能选择一个。`}}function fc(e,t){let n=dc(e);if(n)throw cc(t,n)}function pc(e,t){let n=Tn(e);return _i(e).toLowerCase()===`.json`?lc(n,e,t):n}function mc(e,t){if(e.requestFile!==void 0){let n=lc(Tn(e.requestFile),e.requestFile,t);if(!jt(n))throw cc(t,{"en-US":`${e.requestFile} must be a JSON object with "state" and "questions".`,"zh-CN":`${e.requestFile} 必须是包含 "state" 和 "questions" 的 JSON 对象。`});return{state:n.state,questions:n.questions,model:typeof n.model==`string`&&n.model?n.model:void 0}}let n=e.stateFile===void 0?e.state:pc(e.stateFile,t),r=e.questionsFile===void 0?lc(e.questions??``,`--questions`,t):lc(Tn(e.questionsFile),e.questionsFile,t);return{state:n,questions:cr(r)}}function hc(e,t){fc(e,t);let n=mc(e,t),r=nr(n.questions),i=[...Dt(n.state),...Et(r)];if(i.length>0)throw cc(t,{"en-US":`Invalid decision request:`,"zh-CN":`决策请求不合法:`},{"en-US":i.map(e=>`- ${e.message[`en-US`]}`).join(`
21
+ `),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 zs)process.stdout.write(`${e(t.voice,12)} ${e(t.name,14)} ${e(t.desc,14)} ${t.lang}\n`);process.stdout.write(`\nTotal: ${zs.length} voices\n`)}const Vs={wav:`wav`,mp3:`mp3`,amr:`amr`,aac:`aac`,m4a:`aac`,ogg:`ogg`,"3gp":`3gp`,"3gpp":`3gpp`},Hs=Object.keys(Vs);function Us(e){let t=e.split(`?`)[0].split(`#`)[0],r=bi(t).slice(1).toLowerCase();if(!r)throw new n(`Cannot infer audio format from "${e}". Use a file/URL whose path ends with: ${Hs.join(`, `)}.`,f.USAGE);let i=Vs[r];if(!i)throw new n(`Unsupported audio extension ".${r}" for "${e}". Supported extensions: ${Hs.join(`, `)}.`,f.USAGE);return i}function Ws(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 Gs=w({description:{"en-US":`Multimodal chat with text + audio output (Qwen-Omni)`,"zh-CN":`支持文本输入与音频输出的多模态对话(Qwen-Omni)`},auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Message text (repeatable, prefix role: to set role)`,"zh-CN":`消息文本(可重复;可使用 role: 前缀指定角色)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen3.5-omni-plus)`,"zh-CN":`模型 ID(默认:qwen3.5-omni-plus)`}},system:{type:`string`,valueHint:`<text>`,description:{"en-US":`System prompt`,"zh-CN":`系统提示词`}},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL or local file (repeatable)`,"zh-CN":`图片 URL 或本地文件(可重复)`}},audio:{type:`array`,valueHint:`<url>`,description:{"en-US":`Audio URL or local file (.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`,"zh-CN":`音频 URL 或本地文件(.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`}},video:{type:`array`,valueHint:`<url>`,description:{"en-US":`Video file URL / local path, or comma-separated frame URLs`,"zh-CN":`视频文件 URL / 本地路径,或以逗号分隔的帧 URL`}},voice:{type:`string`,valueHint:`<voice>`,description:{"en-US":`Output voice ID (default: Tina). Use --list-voices to see all options`,"zh-CN":`输出音色 ID(默认:Tina)。使用 --list-voices 查看所有选项`}},listVoices:{type:`switch`,description:{"en-US":`List available output voices and exit`,"zh-CN":`列出可用的输出音色并退出`}},audioFormat:{type:`string`,valueHint:`<fmt>`,description:{"en-US":`Audio output format (default: wav)`,"zh-CN":`音频输出格式(默认:wav)`}},audioOut:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save audio to file (default: auto-generate)`,"zh-CN":`将音频保存到文件(默认:自动生成路径)`}},textOnly:{type:`switch`,description:{"en-US":`Output text only, no audio generation`,"zh-CN":`仅输出文本,不生成音频`}},maxTokens:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum tokens to generate`,"zh-CN":`最大生成 Token 数`}},temperature:{type:`number`,valueHint:`<n>`,description:{"en-US":`Sampling temperature (0.0, 2.0]`,"zh-CN":`采样温度 (0.0, 2.0]`}}},exampleArgs:[`--list-voices`,{"en-US":`--message "Hello, who are you?"`,"zh-CN":`--message "你好,你是谁?"`},{"en-US":`--message "Describe this image" --image ./photo.jpg`,"zh-CN":`--message "描述这张图片" --image ./photo.jpg`},{"en-US":`--message "What is this audio saying?" --audio https://example.com/audio.wav`,"zh-CN":`--message "这段音频说了什么?" --audio https://example.com/audio.wav`},{"en-US":`--message "Summarize this video" --video https://example.com/video.mp4`,"zh-CN":`--message "总结这段视频" --video https://example.com/video.mp4`},{"en-US":`--message "What is this video about?" --video ./local-video.mp4 --text-only`,"zh-CN":`--message "这段视频讲了什么?" --video ./local-video.mp4 --text-only`},{"en-US":`--message "Answer in Sichuan dialect: How's the weather today?" --voice Sunny`,"zh-CN":`--message "请用四川话回答:今天天气怎么样?" --voice Sunny`},{"en-US":`--message "Hello" --text-only --output json`,"zh-CN":`--message "你好" --text-only --output json`},{"en-US":`--message "Read this passage aloud" --audio-out greeting.wav`,"zh-CN":`--message "朗读这段文字" --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){Bs();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=/* @__PURE__ */ 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:Us(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:xe(),method:`POST`,body:_,stream:!0}),y=``,b=``,x=process.stdout.isTTY,S=process.stdout;for await(let e of gn(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(`
22
+ `);let ee;if(b&&!s){let e=Buffer.from(b,`base64`),r=Ws(e.length),i=Buffer.concat([r,e]),a=n.audioOut;if(!a){let{join:e}=await import(`path`);a=e(zn(t,{subDir:`omni`}),`omni_${Date.now()}.wav`)}_i(a,i),ee=a,t.quiet||process.stderr.write(`Audio saved: ${a}\n`)}if(!x||c===`json`){let e={content:y};ee&&(e.audio_saved=ee,e.voice=a),A(e,c)}}});const Ks={prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Image description`,"zh-CN":`图片描述`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen-image-3.0)`,"zh-CN":`模型 ID(默认:qwen-image-3.0)`}},size:{type:`string`,valueHint:`<W*H>`,description:{"en-US":`Image size: ratio (3:4, 16:9, 1:1) or pixels (2048*2048)`,"zh-CN":`图片尺寸:比例(3:4、16:9、1:1)或像素(2048*2048)`}},n:{type:`number`,valueHint:`<count>`,description:{"en-US":`Number of images per request (default: 1, max: 6)`,"zh-CN":`每次请求生成的图片数量(默认:1,最多:6)`}},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Or},watermark:{type:`boolean`,valueHint:`<bool>`,description:kr},...t,...r,outDir:{type:`string`,valueHint:`<dir>`,description:{"en-US":`Download images to directory`,"zh-CN":`将图片下载到指定目录`}},outPrefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filename prefix (default: image)`,"zh-CN":`文件名前缀(默认:image)`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 3)`,"zh-CN":`等待任务时的轮询间隔(默认:3 秒)`}}};var qs=w({description:{"en-US":`Generate images (Qwen-Image / wan2.x)`,"zh-CN":`生成图片(Qwen-Image / wan2.x)`},auth:`apiKey`,usageArgs:`--prompt <text> [flags]`,flags:Ks,exampleArgs:[{"en-US":`--prompt "A cat in a spacesuit on Mars"`,"zh-CN":`--prompt "一只穿着宇航服的猫站在火星上"`},{"en-US":`--prompt "Logo design" --n 3 --out-dir ./generated/`,"zh-CN":`--prompt "Logo 设计" --n 3 --out-dir ./generated/`},{"en-US":`--prompt "Mountain landscape" --size 2688*1536`,"zh-CN":`--prompt "山地景观" --size 2688*1536`},{"en-US":`--prompt "A castle" --seed 42 --prompt-extend false`,"zh-CN":`--prompt "一座城堡" --seed 42 --prompt-extend false`},{"en-US":`--prompt "Logo" --watermark false`,"zh-CN":`--prompt "Logo" --watermark false`},{"en-US":`--prompt "An alien in the space" --watermark false`,"zh-CN":`--prompt "太空中的外星人" --watermark false`},{"en-US":`--prompt "sunset" --model wan2.6-t2i --async --quiet`,"zh-CN":`--prompt "日落" --model wan2.6-t2i --async --quiet`},{"en-US":`--prompt "plush doll" --model z-image-turbo --size 1024*1024`,"zh-CN":`--prompt "毛绒玩偶" --model z-image-turbo --size 1024*1024`},{"en-US":`--prompt "sunset" --model wanx2.0-t2i-turbo --size 1024*1024`,"zh-CN":`--prompt "日落" --model wanx2.0-t2i-turbo --size 1024*1024`},{"en-US":`--prompt "Pro quality" --model qwen-image-2.0-pro`,"zh-CN":`--prompt "专业品质" --model qwen-image-2.0-pro`},{"en-US":`--prompt "Product shots" --n 2 --concurrent 3 # 6 images in parallel`,"zh-CN":`--prompt "产品摄影" --n 2 --concurrent 3 # 并行生成 6 张图片`}],async run(e){let{settings:t,flags:n}=e,r=n.prompt,i=n.model||t.defaultImageModel||`qwen-image-3.0`,a=Rn(i),o=n.size||`1:1`,s=$r(o,a.sizeProfile),c=n.n??1,l=Ur(n),u=In(n.promptExtend,a.promptExtendDefault,`prompt-extend`),d=Bn(n.watermark,t.watermark),f={size:s,n:c,seed:n.seed,prompt_extend:u,watermark:d},p=a.inputStyle===`prompt`?{model:i,input:{prompt:r,negative_prompt:n.negativePrompt||void 0},parameters:f}:{model:i,input:{messages:[{role:`user`,content:[{text:r}]}]},parameters:{...f,negative_prompt:n.negativePrompt||void 0}},m=T(t.output);if(t.dryRun){A({request:p,mode:a.useSync?`sync`:`async`,path:a.path},m);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: ${a.useSync?`sync`:`async`}]\n`),a.useSync?await Js(e.client,t,a.path,p,n,m,l):await Ys(e.client,t,a.path,p,n,m,l)}});async function Js(e,t,r,i,a,o,s){let c=(await ei(s,t,()=>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(c.length===0)throw new n(`Generation completed but no images returned.`,f.GENERAL);await Xs(c,a,t,o)}async function Ys(e,t,r,i,a,o,s){let c=(await ei(s,t,()=>e.requestJson({path:r,method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.async){A({task_ids:c},o);return}let l=a.pollInterval??3,u=c.map(n=>{let r=e.url(sr(n));return Yr(e,t,{url:r,intervalSec:l,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})}),d=await Promise.all(u),p=[];for(let e of d){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);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 n(`All tasks completed but no images returned.`,f.GENERAL);await Xs(p,a,t,o,c.length===1?c[0]:void 0,c)}async function Xs(e,t,n,r,i,a){let o=zn(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),s=t.prompt||``,c=t.outPrefix||at(`image`,s),l=e.length>1?e.map((e,t)=>{let n=`${c}_${String(t+1).padStart(3,`0`)}.png`;return{url:e,destPath:xi(o,n)}}):[{url:e[0],destPath:xi(o,`${c}.png`)}],u=await Ir(l,Fr,{quiet:n.quiet});if(n.quiet)k(u.join(`
23
+ `));else{let t={urls:e,saved:u,total:e.length};i&&(t.task_id=i),a&&a.length>1&&(t.task_ids=a),A(t,r)}}const Zs={image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Source image URL or local file path (repeatable for multi-image merge)`,"zh-CN":`源图片 URL 或本地文件路径(多图融合时可重复)`},required:!0},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Edit instruction text`,"zh-CN":`编辑指令文本`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: qwen-image-3.0)`,"zh-CN":`模型 ID(默认:qwen-image-3.0)`}},size:{type:`string`,valueHint:`<W*H>`,description:{"en-US":`Output image size: ratio (3:4, 16:9) or pixels (2048*2048)`,"zh-CN":`输出图片尺寸:比例(3:4、16:9)或像素(2048*2048)`}},n:{type:`number`,valueHint:`<count>`,description:{"en-US":`Number of images (default: 1, max: 6)`,"zh-CN":`图片数量(默认:1,最多:6)`}},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible results`,"zh-CN":`用于复现结果的随机种子`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},function:{type:`string`,valueHint:`<name>`,description:{"en-US":`wanx*-imageedit function (default: description_edit). Examples: stylization_all, description_edit`,"zh-CN":`wanx*-imageedit 功能(默认:description_edit)。例如:stylization_all、description_edit`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Dr},watermark:{type:`boolean`,valueHint:`<bool>`,description:kr},outDir:{type:`string`,valueHint:`<dir>`,description:{"en-US":`Download images to directory`,"zh-CN":`将图片下载到指定目录`}},outPrefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filename prefix (default: edited)`,"zh-CN":`文件名前缀(默认:edited)`}},...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 3)`,"zh-CN":`等待任务时的轮询间隔(默认:3 秒)`}}};var Qs=w({description:{"en-US":`Edit an existing image with text instructions (Qwen-Image / Wan 2.7)`,"zh-CN":`使用文本指令编辑现有图片(Qwen-Image / Wan 2.7)`},auth:`apiKey`,usageArgs:`--image <url> --prompt <text> [flags]`,flags:Zs,exampleArgs:[{"en-US":`--image ./photo.png --prompt "Replace the background with a beach"`,"zh-CN":`--image ./photo.png --prompt "将背景替换为海滩"`},{"en-US":`--image https://example.com/logo.png --prompt "Change color to blue" --n 3`,"zh-CN":`--image https://example.com/logo.png --prompt "将颜色改为蓝色" --n 3`},{"en-US":`--image ./a.png --image ./b.png --prompt "Merge two images into one collage"`,"zh-CN":`--image ./a.png --image ./b.png --prompt "将两张图片合并成一张拼贴图"`},{"en-US":`--image https://example.com/photo.png --prompt "Remove the person" --model qwen-image-2.0-pro`,"zh-CN":`--image https://example.com/photo.png --prompt "移除人物" --model qwen-image-2.0-pro`},{"en-US":`--image ./photo.png --prompt "Change the style" --model wan2.7-image`,"zh-CN":`--image ./photo.png --prompt "更改图片风格" --model wan2.7-image`},{"en-US":`--image ./photo.png --prompt "Place the subject on a table" --model wan2.5-i2i-preview`,"zh-CN":`--image ./photo.png --prompt "将主体放在桌面上" --model wan2.5-i2i-preview`},{"en-US":`--image ./photo.png --prompt "Convert to a picture-book style" --model wanx2.1-imageedit --function stylization_all`,"zh-CN":`--image ./photo.png --prompt "转换成绘本风格" --model wanx2.1-imageedit --function stylization_all`},{"en-US":`--image ./photo.png --prompt "Replace the background with a beach" --watermark false`,"zh-CN":`--image ./photo.png --prompt "将背景替换为海滩" --watermark false`}],async run(e){let{settings:t,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||t.defaultImageModel||`qwen-image-3.0`,s=Ln(o),c=await Promise.all(i.map(t=>e.client.resolveImageInput(t,o))),l=r.n??1,u=In(r.promptExtend,s.promptExtendDefault,`prompt-extend`),d=Bn(r.watermark,t.watermark),p={size:$r(r.size,s.sizeProfile),n:l,seed:r.seed,prompt_extend:u,watermark:d},m;if(s.inputStyle===`function-base-image`){let e=c[0];if(!e)throw new n(`wanx*-imageedit requires at least one --image as base_image_url.`,f.USAGE);m={model:o,input:{function:r.function||`description_edit`,prompt:a,base_image_url:e},parameters:p}}else if(s.inputStyle===`prompt-images`)m={model:o,input:{prompt:a,images:c,negative_prompt:r.negativePrompt||void 0},parameters:p};else{let e=c.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}}}or(m.parameters);let h=T(t.output);if(t.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:An(e.image)}:e)}))}}:`images`in m.input?e={...m,input:{...m.input,images:m.input.images?.map(e=>An(e))}}:`base_image_url`in m.input&&(e={...m,input:{...m.input,base_image_url:An(m.input.base_image_url),mask_image_url:m.input.mask_image_url?An(m.input.mask_image_url):void 0}}),A({request:e,mode:s.useSync?`sync`:`async`,path:s.path},h);return}t.quiet||process.stderr.write(`[Model: ${o}] [Mode: ${s.useSync?`sync`:`async`}] [Images: ${c.length}]\n`);let g=Ur(r);s.useSync?await $s(e.client,t,s.path,m,r,h,g):await ec(e.client,t,s.path,m,r,h,g)}});async function $s(e,t,r,i,a,o,s){let c=(await ei(s,t,()=>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(c.length===0)throw new n(`Edit completed but no images returned.`,f.GENERAL);await tc(c,a,t,o)}async function ec(e,t,r,i,a,o,s){let c=(await ei(s,t,()=>e.requestJson({path:r,method:`POST`,body:i,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.async){A({task_ids:c},o);return}let l=a.pollInterval??3,u=c.map(n=>Yr(e,t,{url:e.url(sr(n)),intervalSec:l,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),d=await Promise.all(u),p=[];for(let e of d){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);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 n(`All tasks completed but no images returned.`,f.GENERAL);await tc(p,a,t,o)}async function tc(e,t,n,r){let i=zn(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),a=t.outPrefix||at(`edited`,t.prompt),o=e.length>1?e.map((e,t)=>{let n=`${a}_${String(t+1).padStart(3,`0`)}.png`;return{url:e,destPath:xi(i,n)}}):[{url:e[0],destPath:xi(i,`${a}.png`)}],s=await Ir(o,Fr,{quiet:n.quiet});n.quiet?k(s.join(`
24
+ `)):A({urls:e,saved:s,total:e.length},r)}var nc=w({description:{"en-US":`Generate a video from text or image (wan3.0-video / wan2.6-t2v / happyhorse-1.1-i2v)`,"zh-CN":`根据文本或图片生成视频(wan3.0-video / wan2.6-t2v / happyhorse-1.1-i2v)`},auth:`apiKey`,usageArgs:`--prompt <text> [--image <url>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: wan3.0-video)`,"zh-CN":`模型 ID(默认:wan3.0-video)`}},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Video description`,"zh-CN":`视频描述`},required:!0},image:{type:`string`,valueHint:`<url>`,description:{"en-US":`Input image URL for image-to-video generation`,"zh-CN":`图生视频使用的输入图片 URL`}},lastFrame:{type:`string`,valueHint:`<url>`,description:{"en-US":`Last frame image URL (with --image, enables kf2v first+last frame mode)`,"zh-CN":`尾帧图片 URL(与 --image 配合,启用 kf2v 首尾帧模式)`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},resolution:{type:`string`,valueHint:`<res>`,description:{"en-US":`Resolution: 720P or 1080P (default: 1080P)`,"zh-CN":`分辨率:720P 或 1080P(默认:1080P)`}},ratio:{type:`string`,valueHint:`<ratio>`,description:{"en-US":`Aspect ratio (e.g. 16:9, 9:16, 1:1)`,"zh-CN":`宽高比(例如 16:9、9:16、1:1)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Video duration in seconds (default: 5)`,"zh-CN":`视频时长,单位为秒(默认:5)`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Er},watermark:{type:`boolean`,valueHint:`<bool>`,description:kr},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},download:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save video to file on completion`,"zh-CN":`完成后将视频保存到文件`}},file:{type:`string`,valueHint:`<url-or-path>`,description:{"en-US":`Reference file URL or local path for file-to-video (wan3.0-video only; mutually exclusive with --image/--last-frame)`,"zh-CN":`参考文件 URL 或本地路径,用于文件生视频(仅 wan3.0-video;与 --image/--last-frame 互斥)`}},...Ns,...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待任务时的轮询间隔(默认:5 秒)`}}},exampleArgs:[{"en-US":`--prompt "A person reading a book, static shot"`,"zh-CN":`--prompt "一个人正在读书,固定镜头"`},{"en-US":`--prompt "Ocean waves at sunset." --download sunset.mp4`,"zh-CN":`--prompt "日落时的海浪。" --download sunset.mp4`},{"en-US":`--image https://example.com/cat.png --prompt "Make the cat in the scene move"`,"zh-CN":`--image https://example.com/cat.png --prompt "让画面中的猫动起来"`},{"en-US":`--prompt "Mountain landscape" --resolution 720P --duration 5`,"zh-CN":`--prompt "山地景观" --resolution 720P --duration 5`},{"en-US":`--prompt "A cat playing with a ball" --watermark false`,"zh-CN":`--prompt "一只正在玩球的猫" --watermark false`},{"en-US":`--prime --workspace-id <id> --model wan3.0-video-prime --prompt "Ocean waves at sunset"`,"zh-CN":`--prime --workspace-id <id> --model wan3.0-video-prime --prompt "日落时的海浪"`}],notes:[{"en-US":`Prime mode requires an explicit model.`,"zh-CN":`Prime 模式必须显式指定模型。`},{"en-US":`Prime endpoint: configured --base-url, DASHSCOPE_BASE_URL, or profile base_url takes precedence; otherwise workspace is resolved from --workspace-id, BAILIAN_WORKSPACE_ID, then config workspace_id.`,"zh-CN":`Prime Endpoint:已配置的 --base-url、DASHSCOPE_BASE_URL 或 Profile base_url 优先;否则按 --workspace-id、BAILIAN_WORKSPACE_ID、配置项 workspace_id 解析工作空间。`}],validate:Ps,async run(e){let{settings:t,flags:r}=e,i=r.prompt,a=r.model||(r.image?t.defaultImageToVideoModel||`wan3.0-video`:t.defaultVideoModel||`wan3.0-video`),o=T(t.output),s=r.image,c=r.lastFrame,l=r.file;if(l&&(s||c))throw new n(`--file is mutually exclusive with --image/--last-frame.`,f.USAGE);let u;s&&(u=await e.client.resolveImageInput(s,a));let d;c&&(d=await e.client.resolveImageInput(c,a));let p=!!(u&&d),m=/^wan3\./i.test(a);if(l&&!m)throw new n(`--file is only supported by wan3.0-video.`,f.USAGE);let h;l&&(h=await e.client.uploadFile(l,a));let g=Bn(r.watermark,t.watermark),_=In(r.promptExtend,void 0,`prompt-extend`),v=p&&!m?wt():xr(),y=r.prime?Fs(e,v):v,b={model:a,input:{prompt:i,negative_prompt:r.negativePrompt||void 0,...h?{media:[{type:`file`,url:h}]}:p?m?{media:[{type:`first_frame`,url:u},{type:`last_frame`,url:d}]}:{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:_,watermark:g,seed:r.seed}};if(t.dryRun){let e=b;if(h)e={...b,input:{...b.input,media:[{type:`file`,url:An(h)}]}};else if(p){let t=An(u??``),n=An(d??``);e={...b,input:{...b.input,...m?{media:[{type:`first_frame`,url:t},{type:`last_frame`,url:n}]}:{first_frame_url:t,last_frame_url:n}}}}else if(u){let t=An(u);e={...b,input:{...b.input,.../wan[x]?2\.[1-6]/i.test(a)?{img_url:t}:{media:[{type:`first_frame`,url:t}]}}}}A(r.prime?{endpoint:y,request:e}:{request:e},o);return}let x=Ur(r),S=(await ei(x,t,()=>e.client.requestJson({path:y,method:`POST`,body:b,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||process.stderr.write(`[Model: ${a}]\n`),r.async){A(S.length===1?{task_id:S[0]}:{task_ids:S},o);return}let ee=r.pollInterval??5,te=S.map(n=>{let i=r.prime?Fs(e,sr(n)):e.client.url(sr(n));return Yr(e.client,t,{url:i,intervalSec:ee,timeoutSec:t.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}})}),ne=await Promise.all(te),C=[];for(let[e,t]of ne.entries()){let n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&C.push({taskId:S[e],videoUrl:n})}if(C.length===0)throw new n(`All tasks completed but no video URLs returned.`,f.GENERAL);if(r.download){let e=r.download,{size:n}=await Fr(C[0].videoUrl,e,{quiet:t.quiet});t.quiet?k(e):A({task_id:C[0].taskId,video_url:C[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Vr(n)},o);return}let re=zn(t,{subDir:`videos`}),{join:ie}=await import(`path`),ae=[];await Promise.all(C.map(async({taskId:e,videoUrl:n})=>{let r=ie(re,`${e}.mp4`);await Fr(n,r,{quiet:t.quiet}),ae.push({task_id:e,video_url:n,saved:r})})),ae.length===1?A(ae[0],o):A({videos:ae,total:ae.length},o)}}),rc=w({description:{"en-US":`Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.)`,"zh-CN":`使用 happyhorse-1.0-video-edit 编辑视频(风格转换、对象替换等)`},auth:`apiKey`,usageArgs:`--video <url> --prompt <text> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: happyhorse-1.0-video-edit)`,"zh-CN":`模型 ID(默认:happyhorse-1.0-video-edit)`}},video:{type:`string`,valueHint:`<url>`,description:{"en-US":`Input video URL or local file (mp4/mov, 2-10s)`,"zh-CN":`输入视频 URL 或本地文件(mp4/mov,2–10 秒)`},required:!0},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Edit instruction (e.g. "Convert the scene to a claymation style")`,"zh-CN":`编辑指令(例如“将场景转换为黏土动画风格”)`}},refImage:{type:`string`,valueHint:`<url>`,description:{"en-US":`Reference image URL (up to 4, comma-separated)`,"zh-CN":`参考图片 URL(最多 4 个,以逗号分隔)`}},negativePrompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Negative prompt to exclude unwanted content`,"zh-CN":`负向提示词,用于排除不需要的内容`}},resolution:{type:`string`,valueHint:`<res>`,description:{"en-US":`Resolution: 720P or 1080P (default: 1080P)`,"zh-CN":`分辨率:720P 或 1080P(默认:1080P)`}},ratio:{type:`string`,valueHint:`<ratio>`,description:{"en-US":`Aspect ratio (16:9, 9:16, 1:1, 4:3, 3:4)`,"zh-CN":`宽高比(16:9、9:16、1:1、4:3、3:4)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Output video duration in seconds (2-10)`,"zh-CN":`输出视频时长,单位为秒(2–10)`}},audioSetting:{type:`string`,valueHint:`<mode>`,description:{"en-US":`Audio: auto (default) or origin (keep original)`,"zh-CN":`音频:auto(默认)或 origin(保留原音频)`},choices:[`auto`,`origin`]},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Er},watermark:{type:`boolean`,valueHint:`<bool>`,description:kr},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},download:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save video to file on completion`,"zh-CN":`完成后将视频保存到文件`}},...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 15)`,"zh-CN":`等待任务时的轮询间隔(默认:15 秒)`}}},exampleArgs:[{"en-US":`--video https://example.com/input.mp4 --prompt "Convert the entire scene to claymation style"`,"zh-CN":`--video https://example.com/input.mp4 --prompt "将整个场景转换为黏土动画风格"`},{"en-US":`--video https://example.com/input.mp4 --prompt "Replace the outfit with the style shown in the image" --ref-image https://example.com/clothes.png`,"zh-CN":`--video https://example.com/input.mp4 --prompt "将服装替换为参考图片中的款式" --ref-image https://example.com/clothes.png`},{"en-US":`--video https://example.com/input.mp4 --prompt "Convert to anime style" --resolution 720P --download output.mp4`,"zh-CN":`--video https://example.com/input.mp4 --prompt "转换为动漫风格" --resolution 720P --download output.mp4`},{"en-US":`--video https://example.com/input.mp4 --prompt "Put clothes on the kitten in the video" --watermark false`,"zh-CN":`--video https://example.com/input.mp4 --prompt "给视频中的小猫穿上衣服" --watermark false`}],async run(e){let{settings:t,flags:r}=e,i=r.video,a=r.prompt,o=r.model||`happyhorse-1.0-video-edit`,s=T(t.output),c=[{type:`video`,url:await e.client.uploadFile(i,o)}],l=r.refImage;if(l){let t=l.split(`,`).map(e=>e.trim()).filter(Boolean);for(let n of t){let t=await e.client.uploadFile(n,o);c.push({type:`reference_image`,url:t})}}let u=In(r.promptExtend,void 0,`prompt-extend`),d=Bn(r.watermark,t.watermark),p={model:o,input:{prompt:a||void 0,negative_prompt:r.negativePrompt||void 0,media:c},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,audio_setting:r.audioSetting||void 0,prompt_extend:u,watermark:d,seed:r.seed}};if(t.dryRun){A({request:p},s);return}let m=Ur(r),h=(await ei(m,t,()=>e.client.requestJson({path:xr(),method:`POST`,body:p,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||(process.stderr.write(`[Model: ${o}]\n`),process.stderr.write(`Note: Video editing typically takes 5-8 minutes. Please be patient.
25
+ `)),r.async){A(h.length===1?{task_id:h[0]}:{task_ids:h},s);return}let g=r.pollInterval??15,_=Math.max(t.timeout,600),v=await Promise.all(h.map(n=>Yr(e.client,t,{url:e.client.url(sr(n)),intervalSec:g,timeoutSec:_,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=[];for(let e=0;e<v.length;e++){let t=v[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&y.push({taskId:h[e],videoUrl:n})}if(y.length===0)throw new n(`All tasks completed but no video URLs returned.`,f.GENERAL);if(r.download){let e=r.download,{size:n}=await Fr(y[0].videoUrl,e,{quiet:t.quiet});t.quiet?k(e):A({task_id:y[0].taskId,video_url:y[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Vr(n)},s);return}let b=await import(`path`),x=zn(t,{subDir:`videos`}),S=[];await Promise.all(y.map(async({taskId:e,videoUrl:n})=>{let r=b.join(x,`${e}.mp4`);await Fr(n,r,{quiet:t.quiet}),S.push({task_id:e,video_url:n,saved:r})})),S.length===1?A(S[0],s):A({videos:S,total:S.length},s)}}),ic=w({description:{"en-US":`Reference-to-video generation (wan3.0-video / happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice`,"zh-CN":`参考生视频(wan3.0-video / happyhorse-1.1-r2v / wan2.6-r2v):支持多主体、多镜头和语音`},auth:`apiKey`,usageArgs:`--prompt <text> --image <url>... [--ref-video <url>...] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: wan3.0-video)`,"zh-CN":`模型 ID(默认:wan3.0-video)`}},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Video description with reference markers (image1, video1, etc.)`,"zh-CN":`包含引用标记的视频描述(image1、video1 等)`},required:!0},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Reference image URL or local file (repeatable for multiple subjects)`,"zh-CN":`参考图片 URL 或本地文件(多个主体时可重复)`}},refVideo:{type:`array`,valueHint:`<url>`,description:{"en-US":`Reference video URL or local file (repeatable)`,"zh-CN":`参考视频 URL 或本地文件(可重复)`}},imageVoice:{type:`array`,valueHint:`<url>`,description:{"en-US":`Voice URL for corresponding image (pairs by position). On wan3.0-video emitted as reference_audio (refer to Audio 1, Audio 2 in prompt)`,"zh-CN":`对应图片的语音 URL(按位置配对)。在 wan3.0-video 上作为 reference_audio 条目发送(prompt 中用「音频1」「音频2」引用)`}},videoVoice:{type:`array`,valueHint:`<url>`,description:{"en-US":`Voice URL for corresponding ref-video (pairs by position). On wan3.0-video emitted as reference_audio (refer to Audio 1, Audio 2 in prompt)`,"zh-CN":`对应参考视频的语音 URL(按位置配对)。在 wan3.0-video 上作为 reference_audio 条目发送(prompt 中用「音频1」「音频2」引用)`}},resolution:{type:`string`,valueHint:`<res>`,description:{"en-US":`Resolution: 720P or 1080P (default: 1080P)`,"zh-CN":`分辨率:720P 或 1080P(默认:1080P)`}},ratio:{type:`string`,valueHint:`<ratio>`,description:{"en-US":`Aspect ratio (16:9, 9:16, 1:1)`,"zh-CN":`宽高比(16:9、9:16、1:1)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Video duration in seconds (default: 5)`,"zh-CN":`视频时长,单位为秒(默认:5)`}},promptExtend:{type:`boolean`,valueHint:`<bool>`,description:Er},watermark:{type:`boolean`,valueHint:`<bool>`,description:kr},seed:{type:`number`,valueHint:`<n>`,description:{"en-US":`Random seed for reproducible generation`,"zh-CN":`用于复现生成结果的随机种子`}},download:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save video to file on completion`,"zh-CN":`完成后将视频保存到文件`}},...t,...r,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 15)`,"zh-CN":`等待任务时的轮询间隔(默认:15 秒)`}}},exampleArgs:[{"en-US":`--prompt "Image1 running on the grass" --image person.jpg`,"zh-CN":`--prompt "图片 1 中的人物在草地上奔跑" --image person.jpg`},{"en-US":`--prompt "Video 1 plays guitar, Image 1 walks over" --ref-video scene.mp4 --image person.jpg`,"zh-CN":`--prompt "视频 1 中的人物弹吉他,图片 1 中的人物走过来" --ref-video scene.mp4 --image person.jpg`},{"en-US":`--prompt "Image 1 speaks" --image person.jpg --image-voice voice.mp3 --resolution 1080P`,"zh-CN":`--prompt "图片 1 中的人物说话" --image person.jpg --image-voice voice.mp3 --resolution 1080P`},{"en-US":`--prompt "Image 1 and Image 2 have a conversation" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`,"zh-CN":`--prompt "图片 1 和图片 2 中的人物进行对话" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`},{"en-US":`--prompt "Image 1 drinks water" --image person.jpg --watermark false`,"zh-CN":`--prompt "图片 1 中的人物喝水" --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:t,flags:r}=e,i=r.prompt,a=r.image||[],o=r.refVideo||[],s=r.imageVoice||[],c=r.videoVoice||[],l=r.model||t.defaultReferenceToVideoModel||`wan3.0-video`,u=T(t.output),d=/^wan3\./i.test(l),p=[],m=[];for(let t=0;t<a.length;t++){let n={type:`reference_image`,url:await e.client.resolveImageInput(a[t],l)};if(s[t]){let r=await e.client.uploadFile(s[t],l);d?m.push({type:`reference_audio`,url:r}):n.reference_voice=r}p.push(n)}for(let t=0;t<o.length;t++){let n={type:`reference_video`,url:await e.client.uploadFile(o[t],l)};if(c[t]){let r=await e.client.uploadFile(c[t],l);d?m.push({type:`reference_audio`,url:r}):n.reference_voice=r}p.push(n)}if(d)for(let e of m)p.push(e);let h=In(r.promptExtend,void 0,`prompt-extend`),g=Bn(r.watermark,t.watermark),_={model:l,input:{prompt:i,media:p},parameters:{resolution:r.resolution||void 0,ratio:r.ratio||void 0,duration:r.duration||void 0,prompt_extend:h,watermark:g,seed:r.seed}};if(t.dryRun){let e={..._,input:{..._.input,media:_.input.media.map(e=>({...e,url:An(e.url),reference_voice:e.reference_voice?An(e.reference_voice):void 0}))}};A({request:e},u);return}let v=Ur(r),y=(await ei(v,t,()=>e.client.requestJson({path:xr(),method:`POST`,body:_,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||(process.stderr.write(`[Model: ${l}]\n`),process.stderr.write(`Note: Reference-to-video typically takes 5-10 minutes. Please be patient.
26
+ `)),r.async){A(y.length===1?{task_id:y[0]}:{task_ids:y},u);return}let b=r.pollInterval??15,x=Math.max(t.timeout,600),S=await Promise.all(y.map(n=>Yr(e.client,t,{url:e.client.url(sr(n)),intervalSec:b,timeoutSec:x,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}}))),ee=[];for(let e=0;e<S.length;e++){let t=S[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&ee.push({taskId:y[e],videoUrl:n})}if(ee.length===0)throw new n(`All tasks completed but no video URLs returned.`,f.GENERAL);if(r.download){let e=r.download,{size:n}=await Fr(ee[0].videoUrl,e,{quiet:t.quiet});t.quiet?k(e):A({task_id:ee[0].taskId,video_url:ee[0].videoUrl,status:`SUCCEEDED`,saved:e,size:Vr(n)},u);return}let{join:te}=await import(`path`),ne=zn(t,{subDir:`videos`}),C=[];await Promise.all(ee.map(async({taskId:e,videoUrl:n})=>{let r=te(ne,`${e}.mp4`);await Fr(n,r,{quiet:t.quiet}),C.push({task_id:e,video_url:n,saved:r})})),C.length===1?A(C[0],u):A({videos:C,total:C.length},u)}}),ac=w({description:{"en-US":`Query async task status`,"zh-CN":`查询异步任务状态`},auth:`apiKey`,usageArgs:`--task-id <id>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Async task ID`,"zh-CN":`异步任务 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:sr(r)});if(t.quiet){k(a.output.task_status);return}A(or({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,scheduled_time:a.output.scheduled_time,end_time:a.output.end_time,code:a.output.code,message:a.output.message,request_id:a.request_id}),i)}}),oc=w({description:{"en-US":`Download a completed video by task ID`,"zh-CN":`通过任务 ID 下载已完成的视频`},auth:`apiKey`,usageArgs:`--task-id <id> --out <path>`,flags:{taskId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Task ID to download from`,"zh-CN":`要下载的任务 ID`},required:!0},out:{type:`string`,valueHint:`<path>`,description:{"en-US":`Output file path`,"zh-CN":`输出文件路径`},required:!0}},exampleArgs:[`--task-id 3b256896-xxxx --out video.mp4`,`--task-id 3b256896-xxxx --out video.mp4 --quiet`],async run(e){let{settings:t,flags:r}=e,i=r.taskId,a=r.out,o=T(t.output);if(t.dryRun){A({task_id:i,action:`download`,out:a},o);return}let s=await e.client.requestJson({path:sr(i)});if(s.output.task_status!==`SUCCEEDED`){let e=s.output.task_status,t=s.output.message||s.output.code,r=t?`Task is not complete (status: ${e}): ${t}`:`Task is not complete (status: ${e}).`;throw new n(r,f.GENERAL,e===`FAILED`?void 0:`Wait for the task to complete before downloading.`)}let c=s.output.video_url||s.output.results&&s.output.results[0]?.url;if(!c)throw new n(`No download URL available for this task.`,f.GENERAL);let{size:l}=await Fr(c,a,{quiet:t.quiet});if(t.quiet){k(a);return}A({saved:a,size:Vr(l)},o)}});const sc=/* @__PURE__ */ new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function cc(e){let t=bi(e).toLowerCase().split(`?`)[0];return!!(sc.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function lc(e){return e.startsWith(`data:`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`oss://`)?e:Tt(e)}var uc=w({description:{"en-US":`Describe an image or video using Qwen-VL`,"zh-CN":`使用 Qwen-VL 描述图片或视频`},auth:`apiKey`,usageArgs:`--image <path-or-url> [--video <url>] [--prompt <text>]`,flags:{image:{type:`string`,valueHint:`<path-or-url>`,description:{"en-US":`Local image path or URL`,"zh-CN":`本地图片路径或 URL`}},video:{type:`array`,valueHint:`<url>`,description:{"en-US":`Video file URL or local path (mp4/mov/avi/mkv/webm)`,"zh-CN":`视频文件 URL 或本地路径(mp4/mov/avi/mkv/webm)`}},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Question about the content (default: auto-detected)`,"zh-CN":`针对内容的问题(默认:自动识别)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Vision model (default: qwen3-vl-plus)`,"zh-CN":`视觉模型(默认:qwen3-vl-plus)`}}},exampleArgs:[`--image photo.jpg`,{"en-US":`--image https://example.com/photo.jpg --prompt "What breed is this dog?"`,"zh-CN":`--image https://example.com/photo.jpg --prompt "这只狗是什么品种?"`},{"en-US":`--video https://example.com/video.mp4 --prompt "Summarize the video content"`,"zh-CN":`--video https://example.com/video.mp4 --prompt "总结视频内容"`},`--video ./local-video.mp4`,{"en-US":`--image photo.png --prompt "Extract the text" --model qwen3-vl-plus`,"zh-CN":`--image photo.png --prompt "提取文字" --model qwen3-vl-plus`}],validate:e=>!e.image&&!e.video?.length?`Provide --image or --video.`:void 0,async run(e){let{settings:t,flags:r}=e,i=r.image,a=r.video??[],o=r.model||(e.client.usesTokenPlanEndpoint()?t.defaultTextModel:void 0)||`qwen3-vl-plus`;i&&cc(i)&&(a.push(i),i=void 0);let s=a.length>0?`Describe the video.`:`Describe the image.`,c=r.prompt||s,l=T(t.output);if(t.dryRun){A({request:{prompt:c,image:i?An(i):void 0,video:a.length?a.map(An):void 0,model:o}},l);return}let u=[];if(a.length>0)for(let t of a){let r=t;if(Mt(t)){if(!fi(t))throw new n(`Video file not found: ${t}`,f.USAGE);r=await e.client.uploadFile(t,o)}u.push({type:`video_url`,video_url:{url:r}})}if(i){let t=await lc(i),n=t;Mt(i)&&t.startsWith(`data:`)&&gi(i).size>5242880&&(n=await e.client.resolveImageInput(i,o)),u.push({type:`image_url`,image_url:{url:n}})}u.push({type:`text`,text:c});let d={model:o,messages:[{role:`user`,content:u}]},p=await e.client.requestJson({path:xe(),method:`POST`,body:d}),m=p.choices?.[0]?.message?.content;if(l!==`text`){A(p,l);return}k(m||``)}});function dc(e,t,r){return new n(e(t),f.USAGE,r?e(r):void 0)}function fc(e,t,n){try{return JSON.parse(e)}catch(e){let r=e instanceof Error?e.message:String(e);throw dc(n,{"en-US":`${t} is not valid JSON: ${r}`,"zh-CN":`${t} 不是合法的 JSON:${r}`})}}function pc(...e){return e.filter(e=>e!==void 0).length}function mc(e){if(e.requestFile!==void 0)return pc(e.state,e.stateFile,e.questions,e.questionsFile)>0?{"en-US":`--request-file cannot be combined with --state, --state-file, --questions, or --questions-file.`,"zh-CN":`--request-file 不能与 --state、--state-file、--questions、--questions-file 同时使用。`}:void 0;let t=pc(e.state,e.stateFile);if(t!==1)return{"en-US":t===0?`Provide --state, --state-file, or --request-file.`:`Use only one of --state or --state-file.`,"zh-CN":t===0?`请提供 --state、--state-file 或 --request-file。`:`--state 与 --state-file 只能选择一个。`};let n=pc(e.questions,e.questionsFile);if(n!==1)return{"en-US":n===0?`Provide --questions or --questions-file.`:`Use only one of --questions or --questions-file.`,"zh-CN":n===0?`请提供 --questions 或 --questions-file。`:`--questions 与 --questions-file 只能选择一个。`}}function hc(e,t){let n=mc(e);if(n)throw dc(t,n)}function gc(e,t){let n=On(e);return bi(e).toLowerCase()===`.json`?fc(n,e,t):n}function _c(e,t){if(e.requestFile!==void 0){let n=fc(On(e.requestFile),e.requestFile,t);if(!jt(n))throw dc(t,{"en-US":`${e.requestFile} must be a JSON object with "state" and "questions".`,"zh-CN":`${e.requestFile} 必须是包含 "state" 和 "questions" 的 JSON 对象。`});return{state:n.state,questions:n.questions,model:typeof n.model==`string`&&n.model?n.model:void 0}}let n=e.stateFile===void 0?e.state:gc(e.stateFile,t),r=e.questionsFile===void 0?fc(e.questions??``,`--questions`,t):fc(On(e.questionsFile),e.questionsFile,t);return{state:n,questions:dr(r)}}function vc(e,t){hc(e,t);let n=_c(e,t),r=ar(n.questions),i=[...Dt(n.state),...Et(r)];if(i.length>0)throw dc(t,{"en-US":`Invalid decision request:`,"zh-CN":`决策请求不合法:`},{"en-US":i.map(e=>`- ${e.message[`en-US`]}`).join(`
27
27
  `),"zh-CN":i.map(e=>`- ${e.message[`zh-CN`]}`).join(`
28
- `)});return{state:n.state,questions:r,model:n.model}}function gc(e){return e.client.url(je(),()=>{if(!e.workspaceId)throw cc(e.localize,{"en-US":`Workspace ID is required for the decision model endpoint.`,"zh-CN":`调用决策模型需要 Workspace ID。`},{"en-US":`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.binName} config set workspace_id <id>. You can also override the endpoint with --base-url.`,"zh-CN":`请传入 --workspace-id、设置环境变量 BAILIAN_WORKSPACE_ID,或执行:${e.binName} config set workspace_id <id>。也可以用 --base-url 覆盖请求地址。`});return yr(e.workspaceId,e.region)})}function _c(e){return String(typeof e==`number`?Number(e.toFixed(4)):e)}function vc(e){return e?Object.entries(e).map(([e,t])=>`${e}=${_c(t)}`).join(` `):``}function yc(e){let t=Object.entries(e.probabilities??{});if(t.length===0)return;let[n]=t.reduce((e,t)=>t[1]>e[1]?t:e),r=e.legend?.[n];return r?`${n} ${r}`:n}function bc(e){if(e.type===`choice`&&e.choice!==void 0)return[`choice=${e.choice}`,e.confidence===void 0?``:`confidence=${_c(e.confidence)}`,vc(e.probabilities)].filter(Boolean).join(` `);if(e.type===`noul`&&e.noul!==void 0)return`noul P(yes)=${_c(e.noul)}`;if(e.type===`score`&&e.score!==void 0){let t=yc(e);return[`score=${_c(e.score)}`,e.confidence===void 0?``:`confidence=${_c(e.confidence)}`,t?`top=${t}`:``].filter(Boolean).join(` `)}return JSON.stringify(e)}function xc(e){let t=Object.entries(e.answers??{});if(t.length===0)return JSON.stringify(e);let n=Math.max(...t.map(([e])=>e.length));return t.map(([e,t])=>`${e.padEnd(n)} ${jt(t)?bc(t):JSON.stringify(t)}`).join(`
29
- `)}function Sc(e){let t=[e.usage?.input_tokens===void 0?``:`input_tokens=${e.usage.input_tokens}`,e.latency_ms===void 0?``:`latency_ms=${e.latency_ms}`].filter(Boolean);return t.length>0?t.join(` `):void 0}var Cc=w({description:{"en-US":`Run the decision model: typed choice / noul / score answers with probabilities`,"zh-CN":`调用决策模型:一次返回 choice / noul / score 判定结果及概率分布`},auth:`apiKey`,usageArgs:`(--state <text> | --state-file <path>) (--questions <json> | --questions-file <path>) | --request-file <path>`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Decision model ID (default: ${a})`,"zh-CN":`决策模型 ID(默认:${a})`}},state:{type:`string`,valueHint:`<text>`,description:{"en-US":`Business state to decide on, sent as a string`,"zh-CN":`待决策的业务状态,按字符串发送`}},stateFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read state from a file (.json is parsed as an object/array, others as text; - for stdin)`,"zh-CN":`从文件读取 state(.json 解析为对象/数组,其他按文本读取;- 表示 stdin)`}},questions:{type:`string`,valueHint:`<json>`,description:{"en-US":`Question table JSON, keyed by question ID`,"zh-CN":`问题表 JSON,键为问题 ID`}},questionsFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read the question table from a JSON file ({...} or {"questions":{...}})`,"zh-CN":`从 JSON 文件读取问题表({...} 或 {"questions":{...}})`}},requestFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Full request JSON {state, questions}; label/target are stripped`,"zh-CN":`完整请求 JSON {state, questions};自动去掉 label/target`}},workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for the endpoint host (or set BAILIAN_WORKSPACE_ID)`,"zh-CN":`用于拼接请求域名的 Workspace ID(也可设置 BAILIAN_WORKSPACE_ID)`}},region:{type:`string`,valueHint:`<region>`,choices:i,description:{"en-US":`Endpoint region: ${i.join(`, `)} (default: ${o})`,"zh-CN":`请求地域:${i.join(`、`)}(默认:${o})`}}},exampleArgs:[{"en-US":`--workspace-id <id> --state "Is this review asking for a refund?" --questions '{"refund":{"type":"noul","instructions":"Asking for a refund?"}}'`,"zh-CN":`--workspace-id <id> --state "这段评论是否在索要退款?" --questions '{"refund":{"type":"noul","instructions":"是否在索要退款?"}}'`},`--state-file ticket.json --questions-file workload.json`,`--request-file sample.json --model decision-model-preview`,`--region ap-southeast-1 --request-file sample.json`,`--request-file sample.json --dry-run`],notes:[{"en-US":`Endpoint: configured --base-url, DASHSCOPE_BASE_URL, or profile base_url takes precedence; otherwise https://{workspace}.{region}.maas.aliyuncs.com/compatible-mode/v1/systemone, with workspace from --workspace-id, BAILIAN_WORKSPACE_ID, then config workspace_id.`,"zh-CN":`请求地址:已配置的 --base-url、DASHSCOPE_BASE_URL 或 Profile base_url 优先;否则为 https://{workspace}.{region}.maas.aliyuncs.com/compatible-mode/v1/systemone,工作空间按 --workspace-id、BAILIAN_WORKSPACE_ID、配置项 workspace_id 解析。`},{"en-US":`Question types: choice (criteria: option → description, 1-255), noul (optional criteria with true/false descriptions), score (criteria: levels from low to high, 2-255; 3-7 recommended). Keep questions per request at 16 or fewer; latency grows roughly linearly.`,"zh-CN":`问题类型:choice(criteria 为选项 → 描述,1-255 项)、noul(可选 criteria,含 true/false 描述)、score(criteria 为从低到高的等级,2-255 级,建议 3-7 级)。建议每次请求不超过 16 个问题,延迟随问题数近线性增长。`},{"en-US":`Output defaults to the full JSON response. Use --output text for one human-readable line per question; the request ID and usage summary are written to stderr.`,"zh-CN":`默认输出完整 JSON 响应。使用 --output text 可按问题逐行输出易读结果;请求 ID 与用量摘要写入 stderr。`},{"en-US":`Training samples can be reused directly: label/target are stripped before sending. Sampling parameters (temperature, max_tokens, ...) are not supported by this API.`,"zh-CN":`训练样本可直接复用:发送前自动去掉 label/target。该接口不支持 temperature、max_tokens 等采样参数。`}],validate:e=>{let t=dc(e);return typeof t==`string`||!t?t:`${t[`en-US`]} / ${t[`zh-CN`]}`},async run(e){let{settings:t,flags:n}=e,r=hc(n,e.localize),i={model:n.model||r.model||a,state:r.state,questions:r.questions},s=gc({workspaceId:n.workspaceId||t.workspaceId,region:n.region??o,binName:e.identity.binName,client:e.client,localize:e.localize}),c=t.outputExplicit?T(t.output):`json`;if(t.dryRun){A({endpoint:s,request:i},c);return}let l=await e.client.requestJson({path:s,method:`POST`,body:i});if(c!==`text`){A(l,c);return}if(k(xc(l)),!t.quiet){let e=Sc(l);e&&process.stderr.write(`${e}\n`)}Pr(l.request_id,t.quiet)}});const wc=[`language`,`base_url`,`output`,`output_dir`,`timeout`,`watermark`,`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_speech_recognition_model`,`default_omni_model`,`api_key_capabilities`,`workspace_id`],Tc=/* @__PURE__ */ new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]),Ec=[`console_site`,`console_region`,`console_switch_agent`,`telemetry`],Dc=[...wc,...Ec],Oc={language:[...te],output:[`text`,`json`],console_site:[`domestic`,`international`]},kc=/* @__PURE__ */ new Set([`telemetry`,`watermark`]),Ac={default_text_model:`qwen3.8-max`,default_image_model:`qwen-image-3.0`,default_video_model:`wan3.0-video`,default_image_to_video_model:`wan3.0-video`,default_reference_to_video_model:`wan3.0-video`,default_speech_model:`cosyvoice-v3-flash`,default_speech_recognition_model:`fun-asr`,default_omni_model:`qwen3.5-omni-plus`},jc={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:`wan3.0-video`,role:`video/generate · t2v / i2v / r2v default`},{id:`happyhorse-1.1-t2v`,role:`video/generate · text-to-video`},{id:`happyhorse-1.1-i2v`,role:`video/generate · image-to-video`},{id:`happyhorse-1.1-r2v`,role:`video/ref · reference-to-video`}],default_image_to_video_model:[{id:`wan3.0-video`,role:`video/generate default · image-to-video`},{id:`happyhorse-1.1-i2v`,role:`video/generate · image-to-video`}],default_reference_to_video_model:[{id:`wan3.0-video`,role:`video/ref default · reference-to-video`},{id:`happyhorse-1.1-r2v`,role:`video/ref · reference-to-video`}],default_speech_model:[{id:`cosyvoice-v3-flash`,role:`speech/synthesize (TTS) default`},{id:`qwen-audio-3.0-tts-plus`,role:`Token Plan speech/synthesize (TTS)`}],default_speech_recognition_model:[{id:`fun-asr`,role:`speech/recognize (ASR) default`},{id:`qwen-audio-3.0-asr-flash`,role:`Token Plan speech/recognize (ASR)`}],default_omni_model:[{id:`qwen3.5-omni-plus`,role:`omni/chat default`},{id:`qwen3-vl-plus`,role:`vision/describe · multimodal input`}]},Mc={"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-speech-recognition-model":`default_speech_recognition_model`,"default-omni-model":`default_omni_model`,"api-key-capabilities":`api_key_capabilities`,"workspace-id":`workspace_id`};function Nc(e){return Mc[e]||e}function Pc(e,t){let r=Nc(e);if(!wc.includes(r))throw new n(`Invalid config key "${e}". Valid keys: ${wc.join(`, `)}`,f.USAGE);if(r===`language`&&!te.includes(t))throw new n(`Invalid language "${t}". Valid values: ${te.join(`, `)}`,f.USAGE);if(r===`output`&&![`text`,`json`].includes(t))throw new n(`Invalid output format "${t}". Valid values: text, json`,f.USAGE);if(r===`timeout`){let e=Number(t);if(isNaN(e)||e<=0)throw new n(`Invalid timeout "${t}". Must be a positive number.`,f.USAGE);return e}if(r===`base_url`)return un(t);if(r===`watermark`)return dn(t,`watermark`);if(r===`api_key_capabilities`){let e;if(t.trim().startsWith(`[`))try{e=JSON.parse(t)}catch{throw new n(`Invalid API Key capability list "${t}". Use comma-separated values or a JSON array.`,f.USAGE)}else e=t.split(`,`).map(e=>e.trim());if(!Array.isArray(e))throw new n(`Invalid API Key capability list. Expected an array.`,f.USAGE);let r=[];for(let t of e){if(typeof t!=`string`||!kt(t.trim()))throw new n(`Invalid API Key capability "${String(t)}".`,f.USAGE,`Use lowercase alphanumeric segments separated by '.' or '-'.`);let e=t.trim();r.includes(e)||r.push(e)}return r}return t}function Fc(e,t){let r=Nc(e);if(wc.includes(r))return Pc(e,t);if(r===`console_site`){if(![`domestic`,`international`].includes(t))throw new n(`Invalid console_site "${t}". Valid values: domestic, international`,f.USAGE);return t}if(r===`console_region`)return t;if(r===`console_switch_agent`){let e=Number(t);if(!Number.isFinite(e)||e<=0)throw new n(`Invalid console_switch_agent "${t}". Must be a positive number.`,f.USAGE);return e}if(r===`telemetry`){if(t!==`true`&&t!==`false`)throw new n(`Invalid telemetry "${t}". Valid values: true, false`,f.USAGE);return t===`true`}throw new n(`Invalid config key "${e}". Valid keys: ${Dc.join(`, `)}`,f.USAGE)}var Ic=w({description:{"en-US":`Display current configuration`,"zh-CN":`显示当前配置`},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,language:i.language??l,base_url:n.baseUrl,output:t.output,timeout:t.timeout,watermark:t.watermark,config:t.configName??`default`,config_file:r.path};for(let e of Tc)typeof o[e]==`string`&&(o[e]=Qt(o[e]));A(o,a)}}),Lc=w({description:{"en-US":`Set a config value`,"zh-CN":`设置配置项`},auth:`none`,usageArgs:`--key <key> --value <value>`,flags:{key:{type:`string`,valueHint:`<key>`,description:{"en-US":`Config key (language, base_url, output, output_dir, timeout, watermark, api_key, api_key_capabilities, access_token, access_key_id, access_key_secret, security_token, default_*_model, workspace_id)`,"zh-CN":`配置项名称(language、base_url、output、output_dir、timeout、watermark、api_key、api_key_capabilities、access_token、access_key_id、access_key_secret、security_token、default_*_model、workspace_id)`},required:!0},value:{type:`string`,valueHint:`<value>`,description:{"en-US":`Value to set`,"zh-CN":`要设置的值`},required:!0}},exampleArgs:[`--key language --value zh-CN`,`--key output --value json`,`--key timeout --value 600`,`--key watermark --value false`,`--key base_url --value https://dashscope.aliyuncs.com`,`--config company-plan --key api-key-capabilities --value text.chat,image.generate`],async run(e){let{settings:t,flags:n}=e,r=n.key,i=n.value,a=Nc(r),o=Pc(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=Tc.has(a)?Qt(String(o)):o;A({[a]:n,config:t.configName??`default`,config_file:e.configStore.path},s)}}}),Rc=w({description:{"en-US":`List config profiles and show the active profile`,"zh-CN":`列出配置 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?`*`:``}`)}}),zc=w({description:{"en-US":`Set the active config profile`,"zh-CN":`设置当前激活的配置 Profile`},auth:`none`,usageArgs:`--name <name>`,flags:{name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Existing profile name, or default`,"zh-CN":`已有 Profile 名称,或 default`},required:!0}},exampleArgs:[`--name token-plan`,`--name default`],async run(e){let t=T(e.settings.output);if(e.settings.dryRun){let n=e.configStore.validateActivation(e.flags.name);A({would_activate:n,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)}});const Bc=[[`Config - Alibaba Cloud Model Studio CLI`,`配置 - 阿里云百炼 CLI`],[`The login was not completed in time. Click "Log in" to try again.`,`登录未能及时完成。请点击“登录”重试。`],[`No connected agent can accept tasks yet. Install and connect qwen-code (or another supported agent) first, and make sure its CLI is on your PATH.`,`当前没有可接收任务的已连接 Agent。请先安装并连接 qwen-code(或其他受支持的 Agent),并确保其 CLI 位于 PATH 中。`],[`Complete a few steps to check your local environment and finish first-time setup: sign in to Bailian, connect a local coding agent, and run your first task. Each circle turns from gray to green as you go.`,`完成以下步骤以检查本地环境并完成首次配置:登录百炼、连接本地编程 Agent,并运行第一个任务。完成后,每个圆点会由灰色变为绿色。`],[`Pick a scenario to dispatch a preset task to a connected local coding agent, running in a new terminal. Tasks run in the directory where <code style="font-family:var(--mono)">bl config ui</code> was started.`,`选择一个场景,将预设任务发送给已连接的本地编程 Agent,并在新终端中运行。任务会在启动 <code style="font-family:var(--mono)">bl config ui</code> 的目录中执行。`],[`Pick a scenario to dispatch a preset task to a connected local coding agent, running in a new terminal. Tasks run in the directory where `,`选择一个场景,将预设任务发送给已连接的本地编程 Agent,并在新终端中运行。任务会在启动 `],[` was started.`,` 的目录中执行。`],[`Credentials and default models. The active profile (marked with a star) is used by every bl command. Click a profile to edit its settings.`,`管理凭证和默认模型。所有 bl 命令都会使用带星标的已激活 Profile。点击 Profile 可编辑其设置。`],[`Agent skills discovered across every local agent module (~/.agents/skills plus each agent's skills folder). Installed via <code style="font-family:var(--mono)">npx skills add</code>.`,`展示从本地各 Agent 模块中发现的 Skill(~/.agents/skills 以及各 Agent 的 skills 目录),可通过 <code style="font-family:var(--mono)">npx skills add</code> 安装。`],[`Agent skills discovered across every local agent module (~/.agents/skills plus each agent's skills folder). Installed via `,`展示从本地各 Agent 模块中发现的 Skill(~/.agents/skills 以及各 Agent 的 skills 目录),可通过 `],[`Media that bl writes into the output directory, grouped by type (images, videos, audio, files) and generation time.`,`bl 写入输出目录的媒体文件,按类型(图片、视频、音频、文件)和生成时间展示。`],[`Frameworks bl can configure. "Connected" means the bailian-cli provider is wired into that agent.`,`bl 可以配置的编程 Agent。"已连接"表示该 Agent 已接入 bailian-cli provider。`],[`Model Context Protocol servers declared in your local coding-agent configs.`,`本地编程 Agent 配置中声明的 Model Context Protocol 服务器。`],[`Create a named profile with its own credentials and default models.`,`创建一个拥有独立凭证和默认模型的命名 Profile。`],[`Inputs become fillable fields when dispatching. Reference each one in the prompt as {{key}}.`,`任务发送时,输入项会显示为可填写字段。请在提示词中使用 {{key}} 引用对应输入。`],[`The .zip must contain a SKILL.md at its root or inside a single top-level folder.`,`.zip 根目录或唯一的顶层目录中必须包含 SKILL.md。`],[`The active profile is used by every bl command.`,`所有 bl 命令都会使用已激活的 Profile。`],[`Delete profile "`,`删除 Profile“`],[`"? This permanently removes its credentials and default models.`,`”?这会永久删除其中的凭证和默认模型。`],[`Delete asset "`,`删除资产“`],[`"? This removes the file from disk.`,`”?这会从磁盘中删除该文件。`],[`MCP servers configured in Claude Code, Codex, Qwen Code or OpenCode will appear here.`,`在 Claude Code、Codex、Qwen Code 或 OpenCode 中配置的 MCP 服务器会显示在这里。`],[`Assets from <code>bl image</code>, <code>bl video</code>, <code>bl speech</code> and <code>bl omni</code> will appear here.`,`通过 <code>bl image</code>、<code>bl video</code>、<code>bl speech</code> 和 <code>bl omni</code> 生成的资产会显示在这里。`],[`Remote agents loaded from a URL will appear here.`,`通过 URL 加载的远程 Agent 会显示在这里。`],[`The CLI for this agent was not found on your PATH — install it before launching`,`未在 PATH 中找到该 Agent 的 CLI,请先安装再启动`],[`Connect this agent to bailian-cli before launching`,`请先将该 Agent 连接到 bailian-cli 再启动`],[`Install this agent before launching`,`请先安装该 Agent 再启动`],[`Open a new terminal and start this agent`,`在新终端中启动该 Agent`],[`Open the config file with the system default app`,`使用系统默认应用打开配置文件`],[`Task sent to `,`任务已发送至 `],[`. Check the newly opened terminal window.`,`。请查看新打开的终端窗口。`],[`Please enter a profile name.`,`请输入 Profile 名称。`],[`Only letters, numbers, - and _ are allowed.`,`仅允许使用字母、数字、- 和 _。`],[`"default" is reserved for the top-level profile.`,`“default”保留用于顶层 Profile。`],[`A profile named "`,`名为“`],[`" already exists.`,`”的 Profile 已存在。`],[`Saved, but activation failed: `,`已保存,但激活失败:`],[`Could not read runtime environment info.`,`无法读取运行环境信息。`],[`Runtime Node <code>`,`运行时 Node <code>`],[`</code> · platform <code>`,`</code> · 平台 <code>`],[`Signed in: `,`已登录:`],[`Connected: `,`已连接:`],[`All agents (~/.agents/skills)`,`所有 Agent(~/.agents/skills)`],[`Optional — folder name (defaults to the archive folder)`,`可选 — 文件夹名称(默认使用压缩包中的文件夹名称)`],[`Skill name (optional)`,`Skill 名称(可选)`],[`Skill package (.zip)`,`Skill 包(.zip)`],[`Please choose a .zip file.`,`请选择 .zip 文件。`],[`Install with <code>npx skills add modelstudioai/cli --all -g</code>`,`使用 <code>npx skills add modelstudioai/cli --all -g</code> 安装`],[`Skill "`,`Skill“`],[`MCP server "`,`MCP 服务器“`],[`" installed (`,`”已安装(`],[` files) to `,` 个文件),位置:`],[`" was updated.`,`”已更新。`],[`" was added to `,`”已添加至 `],[`Remove "`,`移除“`],[`" from `,`”(来源:`],[`? This rewrites the source config file.`,`)?此操作会重写来源配置文件。`],[`Could not delete this server.`,`无法删除该服务器。`],[`Delete MCP server?`,`删除 MCP 服务器?`],[`Config must be a JSON object.`,`配置必须是 JSON 对象。`],[`Invalid JSON: `,`无效的 JSON:`],[`Please enter a server name.`,`请输入服务器名称。`],[`No remote agents yet.`,`暂无远程 Agent。`],[`No agents in this category.`,`该分类下暂无 Agent。`],[`No agents match "`,`没有匹配“`],[`bailian-cli is not wired into this agent yet.`,`该 Agent 尚未连接 bailian-cli。`],[`This agent is not installed yet.`,`该 Agent 尚未安装。`],[`No scenarios in this category.`,`该分类下暂无场景。`],[`No scenarios match "`,`没有匹配“`],[`Click to edit this scenario`,`点击编辑此场景`],[`Dispatch this task to a local agent`,`将此任务发送至本地 Agent`],[`No connected agent available`,`没有可用的已连接 Agent`],[`Please fill in: `,`请填写:`],[`Input key "`,`输入键“`],[`" may only use letters, digits, underscore.`,`”只能使用字母、数字和下划线。`],[`Duplicate input key: `,`输入键重复:`],[`Title is required.`,`标题为必填项。`],[`Prompt template is required.`,`提示词模板为必填项。`],[`No assets match "`,`没有匹配“`],[`Toggle sort by generation time`,`切换生成时间排序`],[`↓ Newest first`,`↓ 最新优先`],[`↑ Oldest first`,`↑ 最早优先`],[`View details — `,`查看详情 — `],[`Available `,`可用的 `],[` models · click to use`,` 模型 · 点击使用`],[`Applies to <code>bl video generate</code> only (text/image-to-video). `,`仅适用于 <code>bl video generate</code>(文生视频/图生视频)。`],[`<code>bl video ref</code> (multi-image) and <code>bl video edit</code> keep their own `,`<code>bl video ref</code>(多图)和 <code>bl video edit</code> 仍使用各自的`],[`fixed models — pass <code>--model</code> to override those per run.`,`固定模型;可在每次运行时通过 <code>--model</code> 覆盖。`],[`No skills match "`,`没有匹配“`],[`No MCP servers match "`,`没有匹配“`],[`Install to`,`安装到`],[`Transport / Source`,`传输方式 / 来源`],[`Target agent config`,`目标 Agent 配置`],[`Server name`,`服务器名称`],[`Quick launch`,`快速启动`],[`Config files`,`配置文件`],[`Environment check`,`环境检查`],[`Edit preset scenario`,`编辑预设场景`],[`Edit scenario`,`编辑场景`],[`Save &amp; Activate`,`保存并激活`],[`Are you sure?`,`确认执行此操作吗?`],[`Save failed`,`保存失败`],[`Create failed`,`创建失败`],[`Install failed`,`安装失败`],[`Launch failed`,`启动失败`],[`Dispatch failed`,`发送失败`],[`Delete failed`,`删除失败`],[`Created`,`已创建`],[`Dispatched`,`已发送`],[`Saved`,`已保存`],[`OK`,`确定`],[`Configuration`,`配置`],[`Settings`,`设置`],[`Status`,`状态`],[`Open`,`打开`],[`Remove`,`移除`],[`Show`,`显示`],[`Hide`,`隐藏`],[`All`,`全部`],[`Images`,`图片`],[`Videos`,`视频`],[`Files`,`文件`],[`Image`,`图片`],[`Video`,`视频`],[`Audio`,`音频`],[`File`,`文件`],[` files`,` 个文件`],[`MCPs`,`MCP 服务`],[`Coding`,`编程`],[`Generated`,`生成的`],[`API key`,`API 密钥`],[`Console gateway`,`控制台网关`],[`Account`,`账户`],[`(empty)`,`(空)`],[` (editable)`,`(可编辑)`],[` (missing)`,`(缺失)`],[`default (top-level)`,`default(顶层)`],[`This source is read-only here (its config is TOML). Edit it directly in `,`该来源在此处为只读(配置格式为 TOML)。请直接编辑:`],[`No connected local coding agent detected (e.g. qwen-code). Open the Agents page to install and connect one.`,`未检测到已连接的本地编程 Agent(例如 qwen-code)。请打开 Agent 页面进行安装和连接。`],[`Installed but not wired into bl: `,`已安装但尚未接入 bl:`],[`. Open the Agents page to finish connecting.`,`。请打开 Agent 页面完成连接。`],[`Finish the previous step first (connect a dispatchable agent), then come back to Playground to run your first scenario.`,`请先完成上一步(连接可接收任务的 Agent),再回到 Playground 运行第一个场景。`],[`Go to Playground, pick a scenario and click Run it to complete your first dispatch.`,`前往 Playground,选择一个场景并点击“运行”,完成首次任务发送。`],[`Sign in to the Bailian console to obtain credentials (opens a login page in your browser).`,`登录百炼控制台以获取凭证(将在浏览器中打开登录页面)。`],[`You have dispatched at least one task.`,`你已经成功发送过至少一个任务。`],[`Node 18 or newer is recommended.`,`建议使用 Node.js 18 或更高版本。`],[`Save & Activate`,`保存并激活`],[`Save scenario`,`保存场景`],[`Custom scenario`,`自定义场景`],[`+ Custom scenario`,`+ 自定义场景`],[`New profile`,`新建 Profile`],[`+ New profile`,`+ 新建 Profile`],[`Profile name`,`Profile 名称`],[`Target agent`,`目标 Agent`],[`Task to dispatch`,`要发送的任务`],[`Prompt template`,`提示词模板`],[`One-line description (optional)`,`一句话描述(可选)`],[`Use {{key}} placeholders for inputs`,`使用 {{key}} 作为输入占位符`],[`e.g. Translate docs to English`,`例如:将文档翻译成英文`],[`e.g. Image / Custom`,`例如:图像 / 自定义`],[`e.g. work, intl, test`,`例如:work、intl、test`],[`Search scenarios…`,`搜索场景…`],[`Search skills…`,`搜索 Skill…`],[`Search MCP servers…`,`搜索 MCP 服务器…`],[`Search agents…`,`搜索 Agent…`],[`Search assets…`,`搜索资产…`],[`Installed Skills`,`已安装的 Skill`],[`Coding Agents`,`编程 Agent`],[`Generated Assets`,`生成资产`],[`Get Started`,`开始使用`],[`Quick Start`,`快速开始`],[`Playground`,`Playground`],[`Extensions`,`扩展`],[`Workspace`,`工作区`],[`Skills`,`Skill`],[`Agents`,`Agent`],[`Assets`,`资产`],[`Config`,`配置`],[`Log in`,`登录`],[`Log out`,`退出登录`],[`Copy this URL`,`复制此链接`],[`QR code for this session URL`,`当前会话链接的二维码`],[`Collapse sidebar`,`收起侧边栏`],[`Expand sidebar`,`展开侧边栏`],[`Model Studio CLI home`,`百炼 CLI 首页`],[`Loading…`,`加载中…`],[`Delete profile`,`删除 Profile`],[`Delete asset`,`删除资产`],[`Open failed`,`打开失败`],[`Open locally`,`在本地打开`],[`View details`,`查看详情`],[`Jump backward 5 pages`,`向前跳转 5 页`],[`Jump forward 5 pages`,`向后跳转 5 页`],[`Items per page`,`每页数量`],[`No generated assets yet.`,`暂无生成资产。`],[`No assets in this category.`,`该分类下暂无资产。`],[`No skills installed.`,`尚未安装 Skill。`],[`No local MCP servers found.`,`未发现本地 MCP 服务器。`],[`No coding agents found.`,`未发现编程 Agent。`],[`No scenarios found.`,`未发现场景。`],[`Failed to load: `,`加载失败:`],[`Load failed: `,`加载失败:`],[`Save failed: `,`保存失败:`],[`Create failed: `,`创建失败:`],[`Install failed: `,`安装失败:`],[`Launch failed: `,`启动失败:`],[`Saving…`,`正在保存…`],[`Saved and activated.`,`已保存并激活。`],[`Saved.`,`已保存。`],[`Profile created and saved.`,`Profile 已创建并保存。`],[`Opening browser…`,`正在打开浏览器…`],[`Waiting for login…`,`等待登录…`],[`Signed in…`,`已登录…`],[`Login timed out`,`登录超时`],[`Authenticated`,`已认证`],[`Connect a local agent`,`连接本地 Agent`],[`Run your first task`,`运行第一个任务`],[`Sign in to Bailian`,`登录百炼`],[`Check local environment`,`检查本地环境`],[`Go to Playground`,`前往 Playground`],[`Go to Agents`,`前往 Agent`],[`Run it`,`运行`],[`Done`,`已完成`],[`Connected`,`已连接`],[`Not installed`,`未安装`],[`Installed`,`已安装`],[`Launching…`,`正在启动…`],[`Launched → `,`已启动 → `],[`Remote`,`远程`],[`Local`,`本地`],[`Add skill`,`添加 Skill`],[`+ Add skill`,`+ 添加 Skill`],[`Choose .zip file`,`选择 .zip 文件`],[`No file selected`,`未选择文件`],[`New MCP server`,`新建 MCP 服务器`],[`+ Add MCP`,`+ 添加 MCP`],[`Description`,`描述`],[`Installed in`,`安装位置`],[`Details`,`详情`],[`Type`,`类型`],[`Path`,`路径`],[`Scope`,`范围`],[`Title`,`标题`],[`Category`,`分类`],[`Inputs`,`输入项`],[`Add input`,`添加输入`],[`Create`,`创建`],[`Install`,`安装`],[`Delete`,`删除`],[`Cancel`,`取消`],[`Close`,`关闭`],[`Active`,`已激活`],[`Save`,`保存`],[`Copy`,`复制`],[`Copied`,`已复制`],[`show`,`显示`],[`hide`,`隐藏`],[`(unset)`,`(未设置)`],[` / page`,` / 页`]];function Vc(){return JSON.stringify([...Bc].sort(([e],[t])=>t.length-e.length)).replaceAll(`<`,`\\u003c`)}function Hc(e,t){return e.replace(`<html lang="en">`,`<html lang="${t}">`).replace(`__BL_CONFIG_UI_LANGUAGE__`,t).replace(`__BL_CONFIG_UI_TRANSLATIONS__`,Vc())}function Uc(e){return Hc(`<!doctype html>
28
+ `)});return{state:n.state,questions:r,model:n.model}}function yc(e){return e.client.url(je(),()=>{if(!e.workspaceId)throw dc(e.localize,{"en-US":`Workspace ID is required for the decision model endpoint.`,"zh-CN":`调用决策模型需要 Workspace ID。`},{"en-US":`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.binName} config set workspace_id <id>. You can also override the endpoint with --base-url.`,"zh-CN":`请传入 --workspace-id、设置环境变量 BAILIAN_WORKSPACE_ID,或执行:${e.binName} config set workspace_id <id>。也可以用 --base-url 覆盖请求地址。`});return Sr(e.workspaceId,e.region)})}function bc(e){return String(typeof e==`number`?Number(e.toFixed(4)):e)}function xc(e){return e?Object.entries(e).map(([e,t])=>`${e}=${bc(t)}`).join(` `):``}function Sc(e){let t=Object.entries(e.probabilities??{});if(t.length===0)return;let[n]=t.reduce((e,t)=>t[1]>e[1]?t:e),r=e.legend?.[n];return r?`${n} ${r}`:n}function Cc(e){if(e.type===`choice`&&e.choice!==void 0)return[`choice=${e.choice}`,e.confidence===void 0?``:`confidence=${bc(e.confidence)}`,xc(e.probabilities)].filter(Boolean).join(` `);if(e.type===`noul`&&e.noul!==void 0)return`noul P(yes)=${bc(e.noul)}`;if(e.type===`score`&&e.score!==void 0){let t=Sc(e);return[`score=${bc(e.score)}`,e.confidence===void 0?``:`confidence=${bc(e.confidence)}`,t?`top=${t}`:``].filter(Boolean).join(` `)}return JSON.stringify(e)}function wc(e){let t=Object.entries(e.answers??{});if(t.length===0)return JSON.stringify(e);let n=Math.max(...t.map(([e])=>e.length));return t.map(([e,t])=>`${e.padEnd(n)} ${jt(t)?Cc(t):JSON.stringify(t)}`).join(`
29
+ `)}function Tc(e){let t=[e.usage?.input_tokens===void 0?``:`input_tokens=${e.usage.input_tokens}`,e.latency_ms===void 0?``:`latency_ms=${e.latency_ms}`].filter(Boolean);return t.length>0?t.join(` `):void 0}var Ec=w({description:{"en-US":`Run the decision model: typed choice / noul / score answers with probabilities`,"zh-CN":`调用决策模型:一次返回 choice / noul / score 判定结果及概率分布`},auth:`apiKey`,usageArgs:`(--state <text> | --state-file <path>) (--questions <json> | --questions-file <path>) | --request-file <path>`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Decision model ID (default: ${a})`,"zh-CN":`决策模型 ID(默认:${a})`}},state:{type:`string`,valueHint:`<text>`,description:{"en-US":`Business state to decide on, sent as a string`,"zh-CN":`待决策的业务状态,按字符串发送`}},stateFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read state from a file (.json is parsed as an object/array, others as text; - for stdin)`,"zh-CN":`从文件读取 state(.json 解析为对象/数组,其他按文本读取;- 表示 stdin)`}},questions:{type:`string`,valueHint:`<json>`,description:{"en-US":`Question table JSON, keyed by question ID`,"zh-CN":`问题表 JSON,键为问题 ID`}},questionsFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read the question table from a JSON file ({...} or {"questions":{...}})`,"zh-CN":`从 JSON 文件读取问题表({...} 或 {"questions":{...}})`}},requestFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Full request JSON {state, questions}; label/target are stripped`,"zh-CN":`完整请求 JSON {state, questions};自动去掉 label/target`}},workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for the endpoint host (or set BAILIAN_WORKSPACE_ID)`,"zh-CN":`用于拼接请求域名的 Workspace ID(也可设置 BAILIAN_WORKSPACE_ID)`}},region:{type:`string`,valueHint:`<region>`,choices:i,description:{"en-US":`Endpoint region: ${i.join(`, `)} (default: ${o})`,"zh-CN":`请求地域:${i.join(`、`)}(默认:${o})`}}},exampleArgs:[{"en-US":`--workspace-id <id> --state "Is this review asking for a refund?" --questions '{"refund":{"type":"noul","instructions":"Asking for a refund?"}}'`,"zh-CN":`--workspace-id <id> --state "这段评论是否在索要退款?" --questions '{"refund":{"type":"noul","instructions":"是否在索要退款?"}}'`},`--state-file ticket.json --questions-file workload.json`,`--request-file sample.json --model decision-model-preview`,`--region ap-southeast-1 --request-file sample.json`,`--request-file sample.json --dry-run`],notes:[{"en-US":`Endpoint: configured --base-url, DASHSCOPE_BASE_URL, or profile base_url takes precedence; otherwise https://{workspace}.{region}.maas.aliyuncs.com/compatible-mode/v1/systemone, with workspace from --workspace-id, BAILIAN_WORKSPACE_ID, then config workspace_id.`,"zh-CN":`请求地址:已配置的 --base-url、DASHSCOPE_BASE_URL 或 Profile base_url 优先;否则为 https://{workspace}.{region}.maas.aliyuncs.com/compatible-mode/v1/systemone,工作空间按 --workspace-id、BAILIAN_WORKSPACE_ID、配置项 workspace_id 解析。`},{"en-US":`Question types: choice (criteria: option → description, 1-255), noul (optional criteria with true/false descriptions), score (criteria: levels from low to high, 2-255; 3-7 recommended). Keep questions per request at 16 or fewer; latency grows roughly linearly.`,"zh-CN":`问题类型:choice(criteria 为选项 → 描述,1-255 项)、noul(可选 criteria,含 true/false 描述)、score(criteria 为从低到高的等级,2-255 级,建议 3-7 级)。建议每次请求不超过 16 个问题,延迟随问题数近线性增长。`},{"en-US":`Output defaults to the full JSON response. Use --output text for one human-readable line per question; the request ID and usage summary are written to stderr.`,"zh-CN":`默认输出完整 JSON 响应。使用 --output text 可按问题逐行输出易读结果;请求 ID 与用量摘要写入 stderr。`},{"en-US":`Training samples can be reused directly: label/target are stripped before sending. Sampling parameters (temperature, max_tokens, ...) are not supported by this API.`,"zh-CN":`训练样本可直接复用:发送前自动去掉 label/target。该接口不支持 temperature、max_tokens 等采样参数。`}],validate:e=>{let t=mc(e);return typeof t==`string`||!t?t:`${t[`en-US`]} / ${t[`zh-CN`]}`},async run(e){let{settings:t,flags:n}=e,r=vc(n,e.localize),i={model:n.model||r.model||a,state:r.state,questions:r.questions},s=yc({workspaceId:n.workspaceId||t.workspaceId,region:n.region??o,binName:e.identity.binName,client:e.client,localize:e.localize}),c=t.outputExplicit?T(t.output):`json`;if(t.dryRun){A({endpoint:s,request:i},c);return}let l=await e.client.requestJson({path:s,method:`POST`,body:i});if(c!==`text`){A(l,c);return}if(k(wc(l)),!t.quiet){let e=Tc(l);e&&process.stderr.write(`${e}\n`)}Lr(l.request_id,t.quiet)}});const Dc=[`language`,`base_url`,`output`,`output_dir`,`timeout`,`watermark`,`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_speech_recognition_model`,`default_omni_model`,`api_key_capabilities`,`workspace_id`],Oc=/* @__PURE__ */ new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]),kc=[`console_site`,`console_region`,`console_switch_agent`,`telemetry`],Ac=[...Dc,...kc],jc={language:[...te],output:[`text`,`json`],console_site:[`domestic`,`international`]},Mc=/* @__PURE__ */ new Set([`telemetry`,`watermark`]),Nc={default_text_model:`qwen3.8-max`,default_image_model:`qwen-image-3.0`,default_video_model:`wan3.0-video`,default_image_to_video_model:`wan3.0-video`,default_reference_to_video_model:`wan3.0-video`,default_speech_model:`cosyvoice-v3-flash`,default_speech_recognition_model:`fun-asr`,default_omni_model:`qwen3.5-omni-plus`},Pc={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:`wan3.0-video`,role:`video/generate · t2v / i2v / r2v default`},{id:`happyhorse-1.1-t2v`,role:`video/generate · text-to-video`},{id:`happyhorse-1.1-i2v`,role:`video/generate · image-to-video`},{id:`happyhorse-1.1-r2v`,role:`video/ref · reference-to-video`}],default_image_to_video_model:[{id:`wan3.0-video`,role:`video/generate default · image-to-video`},{id:`happyhorse-1.1-i2v`,role:`video/generate · image-to-video`}],default_reference_to_video_model:[{id:`wan3.0-video`,role:`video/ref default · reference-to-video`},{id:`happyhorse-1.1-r2v`,role:`video/ref · reference-to-video`}],default_speech_model:[{id:`cosyvoice-v3-flash`,role:`speech/synthesize (TTS) default`},{id:`qwen-audio-3.0-tts-plus`,role:`Token Plan speech/synthesize (TTS)`}],default_speech_recognition_model:[{id:`fun-asr`,role:`speech/recognize (ASR) default`},{id:`qwen-audio-3.0-asr-flash`,role:`Token Plan speech/recognize (ASR)`}],default_omni_model:[{id:`qwen3.5-omni-plus`,role:`omni/chat default`},{id:`qwen3-vl-plus`,role:`vision/describe · multimodal input`}]},Fc={"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-speech-recognition-model":`default_speech_recognition_model`,"default-omni-model":`default_omni_model`,"api-key-capabilities":`api_key_capabilities`,"workspace-id":`workspace_id`};function Ic(e){return Fc[e]||e}function Lc(e,t){let r=Ic(e);if(!Dc.includes(r))throw new n(`Invalid config key "${e}". Valid keys: ${Dc.join(`, `)}`,f.USAGE);if(r===`language`&&!te.includes(t))throw new n(`Invalid language "${t}". Valid values: ${te.join(`, `)}`,f.USAGE);if(r===`output`&&![`text`,`json`].includes(t))throw new n(`Invalid output format "${t}". Valid values: text, json`,f.USAGE);if(r===`timeout`){let e=Number(t);if(isNaN(e)||e<=0)throw new n(`Invalid timeout "${t}". Must be a positive number.`,f.USAGE);return e}if(r===`base_url`)return fn(t);if(r===`watermark`)return pn(t,`watermark`);if(r===`api_key_capabilities`){let e;if(t.trim().startsWith(`[`))try{e=JSON.parse(t)}catch{throw new n(`Invalid API Key capability list "${t}". Use comma-separated values or a JSON array.`,f.USAGE)}else e=t.split(`,`).map(e=>e.trim());if(!Array.isArray(e))throw new n(`Invalid API Key capability list. Expected an array.`,f.USAGE);let r=[];for(let t of e){if(typeof t!=`string`||!kt(t.trim()))throw new n(`Invalid API Key capability "${String(t)}".`,f.USAGE,`Use lowercase alphanumeric segments separated by '.' or '-'.`);let e=t.trim();r.includes(e)||r.push(e)}return r}return t}function Rc(e,t){let r=Ic(e);if(Dc.includes(r))return Lc(e,t);if(r===`console_site`){if(![`domestic`,`international`].includes(t))throw new n(`Invalid console_site "${t}". Valid values: domestic, international`,f.USAGE);return t}if(r===`console_region`)return t;if(r===`console_switch_agent`){let e=Number(t);if(!Number.isFinite(e)||e<=0)throw new n(`Invalid console_switch_agent "${t}". Must be a positive number.`,f.USAGE);return e}if(r===`telemetry`){if(t!==`true`&&t!==`false`)throw new n(`Invalid telemetry "${t}". Valid values: true, false`,f.USAGE);return t===`true`}throw new n(`Invalid config key "${e}". Valid keys: ${Ac.join(`, `)}`,f.USAGE)}var zc=w({description:{"en-US":`Display current configuration`,"zh-CN":`显示当前配置`},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,language:i.language??l,base_url:n.baseUrl,output:t.output,timeout:t.timeout,watermark:t.watermark,config:t.configName??`default`,config_file:r.path};for(let e of Oc)typeof o[e]==`string`&&(o[e]=Zt(o[e]));A(o,a)}}),Bc=w({description:{"en-US":`Set a config value`,"zh-CN":`设置配置项`},auth:`none`,usageArgs:`--key <key> --value <value>`,flags:{key:{type:`string`,valueHint:`<key>`,description:{"en-US":`Config key (language, base_url, output, output_dir, timeout, watermark, api_key, api_key_capabilities, access_token, access_key_id, access_key_secret, security_token, default_*_model, workspace_id)`,"zh-CN":`配置项名称(language、base_url、output、output_dir、timeout、watermark、api_key、api_key_capabilities、access_token、access_key_id、access_key_secret、security_token、default_*_model、workspace_id)`},required:!0},value:{type:`string`,valueHint:`<value>`,description:{"en-US":`Value to set`,"zh-CN":`要设置的值`},required:!0}},exampleArgs:[`--key language --value zh-CN`,`--key output --value json`,`--key timeout --value 600`,`--key watermark --value false`,`--key base_url --value https://dashscope.aliyuncs.com`,`--config company-plan --key api-key-capabilities --value text.chat,image.generate`],async run(e){let{settings:t,flags:n}=e,r=n.key,i=n.value,a=Ic(r),o=Lc(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=Oc.has(a)?Zt(String(o)):o;A({[a]:n,config:t.configName??`default`,config_file:e.configStore.path},s)}}}),Vc=w({description:{"en-US":`List config profiles and show the active profile`,"zh-CN":`列出配置 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?`*`:``}`)}}),Hc=w({description:{"en-US":`Set the active config profile`,"zh-CN":`设置当前激活的配置 Profile`},auth:`none`,usageArgs:`--name <name>`,flags:{name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Existing profile name, or default`,"zh-CN":`已有 Profile 名称,或 default`},required:!0}},exampleArgs:[`--name token-plan`,`--name default`],async run(e){let t=T(e.settings.output);if(e.settings.dryRun){let n=e.configStore.validateActivation(e.flags.name);A({would_activate:n,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)}});const Uc=[[`Config - Alibaba Cloud Model Studio CLI`,`配置 - 阿里云百炼 CLI`],[`The login was not completed in time. Click "Log in" to try again.`,`登录未能及时完成。请点击“登录”重试。`],[`No connected agent can accept tasks yet. Install and connect qwen-code (or another supported agent) first, and make sure its CLI is on your PATH.`,`当前没有可接收任务的已连接 Agent。请先安装并连接 qwen-code(或其他受支持的 Agent),并确保其 CLI 位于 PATH 中。`],[`Complete a few steps to check your local environment and finish first-time setup: sign in to Bailian, connect a local coding agent, and run your first task. Each circle turns from gray to green as you go.`,`完成以下步骤以检查本地环境并完成首次配置:登录百炼、连接本地编程 Agent,并运行第一个任务。完成后,每个圆点会由灰色变为绿色。`],[`Pick a scenario to dispatch a preset task to a connected local coding agent, running in a new terminal. Tasks run in the directory where <code style="font-family:var(--mono)">bl config ui</code> was started.`,`选择一个场景,将预设任务发送给已连接的本地编程 Agent,并在新终端中运行。任务会在启动 <code style="font-family:var(--mono)">bl config ui</code> 的目录中执行。`],[`Pick a scenario to dispatch a preset task to a connected local coding agent, running in a new terminal. Tasks run in the directory where `,`选择一个场景,将预设任务发送给已连接的本地编程 Agent,并在新终端中运行。任务会在启动 `],[` was started.`,` 的目录中执行。`],[`Credentials and default models. The active profile (marked with a star) is used by every bl command. Click a profile to edit its settings.`,`管理凭证和默认模型。所有 bl 命令都会使用带星标的已激活 Profile。点击 Profile 可编辑其设置。`],[`Agent skills discovered across every local agent module (~/.agents/skills plus each agent's skills folder). Installed via <code style="font-family:var(--mono)">npx skills add</code>.`,`展示从本地各 Agent 模块中发现的 Skill(~/.agents/skills 以及各 Agent 的 skills 目录),可通过 <code style="font-family:var(--mono)">npx skills add</code> 安装。`],[`Agent skills discovered across every local agent module (~/.agents/skills plus each agent's skills folder). Installed via `,`展示从本地各 Agent 模块中发现的 Skill(~/.agents/skills 以及各 Agent 的 skills 目录),可通过 `],[`Media that bl writes into the output directory, grouped by type (images, videos, audio, files) and generation time.`,`bl 写入输出目录的媒体文件,按类型(图片、视频、音频、文件)和生成时间展示。`],[`Frameworks bl can configure. "Connected" means the bailian-cli provider is wired into that agent.`,`bl 可以配置的编程 Agent。"已连接"表示该 Agent 已接入 bailian-cli provider。`],[`Model Context Protocol servers declared in your local coding-agent configs.`,`本地编程 Agent 配置中声明的 Model Context Protocol 服务器。`],[`Create a named profile with its own credentials and default models.`,`创建一个拥有独立凭证和默认模型的命名 Profile。`],[`Inputs become fillable fields when dispatching. Reference each one in the prompt as {{key}}.`,`任务发送时,输入项会显示为可填写字段。请在提示词中使用 {{key}} 引用对应输入。`],[`The .zip must contain a SKILL.md at its root or inside a single top-level folder.`,`.zip 根目录或唯一的顶层目录中必须包含 SKILL.md。`],[`The active profile is used by every bl command.`,`所有 bl 命令都会使用已激活的 Profile。`],[`Delete profile "`,`删除 Profile“`],[`"? This permanently removes its credentials and default models.`,`”?这会永久删除其中的凭证和默认模型。`],[`Delete asset "`,`删除资产“`],[`"? This removes the file from disk.`,`”?这会从磁盘中删除该文件。`],[`MCP servers configured in Claude Code, Codex, Qwen Code or OpenCode will appear here.`,`在 Claude Code、Codex、Qwen Code 或 OpenCode 中配置的 MCP 服务器会显示在这里。`],[`Assets from <code>bl image</code>, <code>bl video</code>, <code>bl speech</code> and <code>bl omni</code> will appear here.`,`通过 <code>bl image</code>、<code>bl video</code>、<code>bl speech</code> 和 <code>bl omni</code> 生成的资产会显示在这里。`],[`Remote agents loaded from a URL will appear here.`,`通过 URL 加载的远程 Agent 会显示在这里。`],[`The CLI for this agent was not found on your PATH — install it before launching`,`未在 PATH 中找到该 Agent 的 CLI,请先安装再启动`],[`Connect this agent to bailian-cli before launching`,`请先将该 Agent 连接到 bailian-cli 再启动`],[`Install this agent before launching`,`请先安装该 Agent 再启动`],[`Open a new terminal and start this agent`,`在新终端中启动该 Agent`],[`Open the config file with the system default app`,`使用系统默认应用打开配置文件`],[`Task sent to `,`任务已发送至 `],[`. Check the newly opened terminal window.`,`。请查看新打开的终端窗口。`],[`Please enter a profile name.`,`请输入 Profile 名称。`],[`Only letters, numbers, - and _ are allowed.`,`仅允许使用字母、数字、- 和 _。`],[`"default" is reserved for the top-level profile.`,`“default”保留用于顶层 Profile。`],[`A profile named "`,`名为“`],[`" already exists.`,`”的 Profile 已存在。`],[`Saved, but activation failed: `,`已保存,但激活失败:`],[`Could not read runtime environment info.`,`无法读取运行环境信息。`],[`Runtime Node <code>`,`运行时 Node <code>`],[`</code> · platform <code>`,`</code> · 平台 <code>`],[`Signed in: `,`已登录:`],[`Connected: `,`已连接:`],[`All agents (~/.agents/skills)`,`所有 Agent(~/.agents/skills)`],[`Optional — folder name (defaults to the archive folder)`,`可选 — 文件夹名称(默认使用压缩包中的文件夹名称)`],[`Skill name (optional)`,`Skill 名称(可选)`],[`Skill package (.zip)`,`Skill 包(.zip)`],[`Please choose a .zip file.`,`请选择 .zip 文件。`],[`Install with <code>npx skills add modelstudioai/cli --all -g</code>`,`使用 <code>npx skills add modelstudioai/cli --all -g</code> 安装`],[`Skill "`,`Skill“`],[`MCP server "`,`MCP 服务器“`],[`" installed (`,`”已安装(`],[` files) to `,` 个文件),位置:`],[`" was updated.`,`”已更新。`],[`" was added to `,`”已添加至 `],[`Remove "`,`移除“`],[`" from `,`”(来源:`],[`? This rewrites the source config file.`,`)?此操作会重写来源配置文件。`],[`Could not delete this server.`,`无法删除该服务器。`],[`Delete MCP server?`,`删除 MCP 服务器?`],[`Config must be a JSON object.`,`配置必须是 JSON 对象。`],[`Invalid JSON: `,`无效的 JSON:`],[`Please enter a server name.`,`请输入服务器名称。`],[`No remote agents yet.`,`暂无远程 Agent。`],[`No agents in this category.`,`该分类下暂无 Agent。`],[`No agents match "`,`没有匹配“`],[`bailian-cli is not wired into this agent yet.`,`该 Agent 尚未连接 bailian-cli。`],[`This agent is not installed yet.`,`该 Agent 尚未安装。`],[`No scenarios in this category.`,`该分类下暂无场景。`],[`No scenarios match "`,`没有匹配“`],[`Click to edit this scenario`,`点击编辑此场景`],[`Dispatch this task to a local agent`,`将此任务发送至本地 Agent`],[`No connected agent available`,`没有可用的已连接 Agent`],[`Please fill in: `,`请填写:`],[`Input key "`,`输入键“`],[`" may only use letters, digits, underscore.`,`”只能使用字母、数字和下划线。`],[`Duplicate input key: `,`输入键重复:`],[`Title is required.`,`标题为必填项。`],[`Prompt template is required.`,`提示词模板为必填项。`],[`No assets match "`,`没有匹配“`],[`Toggle sort by generation time`,`切换生成时间排序`],[`↓ Newest first`,`↓ 最新优先`],[`↑ Oldest first`,`↑ 最早优先`],[`View details — `,`查看详情 — `],[`Available `,`可用的 `],[` models · click to use`,` 模型 · 点击使用`],[`Applies to <code>bl video generate</code> only (text/image-to-video). `,`仅适用于 <code>bl video generate</code>(文生视频/图生视频)。`],[`<code>bl video ref</code> (multi-image) and <code>bl video edit</code> keep their own `,`<code>bl video ref</code>(多图)和 <code>bl video edit</code> 仍使用各自的`],[`fixed models — pass <code>--model</code> to override those per run.`,`固定模型;可在每次运行时通过 <code>--model</code> 覆盖。`],[`No skills match "`,`没有匹配“`],[`No MCP servers match "`,`没有匹配“`],[`Install to`,`安装到`],[`Transport / Source`,`传输方式 / 来源`],[`Target agent config`,`目标 Agent 配置`],[`Server name`,`服务器名称`],[`Quick launch`,`快速启动`],[`Config files`,`配置文件`],[`Environment check`,`环境检查`],[`Edit preset scenario`,`编辑预设场景`],[`Edit scenario`,`编辑场景`],[`Save &amp; Activate`,`保存并激活`],[`Are you sure?`,`确认执行此操作吗?`],[`Save failed`,`保存失败`],[`Create failed`,`创建失败`],[`Install failed`,`安装失败`],[`Launch failed`,`启动失败`],[`Dispatch failed`,`发送失败`],[`Delete failed`,`删除失败`],[`Created`,`已创建`],[`Dispatched`,`已发送`],[`Saved`,`已保存`],[`OK`,`确定`],[`Configuration`,`配置`],[`Settings`,`设置`],[`Status`,`状态`],[`Open`,`打开`],[`Remove`,`移除`],[`Show`,`显示`],[`Hide`,`隐藏`],[`All`,`全部`],[`Images`,`图片`],[`Videos`,`视频`],[`Files`,`文件`],[`Image`,`图片`],[`Video`,`视频`],[`Audio`,`音频`],[`File`,`文件`],[` files`,` 个文件`],[`MCPs`,`MCP 服务`],[`Coding`,`编程`],[`Generated`,`生成的`],[`API key`,`API 密钥`],[`Console gateway`,`控制台网关`],[`Account`,`账户`],[`(empty)`,`(空)`],[` (editable)`,`(可编辑)`],[` (missing)`,`(缺失)`],[`default (top-level)`,`default(顶层)`],[`This source is read-only here (its config is TOML). Edit it directly in `,`该来源在此处为只读(配置格式为 TOML)。请直接编辑:`],[`No connected local coding agent detected (e.g. qwen-code). Open the Agents page to install and connect one.`,`未检测到已连接的本地编程 Agent(例如 qwen-code)。请打开 Agent 页面进行安装和连接。`],[`Installed but not wired into bl: `,`已安装但尚未接入 bl:`],[`. Open the Agents page to finish connecting.`,`。请打开 Agent 页面完成连接。`],[`Finish the previous step first (connect a dispatchable agent), then come back to Playground to run your first scenario.`,`请先完成上一步(连接可接收任务的 Agent),再回到 Playground 运行第一个场景。`],[`Go to Playground, pick a scenario and click Run it to complete your first dispatch.`,`前往 Playground,选择一个场景并点击“运行”,完成首次任务发送。`],[`Sign in to the Bailian console to obtain credentials (opens a login page in your browser).`,`登录百炼控制台以获取凭证(将在浏览器中打开登录页面)。`],[`You have dispatched at least one task.`,`你已经成功发送过至少一个任务。`],[`Node 18 or newer is recommended.`,`建议使用 Node.js 18 或更高版本。`],[`Save & Activate`,`保存并激活`],[`Save scenario`,`保存场景`],[`Custom scenario`,`自定义场景`],[`+ Custom scenario`,`+ 自定义场景`],[`New profile`,`新建 Profile`],[`+ New profile`,`+ 新建 Profile`],[`Profile name`,`Profile 名称`],[`Target agent`,`目标 Agent`],[`Task to dispatch`,`要发送的任务`],[`Prompt template`,`提示词模板`],[`One-line description (optional)`,`一句话描述(可选)`],[`Use {{key}} placeholders for inputs`,`使用 {{key}} 作为输入占位符`],[`e.g. Translate docs to English`,`例如:将文档翻译成英文`],[`e.g. Image / Custom`,`例如:图像 / 自定义`],[`e.g. work, intl, test`,`例如:work、intl、test`],[`Search scenarios…`,`搜索场景…`],[`Search skills…`,`搜索 Skill…`],[`Search MCP servers…`,`搜索 MCP 服务器…`],[`Search agents…`,`搜索 Agent…`],[`Search assets…`,`搜索资产…`],[`Installed Skills`,`已安装的 Skill`],[`Coding Agents`,`编程 Agent`],[`Generated Assets`,`生成资产`],[`Get Started`,`开始使用`],[`Quick Start`,`快速开始`],[`Playground`,`Playground`],[`Extensions`,`扩展`],[`Workspace`,`工作区`],[`Skills`,`Skill`],[`Agents`,`Agent`],[`Assets`,`资产`],[`Config`,`配置`],[`Log in`,`登录`],[`Log out`,`退出登录`],[`Copy this URL`,`复制此链接`],[`QR code for this session URL`,`当前会话链接的二维码`],[`Collapse sidebar`,`收起侧边栏`],[`Expand sidebar`,`展开侧边栏`],[`Model Studio CLI home`,`百炼 CLI 首页`],[`Loading…`,`加载中…`],[`Delete profile`,`删除 Profile`],[`Delete asset`,`删除资产`],[`Open failed`,`打开失败`],[`Open locally`,`在本地打开`],[`View details`,`查看详情`],[`Jump backward 5 pages`,`向前跳转 5 页`],[`Jump forward 5 pages`,`向后跳转 5 页`],[`Items per page`,`每页数量`],[`No generated assets yet.`,`暂无生成资产。`],[`No assets in this category.`,`该分类下暂无资产。`],[`No skills installed.`,`尚未安装 Skill。`],[`No local MCP servers found.`,`未发现本地 MCP 服务器。`],[`No coding agents found.`,`未发现编程 Agent。`],[`No scenarios found.`,`未发现场景。`],[`Failed to load: `,`加载失败:`],[`Load failed: `,`加载失败:`],[`Save failed: `,`保存失败:`],[`Create failed: `,`创建失败:`],[`Install failed: `,`安装失败:`],[`Launch failed: `,`启动失败:`],[`Saving…`,`正在保存…`],[`Saved and activated.`,`已保存并激活。`],[`Saved.`,`已保存。`],[`Profile created and saved.`,`Profile 已创建并保存。`],[`Opening browser…`,`正在打开浏览器…`],[`Waiting for login…`,`等待登录…`],[`Signed in…`,`已登录…`],[`Login timed out`,`登录超时`],[`Authenticated`,`已认证`],[`Connect a local agent`,`连接本地 Agent`],[`Run your first task`,`运行第一个任务`],[`Sign in to Bailian`,`登录百炼`],[`Check local environment`,`检查本地环境`],[`Go to Playground`,`前往 Playground`],[`Go to Agents`,`前往 Agent`],[`Run it`,`运行`],[`Done`,`已完成`],[`Connected`,`已连接`],[`Not installed`,`未安装`],[`Installed`,`已安装`],[`Launching…`,`正在启动…`],[`Launched → `,`已启动 → `],[`Remote`,`远程`],[`Local`,`本地`],[`Add skill`,`添加 Skill`],[`+ Add skill`,`+ 添加 Skill`],[`Choose .zip file`,`选择 .zip 文件`],[`No file selected`,`未选择文件`],[`New MCP server`,`新建 MCP 服务器`],[`+ Add MCP`,`+ 添加 MCP`],[`Description`,`描述`],[`Installed in`,`安装位置`],[`Details`,`详情`],[`Type`,`类型`],[`Path`,`路径`],[`Scope`,`范围`],[`Title`,`标题`],[`Category`,`分类`],[`Inputs`,`输入项`],[`Add input`,`添加输入`],[`Create`,`创建`],[`Install`,`安装`],[`Delete`,`删除`],[`Cancel`,`取消`],[`Close`,`关闭`],[`Active`,`已激活`],[`Save`,`保存`],[`Copy`,`复制`],[`Copied`,`已复制`],[`show`,`显示`],[`hide`,`隐藏`],[`(unset)`,`(未设置)`],[` / page`,` / 页`]];function Wc(){return JSON.stringify([...Uc].sort(([e],[t])=>t.length-e.length)).replaceAll(`<`,`\\u003c`)}function Gc(e,t){return e.replace(`<html lang="en">`,`<html lang="${t}">`).replace(`__BL_CONFIG_UI_LANGUAGE__`,t).replace(`__BL_CONFIG_UI_TRANSLATIONS__`,Wc())}function Kc(e){return Gc(`<!doctype html>
30
30
  <html lang="en">
31
31
  <head>
32
32
  <meta charset="utf-8" />
@@ -2714,129 +2714,128 @@ Omni output voices:
2714
2714
  <\/script>
2715
2715
  </body>
2716
2716
  </html>
2717
- `,e)}function Wc(e=Mi()){let t=process.env.PI_CODING_AGENT_DIR;return t?t===`~`?e:t.startsWith(`~/`)||t.startsWith(`~\\`)?N(e,t.slice(2)):t:N(e,`.pi`,`agent`)}function Gc(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]!==`
2718
- `;)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 Kc(e){if(!li(e))return{};try{return JSON.parse(di(e,`utf-8`))}catch{return{}}}function qc(e){if(!li(e))return{};try{return JSON.parse(Gc(di(e,`utf-8`)))}catch{return{}}}function Jc(e,t){ui(gi(e),{recursive:!0});let n=e+`.tmp`;mi(n,JSON.stringify(t,null,2)+`
2719
- `,{mode:384}),fi(n,e)}function Yc(e,t){ui(gi(e),{recursive:!0});let n=e+`.tmp`;mi(n,t,{mode:384}),fi(n,e)}function Xc(e){if(!li(e))return;let t=Math.floor(Date.now()/1e3);si(e,`${e}.bak.${t}`)}function Zc(e){return e.includes(`/apps/anthropic`)}function Qc(e){let t=e.trim().replace(/\/+$/,``);if(Zc(t))return{url:t};if(t.includes(`/compatible-mode`))return{url:t.replace(/\/compatible-mode(?:\/v\d+)?/,`/apps/anthropic`),rewrittenFrom:e.trim()};try{let n=new URL(t),r=n.hostname;if((r.includes(`dashscope`)||r.includes(`maas.aliyuncs.com`)||r.includes(`token-plan`))&&(n.pathname===`/`||n.pathname===``))return{url:`${n.origin}/apps/anthropic`,rewrittenFrom:e.trim()}}catch{}throw new n(`Claude Code requires an Anthropic-compatible base URL, got "${e}".`,f.USAGE,`Use a URL ending in /apps/anthropic (not /compatible-mode/v1). Example: https://dashscope.aliyuncs.com/apps/anthropic`)}function $c(e){let t=e.trim();if(!/^[a-z0-9-]+$/.test(t))throw new n(`Invalid --region "${e}".`,f.USAGE,`Use a Model Studio region id, e.g. cn-beijing or ap-southeast-1.`);return`https://token-plan.${t}.maas.aliyuncs.com/compatible-mode/v1`}const el=[`codex`,`claude-code`,`cursor`,`qoder`,`qoderwork`,`qwenwork`,`qwen-code`,`gemini`,`opencode`,`openclaw`,`deepseek-harness`,`zcode`,`workbuddy`,`pi`],tl=`@deepseek-ai/dsh-mcp-client`,nl=`__dshOtherPatches`,rl=`mcpServers`,il=[`.workbuddy-ai`,`.workbuddy`,`.codebuddy`],al=[`.openclaw`,`.clawdbot`,`.moltbot`];function ol(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function sl(e,t){if(!M(e))return{};try{let n=t(Si(e,`utf8`));if(!ol(n))throw Error(`root value is not an object`);return n}catch(t){throw new n(`Cannot update MCP configuration because ${e} is invalid.`,f.GENERAL,`Fix the existing configuration file and retry; it was not changed.`,{cause:t})}}function cl(e){return sl(e,e=>JSON.parse(Gc(e)))}function ll(e){return sl(e,Ii)}function ul(e,t){let r=e[t];if(r===void 0){let n={};return e[t]=n,n}if(!ol(r))throw new n(`Cannot update MCP configuration because ${t} is not an object.`,f.GENERAL);return r}function dl(e,t){let n=e;for(let e of t)n=ul(n,e);return n}function fl(e,t){let n=e.paths?.(t);return n&&n.length>0?n:[e.path(t)]}function pl(e,t,n){return e?.trim()||N(t,n)}function ml(e,t){return e===void 0||e===`unchanged`?t:t===`updated`||e===`updated`?`updated`:e}function hl(e){return new n(`${e===`codex`?`Codex`:e===`deepseek-harness`?`DeepSeek Harness`:e} does not support SSE MCP servers; use --transport streamable-http.`,f.USAGE)}const gl=[`.qwenworkcn`,`.qwenwork`];function _l(e){return gl.map(t=>N(e,t))}function vl(e){let t=_l(e);for(let e of t){let t=N(e,`mcp.json`);if(M(t))return t}for(let e of t)if(M(e))return N(e,`mcp.json`);return N(t[0],`mcp.json`)}function yl(e){return N(e,`.config`,`opencode`,`opencode.json`)}function bl(e){let t=process.env.OPENCLAW_CONFIG_PATH?.trim();if(t)return t;let n=al.map(t=>N(e,t)).find(e=>M(e));return N(n??N(e,al[0]),`openclaw.json`)}function xl(e){return pl(process.env.DSH_HOME,e,`.dsh`)}function Sl(e){return N(xl(e),`cordis.patch.yml`)}function Cl(e){return N(pl(process.env.ZCODE_HOME,e,`.zcode`),`cli`,`config.json`)}function wl(e){return il.map(t=>N(e,t))}function Tl(e){let t=N(e,`.mcp.json`);return M(t)?t:N(e,`mcp.json`)}function El(e){let t=wl(e).filter(e=>M(e));return(t.length>0?t:[N(e,il[0])]).map(e=>Tl(e))}function Dl(e){return ol(e)&&e.name===tl&&ol(e.config)}function Ol(e){let t=e.config;if(ol(t)&&typeof t.serverName==`string`&&t.serverName!==``)return t.serverName}function kl(e){if(!M(e))return{[nl]:[],[rl]:{}};let t;try{t=Pi.parse(Si(e,`utf8`))}catch(t){throw new n(`Cannot update MCP configuration because ${e} is invalid.`,f.GENERAL,`Fix the existing configuration file and retry; it was not changed.`,{cause:t})}if(t==null)return{[nl]:[],[rl]:{}};if(!Array.isArray(t))throw new n(`Cannot update MCP configuration because ${e} is invalid.`,f.GENERAL,`Fix the existing configuration file and retry; it was not changed.`);let r=[],i={};for(let e of t){if(ol(e)&&Array.isArray(e.insert)){let t=[];for(let n of e.insert){if(Dl(n)){let e=Ol(n);if(e){i[e]=n;continue}}t.push(n)}t.length>0&&r.push({...e,insert:t});continue}if(Dl(e)){let t=Ol(e);if(t){i[t]=e;continue}}r.push(e)}return{[nl]:r,[rl]:i}}function Al(e){let t=Array.isArray(e[nl])?e[nl]:[],n=ol(e[rl])?e[rl]:{},r=[...t],i=Object.values(n);return i.length>0&&r.push({insert:i}),Pi.stringify(r)}function jl(e){let t=e.serverKeys??[`mcpServers`];return{path:e.path,paths:e.paths,installed:e.installed,supports:e.supports??(()=>!0),parse:cl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>dl(e,t),buildEntry:e.buildEntry??(t=>e.typed?{type:t.transport===`sse`?`sse`:`http`,url:t.endpoint,headers:t.headers}:{url:t.endpoint,headers:t.headers})}}const Ml={pi:jl({path:e=>N(Wc(e),`mcp.json`),installed:e=>M(Wc(e)),supports:e=>e===`streamable-http`}),codex:{path:e=>N(process.env.CODEX_HOME||N(e,`.codex`),`config.toml`),installed:e=>M(process.env.CODEX_HOME||N(e,`.codex`))||M(N(process.env.CODEX_HOME||N(e,`.codex`),`config.toml`)),supports:e=>e===`streamable-http`,parse:ll,serialize:e=>`${Li(e)}\n`,getServers:e=>ul(e,`mcp_servers`),buildEntry:e=>({url:e.endpoint,http_headers:e.headers})},"claude-code":{path:e=>N(e,`.claude.json`),installed:e=>M(N(e,`.claude`))||M(N(e,`.claude.json`)),supports:()=>!0,parse:cl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>ul(e,`mcpServers`),buildEntry:e=>({type:e.transport===`sse`?`sse`:`http`,url:e.endpoint,headers:e.headers})},cursor:jl({path:e=>N(e,`.cursor`,`mcp.json`),installed:e=>M(N(e,`.cursor`))||M(N(e,`.cursor`,`mcp.json`))}),qoder:jl({path:e=>N(e,`.qoder`,`mcp.json`),installed:e=>M(N(e,`.qoder`))||M(N(e,`.qoder`,`mcp.json`))}),qoderwork:jl({path:e=>N(e,`.qoderwork`,`mcp.json`),installed:e=>M(N(e,`.qoderwork`))||M(N(e,`.qoderwork`,`mcp.json`))}),qwenwork:jl({path:vl,installed:e=>_l(e).some(e=>M(e)||M(N(e,`mcp.json`))),buildEntry:e=>({type:e.transport===`sse`?`sse`:`streamable-http`,url:e.endpoint,headers:e.headers})}),"qwen-code":{path:e=>N(e,`.qwen`,`settings.json`),installed:e=>M(N(e,`.qwen`)),supports:()=>!0,parse:cl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>ul(e,`mcpServers`),buildEntry:e=>e.transport===`sse`?{url:e.endpoint,headers:e.headers}:{httpUrl:e.endpoint,headers:e.headers}},gemini:{path:e=>N(e,`.gemini`,`settings.json`),installed:e=>M(N(e,`.gemini`)),supports:()=>!0,parse:cl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>ul(e,`mcpServers`),buildEntry:e=>e.transport===`sse`?{url:e.endpoint,headers:e.headers}:{httpUrl:e.endpoint,headers:e.headers}},opencode:jl({path:yl,installed:e=>M(N(e,`.config`,`opencode`))||M(yl(e)),serverKeys:[`mcp`],buildEntry:e=>({type:`remote`,url:e.endpoint,enabled:!0,oauth:!1,headers:e.headers})}),openclaw:jl({path:bl,installed:e=>!!process.env.OPENCLAW_CONFIG_PATH?.trim()||al.some(t=>M(N(e,t)))||M(bl(e)),serverKeys:[`mcp`,`servers`],buildEntry:e=>({url:e.endpoint,transport:e.transport===`sse`?`sse`:`streamable-http`,headers:e.headers})}),"deepseek-harness":{path:Sl,installed:e=>M(xl(e)),supports:e=>e===`streamable-http`,parse:kl,serialize:Al,getServers:e=>ul(e,rl),buildEntry:e=>({id:`mcp-bailian-${e.name}`,name:tl,config:{serverName:e.name,transport:`streamable-http`,url:e.endpoint,headers:e.headers}})},zcode:jl({path:Cl,installed:e=>M(pl(process.env.ZCODE_HOME,e,`.zcode`)),serverKeys:[`mcp`,`servers`],buildEntry:e=>({type:e.transport===`sse`?`sse`:`http`,url:e.endpoint,enabled:!0,headers:e.headers})}),workbuddy:jl({path:e=>El(e)[0]??N(e,il[0],`mcp.json`),paths:El,installed:e=>wl(e).some(e=>M(e)),typed:!0})};function Nl(e){return Array.isArray(e)?`[${e.map(Nl).join(`,`)}]`:ol(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Nl(e[t])}`).join(`,`)}}`:JSON.stringify(e)}function Pl(e){return ei(`sha256`).update(Nl(e)).digest(`hex`)}function Fl(e,t){return`${e}:${t}`}function Il(e){return N(e,`mcp-registrations.json`)}function Ll(e){let t=Il(e);if(!M(t))return{version:1,registrations:{}};let r=cl(t);if(r.version!==1||!ol(r.registrations))throw new n(`Cannot update MCP registrations because ${t} has an unsupported format.`,f.GENERAL);return r}function Rl(e,t,r,i){if(e!==void 0){if(!t)throw new n(`MCP server "${i}" already exists in ${r} and is not managed by bailian-cli.`,f.GENERAL,`Choose another server name or remove the existing entry yourself.`);if(Pl(e)!==t.fingerprint)throw new n(`MCP server "${i}" in ${r} conflicts with the last bailian-cli registration.`,f.GENERAL,`The entry was changed after registration; resolve it manually before retrying.`)}}function zl(e){for(let t of e.reverse())try{t.original===void 0?Ti(t.path):Yc(t.path,t.original)}catch{}}function Bl(e,t,r){let i=[];try{for(let t of e)Xc(t.path),Yc(t.path,t.content),i.push(t);Jc(Il(r),t)}catch(e){throw zl(i),new n(`Failed to update MCP Agent configuration.`,f.GENERAL,void 0,{cause:e})}}function Vl(e,t){return e===`all`?el.filter(e=>Ml[e].installed(t)):[e]}function Hl(e){let t=Ll(e.configDir),n=[],r=[];for(let i of e.agents){let a=Ml[i];if(!a.supports(e.spec.transport))throw hl(i);let o=fl(a,e.home),s=a.path(e.home),c=Fl(i,e.spec.name),l=t.registrations[c],u=a.buildEntry(e.spec),d=Pl(u),f;for(let t of o){let r=a.parse(t),o=a.getServers(r),s=o[e.spec.name];Rl(s,l,i,e.spec.name);let c=s===void 0?`added`:Pl(s)===d?`unchanged`:`updated`;f=ml(f,c),c!==`unchanged`&&(o[e.spec.name]=u,n.push({path:t,original:M(t)?Si(t,`utf8`):void 0,content:a.serialize(r)}))}let p=f??`unchanged`;r.push({agent:i,path:s,status:p}),p!==`unchanged`&&(t.registrations[c]={agent:i,name:e.spec.name,serverCode:e.spec.serverCode,transport:e.spec.transport,endpoint:e.spec.endpoint,path:s,fingerprint:d,cliVersion:e.cliVersion,updatedAt:(/* @__PURE__ */ new Date()).toISOString()})}return n.length>0&&Bl(n,t,e.configDir),r}function Ul(e){let t=Ll(e.configDir),n=[],r=[],i=!1;for(let a of e.agents){let o=Ml[a],s=o.path(e.home),c=Fl(a,e.name),l=t.registrations[c];if(!l){r.push({agent:a,path:s,status:`absent`});continue}let u=!1,d=!1;for(let t of fl(o,e.home)){let r=o.parse(t),i=o.getServers(r),s=i[e.name];s!==void 0&&(d=!0,Rl(s,l,a,e.name),delete i[e.name],u=!0,n.push({path:t,original:Si(t,`utf8`),content:o.serialize(r)}))}delete t.registrations[c],i=!0,r.push({agent:a,path:s,status:d&&u?`removed`:`absent`})}return(n.length>0||i)&&Bl(n,t,e.configDir),r}function Wl(e){try{return Si(e,`utf-8`)}catch{return}}function F(e){let t=Wl(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 I(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}function Gl(e){let t=/^---\s*\n([\s\S]*?)\n---/.exec(e);if(!t)return{};try{return I(Pi.parse(t[1]))??{}}catch{return{}}}function Kl(e,t=500){let n=0,r=e=>{if(n>=t)return;let i;try{i=Ci(e,{withFileTypes:!0})}catch{return}for(let a of i){if(n>=t)return;let i=N(e,a.name);a.isDirectory()?r(i):n+=1}};return r(e),n}function ql(e){return[{source:`global`,dir:N(e,`.agents`,`skills`)},{source:`claude-code`,dir:N(e,`.claude`,`skills`)},{source:`cursor`,dir:N(e,`.cursor`,`skills`)},{source:`qwen-code`,dir:N(e,`.qwen`,`skills`)},{source:`codex`,dir:N(e,`.codex`,`skills`)},{source:`opencode`,dir:N(e,`.config`,`opencode`,`skills`)},{source:`openclaw`,dir:N(e,`.openclaw`,`skills`)},{source:`openclaw`,dir:N(e,`.openclaw`,`workspace`,`skills`)},{source:`hermes`,dir:N(gt(e),`skills`)},{source:`gemini`,dir:N(e,`.gemini`,`skills`)},{source:`antigravity`,dir:N(e,`.gemini`,`antigravity`,`skills`)},{source:`windsurf`,dir:N(e,`.windsurf`,`skills`)},{source:`windsurf`,dir:N(e,`.codeium`,`windsurf`,`skills`)},{source:`qoderwork`,dir:N(e,`.qoderwork`,`skills`)},{source:`workbuddy`,dir:N(e,`.workbuddy`,`skills`)}]}function Jl(e=Mi()){let t=/* @__PURE__ */ new Map;for(let{source:n,dir:r}of ql(e)){let e;try{e=Ci(r,{withFileTypes:!0})}catch{continue}for(let i of e){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let e=N(r,i.name),a=N(e,`SKILL.md`);if(!M(a))continue;let o=t.get(i.name);if(o){o.sources.includes(n)||o.sources.push(n);continue}let s=Gl(Wl(a)??``),c=I(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:Kl(e),path:e,sources:[n],origin:`local`})}}return[...t.values()].sort((e,t)=>e.name.localeCompare(t.name))}function Yl(e,t=Mi()){let n=Jl(t).find(t=>t.id===e);if(!n)return null;let r=Wl(N(n.path,`SKILL.md`))??``;return{...n,content:r}}const Xl=[{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 Zl(e,t){let n=Xl.find(t=>t.source===e);return n?N(t,...n.sub):null}function Ql(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=Ni(p);else throw Error(`Unsupported compression in archive (entry: `+l+`).`);a.push({name:l,data:m})}return a}function $l(e,t,n,r=Mi()){let i=Zl(e,r);if(!i)throw Error(`Unknown skill install target.`);let a=Ql(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=N(i,c),d=P(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=P(N(u,t));(n===d||n.startsWith(d+ji))&&(xi(Oi(n),{recursive:!0}),Ei(n,e.data),f++)}if(f===0)throw Error(`Nothing was extracted from the archive.`);return{installed:c,files:f,dir:u}}function eu(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;if(t){let n=typeof e.type==`string`?e.type.toLowerCase():``,r=typeof e.transport==`string`?e.transport.toLowerCase():``;return n===`sse`||r===`sse`?{transport:`sse`,detail:t}:{transport:`http`,detail:t}}return{transport:`unknown`,detail:``}}function tu(e,t,n,r,i){let a=I(e);if(a)for(let[e,o]of Object.entries(a)){let a=I(o)??{},{transport:s,detail:c}=eu(a);r.push({name:e,source:t,transport:s,detail:c,scope:n,origin:`local`,config:hu(a),editable:i})}}function nu(e=Mi()){let t=[],n=F(N(e,`.claude.json`));if(n){tu(n.mcpServers,`claude-code`,`global`,t,!0);let e=I(n.projects);if(e)for(let[n,r]of Object.entries(e)){let e=I(r);e?.mcpServers&&tu(e.mcpServers,`claude-code`,n,t,!0)}}let r=F(N(e,`.qwen`,`settings.json`));r&&tu(r.mcpServers,`qwen-code`,`global`,t,!0);let i=F(N(e,`.config`,`opencode`,`opencode.json`));i&&tu(i.mcp,`opencode`,`global`,t,!0);let a=F(N(e,`.cursor`,`mcp.json`));a&&tu(a.mcpServers,`cursor`,`global`,t,!0);let o=F(N(e,`.qoder`,`mcp.json`));o&&tu(o.mcpServers,`qoder`,`global`,t,!0);let s=F(N(e,`.qoderwork`,`mcp.json`));s&&tu(s.mcpServers,`qoderwork`,`global`,t,!0);let c=F(vl(e));c&&tu(c.mcpServers,`qwenwork`,`global`,t,!0);let l=F(N(e,`.codeium`,`windsurf`,`mcp_config.json`));l&&tu(l.mcpServers,`windsurf`,`global`,t,!0);let u=F(N(e,`.gemini`,`settings.json`));u&&tu(u.mcpServers,`gemini`,`global`,t,!0);let d=F(N(e,`.openclaw`,`openclaw.json`));d&&tu(I(d.mcp)?.servers??d.mcpServers,`openclaw`,`global`,t,!0);let f=F(N(e,`.zcode`,`cli`,`config.json`));f&&tu(I(f.mcp)?.servers,`zcode`,`global`,t,!0);for(let n of El(e)){let e=F(n);e&&tu(e.mcpServers,`workbuddy`,n,t,!0)}let p=Wl(N(e,`.dsh`,`cordis.patch.yml`));if(p)try{let e=Pi.parse(p),n=Array.isArray(e)?e:[],r={};for(let e of n){let t=I(e)?.insert,n=Array.isArray(t)?t:[e];for(let e of n){let t=I(e),n=t?I(t.config):void 0;t?.name===`@deepseek-ai/dsh-mcp-client`&&typeof n?.serverName==`string`&&(r[n.serverName]=n)}}tu(r,`deepseek-harness`,`global`,t,!1)}catch{}let m=F(ru(e));m&&tu(m.mcpServers,`claude-desktop`,`global`,t,!0);let h=Wl(N(e,`.codex`,`config.toml`));if(h)try{tu(Ii(h).mcp_servers,`codex`,`global`,t,!1)}catch{}return t.sort((e,t)=>e.name.localeCompare(t.name)||e.source.localeCompare(t.source))}function ru(e){return process.platform===`darwin`?N(e,`Library`,`Application Support`,`Claude`,`claude_desktop_config.json`):process.platform===`win32`?N(process.env.APPDATA??N(e,`AppData`,`Roaming`),`Claude`,`claude_desktop_config.json`):N(e,`.config`,`Claude`,`claude_desktop_config.json`)}function iu(e,t,n){return e===`claude-code`?{file:N(n,`.claude.json`),mapKey:`mcpServers`,projectScoped:t!==`global`}:e===`qwen-code`?{file:N(n,`.qwen`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`opencode`?{file:N(n,`.config`,`opencode`,`opencode.json`),mapKey:`mcp`,projectScoped:!1}:e===`cursor`?{file:N(n,`.cursor`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`windsurf`?{file:N(n,`.codeium`,`windsurf`,`mcp_config.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`gemini`?{file:N(n,`.gemini`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qoder`?{file:N(n,`.qoder`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qoderwork`?{file:N(n,`.qoderwork`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qwenwork`?{file:vl(n),mapKey:`mcpServers`,projectScoped:!1}:e===`openclaw`?{file:N(n,`.openclaw`,`openclaw.json`),mapKey:`servers`,parentKey:`mcp`,projectScoped:!1}:e===`zcode`?{file:N(n,`.zcode`,`cli`,`config.json`),mapKey:`servers`,parentKey:`mcp`,projectScoped:!1}:e===`workbuddy`?{file:El(n)[0]??N(n,`.workbuddy-ai`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`claude-desktop`?{file:ru(n),mapKey:`mcpServers`,projectScoped:!1}:null}function au(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)=>au(e,n[t]))}let n=I(e);if(n){let e=I(t)??{},r={};for(let[t,i]of Object.entries(n))r[t]=au(i,e[t]);return r}return e}function ou(e,t,n){let r=e;if(t.projectScoped){let t=I(e.projects);r=t?I(t[n]):void 0}if(r)return t.parentKey?I(r[t.parentKey]):r}function su(e,t,n){let r=e;if(t.projectScoped){let t=I(e.projects)??{};e.projects=t;let i=I(t[n])??{};t[n]=i,r=i}if(t.parentKey){let e=I(r[t.parentKey])??{};return r[t.parentKey]=e,e}return r}function cu(e,t,n,r,i=Mi()){let a=iu(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=I(r);if(!s)throw Error(`Config must be a JSON object.`);let c=F(a.file)??{},l=su(c,a,t),u=I(l[a.mapKey])??{};l[a.mapKey]=u,u[o]=au(s,I(u[o])),xi(Oi(a.file),{recursive:!0}),Ei(a.file,JSON.stringify(c,null,2)+`
2720
- `,`utf-8`)}function lu(e,t,n,r=Mi()){let i=iu(e,t,r);if(!i)throw Error(`This MCP source is read-only and cannot be edited here.`);let a=F(i.file);if(!a)throw Error(`Config file not found.`);let o=ou(a,i,t),s=o?I(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],Ei(i.file,JSON.stringify(a,null,2)+`
2721
- `,`utf-8`)}const uu=[{id:`claude-code`,label:`Claude Code`,paths:e=>[N(process.env.CLAUDE_CONFIG_DIR||N(e,`.claude`),`settings.json`),N(e,`.claude.json`)],detect:e=>{let t=process.env.CLAUDE_CONFIG_DIR||N(e,`.claude`),n=I(F(N(t,`settings.json`))?.env),r=n&&typeof n.ANTHROPIC_BASE_URL==`string`?n.ANTHROPIC_BASE_URL:void 0,i=n&&typeof n.ANTHROPIC_MODEL==`string`?n.ANTHROPIC_MODEL:void 0;return{configured:!!r,model:i}}},{id:`qwen-code`,label:`Qwen Code`,paths:e=>[N(e,`.qwen`,`settings.json`)],detect:e=>{let t=F(N(e,`.qwen`,`settings.json`)),n=I(t?.modelProviders),r=n?Object.values(n).some(e=>Array.isArray(e)&&e.some(e=>{let t=I(e)?.name;return typeof t==`string`&&(t===`bailian-cli`||t.startsWith(`[Bailian]`))})):!1,i=I(t?.model);return{configured:r,model:i&&typeof i.name==`string`?i.name:void 0}}},{id:`opencode`,label:`OpenCode`,paths:e=>[N(e,`.config`,`opencode`,`opencode.json`)],detect:e=>{let t=I(I(F(N(e,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),n=I(t?.models);return{configured:!!t,model:n?Object.keys(n)[0]:void 0}}},{id:`openclaw`,label:`OpenClaw`,paths:e=>[N(e,`.openclaw`,`openclaw.json`)],detect:e=>{let t=I(I(I(F(N(e,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]),n=I((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=>[N(gt(e),`config.yaml`)],detect:e=>{let t=Wl(N(gt(e),`config.yaml`));if(!t)return{configured:!1};let n;try{n=I(Pi.parse(t))}catch{return{configured:!1}}let r=(Array.isArray(n?.custom_providers)?n.custom_providers:[]).some(e=>I(e)?.name===`bailian-cli`),i=I(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=>[N(e,`.codex`,`config.toml`),N(e,`.codex`,`auth.json`)],detect:e=>{let t=Wl(N(e,`.codex`,`config.toml`));if(!t)return{configured:!1};let n={};try{n=Ii(t)}catch{return{configured:!1}}return{configured:!!I(n.model_providers)?.[`bailian-cli`],model:typeof n.model==`string`?n.model:void 0}}}];function du(e=Mi()){return uu.map(t=>{let n=t.paths(e),r=n.some(e=>M(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 L(e,t,n,r=!1){typeof n==`string`&&n.trim()&&e.push({label:t,value:n.trim(),secret:r})}function fu(e,t){let n=[];if(e===`claude-code`){let e=I(F(N(t,`.claude`,`settings.json`))?.env);L(n,`Model`,e?.ANTHROPIC_MODEL),L(n,`Base URL`,e?.ANTHROPIC_BASE_URL),L(n,`Auth Token`,e?.ANTHROPIC_AUTH_TOKEN,!0)}else if(e===`qwen-code`){let e=F(N(t,`.qwen`,`settings.json`)),r=I(e?.model),i=I(I(e?.security)?.auth),a=I(e?.env);L(n,`Model`,r?.name),L(n,`Base URL`,i?.baseUrl??r?.baseUrl),L(n,`Protocol`,i?.selectedType),L(n,`API Key`,i?.apiKey??a?.BAILIAN_CLI_API_KEY,!0)}else if(e===`opencode`){let e=I(I(F(N(t,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),r=I(e?.options),i=I(e?.models);L(n,`Model`,i?Object.keys(i)[0]:void 0),L(n,`Base URL`,r?.baseURL),L(n,`Provider`,e?.npm),L(n,`API Key`,r?.apiKey,!0)}else if(e===`openclaw`){let e=I(I(I(F(N(t,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]);L(n,`Model`,I((Array.isArray(e?.models)?e.models:[])[0])?.id),L(n,`Base URL`,e?.baseUrl),L(n,`API`,e?.api),L(n,`API Key`,e?.apiKey,!0)}else if(e===`hermes`){let e=Wl(N(gt(t),`config.yaml`)),r;if(e)try{r=I(Pi.parse(e))}catch{r=void 0}let i=I((Array.isArray(r?.custom_providers)?r.custom_providers:[]).find(e=>I(e)?.name===`bailian-cli`));L(n,`Model`,I((Array.isArray(i?.models)?i.models:[])[0])?.id??I(r?.model)?.default),L(n,`Base URL`,i?.base_url),L(n,`API Mode`,i?.api_mode),L(n,`API Key`,i?.api_key,!0)}else if(e===`codex`){let e=Wl(N(t,`.codex`,`config.toml`)),r={};if(e)try{r=Ii(e)}catch{r={}}let i=I(I(r.model_providers)?.[`bailian-cli`]),a=F(N(t,`.codex`,`auth.json`));L(n,`Model`,r.model),L(n,`Base URL`,i?.base_url),L(n,`Wire API`,i?.wire_api),L(n,`API Key`,a?.OPENAI_API_KEY,!0)}return n}function pu(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 mu=/key|token|secret|password|passwd|auth|credential/i;function hu(e,t=``){if(typeof e==`string`)return t&&mu.test(t)&&e.trim()?pu(e):e;if(Array.isArray(e))return e.map(e=>hu(e));let n=I(e);if(n){let e={};for(let[t,r]of Object.entries(n))e[t]=hu(r,t);return e}return e}function gu(e){return e.endsWith(`.json`)?`json`:e.endsWith(`.yaml`)||e.endsWith(`.yml`)?`yaml`:e.endsWith(`.toml`)?`toml`:`text`}function _u(e,t=Mi()){let n=uu.find(t=>t.id===e);if(!n)return null;let r=n.paths(t),i=r.some(e=>M(e)),{configured:a,model:o}=i?n.detect(t):{configured:!1,model:void 0},s=i?fu(e,t).map(e=>e.secret?{...e,raw:e.value,value:pu(e.value)}:e):[],c=r.map(e=>({path:e,exists:M(e)})),l=i?r.filter(e=>M(e)).map(e=>({path:e,lang:gu(e),text:Wl(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 vu={"claude-code":`claude`,"qwen-code":`qwen`,opencode:`opencode`,openclaw:`openclaw`,hermes:`hermes`,codex:`codex`};function yu(e){return Object.prototype.hasOwnProperty.call(vu,e)?vu[e]:void 0}const bu={"qwen-code":e=>[`-i`,e],"claude-code":e=>[e],codex:e=>[e]};function xu(e){return Object.prototype.hasOwnProperty.call(bu,e)}function Su(e){let t=process.platform===`win32`?`where`:`which`;return new Promise(n=>{ai(t,[e],{windowsHide:!0},e=>n(!e))})}function Cu(e){let t=yu(e);return t?Su(t):Promise.resolve(!1)}function wu(e){return`'${e.replace(/'/g,`'\\''`)}'`}function Tu(e,t){let n=process.platform;return new Promise((r,i)=>{if(n===`darwin`){let n=[`-e`,`tell application "Terminal" to do script "${`cd ${wu(t)} && ${e}`.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`,`-e`,`tell application "Terminal" to activate`];ai(`osascript`,n,{windowsHide:!0},e=>e?i(e):r());return}if(n===`win32`){let n=[`/c`,`start`,``,`cmd`,`/k`,`cd /d ${t} && ${e}`];ai(`cmd`,n,{windowsHide:!0},e=>e?i(e):r());return}let a=`cd ${wu(t)} && ${e}; exec $SHELL`;ai(`x-terminal-emulator`,[`-e`,`bash`,`-lc`,a],{windowsHide:!0},e=>e?i(/* @__PURE__ */ Error(`No supported terminal emulator was found`)):r())})}async function Eu(e,t=process.cwd(),n){let r=yu(e);if(!r)throw Error(`Unknown agent: ${e}`);if(!await Su(r))throw Error(`\`${r}\` was not found on your PATH — install ${e} first.`);let i=r,a=(n??``).trim();if(a){let t=bu[e];if(!t)throw Error(`${e} does not support dispatching a task prompt.`);i=[r,...t(a).map(wu)].join(` `)}return await Tu(i,t),{launched:!0,command:i}}const Du=[{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,包含:项目简介、安装步骤、使用示例、目录结构说明。请先阅读现有代码与配置再撰写,内容必须与实际实现一致。`}],Ou={"image-generate":{title:`Text to image`,description:`Generate a sample image and save it to the output directory.`,category:`Image`,prompt:"Use bl's image generation capability (such as `bl image generate`) to create a sample image: a corgi holding an umbrella in the rain, watercolor style, with soft lighting. Save it to the output directory and tell me the file path."},"image-describe":{title:`Image understanding`,description:`Pick an image from the output directory and describe its content and style.`,category:`Image`,prompt:`Pick an image from the output directory (output/images by default). Describe its subject, composition, colors, and style in detail, then suggest suitable use cases. If the directory is empty, say so.`},"image-alt-batch":{title:`Batch alt text`,description:`Generate accessible alt text for images in the output directory.`,category:`Image`,prompt:`Scan all images in the output directory (output/images by default) and write concise, accurate accessibility alt text for each one. Summarize the results in a File name -> Alt text table. If the directory is empty, say so.`},"image-to-code":{title:`Screenshot to code`,description:`Recreate a UI screenshot from the output directory with HTML and CSS.`,category:`Image`,prompt:`Find a UI screenshot in the output directory (output/images by default) and recreate its layout, spacing, and colors as closely as possible with HTML and CSS. Save it as a single file that opens directly in a browser and briefly explain your approach. If no screenshot is available, say so.`},"speech-generate":{title:`Text to speech`,description:`Turn a sample sentence into natural speech.`,category:`Audio`,prompt:"Use bl's speech synthesis capability (such as a `bl speech` command) to turn this sentence into natural speech: Welcome to Alibaba Cloud Model Studio CLI, making multimodal creation easier. Save the audio to the output directory and tell me the file path."},"audio-summarize":{title:`Transcribe and summarize audio`,description:`Transcribe an audio file from the output directory and summarize its key points.`,category:`Audio`,prompt:`Find an audio file in the output directory (output/speech by default), transcribe it, provide the full transcript, and then summarize the key points as a list. If the directory is empty or transcription is unavailable, explain that and try to complete the task with the capabilities available.`},"video-generate":{title:`Text to video`,description:`Generate a sample short video.`,category:`Video`,prompt:"Use bl's video generation capability (such as `bl video generate`) to create a sample short video: a teenager running along the beach at sunset, cinematic, in slow motion. Save it to the output directory and tell me the file path."},"video-storyboard":{title:`Video storyboard`,description:`Create a storyboard suitable for text-to-video generation.`,category:`Video`,prompt:`Create a storyboard for a 15-30 second short video themed The first cup of coffee in the city at dawn. For each shot, provide the visual description, duration, subtitles or narration, and an English prompt ready for text-to-video generation.`},"media-prompt-craft":{title:`Multimodal prompts`,description:`Expand a sample idea into image, video, and speech prompts.`,category:`Multimodal`,prompt:`Expand the idea A night market in a futuristic cyber city into three high-quality generation prompts: 1) text to image, 2) text to video, and 3) speech style. Provide each prompt in both Chinese and English, with brief parameter recommendations.`},"image-story-narration":{title:`Image narration`,description:`Write narration for an image in the output directory.`,category:`Multimodal`,prompt:`Pick an image from the output directory (output/images by default) and write an engaging English narration of about 60 seconds. Then provide a plain-text version ready for speech synthesis. If the directory is empty, say so.`},"summarize-project":{title:`Summarize this project`,description:`Read the current directory and summarize its architecture, stack, and main modules.`,category:`Code`,prompt:`Inspect the project structure and key source files in the current working directory, then concisely summarize: 1) what it does, 2) its technology stack, 3) its main modules and their responsibilities, and 4) notable design choices. Inspect the code before drawing conclusions; do not guess.`},"write-tests":{title:`Add tests for a core module`,description:`Choose an under-tested core module and add unit tests.`,category:`Code`,prompt:`Choose a core module in the current project that has no tests or weak coverage. Add comprehensive unit tests for its main branches and edge cases, following the project's existing test framework and style. Read the relevant files and dependencies before writing tests.`},"code-review":{title:`Code review`,description:`Review core project code and identify concrete improvements.`,category:`Code`,prompt:`Review the current project's core source code for potential bugs, security risks, performance issues, and maintainability problems. Give specific, actionable recommendations ordered by severity. Inspect the project structure and select the key files before reviewing them.`},"explain-code":{title:`Explain core code`,description:`Choose an entry point or core module and explain how it works.`,category:`Code`,prompt:`Choose the current project's entry point or a core module and explain its responsibilities, key execution flow, and dependencies. Use clear English and include the call relationships when useful.`},"generate-readme":{title:`Generate README`,description:`Generate a clear README.md that matches the implementation.`,category:`Documentation`,prompt:`Generate a clear README.md for the project in the current working directory. Include an overview, installation steps, usage examples, and a directory structure guide. Read the existing source code and configuration first; the content must match the actual implementation.`}};function ku(e){return e===`zh-CN`?Du.map(e=>({...e})):Du.map(e=>({...e,...Ou[e.id]}))}function Au(e,t){return ku(t).find(t=>t.id===e)}function ju(e,t){return e.prompt.replace(/\{\{(\w+)\}\}/g,(e,n)=>{let r=t[n];return typeof r==`string`?r.trim():``})}const Mu=/* @__PURE__ */ new Uint8Array(512),Nu=/* @__PURE__ */ new Uint8Array(256);(()=>{let e=1;for(let t=0;t<255;t++)Mu[t]=e,Nu[e]=t,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)Mu[e]=Mu[e-255]})();function Pu(e,t){return e===0||t===0?0:Mu[Nu[e]+Nu[t]]}function Fu(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]^=Pu(t[r],Mu[n]);t=e}return t.map(e=>Nu[e])}function Iu(e,t){let n=Fu(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=Nu[e];for(let e=0;e<n.length;e++)r[t+e]^=Mu[(n[e]+i)%255]}}return Array.from(r.slice(e.length))}const Lu=[[19,7],[34,10],[55,15],[80,20],[108,26]];function Ru(e){let t=12+e*8;for(let e=0;e<Lu.length;e++)if(Lu[e][0]*8>=t)return e+1;throw Error(`qr: data too large for supported versions (max 108 bytes)`)}function zu(e,t){let[n]=Lu[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(Iu(o,Lu[t-1][1]))}function Bu(e){return{size:e,mod:new Uint8Array(e*e),fn:new Uint8Array(e*e)}}function Vu(e,t,n,r){e.mod[t*e.size+n]=r,e.fn[t*e.size+n]=1}function Hu(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||Vu(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 Uu(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));Vu(e,t+r,n+i,a===1?0:1)}}function Wu(e,t){let n=e.size;for(let t=0;t<n;t++)Vu(e,6,t,+(t%2==0)),Vu(e,t,6,+(t%2==0));if(Hu(e,0,0),Hu(e,0,n-7),Hu(e,n-7,0),t>=2){let t=n-7;Uu(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;Vu(e,n-8,8,1)}function Gu(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 Ku=[(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 qu(e,t){let n=Ku[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 Ju(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 Yu(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 Xu(e,t){let n=e.size,r=Yu(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 Zu(e){let t=new TextEncoder().encode(e),n=Ru(t.length),r=zu(t,n),i=Bu(17+4*n);Wu(i,n),Gu(i,r);let a=0,o=1/0;for(let e=0;e<8;e++){qu(i,e),Xu(i,e);let t=Ju(i);t<o&&(o=t,a=e),qu(i,e)}qu(i,a),Xu(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 Qu(e){let t=Zu(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 $u(e){let{identity:t,settings:n,authStore:r,localize:i}=e;return{status(){let e=r.describe(),t={apiKey:!!e.apiKey,console:!!e.console,openapi:!!e.openapi},n;e.console?n=Qt(e.console.token):e.apiKey?n=Qt(e.apiKey.token):e.openapi&&(n=Qt(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=ns(r.describe().console?.site),a=!!r.stored().apiKey;_s(e,{identity:t,settings:n,authStore:r,localize:i},{needApiKey:!a}).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 ed={".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`},td={".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 nd(e=Mi()){return N(e,`bailian-output`)}function rd(e){return ed[e.toLowerCase()]??`other`}function id(e){return td[e.toLowerCase()]??`application/octet-stream`}function ad(e,t,n){let r;try{r=Ci(e,{withFileTypes:!0})}catch{return}for(let i of r){let r=N(e,i.name);i.isDirectory()?t>0&&ad(r,t-1,n):(i.isFile()||i.isSymbolicLink())&&n.push(r)}}function od(e=nd()){let t=[];if(!M(e))return{base:e,assets:t};let n=[];ad(e,8,n);for(let r of n){let n;try{n=wi(r)}catch{continue}if(!n.isFile())continue;let i=Ai(e,r),a=i.split(ji),o=a.length>1?a[0]:`other`,s=ki(r);t.push({name:r.split(ji).pop()??r,category:o,kind:rd(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 sd(e,t){if(typeof t!=`string`||t.length===0)return null;let n=P(e),r=P(n,t);return r!==n&&!r.startsWith(n+ji)?null:r}const cd={port:{type:`number`,valueHint:`<port>`,description:{"en-US":`Port to listen on (default: random free port)`,"zh-CN":`监听端口(默认:随机可用端口)`}},noOpen:{type:`switch`,description:{"en-US":`Do not open the browser automatically`,"zh-CN":`不自动打开浏览器`}}};function ld(e){return e instanceof n||e instanceof Error?e.message:String(e)}function R(e,t,n){e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify(n))}function ud(e){return e.read().language??l}function dd(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,t=>{if(r+=t.length,r>1048576){n(/* @__PURE__ */ Error(`payload too large`)),e.destroy();return}i.push(t)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function fd(e,t){return new Promise((n,r)=>{let i=0,a=[];e.on(`data`,n=>{if(i+=n.length,i>t){r(/* @__PURE__ */ Error(`payload too large`)),e.destroy();return}a.push(n)}),e.on(`end`,()=>n(Buffer.concat(a))),e.on(`error`,r)})}function pd(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&ri(n,r)}function md(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):Array.isArray(r)&&(e=JSON.stringify(r)),e!==``&&(t[Nc(n)]=Fc(n,e))}return t}function hd(e,t){let n=new Set(Dc),r={};for(let[t,i]of Object.entries(e))n.has(t)||(r[t]=i);return{...r,...t}}function gd(e,t,n=nd(),r){let i=null,a=()=>i===null?ud(t):Cn(i==="default"?void 0:i).language??l;return ii.createServer(async(o,s)=>{try{let c=(o.headers.host||``).split(`:`)[0];if(c!==`127.0.0.1`&&c!==`localhost`){s.writeHead(403,{"Content-Type":`text/plain; charset=utf-8`}),s.end(`forbidden host
2722
- `);return}let l=new URL(o.url??`/`,`http://127.0.0.1`);if(!pd(l.searchParams.get(`token`),e)){s.writeHead(401,{"Content-Type":`text/plain; charset=utf-8`}),s.end(`unauthorized
2723
- `);return}let u=o.method??`GET`,d=l.pathname;if(d===`/`&&u===`GET`){s.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'`}),s.end(Uc(a()));return}if(d===`/api/qr`&&u===`GET`){let e=(l.searchParams.get(`data`)??``).slice(0,512);if(!e){R(s,400,{error:`missing data`});return}try{let t=Qu(e);s.writeHead(200,{"Content-Type":`image/svg+xml; charset=utf-8`,"Cache-Control":`no-store`}),s.end(t)}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/config`&&u===`GET`){let e=t.profiles();R(s,200,{configFile:t.path,keys:Dc,secretKeys:[...Tc],enums:Oc,booleanKeys:[...kc],fieldDefaults:{...Ac,base_url:b.cn,output_dir:nd(),timeout:`300`},modelCatalog:jc,activeProfile:e.active,default:e.default,named:e.named});return}if(d===`/api/skills`&&u===`GET`){R(s,200,{skills:Jl()});return}if(d===`/api/skill`&&u===`GET`){let e=Yl(l.searchParams.get(`id`)??``);if(!e){R(s,404,{error:`not found`});return}R(s,200,e);return}if(d===`/api/skill/install`&&u===`POST`){let e=l.searchParams.get(`source`)??``,t=l.searchParams.get(`name`)??``;try{R(s,200,$l(e,await fd(o,25165824),t))}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/mcp`&&u===`GET`){R(s,200,{servers:nu()});return}if(d===`/api/mcp`&&u===`POST`){let e=await dd(o),t;try{t=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let n=t,r=typeof n.source==`string`?n.source:``,i=typeof n.scope==`string`&&n.scope?n.scope:`global`,a=typeof n.name==`string`?n.name:``;try{cu(r,i,a,n.config),R(s,200,{saved:a.trim()})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/mcp`&&u===`DELETE`){let e=l.searchParams.get(`source`)??``,t=l.searchParams.get(`scope`)||`global`,n=l.searchParams.get(`name`)??``;try{lu(e,t,n),R(s,200,{deleted:n})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/health`&&u===`GET`){let e=Number(process.versions.node.split(`.`)[0]);R(s,200,{node:process.version,nodeOk:Number.isFinite(e)&&e>=18,platform:process.platform,cwd:process.cwd()});return}if(d===`/api/agents`&&u===`GET`){let e=du(),t=await Promise.all(e.map(e=>Cu(e.id)));R(s,200,{agents:e.map((e,n)=>({...e,launchable:t[n],dispatchable:t[n]&&xu(e.id)}))});return}if(d===`/api/agent`&&u===`GET`){let e=_u(l.searchParams.get(`id`)??``);if(!e){R(s,404,{error:`not found`});return}R(s,200,e);return}if(d===`/api/agent/open`&&u===`POST`){let e=_u(l.searchParams.get(`id`)??``),t=l.searchParams.get(`path`)??``,n=e?.settings.some(e=>e.path===t)??!1;if(!e||!n||!M(t)){R(s,404,{error:`not found`});return}try{await Zo(t),R(s,200,{opened:t})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/scenarios`&&u===`GET`){let e=du(),t=await Promise.all(e.map(e=>Cu(e.id))),n=e.map((e,n)=>({id:e.id,label:e.label,dispatchable:t[n]&&xu(e.id)})).filter(e=>e.dispatchable);R(s,200,{scenarios:ku(a()),agents:n});return}if(d===`/api/auth/status`&&u===`GET`){R(s,200,r?r.status():{authenticated:!1,methods:{apiKey:!1,console:!1,openapi:!1},primary:null});return}if(d===`/api/auth/login`&&u===`POST`){if(!r){R(s,400,{error:`login unavailable`});return}r.startConsoleLogin(),R(s,200,{started:!0});return}if(d===`/api/auth/logout`&&u===`POST`){if(!r){R(s,400,{error:`logout unavailable`});return}try{R(s,200,{loggedOut:await r.logout()})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/assets`&&u===`GET`){R(s,200,od(n));return}if(d===`/api/asset/file`&&u===`GET`){let e=sd(n,l.searchParams.get(`path`)??``),t=e&&M(e)?wi(e):null;if(!e||!t||!t.isFile()){R(s,404,{error:`not found`});return}s.writeHead(200,{"Content-Type":id(ki(e)),"Content-Length":t.size,"Cache-Control":`no-store`});let r=yi(e);r.on(`error`,()=>{s.headersSent||s.writeHead(500),s.end()}),r.pipe(s);return}if(d===`/api/asset`&&u===`DELETE`){let e=l.searchParams.get(`path`)??``,t=sd(n,e);if(!t||!M(t)||!wi(t).isFile()){R(s,404,{error:`not found`});return}try{Ti(t),R(s,200,{deleted:e})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/asset/open`&&u===`POST`){let e=l.searchParams.get(`path`)??``,t=sd(n,e);if(!t||!M(t)||!wi(t).isFile()){R(s,404,{error:`not found`});return}try{await Zo(t),R(s,200,{opened:e})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/agent/launch`&&u===`POST`){try{R(s,200,await Eu(l.searchParams.get(`id`)??``))}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/agent/dispatch`&&u===`POST`){let e=await dd(o),t;try{t=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let n=t,r=typeof n.agent==`string`?n.agent:``;if(!xu(r)){R(s,400,{error:`agent cannot be dispatched a prompt`});return}let i,c=n.custom;if(c&&typeof c==`object`&&!Array.isArray(c)){let e=c,t=typeof e.prompt==`string`?e.prompt.trim():``;if(!t){R(s,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})}}}i={id:`custom`,title:typeof e.title==`string`&&e.title.trim()?e.title.trim():`Custom`,description:``,category:`自定义`,prompt:t,inputs:n}}else i=typeof n.scenario==`string`?Au(n.scenario,a()):void 0;if(!i){R(s,400,{error:`unknown scenario`});return}let l={};if(n.values&&typeof n.values==`object`&&!Array.isArray(n.values))for(let[e,t]of Object.entries(n.values))typeof t==`string`&&(l[e]=t);for(let e of i.inputs??[])if(!l[e.key]||!l[e.key].trim()){R(s,400,{error:`Missing input: ${e.label}`});return}let u=ju(i,l);try{let e=await Eu(r,process.cwd(),u);R(s,200,{launched:!0,agent:r,scenario:i.id,command:e.command})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/active`&&u===`POST`){let e=await dd(o),n;try{n=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let r=n;try{let e=await t.activate(r.name);i=e,R(s,200,{activeProfile:e,uiLanguage:a()})}catch(e){R(s,400,{error:ld(e)})}return}if(d===`/api/profile`&&u===`POST`){let e=await dd(o),t;try{t=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let n=t;if(!n.data||typeof n.data!=`object`||Array.isArray(n.data)){R(s,400,{error:`missing or invalid 'data'`});return}let r,i;try{r=ln(n.name),i=md(n.data)}catch(e){R(s,400,{error:ld(e)});return}let c=hd(Cn(r),i);await br(c,r),R(s,200,{saved:c,uiLanguage:a()});return}if(d===`/api/profile`&&u===`DELETE`){try{R(s,200,{deleted:await Fe(l.searchParams.get(`name`)??void 0),activeProfile:t.profiles().active})}catch(e){R(s,400,{error:ld(e)})}return}s.writeHead(404,{"Content-Type":`text/plain; charset=utf-8`}),s.end(`not found
2724
- `)}catch(e){if(console.error(`[config ui] request failed:`,e),s.headersSent){s.end();return}R(s,500,{error:ld(e)})}})}var _d=w({description:{"en-US":`Open a local web UI to manage config profiles`,"zh-CN":`打开用于管理配置 Profile 的本地 Web UI`},auth:`none`,usageArgs:`[--port <port>] [--no-open]`,flags:cd,exampleArgs:[``,`--port 8787`,`--no-open`],async run(e){let{settings:t,flags:r}=e,i=T(t.output);if(t.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=ti(16).toString(`hex`),o=t.outputDir||nd(),s=gd(a,e.configStore,o,$u(e)),c;try{c=await Jo(s,r.port??0)}catch(e){throw new n(`Could not bind to 127.0.0.1 (no free port or permission denied): ${ld(e)}`,f.USAGE)}let l=`http://127.0.0.1:${c}/?token=${a}`;if(!r.noOpen)try{await Qo(l),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 ${l}`),k(`Note: credentials are shown in cleartext in the browser (localhost only).`),k(`Press Ctrl+C to stop.`),await new Promise(e=>{let t=()=>s.close(()=>e());process.once(`SIGINT`,t),process.once(`SIGTERM`,t),s.once(`close`,()=>e())})}});function vd(e,t,n){let r=e[t];(r===void 0||r.trim()===``)&&(e[t]=n)}var yd={label:`Claude Code`,write({baseUrl:e,apiKey:t,model:n}){let r=process.env.CLAUDE_CONFIG_DIR||vi(Ri(),`.claude`),i=vi(r,`settings.json`),a=vi(Ri(),`.claude.json`),o=[],s=Qc(e);s.rewrittenFrom&&o.push(`Rewrote base URL for Claude Code: "${s.rewrittenFrom}" → "${s.url}" (Claude Code needs /apps/anthropic, not OpenAI compatible-mode).`),Xc(i);let c=Kc(i),l=c.env??{};l.ANTHROPIC_BASE_URL=s.url,l.ANTHROPIC_AUTH_TOKEN=t,delete l.ANTHROPIC_API_KEY,l.ANTHROPIC_MODEL=n,vd(l,`ANTHROPIC_DEFAULT_HAIKU_MODEL`,n),vd(l,`ANTHROPIC_DEFAULT_SONNET_MODEL`,n),vd(l,`ANTHROPIC_DEFAULT_OPUS_MODEL`,n),vd(l,`CLAUDE_CODE_SUBAGENT_MODEL`,n),c.env=l,Jc(i,c),Xc(a);let u=Kc(a);return u.hasCompletedOnboarding=!0,Jc(a,u),{paths:[i,a],nextStep:"Run `claude` to start using Claude Code with DashScope.",warnings:o.length>0?o:void 0}}};const bd=`DASHSCOPE_API_KEY`;function xd(e){return`[Bailian] ${e}`}function Sd(e){if(e.envKey===bd)return!0;let t=typeof e.name==`string`?e.name:``;return t===`bailian-cli`||t.startsWith(`[Bailian]`)}var Cd={label:`Qwen Code`,write({baseUrl:e,apiKey:t,model:n}){let r=vi(Ri(),`.qwen`,`settings.json`),i=Zc(e)?`anthropic`:`openai`,a=[];Xc(r);let o=Kc(r);o.$version=3;let s=o.env??{};s[bd]=t,o.env=s;let c=process.env[bd];c!==void 0&&c!==t&&a.push(`Shell/environment ${bd} is set and overrides settings.json. Unset it (e.g. \`unset ${bd}\`) so the key written here takes effect.`);let l=o.modelProviders??{},u=l[i]??[],d=u.find(e=>Sd(e)&&e.id===n),f=u.find(e=>!Sd(e)&&e.id===n);if(d){d.baseUrl=e,d.envKey=bd;let t=typeof d.name==`string`?d.name.trim():``;(!t||t===`bailian-cli`)&&(d.name=xd(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:xd(n),baseUrl:e,envKey:bd});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},Jc(r,o),{paths:[r],nextStep:"Run `qwen` to start using Qwen Code with DashScope.",warnings:a.length>0?a:void 0}}},wd={label:`OpenCode`,write({baseUrl:e,apiKey:t,model:n}){let r=vi(Ri(),`.config`,`opencode`,`opencode.json`);Xc(r);let i=qc(r);i.$schema||=`https://opencode.ai/config.json`;let a=i.provider??{};return a[`bailian-cli`]={npm:Zc(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,Jc(r,i),{paths:[r],nextStep:"Run `opencode` then type `/models` to select your model."}}};const Td=`bailian-cli`;function Ed(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 Dd={label:`OpenClaw`,write({baseUrl:e,apiKey:t,model:n,contextWindow:r}){let i=vi(Ri(),`.openclaw`,`openclaw.json`),a=[],o=`${Td}/${n}`;Xc(i);let s=Kc(i),c=s.models??{};c.mode=`merge`;let l=c.providers??{},u=Zc(e)?`anthropic-messages`:`openai-completions`;l[Td]={baseUrl:e,apiKey:t,api:u,models:[{id:n,name:n,contextWindow:r??256e3,cost:{input:0,output:0,cacheRead:0,cacheWrite:0}}]},c.providers=l,s.models=c;let d=s.agents??{},f=d.defaults??{},p=f.models??{};p[o]=p[o]??{},f.models=p;let m=Ed(f);return m?m.startsWith(`${Td}/`)?f.model={primary:o}:a.push(`Left existing primary model unchanged ("${m}"). Added provider "${Td}" — switch to "${o}" in OpenClaw if you want to use it.`):f.model={primary:o},d.defaults=f,s.agents=d,Jc(i,s),{paths:[i],nextStep:"Run `openclaw gateway restart`, then `openclaw` to start using OpenClaw with DashScope.",warnings:a.length>0?a:void 0}}},Od={label:`Hermes Agent`,write({baseUrl:e,apiKey:t,model:n}){let r=vi(gt(),`config.yaml`);Xc(r);let i={};if(li(r))try{i=Pi.parse(di(r,`utf-8`))??{}}catch{i={}}let a={default:n,provider:`custom`,base_url:e,api_key:t};return Zc(e)&&(a.api_mode=`anthropic_messages`),i.model=a,Yc(r,Pi.stringify(i)),{paths:[r],nextStep:'Run `hermes chat -q "hello"` to verify.'}}};const kd=`bailian-cli`;var Ad={label:`Codex`,write({baseUrl:e,apiKey:t,model:n,wireApi:r}){let i=vi(Ri(),`.codex`,`config.toml`),a=[];Xc(i);let o={};if(li(i))try{o=Ii(di(i,`utf-8`))}catch{o={}}o.model_provider=kd,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??{},l=c[kd]??{};c[kd]={...l,name:kd,base_url:e,env_key:`OPENAI_API_KEY`,wire_api:s,requires_openai_auth:!0},o.model_providers=c,Yc(i,Li(o)+`
2725
- `);let u=vi(Ri(),`.codex`,`auth.json`);Xc(u);let d=Kc(u);return d.OPENAI_API_KEY=t,Jc(u,d),{paths:[i,u],nextStep:"Run `codex` to start using Codex with DashScope.",warnings:a.length>0?a:void 0}}};const jd=`bailian-cli`;function Md(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Nd={"claude-code":yd,"qwen-code":Cd,opencode:wd,openclaw:Dd,hermes:Od,codex:Ad,pi:{label:`Pi`,write({baseUrl:e,apiKey:t,model:r,localize:i=e=>typeof e==`string`?e:e[`en-US`]}){let a=Wc(),o=[`models.json`,`auth.json`,`settings.json`].map(e=>N(a,e)),s=o.map(e=>M(e)?Si(e,`utf8`):void 0),c=o.map((e,t)=>{try{let e=s[t]?.replace(/^\uFEFF/,``),n=e===void 0?{}:JSON.parse(t===0?Gc(e):e);if(!Md(n))throw Error(`root value is not an object`);return n}catch{throw new n(i({"en-US":`Cannot update Pi because ${e} is invalid; no configuration was changed.`,"zh-CN":`无法更新 Pi:${e} 格式无效,配置未被修改。`}),f.GENERAL)}}),[l,u,d]=c;if(l.providers!==void 0&&!Md(l.providers))throw new n(i({"en-US":`Cannot update Pi because models.json providers is not an object; no configuration was changed.`,"zh-CN":`无法更新 Pi:models.json 中的 providers 必须为对象,配置未被修改。`}),f.GENERAL);let p=l.providers??{},m=p[jd];if(m!==void 0&&(!Md(m)||m.models!==void 0&&!Array.isArray(m.models)))throw new n(i({"en-US":`Cannot update Pi because the bailian-cli provider is invalid; no configuration was changed.`,"zh-CN":`无法更新 Pi:bailian-cli provider 格式无效,配置未被修改。`}),f.GENERAL);let h=m??{},g=h.models??[],_=g.find(e=>e.id===r),v={..._,id:r,name:_?.name??r};delete v.baseUrl,delete v.api,h.models=_?g.map(e=>e.id===r?v:e):[...g,v],h.baseUrl=e,h.api=Zc(e)?`anthropic-messages`:`openai-completions`,delete h.apiKey,p[jd]=h,l.providers=p,u[jd]={type:`api_key`,key:t},d.defaultProvider=jd,d.defaultModel=r;for(let[e,t]of o.entries())Xc(t),Jc(t,c[e]);return{paths:o,nextStep:i({"en-US":"Run `pi` to start using Pi with DashScope.","zh-CN":"运行 `pi` 开始使用百炼模型。"})}}}},Pd=Object.keys(Nd),Fd=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.`,Id=new Map(Fd.split(``).map((e,t)=>[e,t])),Ld=/^[A-Za-z0-9._-]+$/;function Rd(){return new n(`Invalid obfuscated API key.`,f.USAGE,`--key expects the obfuscated key copied from the web console (starts with "o1_").`)}function zd(e){let t=[];for(let n of e){let e=Id.get(n);if(e===void 0)throw Rd();t.push(e)}return t}function Bd(e){return e.map(e=>Fd[e]).join(``)}function Vd(e,t){return Math.imul((e^t)>>>0,16777619)>>>0}function Hd(e){let t=e>>>0;return t^=t<<13,t^=t>>>17,t^=t<<5,t>>>0}function Ud(e,t,n,r){let i=(2166136261^Math.imul(n+1,2654435761))>>>0;i=Vd(i,e.length),i=Vd(i,r);for(let e of t)i=Vd(i,(Id.get(e)??-1)+1);for(let t of e)i=Vd(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=Hd(i),a.push(i%65);return a}function Wd(e,t){let n=zd(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=Ud(n,t,e,a.length);i=a.map((e,t)=>(e-r[t]+65)%65),a=n}return Bd([...i,...a])}function Gd(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 Kd(e,t){let n=e>>>0,r=Array(t).fill(Fd[0]);for(let e=t-1;e>=0;--e)r[e]=Fd[n%65],n=Math.floor(n/65);if(n!==0)throw Rd();return r.join(``)}function qd(e){if(e.length!==6||!Ld.test(e))throw Rd()}function Jd(e){if(e.length<16||!e.startsWith(`o1_`))throw Rd();let t=e.slice(3);if(!Ld.test(t))throw Rd();let n=t.slice(0,6),r=t.slice(6,-6),i=t.slice(-6);if(qd(n),!r)throw Rd();let a=Wd(r,n);if(!Ld.test(a)||i!==Kd(Gd(a),6))throw Rd();return a}const Yd={agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Target agent: ${Pd.join(`, `)}`,"zh-CN":`目标 Agent:${Pd.join(`, `)}`},required:!0,choices:Pd},baseUrl:{type:`string`,valueHint:`<url>`,description:{"en-US":`API base URL`,"zh-CN":`API Base URL`}},region:{type:`string`,valueHint:`<region>`,description:{"en-US":`Model Studio region (e.g. cn-beijing, ap-southeast-1); converted into --base-url. Token Plan only`,"zh-CN":`模型服务地域(例如 cn-beijing、ap-southeast-1);将转换为 --base-url。仅用于 Token Plan`}},apiKey:{type:`string`,valueHint:`<key>`,description:{"en-US":`API key`,"zh-CN":`API Key`}},key:{type:`string`,valueHint:`<encoded>`,description:{"en-US":`Obfuscated API key from the web console (starts with "o1_"); decoded into --api-key`,"zh-CN":`来自 Web 控制台的混淆 API Key(以 "o1_" 开头);将解码为 --api-key`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Default model name`,"zh-CN":`默认模型名称`},required:!0},contextWindow:{type:`number`,valueHint:`<tokens>`,description:{"en-US":`OpenClaw only: model context window in tokens (default: 256000)`,"zh-CN":`仅 OpenClaw:模型上下文窗口 Token 数(默认:256000)`}},wireApi:{type:`string`,valueHint:`<api>`,description:{"en-US":`Codex only: wire protocol (default: responses). "chat" only works with legacy Codex <= 0.80.0`,"zh-CN":`仅 Codex:通信协议(默认:responses)。"chat" 仅适用于旧版 Codex <= 0.80.0`},choices:[`chat`,`responses`]}};var Xd=w({description:{"en-US":`Configure a coding agent to use DashScope API`,"zh-CN":`配置编程 Agent 使用 DashScope API`},auth:`none`,usageArgs:`--agent <name> (--base-url <url> | --region <region>) (--api-key <key> | --key <encoded>) --model <model>`,flags:Yd,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?$c(n.region):n.baseUrl,c=n.key?Jd(n.key):n.apiKey,l=Nd[r],u=T(t.output);if(r===`hermes`&&zi()===`win32`&&process.stderr.write(`Warning: Hermes Agent does not support native Windows. Please use WSL2.
2726
- `),t.dryRun){A({agent:r,label:l.label,base_url:s,api_key:Qt(c),model:i},u);return}let d={baseUrl:s,apiKey:c,model:i,contextWindow:a,wireApi:o,localize:e.localize},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 Zd=`bl skill update`;function Qd(e){process.stderr.write(`
2717
+ `,e)}function qc(e=Fi()){let t=process.env.PI_CODING_AGENT_DIR;return t?t===`~`?e:t.startsWith(`~/`)||t.startsWith(`~\\`)?N(e,t.slice(2)):t:N(e,`.pi`,`agent`)}function Jc(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]!==`
2718
+ `;)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 Yc(e){if(!fi(e))return{};try{return JSON.parse(mi(e,`utf-8`))}catch{return{}}}function Xc(e){if(!fi(e))return{};try{return JSON.parse(Jc(mi(e,`utf-8`)))}catch{return{}}}function Zc(e,t){pi(yi(e),{recursive:!0});let n=e+`.tmp`;_i(n,JSON.stringify(t,null,2)+`
2719
+ `,{mode:384}),hi(n,e)}function Qc(e,t){pi(yi(e),{recursive:!0});let n=e+`.tmp`;_i(n,t,{mode:384}),hi(n,e)}function $c(e){if(!fi(e))return;let t=Math.floor(Date.now()/1e3);ui(e,`${e}.bak.${t}`)}function el(e){return e.includes(`/apps/anthropic`)}function tl(e){let t=e.trim().replace(/\/+$/,``);if(el(t))return{url:t};if(t.includes(`/compatible-mode`))return{url:t.replace(/\/compatible-mode(?:\/v\d+)?/,`/apps/anthropic`),rewrittenFrom:e.trim()};try{let n=new URL(t),r=n.hostname;if((r.includes(`dashscope`)||r.includes(`maas.aliyuncs.com`)||r.includes(`token-plan`))&&(n.pathname===`/`||n.pathname===``))return{url:`${n.origin}/apps/anthropic`,rewrittenFrom:e.trim()}}catch{}throw new n(`Claude Code requires an Anthropic-compatible base URL, got "${e}".`,f.USAGE,`Use a URL ending in /apps/anthropic (not /compatible-mode/v1). Example: https://dashscope.aliyuncs.com/apps/anthropic`)}function nl(e){let t=e.trim();if(!/^[a-z0-9-]+$/.test(t))throw new n(`Invalid --region "${e}".`,f.USAGE,`Use a Model Studio region id, e.g. cn-beijing or ap-southeast-1.`);return`https://token-plan.${t}.maas.aliyuncs.com/compatible-mode/v1`}const rl=[`codex`,`claude-code`,`cursor`,`qoder`,`qoderwork`,`qwenwork`,`qwen-code`,`gemini`,`opencode`,`openclaw`,`deepseek-harness`,`zcode`,`workbuddy`,`pi`],il=`@deepseek-ai/dsh-mcp-client`,al=`__dshOtherPatches`,ol=`mcpServers`,sl=[`.workbuddy-ai`,`.workbuddy`,`.codebuddy`],cl=[`.openclaw`,`.clawdbot`,`.moltbot`];function ll(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function ul(e,t){if(!M(e))return{};try{let n=t(Ti(e,`utf8`));if(!ll(n))throw Error(`root value is not an object`);return n}catch(t){throw new n(`Cannot update MCP configuration because ${e} is invalid.`,f.GENERAL,`Fix the existing configuration file and retry; it was not changed.`,{cause:t})}}function dl(e){return ul(e,e=>JSON.parse(Jc(e)))}function fl(e){return ul(e,zi)}function pl(e,t){let r=e[t];if(r===void 0){let n={};return e[t]=n,n}if(!ll(r))throw new n(`Cannot update MCP configuration because ${t} is not an object.`,f.GENERAL);return r}function ml(e,t){let n=e;for(let e of t)n=pl(n,e);return n}function hl(e,t){let n=e.paths?.(t);return n&&n.length>0?n:[e.path(t)]}function gl(e,t,n){return e?.trim()||N(t,n)}function _l(e,t){return e===void 0||e===`unchanged`?t:t===`updated`||e===`updated`?`updated`:e}function vl(e){return new n(`${e===`codex`?`Codex`:e===`deepseek-harness`?`DeepSeek Harness`:e} does not support SSE MCP servers; use --transport streamable-http.`,f.USAGE)}const yl=[`.qwenworkcn`,`.qwenwork`];function bl(e){return yl.map(t=>N(e,t))}function xl(e){let t=bl(e);for(let e of t){let t=N(e,`mcp.json`);if(M(t))return t}for(let e of t)if(M(e))return N(e,`mcp.json`);return N(t[0],`mcp.json`)}function Sl(e){return N(e,`.config`,`opencode`,`opencode.json`)}function Cl(e){let t=process.env.OPENCLAW_CONFIG_PATH?.trim();if(t)return t;let n=cl.map(t=>N(e,t)).find(e=>M(e));return N(n??N(e,cl[0]),`openclaw.json`)}function wl(e){return gl(process.env.DSH_HOME,e,`.dsh`)}function Tl(e){return N(wl(e),`cordis.patch.yml`)}function El(e){return N(gl(process.env.ZCODE_HOME,e,`.zcode`),`cli`,`config.json`)}function Dl(e){return sl.map(t=>N(e,t))}function Ol(e){let t=N(e,`.mcp.json`);return M(t)?t:N(e,`mcp.json`)}function kl(e){let t=Dl(e).filter(e=>M(e));return(t.length>0?t:[N(e,sl[0])]).map(e=>Ol(e))}function Al(e){return ll(e)&&e.name===il&&ll(e.config)}function jl(e){let t=e.config;if(ll(t)&&typeof t.serverName==`string`&&t.serverName!==``)return t.serverName}function Ml(e){if(!M(e))return{[al]:[],[ol]:{}};let t;try{t=Li.parse(Ti(e,`utf8`))}catch(t){throw new n(`Cannot update MCP configuration because ${e} is invalid.`,f.GENERAL,`Fix the existing configuration file and retry; it was not changed.`,{cause:t})}if(t==null)return{[al]:[],[ol]:{}};if(!Array.isArray(t))throw new n(`Cannot update MCP configuration because ${e} is invalid.`,f.GENERAL,`Fix the existing configuration file and retry; it was not changed.`);let r=[],i={};for(let e of t){if(ll(e)&&Array.isArray(e.insert)){let t=[];for(let n of e.insert){if(Al(n)){let e=jl(n);if(e){i[e]=n;continue}}t.push(n)}t.length>0&&r.push({...e,insert:t});continue}if(Al(e)){let t=jl(e);if(t){i[t]=e;continue}}r.push(e)}return{[al]:r,[ol]:i}}function Nl(e){let t=Array.isArray(e[al])?e[al]:[],n=ll(e[ol])?e[ol]:{},r=[...t],i=Object.values(n);return i.length>0&&r.push({insert:i}),Li.stringify(r)}function Pl(e){let t=e.serverKeys??[`mcpServers`];return{path:e.path,paths:e.paths,installed:e.installed,supports:e.supports??(()=>!0),parse:dl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>ml(e,t),buildEntry:e.buildEntry??(t=>e.typed?{type:t.transport===`sse`?`sse`:`http`,url:t.endpoint,headers:t.headers}:{url:t.endpoint,headers:t.headers})}}const Fl={pi:Pl({path:e=>N(qc(e),`mcp.json`),installed:e=>M(qc(e)),supports:e=>e===`streamable-http`}),codex:{path:e=>N(process.env.CODEX_HOME||N(e,`.codex`),`config.toml`),installed:e=>M(process.env.CODEX_HOME||N(e,`.codex`))||M(N(process.env.CODEX_HOME||N(e,`.codex`),`config.toml`)),supports:e=>e===`streamable-http`,parse:fl,serialize:e=>`${Bi(e)}\n`,getServers:e=>pl(e,`mcp_servers`),buildEntry:e=>({url:e.endpoint,http_headers:e.headers})},"claude-code":{path:e=>N(e,`.claude.json`),installed:e=>M(N(e,`.claude`))||M(N(e,`.claude.json`)),supports:()=>!0,parse:dl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>pl(e,`mcpServers`),buildEntry:e=>({type:e.transport===`sse`?`sse`:`http`,url:e.endpoint,headers:e.headers})},cursor:Pl({path:e=>N(e,`.cursor`,`mcp.json`),installed:e=>M(N(e,`.cursor`))||M(N(e,`.cursor`,`mcp.json`))}),qoder:Pl({path:e=>N(e,`.qoder`,`mcp.json`),installed:e=>M(N(e,`.qoder`))||M(N(e,`.qoder`,`mcp.json`))}),qoderwork:Pl({path:e=>N(e,`.qoderwork`,`mcp.json`),installed:e=>M(N(e,`.qoderwork`))||M(N(e,`.qoderwork`,`mcp.json`))}),qwenwork:Pl({path:xl,installed:e=>bl(e).some(e=>M(e)||M(N(e,`mcp.json`))),buildEntry:e=>({type:e.transport===`sse`?`sse`:`streamable-http`,url:e.endpoint,headers:e.headers})}),"qwen-code":{path:e=>N(e,`.qwen`,`settings.json`),installed:e=>M(N(e,`.qwen`)),supports:()=>!0,parse:dl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>pl(e,`mcpServers`),buildEntry:e=>e.transport===`sse`?{url:e.endpoint,headers:e.headers}:{httpUrl:e.endpoint,headers:e.headers}},gemini:{path:e=>N(e,`.gemini`,`settings.json`),installed:e=>M(N(e,`.gemini`)),supports:()=>!0,parse:dl,serialize:e=>`${JSON.stringify(e,null,2)}\n`,getServers:e=>pl(e,`mcpServers`),buildEntry:e=>e.transport===`sse`?{url:e.endpoint,headers:e.headers}:{httpUrl:e.endpoint,headers:e.headers}},opencode:Pl({path:Sl,installed:e=>M(N(e,`.config`,`opencode`))||M(Sl(e)),serverKeys:[`mcp`],buildEntry:e=>({type:`remote`,url:e.endpoint,enabled:!0,oauth:!1,headers:e.headers})}),openclaw:Pl({path:Cl,installed:e=>!!process.env.OPENCLAW_CONFIG_PATH?.trim()||cl.some(t=>M(N(e,t)))||M(Cl(e)),serverKeys:[`mcp`,`servers`],buildEntry:e=>({url:e.endpoint,transport:e.transport===`sse`?`sse`:`streamable-http`,headers:e.headers})}),"deepseek-harness":{path:Tl,installed:e=>M(wl(e)),supports:e=>e===`streamable-http`,parse:Ml,serialize:Nl,getServers:e=>pl(e,ol),buildEntry:e=>({id:`mcp-bailian-${e.name}`,name:il,config:{serverName:e.name,transport:`streamable-http`,url:e.endpoint,headers:e.headers}})},zcode:Pl({path:El,installed:e=>M(gl(process.env.ZCODE_HOME,e,`.zcode`)),serverKeys:[`mcp`,`servers`],buildEntry:e=>({type:e.transport===`sse`?`sse`:`http`,url:e.endpoint,enabled:!0,headers:e.headers})}),workbuddy:Pl({path:e=>kl(e)[0]??N(e,sl[0],`mcp.json`),paths:kl,installed:e=>Dl(e).some(e=>M(e)),typed:!0})};function Il(e){return Array.isArray(e)?`[${e.map(Il).join(`,`)}]`:ll(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Il(e[t])}`).join(`,`)}}`:JSON.stringify(e)}function Ll(e){return ri(`sha256`).update(Il(e)).digest(`hex`)}function Rl(e,t){return`${e}:${t}`}function zl(e){return N(e,`mcp-registrations.json`)}function Bl(e){let t=zl(e);if(!M(t))return{version:1,registrations:{}};let r=dl(t);if(r.version!==1||!ll(r.registrations))throw new n(`Cannot update MCP registrations because ${t} has an unsupported format.`,f.GENERAL);return r}function Vl(e,t,r,i){if(e!==void 0){if(!t)throw new n(`MCP server "${i}" already exists in ${r} and is not managed by bailian-cli.`,f.GENERAL,`Choose another server name or remove the existing entry yourself.`);if(Ll(e)!==t.fingerprint)throw new n(`MCP server "${i}" in ${r} conflicts with the last bailian-cli registration.`,f.GENERAL,`The entry was changed after registration; resolve it manually before retrying.`)}}function Hl(e){for(let t of e.reverse())try{t.original===void 0?Oi(t.path):Qc(t.path,t.original)}catch{}}function Ul(e,t,r){let i=[];try{for(let t of e)$c(t.path),Qc(t.path,t.content),i.push(t);Zc(zl(r),t)}catch(e){throw Hl(i),new n(`Failed to update MCP Agent configuration.`,f.GENERAL,void 0,{cause:e})}}function Wl(e,t){return e===`all`?rl.filter(e=>Fl[e].installed(t)):[e]}function Gl(e){let t=Bl(e.configDir),n=[],r=[];for(let i of e.agents){let a=Fl[i];if(!a.supports(e.spec.transport))throw vl(i);let o=hl(a,e.home),s=a.path(e.home),c=Rl(i,e.spec.name),l=t.registrations[c],u=a.buildEntry(e.spec),d=Ll(u),f;for(let t of o){let r=a.parse(t),o=a.getServers(r),s=o[e.spec.name];Vl(s,l,i,e.spec.name);let c=s===void 0?`added`:Ll(s)===d?`unchanged`:`updated`;f=_l(f,c),c!==`unchanged`&&(o[e.spec.name]=u,n.push({path:t,original:M(t)?Ti(t,`utf8`):void 0,content:a.serialize(r)}))}let p=f??`unchanged`;r.push({agent:i,path:s,status:p}),p!==`unchanged`&&(t.registrations[c]={agent:i,name:e.spec.name,serverCode:e.spec.serverCode,transport:e.spec.transport,endpoint:e.spec.endpoint,path:s,fingerprint:d,cliVersion:e.cliVersion,updatedAt:(/* @__PURE__ */ new Date()).toISOString()})}return n.length>0&&Ul(n,t,e.configDir),r}function Kl(e){let t=Bl(e.configDir),n=[],r=[],i=!1;for(let a of e.agents){let o=Fl[a],s=o.path(e.home),c=Rl(a,e.name),l=t.registrations[c];if(!l){r.push({agent:a,path:s,status:`absent`});continue}let u=!1,d=!1;for(let t of hl(o,e.home)){let r=o.parse(t),i=o.getServers(r),s=i[e.name];s!==void 0&&(d=!0,Vl(s,l,a,e.name),delete i[e.name],u=!0,n.push({path:t,original:Ti(t,`utf8`),content:o.serialize(r)}))}delete t.registrations[c],i=!0,r.push({agent:a,path:s,status:d&&u?`removed`:`absent`})}return(n.length>0||i)&&Ul(n,t,e.configDir),r}function ql(e){try{return Ti(e,`utf-8`)}catch{return}}function F(e){let t=ql(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 I(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}function Jl(e){let t=/^---\s*\n([\s\S]*?)\n---/.exec(e);if(!t)return{};try{return I(Li.parse(t[1]))??{}}catch{return{}}}function Yl(e,t=500){let n=0,r=e=>{if(n>=t)return;let i;try{i=Ei(e,{withFileTypes:!0})}catch{return}for(let a of i){if(n>=t)return;let i=N(e,a.name);a.isDirectory()?r(i):n+=1}};return r(e),n}function Xl(e){return[{source:`global`,dir:N(e,`.agents`,`skills`)},{source:`claude-code`,dir:N(e,`.claude`,`skills`)},{source:`cursor`,dir:N(e,`.cursor`,`skills`)},{source:`qwen-code`,dir:N(e,`.qwen`,`skills`)},{source:`codex`,dir:N(e,`.codex`,`skills`)},{source:`opencode`,dir:N(e,`.config`,`opencode`,`skills`)},{source:`openclaw`,dir:N(e,`.openclaw`,`skills`)},{source:`openclaw`,dir:N(e,`.openclaw`,`workspace`,`skills`)},{source:`hermes`,dir:N(gt(e),`skills`)},{source:`gemini`,dir:N(e,`.gemini`,`skills`)},{source:`antigravity`,dir:N(e,`.gemini`,`antigravity`,`skills`)},{source:`windsurf`,dir:N(e,`.windsurf`,`skills`)},{source:`windsurf`,dir:N(e,`.codeium`,`windsurf`,`skills`)},{source:`qoderwork`,dir:N(e,`.qoderwork`,`skills`)},{source:`workbuddy`,dir:N(e,`.workbuddy`,`skills`)}]}function Zl(e=Fi()){let t=/* @__PURE__ */ new Map;for(let{source:n,dir:r}of Xl(e)){let e;try{e=Ei(r,{withFileTypes:!0})}catch{continue}for(let i of e){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let e=N(r,i.name),a=N(e,`SKILL.md`);if(!M(a))continue;let o=t.get(i.name);if(o){o.sources.includes(n)||o.sources.push(n);continue}let s=Jl(ql(a)??``),c=I(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:Yl(e),path:e,sources:[n],origin:`local`})}}return[...t.values()].sort((e,t)=>e.name.localeCompare(t.name))}function Ql(e,t=Fi()){let n=Zl(t).find(t=>t.id===e);if(!n)return null;let r=ql(N(n.path,`SKILL.md`))??``;return{...n,content:r}}const $l=[{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 eu(e,t){let n=$l.find(t=>t.source===e);return n?N(t,...n.sub):null}function tu(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=Ii(p);else throw Error(`Unsupported compression in archive (entry: `+l+`).`);a.push({name:l,data:m})}return a}function nu(e,t,n,r=Fi()){let i=eu(e,r);if(!i)throw Error(`Unknown skill install target.`);let a=tu(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=N(i,c),d=P(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=P(N(u,t));(n===d||n.startsWith(d+Pi))&&(wi(ji(n),{recursive:!0}),ki(n,e.data),f++)}if(f===0)throw Error(`Nothing was extracted from the archive.`);return{installed:c,files:f,dir:u}}function ru(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;if(t){let n=typeof e.type==`string`?e.type.toLowerCase():``,r=typeof e.transport==`string`?e.transport.toLowerCase():``;return n===`sse`||r===`sse`?{transport:`sse`,detail:t}:{transport:`http`,detail:t}}return{transport:`unknown`,detail:``}}function iu(e,t,n,r,i){let a=I(e);if(a)for(let[e,o]of Object.entries(a)){let a=I(o)??{},{transport:s,detail:c}=ru(a);r.push({name:e,source:t,transport:s,detail:c,scope:n,origin:`local`,config:vu(a),editable:i})}}function au(e=Fi()){let t=[],n=F(N(e,`.claude.json`));if(n){iu(n.mcpServers,`claude-code`,`global`,t,!0);let e=I(n.projects);if(e)for(let[n,r]of Object.entries(e)){let e=I(r);e?.mcpServers&&iu(e.mcpServers,`claude-code`,n,t,!0)}}let r=F(N(e,`.qwen`,`settings.json`));r&&iu(r.mcpServers,`qwen-code`,`global`,t,!0);let i=F(N(e,`.config`,`opencode`,`opencode.json`));i&&iu(i.mcp,`opencode`,`global`,t,!0);let a=F(N(e,`.cursor`,`mcp.json`));a&&iu(a.mcpServers,`cursor`,`global`,t,!0);let o=F(N(e,`.qoder`,`mcp.json`));o&&iu(o.mcpServers,`qoder`,`global`,t,!0);let s=F(N(e,`.qoderwork`,`mcp.json`));s&&iu(s.mcpServers,`qoderwork`,`global`,t,!0);let c=F(xl(e));c&&iu(c.mcpServers,`qwenwork`,`global`,t,!0);let l=F(N(e,`.codeium`,`windsurf`,`mcp_config.json`));l&&iu(l.mcpServers,`windsurf`,`global`,t,!0);let u=F(N(e,`.gemini`,`settings.json`));u&&iu(u.mcpServers,`gemini`,`global`,t,!0);let d=F(N(e,`.openclaw`,`openclaw.json`));d&&iu(I(d.mcp)?.servers??d.mcpServers,`openclaw`,`global`,t,!0);let f=F(N(e,`.zcode`,`cli`,`config.json`));f&&iu(I(f.mcp)?.servers,`zcode`,`global`,t,!0);for(let n of kl(e)){let e=F(n);e&&iu(e.mcpServers,`workbuddy`,n,t,!0)}let p=ql(N(e,`.dsh`,`cordis.patch.yml`));if(p)try{let e=Li.parse(p),n=Array.isArray(e)?e:[],r={};for(let e of n){let t=I(e)?.insert,n=Array.isArray(t)?t:[e];for(let e of n){let t=I(e),n=t?I(t.config):void 0;t?.name===`@deepseek-ai/dsh-mcp-client`&&typeof n?.serverName==`string`&&(r[n.serverName]=n)}}iu(r,`deepseek-harness`,`global`,t,!1)}catch{}let m=F(ou(e));m&&iu(m.mcpServers,`claude-desktop`,`global`,t,!0);let h=ql(N(e,`.codex`,`config.toml`));if(h)try{iu(zi(h).mcp_servers,`codex`,`global`,t,!1)}catch{}return t.sort((e,t)=>e.name.localeCompare(t.name)||e.source.localeCompare(t.source))}function ou(e){return process.platform===`darwin`?N(e,`Library`,`Application Support`,`Claude`,`claude_desktop_config.json`):process.platform===`win32`?N(process.env.APPDATA??N(e,`AppData`,`Roaming`),`Claude`,`claude_desktop_config.json`):N(e,`.config`,`Claude`,`claude_desktop_config.json`)}function su(e,t,n){return e===`claude-code`?{file:N(n,`.claude.json`),mapKey:`mcpServers`,projectScoped:t!==`global`}:e===`qwen-code`?{file:N(n,`.qwen`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`opencode`?{file:N(n,`.config`,`opencode`,`opencode.json`),mapKey:`mcp`,projectScoped:!1}:e===`cursor`?{file:N(n,`.cursor`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`windsurf`?{file:N(n,`.codeium`,`windsurf`,`mcp_config.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`gemini`?{file:N(n,`.gemini`,`settings.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qoder`?{file:N(n,`.qoder`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qoderwork`?{file:N(n,`.qoderwork`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`qwenwork`?{file:xl(n),mapKey:`mcpServers`,projectScoped:!1}:e===`openclaw`?{file:N(n,`.openclaw`,`openclaw.json`),mapKey:`servers`,parentKey:`mcp`,projectScoped:!1}:e===`zcode`?{file:N(n,`.zcode`,`cli`,`config.json`),mapKey:`servers`,parentKey:`mcp`,projectScoped:!1}:e===`workbuddy`?{file:kl(n)[0]??N(n,`.workbuddy-ai`,`mcp.json`),mapKey:`mcpServers`,projectScoped:!1}:e===`claude-desktop`?{file:ou(n),mapKey:`mcpServers`,projectScoped:!1}:null}function cu(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)=>cu(e,n[t]))}let n=I(e);if(n){let e=I(t)??{},r={};for(let[t,i]of Object.entries(n))r[t]=cu(i,e[t]);return r}return e}function lu(e,t,n){let r=e;if(t.projectScoped){let t=I(e.projects);r=t?I(t[n]):void 0}if(r)return t.parentKey?I(r[t.parentKey]):r}function uu(e,t,n){let r=e;if(t.projectScoped){let t=I(e.projects)??{};e.projects=t;let i=I(t[n])??{};t[n]=i,r=i}if(t.parentKey){let e=I(r[t.parentKey])??{};return r[t.parentKey]=e,e}return r}function du(e,t,n,r,i=Fi()){let a=su(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=I(r);if(!s)throw Error(`Config must be a JSON object.`);let c=F(a.file)??{},l=uu(c,a,t),u=I(l[a.mapKey])??{};l[a.mapKey]=u,u[o]=cu(s,I(u[o])),wi(ji(a.file),{recursive:!0}),ki(a.file,JSON.stringify(c,null,2)+`
2720
+ `,`utf-8`)}function fu(e,t,n,r=Fi()){let i=su(e,t,r);if(!i)throw Error(`This MCP source is read-only and cannot be edited here.`);let a=F(i.file);if(!a)throw Error(`Config file not found.`);let o=lu(a,i,t),s=o?I(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],ki(i.file,JSON.stringify(a,null,2)+`
2721
+ `,`utf-8`)}const pu=[{id:`claude-code`,label:`Claude Code`,paths:e=>[N(process.env.CLAUDE_CONFIG_DIR||N(e,`.claude`),`settings.json`),N(e,`.claude.json`)],detect:e=>{let t=process.env.CLAUDE_CONFIG_DIR||N(e,`.claude`),n=I(F(N(t,`settings.json`))?.env),r=n&&typeof n.ANTHROPIC_BASE_URL==`string`?n.ANTHROPIC_BASE_URL:void 0,i=n&&typeof n.ANTHROPIC_MODEL==`string`?n.ANTHROPIC_MODEL:void 0;return{configured:!!r,model:i}}},{id:`qwen-code`,label:`Qwen Code`,paths:e=>[N(e,`.qwen`,`settings.json`)],detect:e=>{let t=F(N(e,`.qwen`,`settings.json`)),n=I(t?.modelProviders),r=n?Object.values(n).some(e=>Array.isArray(e)&&e.some(e=>{let t=I(e)?.name;return typeof t==`string`&&(t===`bailian-cli`||t.startsWith(`[Bailian]`))})):!1,i=I(t?.model);return{configured:r,model:i&&typeof i.name==`string`?i.name:void 0}}},{id:`opencode`,label:`OpenCode`,paths:e=>[N(e,`.config`,`opencode`,`opencode.json`)],detect:e=>{let t=I(I(F(N(e,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),n=I(t?.models);return{configured:!!t,model:n?Object.keys(n)[0]:void 0}}},{id:`openclaw`,label:`OpenClaw`,paths:e=>[N(e,`.openclaw`,`openclaw.json`)],detect:e=>{let t=I(I(I(F(N(e,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]),n=I((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=>[N(gt(e),`config.yaml`)],detect:e=>{let t=ql(N(gt(e),`config.yaml`));if(!t)return{configured:!1};let n;try{n=I(Li.parse(t))}catch{return{configured:!1}}let r=(Array.isArray(n?.custom_providers)?n.custom_providers:[]).some(e=>I(e)?.name===`bailian-cli`),i=I(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=>[N(e,`.codex`,`config.toml`),N(e,`.codex`,`auth.json`)],detect:e=>{let t=ql(N(e,`.codex`,`config.toml`));if(!t)return{configured:!1};let n={};try{n=zi(t)}catch{return{configured:!1}}return{configured:!!I(n.model_providers)?.[`bailian-cli`],model:typeof n.model==`string`?n.model:void 0}}}];function mu(e=Fi()){return pu.map(t=>{let n=t.paths(e),r=n.some(e=>M(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 L(e,t,n,r=!1){typeof n==`string`&&n.trim()&&e.push({label:t,value:n.trim(),secret:r})}function hu(e,t){let n=[];if(e===`claude-code`){let e=I(F(N(t,`.claude`,`settings.json`))?.env);L(n,`Model`,e?.ANTHROPIC_MODEL),L(n,`Base URL`,e?.ANTHROPIC_BASE_URL),L(n,`Auth Token`,e?.ANTHROPIC_AUTH_TOKEN,!0)}else if(e===`qwen-code`){let e=F(N(t,`.qwen`,`settings.json`)),r=I(e?.model),i=I(I(e?.security)?.auth),a=I(e?.env);L(n,`Model`,r?.name),L(n,`Base URL`,i?.baseUrl??r?.baseUrl),L(n,`Protocol`,i?.selectedType),L(n,`API Key`,i?.apiKey??a?.BAILIAN_CLI_API_KEY,!0)}else if(e===`opencode`){let e=I(I(F(N(t,`.config`,`opencode`,`opencode.json`))?.provider)?.[`bailian-cli`]),r=I(e?.options),i=I(e?.models);L(n,`Model`,i?Object.keys(i)[0]:void 0),L(n,`Base URL`,r?.baseURL),L(n,`Provider`,e?.npm),L(n,`API Key`,r?.apiKey,!0)}else if(e===`openclaw`){let e=I(I(I(F(N(t,`.openclaw`,`openclaw.json`))?.models)?.providers)?.[`bailian-cli`]);L(n,`Model`,I((Array.isArray(e?.models)?e.models:[])[0])?.id),L(n,`Base URL`,e?.baseUrl),L(n,`API`,e?.api),L(n,`API Key`,e?.apiKey,!0)}else if(e===`hermes`){let e=ql(N(gt(t),`config.yaml`)),r;if(e)try{r=I(Li.parse(e))}catch{r=void 0}let i=I((Array.isArray(r?.custom_providers)?r.custom_providers:[]).find(e=>I(e)?.name===`bailian-cli`));L(n,`Model`,I((Array.isArray(i?.models)?i.models:[])[0])?.id??I(r?.model)?.default),L(n,`Base URL`,i?.base_url),L(n,`API Mode`,i?.api_mode),L(n,`API Key`,i?.api_key,!0)}else if(e===`codex`){let e=ql(N(t,`.codex`,`config.toml`)),r={};if(e)try{r=zi(e)}catch{r={}}let i=I(I(r.model_providers)?.[`bailian-cli`]),a=F(N(t,`.codex`,`auth.json`));L(n,`Model`,r.model),L(n,`Base URL`,i?.base_url),L(n,`Wire API`,i?.wire_api),L(n,`API Key`,a?.OPENAI_API_KEY,!0)}return n}function gu(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 _u=/key|token|secret|password|passwd|auth|credential/i;function vu(e,t=``){if(typeof e==`string`)return t&&_u.test(t)&&e.trim()?gu(e):e;if(Array.isArray(e))return e.map(e=>vu(e));let n=I(e);if(n){let e={};for(let[t,r]of Object.entries(n))e[t]=vu(r,t);return e}return e}function yu(e){return e.endsWith(`.json`)?`json`:e.endsWith(`.yaml`)||e.endsWith(`.yml`)?`yaml`:e.endsWith(`.toml`)?`toml`:`text`}function bu(e,t=Fi()){let n=pu.find(t=>t.id===e);if(!n)return null;let r=n.paths(t),i=r.some(e=>M(e)),{configured:a,model:o}=i?n.detect(t):{configured:!1,model:void 0},s=i?hu(e,t).map(e=>e.secret?{...e,raw:e.value,value:gu(e.value)}:e):[],c=r.map(e=>({path:e,exists:M(e)})),l=i?r.filter(e=>M(e)).map(e=>({path:e,lang:yu(e),text:ql(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 xu={"claude-code":`claude`,"qwen-code":`qwen`,opencode:`opencode`,openclaw:`openclaw`,hermes:`hermes`,codex:`codex`};function Su(e){return Object.prototype.hasOwnProperty.call(xu,e)?xu[e]:void 0}const Cu={"qwen-code":e=>[`-i`,e],"claude-code":e=>[e],codex:e=>[e]};function wu(e){return Object.prototype.hasOwnProperty.call(Cu,e)}function Tu(e){let t=process.platform===`win32`?`where`:`which`;return new Promise(n=>{ci(t,[e],{windowsHide:!0},e=>n(!e))})}function Eu(e){let t=Su(e);return t?Tu(t):Promise.resolve(!1)}function Du(e){return`'${e.replace(/'/g,`'\\''`)}'`}function Ou(e,t){let n=process.platform;return new Promise((r,i)=>{if(n===`darwin`){let n=[`-e`,`tell application "Terminal" to do script "${`cd ${Du(t)} && ${e}`.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`,`-e`,`tell application "Terminal" to activate`];ci(`osascript`,n,{windowsHide:!0},e=>e?i(e):r());return}if(n===`win32`){let n=[`/c`,`start`,``,`cmd`,`/k`,`cd /d ${t} && ${e}`];ci(`cmd`,n,{windowsHide:!0},e=>e?i(e):r());return}let a=`cd ${Du(t)} && ${e}; exec $SHELL`;ci(`x-terminal-emulator`,[`-e`,`bash`,`-lc`,a],{windowsHide:!0},e=>e?i(/* @__PURE__ */ Error(`No supported terminal emulator was found`)):r())})}async function ku(e,t=process.cwd(),n){let r=Su(e);if(!r)throw Error(`Unknown agent: ${e}`);if(!await Tu(r))throw Error(`\`${r}\` was not found on your PATH — install ${e} first.`);let i=r,a=(n??``).trim();if(a){let t=Cu[e];if(!t)throw Error(`${e} does not support dispatching a task prompt.`);i=[r,...t(a).map(Du)].join(` `)}return await Ou(i,t),{launched:!0,command:i}}const Au=[{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,包含:项目简介、安装步骤、使用示例、目录结构说明。请先阅读现有代码与配置再撰写,内容必须与实际实现一致。`}],ju={"image-generate":{title:`Text to image`,description:`Generate a sample image and save it to the output directory.`,category:`Image`,prompt:"Use bl's image generation capability (such as `bl image generate`) to create a sample image: a corgi holding an umbrella in the rain, watercolor style, with soft lighting. Save it to the output directory and tell me the file path."},"image-describe":{title:`Image understanding`,description:`Pick an image from the output directory and describe its content and style.`,category:`Image`,prompt:`Pick an image from the output directory (output/images by default). Describe its subject, composition, colors, and style in detail, then suggest suitable use cases. If the directory is empty, say so.`},"image-alt-batch":{title:`Batch alt text`,description:`Generate accessible alt text for images in the output directory.`,category:`Image`,prompt:`Scan all images in the output directory (output/images by default) and write concise, accurate accessibility alt text for each one. Summarize the results in a File name -> Alt text table. If the directory is empty, say so.`},"image-to-code":{title:`Screenshot to code`,description:`Recreate a UI screenshot from the output directory with HTML and CSS.`,category:`Image`,prompt:`Find a UI screenshot in the output directory (output/images by default) and recreate its layout, spacing, and colors as closely as possible with HTML and CSS. Save it as a single file that opens directly in a browser and briefly explain your approach. If no screenshot is available, say so.`},"speech-generate":{title:`Text to speech`,description:`Turn a sample sentence into natural speech.`,category:`Audio`,prompt:"Use bl's speech synthesis capability (such as a `bl speech` command) to turn this sentence into natural speech: Welcome to Alibaba Cloud Model Studio CLI, making multimodal creation easier. Save the audio to the output directory and tell me the file path."},"audio-summarize":{title:`Transcribe and summarize audio`,description:`Transcribe an audio file from the output directory and summarize its key points.`,category:`Audio`,prompt:`Find an audio file in the output directory (output/speech by default), transcribe it, provide the full transcript, and then summarize the key points as a list. If the directory is empty or transcription is unavailable, explain that and try to complete the task with the capabilities available.`},"video-generate":{title:`Text to video`,description:`Generate a sample short video.`,category:`Video`,prompt:"Use bl's video generation capability (such as `bl video generate`) to create a sample short video: a teenager running along the beach at sunset, cinematic, in slow motion. Save it to the output directory and tell me the file path."},"video-storyboard":{title:`Video storyboard`,description:`Create a storyboard suitable for text-to-video generation.`,category:`Video`,prompt:`Create a storyboard for a 15-30 second short video themed The first cup of coffee in the city at dawn. For each shot, provide the visual description, duration, subtitles or narration, and an English prompt ready for text-to-video generation.`},"media-prompt-craft":{title:`Multimodal prompts`,description:`Expand a sample idea into image, video, and speech prompts.`,category:`Multimodal`,prompt:`Expand the idea A night market in a futuristic cyber city into three high-quality generation prompts: 1) text to image, 2) text to video, and 3) speech style. Provide each prompt in both Chinese and English, with brief parameter recommendations.`},"image-story-narration":{title:`Image narration`,description:`Write narration for an image in the output directory.`,category:`Multimodal`,prompt:`Pick an image from the output directory (output/images by default) and write an engaging English narration of about 60 seconds. Then provide a plain-text version ready for speech synthesis. If the directory is empty, say so.`},"summarize-project":{title:`Summarize this project`,description:`Read the current directory and summarize its architecture, stack, and main modules.`,category:`Code`,prompt:`Inspect the project structure and key source files in the current working directory, then concisely summarize: 1) what it does, 2) its technology stack, 3) its main modules and their responsibilities, and 4) notable design choices. Inspect the code before drawing conclusions; do not guess.`},"write-tests":{title:`Add tests for a core module`,description:`Choose an under-tested core module and add unit tests.`,category:`Code`,prompt:`Choose a core module in the current project that has no tests or weak coverage. Add comprehensive unit tests for its main branches and edge cases, following the project's existing test framework and style. Read the relevant files and dependencies before writing tests.`},"code-review":{title:`Code review`,description:`Review core project code and identify concrete improvements.`,category:`Code`,prompt:`Review the current project's core source code for potential bugs, security risks, performance issues, and maintainability problems. Give specific, actionable recommendations ordered by severity. Inspect the project structure and select the key files before reviewing them.`},"explain-code":{title:`Explain core code`,description:`Choose an entry point or core module and explain how it works.`,category:`Code`,prompt:`Choose the current project's entry point or a core module and explain its responsibilities, key execution flow, and dependencies. Use clear English and include the call relationships when useful.`},"generate-readme":{title:`Generate README`,description:`Generate a clear README.md that matches the implementation.`,category:`Documentation`,prompt:`Generate a clear README.md for the project in the current working directory. Include an overview, installation steps, usage examples, and a directory structure guide. Read the existing source code and configuration first; the content must match the actual implementation.`}};function Mu(e){return e===`zh-CN`?Au.map(e=>({...e})):Au.map(e=>({...e,...ju[e.id]}))}function Nu(e,t){return Mu(t).find(t=>t.id===e)}function Pu(e,t){return e.prompt.replace(/\{\{(\w+)\}\}/g,(e,n)=>{let r=t[n];return typeof r==`string`?r.trim():``})}const Fu=/* @__PURE__ */ new Uint8Array(512),Iu=/* @__PURE__ */ new Uint8Array(256);(()=>{let e=1;for(let t=0;t<255;t++)Fu[t]=e,Iu[e]=t,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)Fu[e]=Fu[e-255]})();function Lu(e,t){return e===0||t===0?0:Fu[Iu[e]+Iu[t]]}function Ru(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]^=Lu(t[r],Fu[n]);t=e}return t.map(e=>Iu[e])}function zu(e,t){let n=Ru(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=Iu[e];for(let e=0;e<n.length;e++)r[t+e]^=Fu[(n[e]+i)%255]}}return Array.from(r.slice(e.length))}const Bu=[[19,7],[34,10],[55,15],[80,20],[108,26]];function Vu(e){let t=12+e*8;for(let e=0;e<Bu.length;e++)if(Bu[e][0]*8>=t)return e+1;throw Error(`qr: data too large for supported versions (max 108 bytes)`)}function Hu(e,t){let[n]=Bu[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(zu(o,Bu[t-1][1]))}function Uu(e){return{size:e,mod:new Uint8Array(e*e),fn:new Uint8Array(e*e)}}function Wu(e,t,n,r){e.mod[t*e.size+n]=r,e.fn[t*e.size+n]=1}function Gu(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||Wu(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 Ku(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));Wu(e,t+r,n+i,a===1?0:1)}}function qu(e,t){let n=e.size;for(let t=0;t<n;t++)Wu(e,6,t,+(t%2==0)),Wu(e,t,6,+(t%2==0));if(Gu(e,0,0),Gu(e,0,n-7),Gu(e,n-7,0),t>=2){let t=n-7;Ku(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;Wu(e,n-8,8,1)}function Ju(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 Yu=[(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 Xu(e,t){let n=Yu[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 Zu(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 Qu(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 $u(e,t){let n=e.size,r=Qu(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 ed(e){let t=new TextEncoder().encode(e),n=Vu(t.length),r=Hu(t,n),i=Uu(17+4*n);qu(i,n),Ju(i,r);let a=0,o=1/0;for(let e=0;e<8;e++){Xu(i,e),$u(i,e);let t=Zu(i);t<o&&(o=t,a=e),Xu(i,e)}Xu(i,a),$u(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 td(e){let t=ed(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 nd(e){let{identity:t,settings:n,authStore:r,localize:i}=e;return{status(){let e=r.describe(),t={apiKey:!!e.apiKey,console:!!e.console,openapi:!!e.openapi},n;e.console?n=Zt(e.console.token):e.apiKey?n=Zt(e.apiKey.token):e.openapi&&(n=Zt(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=as(r.describe().console?.site),a=!!r.stored().apiKey;bs(e,{identity:t,settings:n,authStore:r,localize:i},{needApiKey:!a}).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 rd={".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`},id={".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 ad(e=Fi()){return N(e,`bailian-output`)}function od(e){return rd[e.toLowerCase()]??`other`}function sd(e){return id[e.toLowerCase()]??`application/octet-stream`}function cd(e,t,n){let r;try{r=Ei(e,{withFileTypes:!0})}catch{return}for(let i of r){let r=N(e,i.name);i.isDirectory()?t>0&&cd(r,t-1,n):(i.isFile()||i.isSymbolicLink())&&n.push(r)}}function ld(e=ad()){let t=[];if(!M(e))return{base:e,assets:t};let n=[];cd(e,8,n);for(let r of n){let n;try{n=Di(r)}catch{continue}if(!n.isFile())continue;let i=Ni(e,r),a=i.split(Pi),o=a.length>1?a[0]:`other`,s=Mi(r);t.push({name:r.split(Pi).pop()??r,category:o,kind:od(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 ud(e,t){if(typeof t!=`string`||t.length===0)return null;let n=P(e),r=P(n,t);return r!==n&&!r.startsWith(n+Pi)?null:r}const dd={port:{type:`number`,valueHint:`<port>`,description:{"en-US":`Port to listen on (default: random free port)`,"zh-CN":`监听端口(默认:随机可用端口)`}},noOpen:{type:`switch`,description:{"en-US":`Do not open the browser automatically`,"zh-CN":`不自动打开浏览器`}}};function fd(e){return e instanceof n||e instanceof Error?e.message:String(e)}function R(e,t,n){e.writeHead(t,{"Content-Type":`application/json; charset=utf-8`}),e.end(JSON.stringify(n))}function pd(e){return e.read().language??l}function md(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,t=>{if(r+=t.length,r>1048576){n(/* @__PURE__ */ Error(`payload too large`)),e.destroy();return}i.push(t)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function hd(e,t){return new Promise((n,r)=>{let i=0,a=[];e.on(`data`,n=>{if(i+=n.length,i>t){r(/* @__PURE__ */ Error(`payload too large`)),e.destroy();return}a.push(n)}),e.on(`end`,()=>n(Buffer.concat(a))),e.on(`error`,r)})}function gd(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&oi(n,r)}function _d(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):Array.isArray(r)&&(e=JSON.stringify(r)),e!==``&&(t[Ic(n)]=Rc(n,e))}return t}function vd(e,t){let n=new Set(Ac),r={};for(let[t,i]of Object.entries(e))n.has(t)||(r[t]=i);return{...r,...t}}function yd(e,t,n=ad(),r){let i=null,a=()=>i===null?pd(t):En(i==="default"?void 0:i).language??l;return si.createServer(async(o,s)=>{try{let c=(o.headers.host||``).split(`:`)[0];if(c!==`127.0.0.1`&&c!==`localhost`){s.writeHead(403,{"Content-Type":`text/plain; charset=utf-8`}),s.end(`forbidden host
2722
+ `);return}let l=new URL(o.url??`/`,`http://127.0.0.1`);if(!gd(l.searchParams.get(`token`),e)){s.writeHead(401,{"Content-Type":`text/plain; charset=utf-8`}),s.end(`unauthorized
2723
+ `);return}let u=o.method??`GET`,d=l.pathname;if(d===`/`&&u===`GET`){s.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'`}),s.end(Kc(a()));return}if(d===`/api/qr`&&u===`GET`){let e=(l.searchParams.get(`data`)??``).slice(0,512);if(!e){R(s,400,{error:`missing data`});return}try{let t=td(e);s.writeHead(200,{"Content-Type":`image/svg+xml; charset=utf-8`,"Cache-Control":`no-store`}),s.end(t)}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/config`&&u===`GET`){let e=t.profiles();R(s,200,{configFile:t.path,keys:Ac,secretKeys:[...Oc],enums:jc,booleanKeys:[...Mc],fieldDefaults:{...Nc,base_url:b.cn,output_dir:ad(),timeout:`300`},modelCatalog:Pc,activeProfile:e.active,default:e.default,named:e.named});return}if(d===`/api/skills`&&u===`GET`){R(s,200,{skills:Zl()});return}if(d===`/api/skill`&&u===`GET`){let e=Ql(l.searchParams.get(`id`)??``);if(!e){R(s,404,{error:`not found`});return}R(s,200,e);return}if(d===`/api/skill/install`&&u===`POST`){let e=l.searchParams.get(`source`)??``,t=l.searchParams.get(`name`)??``;try{R(s,200,nu(e,await hd(o,25165824),t))}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/mcp`&&u===`GET`){R(s,200,{servers:au()});return}if(d===`/api/mcp`&&u===`POST`){let e=await md(o),t;try{t=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let n=t,r=typeof n.source==`string`?n.source:``,i=typeof n.scope==`string`&&n.scope?n.scope:`global`,a=typeof n.name==`string`?n.name:``;try{du(r,i,a,n.config),R(s,200,{saved:a.trim()})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/mcp`&&u===`DELETE`){let e=l.searchParams.get(`source`)??``,t=l.searchParams.get(`scope`)||`global`,n=l.searchParams.get(`name`)??``;try{fu(e,t,n),R(s,200,{deleted:n})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/health`&&u===`GET`){let e=Number(process.versions.node.split(`.`)[0]);R(s,200,{node:process.version,nodeOk:Number.isFinite(e)&&e>=18,platform:process.platform,cwd:process.cwd()});return}if(d===`/api/agents`&&u===`GET`){let e=mu(),t=await Promise.all(e.map(e=>Eu(e.id)));R(s,200,{agents:e.map((e,n)=>({...e,launchable:t[n],dispatchable:t[n]&&wu(e.id)}))});return}if(d===`/api/agent`&&u===`GET`){let e=bu(l.searchParams.get(`id`)??``);if(!e){R(s,404,{error:`not found`});return}R(s,200,e);return}if(d===`/api/agent/open`&&u===`POST`){let e=bu(l.searchParams.get(`id`)??``),t=l.searchParams.get(`path`)??``,n=e?.settings.some(e=>e.path===t)??!1;if(!e||!n||!M(t)){R(s,404,{error:`not found`});return}try{await es(t),R(s,200,{opened:t})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/scenarios`&&u===`GET`){let e=mu(),t=await Promise.all(e.map(e=>Eu(e.id))),n=e.map((e,n)=>({id:e.id,label:e.label,dispatchable:t[n]&&wu(e.id)})).filter(e=>e.dispatchable);R(s,200,{scenarios:Mu(a()),agents:n});return}if(d===`/api/auth/status`&&u===`GET`){R(s,200,r?r.status():{authenticated:!1,methods:{apiKey:!1,console:!1,openapi:!1},primary:null});return}if(d===`/api/auth/login`&&u===`POST`){if(!r){R(s,400,{error:`login unavailable`});return}r.startConsoleLogin(),R(s,200,{started:!0});return}if(d===`/api/auth/logout`&&u===`POST`){if(!r){R(s,400,{error:`logout unavailable`});return}try{R(s,200,{loggedOut:await r.logout()})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/assets`&&u===`GET`){R(s,200,ld(n));return}if(d===`/api/asset/file`&&u===`GET`){let e=ud(n,l.searchParams.get(`path`)??``),t=e&&M(e)?Di(e):null;if(!e||!t||!t.isFile()){R(s,404,{error:`not found`});return}s.writeHead(200,{"Content-Type":sd(Mi(e)),"Content-Length":t.size,"Cache-Control":`no-store`});let r=Si(e);r.on(`error`,()=>{s.headersSent||s.writeHead(500),s.end()}),r.pipe(s);return}if(d===`/api/asset`&&u===`DELETE`){let e=l.searchParams.get(`path`)??``,t=ud(n,e);if(!t||!M(t)||!Di(t).isFile()){R(s,404,{error:`not found`});return}try{Oi(t),R(s,200,{deleted:e})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/asset/open`&&u===`POST`){let e=l.searchParams.get(`path`)??``,t=ud(n,e);if(!t||!M(t)||!Di(t).isFile()){R(s,404,{error:`not found`});return}try{await es(t),R(s,200,{opened:e})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/agent/launch`&&u===`POST`){try{R(s,200,await ku(l.searchParams.get(`id`)??``))}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/agent/dispatch`&&u===`POST`){let e=await md(o),t;try{t=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let n=t,r=typeof n.agent==`string`?n.agent:``;if(!wu(r)){R(s,400,{error:`agent cannot be dispatched a prompt`});return}let i,c=n.custom;if(c&&typeof c==`object`&&!Array.isArray(c)){let e=c,t=typeof e.prompt==`string`?e.prompt.trim():``;if(!t){R(s,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})}}}i={id:`custom`,title:typeof e.title==`string`&&e.title.trim()?e.title.trim():`Custom`,description:``,category:`自定义`,prompt:t,inputs:n}}else i=typeof n.scenario==`string`?Nu(n.scenario,a()):void 0;if(!i){R(s,400,{error:`unknown scenario`});return}let l={};if(n.values&&typeof n.values==`object`&&!Array.isArray(n.values))for(let[e,t]of Object.entries(n.values))typeof t==`string`&&(l[e]=t);for(let e of i.inputs??[])if(!l[e.key]||!l[e.key].trim()){R(s,400,{error:`Missing input: ${e.label}`});return}let u=Pu(i,l);try{let e=await ku(r,process.cwd(),u);R(s,200,{launched:!0,agent:r,scenario:i.id,command:e.command})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/active`&&u===`POST`){let e=await md(o),n;try{n=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let r=n;try{let e=await t.activate(r.name);i=e,R(s,200,{activeProfile:e,uiLanguage:a()})}catch(e){R(s,400,{error:fd(e)})}return}if(d===`/api/profile`&&u===`POST`){let e=await md(o),t;try{t=JSON.parse(e)}catch{R(s,400,{error:`invalid JSON body`});return}let n=t;if(!n.data||typeof n.data!=`object`||Array.isArray(n.data)){R(s,400,{error:`missing or invalid 'data'`});return}let r,i;try{r=dn(n.name),i=_d(n.data)}catch(e){R(s,400,{error:fd(e)});return}let c=vd(En(r),i);await Cr(c,r),R(s,200,{saved:c,uiLanguage:a()});return}if(d===`/api/profile`&&u===`DELETE`){try{R(s,200,{deleted:await Fe(l.searchParams.get(`name`)??void 0),activeProfile:t.profiles().active})}catch(e){R(s,400,{error:fd(e)})}return}s.writeHead(404,{"Content-Type":`text/plain; charset=utf-8`}),s.end(`not found
2724
+ `)}catch(e){if(console.error(`[config ui] request failed:`,e),s.headersSent){s.end();return}R(s,500,{error:fd(e)})}})}var bd=w({description:{"en-US":`Open a local web UI to manage config profiles`,"zh-CN":`打开用于管理配置 Profile 的本地 Web UI`},auth:`none`,usageArgs:`[--port <port>] [--no-open]`,flags:dd,exampleArgs:[``,`--port 8787`,`--no-open`],async run(e){let{settings:t,flags:r}=e,i=T(t.output);if(t.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=ii(16).toString(`hex`),o=t.outputDir||ad(),s=yd(a,e.configStore,o,nd(e)),c;try{c=await Zo(s,r.port??0)}catch(e){throw new n(`Could not bind to 127.0.0.1 (no free port or permission denied): ${fd(e)}`,f.USAGE)}let l=`http://127.0.0.1:${c}/?token=${a}`;if(!r.noOpen)try{await ts(l),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 ${l}`),k(`Note: credentials are shown in cleartext in the browser (localhost only).`),k(`Press Ctrl+C to stop.`),await new Promise(e=>{let t=()=>s.close(()=>e());process.once(`SIGINT`,t),process.once(`SIGTERM`,t),s.once(`close`,()=>e())})}});function xd(e,t,n){let r=e[t];(r===void 0||r.trim()===``)&&(e[t]=n)}var Sd={label:`Claude Code`,write({baseUrl:e,apiKey:t,model:n}){let r=process.env.CLAUDE_CONFIG_DIR||xi(Vi(),`.claude`),i=xi(r,`settings.json`),a=xi(Vi(),`.claude.json`),o=[],s=tl(e);s.rewrittenFrom&&o.push(`Rewrote base URL for Claude Code: "${s.rewrittenFrom}" → "${s.url}" (Claude Code needs /apps/anthropic, not OpenAI compatible-mode).`),$c(i);let c=Yc(i),l=c.env??{};l.ANTHROPIC_BASE_URL=s.url,l.ANTHROPIC_AUTH_TOKEN=t,delete l.ANTHROPIC_API_KEY,l.ANTHROPIC_MODEL=n,xd(l,`ANTHROPIC_DEFAULT_HAIKU_MODEL`,n),xd(l,`ANTHROPIC_DEFAULT_SONNET_MODEL`,n),xd(l,`ANTHROPIC_DEFAULT_OPUS_MODEL`,n),xd(l,`CLAUDE_CODE_SUBAGENT_MODEL`,n),c.env=l,Zc(i,c),$c(a);let u=Yc(a);return u.hasCompletedOnboarding=!0,Zc(a,u),{paths:[i,a],nextStep:"Run `claude` to start using Claude Code with DashScope.",warnings:o.length>0?o:void 0}}};const Cd=`DASHSCOPE_API_KEY`;function wd(e){return`[Bailian] ${e}`}function Td(e){if(e.envKey===Cd)return!0;let t=typeof e.name==`string`?e.name:``;return t===`bailian-cli`||t.startsWith(`[Bailian]`)}var Ed={label:`Qwen Code`,write({baseUrl:e,apiKey:t,model:n}){let r=xi(Vi(),`.qwen`,`settings.json`),i=el(e)?`anthropic`:`openai`,a=[];$c(r);let o=Yc(r);o.$version=3;let s=o.env??{};s[Cd]=t,o.env=s;let c=process.env[Cd];c!==void 0&&c!==t&&a.push(`Shell/environment ${Cd} is set and overrides settings.json. Unset it (e.g. \`unset ${Cd}\`) so the key written here takes effect.`);let l=o.modelProviders??{},u=l[i]??[],d=u.find(e=>Td(e)&&e.id===n),f=u.find(e=>!Td(e)&&e.id===n);if(d){d.baseUrl=e,d.envKey=Cd;let t=typeof d.name==`string`?d.name.trim():``;(!t||t===`bailian-cli`)&&(d.name=wd(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:wd(n),baseUrl:e,envKey:Cd});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},Zc(r,o),{paths:[r],nextStep:"Run `qwen` to start using Qwen Code with DashScope.",warnings:a.length>0?a:void 0}}},Dd={label:`OpenCode`,write({baseUrl:e,apiKey:t,model:n}){let r=xi(Vi(),`.config`,`opencode`,`opencode.json`);$c(r);let i=Xc(r);i.$schema||=`https://opencode.ai/config.json`;let a=i.provider??{};return a[`bailian-cli`]={npm:el(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,Zc(r,i),{paths:[r],nextStep:"Run `opencode` then type `/models` to select your model."}}};const Od=`bailian-cli`;function kd(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 Ad={label:`OpenClaw`,write({baseUrl:e,apiKey:t,model:n,contextWindow:r}){let i=xi(Vi(),`.openclaw`,`openclaw.json`),a=[],o=`${Od}/${n}`;$c(i);let s=Yc(i),c=s.models??{};c.mode=`merge`;let l=c.providers??{},u=el(e)?`anthropic-messages`:`openai-completions`;l[Od]={baseUrl:e,apiKey:t,api:u,models:[{id:n,name:n,contextWindow:r??256e3,cost:{input:0,output:0,cacheRead:0,cacheWrite:0}}]},c.providers=l,s.models=c;let d=s.agents??{},f=d.defaults??{},p=f.models??{};p[o]=p[o]??{},f.models=p;let m=kd(f);return m?m.startsWith(`${Od}/`)?f.model={primary:o}:a.push(`Left existing primary model unchanged ("${m}"). Added provider "${Od}" — switch to "${o}" in OpenClaw if you want to use it.`):f.model={primary:o},d.defaults=f,s.agents=d,Zc(i,s),{paths:[i],nextStep:"Run `openclaw gateway restart`, then `openclaw` to start using OpenClaw with DashScope.",warnings:a.length>0?a:void 0}}},jd={label:`Hermes Agent`,write({baseUrl:e,apiKey:t,model:n}){let r=xi(gt(),`config.yaml`);$c(r);let i={};if(fi(r))try{i=Li.parse(mi(r,`utf-8`))??{}}catch{i={}}let a={default:n,provider:`custom`,base_url:e,api_key:t};return el(e)&&(a.api_mode=`anthropic_messages`),i.model=a,Qc(r,Li.stringify(i)),{paths:[r],nextStep:'Run `hermes chat -q "hello"` to verify.'}}};const Md=`bailian-cli`;var Nd={label:`Codex`,write({baseUrl:e,apiKey:t,model:n,wireApi:r}){let i=xi(Vi(),`.codex`,`config.toml`),a=[];$c(i);let o={};if(fi(i))try{o=zi(mi(i,`utf-8`))}catch{o={}}o.model_provider=Md,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??{},l=c[Md]??{};c[Md]={...l,name:Md,base_url:e,env_key:`OPENAI_API_KEY`,wire_api:s,requires_openai_auth:!0},o.model_providers=c,Qc(i,Bi(o)+`
2725
+ `);let u=xi(Vi(),`.codex`,`auth.json`);$c(u);let d=Yc(u);return d.OPENAI_API_KEY=t,Zc(u,d),{paths:[i,u],nextStep:"Run `codex` to start using Codex with DashScope.",warnings:a.length>0?a:void 0}}};const Pd=`bailian-cli`;function Fd(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Id={"claude-code":Sd,"qwen-code":Ed,opencode:Dd,openclaw:Ad,hermes:jd,codex:Nd,pi:{label:`Pi`,write({baseUrl:e,apiKey:t,model:r,localize:i=e=>typeof e==`string`?e:e[`en-US`]}){let a=qc(),o=[`models.json`,`auth.json`,`settings.json`].map(e=>N(a,e)),s=o.map(e=>M(e)?Ti(e,`utf8`):void 0),c=o.map((e,t)=>{try{let e=s[t]?.replace(/^\uFEFF/,``),n=e===void 0?{}:JSON.parse(t===0?Jc(e):e);if(!Fd(n))throw Error(`root value is not an object`);return n}catch{throw new n(i({"en-US":`Cannot update Pi because ${e} is invalid; no configuration was changed.`,"zh-CN":`无法更新 Pi:${e} 格式无效,配置未被修改。`}),f.GENERAL)}}),[l,u,d]=c;if(l.providers!==void 0&&!Fd(l.providers))throw new n(i({"en-US":`Cannot update Pi because models.json providers is not an object; no configuration was changed.`,"zh-CN":`无法更新 Pi:models.json 中的 providers 必须为对象,配置未被修改。`}),f.GENERAL);let p=l.providers??{},m=p[Pd];if(m!==void 0&&(!Fd(m)||m.models!==void 0&&!Array.isArray(m.models)))throw new n(i({"en-US":`Cannot update Pi because the bailian-cli provider is invalid; no configuration was changed.`,"zh-CN":`无法更新 Pi:bailian-cli provider 格式无效,配置未被修改。`}),f.GENERAL);let h=m??{},g=h.models??[],_=g.find(e=>e.id===r),v={..._,id:r,name:_?.name??r};delete v.baseUrl,delete v.api,h.models=_?g.map(e=>e.id===r?v:e):[...g,v],h.baseUrl=e,h.api=el(e)?`anthropic-messages`:`openai-completions`,delete h.apiKey,p[Pd]=h,l.providers=p,u[Pd]={type:`api_key`,key:t},d.defaultProvider=Pd,d.defaultModel=r;for(let[e,t]of o.entries())$c(t),Zc(t,c[e]);return{paths:o,nextStep:i({"en-US":"Run `pi` to start using Pi with DashScope.","zh-CN":"运行 `pi` 开始使用百炼模型。"})}}}},Ld=Object.keys(Id),Rd=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.`,zd=new Map(Rd.split(``).map((e,t)=>[e,t])),Bd=/^[A-Za-z0-9._-]+$/;function Vd(){return new n(`Invalid obfuscated API key.`,f.USAGE,`--key expects the obfuscated key copied from the web console (starts with "o1_").`)}function Hd(e){let t=[];for(let n of e){let e=zd.get(n);if(e===void 0)throw Vd();t.push(e)}return t}function Ud(e){return e.map(e=>Rd[e]).join(``)}function Wd(e,t){return Math.imul((e^t)>>>0,16777619)>>>0}function Gd(e){let t=e>>>0;return t^=t<<13,t^=t>>>17,t^=t<<5,t>>>0}function Kd(e,t,n,r){let i=(2166136261^Math.imul(n+1,2654435761))>>>0;i=Wd(i,e.length),i=Wd(i,r);for(let e of t)i=Wd(i,(zd.get(e)??-1)+1);for(let t of e)i=Wd(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=Gd(i),a.push(i%65);return a}function qd(e,t){let n=Hd(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=Kd(n,t,e,a.length);i=a.map((e,t)=>(e-r[t]+65)%65),a=n}return Ud([...i,...a])}function Jd(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 Yd(e,t){let n=e>>>0,r=Array(t).fill(Rd[0]);for(let e=t-1;e>=0;--e)r[e]=Rd[n%65],n=Math.floor(n/65);if(n!==0)throw Vd();return r.join(``)}function Xd(e){if(e.length!==6||!Bd.test(e))throw Vd()}function Zd(e){if(e.length<16||!e.startsWith(`o1_`))throw Vd();let t=e.slice(3);if(!Bd.test(t))throw Vd();let n=t.slice(0,6),r=t.slice(6,-6),i=t.slice(-6);if(Xd(n),!r)throw Vd();let a=qd(r,n);if(!Bd.test(a)||i!==Yd(Jd(a),6))throw Vd();return a}const Qd={agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Target agent: ${Ld.join(`, `)}`,"zh-CN":`目标 Agent:${Ld.join(`, `)}`},required:!0,choices:Ld},baseUrl:{type:`string`,valueHint:`<url>`,description:{"en-US":`API base URL`,"zh-CN":`API Base URL`}},region:{type:`string`,valueHint:`<region>`,description:{"en-US":`Model Studio region (e.g. cn-beijing, ap-southeast-1); converted into --base-url. Token Plan only`,"zh-CN":`模型服务地域(例如 cn-beijing、ap-southeast-1);将转换为 --base-url。仅用于 Token Plan`}},apiKey:{type:`string`,valueHint:`<key>`,description:{"en-US":`API key`,"zh-CN":`API Key`}},key:{type:`string`,valueHint:`<encoded>`,description:{"en-US":`Obfuscated API key from the web console (starts with "o1_"); decoded into --api-key`,"zh-CN":`来自 Web 控制台的混淆 API Key(以 "o1_" 开头);将解码为 --api-key`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Default model name`,"zh-CN":`默认模型名称`},required:!0},contextWindow:{type:`number`,valueHint:`<tokens>`,description:{"en-US":`OpenClaw only: model context window in tokens (default: 256000)`,"zh-CN":`仅 OpenClaw:模型上下文窗口 Token 数(默认:256000)`}},wireApi:{type:`string`,valueHint:`<api>`,description:{"en-US":`Codex only: wire protocol (default: responses). "chat" only works with legacy Codex <= 0.80.0`,"zh-CN":`仅 Codex:通信协议(默认:responses)。"chat" 仅适用于旧版 Codex <= 0.80.0`},choices:[`chat`,`responses`]}};var $d=w({description:{"en-US":`Configure a coding agent to use DashScope API`,"zh-CN":`配置编程 Agent 使用 DashScope API`},auth:`none`,usageArgs:`--agent <name> (--base-url <url> | --region <region>) (--api-key <key> | --key <encoded>) --model <model>`,flags:Qd,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?nl(n.region):n.baseUrl,c=n.key?Zd(n.key):n.apiKey,l=Id[r],u=T(t.output);if(r===`hermes`&&Hi()===`win32`&&process.stderr.write(`Warning: Hermes Agent does not support native Windows. Please use WSL2.
2726
+ `),t.dryRun){A({agent:r,label:l.label,base_url:s,api_key:Zt(c),model:i},u);return}let d={baseUrl:s,apiKey:c,model:i,contextWindow:a,wireApi:o,localize:e.localize},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 ef=`bl skill update`;function tf(e){process.stderr.write(`
2727
2727
  Updating agent skill...
2728
- `);try{Bi(Zd,{stdio:`inherit`}),process.stderr.write(`${e.green(`✓ Agent skill updated.`)}\n`)}catch{process.stderr.write(`${e.yellow(`Agent skill update skipped. Run manually: ${Zd}`)}\n`)}}function $d(e){try{let t=vi(dt(),`update-state.json`);mi(t,JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}async function ef(e,t){return e===`binary`?await Ir(`latest`,5e3)??await Lr(5e3,t):Lr(5e3,t)}function tf(){return process.platform===`win32`?` irm ${s} | iex\n`:` curl -fsSL ${c} | bash\n`}var nf=w({description:{"en-US":`Update the CLI to the latest or a specified version`,"zh-CN":`将 CLI 更新到最新版本或指定版本`},auth:`none`,usageArgs:`[--to <version>]`,flags:{to:{type:`string`,valueHint:`<version>`,description:{"en-US":`Install this exact version instead of the latest`,"zh-CN":`安装指定版本,而不是最新版本`}}},exampleArgs:[``,`--to 0.1.14`],validate(e){if(e.to!==void 0){if(!e.to.trim())return`--to requires a non-empty version`;if(!Hr(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:t}=e,r=t.npmPackage,i=t.binName,a=t.version,o=O(process.stderr),s=St(t),c=e.flags.to?.trim(),l=c?Wr(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...
2729
- `),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 ef(s,r);if(!u)throw new n(`Could not determine the latest version.`,f.GENERAL,`Check network access, or pass --to <version>.`);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`&&Qd(o);return}if(l?process.stderr.write(`
2728
+ `);try{Ui(ef,{stdio:`inherit`}),process.stderr.write(`${e.green(`✓ Agent skill updated.`)}\n`)}catch{process.stderr.write(`${e.yellow(`Agent skill update skipped. Run manually: ${ef}`)}\n`)}}function nf(e){try{let t=xi(dt(),`update-state.json`);_i(t,JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}async function rf(e,t){return e===`binary`?await zr(`latest`,5e3)??await Br(5e3,t):Br(5e3,t)}function af(){return process.platform===`win32`?` irm ${s} | iex\n`:` curl -fsSL ${c} | bash\n`}var of=w({description:{"en-US":`Update the CLI to the latest or a specified version`,"zh-CN":`将 CLI 更新到最新版本或指定版本`},auth:`none`,usageArgs:`[--to <version>]`,flags:{to:{type:`string`,valueHint:`<version>`,description:{"en-US":`Install this exact version instead of the latest`,"zh-CN":`安装指定版本,而不是最新版本`}}},exampleArgs:[``,`--to 0.1.14`],validate(e){if(e.to!==void 0){if(!e.to.trim())return`--to requires a non-empty version`;if(!Gr(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:t}=e,r=t.npmPackage,i=t.binName,a=t.version,o=O(process.stderr),s=St(t),c=e.flags.to?.trim(),l=c?qr(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...
2729
+ `),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 rf(s,r);if(!u)throw new n(`Could not determine the latest version.`,f.GENERAL,`Check network access, or pass --to <version>.`);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`&&tf(o);return}if(l?process.stderr.write(`
2730
2730
  `):process.stderr.write(`Latest version: ${o.green(u)}\n\n`),s===`binary`){process.stderr.write(`Updating via binary channel...
2731
2731
 
2732
- `);try{let e=await Gr(u);process.stderr.write(`\n${o.green(`\u2713 Update complete: ${a} \u2192 ${e}`)}\n`),$d(e),Qd(o)}catch(e){let t=e instanceof n&&e.hint?e.hint.replace(/^Re-run:\s*/i,``):tf().trim();throw new n(`Automatic binary update failed.`,f.GENERAL,`Re-run the install script:\n ${t}`,{cause:e})}return}let d=`npm install -g ${l?`${r}@${l}`:`${r}@latest`}`;process.stderr.write(`Updating ${r} via npm...\n\n`);try{Bi(d,{stdio:`inherit`});try{let e=Bi(`${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`),$d(e)}catch{process.stderr.write(`\n${o.green(`✓ Update complete.`)}\n`)}Qd(o)}catch(e){throw new n(`Automatic update failed.`,f.GENERAL,`Please run manually:\n ${d}`,{cause:e})}}}),rf=w({description:{"en-US":`Call a Bailian application (agent or workflow)`,"zh-CN":`调用百炼应用(智能体或工作流)`},auth:`apiKey`,usageArgs:`--app-id <id> --prompt <text> [flags]`,flags:{appId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Application ID (required)`,"zh-CN":`应用 ID(必填)`},required:!0},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Input prompt text`,"zh-CN":`输入提示词文本`},required:!0},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL(s) to pass to the app (repeatable)`,"zh-CN":`传给应用的图片 URL(可重复)`}},fileId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Pre-uploaded file ID(s) (repeatable)`,"zh-CN":`已上传的文件 ID(可重复)`}},sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID for multi-turn conversation`,"zh-CN":`多轮对话的 Session ID`}},stream:{type:`switch`,description:{"en-US":`Stream response (default: on in TTY)`,"zh-CN":`流式输出响应(TTY 中默认开启)`}},pipelineIds:{type:`string`,valueHint:`<ids>`,description:{"en-US":`Knowledge base pipeline IDs (comma-separated)`,"zh-CN":`知识库 Pipeline ID(以逗号分隔)`}},memoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory ID for long-term memory`,"zh-CN":`长期记忆使用的 Memory ID`}},bizParams:{type:`string`,valueHint:`<json>`,description:{"en-US":`Business parameters JSON (workflow variables)`,"zh-CN":`业务参数 JSON(工作流变量)`}},hasThoughts:{type:`switch`,description:{"en-US":`Show agent thinking process`,"zh-CN":`显示智能体思考过程`}}},exampleArgs:[{"en-US":`--app-id abc123 --prompt "Hello"`,"zh-CN":`--app-id abc123 --prompt "你好"`},{"en-US":`--app-id abc123 --prompt "Describe this image" --image https://example.com/photo.jpg`,"zh-CN":`--app-id abc123 --prompt "描述这张图片" --image https://example.com/photo.jpg`},{"en-US":`--app-id abc123 --prompt "Analyze the image" --image img1.jpg --image img2.jpg`,"zh-CN":`--app-id abc123 --prompt "分析这些图片" --image img1.jpg --image img2.jpg`},{"en-US":`--app-id abc123 --prompt "Continue" --session-id sess_xxx --stream`,"zh-CN":`--app-id abc123 --prompt "继续" --session-id sess_xxx --stream`},{"en-US":`--app-id abc123 --prompt "Search for materials" --pipeline-ids pipe1,pipe2`,"zh-CN":`--app-id abc123 --prompt "搜索资料" --pipeline-ids pipe1,pipe2`},{"en-US":`--app-id abc123 --prompt "Start" --biz-params '{"key":"value"}'`,"zh-CN":`--app-id abc123 --prompt "开始" --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 C(`--biz-params must be valid JSON`)}if(t.dryRun){A({endpoint:e.client.url(se(r)),request:s},o);return}if(a){let i=await e.client.request({path:se(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 mn(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(`
2733
- `)}else{let n=await e.client.requestJson({path:se(r),method:`POST`,body:s}),i=n.output?.text??``;t.quiet||o===`text`?k(i):A(n,o)}}});const af=`zeldaEasy.broadscope-bailian.app-control.list`;var of=w({description:{"en-US":`List Bailian applications`,"zh-CN":`列出百炼应用`},auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by app name (keyword search)`,"zh-CN":`按应用名称筛选(关键词搜索)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 30)`,"zh-CN":`每页结果数(默认:30)`}}},exampleArgs:[``,{"en-US":`--name customer service`,"zh-CN":`--name 客户服务`},`--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:af,data:s},o);return}let c=await e.client.console(af,s),l=c?.data?.DataV2?.data?.data?.list??[],u=c?.data?.DataV2?.data?.data?.total??0,d=l.map(e=>({code:e.code,name:e.name,user_prompt_params:e.config?.user_prompt_params??[]}));A({total:u,apps:d},o)}}),sf=w({description:{"en-US":`Add memory from messages or custom content`,"zh-CN":`从消息或自定义内容添加记忆`},auth:`apiKey`,usageArgs:`--user-id <id> [--messages <json>] [--content <text>] [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`User ID (required)`,"zh-CN":`用户 ID(必填)`},required:!0},messages:{type:`string`,valueHint:`<json>`,description:{"en-US":`Messages JSON array: [{"role":"user","content":"..."},...]`,"zh-CN":`消息 JSON 数组:[{"role":"user","content":"..."},...]`}},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`Custom content text to memorize`,"zh-CN":`要记忆的自定义内容文本`}},profileSchema:{type:`string`,valueHint:`<id>`,description:{"en-US":`Profile schema ID for user profiling`,"zh-CN":`用于用户画像的 Profile Schema ID`}},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory library ID (isolate memory space)`,"zh-CN":`记忆库 ID(用于隔离记忆空间)`}}},exampleArgs:[{"en-US":`--user-id user1 --content "The user likes Python programming"`,"zh-CN":`--user-id user1 --content "用户喜欢使用 Python 编程"`},{"en-US":`--user-id user1 --messages '[{"role":"user","content":"I like traveling"}]'`,"zh-CN":`--user-id user1 --messages '[{"role":"user","content":"我喜欢旅行"}]'`},{"en-US":`--user-id user1 --content "Lives in Beijing" --profile-schema schema_xxx`,"zh-CN":`--user-id user1 --content "居住在北京" --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 C(`--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(tn()),request:r},i);return}let a=await e.client.requestJson({path:tn(),method:`POST`,body:r});if(t.quiet||i===`text`){let e=a.memory_ids?.join(`, `)||`none`;k(`Memory added. IDs: ${e}`)}else A(a,i)}}),cf=w({description:{"en-US":`Search memory nodes by query or messages`,"zh-CN":`通过查询文本或消息搜索记忆节点`},auth:`apiKey`,usageArgs:`--user-id <id> [--query <text>] [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`User ID (required)`,"zh-CN":`用户 ID(必填)`},required:!0},query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Search query text`,"zh-CN":`搜索查询文本`}},messages:{type:`string`,valueHint:`<json>`,description:{"en-US":`Messages JSON array for context-based search`,"zh-CN":`用于上下文搜索的消息 JSON 数组`}},topK:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of results to return (default: 10)`,"zh-CN":`返回结果数量(默认:10)`}},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory library ID`,"zh-CN":`记忆库 ID`}}},exampleArgs:[{"en-US":`--user-id user1 --query "programming preferences"`,"zh-CN":`--user-id user1 --query "编程偏好"`},{"en-US":`--user-id user1 --messages '[{"role":"user","content":"recommend a book"}]' --top-k 5`,"zh-CN":`--user-id user1 --messages '[{"role":"user","content":"推荐一本书"}]' --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 C(`--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(an()),request:r},i);return}let a=await e.client.requestJson({path:an(),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)}}),lf=w({description:{"en-US":`List memory nodes for a user`,"zh-CN":`列出用户的记忆节点`},auth:`apiKey`,usageArgs:`--user-id <id> [flags]`,flags:{userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`User ID (required)`,"zh-CN":`用户 ID(必填)`},required:!0},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10)`,"zh-CN":`每页结果数(默认:10)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory library ID`,"zh-CN":`记忆库 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=`${nn()}?${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)}}),uf=w({description:{"en-US":`Update a memory node content`,"zh-CN":`更新记忆节点内容`},auth:`apiKey`,usageArgs:`--node-id <id> --user-id <id> --content <text>`,flags:{nodeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory node ID (required)`,"zh-CN":`记忆节点 ID(必填)`},required:!0},userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`User ID (required)`,"zh-CN":`用户 ID(必填)`},required:!0},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`New content for the memory node (required)`,"zh-CN":`记忆节点的新内容(必填)`},required:!0},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory library ID (non-default library)`,"zh-CN":`记忆库 ID(非默认记忆库)`}}},exampleArgs:[{"en-US":`--node-id node_xxx --user-id user1 --content "updated memory content"`,"zh-CN":`--node-id node_xxx --user-id user1 --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(rn(r)),method:`PATCH`,request:i},a);return}let o=await e.client.requestJson({path:rn(r),method:`PATCH`,body:i});t.quiet||a===`text`?k(`Memory node ${r} updated.`):A(o,a)}}),df=w({description:{"en-US":`Delete a memory node`,"zh-CN":`删除记忆节点`},auth:`apiKey`,usageArgs:`--node-id <id> --user-id <id>`,flags:{nodeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory node ID (required)`,"zh-CN":`记忆节点 ID(必填)`},required:!0},userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`User ID (required)`,"zh-CN":`用户 ID(必填)`},required:!0},memoryLibraryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory library ID (non-default library)`,"zh-CN":`记忆库 ID(非默认记忆库)`}}},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=`${rn(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)}}),ff=w({description:{"en-US":`Create a user profile schema for memory profiling`,"zh-CN":`创建用于记忆画像的用户 Profile Schema`},auth:`apiKey`,usageArgs:`--name <name> --attributes <json> [flags]`,flags:{name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Schema name (required)`,"zh-CN":`Schema 名称(必填)`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Schema description`,"zh-CN":`Schema 描述`}},attributes:{type:`string`,valueHint:`<json>`,description:{"en-US":`Attributes JSON array: [{"name":"age","description":"age"}]`,"zh-CN":`属性 JSON 数组:[{"name":"age","description":"age"}]`},required:!0}},exampleArgs:[{"en-US":`--name "user_basic" --attributes '[{"name":"age","description":"age"},{"name":"hobby","description":"hobby"}]'`,"zh-CN":`--name "user_basic" --attributes '[{"name":"age","description":"年龄"},{"name":"hobby","description":"爱好"}]'`}],async run(e){let{settings:t,flags:n}=e,r=n.name,i=n.attributes,a;try{a=JSON.parse(i)}catch{throw new C(`--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(bn()),request:o},s);return}let c=await e.client.requestJson({path:bn(),method:`POST`,body:o});t.quiet||s===`text`?k(`Profile schema created: ${c.profile_schema_id}`):A(c,s)}}),pf=w({description:{"en-US":`Get user profile by schema ID and user ID`,"zh-CN":`通过 Schema ID 和用户 ID 获取用户画像`},auth:`apiKey`,usageArgs:`--schema-id <id> --user-id <id>`,flags:{schemaId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Profile schema ID (required)`,"zh-CN":`Profile Schema ID(必填)`},required:!0},userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`User ID (required)`,"zh-CN":`用户 ID(必填)`},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=`${mr(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)}}),mf=w({description:{"en-US":"Retrieve from a Bailian knowledge base (deprecated, use `search` instead)","zh-CN":"从百炼知识库检索(已废弃,请改用 `search`)"},auth:`apiKey`,usageArgs:`--index-id <id> --query <text> [flags]`,flags:{indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base index ID (required)`,"zh-CN":`知识库索引 ID(必填)`},required:!0},query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Search query (required)`,"zh-CN":`搜索查询(必填)`},required:!0},denseSimilarityTopK:{type:`number`,valueHint:`<n>`,description:{"en-US":`Dense retrieval top K`,"zh-CN":`稠密检索 Top K`}},sparseSimilarityTopK:{type:`number`,valueHint:`<n>`,description:{"en-US":`Sparse retrieval top K`,"zh-CN":`稀疏检索 Top K`}},rerank:{type:`switch`,description:{"en-US":`Enable reranking`,"zh-CN":`启用重排序`}},rerankTopN:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rerank top N results`,"zh-CN":`重排序前 N 个结果`}},rerankModel:{type:`string`,valueHint:`<name>`,description:{"en-US":`Rerank model, e.g. qwen3-rerank-hybrid`,"zh-CN":`重排序模型,例如 qwen3-rerank-hybrid`}},rerankMode:{type:`string`,valueHint:`<mode>`,description:{"en-US":`Rerank mode: qa, similar, or custom`,"zh-CN":`重排序模式:qa、similar 或 custom`}},rerankInstruct:{type:`string`,valueHint:`<text>`,description:{"en-US":`Custom rerank instruction, when mode=custom`,"zh-CN":`自定义重排序指令,仅在 mode=custom 时使用`}},topK:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of results (deprecated, use --rerank-top-n)`,"zh-CN":`结果数量(已废弃,请使用 --rerank-top-n)`}}},notes:[{"en-US":`--rerank-model requires the target knowledge base to already have a rerank model configured; otherwise every value is rejected.`,"zh-CN":`--rerank-model 要求目标知识库已配置重排序模型,否则任何取值都会被拒绝。`}],exampleArgs:[{"en-US":`--index-id idx_xxx --query "How to use Alibaba Cloud Bailian"`,"zh-CN":`--index-id idx_xxx --query "如何使用阿里云百炼"`},{"en-US":`--index-id idx_xxx --query "RAG retrieval" --rerank --rerank-model qwen3-rerank-hybrid`,"zh-CN":`--index-id idx_xxx --query "RAG 检索" --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.
2734
- `),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(It()),request:i},r);return}let a=await e.client.requestJson({path:It(),method:`POST`,body:i}),o=a.data?.nodes||[];t.quiet||r===`text`?hf(o.map(e=>({text:e.text,score:e.score}))):A(a,r)}});function hf(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 z={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`,"zh-CN":`API Endpoint URL 使用的 Workspace ID(也可设置 BAILIAN_WORKSPACE_ID)`}}},gf={pageNumber:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size per request`,"zh-CN":`每次请求的分页大小`}}};function B(e){let t=e.flags.workspaceId||e.settings.workspaceId;if(!t)throw new n(`Workspace ID is required.`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>`);return t}function _f(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 vf(e){return e.data?.ingestion_status??`UNKNOWN`}function yf(e){return(e.data?.rows??[]).filter(e=>[e.code,e.status].some(e=>typeof e==`string`&&e.includes(`FAILED`)))}function bf(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 xf(e,t){let n=e.data?.rows??[],r=yf(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 Sf(e,t,n){let r=new URL(D(e,y.indexJobStatus));return r.searchParams.set(`index_id`,t),r.searchParams.set(`job_id`,n),r}async function Cf(e,t,n){return Kr(e,t,{url:n.statusUrl,intervalSec:n.intervalSec,timeoutSec:t.timeout,isComplete:e=>{let t=e;return vf(t)===`COMPLETED`||bf(t)},isFailed:()=>!1,getStatus:e=>{let t=e,n=vf(t),r=yf(t).length,i=t.data?.total_count;return typeof i==`number`&&i>0?`${n} (${r}/${i} failed)`:r>0?`${n} (${r} failed)`:n}})}function wf(e,t){return!(e instanceof n)||e.hint?e:new n(e.message,e.exitCode,t,{cause:e,api:e.api,rawResponse:e.rawResponse})}function Tf(e,t){let n=e.data?.[t];if(typeof n==`string`)return n;let r=e[t];return typeof r==`string`?r:void 0}const Ef={query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Search query text (required, cannot be empty)`,"zh-CN":`搜索查询文本(必填且不能为空)`},required:!0},agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Retrieval service ID (find in console knowledge retrieval page)`,"zh-CN":`检索服务 ID(可在控制台知识库检索页面查看)`},required:!0},...z,agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Service version to call: beta (draft for debugging) or a published number; default is the latest published version`,"zh-CN":`要调用的服务版本:beta(用于调试的草稿)或已发布版本号;默认使用最新发布版本`}},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL for multimodal retrieval (repeatable)`,"zh-CN":`多模态检索使用的图片 URL(可重复)`}}};var Df=w({description:{"en-US":`Search a Bailian knowledge base (RAG semantic retrieval)`,"zh-CN":`搜索百炼知识库(RAG 语义检索)`},auth:`apiKey`,usageArgs:`--query <text> --agent-id <id> [flags]`,flags:Ef,notes:[{"en-US":`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.`,"zh-CN":`检索范围与策略(多索引权重、路由、重排序等)由 agent_id 服务配置决定。仅 query 和 agent_id 必填。`},{"en-US":`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。可在控制台 API Key 页面获取。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或 `kscli config set workspace_id <id>` 设置。"},{"en-US":"`--agent-version beta` calls the draft config for debugging before it is deployed.","zh-CN":"`--agent-version beta` 会调用尚未部署的草稿配置,便于发布前调试。"}],exampleArgs:[{"en-US":`--query "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--query "什么是 RAG?" --agent-id aid-xxx --workspace-id ws-xxx`},{"en-US":`--api-key $DASHSCOPE_API_KEY --query "test search" --agent-id aid-xxx --workspace-id ws-xxx --image https://example.com/img.jpg`,"zh-CN":`--api-key $DASHSCOPE_API_KEY --query "测试搜索" --agent-id aid-xxx --workspace-id ws-xxx --image https://example.com/img.jpg`}],async run(e){let{settings:t,flags:n}=e,r=B(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=Lt(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 Of={message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Message text (repeatable). Supports role:content prefix to set role (e.g. user:hello), defaults to user. Follows OpenAI message format`,"zh-CN":`消息文本(可重复)。支持使用 role:content 前缀指定角色(例如 user:hello),默认为 user。遵循 OpenAI 消息格式`}},agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Q&A service ID (find in console knowledge Q&A page)`,"zh-CN":`问答服务 ID(可在控制台知识库问答页面查看)`},required:!0},...z,agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Service version to call: beta (draft for debugging) or a published number; default is the latest published version`,"zh-CN":`要调用的服务版本:beta(用于调试的草稿)或已发布版本号;默认使用最新发布版本`}},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL (repeatable). Attached to the last user message as multimodal content`,"zh-CN":`图片 URL(可重复)。将作为多模态内容附加到最后一条用户消息`}}};function kf(e){let t=[];if(e.message){let n=/* @__PURE__ */ 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 Af(e){for(let t of e)if(Array.isArray(t.content)&&t.content.some(e=>e.type===`image_url`))return!0;return!1}function jf(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 Mf={tool_calling:`🔍 Retrieving...`,plan_start:`🤔 Planning...`,generation_start:`✍️ Generating...`};var Nf=w({description:{"en-US":`Chat with a Bailian knowledge base (RAG Q&A with streaming)`,"zh-CN":`与百炼知识库对话(支持流式输出的 RAG 问答)`},auth:`apiKey`,usageArgs:`--message <text> --agent-id <id> [flags]`,flags:Of,notes:[{"en-US":`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.`,"zh-CN":`响应以 SSE 流事件返回。事件生命周期:tool_calling → tool_return → plan_start → planning → plan_end → generation_start → generating → generation_end。tool_calling → tool_return 可能循环多次。`},{"en-US":`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。可在控制台 API Key 页面获取。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或 `kscli config set workspace_id <id>` 设置。"},{"en-US":`Multi-turn: use --message "user:..." and --message "assistant:..." to pass conversation history.`,"zh-CN":`多轮对话:使用 --message "user:..." 和 --message "assistant:..." 传入对话历史。`},{"en-US":"`--agent-version beta` calls the draft config for debugging before it is deployed.","zh-CN":"`--agent-version beta` 会调用尚未部署的草稿配置,便于发布前调试。"}],exampleArgs:[{"en-US":`--message "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--message "什么是 RAG?" --agent-id aid-xxx --workspace-id ws-xxx`},{"en-US":`--message "user:What is RAG?" --message "assistant:RAG is..." --message "How does it work?" --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--message "user:什么是 RAG?" --message "assistant:RAG 是……" --message "它是如何工作的?" --agent-id aid-xxx --workspace-id ws-xxx`},{"en-US":`--message "Describe these images" --image https://example.com/a.png --image https://example.com/b.png --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--message "描述这些图片" --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:t,flags:r}=e,i=kf(r),a=r.image,o=!!a&&a.length>0;i.length===0&&o&&(i=[{role:`user`,content:``}]);let s=B(e),c=T(t.output),l=c===`text`&&!!process.stdout.isTTY;if(o){if(Af(i))throw new n(`Cannot use --image when messages already contain embedded image_url content parts. Use one approach or the other.`,f.USAGE);jf(i,a)}let u={input:{messages:i},parameters:{agent_options:{agent_id:r.agentId,...r.agentVersion?{agent_version:r.agentVersion}:{}}},stream:!0},d=Ft(s);if(t.dryRun){A({endpoint:d,request:u},c);return}let p=await e.client.request({path:d,method:`POST`,body:u,stream:!0});if(l){let e=O(process.stdout),r=t.verbose;for await(let t of mn(p)){if(t.data===`[DONE]`)break;if(t.event===`error`){let e=`Chat API error`,r;try{let n=JSON.parse(t.data);e=n.message||e,r=n.code}catch{}throw new n(e,f.GENERAL,r?`API error: ${r}`:void 0)}try{let n=JSON.parse(t.data);for(let t of n.output?.choices??[]){let n=t.message;if(n.extra?.step_change){let t=Mf[n.extra.step_change];t&&process.stdout.write(`${e.dim(t)}\n`)}if(r&&n.extra?.step_change&&process.stderr.write(O(process.stderr).dim(`[event] step_change=${n.extra.step_change} step=${n.extra?.step??``} group=${n.extra?.group??``}`)+`
2732
+ `);try{let e=await Jr(u);process.stderr.write(`\n${o.green(`\u2713 Update complete: ${a} \u2192 ${e}`)}\n`),nf(e),tf(o)}catch(e){let t=e instanceof n&&e.hint?e.hint.replace(/^Re-run:\s*/i,``):af().trim();throw new n(`Automatic binary update failed.`,f.GENERAL,`Re-run the install script:\n ${t}`,{cause:e})}return}let d=`npm install -g ${l?`${r}@${l}`:`${r}@latest`}`;process.stderr.write(`Updating ${r} via npm...\n\n`);try{Ui(d,{stdio:`inherit`});try{let e=Ui(`${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`),nf(e)}catch{process.stderr.write(`\n${o.green(`✓ Update complete.`)}\n`)}tf(o)}catch(e){throw new n(`Automatic update failed.`,f.GENERAL,`Please run manually:\n ${d}`,{cause:e})}}}),sf=w({description:{"en-US":`Call a Bailian application (agent or workflow)`,"zh-CN":`调用百炼应用(智能体或工作流)`},auth:`apiKey`,usageArgs:`--app-id <id> --prompt <text> [flags]`,flags:{appId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Application ID (required)`,"zh-CN":`应用 ID(必填)`},required:!0},prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Input prompt text`,"zh-CN":`输入提示词文本`},required:!0},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL(s) to pass to the app (repeatable)`,"zh-CN":`传给应用的图片 URL(可重复)`}},fileId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Pre-uploaded file ID(s) (repeatable)`,"zh-CN":`已上传的文件 ID(可重复)`}},sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID for multi-turn conversation`,"zh-CN":`多轮对话的 Session ID`}},stream:{type:`switch`,description:{"en-US":`Stream response (default: on in TTY)`,"zh-CN":`流式输出响应(TTY 中默认开启)`}},pipelineIds:{type:`string`,valueHint:`<ids>`,description:{"en-US":`Knowledge base pipeline IDs (comma-separated)`,"zh-CN":`知识库 Pipeline ID(以逗号分隔)`}},memoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory ID for long-term memory`,"zh-CN":`长期记忆使用的 Memory ID`}},bizParams:{type:`string`,valueHint:`<json>`,description:{"en-US":`Business parameters JSON (workflow variables)`,"zh-CN":`业务参数 JSON(工作流变量)`}},hasThoughts:{type:`switch`,description:{"en-US":`Show agent thinking process`,"zh-CN":`显示智能体思考过程`}}},exampleArgs:[{"en-US":`--app-id abc123 --prompt "Hello"`,"zh-CN":`--app-id abc123 --prompt "你好"`},{"en-US":`--app-id abc123 --prompt "Describe this image" --image https://example.com/photo.jpg`,"zh-CN":`--app-id abc123 --prompt "描述这张图片" --image https://example.com/photo.jpg`},{"en-US":`--app-id abc123 --prompt "Analyze the image" --image img1.jpg --image img2.jpg`,"zh-CN":`--app-id abc123 --prompt "分析这些图片" --image img1.jpg --image img2.jpg`},{"en-US":`--app-id abc123 --prompt "Continue" --session-id sess_xxx --stream`,"zh-CN":`--app-id abc123 --prompt "继续" --session-id sess_xxx --stream`},{"en-US":`--app-id abc123 --prompt "Search for materials" --pipeline-ids pipe1,pipe2`,"zh-CN":`--app-id abc123 --prompt "搜索资料" --pipeline-ids pipe1,pipe2`},{"en-US":`--app-id abc123 --prompt "Start" --biz-params '{"key":"value"}'`,"zh-CN":`--app-id abc123 --prompt "开始" --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 C(`--biz-params must be valid JSON`)}if(t.dryRun){A({endpoint:e.client.url(se(r)),request:s},o);return}if(a){let i=await e.client.request({path:se(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 gn(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(`
2733
+ `)}else{let n=await e.client.requestJson({path:se(r),method:`POST`,body:s}),i=n.output?.text??``;t.quiet||o===`text`?k(i):A(n,o)}}});const cf=`zeldaEasy.broadscope-bailian.app-control.list`;var lf=w({description:{"en-US":`List Bailian applications`,"zh-CN":`列出百炼应用`},auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by app name (keyword search)`,"zh-CN":`按应用名称筛选(关键词搜索)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 30)`,"zh-CN":`每页结果数(默认:30)`}}},exampleArgs:[``,{"en-US":`--name customer service`,"zh-CN":`--name 客户服务`},`--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:cf,data:s},o);return}let c=await e.client.console(cf,s),l=c?.data?.DataV2?.data?.data?.list??[],u=c?.data?.DataV2?.data?.data?.total??0,d=l.map(e=>({code:e.code,name:e.name,user_prompt_params:e.config?.user_prompt_params??[]}));A({total:u,apps:d},o)}});const z={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`,"zh-CN":`API Endpoint URL 使用的 Workspace ID(也可设置 BAILIAN_WORKSPACE_ID)`}}};function B(e){let t=e.flags.workspaceId||e.settings.workspaceId;if(!t)throw new n(`Workspace ID is required.`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: ${e.identity.binName} config set workspace_id <id>`);return t}const uf={"en-US":`The memory API lives on a workspace-specific host, so --workspace-id is required; it can also come from BAILIAN_WORKSPACE_ID or the workspace_id config field.`,"zh-CN":`记忆 API 部署在 workspace 专属域名上,因此 --workspace-id 必填;也可通过 BAILIAN_WORKSPACE_ID 环境变量或 workspace_id 配置项提供。`},df={libraryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory library ID (default: the account's default library)`,"zh-CN":`记忆库 ID(默认:账号的默认记忆库)`}}},ff={planVersion:{type:`string`,valueHint:`<version>`,choices:[`pro`,`lite`],description:{"en-US":`Strategy version: pro (rerank on) or lite (rerank off); billed differently`,"zh-CN":`策略版本:pro(开启 Rerank)或 lite(关闭 Rerank),计费单价不同`}}},pf={extractScene:{type:`string`,valueHint:`<scene>`,choices:[`efficient`,`intelligent`],description:{"en-US":`Extraction scene: efficient or intelligent (creation default: efficient)`,"zh-CN":`抽取场景:efficient 或 intelligent(创建时默认 efficient)`}}},mf={projectId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory fragment rule ID (default: the library's default rule)`,"zh-CN":`记忆片段规则 ID(默认:记忆库的默认规则)`}}},hf={projectId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Memory fragment rule ID (repeatable for messages/search; custom content accepts one)`,"zh-CN":`记忆片段规则 ID(消息抽取/搜索可重复;自定义内容仅支持一个)`}}},gf={skillName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Skill name (skill memory; requires --skill-description and --skill-tags)`,"zh-CN":`技能名称(skill 记忆;需与 --skill-description、--skill-tags 同时传)`}},skillDescription:{type:`string`,valueHint:`<text>`,description:{"en-US":`Skill description (skill memory; requires --skill-name and --skill-tags)`,"zh-CN":`技能描述(skill 记忆;需与 --skill-name、--skill-tags 同时传)`}},skillTags:{type:`array`,valueHint:`<tag>`,description:{"en-US":`Skill tag (repeatable; requires --skill-name and --skill-description)`,"zh-CN":`技能标签(可重复;需与 --skill-name、--skill-description 同时传)`}}};function _f(e){let t=[e.skillName,e.skillDescription,e.skillTags].filter(e=>e!==void 0).length;if(t>0&&t<3)return`--skill-name, --skill-description and --skill-tags must be provided together.`}function vf(e){if(e.userId!==void 0&&e.userId.length>64)return`--user-id must be at most 64 characters.`;if(e.libraryId!==void 0&&e.libraryId.length>32)return`--library-id must be at most 32 characters. / --library-id 最多 32 个字符。`}function yf(e){if(e.name!==void 0&&e.name.length>32)return`--name must be at most 32 characters.`}function bf(e,t){for(let n of[`name`,`description`,`default_value`]){let r=t[n];if(!(r===void 0||n===`default_value`&&r===null)&&typeof r!=`string`)throw new C(`${e}.${n} must be a string. / 该属性字段必须是字符串。`)}if(t.name!==void 0&&t.name.length>32)throw new C(`${e}.name must be at most 32 characters`);if(t.description!==void 0&&t.description.length>128)throw new C(`${e}.description must be at most 128 characters`);if(t.default_value!==void 0&&t.default_value!==null&&t.default_value.length>128)throw new C(`${e}.default_value must be at most 128 characters`)}const xf={"en-US":`Account-level rate limits: add 120 QPM, search 300 QPM, 3000 QPM across all memory APIs. On HTTP 429 back off and leave at least 1s between calls.`,"zh-CN":`账号级限流:add 120 QPM、search 300 QPM,记忆库全部接口合计 3000 QPM。遇到 HTTP 429 请降速,两次请求间隔建议至少 1 秒。`};function Sf(e,t){let n;try{n=JSON.parse(t)}catch{throw new C(`${e} must be valid JSON`)}if(typeof n!=`object`||!n||Array.isArray(n))throw new C(`${e} must be a JSON object`);return n}function Cf(e,t){let n;try{n=JSON.parse(t)}catch{throw new C(`${e} must be valid JSON`)}if(!Array.isArray(n))throw new C(`${e} must be a JSON array`);return n.forEach((t,n)=>{if(typeof t!=`object`||!t||Array.isArray(t))throw new C(`${e}[${n}] must be a JSON object. / 数组中的每一项必须是 JSON 对象。`)}),n}const wf=/* @__PURE__ */ new Set([`SUCCEEDED`,`SUCCESS`,`FAILED`,`UNRECORDED`]),Tf=/* @__PURE__ */ new Set([`SUCCEEDED`,`SUCCESS`]);function Ef(e){return e!==void 0&&wf.has(e)}function Df(e){return e!==void 0&&Tf.has(e)}function Of(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t?.reason);return}let i=()=>{clearTimeout(a),r(t?.reason)},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}async function kf(e){let t=e.sleep??Of,n=e.now??Date.now,r=tn(e.workspaceId,nn(e.eventId)),i=n(),a=[],o=0;e.signal?.throwIfAborted();let s=new AbortController,c=/* @__PURE__ */ Error(`Memory polling budget exhausted`),l=()=>s.abort(e.signal?.reason);e.signal?.addEventListener(`abort`,l,{once:!0});let u=()=>{let t=e.timeoutMs-(n()-i);return setTimeout(()=>{n()-i>=e.timeoutMs?s.abort(c):d=u()},Math.min(Math.max(t,0),2147483647))},d=u(),f=()=>{},p=new Promise((e,t)=>{f=()=>t(s.signal.reason),s.signal.addEventListener(`abort`,f,{once:!0})}),m=async()=>{for(;;){if(s.signal.throwIfAborted(),n()-i>=e.timeoutMs)return{timedOut:!0,events:a};let c=await e.client.requestJson({path:r,method:`GET`,signal:s.signal});if(s.signal.throwIfAborted(),a=c.events??[],o+=1,e.onPoll?.(o,a),a.length>0&&a.every(e=>Ef(e.status)))return{timedOut:!1,events:a};let l=e.timeoutMs-(n()-i);if(l<=0)return{timedOut:!0,events:a};await t(Math.min(e.intervalMs,l),s.signal)}};try{return await Promise.race([m(),p])}catch(e){if(s.signal.reason===c)return{timedOut:!0,events:a};throw e}finally{clearTimeout(d),e.signal?.removeEventListener(`abort`,l),s.signal.removeEventListener(`abort`,f)}}const Af={userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory entity ID that owns the memory (required)`,"zh-CN":`记忆实体 ID,标识记忆归属对象(必填)`},required:!0},messages:{type:`string`,valueHint:`<json>`,description:{"en-US":`Messages JSON array: [{"role":"user","content":"..."},...]; role user/assistant/tool, OpenAI tool_calls supported (max 50)`,"zh-CN":`消息 JSON 数组:[{"role":"user","content":"..."},...];role 支持 user/assistant/tool,兼容 OpenAI tool_calls(最多 50 条)`}},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`Custom content to memorize verbatim; takes precedence over --messages`,"zh-CN":`要原样记忆的自定义内容;优先级高于 --messages`}},profileSchema:{type:`string`,valueHint:`<id>`,description:{"en-US":`Profile schema ID; without it no user profile is extracted`,"zh-CN":`画像模板 ID;不传则不提取用户画像`}},extractMode:{type:`string`,valueHint:`<mode>`,choices:[`profile_only`],description:{"en-US":`Extract only a user profile; requires --profile-schema and --messages, without --content`,"zh-CN":`仅抽取用户画像;需传 --profile-schema 和 --messages,不能传 --content`}},...gf,metaData:{type:`string`,valueHint:`<json>`,description:{"en-US":`Custom metadata JSON object: {"location_name":"Beijing"}`,"zh-CN":`用户自定义信息 JSON 对象:{"location_name":"北京"}`}},wait:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling budget in seconds before giving up (default: 120); 0 prints the event ID and returns right after submission`,"zh-CN":`轮询预算秒数,耗尽后按超时退出(默认:120);0 表示提交后立即返回 event_id`}},...hf,...df,...z},jf=/* @__PURE__ */ new Set([`user`,`assistant`,`tool`]);function Mf(e){e.forEach((e,t)=>{let n=`--messages[${t}]`;if(!jf.has(e.role))throw new C(`${n}.role must be one of user / assistant / tool`);if(e.role===`tool`&&!e.tool_call_id)throw new C(`${n}.tool_call_id is required when role is "tool"`);if(e.tool_calls!==void 0){if(!Array.isArray(e.tool_calls))throw new C(`${n}.tool_calls must be an array`);e.tool_calls.forEach((e,t)=>{let r=`${n}.tool_calls[${t}]`;if(!e||typeof e!=`object`||!e.id)throw new C(`${r}.id is required`);if(!e.function||typeof e.function!=`object`)throw new C(`${r}.function is required`);if(!e.function.name)throw new C(`${r}.function.name is required`)})}})}function Nf(e){let t=0;for(let n of e){let e=n.status??`UNKNOWN`,r=`${n.resource_type??`memory`} ${n.resource_id??``}`.trim();if(Df(e)){let i=n.result??[];if(i.length===0){k(`${r}: ${e} (no memory change)`),t+=1;continue}for(let e of i){let r=n.resource_type===`user_profile`?`user_profile ${e.name??n.resource_id??`-`}`:e.memory_node_id??`-`;k(`[${e.event??`ADD`}] ${r} ${e.content??``}`),t+=1}continue}k(`${r}: ${e}`),t+=1}t===0&&k(`No memory node changed.`)}var Pf=w({description:{"en-US":`Add memory from messages or custom content (async extraction)`,"zh-CN":`从消息或自定义内容添加记忆(异步抽取)`},auth:`apiKey`,usageArgs:`--user-id <id> [--messages <json>] [--content <text>] [flags]`,flags:Af,notes:[uf,{"en-US":`When --content is set, the server ignores --messages. Custom content accepts one --project-id; messages accept up to five.`,"zh-CN":`传了 --content 时服务端会忽略 --messages。自定义内容仅支持一个 --project-id;消息抽取最多支持五个。`},{"en-US":`The command submits an async extraction task, then polls it internally until every task reaches a terminal state (budget: --wait, default 120s). One call can add, update or delete several memory nodes at once.`,"zh-CN":`命令提交异步抽取任务后在内部轮询,直到全部任务到达终态(预算 --wait,默认 120 秒)。一次调用可能同时新增、更新或删除多条记忆。`},{"en-US":"On timeout the extraction may still finish in the background; check results later with `memory list` / `memory search` / `memory profile get`.","zh-CN":"超时后抽取仍可能在后台完成;稍后可用 `memory list` / `memory search` / `memory profile get` 查看结果。"},xf],exampleArgs:[{"en-US":`--user-id user1 --content "The user likes Python programming" --workspace-id ws_xxx`,"zh-CN":`--user-id user1 --content "用户喜欢使用 Python 编程" --workspace-id ws_xxx`},{"en-US":`--user-id user1 --messages '[{"role":"user","content":"I like traveling"}]'`,"zh-CN":`--user-id user1 --messages '[{"role":"user","content":"我喜欢旅行"}]'`},{"en-US":`--user-id user1 --messages '[{"role":"user","content":"I live in Beijing"}]' --profile-schema schema_xxx --extract-mode profile_only`,"zh-CN":`--user-id user1 --messages '[{"role":"user","content":"我居住在北京"}]' --profile-schema schema_xxx --extract-mode profile_only`},{"en-US":`--user-id user1 --content "Summarize meeting minutes" --project-id skill_project_xxx --skill-name "meeting-summary" --skill-description "Extract key points and generate a summary" --skill-tags office --skill-tags summary`,"zh-CN":`--user-id user1 --content "整理会议纪要" --project-id skill_project_xxx --skill-name "会议纪要整理" --skill-description "自动提取会议重点并生成摘要" --skill-tags 办公 --skill-tags 总结`},{"en-US":`--user-id user1 --content "Attended WAIC" --wait 0`,"zh-CN":`--user-id user1 --content "参加了 WAIC" --wait 0`}],validate:e=>{if(!e.messages&&!e.content)return`Provide --messages or --content.`;if(e.extractMode===`profile_only`&&(!e.profileSchema||!e.messages||e.content!==void 0))return`--extract-mode profile_only requires --profile-schema and --messages without --content. / 仅画像模式需传 --profile-schema 和 --messages,不能传 --content。`;if(e.content&&(e.projectId?.length??0)>1)return`--content accepts only one --project-id. / 自定义内容仅支持一个 --project-id。`;if((e.projectId?.length??0)>5)return`At most five --project-id values are allowed. / --project-id 最多传五个。`;let t=vf(e);if(t)return t;if(e.content&&e.content.length>512)return`--content must be at most 512 characters.`;let n=_f(e);if(n)return n;if(e.wait!==void 0&&(!Number.isFinite(e.wait)||e.wait<0))return`--wait must be a finite, non-negative number of seconds. / --wait 必须是有限的非负秒数。`},async run(e){let{settings:t,flags:r}=e,i={user_id:r.userId};if(r.messages){let e=Cf(`--messages`,r.messages);if(e.length>50)throw new C(`--messages accepts at most 50 messages`);Mf(e),i.messages=e}r.content&&(i.custom_content=r.content),r.metaData&&(i.meta_data=Sf(`--meta-data`,r.metaData)),r.profileSchema&&(i.profile_schema=r.profileSchema),r.projectId?.length&&(r.content?i.project_id=r.projectId[0]:i.project_ids=r.projectId),r.extractMode&&(i.extract_mode=r.extractMode),r.skillName!==void 0&&r.skillDescription!==void 0&&r.skillTags!==void 0&&(i.skill_name=r.skillName,i.skill_description=r.skillDescription,i.skill_tags=r.skillTags),r.libraryId&&(i.memory_library_id=r.libraryId);let a=T(t.output),o=B(e),s=tn(o,en());if(t.dryRun){A({endpoint:s,method:`POST`,request:i},a);return}let c=await e.client.requestJson({path:s,method:`POST`,body:i}),l=r.wait??120,u=c.event_id;if(l===0||!u){if(t.quiet||a===`text`?k(u?`Submitted: event ${u} (${(c.events??[]).length} task(s) pending).`:`Submitted (no event ID returned).`):A(c,a),l!==0)throw new n(`The submission returned no event_id; extraction completion cannot be confirmed. / 提交响应未返回 event_id,无法确认抽取完成。`,f.GENERAL,"Check results with `memory list`, `memory search` or `memory profile get` before submitting again. / 再次提交前,请使用 `memory list`、`memory search` 或 `memory profile get` 检查结果。");return}let d=await kf({client:e.client,workspaceId:o,eventId:u,timeoutMs:l*1e3,intervalMs:3e3,onPoll:t.verbose?(e,t)=>{let n=t.map(e=>`${e.resource_type??`task`}=${e.status??`UNKNOWN`}`).join(` `);process.stderr.write(`[poll ${e}] ${u} ${n}\n`)}:void 0});if(d.timedOut)throw new n(`Memory extraction timed out after ${l}s (event ${u}); it may still be running in the background. / 记忆抽取等待 ${l} 秒后超时(事件 ${u}),后台任务可能仍在运行。`,f.TIMEOUT,"Check results later with `memory list`, `memory search --memory-types skill` or `memory profile get`. / 稍后使用 `memory list`、`memory search --memory-types skill` 或 `memory profile get` 检查结果。");let p=d.events,m=p.filter(e=>e.status===`FAILED`),h=p.filter(e=>e.status!==`FAILED`);if(t.quiet||a===`text`?Nf(h):A({request_id:c.request_id,event_id:u,events:p},a),m.length>0)throw new n(`Memory extraction event ${u} has failed task(s): ${JSON.stringify(m)}`,f.GENERAL)}});const Ff={userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory entity ID that owns the memory (required)`,"zh-CN":`记忆实体 ID,标识记忆归属对象(必填)`},required:!0},query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Search text; sent as a single user message`,"zh-CN":`搜索文本;作为单条用户消息发送`}},messages:{type:`string`,valueHint:`<json>`,description:{"en-US":`Messages JSON array for context-based search; overrides --query`,"zh-CN":`用于上下文搜索的消息 JSON 数组;优先于 --query`}},topK:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max results, 1-100 (default: 10)`,"zh-CN":`最大召回个数,1~100(默认:10)`}},minScore:{type:`number`,valueHint:`<score>`,description:{"en-US":`Minimum similarity score, 0-1 (default: 0.3; only effective with pro)`,"zh-CN":`最小相似度分数阈值,0~1(默认:0.3;仅 pro 生效)`}},memoryTypes:{type:`array`,valueHint:`<type>`,choices:[`observation`,`skill`],description:{"en-US":`Memory types to search (repeatable; server default: observation only)`,"zh-CN":`搜索的记忆类型(可重复;服务端默认仅 observation)`}},memoryType:{type:`string`,valueHint:`<type>`,choices:[`observation`,`skill`],description:{"en-US":`Deprecated alias for --memory-types; cannot be combined with --memory-types`,"zh-CN":`已弃用:--memory-types 的别名,不能与 --memory-types 同时传入`}},projectIds:{...hf.projectId,description:{"en-US":`Memory fragment rule ID (repeatable)`,"zh-CN":`记忆片段规则 ID(可重复)`}},projectId:{...hf.projectId,description:{"en-US":`Deprecated alias for --project-ids (repeatable); cannot be combined with --project-ids`,"zh-CN":`已弃用:--project-ids 的别名(可重复),不能与 --project-ids 同时传入`}},...ff,...df,...z};var If=w({description:{"en-US":`Search memory nodes by query or messages`,"zh-CN":`通过查询文本或消息搜索记忆节点`},auth:`apiKey`,usageArgs:`--user-id <id> [--query <text>] [flags]`,flags:Ff,notes:[uf,{"en-US":`Use --plan-version pro or lite to select the search strategy. When omitted, the server defaults to pro. Plans are billed differently.`,"zh-CN":`通过 --plan-version pro 或 lite 选择检索策略;省略时服务端默认使用 pro。不同计划计费不同。`},{"en-US":`Without --memory-types the server searches observation memories only; pass --memory-types skill (or both types) to include skill memories.`,"zh-CN":`不传 --memory-types 时服务端仅搜索事实记忆(observation);传 --memory-types skill(或同时传两种)可搜索技能记忆。`},xf],exampleArgs:[{"en-US":`--user-id user1 --query "programming preferences" --workspace-id ws_xxx`,"zh-CN":`--user-id user1 --query "编程偏好" --workspace-id ws_xxx`},{"en-US":`--user-id user1 --messages '[{"role":"user","content":"recommend a book"}]' --top-k 5`,"zh-CN":`--user-id user1 --messages '[{"role":"user","content":"推荐一本书"}]' --top-k 5`},{"en-US":`--user-id user1 --query "reminders" --plan-version pro --min-score 0`,"zh-CN":`--user-id user1 --query "提醒事项" --plan-version pro --min-score 0`},{"en-US":`--user-id user1 --query "meeting summary" --memory-types skill --project-ids skill_project_xxx`,"zh-CN":`--user-id user1 --query "会议纪要" --memory-types skill --project-ids skill_project_xxx`}],validate:e=>{if(!e.query&&!e.messages)return`Provide --query or --messages.`;if(e.projectId!==void 0&&e.projectIds!==void 0)return`--project-id and --project-ids are mutually exclusive. / --project-id 与 --project-ids 不能同时传入。`;if(e.memoryType!==void 0&&e.memoryTypes!==void 0)return`--memory-type and --memory-types are mutually exclusive. / --memory-type 与 --memory-types 不能同时传入。`;let t=vf(e);if(t)return t;if(e.topK!==void 0&&(e.topK<1||e.topK>100))return`--top-k must be between 1 and 100.`;if(e.minScore!==void 0&&(e.minScore<0||e.minScore>1))return`--min-score must be between 0 and 1.`},async run(e){let{settings:t,flags:n}=e,r=n.messages?Cf(`--messages`,n.messages):[{role:`user`,content:n.query}],i={user_id:n.userId,messages:r};n.topK!==void 0&&(i.top_k=n.topK),n.minScore!==void 0&&(i.min_score=n.minScore),n.planVersion&&(i.plan_version=n.planVersion);let a=n.projectIds??n.projectId,o=n.memoryTypes??(n.memoryType?[n.memoryType]:void 0);a?.length&&(i.project_ids=a),o?.length&&(i.memory_types=o),n.libraryId&&(i.memory_library_id=n.libraryId);let s=T(t.output),c=tn(B(e),on());if(t.dryRun){A({endpoint:c,method:`POST`,request:i},s);return}let l=await e.client.requestJson({path:c,method:`POST`,body:i});if(t.quiet||s===`text`){if(!l.memory_nodes||l.memory_nodes.length===0)k(`No memory nodes found.`);else for(let e of l.memory_nodes){let t=e.memory_type?`[${e.memory_type}] `:``,n=e.score===void 0?``:` (score ${e.score})`;k(`${t}[${e.memory_node_id}] ${e.content}${n}`)}}else A(l,s)}});function V(e){return[...new Set(e.split(`,`).map(e=>e.trim()).filter(Boolean))]}function Lf(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}`:``}const Rf={userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory entity ID that owns the memory (required)`,"zh-CN":`记忆实体 ID,标识记忆归属对象(必填)`},required:!0},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10)`,"zh-CN":`每页结果数(默认:10)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},...mf,...df,...z};var zf=w({description:{"en-US":`List memory nodes for a user`,"zh-CN":`列出用户的记忆节点`},auth:`apiKey`,usageArgs:`--user-id <id> [flags]`,flags:Rf,notes:[uf,{"en-US":`Without --project-id, only the default rule is listed; other observation and skill projects require their project ID.`,"zh-CN":`不传 --project-id 只查询默认规则;其他 observation 和 skill 项目需指定对应项目 ID。`}],exampleArgs:[`--user-id user1 --workspace-id ws_xxx`,`--user-id user1 --page-size 20 --page 2`,`--user-id user1 --library-id lib_xxx --output json`],validate:e=>{let t=vf(e);if(t)return t;if(e.page!==void 0&&e.page<1)return`--page must be at least 1.`;if(e.pageSize!==void 0&&e.pageSize<1)return`--page-size must be at least 1.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=tn(B(e),rn())+Lf({user_id:n.userId,page_size:n.pageSize,page_num:n.page,project_id:n.projectId,memory_library_id:n.libraryId});if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await e.client.requestJson({path:i,method:`GET`});if(t.quiet||r===`text`){if(!a.memory_nodes||a.memory_nodes.length===0)k(`No memory nodes found.`);else{for(let e of a.memory_nodes){let t=e.memory_type?`[${e.memory_type}] `:``;k(`${t}[${e.memory_node_id}] ${e.content}`),e.meta_data&&Object.keys(e.meta_data).length>0&&k(` meta: ${JSON.stringify(e.meta_data)}`)}a.total!==void 0&&k(`\nTotal: ${a.total}`)}}else A(a,r)}});const Bf={nodeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory node ID (required)`,"zh-CN":`记忆节点 ID(必填)`},required:!0},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`New content for the memory node, max 512 characters (required)`,"zh-CN":`记忆节点的新内容,最多 512 个字符(必填)`},required:!0},metaData:{type:`string`,valueHint:`<json>`,description:{"en-US":`Custom metadata JSON object, merged incrementally: {"key":"value"}`,"zh-CN":`用户自定义信息 JSON 对象,增量合并:{"key":"value"}`}},...gf,...df,...z};var Vf=w({description:{"en-US":`Update a memory node content`,"zh-CN":`更新记忆节点内容`},auth:`apiKey`,usageArgs:`--node-id <id> --content <text> [flags]`,flags:Bf,notes:[uf,{"en-US":`--content replaces the node content in full; --meta-data merges incrementally.`,"zh-CN":`--content 整体替换节点内容;--meta-data 为增量合并。`},{"en-US":"When the target node is a skill memory, the server requires the skill triple (--skill-name / --skill-description / --skill-tags); use `memory node show` to check the node type first.","zh-CN":"目标节点为 skill 记忆时,服务端强制要求 skill 三件套(--skill-name / --skill-description / --skill-tags);可先用 `memory node show` 确认节点类型。"}],exampleArgs:[{"en-US":`--node-id node_xxx --content "updated memory content" --workspace-id ws_xxx`,"zh-CN":`--node-id node_xxx --content "更新后的记忆内容" --workspace-id ws_xxx`},{"en-US":`--node-id node_xxx --content "met at WAIC" --meta-data '{"city":"Shanghai"}'`,"zh-CN":`--node-id node_xxx --content "在 WAIC 见面" --meta-data '{"city":"上海"}'`},{"en-US":`--node-id node_xxx --content "Summarize meeting minutes" --skill-name "meeting-summary" --skill-description "Extract key points" --skill-tags office`,"zh-CN":`--node-id node_xxx --content "整理会议纪要" --skill-name "会议纪要整理" --skill-description "提取会议重点" --skill-tags 办公`}],validate:e=>{let t=vf(e);if(t)return t;if(e.content.length>512)return`--content must be at most 512 characters.`;let n=_f(e);if(n)return n},async run(e){let{settings:t,flags:n}=e,r=n.nodeId,i={custom_content:n.content};n.metaData&&(i.meta_data=Sf(`--meta-data`,n.metaData)),n.skillName!==void 0&&n.skillDescription!==void 0&&n.skillTags!==void 0&&(i.skill_name=n.skillName,i.skill_description=n.skillDescription,i.skill_tags=n.skillTags),n.libraryId&&(i.memory_library_id=n.libraryId);let a=T(t.output),o=tn(B(e),an(r));if(t.dryRun){A({endpoint:o,method:`PATCH`,request:i},a);return}let s=await e.client.requestJson({path:o,method:`PATCH`,body:i});t.quiet||a===`text`?k(`Memory node ${r} updated.`):A(s,a)}});const Hf={nodeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory node ID (required)`,"zh-CN":`记忆节点 ID(必填)`},required:!0},...df,...z};var Uf=w({description:{"en-US":`Delete a memory node`,"zh-CN":`删除记忆节点`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes the specified memory node. Confirm the node ID before proceeding.`,"zh-CN":`该操作会删除指定记忆节点,请确认节点 ID。`}},usageArgs:`--node-id <id> [flags]`,flags:Hf,notes:[uf,{"en-US":`This deletes only the selected memory node. It does not delete extracted user profile values or the profile schema.`,"zh-CN":`仅删除选中的记忆节点,不会删除已提取的用户画像值或画像模板。`},{"en-US":"Deleted nodes may remain readable with status=delete. Run `memory list` first to confirm the node ID.","zh-CN":"删除后的节点仍可能通过详情接口读取,状态为 delete。建议先用 `memory list` 确认节点 ID。"}],exampleArgs:[`--node-id node_xxx --workspace-id ws_xxx`,`--node-id node_xxx --yes`],validate:e=>vf(e),async run(e){let{settings:t,flags:n}=e,r=n.nodeId,i=T(t.output),a=tn(B(e),an(r))+Lf({memory_library_id:n.libraryId});if(t.dryRun){A({endpoint:a,method:`DELETE`},i);return}let o=await e.client.requestJson({path:a,method:`DELETE`});t.quiet||i===`text`?k(`Memory node ${r} deleted.`):A(o,i)}});const Wf={nodeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory node ID (required)`,"zh-CN":`记忆节点 ID(必填)`},required:!0},...z};var Gf=w({description:{"en-US":`Show a single memory node with full detail`,"zh-CN":`查看单个记忆节点的完整详情`},auth:`apiKey`,usageArgs:`--node-id <id> [flags]`,flags:Wf,notes:[uf,{"en-US":"Useful after `memory list` / `memory search`, and to check whether a node is a skill memory before `memory update`.","zh-CN":"适合在 `memory list` / `memory search` 之后查看单节点详情,也可在 `memory update` 前确认节点是否为 skill 类型。"}],exampleArgs:[`--node-id node_xxx --workspace-id ws_xxx`,`--node-id node_xxx --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=tn(B(e),an(n.nodeId));if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await e.client.requestJson({path:i,method:`GET`});if(t.quiet||r===`text`){let e=a.memory_node;if(!e){k(`Memory node not found.`);return}k(`[${e.memory_node_id}] ${e.content}`),k(` type: ${e.memory_type??`-`} status: ${e.status??`-`}`),e.project_id&&k(` project: ${e.project_id}`),e.timestamp!==void 0&&k(` timestamp: ${e.timestamp}`),e.created_at!==void 0&&k(` created_at: ${e.created_at}`),e.updated_at!==void 0&&k(` updated_at: ${e.updated_at}`),e.meta_data&&Object.keys(e.meta_data).length>0&&k(` meta: ${JSON.stringify(e.meta_data)}`),e.media_desc&&k(` media_desc: ${e.media_desc}`),e.media_urls&&e.media_urls.length>0&&k(` media_urls: ${e.media_urls.join(`, `)}`)}else A(a,r)}});const Kf={nodeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Skill memory node ID (required)`,"zh-CN":`skill 记忆节点 ID(必填)`},required:!0},...z};var qf=w({description:{"en-US":`Export a skill memory node`,"zh-CN":`导出 skill 记忆节点`},auth:`apiKey`,usageArgs:`--node-id <id> [flags]`,flags:Kf,notes:[uf,{"en-US":"Returns skill body content without frontmatter; JSON also includes skill_name, skill_description and skill_tags. Find node IDs with `memory search --memory-types skill`.","zh-CN":"返回不含 frontmatter 的技能正文;JSON 另含 skill_name、skill_description、skill_tags。节点 ID 可用 `memory search --memory-types skill` 查询。"}],exampleArgs:[`--node-id node_xxx --workspace-id ws_xxx`,`--node-id node_xxx --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=tn(B(e),sn(n.nodeId));if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await e.client.requestJson({path:i,method:`GET`});if(t.quiet||r===`text`){let e=a.memory_node;if(!e){k(`Skill memory node not found.`);return}k(e.content)}else A(a,r)}});const Jf={name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Schema name (required)`,"zh-CN":`Schema 名称(必填)`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Schema description`,"zh-CN":`Schema 描述`}},attributes:{type:`string`,valueHint:`<json>`,description:{"en-US":`Attributes JSON array: [{"name":"age","description":"age","default_value":"18"}]`,"zh-CN":`属性 JSON 数组:[{"name":"age","description":"年龄","default_value":"18"}]`},required:!0},...ff,...pf,...df,...z};var Yf=w({description:{"en-US":`Create a user profile schema for memory profiling`,"zh-CN":`创建用于记忆画像的用户 Profile Schema`},auth:`apiKey`,usageArgs:`--name <name> --attributes <json> [flags]`,flags:Jf,notes:[uf,{"en-US":`Each attribute needs a name; description and default_value are optional. --plan-version picks the extraction tier (pro / lite) and is billed differently.`,"zh-CN":`每个属性必须有 name,description 与 default_value 可选。--plan-version 决定抽取策略档位(pro / lite),计费单价不同。`}],exampleArgs:[{"en-US":`--name "user_basic" --attributes '[{"name":"age","description":"age"},{"name":"hobby","description":"hobby"}]' --workspace-id ws_xxx`,"zh-CN":`--name "user_basic" --attributes '[{"name":"age","description":"年龄"},{"name":"hobby","description":"爱好"}]' --workspace-id ws_xxx`},{"en-US":`--name "user_basic" --attributes '[{"name":"age"}]' --plan-version lite --library-id lib_xxx`,"zh-CN":`--name "user_basic" --attributes '[{"name":"age"}]' --plan-version lite --library-id lib_xxx`}],validate:e=>vf(e)??yf(e)??void 0,async run(e){let{settings:t,flags:n}=e,r=Cf(`--attributes`,n.attributes);if(r.length===0)throw new C(`--attributes must contain at least one attribute`);r.forEach((e,t)=>{let n=`--attributes[${t}]`;if(!e.name)throw new C(`${n}.name is required`);if(`immutable`in e)throw new C(`${n}.immutable is internal and is not supported by the CLI. / immutable 为内部参数,CLI 不支持。`);bf(n,e)});let i={name:n.name,attributes:r};n.description!==void 0&&(i.description=n.description),n.planVersion&&(i.plan_version=n.planVersion),n.extractScene&&(i.extract_scene=n.extractScene),n.libraryId&&(i.memory_library_id=n.libraryId);let a=T(t.output),o=tn(B(e),Cn());if(t.dryRun){A({endpoint:o,method:`POST`,request:i},a);return}let s=await e.client.requestJson({path:o,method:`POST`,body:i});t.quiet||a===`text`?k(`Profile schema created: ${s.profile_schema_id}`):A(s,a)}});const Xf={pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10)`,"zh-CN":`每页结果数(默认:10)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},...df,...z};var Zf=w({description:{"en-US":`List profile schemas`,"zh-CN":`列出画像模板`},auth:`apiKey`,usageArgs:`[flags]`,flags:Xf,notes:[uf],exampleArgs:[`--workspace-id ws_xxx`,`--page-size 20 --page 2`,`--library-id lib_xxx --output json`],validate:e=>{let t=vf(e);if(t)return t;if(e.page!==void 0&&e.page<1)return`--page must be at least 1.`;if(e.pageSize!==void 0&&e.pageSize<1)return`--page-size must be at least 1.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=tn(B(e),Cn())+Lf({page_size:n.pageSize,page_num:n.page,memory_library_id:n.libraryId});if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await e.client.requestJson({path:i,method:`GET`});if(t.quiet||r===`text`){let e=a.profile_schemas??[];if(e.length===0)k(`No profile schemas found.`);else{for(let t of e){let e=t.plan_version?` (${t.plan_version})`:``;k(`[${t.profile_schema_id}] ${t.name}${e}`),t.description&&k(` ${t.description}`)}a.total!==void 0&&k(`\nTotal: ${a.total}`)}}else A(a,r)}});const Qf={schemaId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Profile schema ID (required)`,"zh-CN":`Profile Schema ID(必填)`},required:!0},...df,...z};var $f=w({description:{"en-US":`Show a profile schema definition with attribute IDs`,"zh-CN":`查看画像模板定义及属性 ID`},auth:`apiKey`,usageArgs:`--schema-id <id> [flags]`,flags:Qf,notes:[uf,{"en-US":"The attribute_id values returned here are the handles `memory profile update --attributes-operations` needs for update / delete operations.","zh-CN":"这里返回的 attribute_id 就是 `memory profile update --attributes-operations` 做 update / delete 时需要的属性句柄。"}],exampleArgs:[`--schema-id schema_xxx --workspace-id ws_xxx`,`--schema-id schema_xxx --output json`],validate:e=>vf(e),async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=tn(B(e),Sn(n.schemaId))+Lf({memory_library_id:n.libraryId});if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await e.client.requestJson({path:i,method:`GET`});if(t.quiet||r===`text`){k(`Name: ${a.name??`(none)`}`),a.description&&k(`Description: ${a.description}`);let e=a.attributes??[];if(e.length===0)k(`No attributes.`);else{k(`Attributes:`);for(let t of e)k(` [${t.attribute_id}] ${t.name}`),t.description&&k(` desc: ${t.description}`),t.default_value!==void 0&&k(` default: ${t.default_value}`)}}else A(a,r)}});const ep={schemaId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Profile schema ID (required)`,"zh-CN":`Profile Schema ID(必填)`},required:!0},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`New schema name`,"zh-CN":`新的 Schema 名称`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`New schema description`,"zh-CN":`新的 Schema 描述`}},attributesOperations:{type:`string`,valueHint:`<json>`,description:{"en-US":`Attribute operations JSON array: [{"op":"add","name":"plan"}]`,"zh-CN":`属性操作 JSON 数组:[{"op":"add","name":"plan"}]`}},...ff,...pf,...df,...z},tp=[`add`,`update`,`delete`];function np(e){e.forEach((e,t)=>{let n=`--attributes-operations[${t}]`;if(!tp.includes(e.op))throw new C(`${n}.op must be one of ${tp.join(` / `)}`);if(e.op===`add`&&!e.name)throw new C(`${n}.name is required when op is "add"`);if(e.op!==`add`&&!e.attribute_id)throw new C(`${n}.attribute_id is required when op is "${e.op}"`);if(`immutable`in e)throw new C(`${n}.immutable is internal and is not supported by the CLI. / immutable 为内部参数,CLI 不支持。`);bf(n,e)})}var rp=w({description:{"en-US":`Update a profile schema, extraction scene, or billing tier`,"zh-CN":`更新画像模板、抽取场景或计费档位`},auth:`apiKey`,usageArgs:`--schema-id <id> [flags]`,flags:ep,notes:[uf,{"en-US":`Attribute operations change the shared schema, not one user's profile values. An explicit delete operation removes an attribute definition; inspect the schema and use --dry-run before applying it.`,"zh-CN":`属性操作修改共享模板,不是修改单个用户的画像值。显式 delete 操作会删除属性定义;请先查看模板并用 --dry-run 核对。`},{"en-US":'Each operation needs "op": add (requires name), update / delete (require attribute_id). Run `memory profile show` first to get attribute IDs.',"zh-CN":'每条操作必须带 "op":add(需要 name)、update / delete(需要 attribute_id)。属性 ID 先用 `memory profile show` 查。'}],exampleArgs:[{"en-US":`--schema-id schema_xxx --name "user_basic_v2" --workspace-id ws_xxx`,"zh-CN":`--schema-id schema_xxx --name "user_basic_v2" --workspace-id ws_xxx`},{"en-US":`--schema-id schema_xxx --attributes-operations '[{"op":"add","name":"plan","default_value":"free"},{"op":"delete","attribute_id":"attr_2"}]'`,"zh-CN":`--schema-id schema_xxx --attributes-operations '[{"op":"add","name":"plan","default_value":"free"},{"op":"delete","attribute_id":"attr_2"}]'`}],validate:e=>!e.name&&e.description===void 0&&!e.attributesOperations&&!e.planVersion&&!e.extractScene?`Provide --name, --description, --plan-version, --extract-scene, or --attributes-operations. / 请至少提供一个模板更新字段。`:vf(e)??yf(e)??void 0,async run(e){let{settings:t,flags:n}=e,r={};if(n.name&&(r.name=n.name),n.description!==void 0&&(r.description=n.description),n.planVersion&&(r.plan_version=n.planVersion),n.attributesOperations){let e=Cf(`--attributes-operations`,n.attributesOperations);np(e),r.attributes_operations=e}n.extractScene&&(r.extract_scene=n.extractScene),n.libraryId&&(r.memory_library_id=n.libraryId);let i=T(t.output),a=tn(B(e),Sn(n.schemaId));if(t.dryRun){A({endpoint:a,method:`PATCH`,request:r},i);return}let o=await e.client.requestJson({path:a,method:`PATCH`,body:r});t.quiet||i===`text`?k(`Profile schema ${n.schemaId} updated.`):A(o,i)}});const ip={schemaId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Profile schema ID (required)`,"zh-CN":`Profile Schema ID(必填)`},required:!0},...df,...z};var ap=w({description:{"en-US":`Delete a profile schema`,"zh-CN":`删除画像模板`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the profile schema and its attribute definitions. Profiles already extracted for this schema become unreachable.`,"zh-CN":`该操作会永久删除画像模板及其属性定义,已基于该模板提取的用户画像也将无法访问。`}},usageArgs:`--schema-id <id> [flags]`,flags:ip,notes:[uf,{"en-US":`Irreversible — the schema and its attribute definitions are permanently removed. Profiles already extracted for this schema become unreachable.`,"zh-CN":`该操作不可撤销——模板及其属性定义将被永久删除,已基于该模板提取的用户画像也将无法访问。`}],exampleArgs:[`--schema-id schema_xxx --workspace-id ws_xxx`,`--schema-id schema_xxx --yes`],validate:e=>vf(e),async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=tn(B(e),Sn(n.schemaId))+Lf({memory_library_id:n.libraryId});if(t.dryRun){A({endpoint:i,method:`DELETE`},r);return}let a=await e.client.requestJson({path:i,method:`DELETE`});t.quiet||r===`text`?k(`Profile schema ${n.schemaId} deleted.`):A(a,r)}});const op={schemaId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Profile schema ID (required)`,"zh-CN":`Profile Schema ID(必填)`},required:!0},userId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Memory entity ID that owns the profile (required)`,"zh-CN":`记忆实体 ID,标识画像归属对象(必填)`},required:!0},...df,...z};var sp=w({description:{"en-US":`Get the extracted user profile for a schema`,"zh-CN":`获取某个 Schema 下已提取的用户画像`},auth:`apiKey`,usageArgs:`--schema-id <id> --user-id <id> [flags]`,flags:op,notes:[uf,{"en-US":"Values are extracted only when `memory add --profile-schema` used the same schema ID; otherwise every attribute comes back empty. Use `memory profile show` for the schema definition itself.","zh-CN":"只有 `memory add --profile-schema` 传入同一个 Schema ID 时才会提取属性值,否则所有属性都为空。查看模板定义本身请用 `memory profile show`。"}],exampleArgs:[`--schema-id schema_xxx --user-id user1 --workspace-id ws_xxx`],validate:e=>vf(e),async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=tn(B(e),_r(n.schemaId))+Lf({user_id:n.userId,memory_library_id:n.libraryId});if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await e.client.requestJson({path:i,method:`GET`});if(t.quiet||r===`text`){let e=a.profile?.attributes??[];if(e.length===0)k(`No profile data found.`);else for(let t of e){let e=t.value_items??[];if(e.length>0)for(let n of e)k(`${t.name}: ${n.value??`(empty)`} (item ${n.item_id??`-`}, ${n.status??`-`})`);else k(`${t.name}: ${t.value??`(empty)`}`)}}else A(a,r)}});const cp={pageNumber:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size per request`,"zh-CN":`每次请求的分页大小`}}};function lp(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 up(e){return e.data?.ingestion_status??`UNKNOWN`}function dp(e){return(e.data?.rows??[]).filter(e=>[e.code,e.status].some(e=>typeof e==`string`&&e.includes(`FAILED`)))}function fp(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 pp(e,t){let n=e.data?.rows??[],r=dp(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 mp(e,t,n){let r=new URL(D(e,y.indexJobStatus));return r.searchParams.set(`index_id`,t),r.searchParams.set(`job_id`,n),r}async function hp(e,t,n){return Yr(e,t,{url:n.statusUrl,intervalSec:n.intervalSec,timeoutSec:t.timeout,isComplete:e=>{let t=e;return up(t)===`COMPLETED`||fp(t)},isFailed:()=>!1,getStatus:e=>{let t=e,n=up(t),r=dp(t).length,i=t.data?.total_count;return typeof i==`number`&&i>0?`${n} (${r}/${i} failed)`:r>0?`${n} (${r} failed)`:n}})}function gp(e,t){return!(e instanceof n)||e.hint?e:new n(e.message,e.exitCode,t,{cause:e,api:e.api,rawResponse:e.rawResponse})}function _p(e,t){let n=e.data?.[t];if(typeof n==`string`)return n;let r=e[t];return typeof r==`string`?r:void 0}const vp={query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Search query text (required, cannot be empty)`,"zh-CN":`搜索查询文本(必填且不能为空)`},required:!0},agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Retrieval service ID (find in console knowledge retrieval page)`,"zh-CN":`检索服务 ID(可在控制台知识库检索页面查看)`},required:!0},...z,agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Service version to call: beta (draft for debugging) or a published number; default is the latest published version`,"zh-CN":`要调用的服务版本:beta(用于调试的草稿)或已发布版本号;默认使用最新发布版本`}},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL for multimodal retrieval (repeatable)`,"zh-CN":`多模态检索使用的图片 URL(可重复)`}}};var yp=w({description:{"en-US":`Search a Bailian knowledge base (RAG semantic retrieval)`,"zh-CN":`搜索百炼知识库(RAG 语义检索)`},auth:`apiKey`,usageArgs:`--query <text> --agent-id <id> [flags]`,flags:vp,notes:[{"en-US":`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.`,"zh-CN":`检索范围与策略(多索引权重、路由、重排序等)由 agent_id 服务配置决定。仅 query 和 agent_id 必填。`},{"en-US":`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。可在控制台 API Key 页面获取。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或 `kscli config set workspace_id <id>` 设置。"},{"en-US":"`--agent-version beta` calls the draft config for debugging before it is deployed.","zh-CN":"`--agent-version beta` 会调用尚未部署的草稿配置,便于发布前调试。"}],exampleArgs:[{"en-US":`--query "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--query "什么是 RAG?" --agent-id aid-xxx --workspace-id ws-xxx`},{"en-US":`--api-key $DASHSCOPE_API_KEY --query "test search" --agent-id aid-xxx --workspace-id ws-xxx --image https://example.com/img.jpg`,"zh-CN":`--api-key $DASHSCOPE_API_KEY --query "测试搜索" --agent-id aid-xxx --workspace-id ws-xxx --image https://example.com/img.jpg`}],async run(e){let{settings:t,flags:n}=e,r=B(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=It(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 bp={message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Message text (repeatable). Supports role:content prefix to set role (e.g. user:hello), defaults to user. Follows OpenAI message format`,"zh-CN":`消息文本(可重复)。支持使用 role:content 前缀指定角色(例如 user:hello),默认为 user。遵循 OpenAI 消息格式`}},agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Q&A service ID (find in console knowledge Q&A page)`,"zh-CN":`问答服务 ID(可在控制台知识库问答页面查看)`},required:!0},...z,agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Service version to call: beta (draft for debugging) or a published number; default is the latest published version`,"zh-CN":`要调用的服务版本:beta(用于调试的草稿)或已发布版本号;默认使用最新发布版本`}},image:{type:`array`,valueHint:`<url>`,description:{"en-US":`Image URL (repeatable). Attached to the last user message as multimodal content`,"zh-CN":`图片 URL(可重复)。将作为多模态内容附加到最后一条用户消息`}}};function xp(e){let t=[];if(e.message){let n=/* @__PURE__ */ 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 Sp(e){for(let t of e)if(Array.isArray(t.content)&&t.content.some(e=>e.type===`image_url`))return!0;return!1}function Cp(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 wp={tool_calling:`🔍 Retrieving...`,plan_start:`🤔 Planning...`,generation_start:`✍️ Generating...`};var Tp=w({description:{"en-US":`Chat with a Bailian knowledge base (RAG Q&A with streaming)`,"zh-CN":`与百炼知识库对话(支持流式输出的 RAG 问答)`},auth:`apiKey`,usageArgs:`--message <text> --agent-id <id> [flags]`,flags:bp,notes:[{"en-US":`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.`,"zh-CN":`响应以 SSE 流事件返回。事件生命周期:tool_calling → tool_return → plan_start → planning → plan_end → generation_start → generating → generation_end。tool_calling → tool_return 可能循环多次。`},{"en-US":`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。可在控制台 API Key 页面获取。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或 `kscli config set workspace_id <id>` 设置。"},{"en-US":`Multi-turn: use --message "user:..." and --message "assistant:..." to pass conversation history.`,"zh-CN":`多轮对话:使用 --message "user:..." 和 --message "assistant:..." 传入对话历史。`},{"en-US":"`--agent-version beta` calls the draft config for debugging before it is deployed.","zh-CN":"`--agent-version beta` 会调用尚未部署的草稿配置,便于发布前调试。"}],exampleArgs:[{"en-US":`--message "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--message "什么是 RAG?" --agent-id aid-xxx --workspace-id ws-xxx`},{"en-US":`--message "user:What is RAG?" --message "assistant:RAG is..." --message "How does it work?" --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--message "user:什么是 RAG?" --message "assistant:RAG 是……" --message "它是如何工作的?" --agent-id aid-xxx --workspace-id ws-xxx`},{"en-US":`--message "Describe these images" --image https://example.com/a.png --image https://example.com/b.png --agent-id aid-xxx --workspace-id ws-xxx`,"zh-CN":`--message "描述这些图片" --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:t,flags:r}=e,i=xp(r),a=r.image,o=!!a&&a.length>0;i.length===0&&o&&(i=[{role:`user`,content:``}]);let s=B(e),c=T(t.output),l=c===`text`&&!!process.stdout.isTTY;if(o){if(Sp(i))throw new n(`Cannot use --image when messages already contain embedded image_url content parts. Use one approach or the other.`,f.USAGE);Cp(i,a)}let u={input:{messages:i},parameters:{agent_options:{agent_id:r.agentId,...r.agentVersion?{agent_version:r.agentVersion}:{}}},stream:!0},d=Ft(s);if(t.dryRun){A({endpoint:d,request:u},c);return}let p=await e.client.request({path:d,method:`POST`,body:u,stream:!0});if(l){let e=O(process.stdout),r=t.verbose;for await(let t of gn(p)){if(t.data===`[DONE]`)break;if(t.event===`error`){let e=`Chat API error`,r;try{let n=JSON.parse(t.data);e=n.message||e,r=n.code}catch{}throw new n(e,f.GENERAL,r?`API error: ${r}`:void 0)}try{let n=JSON.parse(t.data);for(let t of n.output?.choices??[]){let n=t.message;if(n.extra?.step_change){let t=wp[n.extra.step_change];t&&process.stdout.write(`${e.dim(t)}\n`)}if(r&&n.extra?.step_change&&process.stderr.write(O(process.stderr).dim(`[event] step_change=${n.extra.step_change} step=${n.extra?.step??``} group=${n.extra?.group??``}`)+`
2735
2734
  `),n.content&&process.stdout.write(n.content),t.finish_reason===`stop`)break}}catch{}}process.stdout.write(`
2736
- `)}else{let e=``,r=``;for await(let t of mn(p)){if(t.data===`[DONE]`)break;if(t.event===`error`){let e=`Chat API error`,r;try{let n=JSON.parse(t.data);e=n.message||e,r=n.code}catch{}throw new n(e,f.GENERAL,r?`API error: ${r}`:void 0)}try{let n=JSON.parse(t.data);n.request_id&&(r=n.request_id);for(let t of n.output?.choices??[])if(t.message?.content&&(e+=t.message.content),t.finish_reason===`stop`)break}catch{}}t.quiet||c===`text`?k(e):A({answer:e,request_id:r},c)}}});const Pf={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by knowledge base name (fuzzy match, 1-20 chars)`,"zh-CN":`按知识库名称筛选(模糊匹配,1–20 个字符)`}},...gf,...z};var Ff=w({description:{"en-US":`List knowledge bases in the workspace`,"zh-CN":`列出 Workspace 中的知识库`},auth:`apiKey`,usageArgs:`[flags]`,flags:Pf,notes:[{"en-US":`Auth: uses DashScope API Key (Bearer token).`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or config workspace_id.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或配置项 workspace_id 设置。"},{"en-US":`Use the returned id as --index-id in knowledge base / document management commands.`,"zh-CN":`在知识库/文档管理命令中,将返回的 ID 作为 --index-id 使用。`}],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=B(e),i=T(t.output),a=new URL(D(r,y.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(_f([e.id,e.name,e.embeddingModelName??`-`,e.chunkSize??`-`,e.description??``].join(` `)));k(`total: ${s.data?.total??c.length}`)}else A(s,i)}});const If={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},...z};function Lf(e,t){let n=new URL(D(e,y.indexList));return n.searchParams.set(`pipeline_id`,t),n.searchParams.set(`page_number`,`1`),n.searchParams.set(`page_size`,`1`),n.toString()}async function Rf(e,t,r){let i=(await e.requestJson({path:Lf(t,r),method:`GET`})).data?.rows?.[0];if(!i)throw new n(`Knowledge base not found: ${r}`,f.GENERAL,`Check the id — list knowledge bases in this workspace to verify it.`);return i}function zf(e,t){return` ${e}: ${t??`-`}`}var Bf=w({description:{"en-US":`Show knowledge base configuration details`,"zh-CN":`查看知识库配置详情`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:If,notes:[{"en-US":`Indexing settings are immutable; changing them requires recreating the knowledge base.`,"zh-CN":`索引设置不可修改;如需更改,必须重新创建知识库。`}],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output);if(t.dryRun){A({endpoint:Lf(r,n.indexId),request:null},i);return}let a=await Rf(e.client,r,n.indexId);if(t.quiet){k(a.id??``);return}if(i!==`text`){A(a,i);return}k(`Basic:`),k(zf(`id`,a.id)),k(zf(`name`,a.name)),k(zf(`description`,a.description)),k(zf(`dataType`,a.dataType)),k(`Indexing: [immutable — recreate required to change]`),k(zf(`embeddingModelName`,a.embeddingModelName)),k(zf(`embeddingDimension`,a.embeddingDimension)),k(zf(`chunkSize`,a.chunkSize)),k(zf(`overlapSize`,a.overlapSize)),k(zf(`chunkMode`,a.chunkMode)),k(zf(`separator`,a.separator)),k(`Retrieval:`),k(zf(`rerankModelName`,a.rerankModelName)),k(zf(`rerankMinScore`,a.rerankMinScore)),k(zf(`rerankTopN`,a.rerankTopN)),k(zf(`rerankMode`,a.rerankMode)),k(zf(`enableRewrite`,a.enableRewrite)),k(zf(`denseSimilarityTopK`,a.denseSimilarityTopK)),k(zf(`sparseSimilarityTopK`,a.sparseSimilarityTopK)),k(`Data:`),k(zf(`sourceType`,a.sourceType)),k(zf(`connectorId`,a.connectorId))}});const Vf={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},...gf,...z};var Hf=w({description:{"en-US":`List documents in a knowledge base with parse/index status`,"zh-CN":`列出知识库文档及其解析/索引状态`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:Vf,notes:[{"en-US":`Documents with status FAILED are highlighted in text mode — use the import job status command to inspect failures.`,"zh-CN":`文本模式会突出显示状态为 FAILED 的文档——请使用导入任务状态命令检查失败详情。`},{"en-US":`Page size defaults to 10 (server default), max 100.`,"zh-CN":`分页大小默认为 10(服务端默认值),最大为 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=B(e),i=T(t.output),a=new URL(D(r,y.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=_f([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 Uf={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Import job ID (ingestionId returned by import commands)`,"zh-CN":`导入任务 ID(导入命令返回的 ingestionId)`},required:!0},...gf,wait:{type:`switch`,description:{"en-US":`Poll until the job reaches a terminal state`,"zh-CN":`轮询直到任务进入终态`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待时的轮询间隔(默认:5)`}},...z};function Wf(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 Gf=w({description:{"en-US":`Check knowledge base import job status`,"zh-CN":`检查知识库导入任务状态`},auth:`apiKey`,usageArgs:`--index-id <id> --job-id <id> [flags]`,flags:Uf,notes:[{"en-US":`Both --index-id and --job-id are required (passing only one returns SystemError).`,"zh-CN":`--index-id 和 --job-id 均为必填(只传其中一个会返回 SystemError)。`},{"en-US":`If you see a SystemError, the job may not exist — check the ingestion id in the document list output.`,"zh-CN":`如果出现 SystemError,任务可能不存在——请检查文档列表输出中的 ingestion ID。`},{"en-US":`Overall job states are PENDING / RUNNING / COMPLETED; per-document failures (for example PARSE_FAILED) exit non-zero with the error message passed through.`,"zh-CN":`任务整体状态为 PENDING / RUNNING / COMPLETED;单个文档失败(例如 PARSE_FAILED)时会以非零状态退出,并原样透传错误信息。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),o=new URL(D(i,y.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 s=o.toString();if(t.dryRun){A({endpoint:s,request:null},a);return}let c;if(c=r.wait?await Cf(e.client,t,{statusUrl:s,intervalSec:r.pollInterval??5}):await e.client.requestJson({path:s,method:`GET`}),yf(c).length>0)throw new n(xf(c,`Import job reported document failures.`),f.GENERAL);if(t.quiet){k(c.data?.ingestion_status??`UNKNOWN`);return}a===`text`?Wf(c):A(c,a)}});const Kf=1048576,qf={".doc":{maxBytes:150*Kf,enforce:`block`},".docx":{maxBytes:150*Kf,enforce:`block`},".ppt":{maxBytes:150*Kf,enforce:`block`},".pptx":{maxBytes:150*Kf,enforce:`block`},".pdf":{maxBytes:150*Kf,enforce:`block`},".png":{maxBytes:20*Kf,enforce:`block`},".jpg":{maxBytes:20*Kf,enforce:`block`},".jpeg":{maxBytes:20*Kf,enforce:`block`},".bmp":{maxBytes:20*Kf,enforce:`block`},".gif":{maxBytes:20*Kf,enforce:`block`},".xls":{maxBytes:10*Kf,enforce:`warn`},".xlsx":{maxBytes:10*Kf,enforce:`warn`},".csv":{maxBytes:10*Kf,enforce:`warn`},".md":{maxBytes:10*Kf,enforce:`warn`},".txt":{maxBytes:10*Kf,enforce:`warn`},".html":{maxBytes:10*Kf,enforce:`warn`}};function Jf(e){return ki(e).toLowerCase()in qf}const Yf=/* @__PURE__ */ new Set([`node_modules`,`.git`,`.svn`,`.hg`,`__pycache__`,`.venv`,`venv`,`.env`,`.tox`,`dist`,`build`,`.cache`,`.next`,`.nuxt`]);function Xf(e){let t=[],r=[];function i(e){let a;try{a=Ci(e,{withFileTypes:!0})}catch(t){let r=t.code??`unknown`;throw new n(`Cannot read directory: ${e}`,f.GENERAL,`File system error (${r}) — check the path and permissions.`)}for(let n of a){let a=N(e,n.name);if(n.isDirectory()){Yf.has(n.name)||i(a);continue}n.isFile()&&(Jf(n.name)?t.push(a):r.push(a))}}for(let r of e){let e;try{e=wi(r)}catch(e){let t=e.code??`unknown`;throw new n(`Cannot read path: ${r}`,f.GENERAL,`File system error (${t}) — check the path and permissions.`)}e.isDirectory()?i(r):e.isFile()&&t.push(r)}return{files:t,skipped:r}}function Zf(e){let t=ki(e).toLowerCase(),r=qf[t];if(!r)throw new n(`Unsupported file type: ${t||Di(e)}`,f.USAGE,`Supported formats: ${Object.keys(qf).join(` `)}`);let i;try{i=wi(e).size}catch(t){let r=t.code??`unknown`;throw new n(`Cannot read file: ${e}`,f.GENERAL,`File system error (${r}) — check the path and permissions.`)}if(i>r.maxBytes){let a=r.maxBytes/Kf;if(r.enforce===`block`)throw new n(`File exceeds the ${a} MB limit for ${t}: ${Di(e)}`,f.USAGE);return{sizeBytes:i,warning:`${Di(e)} exceeds the recommended 10 MB for ${t}; the server may reject or truncate it.`}}return{sizeBytes:i}}const Qf=/* @__PURE__ */ new Set([`.doc`,`.docx`,`.ppt`,`.pptx`,`.pdf`,`.xls`,`.xlsx`,`.png`,`.jpg`,`.jpeg`,`.bmp`,`.gif`]);function $f(e,t){let r;try{r=Si(e)}catch(r){let i=r.code??`unknown`,a=`File system error (${i}) — check the path and permissions.`;throw t&&i===`ENOENT`&&!ki(e)&&!e.includes(`/`)&&!e.includes(`\\`)&&(a+=` If you meant to pass text content directly, use ${t} instead of --content-file.`),new n(`Cannot read file: ${e}`,f.GENERAL,a)}try{return new TextDecoder(`utf-8`,{fatal:!0}).decode(r)}catch{let t=ki(e).toLowerCase(),r=Qf.has(t)?`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 n(`File is not valid UTF-8 plain text: ${Di(e)}`,f.USAGE,r)}}const ep={file:{type:`array`,valueHint:`<path>`,description:{"en-US":`Local file or directory path (repeatable). Directories are scanned recursively; unsupported formats are skipped`,"zh-CN":`本地文件或目录路径(可重复)。目录会递归扫描,不支持的格式将被跳过`},required:!0},indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Import into this knowledge base after registration (one job for all files)`,"zh-CN":`文件注册后导入该知识库(所有文件共用一个任务)`}},categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Target data-center category; defaults to the workspace default category`,"zh-CN":`目标数据中心类目;默认为 Workspace 的默认类目`}},tag:{type:`array`,valueHint:`<text>`,description:{"en-US":`File tag (repeatable), applied to every uploaded file`,"zh-CN":`文件标签(可重复),应用于每个上传文件`}},wait:{type:`switch`,description:{"en-US":`Poll the import job to a terminal state (needs --index-id)`,"zh-CN":`轮询导入任务直到进入终态(需要 --index-id)`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待时的轮询间隔(默认:5)`}},...z};var tp=w({description:{"en-US":`Upload local files or directories to the data center and optionally import into a knowledge base`,"zh-CN":`上传本地文件或目录到数据中心,并可选择导入知识库`},auth:`apiKey`,usageArgs:`--file <path> [flags]`,flags:ep,notes:[{"en-US":`Pipeline: apply upload lease → PUT to OSS → register file → (with --index-id) create import job.`,"zh-CN":`处理流程:申请上传凭证 → PUT 到 OSS → 注册文件 →(传入 --index-id 时)创建导入任务。`},{"en-US":`Without --category-id the workspace default category is resolved automatically.`,"zh-CN":`未传入 --category-id 时,会自动解析 Workspace 的默认类目。`},{"en-US":`Directories are scanned recursively; node_modules, .git, and similar are skipped automatically.`,"zh-CN":`目录会递归扫描;node_modules、.git 等目录会被自动跳过。`},{"en-US":`Multiple files are processed sequentially; on failure, already-registered file ids are listed in the error hint.`,"zh-CN":`多个文件会依次处理;失败时,错误提示会列出已经注册成功的文件 ID。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),{files:o,skipped:s}=Xf(r.file);if(o.length===0)throw new n(`No supported files found`,f.USAGE,`Supported formats: .pdf .doc .docx .ppt .pptx .xls .xlsx .csv .md .txt .html .png .jpg .jpeg .bmp .gif`);let c=o.map(e=>{let t=Zf(e);return t.warning&&process.stderr.write(`Warning: ${t.warning}\n`),{filePath:e,sizeBytes:t.sizeBytes}});if(t.dryRun){let e=r.categoryId??`default`,t=c.flatMap(t=>[{step:`applyFileUploadLease`,endpoint:D(i,y.applyFileUploadLease),request:{category:e,fileName:Di(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:D(i,y.addFile),request:{leaseId:`<leaseId>`,category:e,parser:`AUTO_SELECT`,...r.tag?.length?{tags:r.tag}:{}}}]);r.indexId&&t.push({step:`createImportJob`,endpoint:D(i,y.indexJobCreate),request:{indexId:r.indexId,sourceType:`DATA_CENTER_FILE`,docIds:[`<fileId>`]}}),A({steps:t,skipped:s},a);return}let l=r.categoryId??`default`,u=[];for(let t of c)try{let a=Si(t.filePath),o=ei(`md5`).update(a).digest(`base64`),s=await e.client.requestJson({path:D(i,y.applyFileUploadLease),method:`POST`,body:{category:l,fileName:Di(t.filePath),sizeBytes:String(t.sizeBytes),contentMd5:o}}),c=s.data?.leaseId,d=s.data?.param;if(!c||!d?.url)throw new n(`Upload lease response missing leaseId/url for ${t.filePath}`,f.GENERAL);let p;try{p=await fetch(d.url,{method:d.method??`PUT`,headers:d.headers,body:a})}catch(e){let r=e.cause?.code;throw new n(`OSS upload failed for ${Di(t.filePath)}`,f.NETWORK,r?`Network error (${r}).`:void 0,{cause:e})}if(!p.ok){let e=await p.text().catch(()=>``);throw new n(`OSS upload rejected (HTTP ${p.status}) for ${Di(t.filePath)}${e?`: ${e.slice(0,300)}`:``}`,f.GENERAL)}let m=(await e.client.requestJson({path:D(i,y.addFile),method:`POST`,body:{leaseId:c,category:l,parser:`AUTO_SELECT`,...r.tag?.length?{tags:r.tag}:{}}})).data?.fileId;if(!m)throw new n(`addFile response missing fileId for ${t.filePath}`,f.GENERAL);u.push({path:t.filePath,fileId:m})}catch(e){throw u.length>0?wf(e,`Already registered: ${u.map(e=>e.fileId).join(`, `)}`):e}let d,p;if(r.indexId&&(d=(await e.client.requestJson({path:D(i,y.indexJobCreate),method:`POST`,body:{indexId:r.indexId,sourceType:`DATA_CENTER_FILE`,docIds:u.map(e=>e.fileId)}})).data?.ingestionId,r.wait&&d)){let a=await Cf(e.client,t,{statusUrl:Sf(i,r.indexId,d).toString(),intervalSec:r.pollInterval??5});if(p=vf(a),yf(a).length>0)throw new n(xf(a,`Import job reported document failures.`),f.GENERAL,`Registered file ids: ${u.map(e=>e.fileId).join(`, `)}`)}if(t.quiet){for(let e of u)k(e.fileId);return}if(a===`text`){for(let e of u)k(`${Di(e.path)} ${e.fileId} registered`);d&&k(`job: ${d}`),p&&k(`status: ${p}`);let e=[`Uploaded ${u.length} file${u.length===1?``:`s`}`];if(s.length>0&&e.push(`skipped ${s.length} unsupported`),k(`\n${e.join(`, `)}.`),t.verbose&&s.length>0){k(`Skipped files:`);for(let e of s)k(` ${Di(e)}`)}return}A({files:u.map(e=>({path:e.path,fileId:e.fileId})),skipped:s,...r.indexId?{index_id:r.indexId}:{},...d?{ingestion_id:d}:{},...p?{final_status:p}:{}},a)}});const np={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Knowledge base name (1-20 chars, unique in workspace)`,"zh-CN":`知识库名称(1–20 个字符,在 Workspace 中唯一)`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`What this knowledge base holds and what it is for — tells bases apart in the workspace list (1-500 chars)`,"zh-CN":`知识库装了什么内容、给谁用,用于在 Workspace 列表中区分同类知识库(1–500 个字符)`},required:!0},docId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Data-center file id to import (repeatable); mutually exclusive with --category-id`,"zh-CN":`要导入的数据中心文件 ID(可重复);不能与 --category-id 同时使用`}},categoryId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Import every file under this category (repeatable); mutually exclusive with --doc-id`,"zh-CN":`导入该类目下的所有文件(可重复);不能与 --doc-id 同时使用`}},embeddingModel:{type:`string`,valueHint:`<name>`,description:{"en-US":`Embedding model name (default: text-embedding-v4)`,"zh-CN":`Embedding 模型名称(默认:text-embedding-v4)`}},chunkSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Chunk size in characters (default: 600, recommended 300-800)`,"zh-CN":`Chunk 字符数(默认:600,建议:300–800)`}},wait:{type:`switch`,description:{"en-US":`Poll the initial import job to a terminal state`,"zh-CN":`轮询初始导入任务直到进入终态`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待时的轮询间隔(默认:5)`}},...z};function rp(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 ip=w({description:{"en-US":`Create a knowledge base and import data-center files or categories`,"zh-CN":`创建知识库并导入数据中心文件或类目`},auth:`apiKey`,usageArgs:`--name <text> --description <text> (--doc-id <id> | --category-id <id>) [flags]`,flags:np,notes:[{"en-US":`Structure/sink types are fixed to the default document knowledge base (unstructured, BUILT_IN storage).`,"zh-CN":`结构和存储类型固定为默认文档知识库(unstructured、BUILT_IN 存储)。`},{"en-US":`Returns the knowledge base id (pipelineId) and the initial import job id (ingestionId).`,"zh-CN":`返回知识库 ID(pipelineId)和初始导入任务 ID(ingestionId)。`},{"en-US":`Use the import job status command (or --wait) to track the initial import.`,"zh-CN":`使用导入任务状态命令(或 --wait)跟踪初始导入。`}],exampleArgs:[{"en-US":`--name demo --description 'product docs' --doc-id file-xxx --workspace-id ws-xxx`,"zh-CN":`--name demo --description '产品文档' --doc-id file-xxx --workspace-id ws-xxx`},{"en-US":`--name demo --description 'product docs' --category-id cate-xxx --wait`,"zh-CN":`--name demo --description '产品文档' --category-id cate-xxx --wait`}],validate(e){if(e.name.length<1||e.name.length>20)return`--name must be 1-20 characters`;if(e.description.length<1||e.description.length>500)return`--description must be 1-500 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:t,flags:r}=e,i=B(e),a=T(t.output),o={name:r.name,description:r.description,structureType:`unstructured`,sinkType:`BUILT_IN`,embeddingModelName:r.embeddingModel??`text-embedding-v4`,chunkSize:r.chunkSize??600,...rp(r)},s=D(i,y.indexCreateV2);if(t.dryRun){A({endpoint:s,request:o},a);return}let c=await e.client.requestJson({path:s,method:`POST`,body:o}),l=c.data?.pipelineId,u=c.data?.ingestionId,d;if(r.wait&&l&&u){let a=await Cf(e.client,t,{statusUrl:Sf(i,l,u).toString(),intervalSec:r.pollInterval??5});if(d=vf(a),yf(a).length>0)throw new n(xf(a,`Initial import reported document failures.`),f.GENERAL,`Knowledge base created: ${l}`,{api:{requestId:a.request_id}})}if(t.quiet){k(l??``);return}if(a===`text`){k(`index_id: ${l??`-`}`),u&&k(`ingestion_id: ${u}`),d&&k(`status: ${d}`),k(`Next: check the import job status, then search against this knowledge base.`);return}A(d?{...c,final_status:d}:c,a)}});const ap={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`New knowledge base name (1-20 chars)`,"zh-CN":`新的知识库名称(1–20 个字符)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`New knowledge base description`,"zh-CN":`新的知识库描述`}},rerankMinScore:{type:`number`,valueHint:`<score>`,description:{"en-US":`Rerank minimum score threshold, range 0-1 (chunks below are filtered)`,"zh-CN":`Rerank 最低分数阈值,范围 0–1(低于阈值的 Chunk 会被过滤)`}},...z};var op=w({description:{"en-US":`Update knowledge base name, description or rerank threshold`,"zh-CN":`更新知识库名称、描述或 Rerank 阈值`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:ap,notes:[{"en-US":`Indexing settings (embedding model, chunk size, etc.) are immutable — recreate the knowledge base to change them.`,"zh-CN":`索引设置(Embedding 模型、Chunk 大小等)不可修改——如需更改,请重新创建知识库。`}],exampleArgs:[{"en-US":`--index-id idx-xxx --description 'product docs v2' --workspace-id ws-xxx`,"zh-CN":`--index-id idx-xxx --description '产品文档 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=B(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=D(r,y.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 sp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},...z};var cp=w({description:{"en-US":`Delete a knowledge base with all its documents and chunks`,"zh-CN":`删除知识库及其所有文档和 Chunk`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the knowledge base and all of its documents and chunks. Data-center files are not deleted.`,"zh-CN":`该操作会永久删除知识库及其全部文档和 Chunk,但不会删除数据中心文件。`}},usageArgs:`--index-id <id> [flags]`,flags:sp,notes:[{"en-US":`Irreversible — the knowledge base and all indexed content are permanently removed.`,"zh-CN":`该操作不可撤销——知识库及所有已索引内容将被永久删除。`},{"en-US":`Files in the data center are not affected; only the knowledge base index is deleted.`,"zh-CN":`数据中心中的文件不受影响;仅删除知识库索引。`}],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={index_id:n.indexId},o=D(r,y.indexDelete);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(`deleted: ${n.indexId}`);return}A(s,i)}}});const lp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},docId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Document ID to delete (repeatable)`,"zh-CN":`要删除的文档 ID(可重复)`},required:!0},...z};var up=w({description:{"en-US":`Delete documents and their chunks from a knowledge base`,"zh-CN":`从知识库中删除文档及其 Chunk`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the selected documents and all of their chunks.`,"zh-CN":`该操作会永久删除所选文档及其全部 Chunk,且无法撤销。`}},usageArgs:`--index-id <id> --doc-id <id> [flags]`,flags:lp,notes:[{"en-US":`Removes documents from the knowledge base index only; the source files remain in the data center.`,"zh-CN":`仅从知识库索引中移除文档;源文件仍保留在数据中心。`},{"en-US":"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.","zh-CN":"请使用 `knowledge doc list --quiet` 返回的 doc_id,而不是 `knowledge doc upload` 返回的 fileId。通过 `knowledge create --doc-id` 创建的文档,其 doc_id 等于 fileId;通过 `knowledge doc upload --index-id` 导入的文档,其 doc_id 可能带有 Workspace 后缀。"},{"en-US":`Deletion may take up to ~30s to propagate — the document may still appear in the doc list briefly.`,"zh-CN":`删除结果最多可能需要约 30 秒才会生效——文档可能会短暂地继续出现在列表中。`},{"en-US":`The output lists the ids actually deleted.`,"zh-CN":`输出会列出实际删除的 ID。`}],exampleArgs:[`--index-id idx-xxx --doc-id file-xxx --workspace-id ws-xxx --dry-run`,`--index-id idx-xxx --doc-id file-a --doc-id file-b --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={index_id:n.indexId,doc_ids:n.docId},o=D(r,y.indexDeleteFile);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?.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)}});const dp={docId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Data-center file ID to tag (repeatable, 1-20 per call)`,"zh-CN":`要添加标签的数据中心文件 ID(可重复,每次调用 1–20 个)`},required:!0},tag:{type:`array`,valueHint:`<text>`,description:{"en-US":`Tag applied to every --doc-id (repeatable, each up to 32 chars)`,"zh-CN":`应用于每个 --doc-id 的标签(可重复,每个最多 32 个字符)`},required:!0},mode:{type:`string`,valueHint:`<mode>`,description:{"en-US":`Update mode: append (default) or overwrite`,"zh-CN":`更新模式:append(默认)或 overwrite`}},...z};var fp=w({description:{"en-US":`Batch update tags on data-center files`,"zh-CN":`批量更新数据中心文件标签`},auth:`apiKey`,usageArgs:`--doc-id <id> --tag <text> [flags]`,flags:dp,notes:[{"en-US":`The same tag set is applied to every --doc-id; run the command multiple times for different tag sets.`,"zh-CN":`同一组标签会应用于每个 --doc-id;若需应用不同标签组,请多次运行该命令。`},{"en-US":`Server limits: up to 100 tags per file, total tag length up to 700 chars, tag up to 32 chars.`,"zh-CN":`服务端限制:每个文件最多 100 个标签,标签总长度最多 700 个字符,单个标签最多 32 个字符。`}],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=B(e),i=T(t.output),a={fileInfos:n.docId.map(e=>({fileId:e,tags:n.tag})),updateMode:(n.mode??`append`).toUpperCase()},o=D(r,y.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 pp={scene:{type:`string`,valueHint:`<scene>`,description:{"en-US":`Service scene: chat (Q&A) or search (retrieval)`,"zh-CN":`服务场景:chat(问答)或 search(检索)`},required:!0},status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter by status: draft, deployed (includes edited) or deleted`,"zh-CN":`按状态筛选:draft、deployed(包含 edited)或 deleted`}},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by service name (fuzzy match)`,"zh-CN":`按服务名称模糊筛选`}},agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by exact agent ID`,"zh-CN":`按 Agent ID 精确筛选`}},indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by exact linked knowledge base (pipeline) ID`,"zh-CN":`按关联的知识库(Pipeline)ID 精确筛选`}},...gf,...z},mp=[`chat`,`search`],hp=[`draft`,`deployed`,`deleted`];var gp=w({description:{"en-US":`List retrieval / Q&A services (agents) in the workspace`,"zh-CN":`列出 Workspace 中的检索/问答服务(Agent)`},auth:`apiKey`,usageArgs:`--scene <chat|search> [flags]`,flags:pp,notes:[{"en-US":`A scene (chat or search) is required — run once per scene to see both.`,"zh-CN":`必须指定场景(chat 或 search)——要查看两类服务,请分别运行一次。`},{"en-US":`Use the returned agent_id with the search or chat commands, or with service management commands.`,"zh-CN":`将返回的 agent_id 用于 search/chat 命令或服务管理命令。`}],exampleArgs:[`--scene chat --workspace-id ws-xxx`,`--scene search --status deployed`],validate(e){if(!mp.includes(e.scene))return`--scene must be chat or search`;if(e.status!==void 0&&!hp.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=B(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=D(r,y.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(_f([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 _p={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Specific version to inspect (beta or a published number); omit for all versions`,"zh-CN":`要查看的指定版本(beta 或已发布版本号);省略则返回全部版本`}},...z};function vp(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??[]){let t=typeof e.id==`string`?e.id:`?`,n=typeof e.name==`string`?` (${e.name})`:``;k(` kb: ${t}${n}`)}}}var yp=w({description:{"en-US":`Show service (agent) details including per-version configuration`,"zh-CN":`查看服务(Agent)详情及各版本配置`},auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:_p,notes:[{"en-US":`Without --agent-version all versions are returned (beta draft plus published numbers).`,"zh-CN":`未传入 --agent-version 时,会返回所有版本(beta 草稿和已发布版本号)。`},{"en-US":`The version value is passed through as-is; the valid set is server-side state.`,"zh-CN":`版本值将原样传递;有效版本集合由服务端状态决定。`}],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=B(e),i=T(t.output),a={agent_id:n.agentId,...n.agentVersion?{agent_version:n.agentVersion}:{}},o=D(r,y.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??[])vp(e)}});const bp={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Service name (up to 200 chars, unique per scene in the workspace)`,"zh-CN":`服务名称(最多 200 个字符,在 Workspace 的同一场景中唯一)`},required:!0},scene:{type:`string`,valueHint:`<scene>`,description:{"en-US":`Service scene: chat (Q&A) or search (retrieval)`,"zh-CN":`服务场景:chat(问答)或 search(检索)`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`What this service answers and who it serves — recommended: agents read it to pick the right service (up to 1000 chars)`,"zh-CN":`这个服务能回答什么、给谁用 —— 建议填写:agent 靠它判断该调用哪个服务(最多 1000 个字符)`}},indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Bind this knowledge base; other settings use server defaults`,"zh-CN":`绑定该知识库;其他设置使用服务端默认值`}},...z};var xp=w({description:{"en-US":`Create a retrieval / Q&A service (initial status: draft, version: beta)`,"zh-CN":`创建检索/问答服务(初始状态:draft,版本:beta)`},auth:`apiKey`,usageArgs:`--name <text> --scene <chat|search> [flags]`,flags:bp,notes:[{"en-US":`Without an explicit configuration the server applies its default agent settings.`,"zh-CN":`未显式提供配置时,服务端会应用默认 Agent 设置。`},{"en-US":`The draft (beta) version can be tested via --agent-version beta on search/chat before deploying.`,"zh-CN":`部署前,可在 search/chat 命令中使用 --agent-version beta 测试草稿(beta)版本。`},{"en-US":`Requires the knowledge-base create permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库创建权限。`}],exampleArgs:[{"en-US":`--name my-qa --scene chat --description 'answers product FAQs' --workspace-id ws-xxx`,"zh-CN":`--name my-qa --scene chat --description '回答产品常见问题' --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=B(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=D(r,y.agentCreate);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=Tf(s,`agent_id`);if(t.quiet){k(c??``);return}if(i===`text`){k(`created: ${c??`-`} (status: ${Tf(s,`agent_status`)??`draft`}, version: ${Tf(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 Sp=[`true`,`false`],Cp={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`New service name (up to 200 chars)`,"zh-CN":`新服务名称(最多 200 个字符)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`New service description (up to 1000 chars)`,"zh-CN":`新服务描述(最多 1000 个字符)`}},agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Target version (default: beta draft). Published versions only accept --version-desc`,"zh-CN":`目标版本(默认:beta 草稿)。已发布版本只接受 --version-desc`}},versionDesc:{type:`string`,valueHint:`<text>`,description:{"en-US":`Version description`,"zh-CN":`版本描述`}},policy:{type:`string`,valueHint:`<policy>`,description:{"en-US":`Agent policy: turbo (fast) or agentic (multi-turn)`,"zh-CN":`Agent 策略:turbo(快速)或 agentic(多轮)`}},model:{type:`string`,valueHint:`<name>`,description:{"en-US":`Generation model code (must be in the platform allowlist)`,"zh-CN":`生成模型代码(必须在平台白名单中)`}},temperature:{type:`number`,valueHint:`<n>`,description:{"en-US":`Sampling temperature, range 0-2`,"zh-CN":`采样温度,范围 0–2`}},maxLlmCalls:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max LLM calls per request, range 1-30`,"zh-CN":`每次请求最大 LLM 调用次数,范围 1–30`}},enableSessionFile:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable session files: true or false`,"zh-CN":`启用会话文件:true 或 false`}},enableRefusal:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable refusal answers: true or false`,"zh-CN":`启用拒答:true 或 false`}},enableAntiLeak:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable anti prompt-leak: true or false`,"zh-CN":`启用防提示词泄露:true 或 false`}},enableRichText:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable rich text output: true or false`,"zh-CN":`启用富文本输出:true 或 false`}},enableCitation:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable citations: true or false`,"zh-CN":`启用引用:true 或 false`}},configFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`JSON file replacing the whole agent_config (for nested settings like kb_search_configs); mutually exclusive with scalar config flags`,"zh-CN":`替换整个 agent_config 的 JSON 文件(用于 kb_search_configs 等嵌套设置);不能与标量配置选项同时使用`}},...z};function wp(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 Tp(e){let t;try{t=Si(e,`utf-8`)}catch(t){let r=t.code??`unknown`;throw new n(`Cannot read config file: ${e}`,f.GENERAL,`File system error (${r}) — check the path and permissions.`)}let r;try{r=JSON.parse(t)}catch{throw new n(`--config-file must contain valid JSON.`,f.USAGE)}if(typeof r!=`object`||!r||Array.isArray(r))throw new n(`--config-file must contain a JSON object.`,f.USAGE);let i=r;return Dp(i),i}const Ep=/* @__PURE__ */ 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`,`user_system_prompt`,`anti_leak_prompt`,`refusal_prompt`,`credibility_prompt`,`enable_thinking`,`enable_temperature`,`enable_credibility`,`enable_max_completion_tokens`,`session_file_parse_mode`,`rerank_top_n`,`hybrid_rerank`,`kb_search_configs`]);function Dp(e){if(e.agent_policy!==void 0&&![`turbo`,`agentic`].includes(e.agent_policy))throw new n(`agent_policy must be turbo or agentic`,f.USAGE);if(e.temperature!==void 0&&(e.temperature<0||e.temperature>2))throw new n(`temperature must be between 0 and 2`,f.USAGE);if(e.max_num_llm_calls!==void 0&&(e.max_num_llm_calls<1||e.max_num_llm_calls>30))throw new n(`max_num_llm_calls must be between 1 and 30`,f.USAGE);if(e.rerank_top_n!==void 0&&(e.rerank_top_n<1||e.rerank_top_n>20))throw new n(`rerank_top_n must be between 1 and 20`,f.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.
2737
- `)}for(let t of Object.keys(e))Ep.has(t)||process.stderr.write(`Warning: unknown agent_config field passed through: ${t}\n`)}async function Op(e,t,n){return((await e.requestJson({path:D(t,y.agentGet),method:`POST`,body:{agent_id:n,agent_version:`beta`}})).data?.agent_details??[]).find(e=>e.agent_version===`beta`)?.agent_config??{}}var kp=w({description:{"en-US":`Update service name, description or draft configuration`,"zh-CN":`更新服务名称、描述或草稿配置`},auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:Cp,notes:[{"en-US":`Configuration changes only apply to the beta draft; published versions accept --version-desc only.`,"zh-CN":`配置修改只应用于 beta 草稿;已发布版本只接受 --version-desc。`},{"en-US":`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.`,"zh-CN":`要修改已发布版本的配置,请先更新 beta 草稿(不传 --agent-version,或传 --agent-version beta),然后运行 service deploy 发布新版本。`},{"en-US":`Scalar config flags merge into the current draft config (read-merge-write); --config-file replaces the whole config and is mutually exclusive with them.`,"zh-CN":`标量配置选项会合并到当前草稿配置(读取-合并-写入);--config-file 会替换整个配置,且不能与标量配置选项同时使用。`},{"en-US":`After updating the draft, verify with --agent-version beta on search/chat, then deploy.`,"zh-CN":`更新草稿后,先在 search/chat 命令中使用 --agent-version beta 验证,再部署。`},{"en-US":`Requires the knowledge-base modify permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库修改权限。`}],exampleArgs:[`--agent-id aid-xxx --temperature 0.7 --workspace-id ws-xxx`,`--agent-id aid-xxx --config-file ./agent-config.json`,{"en-US":`--agent-id aid-xxx --agent-version 1 --version-desc 'first stable release'`,"zh-CN":`--agent-id aid-xxx --agent-version 1 --version-desc '首个稳定版本'`}],validate(e){let t=Object.keys(wp(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&&!Sp.includes(n))return`${t} must be true or false`},async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a=wp(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 Op(e.client,r,n.agentId),...a},Dp(s))):s=Tp(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=D(r,y.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 Ap={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},versionDesc:{type:`string`,valueHint:`<text>`,description:{"en-US":`Description for the newly published version`,"zh-CN":`新发布版本的描述`}},...z};var jp=w({description:{"en-US":`Publish the beta draft of a service as a new version`,"zh-CN":`将服务的 beta 草稿发布为新版本`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This publishes the current draft as a new version and changes the behavior seen by live callers.`,"zh-CN":`该操作会将当前草稿发布为新版本,并改变线上调用方使用的服务行为。`}},usageArgs:`--agent-id <id> [flags]`,flags:Ap,notes:[{"en-US":`The version number auto-increments; status becomes deployed.`,"zh-CN":`版本号会自动递增;状态将变为 deployed。`},{"en-US":`Publishing affects live callers — the confirmation prompt guards against accidents.`,"zh-CN":`发布会影响线上调用方——确认提示用于避免误操作。`},{"en-US":`Requires the knowledge-base modify permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库修改权限。`}],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`,{"en-US":`--agent-id aid-xxx --version-desc 'tuned rerank params' --yes`,"zh-CN":`--agent-id aid-xxx --version-desc '已调优 Rerank 参数' --yes`}],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={agent_id:n.agentId,...n.versionDesc?{agent_version_desc:n.versionDesc}:{}},o=D(r,y.agentDeploy);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=Tf(s,`agent_version`);if(t.quiet){k(c??``);return}if(i===`text`){k(`deployed: ${n.agentId} version ${c??`-`}`);return}A(s,i)}});const Mp={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},...z};var Np=w({description:{"en-US":`Delete a retrieval / Q&A service (soft delete, idempotent)`,"zh-CN":`删除检索/问答服务(软删除,幂等)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes the service and makes its agent ID unavailable for search and chat calls. The operation cannot be undone.`,"zh-CN":`该操作会删除服务,使其 Agent ID 无法再用于搜索和对话调用,且无法撤销。`}},usageArgs:`--agent-id <id> [flags]`,flags:Mp,notes:[{"en-US":`Deletion cannot be undone; the agent_id becomes unusable for search and chat calls.`,"zh-CN":`删除无法撤销;该 agent_id 将不能再用于 search 和 chat 调用。`},{"en-US":`Idempotent — deleting an already-deleted service does not fail.`,"zh-CN":`该操作具有幂等性——重复删除已删除的服务不会失败。`},{"en-US":`Requires the knowledge-base delete permission in the workspace.`,"zh-CN":`需要 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=B(e),i=T(t.output),a={agent_id:n.agentId},o=D(r,y.agentDelete);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(`deleted: ${n.agentId} (status: ${Tf(s,`agent_status`)??`deleted`})`);return}A(s,i)}}});const Pp={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Source service (agent) ID to copy`,"zh-CN":`要复制的源服务(Agent)ID`},required:!0},...z};var Fp=w({description:{"en-US":`Copy a service into a new draft (name gets a copy_ prefix)`,"zh-CN":`将服务复制为新草稿(名称会添加 copy_ 前缀)`},auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:Pp,notes:[{"en-US":`The copy starts as a beta draft; test it with --agent-version beta, then deploy to publish.`,"zh-CN":`副本初始为 beta 草稿;请使用 --agent-version beta 测试,然后部署发布。`},{"en-US":`Requires the knowledge-base create permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库创建权限。`}],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={agent_id:n.agentId},o=D(r,y.agentCopy);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=Tf(s,`agent_id`);if(t.quiet){k(c??``);return}if(i===`text`){k(`new agent_id: ${c??`-`} (name: ${Tf(s,`agent_name`)??`-`}, status: ${Tf(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 Ip={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},docId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Owning document ID from the doc list command; required in practice for all knowledge base types`,"zh-CN":`来自文档列表命令的所属文档 ID;实际使用时所有知识库类型都需要提供`}},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`Chunk body text, up to 6000 chars (document-type); alternative to --content-file`,"zh-CN":`Chunk 正文,最多 6000 个字符(文档型);与 --content-file 二选一`}},contentFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read chunk body from a UTF-8 plain text file (.md/.txt etc.)`,"zh-CN":`从 UTF-8 纯文本文件(.md/.txt 等)读取 Chunk 正文`}},title:{type:`string`,valueHint:`<text>`,description:{"en-US":`Chunk title, up to 50 chars (document-type)`,"zh-CN":`Chunk 标题,最多 50 个字符(文档型)`}},imageUrl:{type:`array`,valueHint:`<url>`,description:{"en-US":`Chunk image URL (repeatable, up to 10; document-type)`,"zh-CN":`Chunk 图片 URL(可重复,最多 10 个;文档型)`}},field:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Arbitrary field entry (repeatable) for table/image knowledge bases where keys are Excel column headers; mutually exclusive with content/title/image flags`,"zh-CN":`表格/图片知识库的自定义字段(可重复),键为 Excel 列标题;不能与 content/title/image 相关选项同时使用`}},...z};function Lp(e){let t={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new n(`--field must be key=value, got: ${r}`,f.USAGE);t[r.slice(0,e)]=r.slice(e+1)}return t}var Rp=w({description:{"en-US":`Add a chunk directly to a knowledge base`,"zh-CN":`直接向知识库添加 Chunk`},auth:`apiKey`,usageArgs:`--index-id <id> (--content <text> | --field <k=v>) [flags]`,flags:Ip,notes:[{"en-US":`Document / table / image knowledge bases are supported; audio-video ones are not.`,"zh-CN":`支持文档、表格和图片知识库;不支持音视频知识库。`},{"en-US":`--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.`,"zh-CN":`实际使用时,所有知识库类型都需要 --doc-id。请使用文档列表命令返回的文档级 ID;Chunk 列表每行返回的 doc_id 不被接受。`},{"en-US":`Image-type documents do not support text chunks. Target a text-type document (docx/pdf/txt) instead.`,"zh-CN":`图片型文档不支持文本 Chunk;请改为操作文本型文档(docx/pdf/txt)。`},{"en-US":`The API is idempotent but rate-limited to 10 calls per second — throttle batch scripts.`,"zh-CN":`该 API 具有幂等性,但限流为每秒 10 次调用——批处理脚本需要控制速率。`},{"en-US":`The response carries no chunk id; list chunks afterwards to find the new one.`,"zh-CN":`响应不包含 Chunk ID;添加后请列出 Chunk 以查找新条目。`},{"en-US":`For table/image knowledge bases use --field with Excel column headers as keys; values are passed through as strings.`,"zh-CN":`表格/图片知识库请使用 --field,并以 Excel 列标题作为键;值将按字符串原样传递。`}],exampleArgs:[{"en-US":`--index-id idx-xxx --content "chunk text" --title intro --workspace-id ws-xxx`,"zh-CN":`--index-id idx-xxx --content "Chunk 文本" --title 简介 --workspace-id ws-xxx`},{"en-US":`--index-id idx-xxx --field columnA=v1 --field columnB=v2`,"zh-CN":`--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:t,flags:r}=e,i=B(e),a=T(t.output),o;if(r.field?.length)o=Lp(r.field);else{let e=r.contentFile===void 0?r.content:$f(r.contentFile,`--content`);if(typeof e==`string`&&e.length>6e3)throw new n(`Chunk content must be at most 6000 characters`,f.USAGE);o={...e===void 0?{}:{content:e},...r.title===void 0?{}:{title:r.title},...r.imageUrl?.length?{image_urls:r.imageUrl}:{}}}let s={pipelineId:r.indexId,...r.docId?{dataId:r.docId}:{},field:o},c=D(i,y.chunkCreate);if(t.dryRun){A({endpoint:c,request:s},a);return}let l=await e.client.requestJson({path:c,method:`POST`,body:s});if(!t.quiet){if(a===`text`){k(`chunk created (pipeline: ${r.indexId})`),k(`List chunks to find the new chunk id.`);return}A(l,a)}}});const zp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},docId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Only show chunks belonging to this document`,"zh-CN":`仅显示属于该文档的 Chunk`}},...gf,...z};var Bp=w({description:{"en-US":`List chunks in a knowledge base with content and status`,"zh-CN":`列出知识库中的 Chunk 及其内容和状态`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:zp,notes:[{"en-US":`Use metadata._id as the chunk id and metadata.doc_id as the document id in chunk update/delete commands.`,"zh-CN":`在 Chunk 更新/删除命令中,使用 metadata._id 作为 Chunk ID,使用 metadata.doc_id 作为文档 ID。`},{"en-US":`Page size defaults to 20 (server default), max 100.`,"zh-CN":`分页大小默认为 20(服务端默认值),最大为 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=B(e),i=T(t.output),a={indexId:n.indexId,pageNum:n.pageNumber??1,pageSize:n.pageSize??20,...n.docId?{docId:n.docId}:{}},o=D(r,y.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 Vp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},chunkId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Chunk ID (metadata._id from the chunk list output)`,"zh-CN":`Chunk ID(来自 Chunk 列表输出的 metadata._id)`},required:!0},docId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Document ID owning the chunk (metadata.doc_id from the chunk list output)`,"zh-CN":`Chunk 所属文档 ID(来自 Chunk 列表输出的 metadata.doc_id)`},required:!0},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`New chunk content, 10-6000 chars; alternative to --content-file`,"zh-CN":`新的 Chunk 内容,10–6000 个字符;与 --content-file 二选一`}},contentFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read new content from a UTF-8 plain text file (.md/.txt etc.)`,"zh-CN":`从 UTF-8 纯文本文件(.md/.txt 等)读取新内容`}},title:{type:`string`,valueHint:`<text>`,description:{"en-US":`Chunk title, 0-50 chars (empty string clears it; omit to keep unchanged)`,"zh-CN":`Chunk 标题,0–50 个字符(空字符串表示清除;省略则保持不变)`}},exclude:{type:`switch`,description:{"en-US":`Exclude this chunk from retrieval`,"zh-CN":`在检索中排除该 Chunk`}},include:{type:`switch`,description:{"en-US":`Include this chunk in retrieval (default)`,"zh-CN":`在检索中包含该 Chunk(默认)`}},...z};async function Hp(e,t,r,i,a){for(let n=1;n<=10;n++){let o=(await e.requestJson({path:D(t,y.chunkList),method:`POST`,body:{indexId:r,docId:a,pageNum:n,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 n(`Chunk not found: ${i}`,f.GENERAL,`Check the chunk id via the chunk list command.`)}var Up=w({description:{"en-US":`Update chunk content or toggle its retrieval visibility`,"zh-CN":`更新 Chunk 内容或切换其检索可见性`},auth:`apiKey`,usageArgs:`--index-id <id> --chunk-id <id> --doc-id <id> [flags]`,flags:Vp,notes:[{"en-US":`Content must be 10-6000 characters and within the knowledge base's max chunk size.`,"zh-CN":`内容必须为 10–6000 个字符,且不能超过知识库的最大 Chunk 大小。`},{"en-US":`--content-file expects a UTF-8 plain text file; document formats (.docx/.pdf) are not parsed here.`,"zh-CN":`--content-file 需要 UTF-8 纯文本文件;此处不会解析 .docx/.pdf 等文档格式。`},{"en-US":`Toggling --exclude/--include without new content re-submits the existing content automatically.`,"zh-CN":`仅切换 --exclude/--include 而不提供新内容时,会自动重新提交现有内容。`}],exampleArgs:[{"en-US":`--index-id idx-xxx --chunk-id chunk-xxx --doc-id file-xxx --content "corrected text"`,"zh-CN":`--index-id idx-xxx --chunk-id chunk-xxx --doc-id file-xxx --content "修正后的文本"`},`--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:t,flags:r}=e,i=B(e),a=T(t.output),o=r.contentFile===void 0?r.content:$f(r.contentFile,`--content`);if(o!==void 0&&(o.length<10||o.length>6e3))throw new n(`Chunk content must be 10-6000 characters`,f.USAGE);o===void 0&&(o=t.dryRun?`<current-content (fetched at run time)>`:await Hp(e.client,i,r.indexId,r.chunkId,r.docId));let s={pipelineId:r.indexId,chunkId:r.chunkId,dataId:r.docId,content:o,isDisplayedChunkContent:!r.exclude,...r.title===void 0?{}:{title:r.title}},c=D(i,y.chunkUpdate);if(t.dryRun){A({endpoint:c,request:s},a);return}let l=await e.client.requestJson({path:c,method:`POST`,body:s});if(!t.quiet){if(a===`text`){k(`updated: ${r.chunkId}`);return}A(l,a)}}});const Wp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},chunkId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Chunk ID to delete (repeatable; batches of 10 are sent automatically)`,"zh-CN":`要删除的 Chunk ID(可重复;每 10 个自动分批发送)`},required:!0},...z};function Gp(e,t=10){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}var Kp=w({description:{"en-US":`Delete chunks from a knowledge base (irreversible)`,"zh-CN":`从知识库中删除 Chunk(不可撤销)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the selected chunks and cannot be undone.`,"zh-CN":`该操作会永久删除所选 Chunk,且无法撤销。`}},usageArgs:`--index-id <id> --chunk-id <id> [flags]`,flags:Wp,notes:[{"en-US":`Accepts at most 10 chunk ids per call; larger sets are batched automatically.`,"zh-CN":`每次调用最多接受 10 个 Chunk ID;更多 ID 会自动分批处理。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),o=Gp(r.chunkId),s=D(i,y.chunkDelete);if(t.dryRun){A({endpoint:s,batches:o.map(e=>({request:{pipelineId:r.indexId,chunkIds:e}}))},a);return}let c=0;for(let t of o)try{await e.client.requestJson({path:s,method:`POST`,body:{pipelineId:r.indexId,chunkIds:t}}),c+=t.length}catch(e){throw c>0&&e instanceof n&&!e.hint?new n(e.message,e.exitCode,`${c} chunk(s) in earlier batches were already deleted.`,{cause:e,api:e.api,rawResponse:e.rawResponse}):e}if(!t.quiet){if(a===`text`){k(`deleted: ${c} chunk(s) in ${o.length} batch(es)`);return}A({deleted_count:c,batches:o.length},a)}}});const qp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},start:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range start: Unix seconds or ISO date, must be in the past (default: 24 hours ago)`,"zh-CN":`范围开始时间:Unix 秒或 ISO 日期,必须是过去时间(默认:24 小时前)`}},end:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range end: Unix seconds or ISO date, must be in the past (default: now)`,"zh-CN":`范围结束时间:Unix 秒或 ISO 日期,必须是过去时间(默认:当前时间)`}},...z};function Jp(e){if(/^\d+$/.test(e))return e.length>=13?String(Math.floor(Number(e)/1e3)):e;let t=/^\d{4}-\d{2}-\d{2}([T ].*)?$/.test(e)?Date.parse(e):NaN;if(Number.isNaN(t))throw new n(`Invalid time value: ${e}`,f.USAGE,`Pass Unix seconds (e.g. 1780900000) or an ISO date (e.g. 2026-07-30T00:00:00Z).`);return String(Math.floor(t/1e3))}var Yp=w({description:{"en-US":`Show knowledge base storage and QPS monitoring data`,"zh-CN":`查看知识库存储和 QPS 监控数据`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:qp,notes:[{"en-US":`Defaults to the last 24 hours when --start/--end are omitted.`,"zh-CN":`省略 --start/--end 时,默认查询最近 24 小时。`},{"en-US":`Timestamps are normalized to epoch seconds as required by the server.`,"zh-CN":`时间戳会按服务端要求归一化为 Epoch 秒。`},{"en-US":`Future timestamps are rejected for --start and clamped to now for --end, since the monitor API only returns past data.`,"zh-CN":`监控 API 只返回历史数据,因此未来的 --start 会被拒绝,未来的 --end 会被截断为当前时间。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),o=Math.floor(Date.now()/1e3),s=r.start?Jp(r.start):String(o-86400),c=r.end?Jp(r.end):String(o);if(Number(s)>o)throw new n(`Start time is in the future; the monitor API only accepts past or current timestamps.`,f.USAGE,`Use a start date/time at or before now, or omit --start to default to 24 hours ago.`);let l=Number(c)>o;l&&(c=String(o));let u={indexId:r.indexId,startTimestamp:s,endTimestamp:c},d=D(i,y.indexMonitor);if(t.dryRun){A({endpoint:d,request:u},a);return}let p=await e.client.requestJson({path:d,method:`POST`,body:u});if(a!==`text`){A(p,a);return}l&&k(`note: end time was in the future, clamped to now.`);let m=p.data?.storageMonitorData,h=p.data?.qpsMonitorData;k(`plan: ${p.data?.pipelineCommercialType??`-`}`),k(`storage: ${m?.indexStorageUsage??`-`} / ${m?.indexStorageLimit??`-`}`),k(`peak qps: ${h?.peakQps??`-`}`),k(`qps windows: ${h?.monitorData?.length??0} data point(s)`)}});const Xp={collectionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by exact collection ID`,"zh-CN":`按数据集合 ID 精确筛选`}},parentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`List sub-categories of this exact parent category`,"zh-CN":`列出该父类目下的子类目`}},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by category name (exact match, unlike the knowledge base list)`,"zh-CN":`按类目名称筛选(精确匹配,与知识库列表不同)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Cursor for the next page (from previous output)`,"zh-CN":`下一页游标(来自上一次输出)`}},maxResult:{type:`number`,valueHint:`<n>`,description:{"en-US":`Items per page (default: 20)`,"zh-CN":`每页条目数(默认:20)`}},...z};var Zp=w({description:{"en-US":`List data-center categories`,"zh-CN":`列出数据中心类目`},auth:`apiKey`,usageArgs:`[flags]`,flags:Xp,notes:[{"en-US":`Categories marked [default] are where files land when no category is specified.`,"zh-CN":`未指定类目时,文件会进入标记为 [default] 的类目。`},{"en-US":`Pagination is cursor-based: reuse the printed next token to continue.`,"zh-CN":`分页使用游标:复用输出中的 next token 继续查询。`}],exampleArgs:[`--workspace-id ws-xxx`,`--name my-category`,`--next-token <token>`],async run(e){let{settings:t,flags:n}=e,r=B(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=D(r,y.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(_f(`${e.categoryId} ${e.categoryName}${t}`))}let e=s.data?.nextToken;e&&k(`next: --next-token ${e}`)}else A(s,i)}});const Qp={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Category name (1-20 chars)`,"zh-CN":`类目名称(1–20 个字符)`},required:!0},parentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Create as a sub-category of this category`,"zh-CN":`创建为该类目的子类目`}},collectionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Create under this collection (defaults to the platform collection)`,"zh-CN":`在该数据集合下创建(默认为平台数据集合)`}},...z};var $p=w({description:{"en-US":`Create a data-center category`,"zh-CN":`创建数据中心类目`},auth:`apiKey`,usageArgs:`--name <text> [flags]`,flags:Qp,notes:[{"en-US":`Use categories to organize data-center files by business domain.`,"zh-CN":`使用类目按业务领域组织数据中心文件。`}],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=B(e),i=T(t.output),a={categoryName:n.name,categoryType:`UNSTRUCTURED`,...n.parentId?{parentCategoryId:n.parentId}:{},...n.collectionId?{connectorId:n.collectionId}:{}},o=D(r,y.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)}});const em={categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Category ID to delete`,"zh-CN":`要删除的类目 ID`},required:!0},...z};var tm=w({description:{"en-US":`Delete a data-center category`,"zh-CN":`删除数据中心类目`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes the selected data-center category and cannot be undone.`,"zh-CN":`该操作会删除所选数据中心类目,且无法撤销。`}},usageArgs:`--category-id <id> [flags]`,flags:em,notes:[{"en-US":`Behavior for categories containing files or sub-categories is server-defined — the server error is passed through as-is.`,"zh-CN":`包含文件或子类目时的处理行为由服务端定义——服务端返回的错误将原样透传。`}],exampleArgs:[`--category-id cate-xxx --workspace-id ws-xxx`,`--category-id cate-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={categoryId:n.categoryId},o=D(r,y.deleteCategory);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(`deleted: ${n.categoryId}`);return}A(s,i)}}});const nm={categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Category to list (find ids via the category list command); exact match`,"zh-CN":`要列出文件的类目(通过类目列表命令查找 ID);精确匹配`},required:!0},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by exact file name without its extension (a.md → pass a)`,"zh-CN":`按不含扩展名的文件名精确筛选(a.md 应传入 a)`}},fileId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Filter by exact file ID (repeatable)`,"zh-CN":`按文件 ID 精确筛选(可重复)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Cursor for the next page (from previous output)`,"zh-CN":`下一页游标(来自上一次输出)`}},maxResult:{type:`number`,valueHint:`<n>`,description:{"en-US":`Items per page`,"zh-CN":`每页条目数`}},...z};var rm=w({description:{"en-US":`List files in a data-center category`,"zh-CN":`列出数据中心类目中的文件`},auth:`apiKey`,usageArgs:`--category-id <id> [flags]`,flags:nm,notes:[{"en-US":`A real category id is required — the default value is not resolved here. Find the id via the category list command.`,"zh-CN":`必须提供真实的类目 ID——此处不会解析 default 值。请通过类目列表命令查找 ID。`},{"en-US":`--name matches the exact file name without its extension (for a.md pass a); partial keywords return no results.`,"zh-CN":`--name 精确匹配不含扩展名的文件名(a.md 应传入 a);部分关键字不会返回结果。`},{"en-US":`Pagination is cursor-based: reuse the printed next token to continue.`,"zh-CN":`分页使用游标:复用输出中的 next token 继续查询。`}],exampleArgs:[`--category-id cate-xxx --workspace-id ws-xxx`,{"en-US":`--category-id cate-xxx --name report`,"zh-CN":`--category-id cate-xxx --name 报告`}],async run(e){let{settings:t,flags:n}=e,r=B(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=D(r,y.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(_f([e.fileId,e.status??`-`,e.fileName,e.sizeBytes??`-`].join(` `)));let e=s.data?.nextToken;e&&k(`next: --next-token ${e}`)}else A(s,i)}});const im={fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Data-center file ID`,"zh-CN":`数据中心文件 ID`},required:!0},...z};var am=w({description:{"en-US":`Show data-center file details (size, MD5, tags, timestamps)`,"zh-CN":`查看数据中心文件详情(大小、MD5、标签、时间戳)`},auth:`apiKey`,usageArgs:`--file-id <id> [flags]`,flags:im,exampleArgs:[`--file-id file-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={fileId:n.fileId},o=D(r,y.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??`-`}`);let l=Array.isArray(c?.tags)?c.tags.join(`, `):c?.tags??`-`;k(`tags: ${l||`-`}`)}});const om={fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Data-center file ID to delete`,"zh-CN":`要删除的数据中心文件 ID`},required:!0},...z};var sm=w({description:{"en-US":`Permanently delete a file from the data center`,"zh-CN":`从数据中心永久删除文件`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the data-center file. Knowledge-base document indexes that reference it may become invalid.`,"zh-CN":`该操作会永久删除数据中心文件;引用该文件的知识库文档索引可能失效。`}},usageArgs:`--file-id <id> [flags]`,flags:om,notes:[{"en-US":`Irreversible. If knowledge bases reference this file, their related document indexes become invalid.`,"zh-CN":`该操作不可撤销。如果知识库引用了此文件,其相关文档索引将失效。`},{"en-US":`To remove a document from a single knowledge base only, use the document delete command instead.`,"zh-CN":`如果只需从单个知识库中移除文档,请改用文档删除命令。`}],exampleArgs:[`--file-id file-xxx --workspace-id ws-xxx`,`--file-id file-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={fileId:n.fileId},o=D(r,y.deleteFile);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(`deleted: ${n.fileId}`);return}A(s,i)}}});const cm={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Collection name`,"zh-CN":`数据集合名称`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`What this collection holds and what it is for — tells collections apart in the list`,"zh-CN":`数据集合装了什么内容、给谁用,用于在列表中区分同类集合`},required:!0},storeType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Storage: platform (managed) or custom (your own OSS bucket)`,"zh-CN":`存储类型:platform(托管)或 custom(自有 OSS Bucket)`}},ossRegion:{type:`string`,valueHint:`<id>`,description:{"en-US":`OSS region id (required with --store-type custom)`,"zh-CN":`OSS Region ID(使用 --store-type custom 时必填)`}},ossBucket:{type:`string`,valueHint:`<name>`,description:{"en-US":`OSS bucket name (required with --store-type custom)`,"zh-CN":`OSS Bucket 名称(使用 --store-type custom 时必填)`}},...z};var lm=w({description:{"en-US":`Create a FILE data collection`,"zh-CN":`创建 FILE 数据集合`},auth:`apiKey`,usageArgs:`--name <text> --description <text> [flags]`,flags:cm,notes:[{"en-US":`Store type defaults to platform (managed storage); custom uses your authorized OSS bucket.`,"zh-CN":`存储类型默认为 platform(托管存储);custom 使用已授权的自有 OSS Bucket。`},{"en-US":`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.`,"zh-CN":`自定义 Bucket 必须带有 bailian-connector-access=ReadAndWrite 标签(百炼基于标签的访问控制);缺少该标签时,服务端会以容易误解的 'setBucketCORS failed' 错误拒绝创建。`},{"en-US":`There is no collection delete API — create collections deliberately.`,"zh-CN":`目前没有删除数据集合的 API——请谨慎创建。`}],exampleArgs:[{"en-US":`--name my-collection --description 'team docs' --workspace-id ws-xxx`,"zh-CN":`--name my-collection --description '团队文档' --workspace-id ws-xxx`},{"en-US":`--name oss-coll --description 'own bucket' --store-type custom --oss-region cn-beijing --oss-bucket my-bucket`,"zh-CN":`--name oss-coll --description '自有 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=B(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=D(r,y.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)}});const um={collectionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Collection ID; alternative to --name`,"zh-CN":`数据集合 ID;与 --name 二选一`}},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Collection name; alternative to --collection-id`,"zh-CN":`数据集合名称;与 --collection-id 二选一`}},...z};var dm=w({description:{"en-US":`Show data collection details`,"zh-CN":`查看数据集合详情`},auth:`apiKey`,usageArgs:`(--collection-id <id> | --name <text>) [flags]`,flags:um,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=B(e),i=T(t.output),a={...n.collectionId?{connectorId:n.collectionId}:{},...n.name?{connectorName:n.name}:{}},o=D(r,y.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)}});const fm={bucket:{type:`string`,valueHint:`<name>`,description:{"en-US":`Authorized OSS bucket name`,"zh-CN":`已授权的 OSS Bucket 名称`},required:!0},region:{type:`string`,valueHint:`<id>`,description:{"en-US":`OSS region id (e.g. cn-beijing)`,"zh-CN":`OSS Region ID(例如 cn-beijing)`},required:!0},ossKey:{type:`array`,valueHint:`<key>`,description:{"en-US":`OSS object key to import (repeatable, 1-10 per call)`,"zh-CN":`要导入的 OSS Object Key(可重复,每次调用 1–10 个)`},required:!0},categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Target data-center category (default: the default category)`,"zh-CN":`目标数据中心类目(默认:默认类目)`}},tag:{type:`array`,valueHint:`<text>`,description:{"en-US":`File tag applied to every imported file (repeatable, up to 10)`,"zh-CN":`应用于每个导入文件的标签(可重复,最多 10 个)`}},overwrite:{type:`switch`,description:{"en-US":`Overwrite files previously imported from the same OSS keys`,"zh-CN":`覆盖此前从相同 OSS Key 导入的文件`}},...z};var pm=w({description:{"en-US":`Batch import files from an authorized OSS bucket into the data center`,"zh-CN":`从已授权的 OSS Bucket 批量导入文件到数据中心`},auth:`apiKey`,usageArgs:`--bucket <name> --region <id> --oss-key <key> [flags]`,flags:fm,notes:[{"en-US":`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.`,"zh-CN":`必须预先将 Bucket 授权给平台服务角色;服务端权限错误将原样透传,并提示在 RAM 控制台检查 AliyunServiceRoleForBailian。`},{"en-US":`File names are derived from the OSS key basename.`,"zh-CN":`文件名取自 OSS Key 的 basename。`},{"en-US":`--overwrite replaces the previously imported file and issues a NEW fileId (the old one becomes invalid) — verified live.`,"zh-CN":`--overwrite 会替换此前导入的文件并生成新的 fileId(旧 fileId 将失效)——已通过真实环境验证。`}],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=B(e),i=T(t.output),a={categoryId:n.categoryId??`default`,categoryType:`UNSTRUCTURED`,ossBucket:n.bucket,ossRegionId:n.region,fileDetails:n.ossKey.map(e=>({fileName:Di(e),ossKey:e})),...n.tag?.length?{tags:n.tag}:{},...n.overwrite?{overWriteFileByOssKey:!0}:{}},o=D(r,y.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 mm(e){if(!(e instanceof n))return!1;let t=e.message;return/^MCP request failed:\s*404\b/i.test(t)?/未开通|MCP不存在|MCP_IS_INVALID/i.test(t):!1}function hm(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: ${Ur(e)}`),t.join(`
2738
- `)}function gm(e,t){throw!(e instanceof n)||e.hint?e:mm(e)||t===`WebSearch`&&Nt(e)?new n(e.message,e.exitCode,hm(t),{cause:e,api:e.api,rawResponse:e.rawResponse}):e}const _m={target:{type:`string`,valueHint:`<server.tool>`,description:{"en-US":`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,"zh-CN":`由点号连接的 Server Code 和工具名称,例如 market-cmapi00073529.SmartStockSelection`},required:!0},arg:{type:`array`,valueHint:`<kv>`,description:{"en-US":`Tool argument (repeatable). Values parsed as JSON if possible, else string.`,"zh-CN":`工具参数(可重复)。值会优先按 JSON 解析,否则作为字符串。`}},json:{type:`string`,valueHint:`<obj>`,description:{"en-US":`Full arguments object as JSON; merged with --arg (arg wins).`,"zh-CN":`完整的 JSON 参数对象;与 --arg 合并(--arg 优先)。`}},query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`,"zh-CN":`--arg query=<text> 的快捷方式(与许多 DashScope MCP 工具一致)。`}},url:{type:`string`,valueHint:`<url>`,description:{"en-US":`Override the MCP endpoint URL (non-Bailian). Tries Streamable HTTP first, then classic SSE on the same URL.`,"zh-CN":`覆盖 MCP Endpoint URL(非百炼)。先尝试 Streamable HTTP,再在同一 URL 上回退到传统 SSE。`}}};function vm(e){let t=e.indexOf(`.`);if(t<=0||t===e.length-1)throw new C(`target must be <server-code>.<tool>, got "${e}".`);return{serverCode:e.slice(0,t),toolName:e.slice(t+1)}}function ym(e){let t={};for(let n of e){let e=n.indexOf(`=`);if(e<=0)throw new C(`--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 bm(e){let t;try{t=JSON.parse(e)}catch(e){throw new C(`--json is not valid JSON — ${e.message}`)}if(!t||typeof t!=`object`||Array.isArray(t))throw new C(`--json must decode to an object.`);return t}function xm(e){let t=e.json?bm(e.json):{};return Object.assign(t,ym(e.arg??[])),e.query!==void 0&&(t.query=e.query),t}function Sm(e){try{vm(e.target),xm(e)}catch(e){if(e instanceof C)return e.message;throw e}}var Cm=w({description:{"en-US":`Call a tool on an MCP server (tools/call)`,"zh-CN":`调用 MCP 服务器上的工具(tools/call)`},auth:`apiKey`,usageArgs:`--target <server.tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,flags:_m,exampleArgs:[{"en-US":`--target market-cmapi00073529.SmartStockSelection --query "Screen consumer stocks with ROE > 15%"`,"zh-CN":`--target market-cmapi00073529.SmartStockSelection --query "筛选 ROE 大于 15% 的消费股"`},{"en-US":`--target market-cmapi00073529.FinQuery --json '{"q":"Guizhou Maotai","limit":5}'`,"zh-CN":`--target market-cmapi00073529.FinQuery --json '{"q":"贵州茅台","limit":5}'`},`--target market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],validate:Sm,async run(e){let{settings:t,flags:r}=e,{serverCode:i,toolName:a}=vm(r.target),o=xm(r),s=r.url||e.client.url(ce(i)),c=T(t.output);if(t.dryRun){A({server:i,url:s,tool:a,arguments:o},c);return}let l;try{let t=await e.client.connectBailianMcp(i,r.url);l=t.client;let s=await t.client.callTool(a,o);if(s.isError){let e=s.content.map(e=>e.text||``).join(`
2739
- `);throw new n(`Tool error: ${e}`)}A(s,c)}catch(e){throw r.url||gm(e,i),e}finally{l?.close?.()}}});const wm=[...el,`all`],Tm={server:{type:`string`,valueHint:`<code>`,description:{"en-US":`Bailian MCP Server Code, such as TextGenerateImage`,"zh-CN":`百炼 MCP Server Code,例如 TextGenerateImage`},required:!0},transport:{type:`string`,valueHint:`<transport>`,choices:[`streamable-http`,`sse`],description:{"en-US":`MCP transport exposed by the server: streamable-http or sse`,"zh-CN":`服务端提供的 MCP 传输协议:streamable-http 或 sse`},required:!0},agent:{type:`string`,valueHint:`<agent>`,choices:wm,description:{"en-US":`Target Agent: ${wm.join(`, `)}`,"zh-CN":`目标 Agent:${wm.join(`, `)}`},required:!0}};var Em=w({description:{"en-US":`Register a Bailian MCP server in an Agent's native configuration`,"zh-CN":`将百炼 MCP 服务注册到 Agent 的原生配置中`},auth:`apiKey`,usageArgs:`--server <code> --transport <streamable-http|sse> --agent <agent|all>`,flags:Tm,notes:[{"en-US":`This release registers the official China-site MCP endpoint; the model API --base-url does not change the MCP endpoint.`,"zh-CN":`本期固定注册中国站官方 MCP 地址;模型 API 的 --base-url 不会改变 MCP 地址。`},{"en-US":`The resolved API key is written to the selected Agent's private local configuration. Existing unmanaged entries are never overwritten.`,"zh-CN":`解析出的 API Key 会写入所选 Agent 的本地私有配置;CLI 不会覆盖非其管理的同名条目。`},{"en-US":`qoder, qoderwork, and qwenwork are independent products. qwenwork is QwenWork (千问办公); qoderwork is Qoder Work.`,"zh-CN":`qoder、qoderwork、qwenwork 是彼此独立的产品。qwenwork 是千问办公(QwenWork);qoderwork 是 Qoder Work。`},{"en-US":`workbuddy covers CodeBuddy / WorkBuddy. deepseek-harness is DeepSeek Harness and only accepts streamable-http.`,"zh-CN":`workbuddy 覆盖 CodeBuddy / WorkBuddy。deepseek-harness 是 DeepSeek Harness,仅支持 streamable-http。`}],exampleArgs:[`--server TextGenerateImage --transport streamable-http --agent cursor`,`--server VideoGenerate --transport sse --agent claude-code`,`--server TextGenerateImage --transport streamable-http --agent all`],async run(e){let{flags:t,settings:r}=e,i=t.transport,a=t.agent,o=Vl(a,Mi());if(o.length===0)throw new n(`No supported installed Agent was found for --agent all.`,f.USAGE);let s=i===`sse`?le(t.server):ce(t.server),c=`${b.cn}${s}`,l=ar(e.identity),u=[`Authorization`,...Object.keys(l)],d=T(r.output);if(r.dryRun){A({server:t.server,transport:i,endpoint:c,agents:o,header_names:u},d);return}let p=Hl({agents:o,spec:{name:t.server,serverCode:t.server,transport:i,endpoint:c,headers:e.client.bailianMcpRegistrationHeaders()},cliVersion:e.identity.version,home:Mi(),configDir:dt()});A({server:t.server,transport:i,endpoint:c,results:p},d)}});const Dm=[...el,`all`],Om={server:{type:`string`,valueHint:`<code>`,description:{"en-US":`Bailian MCP Server Code used during connect`,"zh-CN":`connect 时使用的百炼 MCP Server Code`},required:!0},agent:{type:`string`,valueHint:`<agent>`,choices:Dm,description:{"en-US":`Target Agent: ${Dm.join(`, `)}`,"zh-CN":`目标 Agent:${Dm.join(`, `)}`},required:!0}};var km=w({description:{"en-US":`Remove an unchanged MCP registration previously managed by bailian-cli`,"zh-CN":`移除此前由 bailian-cli 管理且未被修改的 MCP 注册`},auth:`none`,usageArgs:`--server <code> --agent <agent|all>`,flags:Om,notes:[{"en-US":`A registration changed after connect is left untouched and reported as a conflict.`,"zh-CN":`如果注册项在 connect 后被修改,CLI 会保留该配置并报告冲突。`}],exampleArgs:[`--server TextGenerateImage --agent cursor`,`--server TextGenerateImage --agent all`],async run(e){let{flags:t,settings:r}=e,i=t.agent,a=Vl(i,Mi());if(a.length===0)throw new n(`No supported installed Agent was found for --agent all.`,f.USAGE);let o=T(r.output);if(r.dryRun){A({server:t.server,agents:a,action:`disconnect`},o);return}let s=Ul({agents:a,name:t.server,home:Mi(),configDir:dt()});A({server:t.server,results:s},o)}});const Am=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var jm=w({description:{"en-US":`List MCP servers activated under your Bailian account`,"zh-CN":`列出百炼账号下已激活的 MCP 服务器`},auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by server name (substring match)`,"zh-CN":`按服务器名称筛选(子字符串匹配)`}},type:{type:`string`,valueHint:`<type>`,description:{"en-US":`Server type: OFFICIAL | PRIVATE (default: OFFICIAL)`,"zh-CN":`服务器类型:OFFICIAL | PRIVATE(默认:OFFICIAL)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 30)`,"zh-CN":`每页结果数(默认:30)`}}},exampleArgs:[``,`--name finance`,`--output json`],async run(e){let{settings:t,identity:r,flags:i}=e,a=i.name||``,o=i.type||`OFFICIAL`,s=i.page||1,c=i.pageSize||30,l=T(t.output),u={reqDTO:{type:o,displayTools:!1,activated:1,pageNo:s,pageSize:c,serverName:a}};if(t.dryRun){A({api:Am,data:u,...E(t)},l);return}let d=(await e.client.console(Am,u))?.data??{};if(d.success===!1){let e=d.errorCode??`UnknownError`,t=d.errorMsg??e,i=e===`BailianGateway.Login.NotLogined`?`Run \`${r.binName} auth login --console\` to refresh your console session.`:void 0;throw new n(`Console gateway: ${t}`,f.AUTH,i)}let p=(d.DataV2??{}).data?.data??{},m=p.mcpServerDetailList??[],h=p.total??0,g=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}));A({total:h,servers:g},l)}}),Mm=w({description:{"en-US":`List tools exposed by an MCP server (tools/list)`,"zh-CN":`列出 MCP 服务器提供的工具(tools/list)`},auth:`apiKey`,usageArgs:`--server <code> [--url <url>]`,flags:{server:{type:`string`,valueHint:`<code>`,description:{"en-US":"Server code from `mcp list` (e.g. market-cmapi00073529)","zh-CN":"来自 `mcp list` 的 Server Code(例如 market-cmapi00073529)"},required:!0},url:{type:`string`,valueHint:`<url>`,description:{"en-US":`Override the MCP endpoint URL (non-Bailian). Tries Streamable HTTP first, then classic SSE on the same URL.`,"zh-CN":`覆盖 MCP Endpoint URL(非百炼)。先尝试 Streamable HTTP,再在同一 URL 上回退到传统 SSE。`}}},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(ce(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||gm(e,r),e}finally{o?.close?.()}}});function Nm(e){gm(e,`WebSearch`)}var Pm=w({description:{"en-US":`Search the web using DashScope MCP WebSearch service`,"zh-CN":`使用 DashScope MCP WebSearch 服务搜索互联网`},auth:`apiKey`,usageArgs:`--query <text> [flags]`,flags:{query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Search query text`,"zh-CN":`搜索查询文本`}},count:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of search results (default: 10)`,"zh-CN":`搜索结果数量(默认:10)`}},listTools:{type:`switch`,description:{"en-US":`List available MCP tools and exit`,"zh-CN":`列出可用的 MCP 工具并退出`}}},exampleArgs:[{"en-US":`--query "Alibaba Cloud Bailian latest features"`,"zh-CN":`--query "阿里云百炼最新功能"`},{"en-US":`--query "TypeScript 5.9 new features" --count 5`,"zh-CN":`--query "TypeScript 5.9 新功能" --count 5`},{"en-US":`--query "Today's news"`,"zh-CN":`--query "今日新闻"`},`--list-tools`],validate:e=>!e.listTools&&!e.query?`Missing required flag: --query`:void 0,async run(e){let{settings:t,flags:r}=e,i=T(t.output);if(r.listTools){if(t.dryRun){A({endpoint:e.client.url(en()),action:`tools/list`},i);return}try{let t=e.client.mcp(en());await t.initialize();let n=await t.listTools();A({tools:n},i)}catch(e){Nm(e)}return}let a=r.query;if(t.dryRun){A({endpoint:e.client.url(en()),action:`tools/call`,tool:`bailian_web_search`,arguments:{query:a,count:r.count||void 0}},i);return}let o=e.client.mcp(en()),s=Ar(`Initializing search...`);t.quiet||s.start();try{await o.initialize(),t.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){let e=c.content.map(e=>e.text||``).join(`
2740
- `);throw new n(`Search error: ${e}`)}if(t.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.`),Nm(e)}}});const Fm=`${d.cn}/cosyvoice-clone-design-api`,Im=`${d.cn}/qwen-audio-tts-voice-list`,Lm=[{voice:`longanlingxin`,name:`龙安灵心`,desc:`知心温暖音`,lang:`中文/英文`},{voice:`longanlufeng`,name:`龙安鲁风`,desc:`明亮开朗音`,lang:`中文/英文`}],Rm=[{voice:`longanfengyue`,name:`龙安风悦`,desc:`自然亲切音`,lang:`中文/英文`},{voice:`longanyuanfei`,name:`龙安元妃`,desc:`高傲妃子音`,lang:`中文/英文`},{voice:`longanlingxi`,name:`龙安灵希`,desc:`可爱甜美音`,lang:`中文/英文`},{voice:`longanxiaoxin`,name:`龙安小昕`,desc:`亲切活泼音`,lang:`中文/英文`},{voice:`longanhuan_v3.6`,name:`龙安欢`,desc:`欢脱元气女`,lang:`中文/英文`},{voice:`longjielidou_v3.6`,name:`龙杰力豆`,desc:`天真男童`,lang:`中文/英文`},{voice:`longpaopao_v3.6`,name:`龙泡泡`,desc:`软糯可爱音`,lang:`中文/英文`},{voice:`longhuohuo_v3.6`,name:`龙火火`,desc:`顽皮少年音`,lang:`中文/英文`},{voice:`longchuanshu_v3.6`,name:`龙川叔`,desc:`川普大叔音`,lang:`中文/英文`},{voice:`loongmary`,name:`loongmary`,desc:`温暖英音`,lang:`英文`},{voice:`loongeva_v3.6`,name:`loongeva`,desc:`高智美音`,lang:`英文`},{voice:`loongjohn`,name:`loongJohn`,desc:`沉稳亲切美音`,lang:`英文`}],zm=[{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:`印尼语`}],Bm={"qwen-audio-3.0-tts-plus":Lm,"qwen-audio-3.0-tts-flash":Rm,"cosyvoice-v3-flash":zm,"cosyvoice-v3-plus":zm,"cosyvoice-v3.5-flash":[],"cosyvoice-v3.5-plus":[],"cosyvoice-v2":[]};function Vm(e){return e.startsWith(`qwen-audio-`)?Im:Dr}function Hm(e){let t=Bm[e],n=Vm(e);if(!t){process.stdout.write(`No built-in voice list available for model: ${e}\n`),process.stdout.write(`See official voice list: ${n}\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.
2741
- `),process.stdout.write(`See: ${Fm}\n`),process.stdout.write(`Browse voices in the console: ${Dr}\n`);return}let r=(e,t)=>e.padEnd(t);process.stdout.write(`\nSystem voices for ${e}:\n`),process.stdout.write(`${r(`VOICE ID`,26)} ${r(`NAME`,10)} ${r(`DESCRIPTION`,16)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(26)} ${`-`.repeat(10)} ${`-`.repeat(16)} ${`-`.repeat(12)}\n`);for(let e of t)process.stdout.write(`${r(e.voice,26)} ${r(e.name,10)} ${r(e.desc,16)} ${e.lang}\n`);process.stdout.write(`\nTotal: ${t.length} voices\n`),process.stdout.write(`Preview and browse more voices: \n${n}\n`)}const Um={text:{type:`string`,valueHint:`<text>`,description:{"en-US":`Text to synthesize into speech (or use --text-file)`,"zh-CN":`要合成为语音的文本(也可使用 --text-file)`}},textFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read text from a file instead of --text`,"zh-CN":`从文件读取文本,而非使用 --text`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: configured Profile TTS model, otherwise cosyvoice-v3-flash). System voices vary by model`,"zh-CN":`模型 ID(默认:Profile 配置的 TTS 模型,否则为 cosyvoice-v3-flash)。系统音色因模型而异`}},voice:{type:`string`,valueHint:`<voice>`,description:{"en-US":`Voice ID. Use --list-voices for the selected model (e.g. qwen-audio-3.0-tts-plus/flash, cosyvoice-v3-flash); for v3.5-flash provide a clone/design voice ID`,"zh-CN":`音色 ID。使用 --list-voices 查看所选模型的内置音色(如 qwen-audio-3.0-tts-plus/flash、cosyvoice-v3-flash);使用 v3.5-flash 时需提供复刻/设计音色 ID`}},listVoices:{type:`switch`,description:{"en-US":`List built-in system voices for the selected model and exit (console link shown in output)`,"zh-CN":`列出所选模型的内置系统音色并退出(输出中会显示控制台链接)`}},format:{type:`string`,valueHint:`<format>`,description:{"en-US":`Audio format: mp3, pcm, wav, opus (default: mp3; streaming default: pcm)`,"zh-CN":`音频格式:mp3、pcm、wav、opus(默认:mp3;流式模式默认:pcm)`},choices:[`mp3`,`pcm`,`wav`,`opus`]},sampleRate:{type:`string`,valueHint:`<rate>`,description:{"en-US":`Audio sample rate in Hz (e.g. 24000)`,"zh-CN":`音频采样率,单位为 Hz(例如 24000)`}},volume:{type:`string`,valueHint:`<volume>`,description:{"en-US":`Volume 0-100 (default: 50)`,"zh-CN":`音量 0–100(默认:50)`}},rate:{type:`string`,valueHint:`<rate>`,description:{"en-US":`Speech rate 0.5-2.0 (default: 1.0)`,"zh-CN":`语速 0.5–2.0(默认:1.0)`}},pitch:{type:`string`,valueHint:`<pitch>`,description:{"en-US":`Pitch multiplier 0.5-2.0 (default: 1.0)`,"zh-CN":`音高倍数 0.5–2.0(默认:1.0)`}},seed:{type:`string`,valueHint:`<seed>`,description:{"en-US":`Random seed 0-65535 for reproducible synthesis`,"zh-CN":`用于复现合成结果的随机种子 0–65535`}},language:{type:`string`,valueHint:`<lang>`,description:{"en-US":`Language hint (e.g. zh, en, ja, ko, fr, de)`,"zh-CN":`语言提示(例如 zh、en、ja、ko、fr、de)`}},instruction:{type:`string`,valueHint:`<text>`,description:{"en-US":`Natural language instruction to control speech style (e.g. "Use a gentle tone")`,"zh-CN":`用于控制语音风格的自然语言指令(例如“使用温柔的语气”)`}},enableSsml:{type:`switch`,description:{"en-US":`Enable SSML markup parsing in input text`,"zh-CN":`解析输入文本中的 SSML 标记`}},out:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save audio to file (default: auto-generate in temp dir)`,"zh-CN":`将音频保存到文件(默认:在临时目录中自动生成路径)`}},stream:{type:`switch`,description:{"en-US":`Stream raw PCM audio to stdout (pipe to player)`,"zh-CN":`将原始 PCM 音频流式输出到 stdout(可通过管道传给播放器)`}},...r};var Wm=w({description:{"en-US":`Synthesize speech from text`,"zh-CN":`将文本合成为语音`},auth:`apiKey`,usageArgs:`--text <text> [flags]`,flags:Um,exampleArgs:[`--list-voices --model qwen-audio-3.0-tts-plus`,`--list-voices --model cosyvoice-v3-flash`,{"en-US":`--text "Hello, I am Qwen" --model qwen-audio-3.0-tts-plus --voice longanlingxin`,"zh-CN":`--text "你好,我是通义千问" --model qwen-audio-3.0-tts-plus --voice longanlingxin`},{"en-US":`--text "Hello world" --voice <voice_id> --language en`,"zh-CN":`--text "你好,世界" --voice <voice_id> --language zh`},`--text-file script.txt --out speech.wav --voice <voice_id>`,{"en-US":`--text "Today is a good day" --voice <voice_id> --instruction "Use a gentle tone"`,"zh-CN":`--text "今天天气很好" --voice <voice_id> --instruction "使用温柔的语气"`},{"en-US":`--text "Hello" --voice <voice_id> --format wav --sample-rate 24000`,"zh-CN":`--text "你好" --voice <voice_id> --format wav --sample-rate 24000`},{"en-US":`# Stream to audio player (macOS)`,"zh-CN":`# 流式传输到音频播放器(macOS)`},{"en-US":`--text "Hello" --voice <voice_id> --stream | afplay -`,"zh-CN":`--text "你好" --voice <voice_id> --stream | afplay -`},{"en-US":`# Pipe to ffplay`,"zh-CN":`# 通过管道传输到 ffplay`},{"en-US":`--text "Hello" --voice <voice_id> --stream | ffplay -nodisp -autoexit -f s16le -ar 24000 -ac 1 -`,"zh-CN":`--text "你好" --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: ${Dr})`}},async run(e){let{settings:t,flags:r}=e,i=r.model||t.defaultSpeechModel||`cosyvoice-v3-flash`;if(r.listVoices){Hm(i);return}let a=r.text||``;if(!a&&r.textFile){let e=r.textFile;try{a=di(e,`utf-8`).trim()}catch{throw new n(`Cannot read text file: ${e}`,f.USAGE)}}let o=r.voice,s=r.language||void 0,c=r.instruction||void 0,l=r.stream===!0,u=r.format||(l?`pcm`:`mp3`),d=r.sampleRate===void 0?void 0:Number(r.sampleRate),p=r.volume===void 0?void 0:Number(r.volume),m=r.rate===void 0?void 0:Number(r.rate),h=r.pitch===void 0?void 0:Number(r.pitch),g=r.seed===void 0?void 0:Number(r.seed),_=r.enableSsml===!0||void 0,v=T(t.output),y={model:i,input:{text:a,voice:o,format:u,sample_rate:d,volume:p,rate:m,pitch:h,seed:g,language_hints:s?[s]:void 0,instruction:c,enable_ssml:_}};if(rr(y.input),t.dryRun){A({request:y},v);return}t.quiet||process.stderr.write(`[Model: ${i}] [Voice: ${o}]\n`),l?await Km(e.client,t,y,r,v):await Gm(e.client,t,y,r,v)}});async function Gm(e,t,r,i,a){let o=Br(i),s=await Zr(o,t,()=>e.requestJson({path:Qn(),method:`POST`,body:r})),c=s.map(e=>e.output?.audio?.url).filter(Boolean);if(c.length===0)throw new n(`API returned no audio URL.`,f.GENERAL);let l=await import(`path`),u=In(t,{subDir:`speech`}),d=c.map((e,t)=>{let n=i.out;if(!(n&&c.length===1)){let e=Date.now(),i=c.length>1?`_${String(t+1).padStart(3,`0`)}`:``,a=r.input.format??`mp3`;n=l.join(u,`tts_${e}${i}.${a}`)}return{url:e,destPath:n}}),p=await Nr(d,Mr,{quiet:t.quiet});if(t.quiet)k(p.join(`
2742
- `));else if(p.length===1){let e=s[0].output?.audio?.expires_at;A({saved:p[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},a)}else A({saved:p,audio_urls:c,total:p.length,model:r.model,voice:r.input.voice},a)}async function Km(e,t,n,r,i){let a=await e.request({path:Qn(),method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?ci(o):null,c;try{for await(let e of mn(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 qm={url:{type:`array`,valueHint:`<url>`,description:{"en-US":`Audio file URL or local file path (repeatable, max 100)`,"zh-CN":`音频文件 URL 或本地文件路径(可重复,最多 100 个)`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: configured Profile ASR model, otherwise fun-asr). Async: fun-asr / *-filetrans / paraformer-*; sync: qwen3-asr-flash* / fun-asr-flash* / qwen-audio-*-asr-flash`,"zh-CN":`模型 ID(默认:Profile 配置的 ASR 模型,否则为 fun-asr)。异步:fun-asr / *-filetrans / paraformer-*;同步:qwen3-asr-flash* / fun-asr-flash* / qwen-audio-*-asr-flash`}},language:{type:`string`,valueHint:`<lang>`,description:{"en-US":`Language hint (e.g. zh, en, ja). Classic async/input-audio: language_hints; qwen3-filetrans: language; qwen3 sync: asr_options.language`,"zh-CN":`语言提示(例如 zh、en、ja)。传统异步/input-audio:language_hints;qwen3-filetrans:language;qwen3 同步:asr_options.language`}},diarization:{type:`switch`,description:{"en-US":`Enable automatic speaker diarization`,"zh-CN":`启用自动说话人分离`}},speakerCount:{type:`number`,valueHint:`<n>`,description:{"en-US":`Expected number of speakers (requires --diarization)`,"zh-CN":`预期的说话人数量(需启用 --diarization)`}},vocabularyId:{type:`string`,valueHint:`<id>`,description:{"en-US":"Pre-built hot-word vocabulary ID (create it via `speech vocabulary create`). Its target_model must exactly match --model, otherwise it is silently ignored. Wider model support than --vocabulary, including Fun-ASR and Paraformer","zh-CN":"预编译热词列表 ID(可用 `speech vocabulary create` 创建)。其 target_model 必须与 --model 完全一致,否则静默失效且无报错。支持模型比 --vocabulary 更广,含 Fun-ASR 与 Paraformer 系列"}},vocabulary:{type:`string`,valueHint:`<json>`,description:{"en-US":`Instant hot words as JSON object of word→weight, e.g. '{"Fendouzhe":4}'. Weight 1-5 (4 recommended; higher values can hurt other words), 50 for super hot word. No pre-built vocabulary needed. Takes effect only on Qwen-Audio-3.0-ASR-Flash models`,"zh-CN":`即时热词,JSON 对象「热词→权重」,例如 '{"奋斗者":4}'。权重 1-5(推荐 4,过高会拖累其他词),50 表示超级热词。无需预先创建热词表。仅 Qwen-Audio-3.0-ASR-Flash 系列模型生效`}},context:{type:`string`,valueHint:`<text>`,description:{"en-US":`Context enhancement word list to improve accuracy on proper nouns; must contain the target words themselves (a topic description alone has little effect); max 400 chars. Takes effect only on Qwen-Audio-3.0-ASR-Flash and Fun-ASR-Flash models`,"zh-CN":`上下文增强词表,提升专有名词准确率;须包含待识别的原词本身(只写主题描述效果有限),最长 400 字符。仅 Qwen-Audio-3.0-ASR-Flash 系列与 Fun-ASR-Flash 模型生效`}},channelId:{type:`number`,valueHint:`<n>`,description:{"en-US":`Audio channel ID (default: 0)`,"zh-CN":`音频声道 ID(默认:0)`}},out:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save full transcription result to JSON file`,"zh-CN":`将完整转写结果保存到 JSON 文件`}},...t,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval in seconds (default: 2)`,"zh-CN":`轮询间隔,单位为秒(默认:2)`}}};function Jm(e,t,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.vocabulary!==void 0&&i.push(`--vocabulary`),e.context!==void 0&&i.push(`--context`)),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 n(`Model "${t}" uses sync Flash ASR and does not support: ${i.join(`, `)}.\n`+Ym(i),f.USAGE)}function Ym(e){let t=/* @__PURE__ */ new Set([`--vocabulary`,`--vocabulary-id`,`--context`]),n=e.some(e=>t.has(e)),r=e.some(e=>!t.has(e));return n&&!r?`Hint: Use qwen-audio-3.0-asr-flash (or an async filetrans model such as qwen-audio-3.0-asr-flash-filetrans) for vocabulary/context flags.`:n&&r?`Hint: For vocabulary/context flags use qwen-audio-3.0-asr-flash or qwen-audio-3.0-asr-flash-filetrans; for the other flags use an async filetrans model (e.g. fun-asr).`:`Hint: Use an async filetrans model (e.g. fun-asr, qwen3-asr-flash-filetrans) for those flags.`}var Xm=w({description:{"en-US":`Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash)`,"zh-CN":`识别音频文件中的语音(FunAudio-ASR / Qwen-ASR Flash)`},auth:`apiKey`,usageArgs:`--url <audio-url> [flags]`,flags:qm,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 --model qwen-audio-3.0-asr-flash-filetrans --vocabulary '{"奋斗者":4,"鲸落":4}'`,`--url https://example.com/audio.mp3 --model qwen-audio-3.0-asr-flash-filetrans --context "奋斗者号 鲸落 深海勇士"`,`--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:t,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 n(`--speaker-count requires --diarization to be enabled.
2743
- Hint: Add --diarization flag to enable speaker separation.`,f.USAGE);let s=r.model||t.defaultSpeechRecognitionModel||`fun-asr`,c=Mn(s);if(c.kind===`unsupported`)throw new n(c.unsupportedReason??`Unsupported ASR model: ${s}`,f.USAGE);if(c.kind===`sync-flash`&&(Jm(r,s,c.flashFamily),i.length!==1))throw new n(`Model "${s}" 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.`,f.USAGE);if(c.kind===`async-filetrans`&&c.asyncInputStyle===`file_url`&&i.length!==1)throw new n(`Model "${s}" accepts exactly one --url (got ${i.length}).\nHint: qwen3-asr-flash-filetrans* requires a single file_url.`,f.USAGE);let l=T(t.output),u=r.vocabulary===void 0?void 0:pn(r.vocabulary),d=await Promise.all(i.map(t=>e.client.uploadFile(t,s)));if(c.kind===`sync-flash`){await Zm(e.client,t,r,l,s,c,d[0],u);return}let p=r.channelId,m=r.vocabularyId,h=pe(c.asyncLanguageStyle??`language_hints`,r.language),g={model:s,input:{...c.asyncInputStyle===`file_url`?{file_url:d[0]}:{file_urls:d},...r.context===void 0?{}:{context:de(r.context)}},parameters:{channel_id:p===void 0?[0]:[p],...h,diarization_enabled:o?!0:void 0,speaker_count:a,vocabulary_id:m,vocabulary:u}};if(rr(g.parameters),t.dryRun){A({request:g,mode:`async`,path:Zn()},l);return}t.quiet||process.stderr.write(`[Model: ${s}] [Mode: async] [Files: ${d.length}]\n`),await Qm(e.client,t,g,r,l,d.length)}});async function Zm(e,t,n,r,i,a,o,s){let c=a.flashFamily,l=fe({model:i,audioUrl:o,language:n.language,vocabularyId:n.vocabularyId,vocabulary:s,context:n.context,flashFamily:c});if(t.dryRun){A({request:l,mode:`sync`,path:a.path},r);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: sync] [Files: 1]\n`);let u=await e.requestJson({path:a.path,method:`POST`,headers:{"X-DashScope-SSE":`disable`},body:l}),d=Ge(u,c);d?process.stdout.write(d.endsWith(`
2744
- `)?d:`${d}\n`):k(JSON.stringify(u)),n.out&&(mi(n.out,JSON.stringify(u,null,2)+`
2745
- `),t.quiet||process.stderr.write(`Full result saved to: ${n.out}\n`))}async function Qm(e,t,r,i,a,o){let s=(await e.requestJson({path:Zn(),method:`POST`,body:r,async:!0})).output.task_id;if(i.async){A({task_id:s},a);return}let c=i.pollInterval??2,l=e.url(ir(s)),u=await Kr(e,t,{url:l,intervalSec:c,timeoutSec:t.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=Se(u.output);if(d.length===0){A({task_id:s,status:u.output.task_status},a);return}let p=[];for(let e=0;e<d.length;e++){let t=d[e],r=o>1;if(r&&process.stdout.write(`=== [${e+1}/${d.length}] ${t.file_url??``} ===\n`),t.subtask_status===`FAILED`){let e=t.message??t.code??`unknown error`;process.stdout.write(`[FAILED] ${t.file_url??``} — ${e}\n`),r&&process.stdout.write(`
2735
+ `)}else{let e=``,r=``;for await(let t of gn(p)){if(t.data===`[DONE]`)break;if(t.event===`error`){let e=`Chat API error`,r;try{let n=JSON.parse(t.data);e=n.message||e,r=n.code}catch{}throw new n(e,f.GENERAL,r?`API error: ${r}`:void 0)}try{let n=JSON.parse(t.data);n.request_id&&(r=n.request_id);for(let t of n.output?.choices??[])if(t.message?.content&&(e+=t.message.content),t.finish_reason===`stop`)break}catch{}}t.quiet||c===`text`?k(e):A({answer:e,request_id:r},c)}}});const Ep={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by knowledge base name (fuzzy match, 1-20 chars)`,"zh-CN":`按知识库名称筛选(模糊匹配,1–20 个字符)`}},...cp,...z};var Dp=w({description:{"en-US":`List knowledge bases in the workspace`,"zh-CN":`列出 Workspace 中的知识库`},auth:`apiKey`,usageArgs:`[flags]`,flags:Ep,notes:[{"en-US":`Auth: uses DashScope API Key (Bearer token).`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or config workspace_id.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或配置项 workspace_id 设置。"},{"en-US":`Use the returned id as --index-id in knowledge base / document management commands.`,"zh-CN":`在知识库/文档管理命令中,将返回的 ID 作为 --index-id 使用。`}],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=B(e),i=T(t.output),a=new URL(D(r,y.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(lp([e.id,e.name,e.embeddingModelName??`-`,e.chunkSize??`-`,e.description??``].join(` `)));k(`total: ${s.data?.total??c.length}`)}else A(s,i)}});const Op={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},...z};function kp(e,t){let n=new URL(D(e,y.indexList));return n.searchParams.set(`pipeline_id`,t),n.searchParams.set(`page_number`,`1`),n.searchParams.set(`page_size`,`1`),n.toString()}async function Ap(e,t,r){let i=(await e.requestJson({path:kp(t,r),method:`GET`})).data?.rows?.[0];if(!i)throw new n(`Knowledge base not found: ${r}`,f.GENERAL,`Check the id — list knowledge bases in this workspace to verify it.`);return i}function jp(e,t){return` ${e}: ${t??`-`}`}var Mp=w({description:{"en-US":`Show knowledge base configuration details`,"zh-CN":`查看知识库配置详情`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:Op,notes:[{"en-US":`Indexing settings are immutable; changing them requires recreating the knowledge base.`,"zh-CN":`索引设置不可修改;如需更改,必须重新创建知识库。`}],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output);if(t.dryRun){A({endpoint:kp(r,n.indexId),request:null},i);return}let a=await Ap(e.client,r,n.indexId);if(t.quiet){k(a.id??``);return}if(i!==`text`){A(a,i);return}k(`Basic:`),k(jp(`id`,a.id)),k(jp(`name`,a.name)),k(jp(`description`,a.description)),k(jp(`dataType`,a.dataType)),k(`Indexing: [immutable — recreate required to change]`),k(jp(`embeddingModelName`,a.embeddingModelName)),k(jp(`embeddingDimension`,a.embeddingDimension)),k(jp(`chunkSize`,a.chunkSize)),k(jp(`overlapSize`,a.overlapSize)),k(jp(`chunkMode`,a.chunkMode)),k(jp(`separator`,a.separator)),k(`Retrieval:`),k(jp(`rerankModelName`,a.rerankModelName)),k(jp(`rerankMinScore`,a.rerankMinScore)),k(jp(`rerankTopN`,a.rerankTopN)),k(jp(`rerankMode`,a.rerankMode)),k(jp(`enableRewrite`,a.enableRewrite)),k(jp(`denseSimilarityTopK`,a.denseSimilarityTopK)),k(jp(`sparseSimilarityTopK`,a.sparseSimilarityTopK)),k(`Data:`),k(jp(`sourceType`,a.sourceType)),k(jp(`connectorId`,a.connectorId))}});const Np={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},...cp,...z};var Pp=w({description:{"en-US":`List documents in a knowledge base with parse/index status`,"zh-CN":`列出知识库文档及其解析/索引状态`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:Np,notes:[{"en-US":`Documents with status FAILED are highlighted in text mode — use the import job status command to inspect failures.`,"zh-CN":`文本模式会突出显示状态为 FAILED 的文档——请使用导入任务状态命令检查失败详情。`},{"en-US":`Page size defaults to 10 (server default), max 100.`,"zh-CN":`分页大小默认为 10(服务端默认值),最大为 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=B(e),i=T(t.output),a=new URL(D(r,y.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=lp([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 Fp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Import job ID (ingestionId returned by import commands)`,"zh-CN":`导入任务 ID(导入命令返回的 ingestionId)`},required:!0},...cp,wait:{type:`switch`,description:{"en-US":`Poll until the job reaches a terminal state`,"zh-CN":`轮询直到任务进入终态`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待时的轮询间隔(默认:5)`}},...z};function Ip(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 Lp=w({description:{"en-US":`Check knowledge base import job status`,"zh-CN":`检查知识库导入任务状态`},auth:`apiKey`,usageArgs:`--index-id <id> --job-id <id> [flags]`,flags:Fp,notes:[{"en-US":`Both --index-id and --job-id are required (passing only one returns SystemError).`,"zh-CN":`--index-id 和 --job-id 均为必填(只传其中一个会返回 SystemError)。`},{"en-US":`If you see a SystemError, the job may not exist — check the ingestion id in the document list output.`,"zh-CN":`如果出现 SystemError,任务可能不存在——请检查文档列表输出中的 ingestion ID。`},{"en-US":`Overall job states are PENDING / RUNNING / COMPLETED; per-document failures (for example PARSE_FAILED) exit non-zero with the error message passed through.`,"zh-CN":`任务整体状态为 PENDING / RUNNING / COMPLETED;单个文档失败(例如 PARSE_FAILED)时会以非零状态退出,并原样透传错误信息。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),o=new URL(D(i,y.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 s=o.toString();if(t.dryRun){A({endpoint:s,request:null},a);return}let c;if(c=r.wait?await hp(e.client,t,{statusUrl:s,intervalSec:r.pollInterval??5}):await e.client.requestJson({path:s,method:`GET`}),dp(c).length>0)throw new n(pp(c,`Import job reported document failures.`),f.GENERAL);if(t.quiet){k(c.data?.ingestion_status??`UNKNOWN`);return}a===`text`?Ip(c):A(c,a)}});const Rp=1048576,zp={".doc":{maxBytes:150*Rp,enforce:`block`},".docx":{maxBytes:150*Rp,enforce:`block`},".ppt":{maxBytes:150*Rp,enforce:`block`},".pptx":{maxBytes:150*Rp,enforce:`block`},".pdf":{maxBytes:150*Rp,enforce:`block`},".png":{maxBytes:20*Rp,enforce:`block`},".jpg":{maxBytes:20*Rp,enforce:`block`},".jpeg":{maxBytes:20*Rp,enforce:`block`},".bmp":{maxBytes:20*Rp,enforce:`block`},".gif":{maxBytes:20*Rp,enforce:`block`},".xls":{maxBytes:10*Rp,enforce:`warn`},".xlsx":{maxBytes:10*Rp,enforce:`warn`},".csv":{maxBytes:10*Rp,enforce:`warn`},".md":{maxBytes:10*Rp,enforce:`warn`},".txt":{maxBytes:10*Rp,enforce:`warn`},".html":{maxBytes:10*Rp,enforce:`warn`}};function Bp(e){return Mi(e).toLowerCase()in zp}const Vp=/* @__PURE__ */ new Set([`node_modules`,`.git`,`.svn`,`.hg`,`__pycache__`,`.venv`,`venv`,`.env`,`.tox`,`dist`,`build`,`.cache`,`.next`,`.nuxt`]);function Hp(e){let t=[],r=[];function i(e){let a;try{a=Ei(e,{withFileTypes:!0})}catch(t){let r=t.code??`unknown`;throw new n(`Cannot read directory: ${e}`,f.GENERAL,`File system error (${r}) — check the path and permissions.`)}for(let n of a){let a=N(e,n.name);if(n.isDirectory()){Vp.has(n.name)||i(a);continue}n.isFile()&&(Bp(n.name)?t.push(a):r.push(a))}}for(let r of e){let e;try{e=Di(r)}catch(e){let t=e.code??`unknown`;throw new n(`Cannot read path: ${r}`,f.GENERAL,`File system error (${t}) — check the path and permissions.`)}e.isDirectory()?i(r):e.isFile()&&t.push(r)}return{files:t,skipped:r}}function Up(e){let t=Mi(e).toLowerCase(),r=zp[t];if(!r)throw new n(`Unsupported file type: ${t||Ai(e)}`,f.USAGE,`Supported formats: ${Object.keys(zp).join(` `)}`);let i;try{i=Di(e).size}catch(t){let r=t.code??`unknown`;throw new n(`Cannot read file: ${e}`,f.GENERAL,`File system error (${r}) — check the path and permissions.`)}if(i>r.maxBytes){let a=r.maxBytes/Rp;if(r.enforce===`block`)throw new n(`File exceeds the ${a} MB limit for ${t}: ${Ai(e)}`,f.USAGE);return{sizeBytes:i,warning:`${Ai(e)} exceeds the recommended 10 MB for ${t}; the server may reject or truncate it.`}}return{sizeBytes:i}}const Wp=/* @__PURE__ */ new Set([`.doc`,`.docx`,`.ppt`,`.pptx`,`.pdf`,`.xls`,`.xlsx`,`.png`,`.jpg`,`.jpeg`,`.bmp`,`.gif`]);function Gp(e,t){let r;try{r=Ti(e)}catch(r){let i=r.code??`unknown`,a=`File system error (${i}) — check the path and permissions.`;throw t&&i===`ENOENT`&&!Mi(e)&&!e.includes(`/`)&&!e.includes(`\\`)&&(a+=` If you meant to pass text content directly, use ${t} instead of --content-file.`),new n(`Cannot read file: ${e}`,f.GENERAL,a)}try{return new TextDecoder(`utf-8`,{fatal:!0}).decode(r)}catch{let t=Mi(e).toLowerCase(),r=Wp.has(t)?`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 n(`File is not valid UTF-8 plain text: ${Ai(e)}`,f.USAGE,r)}}const Kp={file:{type:`array`,valueHint:`<path>`,description:{"en-US":`Local file or directory path (repeatable). Directories are scanned recursively; unsupported formats are skipped`,"zh-CN":`本地文件或目录路径(可重复)。目录会递归扫描,不支持的格式将被跳过`},required:!0},indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Import into this knowledge base after registration (one job for all files)`,"zh-CN":`文件注册后导入该知识库(所有文件共用一个任务)`}},categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Target data-center category; defaults to the workspace default category`,"zh-CN":`目标数据中心类目;默认为 Workspace 的默认类目`}},tag:{type:`array`,valueHint:`<text>`,description:{"en-US":`File tag (repeatable), applied to every uploaded file`,"zh-CN":`文件标签(可重复),应用于每个上传文件`}},wait:{type:`switch`,description:{"en-US":`Poll the import job to a terminal state (needs --index-id)`,"zh-CN":`轮询导入任务直到进入终态(需要 --index-id)`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待时的轮询间隔(默认:5)`}},...z};var qp=w({description:{"en-US":`Upload local files or directories to the data center and optionally import into a knowledge base`,"zh-CN":`上传本地文件或目录到数据中心,并可选择导入知识库`},auth:`apiKey`,usageArgs:`--file <path> [flags]`,flags:Kp,notes:[{"en-US":`Pipeline: apply upload lease → PUT to OSS → register file → (with --index-id) create import job.`,"zh-CN":`处理流程:申请上传凭证 → PUT 到 OSS → 注册文件 →(传入 --index-id 时)创建导入任务。`},{"en-US":`Without --category-id the workspace default category is resolved automatically.`,"zh-CN":`未传入 --category-id 时,会自动解析 Workspace 的默认类目。`},{"en-US":`Directories are scanned recursively; node_modules, .git, and similar are skipped automatically.`,"zh-CN":`目录会递归扫描;node_modules、.git 等目录会被自动跳过。`},{"en-US":`Multiple files are processed sequentially; on failure, already-registered file ids are listed in the error hint.`,"zh-CN":`多个文件会依次处理;失败时,错误提示会列出已经注册成功的文件 ID。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),{files:o,skipped:s}=Hp(r.file);if(o.length===0)throw new n(`No supported files found`,f.USAGE,`Supported formats: .pdf .doc .docx .ppt .pptx .xls .xlsx .csv .md .txt .html .png .jpg .jpeg .bmp .gif`);let c=o.map(e=>{let t=Up(e);return t.warning&&process.stderr.write(`Warning: ${t.warning}\n`),{filePath:e,sizeBytes:t.sizeBytes}});if(t.dryRun){let e=r.categoryId??`default`,t=c.flatMap(t=>[{step:`applyFileUploadLease`,endpoint:D(i,y.applyFileUploadLease),request:{category:e,fileName:Ai(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:D(i,y.addFile),request:{leaseId:`<leaseId>`,category:e,parser:`AUTO_SELECT`,...r.tag?.length?{tags:r.tag}:{}}}]);r.indexId&&t.push({step:`createImportJob`,endpoint:D(i,y.indexJobCreate),request:{indexId:r.indexId,sourceType:`DATA_CENTER_FILE`,docIds:[`<fileId>`]}}),A({steps:t,skipped:s},a);return}let l=r.categoryId??`default`,u=[];for(let t of c)try{let a=Ti(t.filePath),o=ri(`md5`).update(a).digest(`base64`),s=await e.client.requestJson({path:D(i,y.applyFileUploadLease),method:`POST`,body:{category:l,fileName:Ai(t.filePath),sizeBytes:String(t.sizeBytes),contentMd5:o}}),c=s.data?.leaseId,d=s.data?.param;if(!c||!d?.url)throw new n(`Upload lease response missing leaseId/url for ${t.filePath}`,f.GENERAL);let p;try{p=await fetch(d.url,{method:d.method??`PUT`,headers:d.headers,body:a})}catch(e){let r=e.cause?.code;throw new n(`OSS upload failed for ${Ai(t.filePath)}`,f.NETWORK,r?`Network error (${r}).`:void 0,{cause:e})}if(!p.ok){let e=await p.text().catch(()=>``);throw new n(`OSS upload rejected (HTTP ${p.status}) for ${Ai(t.filePath)}${e?`: ${e.slice(0,300)}`:``}`,f.GENERAL)}let m=(await e.client.requestJson({path:D(i,y.addFile),method:`POST`,body:{leaseId:c,category:l,parser:`AUTO_SELECT`,...r.tag?.length?{tags:r.tag}:{}}})).data?.fileId;if(!m)throw new n(`addFile response missing fileId for ${t.filePath}`,f.GENERAL);u.push({path:t.filePath,fileId:m})}catch(e){throw u.length>0?gp(e,`Already registered: ${u.map(e=>e.fileId).join(`, `)}`):e}let d,p;if(r.indexId&&(d=(await e.client.requestJson({path:D(i,y.indexJobCreate),method:`POST`,body:{indexId:r.indexId,sourceType:`DATA_CENTER_FILE`,docIds:u.map(e=>e.fileId)}})).data?.ingestionId,r.wait&&d)){let a=await hp(e.client,t,{statusUrl:mp(i,r.indexId,d).toString(),intervalSec:r.pollInterval??5});if(p=up(a),dp(a).length>0)throw new n(pp(a,`Import job reported document failures.`),f.GENERAL,`Registered file ids: ${u.map(e=>e.fileId).join(`, `)}`)}if(t.quiet){for(let e of u)k(e.fileId);return}if(a===`text`){for(let e of u)k(`${Ai(e.path)} ${e.fileId} registered`);d&&k(`job: ${d}`),p&&k(`status: ${p}`);let e=[`Uploaded ${u.length} file${u.length===1?``:`s`}`];if(s.length>0&&e.push(`skipped ${s.length} unsupported`),k(`\n${e.join(`, `)}.`),t.verbose&&s.length>0){k(`Skipped files:`);for(let e of s)k(` ${Ai(e)}`)}return}A({files:u.map(e=>({path:e.path,fileId:e.fileId})),skipped:s,...r.indexId?{index_id:r.indexId}:{},...d?{ingestion_id:d}:{},...p?{final_status:p}:{}},a)}});const Jp={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Knowledge base name (1-20 chars, unique in workspace)`,"zh-CN":`知识库名称(1–20 个字符,在 Workspace 中唯一)`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`What this knowledge base holds and what it is for — tells bases apart in the workspace list (1-500 chars)`,"zh-CN":`知识库装了什么内容、给谁用,用于在 Workspace 列表中区分同类知识库(1–500 个字符)`},required:!0},docId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Data-center file id to import (repeatable); mutually exclusive with --category-id`,"zh-CN":`要导入的数据中心文件 ID(可重复);不能与 --category-id 同时使用`}},categoryId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Import every file under this category (repeatable); mutually exclusive with --doc-id`,"zh-CN":`导入该类目下的所有文件(可重复);不能与 --doc-id 同时使用`}},embeddingModel:{type:`string`,valueHint:`<name>`,description:{"en-US":`Embedding model name (default: text-embedding-v4)`,"zh-CN":`Embedding 模型名称(默认:text-embedding-v4)`}},chunkSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Chunk size in characters (default: 600, recommended 300-800)`,"zh-CN":`Chunk 字符数(默认:600,建议:300–800)`}},wait:{type:`switch`,description:{"en-US":`Poll the initial import job to a terminal state`,"zh-CN":`轮询初始导入任务直到进入终态`}},pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval when waiting (default: 5)`,"zh-CN":`等待时的轮询间隔(默认:5)`}},...z};function Yp(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 Xp=w({description:{"en-US":`Create a knowledge base and import data-center files or categories`,"zh-CN":`创建知识库并导入数据中心文件或类目`},auth:`apiKey`,usageArgs:`--name <text> --description <text> (--doc-id <id> | --category-id <id>) [flags]`,flags:Jp,notes:[{"en-US":`Structure/sink types are fixed to the default document knowledge base (unstructured, BUILT_IN storage).`,"zh-CN":`结构和存储类型固定为默认文档知识库(unstructured、BUILT_IN 存储)。`},{"en-US":`Returns the knowledge base id (pipelineId) and the initial import job id (ingestionId).`,"zh-CN":`返回知识库 ID(pipelineId)和初始导入任务 ID(ingestionId)。`},{"en-US":`Use the import job status command (or --wait) to track the initial import.`,"zh-CN":`使用导入任务状态命令(或 --wait)跟踪初始导入。`}],exampleArgs:[{"en-US":`--name demo --description 'product docs' --doc-id file-xxx --workspace-id ws-xxx`,"zh-CN":`--name demo --description '产品文档' --doc-id file-xxx --workspace-id ws-xxx`},{"en-US":`--name demo --description 'product docs' --category-id cate-xxx --wait`,"zh-CN":`--name demo --description '产品文档' --category-id cate-xxx --wait`}],validate(e){if(e.name.length<1||e.name.length>20)return`--name must be 1-20 characters`;if(e.description.length<1||e.description.length>500)return`--description must be 1-500 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:t,flags:r}=e,i=B(e),a=T(t.output),o={name:r.name,description:r.description,structureType:`unstructured`,sinkType:`BUILT_IN`,embeddingModelName:r.embeddingModel??`text-embedding-v4`,chunkSize:r.chunkSize??600,...Yp(r)},s=D(i,y.indexCreateV2);if(t.dryRun){A({endpoint:s,request:o},a);return}let c=await e.client.requestJson({path:s,method:`POST`,body:o}),l=c.data?.pipelineId,u=c.data?.ingestionId,d;if(r.wait&&l&&u){let a=await hp(e.client,t,{statusUrl:mp(i,l,u).toString(),intervalSec:r.pollInterval??5});if(d=up(a),dp(a).length>0)throw new n(pp(a,`Initial import reported document failures.`),f.GENERAL,`Knowledge base created: ${l}`,{api:{requestId:a.request_id}})}if(t.quiet){k(l??``);return}if(a===`text`){k(`index_id: ${l??`-`}`),u&&k(`ingestion_id: ${u}`),d&&k(`status: ${d}`),k(`Next: check the import job status, then search against this knowledge base.`);return}A(d?{...c,final_status:d}:c,a)}});const Zp={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`New knowledge base name (1-20 chars)`,"zh-CN":`新的知识库名称(1–20 个字符)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`New knowledge base description`,"zh-CN":`新的知识库描述`}},rerankMinScore:{type:`number`,valueHint:`<score>`,description:{"en-US":`Rerank minimum score threshold, range 0-1 (chunks below are filtered)`,"zh-CN":`Rerank 最低分数阈值,范围 0–1(低于阈值的 Chunk 会被过滤)`}},...z};var Qp=w({description:{"en-US":`Update knowledge base name, description or rerank threshold`,"zh-CN":`更新知识库名称、描述或 Rerank 阈值`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:Zp,notes:[{"en-US":`Indexing settings (embedding model, chunk size, etc.) are immutable — recreate the knowledge base to change them.`,"zh-CN":`索引设置(Embedding 模型、Chunk 大小等)不可修改——如需更改,请重新创建知识库。`}],exampleArgs:[{"en-US":`--index-id idx-xxx --description 'product docs v2' --workspace-id ws-xxx`,"zh-CN":`--index-id idx-xxx --description '产品文档 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=B(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=D(r,y.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 $p={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},...z};var em=w({description:{"en-US":`Delete a knowledge base with all its documents and chunks`,"zh-CN":`删除知识库及其所有文档和 Chunk`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the knowledge base and all of its documents and chunks. Data-center files are not deleted.`,"zh-CN":`该操作会永久删除知识库及其全部文档和 Chunk,但不会删除数据中心文件。`}},usageArgs:`--index-id <id> [flags]`,flags:$p,notes:[{"en-US":`Irreversible — the knowledge base and all indexed content are permanently removed.`,"zh-CN":`该操作不可撤销——知识库及所有已索引内容将被永久删除。`},{"en-US":`Files in the data center are not affected; only the knowledge base index is deleted.`,"zh-CN":`数据中心中的文件不受影响;仅删除知识库索引。`}],exampleArgs:[`--index-id idx-xxx --workspace-id ws-xxx`,`--index-id idx-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={index_id:n.indexId},o=D(r,y.indexDelete);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(`deleted: ${n.indexId}`);return}A(s,i)}}});const tm={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},docId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Document ID to delete (repeatable)`,"zh-CN":`要删除的文档 ID(可重复)`},required:!0},...z};var nm=w({description:{"en-US":`Delete documents and their chunks from a knowledge base`,"zh-CN":`从知识库中删除文档及其 Chunk`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the selected documents and all of their chunks.`,"zh-CN":`该操作会永久删除所选文档及其全部 Chunk,且无法撤销。`}},usageArgs:`--index-id <id> --doc-id <id> [flags]`,flags:tm,notes:[{"en-US":`Removes documents from the knowledge base index only; the source files remain in the data center.`,"zh-CN":`仅从知识库索引中移除文档;源文件仍保留在数据中心。`},{"en-US":"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.","zh-CN":"请使用 `knowledge doc list --quiet` 返回的 doc_id,而不是 `knowledge doc upload` 返回的 fileId。通过 `knowledge create --doc-id` 创建的文档,其 doc_id 等于 fileId;通过 `knowledge doc upload --index-id` 导入的文档,其 doc_id 可能带有 Workspace 后缀。"},{"en-US":`Deletion may take up to ~30s to propagate — the document may still appear in the doc list briefly.`,"zh-CN":`删除结果最多可能需要约 30 秒才会生效——文档可能会短暂地继续出现在列表中。`},{"en-US":`The output lists the ids actually deleted.`,"zh-CN":`输出会列出实际删除的 ID。`}],exampleArgs:[`--index-id idx-xxx --doc-id file-xxx --workspace-id ws-xxx --dry-run`,`--index-id idx-xxx --doc-id file-a --doc-id file-b --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={index_id:n.indexId,doc_ids:n.docId},o=D(r,y.indexDeleteFile);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?.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)}});const rm={docId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Data-center file ID to tag (repeatable, 1-20 per call)`,"zh-CN":`要添加标签的数据中心文件 ID(可重复,每次调用 1–20 个)`},required:!0},tag:{type:`array`,valueHint:`<text>`,description:{"en-US":`Tag applied to every --doc-id (repeatable, each up to 32 chars)`,"zh-CN":`应用于每个 --doc-id 的标签(可重复,每个最多 32 个字符)`},required:!0},mode:{type:`string`,valueHint:`<mode>`,description:{"en-US":`Update mode: append (default) or overwrite`,"zh-CN":`更新模式:append(默认)或 overwrite`}},...z};var im=w({description:{"en-US":`Batch update tags on data-center files`,"zh-CN":`批量更新数据中心文件标签`},auth:`apiKey`,usageArgs:`--doc-id <id> --tag <text> [flags]`,flags:rm,notes:[{"en-US":`The same tag set is applied to every --doc-id; run the command multiple times for different tag sets.`,"zh-CN":`同一组标签会应用于每个 --doc-id;若需应用不同标签组,请多次运行该命令。`},{"en-US":`Server limits: up to 100 tags per file, total tag length up to 700 chars, tag up to 32 chars.`,"zh-CN":`服务端限制:每个文件最多 100 个标签,标签总长度最多 700 个字符,单个标签最多 32 个字符。`}],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=B(e),i=T(t.output),a={fileInfos:n.docId.map(e=>({fileId:e,tags:n.tag})),updateMode:(n.mode??`append`).toUpperCase()},o=D(r,y.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 am={scene:{type:`string`,valueHint:`<scene>`,description:{"en-US":`Service scene: chat (Q&A) or search (retrieval)`,"zh-CN":`服务场景:chat(问答)或 search(检索)`},required:!0},status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter by status: draft, deployed (includes edited) or deleted`,"zh-CN":`按状态筛选:draft、deployed(包含 edited)或 deleted`}},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by service name (fuzzy match)`,"zh-CN":`按服务名称模糊筛选`}},agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by exact agent ID`,"zh-CN":`按 Agent ID 精确筛选`}},indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by exact linked knowledge base (pipeline) ID`,"zh-CN":`按关联的知识库(Pipeline)ID 精确筛选`}},...cp,...z},om=[`chat`,`search`],sm=[`draft`,`deployed`,`deleted`];var cm=w({description:{"en-US":`List retrieval / Q&A services (agents) in the workspace`,"zh-CN":`列出 Workspace 中的检索/问答服务(Agent)`},auth:`apiKey`,usageArgs:`--scene <chat|search> [flags]`,flags:am,notes:[{"en-US":`A scene (chat or search) is required — run once per scene to see both.`,"zh-CN":`必须指定场景(chat 或 search)——要查看两类服务,请分别运行一次。`},{"en-US":`Use the returned agent_id with the search or chat commands, or with service management commands.`,"zh-CN":`将返回的 agent_id 用于 search/chat 命令或服务管理命令。`}],exampleArgs:[`--scene chat --workspace-id ws-xxx`,`--scene search --status deployed`],validate(e){if(!om.includes(e.scene))return`--scene must be chat or search`;if(e.status!==void 0&&!sm.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=B(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=D(r,y.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(lp([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 lm={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Specific version to inspect (beta or a published number); omit for all versions`,"zh-CN":`要查看的指定版本(beta 或已发布版本号);省略则返回全部版本`}},...z};function um(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??[]){let t=typeof e.id==`string`?e.id:`?`,n=typeof e.name==`string`?` (${e.name})`:``;k(` kb: ${t}${n}`)}}}var dm=w({description:{"en-US":`Show service (agent) details including per-version configuration`,"zh-CN":`查看服务(Agent)详情及各版本配置`},auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:lm,notes:[{"en-US":`Without --agent-version all versions are returned (beta draft plus published numbers).`,"zh-CN":`未传入 --agent-version 时,会返回所有版本(beta 草稿和已发布版本号)。`},{"en-US":`The version value is passed through as-is; the valid set is server-side state.`,"zh-CN":`版本值将原样传递;有效版本集合由服务端状态决定。`}],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=B(e),i=T(t.output),a={agent_id:n.agentId,...n.agentVersion?{agent_version:n.agentVersion}:{}},o=D(r,y.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??[])um(e)}});const fm={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Service name (up to 200 chars, unique per scene in the workspace)`,"zh-CN":`服务名称(最多 200 个字符,在 Workspace 的同一场景中唯一)`},required:!0},scene:{type:`string`,valueHint:`<scene>`,description:{"en-US":`Service scene: chat (Q&A) or search (retrieval)`,"zh-CN":`服务场景:chat(问答)或 search(检索)`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`What this service answers and who it serves — recommended: agents read it to pick the right service (up to 1000 chars)`,"zh-CN":`这个服务能回答什么、给谁用 —— 建议填写:agent 靠它判断该调用哪个服务(最多 1000 个字符)`}},indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Bind this knowledge base; other settings use server defaults`,"zh-CN":`绑定该知识库;其他设置使用服务端默认值`}},...z};var pm=w({description:{"en-US":`Create a retrieval / Q&A service (initial status: draft, version: beta)`,"zh-CN":`创建检索/问答服务(初始状态:draft,版本:beta)`},auth:`apiKey`,usageArgs:`--name <text> --scene <chat|search> [flags]`,flags:fm,notes:[{"en-US":`Without an explicit configuration the server applies its default agent settings.`,"zh-CN":`未显式提供配置时,服务端会应用默认 Agent 设置。`},{"en-US":`The draft (beta) version can be tested via --agent-version beta on search/chat before deploying.`,"zh-CN":`部署前,可在 search/chat 命令中使用 --agent-version beta 测试草稿(beta)版本。`},{"en-US":`Requires the knowledge-base create permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库创建权限。`}],exampleArgs:[{"en-US":`--name my-qa --scene chat --description 'answers product FAQs' --workspace-id ws-xxx`,"zh-CN":`--name my-qa --scene chat --description '回答产品常见问题' --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=B(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=D(r,y.agentCreate);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=_p(s,`agent_id`);if(t.quiet){k(c??``);return}if(i===`text`){k(`created: ${c??`-`} (status: ${_p(s,`agent_status`)??`draft`}, version: ${_p(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 mm=[`true`,`false`],hm={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`New service name (up to 200 chars)`,"zh-CN":`新服务名称(最多 200 个字符)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`New service description (up to 1000 chars)`,"zh-CN":`新服务描述(最多 1000 个字符)`}},agentVersion:{type:`string`,valueHint:`<version>`,description:{"en-US":`Target version (default: beta draft). Published versions only accept --version-desc`,"zh-CN":`目标版本(默认:beta 草稿)。已发布版本只接受 --version-desc`}},versionDesc:{type:`string`,valueHint:`<text>`,description:{"en-US":`Version description`,"zh-CN":`版本描述`}},policy:{type:`string`,valueHint:`<policy>`,description:{"en-US":`Agent policy: turbo (fast) or agentic (multi-turn)`,"zh-CN":`Agent 策略:turbo(快速)或 agentic(多轮)`}},model:{type:`string`,valueHint:`<name>`,description:{"en-US":`Generation model code (must be in the platform allowlist)`,"zh-CN":`生成模型代码(必须在平台白名单中)`}},temperature:{type:`number`,valueHint:`<n>`,description:{"en-US":`Sampling temperature, range 0-2`,"zh-CN":`采样温度,范围 0–2`}},maxLlmCalls:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max LLM calls per request, range 1-30`,"zh-CN":`每次请求最大 LLM 调用次数,范围 1–30`}},enableSessionFile:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable session files: true or false`,"zh-CN":`启用会话文件:true 或 false`}},enableRefusal:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable refusal answers: true or false`,"zh-CN":`启用拒答:true 或 false`}},enableAntiLeak:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable anti prompt-leak: true or false`,"zh-CN":`启用防提示词泄露:true 或 false`}},enableRichText:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable rich text output: true or false`,"zh-CN":`启用富文本输出:true 或 false`}},enableCitation:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Enable citations: true or false`,"zh-CN":`启用引用:true 或 false`}},configFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`JSON file replacing the whole agent_config (for nested settings like kb_search_configs); mutually exclusive with scalar config flags`,"zh-CN":`替换整个 agent_config 的 JSON 文件(用于 kb_search_configs 等嵌套设置);不能与标量配置选项同时使用`}},...z};function gm(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 _m(e){let t;try{t=Ti(e,`utf-8`)}catch(t){let r=t.code??`unknown`;throw new n(`Cannot read config file: ${e}`,f.GENERAL,`File system error (${r}) — check the path and permissions.`)}let r;try{r=JSON.parse(t)}catch{throw new n(`--config-file must contain valid JSON.`,f.USAGE)}if(typeof r!=`object`||!r||Array.isArray(r))throw new n(`--config-file must contain a JSON object.`,f.USAGE);let i=r;return ym(i),i}const vm=/* @__PURE__ */ 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`,`user_system_prompt`,`anti_leak_prompt`,`refusal_prompt`,`credibility_prompt`,`enable_thinking`,`enable_temperature`,`enable_credibility`,`enable_max_completion_tokens`,`session_file_parse_mode`,`rerank_top_n`,`hybrid_rerank`,`kb_search_configs`]);function ym(e){if(e.agent_policy!==void 0&&![`turbo`,`agentic`].includes(e.agent_policy))throw new n(`agent_policy must be turbo or agentic`,f.USAGE);if(e.temperature!==void 0&&(e.temperature<0||e.temperature>2))throw new n(`temperature must be between 0 and 2`,f.USAGE);if(e.max_num_llm_calls!==void 0&&(e.max_num_llm_calls<1||e.max_num_llm_calls>30))throw new n(`max_num_llm_calls must be between 1 and 30`,f.USAGE);if(e.rerank_top_n!==void 0&&(e.rerank_top_n<1||e.rerank_top_n>20))throw new n(`rerank_top_n must be between 1 and 20`,f.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.
2736
+ `)}for(let t of Object.keys(e))vm.has(t)||process.stderr.write(`Warning: unknown agent_config field passed through: ${t}\n`)}async function bm(e,t,n){return((await e.requestJson({path:D(t,y.agentGet),method:`POST`,body:{agent_id:n,agent_version:`beta`}})).data?.agent_details??[]).find(e=>e.agent_version===`beta`)?.agent_config??{}}var xm=w({description:{"en-US":`Update service name, description or draft configuration`,"zh-CN":`更新服务名称、描述或草稿配置`},auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:hm,notes:[{"en-US":`Configuration changes only apply to the beta draft; published versions accept --version-desc only.`,"zh-CN":`配置修改只应用于 beta 草稿;已发布版本只接受 --version-desc。`},{"en-US":`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.`,"zh-CN":`要修改已发布版本的配置,请先更新 beta 草稿(不传 --agent-version,或传 --agent-version beta),然后运行 service deploy 发布新版本。`},{"en-US":`Scalar config flags merge into the current draft config (read-merge-write); --config-file replaces the whole config and is mutually exclusive with them.`,"zh-CN":`标量配置选项会合并到当前草稿配置(读取-合并-写入);--config-file 会替换整个配置,且不能与标量配置选项同时使用。`},{"en-US":`After updating the draft, verify with --agent-version beta on search/chat, then deploy.`,"zh-CN":`更新草稿后,先在 search/chat 命令中使用 --agent-version beta 验证,再部署。`},{"en-US":`Requires the knowledge-base modify permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库修改权限。`}],exampleArgs:[`--agent-id aid-xxx --temperature 0.7 --workspace-id ws-xxx`,`--agent-id aid-xxx --config-file ./agent-config.json`,{"en-US":`--agent-id aid-xxx --agent-version 1 --version-desc 'first stable release'`,"zh-CN":`--agent-id aid-xxx --agent-version 1 --version-desc '首个稳定版本'`}],validate(e){let t=Object.keys(gm(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&&!mm.includes(n))return`${t} must be true or false`},async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a=gm(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 bm(e.client,r,n.agentId),...a},ym(s))):s=_m(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=D(r,y.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 Sm={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},versionDesc:{type:`string`,valueHint:`<text>`,description:{"en-US":`Description for the newly published version`,"zh-CN":`新发布版本的描述`}},...z};var Cm=w({description:{"en-US":`Publish the beta draft of a service as a new version`,"zh-CN":`将服务的 beta 草稿发布为新版本`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This publishes the current draft as a new version and changes the behavior seen by live callers.`,"zh-CN":`该操作会将当前草稿发布为新版本,并改变线上调用方使用的服务行为。`}},usageArgs:`--agent-id <id> [flags]`,flags:Sm,notes:[{"en-US":`The version number auto-increments; status becomes deployed.`,"zh-CN":`版本号会自动递增;状态将变为 deployed。`},{"en-US":`Publishing affects live callers — the confirmation prompt guards against accidents.`,"zh-CN":`发布会影响线上调用方——确认提示用于避免误操作。`},{"en-US":`Requires the knowledge-base modify permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库修改权限。`}],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`,{"en-US":`--agent-id aid-xxx --version-desc 'tuned rerank params' --yes`,"zh-CN":`--agent-id aid-xxx --version-desc '已调优 Rerank 参数' --yes`}],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={agent_id:n.agentId,...n.versionDesc?{agent_version_desc:n.versionDesc}:{}},o=D(r,y.agentDeploy);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=_p(s,`agent_version`);if(t.quiet){k(c??``);return}if(i===`text`){k(`deployed: ${n.agentId} version ${c??`-`}`);return}A(s,i)}});const wm={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Service (agent) ID`,"zh-CN":`服务(Agent)ID`},required:!0},...z};var Tm=w({description:{"en-US":`Delete a retrieval / Q&A service (soft delete, idempotent)`,"zh-CN":`删除检索/问答服务(软删除,幂等)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes the service and makes its agent ID unavailable for search and chat calls. The operation cannot be undone.`,"zh-CN":`该操作会删除服务,使其 Agent ID 无法再用于搜索和对话调用,且无法撤销。`}},usageArgs:`--agent-id <id> [flags]`,flags:wm,notes:[{"en-US":`Deletion cannot be undone; the agent_id becomes unusable for search and chat calls.`,"zh-CN":`删除无法撤销;该 agent_id 将不能再用于 search 和 chat 调用。`},{"en-US":`Idempotent — deleting an already-deleted service does not fail.`,"zh-CN":`该操作具有幂等性——重复删除已删除的服务不会失败。`},{"en-US":`Requires the knowledge-base delete permission in the workspace.`,"zh-CN":`需要 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=B(e),i=T(t.output),a={agent_id:n.agentId},o=D(r,y.agentDelete);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(`deleted: ${n.agentId} (status: ${_p(s,`agent_status`)??`deleted`})`);return}A(s,i)}}});const Em={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Source service (agent) ID to copy`,"zh-CN":`要复制的源服务(Agent)ID`},required:!0},...z};var Dm=w({description:{"en-US":`Copy a service into a new draft (name gets a copy_ prefix)`,"zh-CN":`将服务复制为新草稿(名称会添加 copy_ 前缀)`},auth:`apiKey`,usageArgs:`--agent-id <id> [flags]`,flags:Em,notes:[{"en-US":`The copy starts as a beta draft; test it with --agent-version beta, then deploy to publish.`,"zh-CN":`副本初始为 beta 草稿;请使用 --agent-version beta 测试,然后部署发布。`},{"en-US":`Requires the knowledge-base create permission in the workspace.`,"zh-CN":`需要 Workspace 中的知识库创建权限。`}],exampleArgs:[`--agent-id aid-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={agent_id:n.agentId},o=D(r,y.agentCopy);if(t.dryRun){A({endpoint:o,request:a},i);return}let s=await e.client.requestJson({path:o,method:`POST`,body:a}),c=_p(s,`agent_id`);if(t.quiet){k(c??``);return}if(i===`text`){k(`new agent_id: ${c??`-`} (name: ${_p(s,`agent_name`)??`-`}, status: ${_p(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 Om={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},docId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Owning document ID from the doc list command; required in practice for all knowledge base types`,"zh-CN":`来自文档列表命令的所属文档 ID;实际使用时所有知识库类型都需要提供`}},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`Chunk body text, up to 6000 chars (document-type); alternative to --content-file`,"zh-CN":`Chunk 正文,最多 6000 个字符(文档型);与 --content-file 二选一`}},contentFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read chunk body from a UTF-8 plain text file (.md/.txt etc.)`,"zh-CN":`从 UTF-8 纯文本文件(.md/.txt 等)读取 Chunk 正文`}},title:{type:`string`,valueHint:`<text>`,description:{"en-US":`Chunk title, up to 50 chars (document-type)`,"zh-CN":`Chunk 标题,最多 50 个字符(文档型)`}},imageUrl:{type:`array`,valueHint:`<url>`,description:{"en-US":`Chunk image URL (repeatable, up to 10; document-type)`,"zh-CN":`Chunk 图片 URL(可重复,最多 10 个;文档型)`}},field:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Arbitrary field entry (repeatable) for table/image knowledge bases where keys are Excel column headers; mutually exclusive with content/title/image flags`,"zh-CN":`表格/图片知识库的自定义字段(可重复),键为 Excel 列标题;不能与 content/title/image 相关选项同时使用`}},...z};function km(e){let t={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new n(`--field must be key=value, got: ${r}`,f.USAGE);t[r.slice(0,e)]=r.slice(e+1)}return t}var Am=w({description:{"en-US":`Add a chunk directly to a knowledge base`,"zh-CN":`直接向知识库添加 Chunk`},auth:`apiKey`,usageArgs:`--index-id <id> (--content <text> | --field <k=v>) [flags]`,flags:Om,notes:[{"en-US":`Document / table / image knowledge bases are supported; audio-video ones are not.`,"zh-CN":`支持文档、表格和图片知识库;不支持音视频知识库。`},{"en-US":`--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.`,"zh-CN":`实际使用时,所有知识库类型都需要 --doc-id。请使用文档列表命令返回的文档级 ID;Chunk 列表每行返回的 doc_id 不被接受。`},{"en-US":`Image-type documents do not support text chunks. Target a text-type document (docx/pdf/txt) instead.`,"zh-CN":`图片型文档不支持文本 Chunk;请改为操作文本型文档(docx/pdf/txt)。`},{"en-US":`The API is idempotent but rate-limited to 10 calls per second — throttle batch scripts.`,"zh-CN":`该 API 具有幂等性,但限流为每秒 10 次调用——批处理脚本需要控制速率。`},{"en-US":`The response carries no chunk id; list chunks afterwards to find the new one.`,"zh-CN":`响应不包含 Chunk ID;添加后请列出 Chunk 以查找新条目。`},{"en-US":`For table/image knowledge bases use --field with Excel column headers as keys; values are passed through as strings.`,"zh-CN":`表格/图片知识库请使用 --field,并以 Excel 列标题作为键;值将按字符串原样传递。`}],exampleArgs:[{"en-US":`--index-id idx-xxx --content "chunk text" --title intro --workspace-id ws-xxx`,"zh-CN":`--index-id idx-xxx --content "Chunk 文本" --title 简介 --workspace-id ws-xxx`},{"en-US":`--index-id idx-xxx --field columnA=v1 --field columnB=v2`,"zh-CN":`--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:t,flags:r}=e,i=B(e),a=T(t.output),o;if(r.field?.length)o=km(r.field);else{let e=r.contentFile===void 0?r.content:Gp(r.contentFile,`--content`);if(typeof e==`string`&&e.length>6e3)throw new n(`Chunk content must be at most 6000 characters`,f.USAGE);o={...e===void 0?{}:{content:e},...r.title===void 0?{}:{title:r.title},...r.imageUrl?.length?{image_urls:r.imageUrl}:{}}}let s={pipelineId:r.indexId,...r.docId?{dataId:r.docId}:{},field:o},c=D(i,y.chunkCreate);if(t.dryRun){A({endpoint:c,request:s},a);return}let l=await e.client.requestJson({path:c,method:`POST`,body:s});if(!t.quiet){if(a===`text`){k(`chunk created (pipeline: ${r.indexId})`),k(`List chunks to find the new chunk id.`);return}A(l,a)}}});const jm={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},docId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Only show chunks belonging to this document`,"zh-CN":`仅显示属于该文档的 Chunk`}},...cp,...z};var Mm=w({description:{"en-US":`List chunks in a knowledge base with content and status`,"zh-CN":`列出知识库中的 Chunk 及其内容和状态`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:jm,notes:[{"en-US":`Use metadata._id as the chunk id and metadata.doc_id as the document id in chunk update/delete commands.`,"zh-CN":`在 Chunk 更新/删除命令中,使用 metadata._id 作为 Chunk ID,使用 metadata.doc_id 作为文档 ID。`},{"en-US":`Page size defaults to 20 (server default), max 100.`,"zh-CN":`分页大小默认为 20(服务端默认值),最大为 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=B(e),i=T(t.output),a={indexId:n.indexId,pageNum:n.pageNumber??1,pageSize:n.pageSize??20,...n.docId?{docId:n.docId}:{}},o=D(r,y.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 Nm={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},chunkId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Chunk ID (metadata._id from the chunk list output)`,"zh-CN":`Chunk ID(来自 Chunk 列表输出的 metadata._id)`},required:!0},docId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Document ID owning the chunk (metadata.doc_id from the chunk list output)`,"zh-CN":`Chunk 所属文档 ID(来自 Chunk 列表输出的 metadata.doc_id)`},required:!0},content:{type:`string`,valueHint:`<text>`,description:{"en-US":`New chunk content, 10-6000 chars; alternative to --content-file`,"zh-CN":`新的 Chunk 内容,10–6000 个字符;与 --content-file 二选一`}},contentFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read new content from a UTF-8 plain text file (.md/.txt etc.)`,"zh-CN":`从 UTF-8 纯文本文件(.md/.txt 等)读取新内容`}},title:{type:`string`,valueHint:`<text>`,description:{"en-US":`Chunk title, 0-50 chars (empty string clears it; omit to keep unchanged)`,"zh-CN":`Chunk 标题,0–50 个字符(空字符串表示清除;省略则保持不变)`}},exclude:{type:`switch`,description:{"en-US":`Exclude this chunk from retrieval`,"zh-CN":`在检索中排除该 Chunk`}},include:{type:`switch`,description:{"en-US":`Include this chunk in retrieval (default)`,"zh-CN":`在检索中包含该 Chunk(默认)`}},...z};async function Pm(e,t,r,i,a){for(let n=1;n<=10;n++){let o=(await e.requestJson({path:D(t,y.chunkList),method:`POST`,body:{indexId:r,docId:a,pageNum:n,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 n(`Chunk not found: ${i}`,f.GENERAL,`Check the chunk id via the chunk list command.`)}var Fm=w({description:{"en-US":`Update chunk content or toggle its retrieval visibility`,"zh-CN":`更新 Chunk 内容或切换其检索可见性`},auth:`apiKey`,usageArgs:`--index-id <id> --chunk-id <id> --doc-id <id> [flags]`,flags:Nm,notes:[{"en-US":`Content must be 10-6000 characters and within the knowledge base's max chunk size.`,"zh-CN":`内容必须为 10–6000 个字符,且不能超过知识库的最大 Chunk 大小。`},{"en-US":`--content-file expects a UTF-8 plain text file; document formats (.docx/.pdf) are not parsed here.`,"zh-CN":`--content-file 需要 UTF-8 纯文本文件;此处不会解析 .docx/.pdf 等文档格式。`},{"en-US":`Toggling --exclude/--include without new content re-submits the existing content automatically.`,"zh-CN":`仅切换 --exclude/--include 而不提供新内容时,会自动重新提交现有内容。`}],exampleArgs:[{"en-US":`--index-id idx-xxx --chunk-id chunk-xxx --doc-id file-xxx --content "corrected text"`,"zh-CN":`--index-id idx-xxx --chunk-id chunk-xxx --doc-id file-xxx --content "修正后的文本"`},`--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:t,flags:r}=e,i=B(e),a=T(t.output),o=r.contentFile===void 0?r.content:Gp(r.contentFile,`--content`);if(o!==void 0&&(o.length<10||o.length>6e3))throw new n(`Chunk content must be 10-6000 characters`,f.USAGE);o===void 0&&(o=t.dryRun?`<current-content (fetched at run time)>`:await Pm(e.client,i,r.indexId,r.chunkId,r.docId));let s={pipelineId:r.indexId,chunkId:r.chunkId,dataId:r.docId,content:o,isDisplayedChunkContent:!r.exclude,...r.title===void 0?{}:{title:r.title}},c=D(i,y.chunkUpdate);if(t.dryRun){A({endpoint:c,request:s},a);return}let l=await e.client.requestJson({path:c,method:`POST`,body:s});if(!t.quiet){if(a===`text`){k(`updated: ${r.chunkId}`);return}A(l,a)}}});const Im={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},chunkId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Chunk ID to delete (repeatable; batches of 10 are sent automatically)`,"zh-CN":`要删除的 Chunk ID(可重复;每 10 个自动分批发送)`},required:!0},...z};function Lm(e,t=10){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}var Rm=w({description:{"en-US":`Delete chunks from a knowledge base (irreversible)`,"zh-CN":`从知识库中删除 Chunk(不可撤销)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the selected chunks and cannot be undone.`,"zh-CN":`该操作会永久删除所选 Chunk,且无法撤销。`}},usageArgs:`--index-id <id> --chunk-id <id> [flags]`,flags:Im,notes:[{"en-US":`Accepts at most 10 chunk ids per call; larger sets are batched automatically.`,"zh-CN":`每次调用最多接受 10 个 Chunk ID;更多 ID 会自动分批处理。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),o=Lm(r.chunkId),s=D(i,y.chunkDelete);if(t.dryRun){A({endpoint:s,batches:o.map(e=>({request:{pipelineId:r.indexId,chunkIds:e}}))},a);return}let c=0;for(let t of o)try{await e.client.requestJson({path:s,method:`POST`,body:{pipelineId:r.indexId,chunkIds:t}}),c+=t.length}catch(e){throw c>0&&e instanceof n&&!e.hint?new n(e.message,e.exitCode,`${c} chunk(s) in earlier batches were already deleted.`,{cause:e,api:e.api,rawResponse:e.rawResponse}):e}if(!t.quiet){if(a===`text`){k(`deleted: ${c} chunk(s) in ${o.length} batch(es)`);return}A({deleted_count:c,batches:o.length},a)}}});const zm={indexId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Knowledge base ID`,"zh-CN":`知识库 ID`},required:!0},start:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range start: Unix seconds or ISO date, must be in the past (default: 24 hours ago)`,"zh-CN":`范围开始时间:Unix 秒或 ISO 日期,必须是过去时间(默认:24 小时前)`}},end:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range end: Unix seconds or ISO date, must be in the past (default: now)`,"zh-CN":`范围结束时间:Unix 秒或 ISO 日期,必须是过去时间(默认:当前时间)`}},...z};function Bm(e){if(/^\d+$/.test(e))return e.length>=13?String(Math.floor(Number(e)/1e3)):e;let t=/^\d{4}-\d{2}-\d{2}([T ].*)?$/.test(e)?Date.parse(e):NaN;if(Number.isNaN(t))throw new n(`Invalid time value: ${e}`,f.USAGE,`Pass Unix seconds (e.g. 1780900000) or an ISO date (e.g. 2026-07-30T00:00:00Z).`);return String(Math.floor(t/1e3))}var Vm=w({description:{"en-US":`Show knowledge base storage and QPS monitoring data`,"zh-CN":`查看知识库存储和 QPS 监控数据`},auth:`apiKey`,usageArgs:`--index-id <id> [flags]`,flags:zm,notes:[{"en-US":`Defaults to the last 24 hours when --start/--end are omitted.`,"zh-CN":`省略 --start/--end 时,默认查询最近 24 小时。`},{"en-US":`Timestamps are normalized to epoch seconds as required by the server.`,"zh-CN":`时间戳会按服务端要求归一化为 Epoch 秒。`},{"en-US":`Future timestamps are rejected for --start and clamped to now for --end, since the monitor API only returns past data.`,"zh-CN":`监控 API 只返回历史数据,因此未来的 --start 会被拒绝,未来的 --end 会被截断为当前时间。`}],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:t,flags:r}=e,i=B(e),a=T(t.output),o=Math.floor(Date.now()/1e3),s=r.start?Bm(r.start):String(o-86400),c=r.end?Bm(r.end):String(o);if(Number(s)>o)throw new n(`Start time is in the future; the monitor API only accepts past or current timestamps.`,f.USAGE,`Use a start date/time at or before now, or omit --start to default to 24 hours ago.`);let l=Number(c)>o;l&&(c=String(o));let u={indexId:r.indexId,startTimestamp:s,endTimestamp:c},d=D(i,y.indexMonitor);if(t.dryRun){A({endpoint:d,request:u},a);return}let p=await e.client.requestJson({path:d,method:`POST`,body:u});if(a!==`text`){A(p,a);return}l&&k(`note: end time was in the future, clamped to now.`);let m=p.data?.storageMonitorData,h=p.data?.qpsMonitorData;k(`plan: ${p.data?.pipelineCommercialType??`-`}`),k(`storage: ${m?.indexStorageUsage??`-`} / ${m?.indexStorageLimit??`-`}`),k(`peak qps: ${h?.peakQps??`-`}`),k(`qps windows: ${h?.monitorData?.length??0} data point(s)`)}});const Hm={collectionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by exact collection ID`,"zh-CN":`按数据集合 ID 精确筛选`}},parentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`List sub-categories of this exact parent category`,"zh-CN":`列出该父类目下的子类目`}},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by category name (exact match, unlike the knowledge base list)`,"zh-CN":`按类目名称筛选(精确匹配,与知识库列表不同)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Cursor for the next page (from previous output)`,"zh-CN":`下一页游标(来自上一次输出)`}},maxResult:{type:`number`,valueHint:`<n>`,description:{"en-US":`Items per page (default: 20)`,"zh-CN":`每页条目数(默认:20)`}},...z};var Um=w({description:{"en-US":`List data-center categories`,"zh-CN":`列出数据中心类目`},auth:`apiKey`,usageArgs:`[flags]`,flags:Hm,notes:[{"en-US":`Categories marked [default] are where files land when no category is specified.`,"zh-CN":`未指定类目时,文件会进入标记为 [default] 的类目。`},{"en-US":`Pagination is cursor-based: reuse the printed next token to continue.`,"zh-CN":`分页使用游标:复用输出中的 next token 继续查询。`}],exampleArgs:[`--workspace-id ws-xxx`,`--name my-category`,`--next-token <token>`],async run(e){let{settings:t,flags:n}=e,r=B(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=D(r,y.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(lp(`${e.categoryId} ${e.categoryName}${t}`))}let e=s.data?.nextToken;e&&k(`next: --next-token ${e}`)}else A(s,i)}});const Wm={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Category name (1-20 chars)`,"zh-CN":`类目名称(1–20 个字符)`},required:!0},parentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Create as a sub-category of this category`,"zh-CN":`创建为该类目的子类目`}},collectionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Create under this collection (defaults to the platform collection)`,"zh-CN":`在该数据集合下创建(默认为平台数据集合)`}},...z};var Gm=w({description:{"en-US":`Create a data-center category`,"zh-CN":`创建数据中心类目`},auth:`apiKey`,usageArgs:`--name <text> [flags]`,flags:Wm,notes:[{"en-US":`Use categories to organize data-center files by business domain.`,"zh-CN":`使用类目按业务领域组织数据中心文件。`}],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=B(e),i=T(t.output),a={categoryName:n.name,categoryType:`UNSTRUCTURED`,...n.parentId?{parentCategoryId:n.parentId}:{},...n.collectionId?{connectorId:n.collectionId}:{}},o=D(r,y.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)}});const Km={categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Category ID to delete`,"zh-CN":`要删除的类目 ID`},required:!0},...z};var qm=w({description:{"en-US":`Delete a data-center category`,"zh-CN":`删除数据中心类目`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes the selected data-center category and cannot be undone.`,"zh-CN":`该操作会删除所选数据中心类目,且无法撤销。`}},usageArgs:`--category-id <id> [flags]`,flags:Km,notes:[{"en-US":`Behavior for categories containing files or sub-categories is server-defined — the server error is passed through as-is.`,"zh-CN":`包含文件或子类目时的处理行为由服务端定义——服务端返回的错误将原样透传。`}],exampleArgs:[`--category-id cate-xxx --workspace-id ws-xxx`,`--category-id cate-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={categoryId:n.categoryId},o=D(r,y.deleteCategory);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(`deleted: ${n.categoryId}`);return}A(s,i)}}});const Jm={categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Category to list (find ids via the category list command); exact match`,"zh-CN":`要列出文件的类目(通过类目列表命令查找 ID);精确匹配`},required:!0},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by exact file name without its extension (a.md → pass a)`,"zh-CN":`按不含扩展名的文件名精确筛选(a.md 应传入 a)`}},fileId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Filter by exact file ID (repeatable)`,"zh-CN":`按文件 ID 精确筛选(可重复)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Cursor for the next page (from previous output)`,"zh-CN":`下一页游标(来自上一次输出)`}},maxResult:{type:`number`,valueHint:`<n>`,description:{"en-US":`Items per page`,"zh-CN":`每页条目数`}},...z};var Ym=w({description:{"en-US":`List files in a data-center category`,"zh-CN":`列出数据中心类目中的文件`},auth:`apiKey`,usageArgs:`--category-id <id> [flags]`,flags:Jm,notes:[{"en-US":`A real category id is required — the default value is not resolved here. Find the id via the category list command.`,"zh-CN":`必须提供真实的类目 ID——此处不会解析 default 值。请通过类目列表命令查找 ID。`},{"en-US":`--name matches the exact file name without its extension (for a.md pass a); partial keywords return no results.`,"zh-CN":`--name 精确匹配不含扩展名的文件名(a.md 应传入 a);部分关键字不会返回结果。`},{"en-US":`Pagination is cursor-based: reuse the printed next token to continue.`,"zh-CN":`分页使用游标:复用输出中的 next token 继续查询。`}],exampleArgs:[`--category-id cate-xxx --workspace-id ws-xxx`,{"en-US":`--category-id cate-xxx --name report`,"zh-CN":`--category-id cate-xxx --name 报告`}],async run(e){let{settings:t,flags:n}=e,r=B(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=D(r,y.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(lp([e.fileId,e.status??`-`,e.fileName,e.sizeBytes??`-`].join(` `)));let e=s.data?.nextToken;e&&k(`next: --next-token ${e}`)}else A(s,i)}});const Xm={fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Data-center file ID`,"zh-CN":`数据中心文件 ID`},required:!0},...z};var Zm=w({description:{"en-US":`Show data-center file details (size, MD5, tags, timestamps)`,"zh-CN":`查看数据中心文件详情(大小、MD5、标签、时间戳)`},auth:`apiKey`,usageArgs:`--file-id <id> [flags]`,flags:Xm,exampleArgs:[`--file-id file-xxx --workspace-id ws-xxx`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={fileId:n.fileId},o=D(r,y.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??`-`}`);let l=Array.isArray(c?.tags)?c.tags.join(`, `):c?.tags??`-`;k(`tags: ${l||`-`}`)}});const Qm={fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Data-center file ID to delete`,"zh-CN":`要删除的数据中心文件 ID`},required:!0},...z};var $m=w({description:{"en-US":`Permanently delete a file from the data center`,"zh-CN":`从数据中心永久删除文件`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the data-center file. Knowledge-base document indexes that reference it may become invalid.`,"zh-CN":`该操作会永久删除数据中心文件;引用该文件的知识库文档索引可能失效。`}},usageArgs:`--file-id <id> [flags]`,flags:Qm,notes:[{"en-US":`Irreversible. If knowledge bases reference this file, their related document indexes become invalid.`,"zh-CN":`该操作不可撤销。如果知识库引用了此文件,其相关文档索引将失效。`},{"en-US":`To remove a document from a single knowledge base only, use the document delete command instead.`,"zh-CN":`如果只需从单个知识库中移除文档,请改用文档删除命令。`}],exampleArgs:[`--file-id file-xxx --workspace-id ws-xxx`,`--file-id file-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=B(e),i=T(t.output),a={fileId:n.fileId},o=D(r,y.deleteFile);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(`deleted: ${n.fileId}`);return}A(s,i)}}});const eh={name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Collection name`,"zh-CN":`数据集合名称`},required:!0},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`What this collection holds and what it is for — tells collections apart in the list`,"zh-CN":`数据集合装了什么内容、给谁用,用于在列表中区分同类集合`},required:!0},storeType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Storage: platform (managed) or custom (your own OSS bucket)`,"zh-CN":`存储类型:platform(托管)或 custom(自有 OSS Bucket)`}},ossRegion:{type:`string`,valueHint:`<id>`,description:{"en-US":`OSS region id (required with --store-type custom)`,"zh-CN":`OSS Region ID(使用 --store-type custom 时必填)`}},ossBucket:{type:`string`,valueHint:`<name>`,description:{"en-US":`OSS bucket name (required with --store-type custom)`,"zh-CN":`OSS Bucket 名称(使用 --store-type custom 时必填)`}},...z};var th=w({description:{"en-US":`Create a FILE data collection`,"zh-CN":`创建 FILE 数据集合`},auth:`apiKey`,usageArgs:`--name <text> --description <text> [flags]`,flags:eh,notes:[{"en-US":`Store type defaults to platform (managed storage); custom uses your authorized OSS bucket.`,"zh-CN":`存储类型默认为 platform(托管存储);custom 使用已授权的自有 OSS Bucket。`},{"en-US":`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.`,"zh-CN":`自定义 Bucket 必须带有 bailian-connector-access=ReadAndWrite 标签(百炼基于标签的访问控制);缺少该标签时,服务端会以容易误解的 'setBucketCORS failed' 错误拒绝创建。`},{"en-US":`There is no collection delete API — create collections deliberately.`,"zh-CN":`目前没有删除数据集合的 API——请谨慎创建。`}],exampleArgs:[{"en-US":`--name my-collection --description 'team docs' --workspace-id ws-xxx`,"zh-CN":`--name my-collection --description '团队文档' --workspace-id ws-xxx`},{"en-US":`--name oss-coll --description 'own bucket' --store-type custom --oss-region cn-beijing --oss-bucket my-bucket`,"zh-CN":`--name oss-coll --description '自有 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=B(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=D(r,y.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)}});const nh={collectionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Collection ID; alternative to --name`,"zh-CN":`数据集合 ID;与 --name 二选一`}},name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Collection name; alternative to --collection-id`,"zh-CN":`数据集合名称;与 --collection-id 二选一`}},...z};var rh=w({description:{"en-US":`Show data collection details`,"zh-CN":`查看数据集合详情`},auth:`apiKey`,usageArgs:`(--collection-id <id> | --name <text>) [flags]`,flags:nh,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=B(e),i=T(t.output),a={...n.collectionId?{connectorId:n.collectionId}:{},...n.name?{connectorName:n.name}:{}},o=D(r,y.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)}});const ih={bucket:{type:`string`,valueHint:`<name>`,description:{"en-US":`Authorized OSS bucket name`,"zh-CN":`已授权的 OSS Bucket 名称`},required:!0},region:{type:`string`,valueHint:`<id>`,description:{"en-US":`OSS region id (e.g. cn-beijing)`,"zh-CN":`OSS Region ID(例如 cn-beijing)`},required:!0},ossKey:{type:`array`,valueHint:`<key>`,description:{"en-US":`OSS object key to import (repeatable, 1-10 per call)`,"zh-CN":`要导入的 OSS Object Key(可重复,每次调用 1–10 个)`},required:!0},categoryId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Target data-center category (default: the default category)`,"zh-CN":`目标数据中心类目(默认:默认类目)`}},tag:{type:`array`,valueHint:`<text>`,description:{"en-US":`File tag applied to every imported file (repeatable, up to 10)`,"zh-CN":`应用于每个导入文件的标签(可重复,最多 10 个)`}},overwrite:{type:`switch`,description:{"en-US":`Overwrite files previously imported from the same OSS keys`,"zh-CN":`覆盖此前从相同 OSS Key 导入的文件`}},...z};var ah=w({description:{"en-US":`Batch import files from an authorized OSS bucket into the data center`,"zh-CN":`从已授权的 OSS Bucket 批量导入文件到数据中心`},auth:`apiKey`,usageArgs:`--bucket <name> --region <id> --oss-key <key> [flags]`,flags:ih,notes:[{"en-US":`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.`,"zh-CN":`必须预先将 Bucket 授权给平台服务角色;服务端权限错误将原样透传,并提示在 RAM 控制台检查 AliyunServiceRoleForBailian。`},{"en-US":`File names are derived from the OSS key basename.`,"zh-CN":`文件名取自 OSS Key 的 basename。`},{"en-US":`--overwrite replaces the previously imported file and issues a NEW fileId (the old one becomes invalid) — verified live.`,"zh-CN":`--overwrite 会替换此前导入的文件并生成新的 fileId(旧 fileId 将失效)——已通过真实环境验证。`}],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=B(e),i=T(t.output),a={categoryId:n.categoryId??`default`,categoryType:`UNSTRUCTURED`,ossBucket:n.bucket,ossRegionId:n.region,fileDetails:n.ossKey.map(e=>({fileName:Ai(e),ossKey:e})),...n.tag?.length?{tags:n.tag}:{},...n.overwrite?{overWriteFileByOssKey:!0}:{}},o=D(r,y.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 oh(e){if(!(e instanceof n))return!1;let t=e.message;return/^MCP request failed:\s*404\b/i.test(t)?/未开通|MCP不存在|MCP_IS_INVALID/i.test(t):!1}function sh(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: ${Kr(e)}`),t.join(`
2737
+ `)}function ch(e,t){throw!(e instanceof n)||e.hint?e:oh(e)||t===`WebSearch`&&Nt(e)?new n(e.message,e.exitCode,sh(t),{cause:e,api:e.api,rawResponse:e.rawResponse}):e}const lh={target:{type:`string`,valueHint:`<server.tool>`,description:{"en-US":`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,"zh-CN":`由点号连接的 Server Code 和工具名称,例如 market-cmapi00073529.SmartStockSelection`},required:!0},arg:{type:`array`,valueHint:`<kv>`,description:{"en-US":`Tool argument (repeatable). Values parsed as JSON if possible, else string.`,"zh-CN":`工具参数(可重复)。值会优先按 JSON 解析,否则作为字符串。`}},json:{type:`string`,valueHint:`<obj>`,description:{"en-US":`Full arguments object as JSON; merged with --arg (arg wins).`,"zh-CN":`完整的 JSON 参数对象;与 --arg 合并(--arg 优先)。`}},query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`,"zh-CN":`--arg query=<text> 的快捷方式(与许多 DashScope MCP 工具一致)。`}},url:{type:`string`,valueHint:`<url>`,description:{"en-US":`Override the MCP endpoint URL (non-Bailian). Tries Streamable HTTP first, then classic SSE on the same URL.`,"zh-CN":`覆盖 MCP Endpoint URL(非百炼)。先尝试 Streamable HTTP,再在同一 URL 上回退到传统 SSE。`}}};function uh(e){let t=e.indexOf(`.`);if(t<=0||t===e.length-1)throw new C(`target must be <server-code>.<tool>, got "${e}".`);return{serverCode:e.slice(0,t),toolName:e.slice(t+1)}}function dh(e){let t={};for(let n of e){let e=n.indexOf(`=`);if(e<=0)throw new C(`--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 fh(e){let t;try{t=JSON.parse(e)}catch(e){throw new C(`--json is not valid JSON — ${e.message}`)}if(!t||typeof t!=`object`||Array.isArray(t))throw new C(`--json must decode to an object.`);return t}function ph(e){let t=e.json?fh(e.json):{};return Object.assign(t,dh(e.arg??[])),e.query!==void 0&&(t.query=e.query),t}function mh(e){try{uh(e.target),ph(e)}catch(e){if(e instanceof C)return e.message;throw e}}var hh=w({description:{"en-US":`Call a tool on an MCP server (tools/call)`,"zh-CN":`调用 MCP 服务器上的工具(tools/call)`},auth:`apiKey`,usageArgs:`--target <server.tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,flags:lh,exampleArgs:[{"en-US":`--target market-cmapi00073529.SmartStockSelection --query "Screen consumer stocks with ROE > 15%"`,"zh-CN":`--target market-cmapi00073529.SmartStockSelection --query "筛选 ROE 大于 15% 的消费股"`},{"en-US":`--target market-cmapi00073529.FinQuery --json '{"q":"Guizhou Maotai","limit":5}'`,"zh-CN":`--target market-cmapi00073529.FinQuery --json '{"q":"贵州茅台","limit":5}'`},`--target market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],validate:mh,async run(e){let{settings:t,flags:r}=e,{serverCode:i,toolName:a}=uh(r.target),o=ph(r),s=r.url||e.client.url(ce(i)),c=T(t.output);if(t.dryRun){A({server:i,url:s,tool:a,arguments:o},c);return}let l;try{let t=await e.client.connectBailianMcp(i,r.url);l=t.client;let s=await t.client.callTool(a,o);if(s.isError){let e=s.content.map(e=>e.text||``).join(`
2738
+ `);throw new n(`Tool error: ${e}`)}A(s,c)}catch(e){throw r.url||ch(e,i),e}finally{l?.close?.()}}});const gh=[...rl,`all`],_h={server:{type:`string`,valueHint:`<code>`,description:{"en-US":`Bailian MCP Server Code, such as TextGenerateImage`,"zh-CN":`百炼 MCP Server Code,例如 TextGenerateImage`},required:!0},transport:{type:`string`,valueHint:`<transport>`,choices:[`streamable-http`,`sse`],description:{"en-US":`MCP transport exposed by the server: streamable-http or sse`,"zh-CN":`服务端提供的 MCP 传输协议:streamable-http 或 sse`},required:!0},agent:{type:`string`,valueHint:`<agent>`,choices:gh,description:{"en-US":`Target Agent: ${gh.join(`, `)}`,"zh-CN":`目标 Agent:${gh.join(`, `)}`},required:!0}};var vh=w({description:{"en-US":`Register a Bailian MCP server in an Agent's native configuration`,"zh-CN":`将百炼 MCP 服务注册到 Agent 的原生配置中`},auth:`apiKey`,usageArgs:`--server <code> --transport <streamable-http|sse> --agent <agent|all>`,flags:_h,notes:[{"en-US":`This release registers the official China-site MCP endpoint; the model API --base-url does not change the MCP endpoint.`,"zh-CN":`本期固定注册中国站官方 MCP 地址;模型 API 的 --base-url 不会改变 MCP 地址。`},{"en-US":`The resolved API key is written to the selected Agent's private local configuration. Existing unmanaged entries are never overwritten.`,"zh-CN":`解析出的 API Key 会写入所选 Agent 的本地私有配置;CLI 不会覆盖非其管理的同名条目。`},{"en-US":`qoder, qoderwork, and qwenwork are independent products. qwenwork is QwenWork (千问办公); qoderwork is Qoder Work.`,"zh-CN":`qoder、qoderwork、qwenwork 是彼此独立的产品。qwenwork 是千问办公(QwenWork);qoderwork 是 Qoder Work。`},{"en-US":`workbuddy covers CodeBuddy / WorkBuddy. deepseek-harness is DeepSeek Harness and only accepts streamable-http.`,"zh-CN":`workbuddy 覆盖 CodeBuddy / WorkBuddy。deepseek-harness 是 DeepSeek Harness,仅支持 streamable-http。`}],exampleArgs:[`--server TextGenerateImage --transport streamable-http --agent cursor`,`--server VideoGenerate --transport sse --agent claude-code`,`--server TextGenerateImage --transport streamable-http --agent all`],async run(e){let{flags:t,settings:r}=e,i=t.transport,a=t.agent,o=Wl(a,Fi());if(o.length===0)throw new n(`No supported installed Agent was found for --agent all.`,f.USAGE);let s=i===`sse`?le(t.server):ce(t.server),c=`${b.cn}${s}`,l=cr(e.identity),u=[`Authorization`,...Object.keys(l)],d=T(r.output);if(r.dryRun){A({server:t.server,transport:i,endpoint:c,agents:o,header_names:u},d);return}let p=Gl({agents:o,spec:{name:t.server,serverCode:t.server,transport:i,endpoint:c,headers:e.client.bailianMcpRegistrationHeaders()},cliVersion:e.identity.version,home:Fi(),configDir:dt()});A({server:t.server,transport:i,endpoint:c,results:p},d)}});const yh=[...rl,`all`],bh={server:{type:`string`,valueHint:`<code>`,description:{"en-US":`Bailian MCP Server Code used during connect`,"zh-CN":`connect 时使用的百炼 MCP Server Code`},required:!0},agent:{type:`string`,valueHint:`<agent>`,choices:yh,description:{"en-US":`Target Agent: ${yh.join(`, `)}`,"zh-CN":`目标 Agent:${yh.join(`, `)}`},required:!0}};var xh=w({description:{"en-US":`Remove an unchanged MCP registration previously managed by bailian-cli`,"zh-CN":`移除此前由 bailian-cli 管理且未被修改的 MCP 注册`},auth:`none`,usageArgs:`--server <code> --agent <agent|all>`,flags:bh,notes:[{"en-US":`A registration changed after connect is left untouched and reported as a conflict.`,"zh-CN":`如果注册项在 connect 后被修改,CLI 会保留该配置并报告冲突。`}],exampleArgs:[`--server TextGenerateImage --agent cursor`,`--server TextGenerateImage --agent all`],async run(e){let{flags:t,settings:r}=e,i=t.agent,a=Wl(i,Fi());if(a.length===0)throw new n(`No supported installed Agent was found for --agent all.`,f.USAGE);let o=T(r.output);if(r.dryRun){A({server:t.server,agents:a,action:`disconnect`},o);return}let s=Kl({agents:a,name:t.server,home:Fi(),configDir:dt()});A({server:t.server,results:s},o)}});const Sh=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var Ch=w({description:{"en-US":`List MCP servers activated under your Bailian account`,"zh-CN":`列出百炼账号下已激活的 MCP 服务器`},auth:`console`,usageArgs:`[flags]`,flags:{name:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by server name (substring match)`,"zh-CN":`按服务器名称筛选(子字符串匹配)`}},type:{type:`string`,valueHint:`<type>`,description:{"en-US":`Server type: OFFICIAL | PRIVATE (default: OFFICIAL)`,"zh-CN":`服务器类型:OFFICIAL | PRIVATE(默认:OFFICIAL)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 30)`,"zh-CN":`每页结果数(默认:30)`}}},exampleArgs:[``,`--name finance`,`--output json`],async run(e){let{settings:t,identity:r,flags:i}=e,a=i.name||``,o=i.type||`OFFICIAL`,s=i.page||1,c=i.pageSize||30,l=T(t.output),u={reqDTO:{type:o,displayTools:!1,activated:1,pageNo:s,pageSize:c,serverName:a}};if(t.dryRun){A({api:Sh,data:u,...E(t)},l);return}let d=(await e.client.console(Sh,u))?.data??{};if(d.success===!1){let e=d.errorCode??`UnknownError`,t=d.errorMsg??e,i=e===`BailianGateway.Login.NotLogined`?`Run \`${r.binName} auth login --console\` to refresh your console session.`:void 0;throw new n(`Console gateway: ${t}`,f.AUTH,i)}let p=(d.DataV2??{}).data?.data??{},m=p.mcpServerDetailList??[],h=p.total??0,g=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}));A({total:h,servers:g},l)}}),wh=w({description:{"en-US":`List tools exposed by an MCP server (tools/list)`,"zh-CN":`列出 MCP 服务器提供的工具(tools/list)`},auth:`apiKey`,usageArgs:`--server <code> [--url <url>]`,flags:{server:{type:`string`,valueHint:`<code>`,description:{"en-US":"Server code from `mcp list` (e.g. market-cmapi00073529)","zh-CN":"来自 `mcp list` 的 Server Code(例如 market-cmapi00073529)"},required:!0},url:{type:`string`,valueHint:`<url>`,description:{"en-US":`Override the MCP endpoint URL (non-Bailian). Tries Streamable HTTP first, then classic SSE on the same URL.`,"zh-CN":`覆盖 MCP Endpoint URL(非百炼)。先尝试 Streamable HTTP,再在同一 URL 上回退到传统 SSE。`}}},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(ce(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||ch(e,r),e}finally{o?.close?.()}}});function Th(e){ch(e,`WebSearch`)}var Eh=w({description:{"en-US":`Search the web using DashScope MCP WebSearch service`,"zh-CN":`使用 DashScope MCP WebSearch 服务搜索互联网`},auth:`apiKey`,usageArgs:`--query <text> [flags]`,flags:{query:{type:`string`,valueHint:`<text>`,description:{"en-US":`Search query text`,"zh-CN":`搜索查询文本`}},count:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of search results (default: 10)`,"zh-CN":`搜索结果数量(默认:10)`}},listTools:{type:`switch`,description:{"en-US":`List available MCP tools and exit`,"zh-CN":`列出可用的 MCP 工具并退出`}}},exampleArgs:[{"en-US":`--query "Alibaba Cloud Bailian latest features"`,"zh-CN":`--query "阿里云百炼最新功能"`},{"en-US":`--query "TypeScript 5.9 new features" --count 5`,"zh-CN":`--query "TypeScript 5.9 新功能" --count 5`},{"en-US":`--query "Today's news"`,"zh-CN":`--query "今日新闻"`},`--list-tools`],validate:e=>!e.listTools&&!e.query?`Missing required flag: --query`:void 0,async run(e){let{settings:t,flags:r}=e,i=T(t.output);if(r.listTools){if(t.dryRun){A({endpoint:e.client.url($t()),action:`tools/list`},i);return}try{let t=e.client.mcp($t());await t.initialize();let n=await t.listTools();A({tools:n},i)}catch(e){Th(e)}return}let a=r.query;if(t.dryRun){A({endpoint:e.client.url($t()),action:`tools/call`,tool:`bailian_web_search`,arguments:{query:a,count:r.count||void 0}},i);return}let o=e.client.mcp($t()),s=Nr(`Initializing search...`);t.quiet||s.start();try{await o.initialize(),t.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){let e=c.content.map(e=>e.text||``).join(`
2739
+ `);throw new n(`Search error: ${e}`)}if(t.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.`),Th(e)}}});const Dh=`${d.cn}/cosyvoice-clone-design-api`,Oh=`${d.cn}/qwen-audio-tts-voice-list`,kh=[{voice:`longanlingxin`,name:`龙安灵心`,desc:`知心温暖音`,lang:`中文/英文`},{voice:`longanlufeng`,name:`龙安鲁风`,desc:`明亮开朗音`,lang:`中文/英文`}],Ah=[{voice:`longanfengyue`,name:`龙安风悦`,desc:`自然亲切音`,lang:`中文/英文`},{voice:`longanyuanfei`,name:`龙安元妃`,desc:`高傲妃子音`,lang:`中文/英文`},{voice:`longanlingxi`,name:`龙安灵希`,desc:`可爱甜美音`,lang:`中文/英文`},{voice:`longanxiaoxin`,name:`龙安小昕`,desc:`亲切活泼音`,lang:`中文/英文`},{voice:`longanhuan_v3.6`,name:`龙安欢`,desc:`欢脱元气女`,lang:`中文/英文`},{voice:`longjielidou_v3.6`,name:`龙杰力豆`,desc:`天真男童`,lang:`中文/英文`},{voice:`longpaopao_v3.6`,name:`龙泡泡`,desc:`软糯可爱音`,lang:`中文/英文`},{voice:`longhuohuo_v3.6`,name:`龙火火`,desc:`顽皮少年音`,lang:`中文/英文`},{voice:`longchuanshu_v3.6`,name:`龙川叔`,desc:`川普大叔音`,lang:`中文/英文`},{voice:`loongmary`,name:`loongmary`,desc:`温暖英音`,lang:`英文`},{voice:`loongeva_v3.6`,name:`loongeva`,desc:`高智美音`,lang:`英文`},{voice:`loongjohn`,name:`loongJohn`,desc:`沉稳亲切美音`,lang:`英文`}],jh=[{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:`印尼语`}],Mh={"qwen-audio-3.0-tts-plus":kh,"qwen-audio-3.0-tts-flash":Ah,"cosyvoice-v3-flash":jh,"cosyvoice-v3-plus":jh,"cosyvoice-v3.5-flash":[],"cosyvoice-v3.5-plus":[],"cosyvoice-v2":[]};function Nh(e){return e.startsWith(`qwen-audio-`)?Oh:Ar}function Ph(e){let t=Mh[e],n=Nh(e);if(!t){process.stdout.write(`No built-in voice list available for model: ${e}\n`),process.stdout.write(`See official voice list: ${n}\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.
2740
+ `),process.stdout.write(`See: ${Dh}\n`),process.stdout.write(`Browse voices in the console: ${Ar}\n`);return}let r=(e,t)=>e.padEnd(t);process.stdout.write(`\nSystem voices for ${e}:\n`),process.stdout.write(`${r(`VOICE ID`,26)} ${r(`NAME`,10)} ${r(`DESCRIPTION`,16)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(26)} ${`-`.repeat(10)} ${`-`.repeat(16)} ${`-`.repeat(12)}\n`);for(let e of t)process.stdout.write(`${r(e.voice,26)} ${r(e.name,10)} ${r(e.desc,16)} ${e.lang}\n`);process.stdout.write(`\nTotal: ${t.length} voices\n`),process.stdout.write(`Preview and browse more voices: \n${n}\n`)}const Fh={text:{type:`string`,valueHint:`<text>`,description:{"en-US":`Text to synthesize into speech (or use --text-file)`,"zh-CN":`要合成为语音的文本(也可使用 --text-file)`}},textFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read text from a file instead of --text`,"zh-CN":`从文件读取文本,而非使用 --text`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: configured Profile TTS model, otherwise cosyvoice-v3-flash). System voices vary by model`,"zh-CN":`模型 ID(默认:Profile 配置的 TTS 模型,否则为 cosyvoice-v3-flash)。系统音色因模型而异`}},voice:{type:`string`,valueHint:`<voice>`,description:{"en-US":`Voice ID. Use --list-voices for the selected model (e.g. qwen-audio-3.0-tts-plus/flash, cosyvoice-v3-flash); for v3.5-flash provide a clone/design voice ID`,"zh-CN":`音色 ID。使用 --list-voices 查看所选模型的内置音色(如 qwen-audio-3.0-tts-plus/flash、cosyvoice-v3-flash);使用 v3.5-flash 时需提供复刻/设计音色 ID`}},listVoices:{type:`switch`,description:{"en-US":`List built-in system voices for the selected model and exit (console link shown in output)`,"zh-CN":`列出所选模型的内置系统音色并退出(输出中会显示控制台链接)`}},format:{type:`string`,valueHint:`<format>`,description:{"en-US":`Audio format: mp3, pcm, wav, opus (default: mp3; streaming default: pcm)`,"zh-CN":`音频格式:mp3、pcm、wav、opus(默认:mp3;流式模式默认:pcm)`},choices:[`mp3`,`pcm`,`wav`,`opus`]},sampleRate:{type:`string`,valueHint:`<rate>`,description:{"en-US":`Audio sample rate in Hz (e.g. 24000)`,"zh-CN":`音频采样率,单位为 Hz(例如 24000)`}},volume:{type:`string`,valueHint:`<volume>`,description:{"en-US":`Volume 0-100 (default: 50)`,"zh-CN":`音量 0–100(默认:50)`}},rate:{type:`string`,valueHint:`<rate>`,description:{"en-US":`Speech rate 0.5-2.0 (default: 1.0)`,"zh-CN":`语速 0.5–2.0(默认:1.0)`}},pitch:{type:`string`,valueHint:`<pitch>`,description:{"en-US":`Pitch multiplier 0.5-2.0 (default: 1.0)`,"zh-CN":`音高倍数 0.5–2.0(默认:1.0)`}},seed:{type:`string`,valueHint:`<seed>`,description:{"en-US":`Random seed 0-65535 for reproducible synthesis`,"zh-CN":`用于复现合成结果的随机种子 0–65535`}},language:{type:`string`,valueHint:`<lang>`,description:{"en-US":`Language hint (e.g. zh, en, ja, ko, fr, de)`,"zh-CN":`语言提示(例如 zh、en、ja、ko、fr、de)`}},instruction:{type:`string`,valueHint:`<text>`,description:{"en-US":`Natural language instruction to control speech style (e.g. "Use a gentle tone")`,"zh-CN":`用于控制语音风格的自然语言指令(例如“使用温柔的语气”)`}},enableSsml:{type:`switch`,description:{"en-US":`Enable SSML markup parsing in input text`,"zh-CN":`解析输入文本中的 SSML 标记`}},out:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save audio to file (default: auto-generate in temp dir)`,"zh-CN":`将音频保存到文件(默认:在临时目录中自动生成路径)`}},stream:{type:`switch`,description:{"en-US":`Stream raw PCM audio to stdout (pipe to player)`,"zh-CN":`将原始 PCM 音频流式输出到 stdout(可通过管道传给播放器)`}},...r};var Ih=w({description:{"en-US":`Synthesize speech from text`,"zh-CN":`将文本合成为语音`},auth:`apiKey`,usageArgs:`--text <text> [flags]`,flags:Fh,exampleArgs:[`--list-voices --model qwen-audio-3.0-tts-plus`,`--list-voices --model cosyvoice-v3-flash`,{"en-US":`--text "Hello, I am Qwen" --model qwen-audio-3.0-tts-plus --voice longanlingxin`,"zh-CN":`--text "你好,我是通义千问" --model qwen-audio-3.0-tts-plus --voice longanlingxin`},{"en-US":`--text "Hello world" --voice <voice_id> --language en`,"zh-CN":`--text "你好,世界" --voice <voice_id> --language zh`},`--text-file script.txt --out speech.wav --voice <voice_id>`,{"en-US":`--text "Today is a good day" --voice <voice_id> --instruction "Use a gentle tone"`,"zh-CN":`--text "今天天气很好" --voice <voice_id> --instruction "使用温柔的语气"`},{"en-US":`--text "Hello" --voice <voice_id> --format wav --sample-rate 24000`,"zh-CN":`--text "你好" --voice <voice_id> --format wav --sample-rate 24000`},{"en-US":`# Stream to audio player (macOS)`,"zh-CN":`# 流式传输到音频播放器(macOS)`},{"en-US":`--text "Hello" --voice <voice_id> --stream | afplay -`,"zh-CN":`--text "你好" --voice <voice_id> --stream | afplay -`},{"en-US":`# Pipe to ffplay`,"zh-CN":`# 通过管道传输到 ffplay`},{"en-US":`--text "Hello" --voice <voice_id> --stream | ffplay -nodisp -autoexit -f s16le -ar 24000 -ac 1 -`,"zh-CN":`--text "你好" --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: ${Ar})`}},async run(e){let{settings:t,flags:r}=e,i=r.model||t.defaultSpeechModel||`cosyvoice-v3-flash`;if(r.listVoices){Ph(i);return}let a=r.text||``;if(!a&&r.textFile){let e=r.textFile;try{a=mi(e,`utf-8`).trim()}catch{throw new n(`Cannot read text file: ${e}`,f.USAGE)}}let o=r.voice,s=r.language||void 0,c=r.instruction||void 0,l=r.stream===!0,u=r.format||(l?`pcm`:`mp3`),d=r.sampleRate===void 0?void 0:Number(r.sampleRate),p=r.volume===void 0?void 0:Number(r.volume),m=r.rate===void 0?void 0:Number(r.rate),h=r.pitch===void 0?void 0:Number(r.pitch),g=r.seed===void 0?void 0:Number(r.seed),_=r.enableSsml===!0||void 0,v=T(t.output),y={model:i,input:{text:a,voice:o,format:u,sample_rate:d,volume:p,rate:m,pitch:h,seed:g,language_hints:s?[s]:void 0,instruction:c,enable_ssml:_}};if(or(y.input),t.dryRun){A({request:y},v);return}t.quiet||process.stderr.write(`[Model: ${i}] [Voice: ${o}]\n`),l?await Rh(e.client,t,y,r,v):await Lh(e.client,t,y,r,v)}});async function Lh(e,t,r,i,a){let o=Ur(i),s=await ei(o,t,()=>e.requestJson({path:tr(),method:`POST`,body:r})),c=s.map(e=>e.output?.audio?.url).filter(Boolean);if(c.length===0)throw new n(`API returned no audio URL.`,f.GENERAL);let l=await import(`path`),u=zn(t,{subDir:`speech`}),d=c.map((e,t)=>{let n=i.out;if(!(n&&c.length===1)){let e=Date.now(),i=c.length>1?`_${String(t+1).padStart(3,`0`)}`:``,a=r.input.format??`mp3`;n=l.join(u,`tts_${e}${i}.${a}`)}return{url:e,destPath:n}}),p=await Ir(d,Fr,{quiet:t.quiet});if(t.quiet)k(p.join(`
2741
+ `));else if(p.length===1){let e=s[0].output?.audio?.expires_at;A({saved:p[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},a)}else A({saved:p,audio_urls:c,total:p.length,model:r.model,voice:r.input.voice},a)}async function Rh(e,t,n,r,i){let a=await e.request({path:tr(),method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?di(o):null,c;try{for await(let e of gn(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 zh={url:{type:`array`,valueHint:`<url>`,description:{"en-US":`Audio file URL or local file path (repeatable, max 100)`,"zh-CN":`音频文件 URL 或本地文件路径(可重复,最多 100 个)`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (default: configured Profile ASR model, otherwise fun-asr). Async: fun-asr / *-filetrans / paraformer-*; sync: qwen3-asr-flash* / fun-asr-flash* / qwen-audio-*-asr-flash`,"zh-CN":`模型 ID(默认:Profile 配置的 ASR 模型,否则为 fun-asr)。异步:fun-asr / *-filetrans / paraformer-*;同步:qwen3-asr-flash* / fun-asr-flash* / qwen-audio-*-asr-flash`}},language:{type:`string`,valueHint:`<lang>`,description:{"en-US":`Language hint (e.g. zh, en, ja). Classic async/input-audio: language_hints; qwen3-filetrans: language; qwen3 sync: asr_options.language`,"zh-CN":`语言提示(例如 zh、en、ja)。传统异步/input-audio:language_hints;qwen3-filetrans:language;qwen3 同步:asr_options.language`}},diarization:{type:`switch`,description:{"en-US":`Enable automatic speaker diarization`,"zh-CN":`启用自动说话人分离`}},speakerCount:{type:`number`,valueHint:`<n>`,description:{"en-US":`Expected number of speakers (requires --diarization)`,"zh-CN":`预期的说话人数量(需启用 --diarization)`}},vocabularyId:{type:`string`,valueHint:`<id>`,description:{"en-US":"Pre-built hot-word vocabulary ID (create it via `speech vocabulary create`). Its target_model must exactly match --model, otherwise it is silently ignored. Wider model support than --vocabulary, including Fun-ASR and Paraformer","zh-CN":"预编译热词列表 ID(可用 `speech vocabulary create` 创建)。其 target_model 必须与 --model 完全一致,否则静默失效且无报错。支持模型比 --vocabulary 更广,含 Fun-ASR 与 Paraformer 系列"}},vocabulary:{type:`string`,valueHint:`<json>`,description:{"en-US":`Instant hot words as JSON object of word→weight, e.g. '{"Fendouzhe":4}'. Weight 1-5 (4 recommended; higher values can hurt other words), 50 for super hot word. No pre-built vocabulary needed. Takes effect only on Qwen-Audio-3.0-ASR-Flash models`,"zh-CN":`即时热词,JSON 对象「热词→权重」,例如 '{"奋斗者":4}'。权重 1-5(推荐 4,过高会拖累其他词),50 表示超级热词。无需预先创建热词表。仅 Qwen-Audio-3.0-ASR-Flash 系列模型生效`}},context:{type:`string`,valueHint:`<text>`,description:{"en-US":`Context enhancement word list to improve accuracy on proper nouns; must contain the target words themselves (a topic description alone has little effect); max 400 chars. Takes effect only on Qwen-Audio-3.0-ASR-Flash and Fun-ASR-Flash models`,"zh-CN":`上下文增强词表,提升专有名词准确率;须包含待识别的原词本身(只写主题描述效果有限),最长 400 字符。仅 Qwen-Audio-3.0-ASR-Flash 系列与 Fun-ASR-Flash 模型生效`}},channelId:{type:`number`,valueHint:`<n>`,description:{"en-US":`Audio channel ID (default: 0)`,"zh-CN":`音频声道 ID(默认:0)`}},out:{type:`string`,valueHint:`<path>`,description:{"en-US":`Save full transcription result to JSON file`,"zh-CN":`将完整转写结果保存到 JSON 文件`}},...t,pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Polling interval in seconds (default: 2)`,"zh-CN":`轮询间隔,单位为秒(默认:2)`}}};function Bh(e,t,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.vocabulary!==void 0&&i.push(`--vocabulary`),e.context!==void 0&&i.push(`--context`)),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 n(`Model "${t}" uses sync Flash ASR and does not support: ${i.join(`, `)}.\n`+Vh(i),f.USAGE)}function Vh(e){let t=/* @__PURE__ */ new Set([`--vocabulary`,`--vocabulary-id`,`--context`]),n=e.some(e=>t.has(e)),r=e.some(e=>!t.has(e));return n&&!r?`Hint: Use qwen-audio-3.0-asr-flash (or an async filetrans model such as qwen-audio-3.0-asr-flash-filetrans) for vocabulary/context flags.`:n&&r?`Hint: For vocabulary/context flags use qwen-audio-3.0-asr-flash or qwen-audio-3.0-asr-flash-filetrans; for the other flags use an async filetrans model (e.g. fun-asr).`:`Hint: Use an async filetrans model (e.g. fun-asr, qwen3-asr-flash-filetrans) for those flags.`}var Hh=w({description:{"en-US":`Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash)`,"zh-CN":`识别音频文件中的语音(FunAudio-ASR / Qwen-ASR Flash)`},auth:`apiKey`,usageArgs:`--url <audio-url> [flags]`,flags:zh,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 --model qwen-audio-3.0-asr-flash-filetrans --vocabulary '{"奋斗者":4,"鲸落":4}'`,`--url https://example.com/audio.mp3 --model qwen-audio-3.0-asr-flash-filetrans --context "奋斗者号 鲸落 深海勇士"`,`--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:t,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 n(`--speaker-count requires --diarization to be enabled.
2742
+ Hint: Add --diarization flag to enable speaker separation.`,f.USAGE);let s=r.model||t.defaultSpeechRecognitionModel||`fun-asr`,c=Fn(s);if(c.kind===`unsupported`)throw new n(c.unsupportedReason??`Unsupported ASR model: ${s}`,f.USAGE);if(c.kind===`sync-flash`&&(Bh(r,s,c.flashFamily),i.length!==1))throw new n(`Model "${s}" 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.`,f.USAGE);if(c.kind===`async-filetrans`&&c.asyncInputStyle===`file_url`&&i.length!==1)throw new n(`Model "${s}" accepts exactly one --url (got ${i.length}).\nHint: qwen3-asr-flash-filetrans* requires a single file_url.`,f.USAGE);let l=T(t.output),u=r.vocabulary===void 0?void 0:hn(r.vocabulary),d=await Promise.all(i.map(t=>e.client.uploadFile(t,s)));if(c.kind===`sync-flash`){await Uh(e.client,t,r,l,s,c,d[0],u);return}let p=r.channelId,m=r.vocabularyId,h=pe(c.asyncLanguageStyle??`language_hints`,r.language),g={model:s,input:{...c.asyncInputStyle===`file_url`?{file_url:d[0]}:{file_urls:d},...r.context===void 0?{}:{context:de(r.context)}},parameters:{channel_id:p===void 0?[0]:[p],...h,diarization_enabled:o?!0:void 0,speaker_count:a,vocabulary_id:m,vocabulary:u}};if(or(g.parameters),t.dryRun){A({request:g,mode:`async`,path:er()},l);return}t.quiet||process.stderr.write(`[Model: ${s}] [Mode: async] [Files: ${d.length}]\n`),await Wh(e.client,t,g,r,l,d.length)}});async function Uh(e,t,n,r,i,a,o,s){let c=a.flashFamily,l=fe({model:i,audioUrl:o,language:n.language,vocabularyId:n.vocabularyId,vocabulary:s,context:n.context,flashFamily:c});if(t.dryRun){A({request:l,mode:`sync`,path:a.path},r);return}t.quiet||process.stderr.write(`[Model: ${i}] [Mode: sync] [Files: 1]\n`);let u=await e.requestJson({path:a.path,method:`POST`,headers:{"X-DashScope-SSE":`disable`},body:l}),d=Ge(u,c);d?process.stdout.write(d.endsWith(`
2743
+ `)?d:`${d}\n`):k(JSON.stringify(u)),n.out&&(_i(n.out,JSON.stringify(u,null,2)+`
2744
+ `),t.quiet||process.stderr.write(`Full result saved to: ${n.out}\n`))}async function Wh(e,t,r,i,a,o){let s=(await e.requestJson({path:er(),method:`POST`,body:r,async:!0})).output.task_id;if(i.async){A({task_id:s},a);return}let c=i.pollInterval??2,l=e.url(sr(s)),u=await Yr(e,t,{url:l,intervalSec:c,timeoutSec:t.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=Se(u.output);if(d.length===0){A({task_id:s,status:u.output.task_status},a);return}let p=[];for(let e=0;e<d.length;e++){let t=d[e],r=o>1;if(r&&process.stdout.write(`=== [${e+1}/${d.length}] ${t.file_url??``} ===\n`),t.subtask_status===`FAILED`){let e=t.message??t.code??`unknown error`;process.stdout.write(`[FAILED] ${t.file_url??``} — ${e}\n`),r&&process.stdout.write(`
2746
2745
  `);continue}if(!t.transcription_url){r&&process.stdout.write(`
2747
2746
  `);continue}let i=await fetch(t.transcription_url);if(!i.ok)throw new n(`Failed to download transcription: HTTP ${i.status}`,f.GENERAL);let a=await i.json();p.push(a);let s=a.transcripts;if(s&&s.length>0)for(let e of s)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+`
2748
2747
  `);else k(JSON.stringify(a));r&&process.stdout.write(`
2749
- `)}if(i.out){let e=i.out,n=p.length===1?p[0]:p;mi(e,JSON.stringify(n,null,2)+`
2750
- `),t.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}const $m={id:{type:`string`,valueHint:`<id>`,description:{"en-US":`Hot-word vocabulary ID (required)`,"zh-CN":`热词表 ID(必填)`},required:!0}},eh={words:{type:`string`,valueHint:`<json>`,description:{"en-US":`Hot words as JSON object of word→weight, e.g. '{"Fendouzhe":4}'; or the API entry array for per-entry lang. Weight 1-5 (4 recommended); when the vocabulary target_model is a Qwen-Audio-3.0-ASR-Flash series model, 50 is also allowed as super hot word. Or use --words-file`,"zh-CN":`热词,JSON 对象「热词→权重」,例如 '{"奋斗者":4}';需要逐条指定语言时可传 API 的条目数组。权重 1-5(推荐 4);当热词表的 target_model 为 Qwen-Audio-3.0-ASR-Flash 系列时还可使用 50(超级热词)。也可使用 --words-file`}},wordsFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`JSON file with the hot words (use - for stdin)`,"zh-CN":`包含热词的 JSON 文件(使用 - 从 stdin 读取)`}},lang:{type:`string`,valueHint:`<code>`,description:{"en-US":`Language code applied to every hot word when using object form (optional; ignored for array form). Paraformer: zh/en/ja/yue/ko/de/fr/ru; Fun-ASR: zh/en/ja`,"zh-CN":`对象形态时应用到所有热词的语言代码(选填;数组形态忽略)。Paraformer 支持 zh/en/ja/yue/ko/de/fr/ru;Fun-ASR 支持 zh/en/ja`}}};function th(e){if(!e.words&&!e.wordsFile)return`Provide --words or --words-file.`;if(e.words&&e.wordsFile)return`Use either --words or --words-file, not both.`;if(e.words)try{gn(e.words,e.lang)}catch(e){if(e instanceof C)return e.message;throw e}}function nh(e){let t=e.wordsFile?Tn(e.wordsFile):e.words;return gn(t,e.lang)}const rh=[{"en-US":`Each account may have at most 10 vocabularies; updates must be at least 5 minutes apart. See improve-asr-accuracy for full limits.`,"zh-CN":`每个账号最多 10 个热词表;两次更新间隔至少 5 分钟。完整限制见 improve-asr-accuracy。`},{"en-US":`Hot-word vocabularies are not supported in Singapore sub-workspaces; the server error is passed through as-is.`,"zh-CN":`新加坡子业务空间不支持热词表;服务端错误会原样透传。`},{"en-US":`Weight 1-5 (4 recommended); when the vocabulary target_model is a Qwen-Audio-3.0-ASR-Flash series model, 50 is also allowed as super hot word.`,"zh-CN":`权重 1-5(推荐 4);当热词表的 target_model 为 Qwen-Audio-3.0-ASR-Flash 系列时还可使用 50(超级热词)。`}],ih={model:{type:`string`,valueHint:`<model>`,description:{"en-US":"ASR model this vocabulary is built for (required). Must exactly match the --model passed to `speech recognize` later, otherwise the vocabulary is silently ignored","zh-CN":"该热词表服务的 ASR 模型(必填)。必须与后续 `speech recognize` 的 --model 完全一致,否则热词表静默失效"},required:!0},prefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Custom vocabulary prefix (required). Digits and lowercase letters only, max 10 chars`,"zh-CN":`热词表自定义前缀(必填)。仅允许数字和小写字母,最长 10 个字符`},required:!0},...eh};var ah=w({description:{"en-US":`Create a precompiled hot-word vocabulary for ASR`,"zh-CN":`创建用于语音识别的预编译热词表`},auth:`apiKey`,usageArgs:`--model <model> --prefix <prefix> (--words <json> | --words-file <path>) [flags]`,flags:ih,notes:[{"en-US":"The --model must exactly match the --model used later with `speech recognize --vocabulary-id`; a mismatch causes silent failure with no error.","zh-CN":"--model 必须与后续 `speech recognize --vocabulary-id` 使用的 --model 完全一致;不一致时热词表会静默失效且无报错。"},...rh],exampleArgs:[{"en-US":`--model fun-asr --prefix demo --words '{"Fendouzhe":4,"Jingluo":4}'`,"zh-CN":`--model fun-asr --prefix demo --words '{"奋斗者":4,"鲸落":4}'`},{"en-US":`--model paraformer-v2 --prefix demo --words '[{"text":"Fendouzhe","weight":4,"lang":"zh"}]'`,"zh-CN":`--model paraformer-v2 --prefix demo --words '[{"text":"奋斗者","weight":4,"lang":"zh"}]'`},{"en-US":`--model fun-asr --prefix demo --words '{"Fendouzhe":4}' --lang zh`,"zh-CN":`--model fun-asr --prefix demo --words '{"奋斗者":4}' --lang zh`},`--model fun-asr --prefix demo --words-file ./hotwords.json`,{"en-US":`--model fun-asr --prefix demo --words '{"Fendouzhe":4}' --quiet`,"zh-CN":`--model fun-asr --prefix demo --words '{"奋斗者":4}' --quiet`}],validate:e=>th(e),async run(e){let{settings:t,flags:n}=e,r=nh(n),i=T(t.output),a=_e(`create_vocabulary`,{target_model:n.model,prefix:n.prefix,vocabulary:r});if(t.dryRun){A({endpoint:e.client.url($n()),request:a},i);return}let o=await Ae(e.client,{targetModel:n.model,prefix:n.prefix,vocabulary:r});t.quiet||i===`text`?k(o.output?.vocabulary_id??``):A(o,i)}}),oh=w({description:{"en-US":`List precompiled hot-word vocabularies`,"zh-CN":`列出预编译热词表`},auth:`apiKey`,usageArgs:`[--prefix <prefix>] [--page <n>] [--page-size <n>]`,flags:{prefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filter by vocabulary prefix`,"zh-CN":`按热词表前缀过滤`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number, 1-based (default: 1). Mapped to API page_index (0-based) as page - 1`,"zh-CN":`页码,从 1 开始(默认:1)。映射为 API 的 page_index(从 0 开始):page - 1`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10)`,"zh-CN":`每页结果数(默认:10)`}}},notes:[{"en-US":"List responses do not include target_model; use `speech vocabulary get` to inspect the model a vocabulary was built for.","zh-CN":"list 响应不含 target_model;要对齐模型请使用 `speech vocabulary get`。"},{"en-US":`Vocabularies with status UNDEPLOYED are silently ignored by ASR.`,"zh-CN":`status 为 UNDEPLOYED 的热词表会被 ASR 静默忽略。`}],exampleArgs:[``,`--prefix demo`,`--page 2 --page-size 20`],validate:e=>{if(e.page!==void 0&&e.page<1)return`--page must be >= 1.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.page===void 0?void 0:n.page-1,a={};if(n.prefix!==void 0&&(a.prefix=n.prefix),i!==void 0&&(a.page_index=i),n.pageSize!==void 0&&(a.page_size=n.pageSize),t.dryRun){A({endpoint:e.client.url($n()),request:_e(`list_vocabulary`,a)},r);return}let o=await Xt(e.client,{prefix:n.prefix,pageIndex:i,pageSize:n.pageSize});if(t.quiet||r===`text`){let e=o.output?.vocabulary_list??[];if(e.length===0)k(`No vocabularies found.`);else{let t=!1;for(let n of e){let e=n.vocabulary_id??``,r=n.status??``,i=n.gmt_modified??``;r===`UNDEPLOYED`&&(t=!0),k(`[${e}] ${r} ${i}`.trimEnd())}t&&k("Note: UNDEPLOYED vocabularies are silently ignored by ASR. Use `speech vocabulary get` to inspect them.")}}else A(o,r)}});const sh={...$m};var ch=w({description:{"en-US":`Get details of a precompiled hot-word vocabulary`,"zh-CN":`查看预编译热词表详情`},auth:`apiKey`,usageArgs:`--id <id>`,flags:sh,notes:[{"en-US":"Use this command to confirm target_model before calling `speech recognize --vocabulary-id`; a model mismatch causes silent failure.","zh-CN":"调用 `speech recognize --vocabulary-id` 前请用本命令确认 target_model;模型不一致会导致静默失效。"}],exampleArgs:[`--id vocab-demo-xxx`,`--id vocab-demo-xxx --quiet`],async run(e){let{settings:t,flags:n}=e,r=n.id,i=T(t.output);if(t.dryRun){A({endpoint:e.client.url($n()),request:_e(`query_vocabulary`,{vocabulary_id:r})},i);return}let a=await xn(e.client,r),o=a.output;if(t.quiet){k(o?.target_model??``);return}if(i===`text`){k(`vocabulary_id: ${r}`),k(`status: ${o?.status??``}`),k(`target_model: ${o?.target_model??``}`),k(`gmt_create: ${o?.gmt_create??``}`),k(`gmt_modified: ${o?.gmt_modified??``}`);let e=o?.vocabulary??[];if(e.length>0){k(`vocabulary:`);for(let t of e){let e=t.lang?` lang=${t.lang}`:``;k(` ${t.text} weight=${t.weight}${e}`)}}}else A(a,i)}});const lh={...$m,...eh};var uh=w({description:{"en-US":`Replace the contents of a precompiled hot-word vocabulary`,"zh-CN":`完全替换预编译热词表的内容`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This fully replaces all hot words in the vocabulary. Entries not listed will be discarded and cannot be undone.`,"zh-CN":`该操作会完全替换热词表中的全部词条。未列出的词将被丢弃,且无法撤销。`}},usageArgs:`--id <id> (--words <json> | --words-file <path>) [flags]`,flags:lh,notes:[{"en-US":`update is a full replace, not an append. Prefer --dry-run first to preview the complete vocabulary that will be written.`,"zh-CN":`update 是完全替换,不是增量追加。建议先用 --dry-run 预览将要写入的完整词表。`},...rh],exampleArgs:[{"en-US":`--id vocab-demo-xxx --words '{"Fendouzhe":4}' --dry-run`,"zh-CN":`--id vocab-demo-xxx --words '{"奋斗者":4}' --dry-run`},{"en-US":`--id vocab-demo-xxx --words '{"Fendouzhe":4,"Jingluo":4}' --yes`,"zh-CN":`--id vocab-demo-xxx --words '{"奋斗者":4,"鲸落":4}' --yes`}],validate:e=>th(e),async run(e){let{settings:t,flags:n}=e,r=n.id,i=nh(n),a=T(t.output),o=_e(`update_vocabulary`,{vocabulary_id:r,vocabulary:i});if(t.dryRun){A({endpoint:e.client.url($n()),request:o},a);return}let s=await fr(e.client,r,i);t.quiet||a===`text`?k(r):A(s,a)}});const dh={...$m};var fh=w({description:{"en-US":`Delete a precompiled hot-word vocabulary`,"zh-CN":`删除预编译热词表`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified hot-word vocabulary and cannot be undone.`,"zh-CN":`该操作会永久删除指定的热词表,且无法撤销。`}},usageArgs:`--id <id>`,flags:dh,exampleArgs:[`--id vocab-demo-xxx --dry-run`,`--id vocab-demo-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=n.id,i=T(t.output);if(t.dryRun){A({endpoint:e.client.url($n()),request:_e(`delete_vocabulary`,{vocabulary_id:r})},i);return}let a=await ze(e.client,r);t.quiet||i===`text`?k(r):A(a,i)}}),ph=w({description:{"en-US":`Upload a local file to DashScope temporary storage (48h)`,"zh-CN":`将本地文件上传到 DashScope 临时存储(保留 48 小时)`},auth:`apiKey`,usageArgs:`--file <path> --model <model>`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Local file to upload (image, video, audio)`,"zh-CN":`要上传的本地文件(图片、视频或音频)`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Target model name (file is bound to this model)`,"zh-CN":`目标模型名称(文件将与该模型绑定)`},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)}}),mh=w({description:{"en-US":`Call a Bailian console API via the CLI gateway`,"zh-CN":`通过 CLI Gateway 调用百炼控制台 API`},auth:`console`,usageArgs:`--api <api> --data <json> [flags]`,flags:{api:{type:`string`,valueHint:`<api>`,description:{"en-US":`API name (e.g. zeldaEasy.broadscope-bailian.memory-library.getLibraries)`,"zh-CN":`API 名称(例如 zeldaEasy.broadscope-bailian.memory-library.getLibraries)`},required:!0},data:{type:`string`,valueHint:`<json>`,description:{"en-US":`Request data as JSON string`,"zh-CN":`JSON 字符串格式的请求数据`},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 C(`--data must be valid JSON`)}let o=T(t.output);if(t.dryRun){A({api:r,data:a,...E(t)},o);return}let s=await e.client.console(r,a);A(s,o)}});function hh(e){let t=e.client.baseUrl.replace(/\/+$/,``);return t&&!At(t)?t:ie(B(e))}const gh={agent_identity:{"en-US":`Agent identity issuance`,"zh-CN":`Agent 身份签发`},content_safety:{"en-US":`Content safety`,"zh-CN":`内容安全`},supply_chain_scan:{"en-US":`Supply-chain static scan`,"zh-CN":`供应链静态扫描`},credential_isolation:{"en-US":`Credential isolation`,"zh-CN":`凭证隔离`},session_lifecycle:{"en-US":`Session lifecycle governance`,"zh-CN":`session 生命周期治理`}},_h={flow_agent:{"en-US":`Flow Agent`,"zh-CN":`Flow Agent`},managed_agent:{"en-US":`Managed Agents`,"zh-CN":`Managed Agents`},knowledge_base:{"en-US":`RAG`,"zh-CN":`RAG`},memory:{"en-US":`Memory`,"zh-CN":`Memory`},mcp:{"en-US":`Store`,"zh-CN":`Store`},external_agent:{"en-US":`BYOA hosting`,"zh-CN":`BYOA 托管`}},vh=[{label:{"en-US":`Content safety`,"zh-CN":`内容安全`},keys:[`content_safety`,`contentSafety`]},{label:{"en-US":`File scan`,"zh-CN":`文件扫描`},keys:[`file_scan`,`fileScan`]},{label:{"en-US":`Skill scan`,"zh-CN":`技能扫描`},keys:[`skill_scan`,`skillScan`]}],V={unavailable:{"en-US":`(unavailable)`,"zh-CN":`(不可用)`},on:{"en-US":`on`,"zh-CN":`开启`},off:{"en-US":`off`,"zh-CN":`关闭`},scannedLabel:{"en-US":`Scanned`,"zh-CN":`扫描`},risksLabel:{"en-US":`Risks`,"zh-CN":`风险`},capabilities:{"en-US":`Capabilities`,"zh-CN":`能力项`},protection:{"en-US":`Protection`,"zh-CN":`防护项`},detections:{"en-US":`Detections`,"zh-CN":`检测项`},overviewUnavailable:{"en-US":`Overview unavailable.`,"zh-CN":`总览不可用。`},hit:{"en-US":`hit`,"zh-CN":`命中`},scanned:{"en-US":`scanned`,"zh-CN":`扫描`},total:{"en-US":`Total`,"zh-CN":`总计`},high:{"en-US":`high`,"zh-CN":`高`},medium:{"en-US":`medium`,"zh-CN":`中`},low:{"en-US":`low`,"zh-CN":`低`},noAlerts:{"en-US":`No alerts found.`,"zh-CN":`未找到告警。`},nextPageCursor:{"en-US":`Next page cursor`,"zh-CN":`下一页游标`},app:{"en-US":`app`,"zh-CN":`应用`},asset:{"en-US":`asset`,"zh-CN":`资产`},status:{"en-US":`status`,"zh-CN":`状态`},source:{"en-US":`source`,"zh-CN":`来源`},checked:{"en-US":`checked`,"zh-CN":`检测时间`}};function yh(e,t,n){if(n!=null&&n!==``){if(Array.isArray(n)){for(let r of n)e.append(t,r);return}e.set(t,String(n))}}function bh(e,t,n,r){if(k(`\n${e(t)}`),!n||n.length===0){k(` ${e(V.unavailable)}`);return}for(let t of n){let n=typeof t.count==`number`?` (${t.count})`:``,i=e(t.enabled?V.on:V.off),a=r[t.key]?e(r[t.key]):t.key;k(` ${i} ${a}${n}`)}}function xh(e){if(!e)return`-`;let t=/^\d+$/.test(e)?Number(e):Date.parse(e);return Number.isNaN(t)?e:new Date(t).toISOString().replace(`T`,` `).slice(0,19)}function Sh(e,t){let n=(t.risk_level??`unknown`).toUpperCase();k(`[${n}] ${t.risk_name??`-`} (${t.alert_id})`),k(` ${e(V.app)}: ${t.app_name??`-`} ${e(V.asset)}: ${t.asset_name??`-`} (${t.asset_type??`-`})`),k(` ${e(V.status)}: ${t.status??`-`} ${e(V.source)}: ${t.source??`-`} ${e(V.checked)}: ${xh(t.check_time)}`),t.risk_desc&&k(` ${t.risk_desc}`),k(``)}const Ch={...z};var wh=w({description:{"en-US":`Show the Agent security protection overview (last 24 hours)`,"zh-CN":`查看 Agent 安全防护总览(最近 24 小时)`},auth:`apiKey`,usageArgs:`[flags]`,flags:Ch,notes:[{"en-US":`Auth: uses DashScope API Key (Bearer token).`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or config workspace_id.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或配置项 workspace_id 设置。"},{"en-US":`Fixed to the last 24 hours; the AgentStudio region is always cn-beijing and is not configurable.`,"zh-CN":`固定统计最近 24 小时;AgentStudio 地域固定为 cn-beijing,不可配置。`},{"en-US":"AgentStudio host: derived from --workspace-id by default; point --base-url / DASHSCOPE_BASE_URL (or `auth login --base-url`) at a workspace or pre-release origin such as https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio to override it, and --workspace-id is then not required.","zh-CN":"AgentStudio 域名:默认由 --workspace-id 推导;将 --base-url / DASHSCOPE_BASE_URL(或 `auth login --base-url`)指向某个 workspace 或预发源(例如 https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio)即可覆盖,此时无需 --workspace-id。"}],exampleArgs:[{"en-US":`--workspace-id ws-xxx`,"zh-CN":`--workspace-id ws-xxx`},{"en-US":`--workspace-id ws-xxx --output json`,"zh-CN":`--workspace-id ws-xxx --output json`}],async run(e){let{settings:t,localize:n}=e,r=T(t.output),i=Xn(hh(e));if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await Yn(e.client,i);if(!a){r===`json`?A({},r):k(n(V.overviewUnavailable));return}if(r===`json`){A(a,r);return}let o=vh.map(({label:e,keys:t})=>{let r=t.map(e=>a[e]).find(e=>e!==void 0);return{label:n(e),stat:r??null}}),s=e=>o.reduce((t,n)=>t+(n.stat?e(n.stat)??0:0),0);k(`${n(V.scannedLabel)}: ${s(e=>e.scanned)} ${n(V.risksLabel)}: ${s(e=>e.hit)}`),bh(n,V.capabilities,a.capabilities,gh),bh(n,V.protection,a.protection,_h),k(`\n${n(V.detections)}`);for(let{label:e,stat:t}of o)k(t?` ${e} ${n(V.hit)} ${t.hit??`-`} / ${n(V.scanned)} ${t.scanned??`-`}`:` ${e} ${n(V.unavailable)}`)}});const Th=[`agent`,`tool`,`skill`,`knowledge_base`,`memory`,`channel`],Eh={...z,page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 20)`,"zh-CN":`每页结果数(默认:20)`}},riskLevel:{type:`string`,valueHint:`<level>`,choices:[`high`,`medium`,`low`],description:{"en-US":`Filter by risk level: high, medium, low`,"zh-CN":`按风险等级筛选:high、medium、low`}},riskName:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by risk name`,"zh-CN":`按风险名称筛选`}},status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter by handling status`,"zh-CN":`按处理状态筛选`}},statusList:{type:`array`,valueHint:`<status>`,description:{"en-US":`Filter by multiple statuses (repeatable)`,"zh-CN":`按多个状态筛选(可重复传入)`}},appName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by application name`,"zh-CN":`按应用名称筛选`}},assetType:{type:`string`,valueHint:`<type>`,choices:Th,description:{"en-US":`Filter by asset type: ${Th.join(`, `)}`,"zh-CN":`按资产类型筛选:${Th.join(`、`)}`}},vendor:{type:`string`,valueHint:`<vendor>`,description:{"en-US":`Filter by vendor`,"zh-CN":`按厂商筛选`}},orderBy:{type:`string`,valueHint:`<field>`,description:{"en-US":`Sort field (default: check_time)`,"zh-CN":`排序字段(默认:check_time)`}},order:{type:`string`,valueHint:`<dir>`,choices:[`asc`,`desc`],description:{"en-US":`Sort direction: asc, desc (default: desc)`,"zh-CN":`排序方向:asc、desc(默认:desc)`}},lang:{type:`string`,valueHint:`<lang>`,choices:[`zh`,`en`],description:{"en-US":`Response language: zh, en`,"zh-CN":`响应语言:zh、en`}}};var Dh=w({description:{"en-US":`List Agent security alerts`,"zh-CN":`列出 Agent 安全告警`},auth:`apiKey`,usageArgs:`[flags]`,flags:Eh,notes:[{"en-US":`Auth: uses DashScope API Key (Bearer token).`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or config workspace_id.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或配置项 workspace_id 设置。"},{"en-US":`Filters, pagination and sorting go in the query string; enum flags are validated before any request is sent.`,"zh-CN":`筛选、分页与排序参数走 query string;枚举类 flag 在发起请求前校验。`},{"en-US":"AgentStudio host: derived from --workspace-id by default; point --base-url / DASHSCOPE_BASE_URL (or `auth login --base-url`) at a workspace or pre-release origin such as https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio to override it, and --workspace-id is then not required.","zh-CN":"AgentStudio 域名:默认由 --workspace-id 推导;将 --base-url / DASHSCOPE_BASE_URL(或 `auth login --base-url`)指向某个 workspace 或预发源(例如 https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio)即可覆盖,此时无需 --workspace-id。"}],exampleArgs:[{"en-US":`--workspace-id ws-xxx`,"zh-CN":`--workspace-id ws-xxx`},{"en-US":`--risk-level high --page-size 50`,"zh-CN":`--risk-level high --page-size 50`},{"en-US":`--asset-type agent --app-name "demo app" --output json`,"zh-CN":`--asset-type agent --app-name "测试应用0" --output json`},{"en-US":`--status-list unhandled --status-list handling`,"zh-CN":`--status-list unhandled --status-list handling`}],async run(e){let{settings:t,flags:n,localize:r}=e,i=T(t.output),a=hh(e),o=new URLSearchParams;yh(o,`current_page`,n.page),yh(o,`page_size`,n.pageSize),yh(o,`risk_level`,n.riskLevel),yh(o,`risk_name`,n.riskName),yh(o,`status`,n.status),yh(o,`status_list`,n.statusList),yh(o,`app_name`,n.appName),yh(o,`asset_type`,n.assetType),yh(o,`vendor`,n.vendor),yh(o,`order_by`,n.orderBy),yh(o,`order`,n.order),yh(o,`lang`,n.lang);let s=o.toString(),c=Jn(a),l=s?`${c}?${s}`:c;if(t.dryRun){A({endpoint:l,method:`GET`},i);return}let u=await Yn(e.client,l),d=u?.data??[];if(t.quiet){for(let e of d)k(e.alert_id);return}if(i===`json`){A(u??{stats:null,data:[],next_page:null},i);return}let f=u?.stats;if(f&&k(`${r(V.total)}: ${f.total??`-`} ${r(V.high)}: ${f.high??`-`} ${r(V.medium)}: ${f.medium??`-`} ${r(V.low)}: ${f.low??`-`}\n`),d.length===0){k(r(V.noAlerts));return}for(let e of d)Sh(r,e);u?.next_page&&k(`${r(V.nextPageCursor)}: ${u.next_page}`)}});function H(e){return e.toLocaleString(`en-US`)}function Oh(e){let t=new Date(e),n=String(t.getMonth()+1).padStart(2,`0`),r=String(t.getDate()).padStart(2,`0`);return`${t.getFullYear()}-${n}-${r}`}function U(e){let t=e=>String(e).padStart(2,`0`),n=new Date(e);return`${Oh(e)} ${t(n.getHours())}:${t(n.getMinutes())}:${t(n.getSeconds())}`}function W(e){return[...new Set(e.split(`,`).map(e=>e.trim()).filter(Boolean))]}function kh(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}`:``}async function Ah(e,t,n,r=30){let i;for(let a=0;a<r;a++){let r=await e.console(t,n(i)),a=lr(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 jh(e,t,n){return Ah(e,t,e=>e?{reqDTO:{...n,asyncTaskId:e}}:{reqDTO:n})}async function Mh(e,t,r){let i=await jh(e,t,r);if(!i)throw new n(`Request timed out.`,f.TIMEOUT);return lr(i)}const Nh=[`cn-beijing`,`ap-southeast-1`];function G(e){let t=E(e).consoleRegion;if(!Nh.includes(t))throw new C(`Model monitor/log/alert commands are not available in console region "${t}". Supported regions: ${Nh.join(`, `)} (set --console-region).`)}const Ph={days:{type:`number`,valueHint:`<days>`,description:{"en-US":`Number of days to look back (default: 7)`,"zh-CN":`向前查询的天数(默认:7)`}},startTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range start (ISO date or ms epoch); overrides --days`,"zh-CN":`开始时间(ISO 日期或毫秒时间戳),设置后覆盖 --days`}},endTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range end (ISO date or ms epoch); default: now`,"zh-CN":`结束时间(ISO 日期或毫秒时间戳),默认当前时间`}}};function Fh(e,t){let n=e.trim();if(/^\d+$/.test(n))return Number(n);let r=Date.parse(n);if(Number.isNaN(r))throw new C(`${t} must be an ISO date or a millisecond timestamp.`);return r}function Ih(e,t=7){let n=e.endTime?Fh(e.endTime,`--end-time`):Date.now(),r=e.startTime?Fh(e.startTime,`--start-time`):e.hours==null?n-(e.days||t)*864e5:n-e.hours*36e5;if(r>=n)throw new C(`--start-time must be earlier than --end-time.`);return{startTime:r,endTime:n}}const Lh={hours:{type:`number`,valueHint:`<hours>`,description:{"en-US":`Hours to look back (default: 1)`,"zh-CN":`向前查询的小时数(默认:1)`}},startTime:Ph.startTime,endTime:Ph.endTime};function Rh(e){let t=lr(e);return typeof t==`object`&&t&&`result`in t?t.result:t}const zh=[60,3600,86400];function Bh(e,t){let n=(t-e)/36e5;return n<=12?60:n<=168?3600:86400}async function Vh(e){let{originData:t,dataDownloadUrl:r}=e;if(t!=null)return t;if(r){let e=await fetch(r.replace(/^http:\/\//,`https://`));if(!e.ok)throw new n(`Failed to download telemetry data (HTTP ${e.status}).`,f.NETWORK);return await e.json()}}const Hh=`zeldaEasy.bailian-telemetry.activate.getTelemetryServiceStatus`;async function Uh(e,t,n){return await Mh(e,Hh,{...n?{workspaceId:n}:{},serviceType:t})}async function Wh(e,t){let r=await Uh(e,t.serviceType,t.workspaceId);if(!(t.requireInstance===!1?r.openStatus:r.openStatus&&r.instanceStatus===`Ready`))throw new n(`The monitoring service is not activated yet.`,f.AUTH,`Run \`${t.enableCommand}\` to activate it, or enable it in the Bailian console.`)}async function Gh(e,t,n){return Rh(await e.console(`zeldaEasy.bailian-telemetry.activate.getTelemetrySlrStatus`,{reqDTO:{...n?{workspaceId:n}:{},slrType:t}}))===!0}async function Kh(e,t,n,r={}){if(await Gh(e,t,n))return!0;r.onProgress?.(`Authorizing the service-linked role...`),await e.console(`zeldaEasy.bailian-telemetry.activate.createTelemetrySlr`,{reqDTO:{...n?{workspaceId:n}:{},slrType:t}});let i=r.pollRetries??10,a=r.pollIntervalMs??2e3;for(let r=0;r<i;r+=1){if(await Gh(e,t,n))return!0;await new Promise(e=>setTimeout(e,a))}return!1}const qh=`zeldaEasy.bailian-telemetry.telemetryGroup.enableTelemetryGroup`,Jh=`zeldaEasy.bailian-telemetry.telemetryGroup.disableTelemetryGroup`;function Yh(e){for(let t of[`result`,`list`,`data`]){let n=e[t];if(Array.isArray(n))return n}return[]}async function Xh(e,t,n){let r=await e.console(`zeldaEasy.bailian-telemetry.telemetryGroup.getTelemetryGroupStatus`,{reqDTO:{...n?{workspaceId:n}:{},resourceType:`model`,resourceIds:[`all`],telemetryType:t}}),i=lr(r),a=(Array.isArray(i)?i:Yh(i)).filter(e=>!n||String(e.workspaceId)===String(n));return a.length===0?null:a[0].telemetryStatus===`enable`}function Zh(e,t){return{...e.workspaceId?{workspaceId:e.workspaceId,filterWorkspaceId:e.workspaceId}:{},resourceId:`all`,resourceType:`model`,telemetryType:t}}const Qh={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID(s), comma-separated`,"zh-CN":`API Key ID,多个以逗号分隔`}},channel:{type:`string`,valueHint:`<channel>`,description:{"en-US":`Call channel(s), comma-separated`,"zh-CN":`调用渠道,多个以逗号分隔`}},source:{type:`string`,valueHint:`<source>`,description:{"en-US":`Call source(s), comma-separated`,"zh-CN":`调用来源,多个以逗号分隔`}},callSource:{type:`string`,valueHint:`<type>`,choices:[`Online`,`Offline`],description:{"en-US":`Inference type: Online, Offline`,"zh-CN":`推理类型:Online、Offline`}}},$h={model:Qh.model,apiKeyId:Qh.apiKeyId,channel:Qh.channel,source:Qh.source};function eg(e){if(!e)return;let t=W(e);return t.length?t:void 0}function tg(e,t){return{...t?{workspaceId:t}:{},models:eg(e.model),apikeyIds:eg(e.apiKeyId),channels:eg(e.channel),sources:eg(e.source),modelCallSource:e.callSource}}function ng(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function rg(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`${ng(e)} ${n}:${r}:${i}`}function ig(e,t){if(e.workspaceId)return e.workspaceId;throw new n(`workspace-id is required. Set via --workspace-id, BAILIAN_WORKSPACE_ID, or \`${t} config set workspace_id <id>\`.`,f.GENERAL,`Run \`${t} workspace list\` to view available workspaces.`)}function ag(e){return lr(e)}const og={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 sg(e){for(let t of e){let e=og[t];if(e)return e}return`-`}async function cg(e){return(await Ze((t,n)=>e.console(t,n))).filter(e=>typeof e.model==`string`&&e.model).map(e=>({name:e.model,type:sg(e.capabilities||[])}))}const lg=`zeldaEasy.bailian-commerce.freeTrial.queryFreeTierQuota`,ug=`zeldaEasy.bailian-commerce.freeTrial.queryFreeTierOnlyStatus`;function dg(e,t){let n=e.data;if(!n)return[];let r=n.DataV2;return r?r.data?.data?.[t]||[]:n.data?.[t]||[]}function fg(e){return dg(e,`freeTierQuotas`)}function pg(e){return dg(e,`freeTierOnlyStatuses`)}function mg(e){return hg(e)||e.quotaInitTotal==null||e.quotaInitTotal<=0?null:Math.round(e.quotaTotal/e.quotaInitTotal*1e3)/10}function hg(e){return e.quotaValidityPeriod>0&&e.quotaValidityPeriod<Date.now()}function gg(e){let{quotas:t,stopMap:n,typeMap:r}=e,i=O(process.stdout);e.title&&process.stdout.write(i.purple(e.title)+`
2751
- `);let a=[`Model`,`Type`,`Remaining`,`Total`,`Quota Left`,`Auto-Stop`],o=[],s=[],c=a.length-1,l=t.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,i=hg(e),a=t?`${H(e.quotaTotal)}${i?` (expired)`:``}`:`-`,c=t?H(e.quotaInitTotal):`-`,l=mg(e);o.push(l),s.push(i?`expired`:l==null?`-`:null);let u=n.get(e.model),d=u===!0?`ON`:u===!1?`OFF`:e.quotaStatus===`UNKNOWN`?`Unsupported`:`-`;return[e.model,r.get(e.model)||`-`,a,c,``,d]}),u=Jr({headers:a,rows:l,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 u)process.stdout.write(e+`
2748
+ `)}if(i.out){let e=i.out,n=p.length===1?p[0]:p;_i(e,JSON.stringify(n,null,2)+`
2749
+ `),t.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}const Gh={id:{type:`string`,valueHint:`<id>`,description:{"en-US":`Hot-word vocabulary ID (required)`,"zh-CN":`热词表 ID(必填)`},required:!0}},Kh={words:{type:`string`,valueHint:`<json>`,description:{"en-US":`Hot words as JSON object of word→weight, e.g. '{"Fendouzhe":4}'; or the API entry array for per-entry lang. Weight 1-5 (4 recommended); when the vocabulary target_model is a Qwen-Audio-3.0-ASR-Flash series model, 50 is also allowed as super hot word. Or use --words-file`,"zh-CN":`热词,JSON 对象「热词→权重」,例如 '{"奋斗者":4}';需要逐条指定语言时可传 API 的条目数组。权重 1-5(推荐 4);当热词表的 target_model 为 Qwen-Audio-3.0-ASR-Flash 系列时还可使用 50(超级热词)。也可使用 --words-file`}},wordsFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`JSON file with the hot words (use - for stdin)`,"zh-CN":`包含热词的 JSON 文件(使用 - 从 stdin 读取)`}},lang:{type:`string`,valueHint:`<code>`,description:{"en-US":`Language code applied to every hot word when using object form (optional; ignored for array form). Paraformer: zh/en/ja/yue/ko/de/fr/ru; Fun-ASR: zh/en/ja`,"zh-CN":`对象形态时应用到所有热词的语言代码(选填;数组形态忽略)。Paraformer 支持 zh/en/ja/yue/ko/de/fr/ru;Fun-ASR 支持 zh/en/ja`}}};function qh(e){if(!e.words&&!e.wordsFile)return`Provide --words or --words-file.`;if(e.words&&e.wordsFile)return`Use either --words or --words-file, not both.`;if(e.words)try{vn(e.words,e.lang)}catch(e){if(e instanceof C)return e.message;throw e}}function Jh(e){let t=e.wordsFile?On(e.wordsFile):e.words;return vn(t,e.lang)}const Yh=[{"en-US":`Each account may have at most 10 vocabularies; updates must be at least 5 minutes apart. See improve-asr-accuracy for full limits.`,"zh-CN":`每个账号最多 10 个热词表;两次更新间隔至少 5 分钟。完整限制见 improve-asr-accuracy。`},{"en-US":`Hot-word vocabularies are not supported in Singapore sub-workspaces; the server error is passed through as-is.`,"zh-CN":`新加坡子业务空间不支持热词表;服务端错误会原样透传。`},{"en-US":`Weight 1-5 (4 recommended); when the vocabulary target_model is a Qwen-Audio-3.0-ASR-Flash series model, 50 is also allowed as super hot word.`,"zh-CN":`权重 1-5(推荐 4);当热词表的 target_model 为 Qwen-Audio-3.0-ASR-Flash 系列时还可使用 50(超级热词)。`}],Xh={model:{type:`string`,valueHint:`<model>`,description:{"en-US":"ASR model this vocabulary is built for (required). Must exactly match the --model passed to `speech recognize` later, otherwise the vocabulary is silently ignored","zh-CN":"该热词表服务的 ASR 模型(必填)。必须与后续 `speech recognize` 的 --model 完全一致,否则热词表静默失效"},required:!0},prefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Custom vocabulary prefix (required). Digits and lowercase letters only, max 10 chars`,"zh-CN":`热词表自定义前缀(必填)。仅允许数字和小写字母,最长 10 个字符`},required:!0},...Kh};var Zh=w({description:{"en-US":`Create a precompiled hot-word vocabulary for ASR`,"zh-CN":`创建用于语音识别的预编译热词表`},auth:`apiKey`,usageArgs:`--model <model> --prefix <prefix> (--words <json> | --words-file <path>) [flags]`,flags:Xh,notes:[{"en-US":"The --model must exactly match the --model used later with `speech recognize --vocabulary-id`; a mismatch causes silent failure with no error.","zh-CN":"--model 必须与后续 `speech recognize --vocabulary-id` 使用的 --model 完全一致;不一致时热词表会静默失效且无报错。"},...Yh],exampleArgs:[{"en-US":`--model fun-asr --prefix demo --words '{"Fendouzhe":4,"Jingluo":4}'`,"zh-CN":`--model fun-asr --prefix demo --words '{"奋斗者":4,"鲸落":4}'`},{"en-US":`--model paraformer-v2 --prefix demo --words '[{"text":"Fendouzhe","weight":4,"lang":"zh"}]'`,"zh-CN":`--model paraformer-v2 --prefix demo --words '[{"text":"奋斗者","weight":4,"lang":"zh"}]'`},{"en-US":`--model fun-asr --prefix demo --words '{"Fendouzhe":4}' --lang zh`,"zh-CN":`--model fun-asr --prefix demo --words '{"奋斗者":4}' --lang zh`},`--model fun-asr --prefix demo --words-file ./hotwords.json`,{"en-US":`--model fun-asr --prefix demo --words '{"Fendouzhe":4}' --quiet`,"zh-CN":`--model fun-asr --prefix demo --words '{"奋斗者":4}' --quiet`}],validate:e=>qh(e),async run(e){let{settings:t,flags:n}=e,r=Jh(n),i=T(t.output),a=_e(`create_vocabulary`,{target_model:n.model,prefix:n.prefix,vocabulary:r});if(t.dryRun){A({endpoint:e.client.url(nr()),request:a},i);return}let o=await Ae(e.client,{targetModel:n.model,prefix:n.prefix,vocabulary:r});t.quiet||i===`text`?k(o.output?.vocabulary_id??``):A(o,i)}}),Qh=w({description:{"en-US":`List precompiled hot-word vocabularies`,"zh-CN":`列出预编译热词表`},auth:`apiKey`,usageArgs:`[--prefix <prefix>] [--page <n>] [--page-size <n>]`,flags:{prefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filter by vocabulary prefix`,"zh-CN":`按热词表前缀过滤`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number, 1-based (default: 1). Mapped to API page_index (0-based) as page - 1`,"zh-CN":`页码,从 1 开始(默认:1)。映射为 API 的 page_index(从 0 开始):page - 1`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10)`,"zh-CN":`每页结果数(默认:10)`}}},notes:[{"en-US":"List responses do not include target_model; use `speech vocabulary get` to inspect the model a vocabulary was built for.","zh-CN":"list 响应不含 target_model;要对齐模型请使用 `speech vocabulary get`。"},{"en-US":`Vocabularies with status UNDEPLOYED are silently ignored by ASR.`,"zh-CN":`status 为 UNDEPLOYED 的热词表会被 ASR 静默忽略。`}],exampleArgs:[``,`--prefix demo`,`--page 2 --page-size 20`],validate:e=>{if(e.page!==void 0&&e.page<1)return`--page must be >= 1.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.page===void 0?void 0:n.page-1,a={};if(n.prefix!==void 0&&(a.prefix=n.prefix),i!==void 0&&(a.page_index=i),n.pageSize!==void 0&&(a.page_size=n.pageSize),t.dryRun){A({endpoint:e.client.url(nr()),request:_e(`list_vocabulary`,a)},r);return}let o=await Yt(e.client,{prefix:n.prefix,pageIndex:i,pageSize:n.pageSize});if(t.quiet||r===`text`){let e=o.output?.vocabulary_list??[];if(e.length===0)k(`No vocabularies found.`);else{let t=!1;for(let n of e){let e=n.vocabulary_id??``,r=n.status??``,i=n.gmt_modified??``;r===`UNDEPLOYED`&&(t=!0),k(`[${e}] ${r} ${i}`.trimEnd())}t&&k("Note: UNDEPLOYED vocabularies are silently ignored by ASR. Use `speech vocabulary get` to inspect them.")}}else A(o,r)}});const $h={...Gh};var eg=w({description:{"en-US":`Get details of a precompiled hot-word vocabulary`,"zh-CN":`查看预编译热词表详情`},auth:`apiKey`,usageArgs:`--id <id>`,flags:$h,notes:[{"en-US":"Use this command to confirm target_model before calling `speech recognize --vocabulary-id`; a model mismatch causes silent failure.","zh-CN":"调用 `speech recognize --vocabulary-id` 前请用本命令确认 target_model;模型不一致会导致静默失效。"}],exampleArgs:[`--id vocab-demo-xxx`,`--id vocab-demo-xxx --quiet`],async run(e){let{settings:t,flags:n}=e,r=n.id,i=T(t.output);if(t.dryRun){A({endpoint:e.client.url(nr()),request:_e(`query_vocabulary`,{vocabulary_id:r})},i);return}let a=await wn(e.client,r),o=a.output;if(t.quiet){k(o?.target_model??``);return}if(i===`text`){k(`vocabulary_id: ${r}`),k(`status: ${o?.status??``}`),k(`target_model: ${o?.target_model??``}`),k(`gmt_create: ${o?.gmt_create??``}`),k(`gmt_modified: ${o?.gmt_modified??``}`);let e=o?.vocabulary??[];if(e.length>0){k(`vocabulary:`);for(let t of e){let e=t.lang?` lang=${t.lang}`:``;k(` ${t.text} weight=${t.weight}${e}`)}}}else A(a,i)}});const tg={...Gh,...Kh};var ng=w({description:{"en-US":`Replace the contents of a precompiled hot-word vocabulary`,"zh-CN":`完全替换预编译热词表的内容`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This fully replaces all hot words in the vocabulary. Entries not listed will be discarded and cannot be undone.`,"zh-CN":`该操作会完全替换热词表中的全部词条。未列出的词将被丢弃,且无法撤销。`}},usageArgs:`--id <id> (--words <json> | --words-file <path>) [flags]`,flags:tg,notes:[{"en-US":`update is a full replace, not an append. Prefer --dry-run first to preview the complete vocabulary that will be written.`,"zh-CN":`update 是完全替换,不是增量追加。建议先用 --dry-run 预览将要写入的完整词表。`},...Yh],exampleArgs:[{"en-US":`--id vocab-demo-xxx --words '{"Fendouzhe":4}' --dry-run`,"zh-CN":`--id vocab-demo-xxx --words '{"奋斗者":4}' --dry-run`},{"en-US":`--id vocab-demo-xxx --words '{"Fendouzhe":4,"Jingluo":4}' --yes`,"zh-CN":`--id vocab-demo-xxx --words '{"奋斗者":4,"鲸落":4}' --yes`}],validate:e=>qh(e),async run(e){let{settings:t,flags:n}=e,r=n.id,i=Jh(n),a=T(t.output),o=_e(`update_vocabulary`,{vocabulary_id:r,vocabulary:i});if(t.dryRun){A({endpoint:e.client.url(nr()),request:o},a);return}let s=await hr(e.client,r,i);t.quiet||a===`text`?k(r):A(s,a)}});const rg={...Gh};var ig=w({description:{"en-US":`Delete a precompiled hot-word vocabulary`,"zh-CN":`删除预编译热词表`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified hot-word vocabulary and cannot be undone.`,"zh-CN":`该操作会永久删除指定的热词表,且无法撤销。`}},usageArgs:`--id <id>`,flags:rg,exampleArgs:[`--id vocab-demo-xxx --dry-run`,`--id vocab-demo-xxx --yes`],async run(e){let{settings:t,flags:n}=e,r=n.id,i=T(t.output);if(t.dryRun){A({endpoint:e.client.url(nr()),request:_e(`delete_vocabulary`,{vocabulary_id:r})},i);return}let a=await ze(e.client,r);t.quiet||i===`text`?k(r):A(a,i)}}),ag=w({description:{"en-US":`Upload a local file to DashScope temporary storage (48h)`,"zh-CN":`将本地文件上传到 DashScope 临时存储(保留 48 小时)`},auth:`apiKey`,usageArgs:`--file <path> --model <model>`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Local file to upload (image, video, audio)`,"zh-CN":`要上传的本地文件(图片、视频或音频)`},required:!0},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Target model name (file is bound to this model)`,"zh-CN":`目标模型名称(文件将与该模型绑定)`},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)}}),og=w({description:{"en-US":`Call a Bailian console API via the CLI gateway`,"zh-CN":`通过 CLI Gateway 调用百炼控制台 API`},auth:`console`,usageArgs:`--api <api> --data <json> [flags]`,flags:{api:{type:`string`,valueHint:`<api>`,description:{"en-US":`API name (e.g. zeldaEasy.broadscope-bailian.memory-library.getLibraries)`,"zh-CN":`API 名称(例如 zeldaEasy.broadscope-bailian.memory-library.getLibraries)`},required:!0},data:{type:`string`,valueHint:`<json>`,description:{"en-US":`Request data as JSON string`,"zh-CN":`JSON 字符串格式的请求数据`},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 C(`--data must be valid JSON`)}let o=T(t.output);if(t.dryRun){A({api:r,data:a,...E(t)},o);return}let s=await e.client.console(r,a);A(s,o)}});function sg(e){let t=e.client.baseUrl.replace(/\/+$/,``);return t&&!At(t)?t:ie(B(e))}const cg={agent_identity:{"en-US":`Agent identity issuance`,"zh-CN":`Agent 身份签发`},content_safety:{"en-US":`Content safety`,"zh-CN":`内容安全`},supply_chain_scan:{"en-US":`Supply-chain static scan`,"zh-CN":`供应链静态扫描`},credential_isolation:{"en-US":`Credential isolation`,"zh-CN":`凭证隔离`},session_lifecycle:{"en-US":`Session lifecycle governance`,"zh-CN":`session 生命周期治理`}},lg={flow_agent:{"en-US":`Flow Agent`,"zh-CN":`Flow Agent`},managed_agent:{"en-US":`Managed Agents`,"zh-CN":`Managed Agents`},knowledge_base:{"en-US":`RAG`,"zh-CN":`RAG`},memory:{"en-US":`Memory`,"zh-CN":`Memory`},mcp:{"en-US":`Store`,"zh-CN":`Store`},external_agent:{"en-US":`BYOA hosting`,"zh-CN":`BYOA 托管`}},ug=[{label:{"en-US":`Content safety`,"zh-CN":`内容安全`},keys:[`content_safety`,`contentSafety`]},{label:{"en-US":`File scan`,"zh-CN":`文件扫描`},keys:[`file_scan`,`fileScan`]},{label:{"en-US":`Skill scan`,"zh-CN":`技能扫描`},keys:[`skill_scan`,`skillScan`]}],H={unavailable:{"en-US":`(unavailable)`,"zh-CN":`(不可用)`},on:{"en-US":`on`,"zh-CN":`开启`},off:{"en-US":`off`,"zh-CN":`关闭`},scannedLabel:{"en-US":`Scanned`,"zh-CN":`扫描`},risksLabel:{"en-US":`Risks`,"zh-CN":`风险`},capabilities:{"en-US":`Capabilities`,"zh-CN":`能力项`},protection:{"en-US":`Protection`,"zh-CN":`防护项`},detections:{"en-US":`Detections`,"zh-CN":`检测项`},overviewUnavailable:{"en-US":`Overview unavailable.`,"zh-CN":`总览不可用。`},hit:{"en-US":`hit`,"zh-CN":`命中`},scanned:{"en-US":`scanned`,"zh-CN":`扫描`},total:{"en-US":`Total`,"zh-CN":`总计`},high:{"en-US":`high`,"zh-CN":`高`},medium:{"en-US":`medium`,"zh-CN":`中`},low:{"en-US":`low`,"zh-CN":`低`},noAlerts:{"en-US":`No alerts found.`,"zh-CN":`未找到告警。`},nextPageCursor:{"en-US":`Next page cursor`,"zh-CN":`下一页游标`},app:{"en-US":`app`,"zh-CN":`应用`},asset:{"en-US":`asset`,"zh-CN":`资产`},status:{"en-US":`status`,"zh-CN":`状态`},source:{"en-US":`source`,"zh-CN":`来源`},checked:{"en-US":`checked`,"zh-CN":`检测时间`}};function dg(e,t,n){if(n!=null&&n!==``){if(Array.isArray(n)){for(let r of n)e.append(t,r);return}e.set(t,String(n))}}function fg(e,t,n,r){if(k(`\n${e(t)}`),!n||n.length===0){k(` ${e(H.unavailable)}`);return}for(let t of n){let n=typeof t.count==`number`?` (${t.count})`:``,i=e(t.enabled?H.on:H.off),a=r[t.key]?e(r[t.key]):t.key;k(` ${i} ${a}${n}`)}}function pg(e){if(!e)return`-`;let t=/^\d+$/.test(e)?Number(e):Date.parse(e);return Number.isNaN(t)?e:new Date(t).toISOString().replace(`T`,` `).slice(0,19)}function mg(e,t){let n=(t.risk_level??`unknown`).toUpperCase();k(`[${n}] ${t.risk_name??`-`} (${t.alert_id})`),k(` ${e(H.app)}: ${t.app_name??`-`} ${e(H.asset)}: ${t.asset_name??`-`} (${t.asset_type??`-`})`),k(` ${e(H.status)}: ${t.status??`-`} ${e(H.source)}: ${t.source??`-`} ${e(H.checked)}: ${pg(t.check_time)}`),t.risk_desc&&k(` ${t.risk_desc}`),k(``)}const hg={...z};var gg=w({description:{"en-US":`Show the Agent security protection overview (last 24 hours)`,"zh-CN":`查看 Agent 安全防护总览(最近 24 小时)`},auth:`apiKey`,usageArgs:`[flags]`,flags:hg,notes:[{"en-US":`Auth: uses DashScope API Key (Bearer token).`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or config workspace_id.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或配置项 workspace_id 设置。"},{"en-US":`Fixed to the last 24 hours; the AgentStudio region is always cn-beijing and is not configurable.`,"zh-CN":`固定统计最近 24 小时;AgentStudio 地域固定为 cn-beijing,不可配置。`},{"en-US":"AgentStudio host: derived from --workspace-id by default; point --base-url / DASHSCOPE_BASE_URL (or `auth login --base-url`) at a workspace or pre-release origin such as https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio to override it, and --workspace-id is then not required.","zh-CN":"AgentStudio 域名:默认由 --workspace-id 推导;将 --base-url / DASHSCOPE_BASE_URL(或 `auth login --base-url`)指向某个 workspace 或预发源(例如 https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio)即可覆盖,此时无需 --workspace-id。"}],exampleArgs:[{"en-US":`--workspace-id ws-xxx`,"zh-CN":`--workspace-id ws-xxx`},{"en-US":`--workspace-id ws-xxx --output json`,"zh-CN":`--workspace-id ws-xxx --output json`}],async run(e){let{settings:t,localize:n}=e,r=T(t.output),i=$n(sg(e));if(t.dryRun){A({endpoint:i,method:`GET`},r);return}let a=await Qn(e.client,i);if(!a){r===`json`?A({},r):k(n(H.overviewUnavailable));return}if(r===`json`){A(a,r);return}let o=ug.map(({label:e,keys:t})=>{let r=t.map(e=>a[e]).find(e=>e!==void 0);return{label:n(e),stat:r??null}}),s=e=>o.reduce((t,n)=>t+(n.stat?e(n.stat)??0:0),0);k(`${n(H.scannedLabel)}: ${s(e=>e.scanned)} ${n(H.risksLabel)}: ${s(e=>e.hit)}`),fg(n,H.capabilities,a.capabilities,cg),fg(n,H.protection,a.protection,lg),k(`\n${n(H.detections)}`);for(let{label:e,stat:t}of o)k(t?` ${e} ${n(H.hit)} ${t.hit??`-`} / ${n(H.scanned)} ${t.scanned??`-`}`:` ${e} ${n(H.unavailable)}`)}});const _g=[`agent`,`tool`,`skill`,`knowledge_base`,`memory`,`channel`],vg={...z,page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 20)`,"zh-CN":`每页结果数(默认:20)`}},riskLevel:{type:`string`,valueHint:`<level>`,choices:[`high`,`medium`,`low`],description:{"en-US":`Filter by risk level: high, medium, low`,"zh-CN":`按风险等级筛选:high、medium、low`}},riskName:{type:`string`,valueHint:`<text>`,description:{"en-US":`Filter by risk name`,"zh-CN":`按风险名称筛选`}},status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter by handling status`,"zh-CN":`按处理状态筛选`}},statusList:{type:`array`,valueHint:`<status>`,description:{"en-US":`Filter by multiple statuses (repeatable)`,"zh-CN":`按多个状态筛选(可重复传入)`}},appName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by application name`,"zh-CN":`按应用名称筛选`}},assetType:{type:`string`,valueHint:`<type>`,choices:_g,description:{"en-US":`Filter by asset type: ${_g.join(`, `)}`,"zh-CN":`按资产类型筛选:${_g.join(`、`)}`}},vendor:{type:`string`,valueHint:`<vendor>`,description:{"en-US":`Filter by vendor`,"zh-CN":`按厂商筛选`}},orderBy:{type:`string`,valueHint:`<field>`,description:{"en-US":`Sort field (default: check_time)`,"zh-CN":`排序字段(默认:check_time)`}},order:{type:`string`,valueHint:`<dir>`,choices:[`asc`,`desc`],description:{"en-US":`Sort direction: asc, desc (default: desc)`,"zh-CN":`排序方向:asc、desc(默认:desc)`}},lang:{type:`string`,valueHint:`<lang>`,choices:[`zh`,`en`],description:{"en-US":`Response language: zh, en`,"zh-CN":`响应语言:zh、en`}}};var yg=w({description:{"en-US":`List Agent security alerts`,"zh-CN":`列出 Agent 安全告警`},auth:`apiKey`,usageArgs:`[flags]`,flags:vg,notes:[{"en-US":`Auth: uses DashScope API Key (Bearer token).`,"zh-CN":`鉴权:使用 DashScope API Key(Bearer Token)。`},{"en-US":"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or config workspace_id.","zh-CN":"`--workspace-id` 可通过 BAILIAN_WORKSPACE_ID 环境变量或配置项 workspace_id 设置。"},{"en-US":`Filters, pagination and sorting go in the query string; enum flags are validated before any request is sent.`,"zh-CN":`筛选、分页与排序参数走 query string;枚举类 flag 在发起请求前校验。`},{"en-US":"AgentStudio host: derived from --workspace-id by default; point --base-url / DASHSCOPE_BASE_URL (or `auth login --base-url`) at a workspace or pre-release origin such as https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio to override it, and --workspace-id is then not required.","zh-CN":"AgentStudio 域名:默认由 --workspace-id 推导;将 --base-url / DASHSCOPE_BASE_URL(或 `auth login --base-url`)指向某个 workspace 或预发源(例如 https://<workspace-id>.cn-beijing.maas.aliyuncs.com/api/v1/agentstudio)即可覆盖,此时无需 --workspace-id。"}],exampleArgs:[{"en-US":`--workspace-id ws-xxx`,"zh-CN":`--workspace-id ws-xxx`},{"en-US":`--risk-level high --page-size 50`,"zh-CN":`--risk-level high --page-size 50`},{"en-US":`--asset-type agent --app-name "demo app" --output json`,"zh-CN":`--asset-type agent --app-name "测试应用0" --output json`},{"en-US":`--status-list unhandled --status-list handling`,"zh-CN":`--status-list unhandled --status-list handling`}],async run(e){let{settings:t,flags:n,localize:r}=e,i=T(t.output),a=sg(e),o=new URLSearchParams;dg(o,`current_page`,n.page),dg(o,`page_size`,n.pageSize),dg(o,`risk_level`,n.riskLevel),dg(o,`risk_name`,n.riskName),dg(o,`status`,n.status),dg(o,`status_list`,n.statusList),dg(o,`app_name`,n.appName),dg(o,`asset_type`,n.assetType),dg(o,`vendor`,n.vendor),dg(o,`order_by`,n.orderBy),dg(o,`order`,n.order),dg(o,`lang`,n.lang);let s=o.toString(),c=Zn(a),l=s?`${c}?${s}`:c;if(t.dryRun){A({endpoint:l,method:`GET`},i);return}let u=await Qn(e.client,l),d=u?.data??[];if(t.quiet){for(let e of d)k(e.alert_id);return}if(i===`json`){A(u??{stats:null,data:[],next_page:null},i);return}let f=u?.stats;if(f&&k(`${r(H.total)}: ${f.total??`-`} ${r(H.high)}: ${f.high??`-`} ${r(H.medium)}: ${f.medium??`-`} ${r(H.low)}: ${f.low??`-`}\n`),d.length===0){k(r(H.noAlerts));return}for(let e of d)mg(r,e);u?.next_page&&k(`${r(H.nextPageCursor)}: ${u.next_page}`)}});function U(e){return e.toLocaleString(`en-US`)}function bg(e){let t=new Date(e),n=String(t.getMonth()+1).padStart(2,`0`),r=String(t.getDate()).padStart(2,`0`);return`${t.getFullYear()}-${n}-${r}`}function W(e){let t=e=>String(e).padStart(2,`0`),n=new Date(e);return`${bg(e)} ${t(n.getHours())}:${t(n.getMinutes())}:${t(n.getSeconds())}`}async function xg(e,t,n,r=30){let i;for(let a=0;a<r;a++){let r=await e.console(t,n(i)),a=fr(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 Sg(e,t,n){return xg(e,t,e=>e?{reqDTO:{...n,asyncTaskId:e}}:{reqDTO:n})}async function Cg(e,t,r){let i=await Sg(e,t,r);if(!i)throw new n(`Request timed out.`,f.TIMEOUT);return fr(i)}const wg=[`cn-beijing`,`ap-southeast-1`];function Tg(e){let t=E(e).consoleRegion;if(!wg.includes(t))throw new C(`Model monitor/log/alert commands are not available in console region "${t}". Supported regions: ${wg.join(`, `)} (set --console-region).`)}const Eg={days:{type:`number`,valueHint:`<days>`,description:{"en-US":`Number of days to look back (default: 7)`,"zh-CN":`向前查询的天数(默认:7)`}},startTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range start (ISO date or ms epoch); overrides --days`,"zh-CN":`开始时间(ISO 日期或毫秒时间戳),设置后覆盖 --days`}},endTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Range end (ISO date or ms epoch); default: now`,"zh-CN":`结束时间(ISO 日期或毫秒时间戳),默认当前时间`}}};function Dg(e,t){let n=e.trim();if(/^\d+$/.test(n))return Number(n);let r=Date.parse(n);if(Number.isNaN(r))throw new C(`${t} must be an ISO date or a millisecond timestamp.`);return r}function Og(e,t=7){let n=e.endTime?Dg(e.endTime,`--end-time`):Date.now(),r=e.startTime?Dg(e.startTime,`--start-time`):e.hours==null?n-(e.days||t)*864e5:n-e.hours*36e5;if(r>=n)throw new C(`--start-time must be earlier than --end-time.`);return{startTime:r,endTime:n}}const kg={hours:{type:`number`,valueHint:`<hours>`,description:{"en-US":`Hours to look back (default: 1)`,"zh-CN":`向前查询的小时数(默认:1)`}},startTime:Eg.startTime,endTime:Eg.endTime};function Ag(e){let t=fr(e);return typeof t==`object`&&t&&`result`in t?t.result:t}const jg=[60,3600,86400];function Mg(e,t){let n=(t-e)/36e5;return n<=12?60:n<=168?3600:86400}async function Ng(e){let{originData:t,dataDownloadUrl:r}=e;if(t!=null)return t;if(r){let e=await fetch(r.replace(/^http:\/\//,`https://`));if(!e.ok)throw new n(`Failed to download telemetry data (HTTP ${e.status}).`,f.NETWORK);return await e.json()}}const Pg=`zeldaEasy.bailian-telemetry.activate.getTelemetryServiceStatus`;async function Fg(e,t,n){return await Cg(e,Pg,{...n?{workspaceId:n}:{},serviceType:t})}async function Ig(e,t){let r=await Fg(e,t.serviceType,t.workspaceId);if(!(t.requireInstance===!1?r.openStatus:r.openStatus&&r.instanceStatus===`Ready`))throw new n(`The monitoring service is not activated yet.`,f.AUTH,`Run \`${t.enableCommand}\` to activate it, or enable it in the Bailian console.`)}async function Lg(e,t,n){return Ag(await e.console(`zeldaEasy.bailian-telemetry.activate.getTelemetrySlrStatus`,{reqDTO:{...n?{workspaceId:n}:{},slrType:t}}))===!0}async function Rg(e,t,n,r={}){if(await Lg(e,t,n))return!0;r.onProgress?.(`Authorizing the service-linked role...`),await e.console(`zeldaEasy.bailian-telemetry.activate.createTelemetrySlr`,{reqDTO:{...n?{workspaceId:n}:{},slrType:t}});let i=r.pollRetries??10,a=r.pollIntervalMs??2e3;for(let r=0;r<i;r+=1){if(await Lg(e,t,n))return!0;await new Promise(e=>setTimeout(e,a))}return!1}const zg=`zeldaEasy.bailian-telemetry.telemetryGroup.enableTelemetryGroup`,Bg=`zeldaEasy.bailian-telemetry.telemetryGroup.disableTelemetryGroup`;function Vg(e){for(let t of[`result`,`list`,`data`]){let n=e[t];if(Array.isArray(n))return n}return[]}async function Hg(e,t,n){let r=await e.console(`zeldaEasy.bailian-telemetry.telemetryGroup.getTelemetryGroupStatus`,{reqDTO:{...n?{workspaceId:n}:{},resourceType:`model`,resourceIds:[`all`],telemetryType:t}}),i=fr(r),a=(Array.isArray(i)?i:Vg(i)).filter(e=>!n||String(e.workspaceId)===String(n));return a.length===0?null:a[0].telemetryStatus===`enable`}function Ug(e,t){return{...e.workspaceId?{workspaceId:e.workspaceId,filterWorkspaceId:e.workspaceId}:{},resourceId:`all`,resourceType:`model`,telemetryType:t}}const Wg={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID(s), comma-separated`,"zh-CN":`API Key ID,多个以逗号分隔`}},channel:{type:`string`,valueHint:`<channel>`,description:{"en-US":`Call channel(s), comma-separated`,"zh-CN":`调用渠道,多个以逗号分隔`}},source:{type:`string`,valueHint:`<source>`,description:{"en-US":`Call source(s), comma-separated`,"zh-CN":`调用来源,多个以逗号分隔`}},callSource:{type:`string`,valueHint:`<type>`,choices:[`Online`,`Offline`],description:{"en-US":`Inference type: Online, Offline`,"zh-CN":`推理类型:Online、Offline`}}},Gg={model:Wg.model,apiKeyId:Wg.apiKeyId,channel:Wg.channel,source:Wg.source};function Kg(e){if(!e)return;let t=V(e);return t.length?t:void 0}function qg(e,t){return{...t?{workspaceId:t}:{},models:Kg(e.model),apikeyIds:Kg(e.apiKeyId),channels:Kg(e.channel),sources:Kg(e.source),modelCallSource:e.callSource}}function Jg(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function Yg(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`${Jg(e)} ${n}:${r}:${i}`}function Xg(e,t){if(e.workspaceId)return e.workspaceId;throw new n(`workspace-id is required. Set via --workspace-id, BAILIAN_WORKSPACE_ID, or \`${t} config set workspace_id <id>\`.`,f.GENERAL,`Run \`${t} workspace list\` to view available workspaces.`)}function Zg(e){return fr(e)}const Qg={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 $g(e){for(let t of e){let e=Qg[t];if(e)return e}return`-`}async function e_(e){return(await Ze((t,n)=>e.console(t,n))).filter(e=>typeof e.model==`string`&&e.model).map(e=>({name:e.model,type:$g(e.capabilities||[])}))}const t_=`zeldaEasy.bailian-commerce.freeTrial.queryFreeTierQuota`,n_=`zeldaEasy.bailian-commerce.freeTrial.queryFreeTierOnlyStatus`;function r_(e,t){let n=e.data;if(!n)return[];let r=n.DataV2;return r?r.data?.data?.[t]||[]:n.data?.[t]||[]}function i_(e){return r_(e,`freeTierQuotas`)}function a_(e){return r_(e,`freeTierOnlyStatuses`)}function o_(e){return s_(e)||e.quotaInitTotal==null||e.quotaInitTotal<=0?null:Math.round(e.quotaTotal/e.quotaInitTotal*1e3)/10}function s_(e){return e.quotaValidityPeriod>0&&e.quotaValidityPeriod<Date.now()}function c_(e){let{quotas:t,stopMap:n,typeMap:r}=e,i=O(process.stdout);e.title&&process.stdout.write(i.purple(e.title)+`
2750
+ `);let a=[`Model`,`Type`,`Remaining`,`Total`,`Quota Left`,`Auto-Stop`],o=[],s=[],c=a.length-1,l=t.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,i=s_(e),a=t?`${U(e.quotaTotal)}${i?` (expired)`:``}`:`-`,c=t?U(e.quotaInitTotal):`-`,l=o_(e);o.push(l),s.push(i?`expired`:l==null?`-`:null);let u=n.get(e.model),d=u===!0?`ON`:u===!1?`OFF`:e.quotaStatus===`UNKNOWN`?`Unsupported`:`-`;return[e.model,r.get(e.model)||`-`,a,c,``,d]}),u=Zr({headers:a,rows:l,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 u)process.stdout.write(e+`
2752
2751
  `);e.moreHint&&process.stdout.write(i.dim(e.moreHint)+`
2753
- `)}const _g=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`,vg=`zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData`;async function yg(e,t,n,r){return Ah(e,t,e=>({[n]:e?{taskId:e}:{models:r}}),20)}function bg(e){let t=ag(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}function xg(e){let t=ag(e);return{list:t.list??[],totalCount:t.totalCount??0,maxResults:t.maxResults??0}}function Sg(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 Cg={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 wg(e){let t=Cg[e];if(!t)return e;let n=t.unit?` [${t.unit}]`:``;return`${t.en}${n}`}function Tg(e,t,n,r,i=`Usage Overview`){let a=O(process.stdout);process.stdout.write(`${a.purple(i)} ${a.dim(`·`)} ${ng(t)} ~ ${ng(n)} ${a.dim(`(${r} days)`)}\n`);let o=[[`Models Called`,H(e.modelCount??0)],[`Successful Calls`,H(e.callSuccessCount??0)]];for(let t of e.usages??[])o.push([wg(t.key),H(t.value)]);let s=Math.max(...o.map(([e])=>jr(e)));for(let[e,t]of o)process.stdout.write(`${a.bold(j(e,s+2))}${t}\n`)}var Eg=w({description:{"en-US":`Query free-tier quota for models (all models if --model is omitted)`,"zh-CN":`查询模型免费额度(省略 --model 时查询全部模型)`},auth:`console`,usageArgs:`[--model <model>[,model2,...]] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s) to query, comma-separated for multiple; omit for all models`,"zh-CN":`要查询的模型名称;多个名称以逗号分隔,省略时查询全部模型`}},expiring:{type:`string`,valueHint:`<days>`,description:{"en-US":`Only show quotas expiring within N days`,"zh-CN":`仅显示将在 N 天内到期的额度`}},sort:{type:`string`,valueHint:`<field>`,description:{"en-US":`Sort by: remaining (ascending), expires (ascending)`,"zh-CN":`排序方式:remaining(剩余额度升序)、expires(到期时间升序)`},choices:[`remaining`,`expires`]},all:{type:`switch`,description:{"en-US":`Show all models instead of the top rows`,"zh-CN":`显示全部模型,而不只显示前几行`}}},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=/* @__PURE__ */ new Map;l=i?[...new Set(i.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let d={queryFreeTierQuotaRequest:{models:l}};if(n.dryRun){A({api:lg,data:d},c);return}if(i){let t=await Promise.all(l.map(t=>nt((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],sg(n.capabilities||[]))}}else{let t=await cg(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=fg(await e.client.console(lg,d)),p=i?f:f.filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0);if(a>0){let e=Date.now()+a*24*60*60*1e3;p=p.filter(t=>t.quotaValidityPeriod>0&&t.quotaValidityPeriod<=e)}let m=o??(i?void 0:`remaining`);m===`remaining`?p.sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)):m===`expires`&&p.sort((e,t)=>(e.quotaValidityPeriod??0)-(t.quotaValidityPeriod??0));let h=p.map(e=>e.model),g=h.length?await e.client.console(ug,{queryFreeTierOnlyStatusRequest:{models:h}}):null,_=g?pg(g):[],v=new Map(_.map(e=>[e.model,e.freeTierOnly]));if(c===`json`){let e=p.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,n=t?e.quotaInitTotal-e.quotaTotal:0,r=v.get(e.model),i=r===!0?!0:r===!1?!1:e.quotaStatus===`UNKNOWN`?`unsupported`: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:mg(e),expires:e.quotaValidityPeriod?ng(e.quotaValidityPeriod):null,autoStop:i}});A(e,c);return}if(p.length===0){process.stdout.write(`No free-tier quota found.
2754
- `);return}let y=!i&&!s?p.slice(0,15):p,b=p.length-y.length,x=m===`remaining`?` · sorted by urgency`:``;gg({quotas:y,stopMap:v,typeMap:u,title:`Free Tier Quota · ${p.length} models${x}`,moreHint:b>0?`+ ${b} more · ${t.binName} usage free --all to browse all`:void 0})}}),Dg=w({description:{"en-US":`Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable`,"zh-CN":`启用或停用免费额度模型自动停止。默认启用,使用 --off 停用`},auth:`console`,usageArgs:`<--model <model>[,model2,...] | --all> [--off] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated for multiple`,"zh-CN":`模型名称,多个名称以逗号分隔`}},all:{type:`switch`,description:{"en-US":`Apply to all free-tier models`,"zh-CN":`应用于全部免费额度模型`}},on:{type:`switch`,description:{"en-US":`Enable auto-stop (default behavior)`,"zh-CN":`启用自动停止(默认行为)`}},off:{type:`switch`,description:{"en-US":`Disable auto-stop`,"zh-CN":`停用自动停止`}}},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 cg(e.client)).map(e=>e.name)),i){let t=pg(await e.client.console(ug,{queryFreeTierOnlyStatusRequest:{models:o}})),n=new Map(t.map(e=>[e.model,e.freeTierOnly]));for(let t of o){if(n.get(t)===!1){process.stderr.write(`Auto-stop is already disabled for "${t}".\n`);continue}await yg(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 yg(e.client,s,c,[t]);if(a===`json`){l.push(n);continue}if(n){let e=lr(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 Og(e){let t=e.unit?` [${e.unit}]`:``;return`${e.en}${t}`}function kg(e,t,n,r){let i=O(process.stdout);process.stdout.write(`${i.dim(`Time Range Period:`)} ${ng(t)} ~ ${ng(n)} ${i.dim(`(${r} days)`)}\n\n`);let a=[[`Models Called`,H(e.modelCount??0)],[`Successful Calls`,H(e.callSuccessCount??0)]];for(let t of e.usages??[]){let e=Cg[t.key],n=e?Og(e):t.key;a.push([n,H(t.value)])}let o=Math.max(...a.map(([e])=>jr(e)));for(let[e,t]of a)process.stdout.write(`${i.bold(j(e,o+2))}${t}\n`)}function Ag(e,t,n,r){let i=O(process.stdout);if(process.stdout.write(`${i.dim(`Time Range Period:`)} ${ng(t)} ~ ${ng(n)} ${i.dim(`(${r} days)`)}\n\n`),e.length===0){process.stdout.write(`No usage data found.
2755
- `);return}let a=/* @__PURE__ */ new Set,o=e.map(e=>{let t=Sg(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=>Cg[e]?.en??e)],l=e.map((e,t)=>[e.model,H(e.callSuccessCount??0),...s.map(e=>{let n=o[t][e];return n==null?`-`:H(n)})]),u=c.map((e,t)=>Math.max(jr(e),...l.map(e=>jr(e[t])))),d=c.map((e,t)=>i.bold(j(e,u[t]))).join(` `),f=u.map(e=>i.dim(`─`.repeat(e))).join(`──`);process.stdout.write(d+`
2752
+ `)}const l_=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`,u_=`zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData`;async function d_(e,t,n,r){return xg(e,t,e=>({[n]:e?{taskId:e}:{models:r}}),20)}function f_(e){let t=Zg(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}function p_(e){let t=Zg(e);return{list:t.list??[],totalCount:t.totalCount??0,maxResults:t.maxResults??0}}function m_(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 h_={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 g_(e){let t=h_[e];if(!t)return e;let n=t.unit?` [${t.unit}]`:``;return`${t.en}${n}`}function __(e,t,n,r,i=`Usage Overview`){let a=O(process.stdout);process.stdout.write(`${a.purple(i)} ${a.dim(`·`)} ${Jg(t)} ~ ${Jg(n)} ${a.dim(`(${r} days)`)}\n`);let o=[[`Models Called`,U(e.modelCount??0)],[`Successful Calls`,U(e.callSuccessCount??0)]];for(let t of e.usages??[])o.push([g_(t.key),U(t.value)]);let s=Math.max(...o.map(([e])=>Pr(e)));for(let[e,t]of o)process.stdout.write(`${a.bold(j(e,s+2))}${t}\n`)}var v_=w({description:{"en-US":`Query free-tier quota for models (all models if --model is omitted)`,"zh-CN":`查询模型免费额度(省略 --model 时查询全部模型)`},auth:`console`,usageArgs:`[--model <model>[,model2,...]] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s) to query, comma-separated for multiple; omit for all models`,"zh-CN":`要查询的模型名称;多个名称以逗号分隔,省略时查询全部模型`}},expiring:{type:`string`,valueHint:`<days>`,description:{"en-US":`Only show quotas expiring within N days`,"zh-CN":`仅显示将在 N 天内到期的额度`}},sort:{type:`string`,valueHint:`<field>`,description:{"en-US":`Sort by: remaining (ascending), expires (ascending)`,"zh-CN":`排序方式:remaining(剩余额度升序)、expires(到期时间升序)`},choices:[`remaining`,`expires`]},all:{type:`switch`,description:{"en-US":`Show all models instead of the top rows`,"zh-CN":`显示全部模型,而不只显示前几行`}}},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=/* @__PURE__ */ new Map;l=i?[...new Set(i.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let d={queryFreeTierQuotaRequest:{models:l}};if(n.dryRun){A({api:t_,data:d},c);return}if(i){let t=await Promise.all(l.map(t=>nt((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],$g(n.capabilities||[]))}}else{let t=await e_(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=i_(await e.client.console(t_,d)),p=i?f:f.filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0);if(a>0){let e=Date.now()+a*24*60*60*1e3;p=p.filter(t=>t.quotaValidityPeriod>0&&t.quotaValidityPeriod<=e)}let m=o??(i?void 0:`remaining`);m===`remaining`?p.sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)):m===`expires`&&p.sort((e,t)=>(e.quotaValidityPeriod??0)-(t.quotaValidityPeriod??0));let h=p.map(e=>e.model),g=h.length?await e.client.console(n_,{queryFreeTierOnlyStatusRequest:{models:h}}):null,_=g?a_(g):[],v=new Map(_.map(e=>[e.model,e.freeTierOnly]));if(c===`json`){let e=p.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,n=t?e.quotaInitTotal-e.quotaTotal:0,r=v.get(e.model),i=r===!0?!0:r===!1?!1:e.quotaStatus===`UNKNOWN`?`unsupported`: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:o_(e),expires:e.quotaValidityPeriod?Jg(e.quotaValidityPeriod):null,autoStop:i}});A(e,c);return}if(p.length===0){process.stdout.write(`No free-tier quota found.
2753
+ `);return}let y=!i&&!s?p.slice(0,15):p,b=p.length-y.length,x=m===`remaining`?` · sorted by urgency`:``;c_({quotas:y,stopMap:v,typeMap:u,title:`Free Tier Quota · ${p.length} models${x}`,moreHint:b>0?`+ ${b} more · ${t.binName} usage free --all to browse all`:void 0})}}),y_=w({description:{"en-US":`Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable`,"zh-CN":`启用或停用免费额度模型自动停止。默认启用,使用 --off 停用`},auth:`console`,usageArgs:`<--model <model>[,model2,...] | --all> [--off] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated for multiple`,"zh-CN":`模型名称,多个名称以逗号分隔`}},all:{type:`switch`,description:{"en-US":`Apply to all free-tier models`,"zh-CN":`应用于全部免费额度模型`}},on:{type:`switch`,description:{"en-US":`Enable auto-stop (default behavior)`,"zh-CN":`启用自动停止(默认行为)`}},off:{type:`switch`,description:{"en-US":`Disable auto-stop`,"zh-CN":`停用自动停止`}}},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 e_(e.client)).map(e=>e.name)),i){let t=a_(await e.client.console(n_,{queryFreeTierOnlyStatusRequest:{models:o}})),n=new Map(t.map(e=>[e.model,e.freeTierOnly]));for(let t of o){if(n.get(t)===!1){process.stderr.write(`Auto-stop is already disabled for "${t}".\n`);continue}await d_(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 d_(e.client,s,c,[t]);if(a===`json`){l.push(n);continue}if(n){let e=fr(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 b_(e){let t=e.unit?` [${e.unit}]`:``;return`${e.en}${t}`}function x_(e,t,n,r){let i=O(process.stdout);process.stdout.write(`${i.dim(`Time Range Period:`)} ${Jg(t)} ~ ${Jg(n)} ${i.dim(`(${r} days)`)}\n\n`);let a=[[`Models Called`,U(e.modelCount??0)],[`Successful Calls`,U(e.callSuccessCount??0)]];for(let t of e.usages??[]){let e=h_[t.key],n=e?b_(e):t.key;a.push([n,U(t.value)])}let o=Math.max(...a.map(([e])=>Pr(e)));for(let[e,t]of a)process.stdout.write(`${i.bold(j(e,o+2))}${t}\n`)}function S_(e,t,n,r){let i=O(process.stdout);if(process.stdout.write(`${i.dim(`Time Range Period:`)} ${Jg(t)} ~ ${Jg(n)} ${i.dim(`(${r} days)`)}\n\n`),e.length===0){process.stdout.write(`No usage data found.
2754
+ `);return}let a=/* @__PURE__ */ new Set,o=e.map(e=>{let t=m_(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=>h_[e]?.en??e)],l=e.map((e,t)=>[e.model,U(e.callSuccessCount??0),...s.map(e=>{let n=o[t][e];return n==null?`-`:U(n)})]),u=c.map((e,t)=>Math.max(Pr(e),...l.map(e=>Pr(e[t])))),d=c.map((e,t)=>i.bold(j(e,u[t]))).join(` `),f=u.map(e=>i.dim(`─`.repeat(e))).join(`──`);process.stdout.write(d+`
2756
2755
  `),process.stdout.write(f+`
2757
2756
  `);for(let e of l){let t=e.map((e,t)=>j(e,u[t]));process.stdout.write(t.join(` `)+`
2758
2757
  `)}process.stdout.write(i.dim(`\nTotal: ${e.length} models`)+`
2759
- `)}var jg=w({description:{"en-US":`Query model usage statistics`,"zh-CN":`查询模型用量统计`},auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated; omit for overview`,"zh-CN":`模型名称,多个名称以逗号分隔;省略时查看概览`}},days:{type:`string`,valueHint:`<days>`,description:{"en-US":`Number of days (default: 7)`,"zh-CN":`天数(默认:7)`}},type:{type:`string`,valueHint:`<type>`,description:{"en-US":`Model type: Text, Vision, Multimodal, Audio, Embedding`,"zh-CN":`模型类型: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:t,settings:r,flags:i}=e,a=i.model||void 0,o=Number(i.days)||7,s=i.type||void 0,c=T(r.output),l=ig(r,t.binName),u=Date.now(),d=u-o*24*60*60*1e3;if(a){let t=[...new Set(a.split(`,`).map(e=>e.trim()).filter(Boolean))],n={startTime:d,endTime:u,modelCallSource:`Online`,filterWorkspaceId:l,maxResults:50,skip:0,sortField:`success_count`,sortOrder:`DESC`};if(s&&(n.obsModelType=s),r.dryRun){A({api:vg,data:{reqDTO:{...n,model:t.join(`,`)}}},c);return}let i=await Promise.all(t.map(t=>jh(e.client,vg,{...n,model:t}))),f=[];for(let e of i){if(!e)continue;let t=xg(e);f.push(...t.list)}if(c===`json`){let e=f.map(e=>{let t=Sg(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:ng(d),end:ng(u),days:o},items:e},c);return}Ag(f,d,u,o)}else{let t={startTime:d,endTime:u,modelCallSource:`Online`,filterWorkspaceId:l};if(s&&(t.obsModelType=s),r.dryRun){A({api:_g,data:{reqDTO:t}},c);return}let i=await jh(e.client,_g,t);if(!i)throw new n(`Request timed out.`,f.TIMEOUT);let a=bg(i);if(c===`json`){if(!a){A({period:{start:ng(d),end:ng(u),days:o},modelsCalled:0,successfulCalls:0},c);return}A({period:{start:ng(d),end:ng(u),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:Cg[e.key]?.en??e.key}))},c);return}if(!a){process.stdout.write(`No usage data found.
2760
- `);return}kg(a,d,u,o)}}}),Mg=w({description:{"en-US":`Show a unified usage summary: free-tier quota and recent usage overview`,"zh-CN":`显示统一用量摘要:免费额度和近期用量概览`},auth:`console`,usageArgs:`[--days <days>] [flags]`,flags:{days:{type:`string`,valueHint:`<days>`,description:{"en-US":`Number of days for the usage overview (default: 7)`,"zh-CN":`用量概览的天数(默认:7)`}}},exampleArgs:[``,`--days 30`,`--output json`],async run(e){let{identity:t,settings:r,flags:i}=e,a=Number(i.days)||7,o=T(r.output),s=r.workspaceId,c=Date.now(),l=c-a*24*60*60*1e3;if(r.dryRun){A({freeTier:{api:lg},usage:s?{api:_g,data:{reqDTO:{startTime:l,endTime:c,modelCallSource:`Online`,filterWorkspaceId:s}}}:null},o);return}let u=await cg(e.client),d=u.map(e=>e.name),p=new Map(u.map(e=>[e.name,e.type])),[m,h]=await Promise.all([e.client.console(lg,{queryFreeTierQuotaRequest:{models:d}}),e.client.console(ug,{queryFreeTierOnlyStatusRequest:{models:d}})]),g=fg(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)),_=pg(h),v=new Map(_.map(e=>[e.model,e.freeTierOnly])),y;if(s){let t=await jh(e.client,_g,{startTime:l,endTime:c,modelCallSource:`Online`,filterWorkspaceId:s});if(!t)throw new n(`Request timed out.`,f.TIMEOUT);y=bg(t)}if(o===`json`){let e=g.map(e=>({model:e.model,type:p.get(e.model)||null,remaining:e.quotaTotal,total:e.quotaInitTotal,remainingPercent:mg(e),expires:e.quotaValidityPeriod?ng(e.quotaValidityPeriod):null}));A({period:{start:ng(l),end:ng(c),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:Cg[e.key]?.en??e.key}))}:null},o);return}let b=O(process.stdout);if(process.stdout.write(`${b.bold(`Usage Summary`)} ${b.dim(`·`)} ${ng(c)}\n\n`),g.length===0)process.stdout.write(b.dim(`No active free-tier quota.`)+`
2761
- `);else{let e=g.slice(0,10),n=g.length-e.length;gg({quotas:e,stopMap:v,typeMap:p,title:`Free Tier Quota · ${g.length} models · sorted by urgency`,moreHint:n>0?`+ ${n} more · ${t.binName} usage free to browse all`:void 0})}process.stdout.write(`
2762
- `),s?y?Tg(y,l,c,a):process.stdout.write(b.dim(`No usage data in this period.`)+`
2758
+ `)}var C_=w({description:{"en-US":`Query model usage statistics`,"zh-CN":`查询模型用量统计`},auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated; omit for overview`,"zh-CN":`模型名称,多个名称以逗号分隔;省略时查看概览`}},days:{type:`string`,valueHint:`<days>`,description:{"en-US":`Number of days (default: 7)`,"zh-CN":`天数(默认:7)`}},type:{type:`string`,valueHint:`<type>`,description:{"en-US":`Model type: Text, Vision, Multimodal, Audio, Embedding`,"zh-CN":`模型类型: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:t,settings:r,flags:i}=e,a=i.model||void 0,o=Number(i.days)||7,s=i.type||void 0,c=T(r.output),l=Xg(r,t.binName),u=Date.now(),d=u-o*24*60*60*1e3;if(a){let t=[...new Set(a.split(`,`).map(e=>e.trim()).filter(Boolean))],n={startTime:d,endTime:u,modelCallSource:`Online`,filterWorkspaceId:l,maxResults:50,skip:0,sortField:`success_count`,sortOrder:`DESC`};if(s&&(n.obsModelType=s),r.dryRun){A({api:u_,data:{reqDTO:{...n,model:t.join(`,`)}}},c);return}let i=await Promise.all(t.map(t=>Sg(e.client,u_,{...n,model:t}))),f=[];for(let e of i){if(!e)continue;let t=p_(e);f.push(...t.list)}if(c===`json`){let e=f.map(e=>{let t=m_(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:Jg(d),end:Jg(u),days:o},items:e},c);return}S_(f,d,u,o)}else{let t={startTime:d,endTime:u,modelCallSource:`Online`,filterWorkspaceId:l};if(s&&(t.obsModelType=s),r.dryRun){A({api:l_,data:{reqDTO:t}},c);return}let i=await Sg(e.client,l_,t);if(!i)throw new n(`Request timed out.`,f.TIMEOUT);let a=f_(i);if(c===`json`){if(!a){A({period:{start:Jg(d),end:Jg(u),days:o},modelsCalled:0,successfulCalls:0},c);return}A({period:{start:Jg(d),end:Jg(u),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:h_[e.key]?.en??e.key}))},c);return}if(!a){process.stdout.write(`No usage data found.
2759
+ `);return}x_(a,d,u,o)}}}),w_=w({description:{"en-US":`Show a unified usage summary: free-tier quota and recent usage overview`,"zh-CN":`显示统一用量摘要:免费额度和近期用量概览`},auth:`console`,usageArgs:`[--days <days>] [flags]`,flags:{days:{type:`string`,valueHint:`<days>`,description:{"en-US":`Number of days for the usage overview (default: 7)`,"zh-CN":`用量概览的天数(默认:7)`}}},exampleArgs:[``,`--days 30`,`--output json`],async run(e){let{identity:t,settings:r,flags:i}=e,a=Number(i.days)||7,o=T(r.output),s=r.workspaceId,c=Date.now(),l=c-a*24*60*60*1e3;if(r.dryRun){A({freeTier:{api:t_},usage:s?{api:l_,data:{reqDTO:{startTime:l,endTime:c,modelCallSource:`Online`,filterWorkspaceId:s}}}:null},o);return}let u=await e_(e.client),d=u.map(e=>e.name),p=new Map(u.map(e=>[e.name,e.type])),[m,h]=await Promise.all([e.client.console(t_,{queryFreeTierQuotaRequest:{models:d}}),e.client.console(n_,{queryFreeTierOnlyStatusRequest:{models:d}})]),g=i_(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)),_=a_(h),v=new Map(_.map(e=>[e.model,e.freeTierOnly])),y;if(s){let t=await Sg(e.client,l_,{startTime:l,endTime:c,modelCallSource:`Online`,filterWorkspaceId:s});if(!t)throw new n(`Request timed out.`,f.TIMEOUT);y=f_(t)}if(o===`json`){let e=g.map(e=>({model:e.model,type:p.get(e.model)||null,remaining:e.quotaTotal,total:e.quotaInitTotal,remainingPercent:o_(e),expires:e.quotaValidityPeriod?Jg(e.quotaValidityPeriod):null}));A({period:{start:Jg(l),end:Jg(c),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:h_[e.key]?.en??e.key}))}:null},o);return}let b=O(process.stdout);if(process.stdout.write(`${b.bold(`Usage Summary`)} ${b.dim(`·`)} ${Jg(c)}\n\n`),g.length===0)process.stdout.write(b.dim(`No active free-tier quota.`)+`
2760
+ `);else{let e=g.slice(0,10),n=g.length-e.length;c_({quotas:e,stopMap:v,typeMap:p,title:`Free Tier Quota · ${g.length} models · sorted by urgency`,moreHint:n>0?`+ ${n} more · ${t.binName} usage free to browse all`:void 0})}process.stdout.write(`
2761
+ `),s?y?__(y,l,c,a):process.stdout.write(b.dim(`No usage data in this period.`)+`
2763
2762
  `):process.stdout.write(b.dim(`Usage overview skipped · set --workspace-id or \`${t.binName} config set workspace_id <id>\` to include it.`)+`
2764
- `)}});function Ng(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Pg(e){let t=Math.round(e*1e3)/10;return`${Number.isInteger(t)?t:t.toFixed(1)}%`}function Fg(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 Ig(e,t,n){let r=O(process.stdout),i=(e=``,t)=>{let n=Math.max(0,76-jr(` ${e}`));process.stdout.write(`│ ${t?t(e):e}${` `.repeat(n)}│\n`)},a=e=>{let t=Math.max(0,76-jr(` ${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=`${Pg(e.percentage)} used`;if(a(Yr(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}let o=`Resets: ${rg(e.resetTime)} (in ${Fg(e.resetTime,n)})`;i(o,r.dim)};process.stdout.write(`┌${`─`.repeat(76)}┐\n`),i(e,r.cyan),i(`Generated at: ${rg(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 Lg=`zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage`;function Rg(e){let t=lr(e),n={},r=Ng(t.per1MonthPercentage);r!==void 0&&(n.per1MonthPercentage=r);let i=Ng(t.per1MonthResetTime);return i!==void 0&&(n.per1MonthResetTime=i),n}function zg(e,t){Ig(`Token Plan Usage`,[{label:`Monthly quota`,emptyMessage:`The monthly limit may be unlimited; verify in the Bailian Token Plan console.`,percentage:e.per1MonthPercentage,resetTime:e.per1MonthResetTime}],t)}var Bg=w({description:{"en-US":`Show Token Plan quota usage`,"zh-CN":`查看 Token Plan 配额使用情况`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=T(t.output);if(t.dryRun){A({api:Lg,data:{}},n);return}let r=Rg(await e.client.console(Lg,{}));if(n===`json`){A(r,n);return}zg(r,Date.now())}});const Vg=`zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2`,Hg={domestic:`sfm_codingplan_public_cn`,international:`sfm_codingplan_public_intl`};function Ug(e,t){let n={};if(!e)return n;let r=Ng(e[`${t}UsedQuota`]);r!==void 0&&(n.usedQuota=r);let i=Ng(e[`${t}TotalQuota`]);i!==void 0&&(n.totalQuota=i);let a=Ng(e[`${t}QuotaNextRefreshTime`]);return a!==void 0&&(n.resetTime=a),r!==void 0&&i!==void 0&&i>0&&(n.percentage=r/i),n}function Wg(e){let t=lr(e),n=(Array.isArray(t.codingPlanInstanceInfos)?t.codingPlanInstanceInfos:[]).find(e=>e.status===`VALID`);if(!n)return;let r=n.codingPlanQuotaInfo,i={per5Hour:Ug(r,`per5Hour`),perWeek:Ug(r,`perWeek`),perBillMonth:Ug(r,`perBillMonth`)};return typeof n.instanceType==`string`&&n.instanceType&&(i.instanceType=n.instanceType),i}function Gg(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: ${H(t.usedQuota)} / ${H(t.totalQuota)}`),n}function Kg(e,t){Ig(`Coding Plan Usage${e.instanceType?` (${e.instanceType})`:``}`,[Gg(`5-hour quota`,e.per5Hour),Gg(`1-week quota`,e.perWeek),Gg(`Monthly quota`,e.perBillMonth)],t)}var qg=w({description:{"en-US":`Show Coding Plan quota usage`,"zh-CN":`查看 Coding Plan 配额使用情况`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=T(t.output),r={queryCodingPlanInstanceInfoRequest:{commodityCode:Hg[t.consoleSite??`domestic`],onlyLatestOne:!0}};if(t.dryRun){A({api:Vg,data:r},n);return}let i=Wg(await e.client.console(Vg,r));if(n===`json`){A(i??{},n);return}if(!i){process.stdout.write(`No active Coding Plan subscription found.
2765
- `);return}Kg(i,Date.now())}});async function Jg(e){let t=await Ui(e,`utf-8`).catch(e=>{throw new C(`cannot read pipeline file: ${e.message}`)}),n=ki(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 Yg=w({description:{"en-US":`Run a pipeline workflow definition`,"zh-CN":`运行 Pipeline 工作流定义`},auth:`none`,usageArgs:`--file <path> [flags]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Pipeline definition file (YAML/JSON)`,"zh-CN":`Pipeline 定义文件(YAML/JSON)`},required:!0},input:{type:`string`,valueHint:`<json>`,description:{"en-US":`Runtime input as inline JSON`,"zh-CN":`内联 JSON 格式的运行时输入`}},inputFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Runtime input from a JSON file`,"zh-CN":`来自 JSON 文件的运行时输入`}},concurrency:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max parallel steps (default: 1)`,"zh-CN":`最大并行步骤数(默认:1)`}},events:{type:`string`,valueHint:`<format>`,description:{"en-US":`Emit lifecycle events: jsonl`,"zh-CN":`输出生命周期事件:jsonl`},choices:[`jsonl`]},stepTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Default step timeout in seconds`,"zh-CN":`默认步骤超时时间,单位为秒`}}},exampleArgs:[{"en-US":`--file workflow.yaml --input '{"brief":"hello"}'`,"zh-CN":`--file workflow.yaml --input '{"brief":"你好"}'`},`--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;Vr();let i=n.events,a=P(r),o=await Jg(a),s=await Xg(n),c=Oi(a);if(i===`jsonl`){for await(let e of Qr(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout}))process.stdout.write(JSON.stringify(e)+`
2766
- `);return}let l=await Fr(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout,onEvent:t.verbose?Zg:void 0});t.output===`json`?A(l,`json`):$g(l),l.status===`failed`&&(process.exitCode=1)}});async function Xg(e){let t=e.input,n=e.inputFile;if(t)return JSON.parse(t);if(n){let e=await Ui(P(n),`utf-8`);return JSON.parse(e)}return{}}function Zg(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} ${Qg(e.step)}\n`):process.stderr.write(`${t}\n`)}function Qg(e){return`${e.index!==void 0&&e.total!==void 0?`${e.index}/${e.total} `:``}${e.id} (${e.type})`}function $g(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+`
2763
+ `)}});function T_(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function E_(e){let t=Math.round(e*1e3)/10;return`${Number.isInteger(t)?t:t.toFixed(1)}%`}function D_(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 O_(e,t,n){let r=O(process.stdout),i=(e=``,t)=>{let n=Math.max(0,76-Pr(` ${e}`));process.stdout.write(`│ ${t?t(e):e}${` `.repeat(n)}│\n`)},a=e=>{let t=Math.max(0,76-Pr(` ${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=`${E_(e.percentage)} used`;if(a(Qr(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}let o=`Resets: ${Yg(e.resetTime)} (in ${D_(e.resetTime,n)})`;i(o,r.dim)};process.stdout.write(`┌${`─`.repeat(76)}┐\n`),i(e,r.cyan),i(`Generated at: ${Yg(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 k_=`zeldaHttp.apikeyMgr./tokenplan/personal/api/v2/usage`;function A_(e){let t=fr(e),n={},r=T_(t.per1MonthPercentage);r!==void 0&&(n.per1MonthPercentage=r);let i=T_(t.per1MonthResetTime);return i!==void 0&&(n.per1MonthResetTime=i),n}function j_(e,t){O_(`Token Plan Usage`,[{label:`Monthly quota`,emptyMessage:`The monthly limit may be unlimited; verify in the Bailian Token Plan console.`,percentage:e.per1MonthPercentage,resetTime:e.per1MonthResetTime}],t)}var M_=w({description:{"en-US":`Show Token Plan quota usage`,"zh-CN":`查看 Token Plan 配额使用情况`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=T(t.output);if(t.dryRun){A({api:k_,data:{}},n);return}let r=A_(await e.client.console(k_,{}));if(n===`json`){A(r,n);return}j_(r,Date.now())}});const N_=`zeldaEasy.broadscope-bailian.codingPlan.queryCodingPlanInstanceInfoV2`,P_={domestic:`sfm_codingplan_public_cn`,international:`sfm_codingplan_public_intl`};function F_(e,t){let n={};if(!e)return n;let r=T_(e[`${t}UsedQuota`]);r!==void 0&&(n.usedQuota=r);let i=T_(e[`${t}TotalQuota`]);i!==void 0&&(n.totalQuota=i);let a=T_(e[`${t}QuotaNextRefreshTime`]);return a!==void 0&&(n.resetTime=a),r!==void 0&&i!==void 0&&i>0&&(n.percentage=r/i),n}function I_(e){let t=fr(e),n=(Array.isArray(t.codingPlanInstanceInfos)?t.codingPlanInstanceInfos:[]).find(e=>e.status===`VALID`);if(!n)return;let r=n.codingPlanQuotaInfo,i={per5Hour:F_(r,`per5Hour`),perWeek:F_(r,`perWeek`),perBillMonth:F_(r,`perBillMonth`)};return typeof n.instanceType==`string`&&n.instanceType&&(i.instanceType=n.instanceType),i}function L_(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: ${U(t.usedQuota)} / ${U(t.totalQuota)}`),n}function R_(e,t){O_(`Coding Plan Usage${e.instanceType?` (${e.instanceType})`:``}`,[L_(`5-hour quota`,e.per5Hour),L_(`1-week quota`,e.perWeek),L_(`Monthly quota`,e.perBillMonth)],t)}var z_=w({description:{"en-US":`Show Coding Plan quota usage`,"zh-CN":`查看 Coding Plan 配额使用情况`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=T(t.output),r={queryCodingPlanInstanceInfoRequest:{commodityCode:P_[t.consoleSite??`domestic`],onlyLatestOne:!0}};if(t.dryRun){A({api:N_,data:r},n);return}let i=I_(await e.client.console(N_,r));if(n===`json`){A(i??{},n);return}if(!i){process.stdout.write(`No active Coding Plan subscription found.
2764
+ `);return}R_(i,Date.now())}});async function B_(e){let t=await Ki(e,`utf-8`).catch(e=>{throw new C(`cannot read pipeline file: ${e.message}`)}),n=Mi(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 V_=w({description:{"en-US":`Run a pipeline workflow definition`,"zh-CN":`运行 Pipeline 工作流定义`},auth:`none`,usageArgs:`--file <path> [flags]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Pipeline definition file (YAML/JSON)`,"zh-CN":`Pipeline 定义文件(YAML/JSON)`},required:!0},input:{type:`string`,valueHint:`<json>`,description:{"en-US":`Runtime input as inline JSON`,"zh-CN":`内联 JSON 格式的运行时输入`}},inputFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Runtime input from a JSON file`,"zh-CN":`来自 JSON 文件的运行时输入`}},concurrency:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max parallel steps (default: 1)`,"zh-CN":`最大并行步骤数(默认:1)`}},events:{type:`string`,valueHint:`<format>`,description:{"en-US":`Emit lifecycle events: jsonl`,"zh-CN":`输出生命周期事件:jsonl`},choices:[`jsonl`]},stepTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Default step timeout in seconds`,"zh-CN":`默认步骤超时时间,单位为秒`}}},exampleArgs:[{"en-US":`--file workflow.yaml --input '{"brief":"hello"}'`,"zh-CN":`--file workflow.yaml --input '{"brief":"你好"}'`},`--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;Wr();let i=n.events,a=P(r),o=await B_(a),s=await H_(n),c=ji(a);if(i===`jsonl`){for await(let e of ti(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout}))process.stdout.write(JSON.stringify(e)+`
2765
+ `);return}let l=await Rr(o,s,{concurrency:n.concurrency,basePath:c,dryRun:t.dryRun,timeoutSeconds:n.stepTimeout,onEvent:t.verbose?U_:void 0});t.output===`json`?A(l,`json`):G_(l),l.status===`failed`&&(process.exitCode=1)}});async function H_(e){let t=e.input,n=e.inputFile;if(t)return JSON.parse(t);if(n){let e=await Ki(P(n),`utf-8`);return JSON.parse(e)}return{}}function U_(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} ${W_(e.step)}\n`):process.stderr.write(`${t}\n`)}function W_(e){return`${e.index!==void 0&&e.total!==void 0?`${e.index}/${e.total} `:``}${e.id} (${e.type})`}function G_(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+`
2767
2766
  `)}process.stdout.write(`
2768
- `)}var e_=w({description:{"en-US":`Validate a pipeline definition without executing`,"zh-CN":`验证 Pipeline 定义但不执行`},auth:`none`,usageArgs:`--file <path>`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Pipeline definition file (YAML/JSON)`,"zh-CN":`Pipeline 定义文件(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;Vr();let i=await Jg(P(r)),a=kr(i),o=a.length===0?Or(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.
2767
+ `)}var K_=w({description:{"en-US":`Validate a pipeline definition without executing`,"zh-CN":`验证 Pipeline 定义但不执行`},auth:`none`,usageArgs:`--file <path>`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Pipeline definition file (YAML/JSON)`,"zh-CN":`Pipeline 定义文件(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;Wr();let i=await B_(P(r)),a=Mr(i),o=a.length===0?jr(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.
2769
2768
  `);for(let e of o)process.stderr.write(` hint: ${e}\n`)}else{process.stderr.write(`Pipeline validation failed:
2770
- `);for(let e of a)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function t_(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 n_={Text:`Text`,Image:`Image`,Video:`Video`,Audio:`Audio`},r_={TG:`Text Gen`,VU:`Vision`,IG:`Image Gen`,VG:`Video Gen`,TTS:`Text-to-Speech`,ASR:`Speech-to-Text`,Reasoning:`Reasoning`},i_={low:`Cost-Effective`,medium:`Balanced`,high:`High Investment`},a_={flagship:`Flagship`,balanced:`Balanced`,"cost-optimized":`Value`},o_={scoped:`Scoped`,comparison:`Comparison`,alternative:`Alternative`};function s_(e){return $r(e)?Yi:new Xi({level:0})}function c_(e){let t=s_(process.stdout),n=$r(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=>n_[e]??e),a=e.outputModality.map(e=>n_[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=>r_[e]??e);o.length&&r.push(`${t.dim(`Capabilities`)} ${o.join(`, `)}`);let s=i_[e.budget]??e.budget,c=a_[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=o_[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=>n_[e]??e).join(`, `);r.push(` ${t.dim(`${n+1}.`)} ${i.step}${e?t.dim(` → ${e}`):``}`)}}return Ji(r.join(`
2771
- `),{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 l_=[`Best Pick`,`Runner-Up`,`Alternative`];function u_(e,t,n,r){let i=[n.green.bold,n.blue.bold,n.magenta.bold][t]??n.white.bold,a=l_[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 ${t_(e.contextWindow)}`),e.maxOutputTokens&&s.push(`Max Output ${t_(e.maxOutputTokens)}`),s.length&&(o.push(``),o.push(n.dim(s.join(` · `))));let c=me(e.docUrl);return c&&(o.push(``),o.push(n.dim(`Docs ${c}`))),Ji(o.join(`
2772
- `),{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 d_(e){let t=s_(process.stdout),n=$r(process.stdout);return e.map((e,r)=>u_(e,r,t,n)).join(`
2773
- `)}function f_(e,t){let n=s_(process.stdout),r=$r(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)=>u_(e,t,n,r)).join(`
2769
+ `);for(let e of a)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function q_(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 J_={Text:`Text`,Image:`Image`,Video:`Video`,Audio:`Audio`},Y_={TG:`Text Gen`,VU:`Vision`,IG:`Image Gen`,VG:`Video Gen`,TTS:`Text-to-Speech`,ASR:`Speech-to-Text`,Reasoning:`Reasoning`},X_={low:`Cost-Effective`,medium:`Balanced`,high:`High Investment`},Z_={flagship:`Flagship`,balanced:`Balanced`,"cost-optimized":`Value`},Q_={scoped:`Scoped`,comparison:`Comparison`,alternative:`Alternative`};function $_(e){return ni(e)?Qi:new $i({level:0})}function ev(e){let t=$_(process.stdout),n=ni(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=>J_[e]??e),a=e.outputModality.map(e=>J_[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=>Y_[e]??e);o.length&&r.push(`${t.dim(`Capabilities`)} ${o.join(`, `)}`);let s=X_[e.budget]??e.budget,c=Z_[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=Q_[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=>J_[e]??e).join(`, `);r.push(` ${t.dim(`${n+1}.`)} ${i.step}${e?t.dim(` → ${e}`):``}`)}}return Zi(r.join(`
2770
+ `),{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 tv=[`Best Pick`,`Runner-Up`,`Alternative`];function nv(e,t,n,r){let i=[n.green.bold,n.blue.bold,n.magenta.bold][t]??n.white.bold,a=tv[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 ${q_(e.contextWindow)}`),e.maxOutputTokens&&s.push(`Max Output ${q_(e.maxOutputTokens)}`),s.length&&(o.push(``),o.push(n.dim(s.join(` · `))));let c=me(e.docUrl);return c&&(o.push(``),o.push(n.dim(`Docs ${c}`))),Zi(o.join(`
2771
+ `),{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 rv(e){let t=$_(process.stdout),n=ni(process.stdout);return e.map((e,r)=>nv(e,r,t,n)).join(`
2772
+ `)}function iv(e,t){let n=$_(process.stdout),r=ni(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)=>nv(e,t,n,r)).join(`
2774
2773
  `))}return i.join(`
2775
- `)}function p_(e){return e.type===`pipeline`?f_(e.summary,e.steps):d_(e.recommendations)}function m_(e){return e.type===`pipeline`?e.steps.length===0:e.recommendations.length===0}var h_=w({description:{"en-US":`Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking)`,"zh-CN":`为你的使用场景推荐最佳模型(意图分析 → 候选召回 → LLM 排序)`},auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`string`,valueHint:`<text>`,description:{"en-US":`Describe your requirements`,"zh-CN":`描述你的需求`},required:!0}},exampleArgs:[{"en-US":`--message "I need a visual-understanding chatbot"`,"zh-CN":`--message "我需要一个能够理解图片的聊天机器人"`},{"en-US":`--message "Build an Agent that auto-generates animations"`,"zh-CN":`--message "构建一个可以自动生成动画的智能体"`},{"en-US":`--message "Legal contract review, high precision required"`,"zh-CN":`--message "审查法律合同,要求高准确率"`},{"en-US":`--message "Low-cost high-concurrency online customer service" --output text`,"zh-CN":`--message "低成本、高并发的在线客服" --output text`},{"en-US":`--message "Long document summarization" --dry-run`,"zh-CN":`--message "长文档摘要" --dry-run`}],async run(e){let{settings:t,flags:n}=e,r=n.message;await $t();let i=t.outputExplicit?T(t.output):`json`,a=Ar(`Agent: Loading model data & analyzing intent...`);a.start();let o={onPrepareStart:()=>{}},s=!1,c=!1,l=vt(t,o).then(e=>(s=!0,c||a.update(`Agent: Model data loaded, analyzing intent...`),e)),u=ae(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...
2776
- `),a.update(`Agent: Recalling candidates...`),a.start();let p=await En(e.client,d,r,S,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 m=await Sn(e.client,p,f,r,3);if(a.stop(),m_(m)){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:m,candidates:p.length},i);return}k(c_(f)),k(``),k(p_(m))}});const g_=Object.values(v),__={provider:{type:`array`,valueHint:`<p>`,description:{"en-US":`Filter by provider (repeatable, e.g. --provider alibaba --provider deepseek)`,"zh-CN":`按提供商筛选(可重复,例如 --provider alibaba --provider deepseek)`}},capability:{type:`array`,valueHint:`<c>`,description:{"en-US":`Filter by capability code (TG, Reasoning, VU, IG, VG, TTS, ASR, …)`,"zh-CN":`按能力代码筛选(TG、Reasoning、VU、IG、VG、TTS、ASR 等)`}},feature:{type:`array`,valueHint:`<f>`,description:{"en-US":`Filter by feature (function-calling, web-search, structured-outputs, …)`,"zh-CN":`按特性筛选(function-calling、web-search、structured-outputs 等)`}},contextWindow:{type:`array`,valueHint:`<w>`,description:{"en-US":`Filter by context window range bucket`,"zh-CN":`按上下文窗口范围筛选`}},inputModality:{type:`array`,valueHint:`<m>`,choices:g_,description:{"en-US":`Require an input modality (repeatable: Text, Image, Video, Audio)`,"zh-CN":`限定输入模态(可重复:Text、Image、Video、Audio)`}},outputModality:{type:`array`,valueHint:`<m>`,choices:g_,description:{"en-US":`Require an output modality (repeatable: Text, Image, Video, Audio)`,"zh-CN":`限定输出模态(可重复:Text、Image、Video、Audio)`}},includeDeprecated:{type:`switch`,description:{"en-US":`Include models that are already offline (hidden by default)`,"zh-CN":`包含已下线的模型(默认隐藏)`}}};function v_(e){return{providers:e.provider?.length?e.provider:void 0,capabilities:e.capability?.length?e.capability:void 0,features:e.feature?.length?e.feature:void 0,contextWindows:e.contextWindow?.length?e.contextWindow:void 0}}function y_(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??``}`}const b_=/-\d{4}-\d{2}-\d{2}$/;function x_(e){return b_.test(e??``)}function S_(e){return e.toLowerCase().replace(b_,``).replace(/[\s_-]+/g,``)}function C_(e){if(e.length===0)return[];let t=e.filter(e=>!x_(e.model));return t.length>0?t:[...e].sort((e,t)=>String(t.model).localeCompare(String(e.model))).slice(0,1)}function w_(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&g_.includes(e)):[]}function T_(e){let t=e.inferenceMetadata??{};return{input:w_(t.request_modality),output:w_(t.response_modality)}}function E_(e,t,n){let r=T_(e);return!(t.length>0&&!t.some(e=>r.input.includes(e))||n.length>0&&!n.some(e=>r.output.includes(e)))}function D_(e,t=Date.now()){if(e.offlineAt&&Date.parse(e.offlineAt)<=t)return{offline:!0};let n=e.offlineInfo?.inference,r=n?.offlineTime;if(r){let e=Date.parse(r.replace(` `,`T`));if(!Number.isNaN(e))return{offline:!1,upcomingOfflineAt:r,announceUrl:n?.announceUrl||void 0}}return{offline:!1}}function O_(e){return e.offline?`OFFLINE`:e.upcomingOfflineAt?`OFFLINE ${e.upcomingOfflineAt.slice(0,10)}`:``}function k_(e,t,n=Date.now()){let r=t.inputModality??[],i=t.outputModality??[];return e.filter(e=>!(!E_(e,r,i)||!t.includeDeprecated&&D_(e,n).offline))}const A_={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Show full details of a specific model family (switches to detail mode)`,"zh-CN":`显示指定模型系列的完整详情(切换到详情模式)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10)`,"zh-CN":`每页结果数(默认:10)`}},...__,enrich:{type:`switch`,description:{"en-US":`Also fetch input parameter schema (predictConfig) for trunk models (detail mode only)`,"zh-CN":`同时获取主干模型的输入参数 Schema(predictConfig,仅详情模式)`}}};function j_(e){return(e.model??``).replace(/^group-/,``)||e.name||`unknown`}function M_(e){let t=/* @__PURE__ */ new Set,n=/* @__PURE__ */ 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?y_([a]):void 0,prices:o}}function N_(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=M_(e);return[e.name||j_(e),t.providers||`-`,t.capabilities||`-`,String(t.modelCount),t.maxContext?String(t.maxContext):`-`,t.price??`-`]});for(let e of zr(n,r))k(e);k(`\nTotal: ${t.total}`),t.hiddenModality>0&&k(`${t.hiddenModality} models on this page excluded by the modality filter (not reflected in Total).`),t.hiddenOffline>0&&k(`${t.hiddenOffline} offline models hidden — use --include-deprecated to include them.`)}function P_(e,t){return{items:e.map(e=>{let t=M_(e),n=e.items?.[0];return{model:j_(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 F_(e,t){let n=e.items??[],r=C_(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=n.some(e=>O_(D_(e))!==``),o=[`MODEL`,`PROVIDER`,`CAPABILITIES`,`CONTEXT`,`OUTPUT`,`CATEGORY`,`PRICE`];a&&o.push(`STATUS`);let s=n.map(e=>{let t=[e.model??`-`,e.provider??`-`,(e.capabilities??[]).join(`,`)||`-`,e.contextWindow?String(e.contextWindow):`-`,e.maxOutputTokens?String(e.maxOutputTokens):`-`,e.category??`-`,y_(e.prices)];return a&&t.push(O_(D_(e))),t});for(let e of zr(o,s))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 zr(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 zr(t,n))k(e)}if(t)for(let e of r)e.predictConfig&&e.predictConfig.length!==0&&(k(`\n── predictConfig: ${e.model} ──`),L_(e.predictConfig))}function I_(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=D_(e),r={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,modalities:T_(e)};return e.prices&&(r.prices=e.prices),e.qpmInfo&&(r.qpmInfo=e.qpmInfo),n.offline&&(r.offline=!0),n.upcomingOfflineAt&&(r.upcomingOfflineAt=n.upcomingOfflineAt),n.announceUrl&&(r.announceUrl=n.announceUrl),t&&e.predictConfig&&(r.predictConfig=e.predictConfig),r})}}function L_(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 zr(t,n))k(e)}var R_=w({description:{"en-US":`Browse model families or show detailed model info in the Bailian model marketplace`,"zh-CN":`浏览百炼模型市场中的模型系列,或查看模型详细信息`},auth:`none`,usageArgs:`[--model <model>] [--page <n>] [--page-size <n>] [--provider <p>] [--capability <c>] [--feature <f>] [--input-modality <m>] [--output-modality <m>] [--include-deprecated] [--enrich]`,flags:A_,exampleArgs:[``,`--provider alibaba`,`--capability TG --capability Reasoning`,`--input-modality Image --output-modality Text`,`--include-deprecated`,`--model qwen-max`,`--model qwen-max --enrich --output json`,`--feature function-calling --output json`],notes:[{"en-US":`Both the catalog and --enrich parameter-schema endpoints are public — no console login needed.`,"zh-CN":`模型目录和 --enrich 使用的参数 Schema Endpoint 均为公开接口,无需登录控制台。`},{"en-US":`Browse mode hides models that are already offline; use --include-deprecated to include them. Detail mode (--model) always lists every version and flags its status instead.`,"zh-CN":`浏览模式会隐藏已下线的模型,可用 --include-deprecated 包含它们;详情模式(--model)始终列出全部版本并标注状态。`}],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.model,a=oe(t);if(i){let e=!!n.enrich;if(t.dryRun){A({action:`model.detail`,model:i,enrich:e},r);return}let o=await Je(a,i);if(!o){k(`Model "${i}" not found.`);return}if(e){let e=C_(o.items??[]);await Promise.all(e.map(async e=>{if(!e.model)return;let t=await Qe(a,e.model);t&&(e.predictConfig=t)}))}if(r===`json`){A(I_(o,e),r);return}F_(o,e);return}let o={pageNo:n.page,pageSize:n.pageSize??10,...v_(n)};if(t.dryRun){A({action:`model.list`,includeDeprecated:!!n.includeDeprecated,...o},r);return}let{total:s,groups:c}=await Ye(a,o),l=c.map(e=>({...e,items:k_(e.items??[],n)})).filter(e=>e.items.length>0),u=c.flatMap(e=>e.items??[]),d=n.includeDeprecated?0:u.filter(e=>D_(e).offline).length,f=u.filter(e=>!E_(e,n.inputModality??[],n.outputModality??[])).length;if(r===`json`){A(P_(l,s),r);return}N_(l,{total:s,hiddenOffline:d,hiddenModality:f})}});const z_={modelExact:100,modelPrefix:60,modelContains:40,nameContains:30,capability:20,feature:15,provider:12,description:8},B_={recommended:10,flagship:6,trunk:5},V_={announcedRetirement:25,offline:60};function H_(e,t){return t.length>0?e.length/t.length:0}function U_(e,t){let n=S_(t),r=t.trim().toLowerCase();if(!n&&!r)return 0;let i=S_(e.model??``),a=S_(e.name??``),o=0;if(n&&(i===n?o+=z_.modelExact:i.startsWith(n)?o+=z_.modelPrefix+H_(n,i)*30:i.includes(n)?o+=z_.modelContains+H_(n,i)*30:a.includes(n)&&(o+=z_.nameContains+H_(n,a)*30),(e.capabilities??[]).some(e=>S_(e).includes(n))&&(o+=z_.capability),(e.features??[]).some(e=>S_(e).includes(n))&&(o+=z_.feature),S_(e.provider??``).includes(n)&&(o+=z_.provider)),r&&`${e.description??``} ${e.shortDescription??``}`.toLowerCase().includes(r)&&(o+=z_.description),o===0)return 0;e.aliyunRecommend===!0&&(o+=B_.recommended),e.category===`Flagship`&&(o+=B_.flagship),x_(e.model)||(o+=B_.trunk);let s=D_(e);return s.offline?o-=V_.offline:s.upcomingOfflineAt&&(o-=V_.announcedRetirement),Math.round(o*10)/10}function W_(e,t,n){if(e.length===0){k(`No models matched "${t}".`);return}let r=e.some(({item:e})=>O_(D_(e))!==``),i=[`MODEL`,`PROVIDER`,`CAPABILITIES`,`CONTEXT`,`PRICE`];r&&i.push(`STATUS`);let a=e.map(({item:e})=>{let t=[e.model??`-`,e.provider??`-`,(e.capabilities??[]).join(`,`)||`-`,e.contextWindow?String(e.contextWindow):`-`,y_(e.prices)];return r&&t.push(O_(D_(e))||`-`),t});for(let e of zr(i,a))k(e);k(`\nMatches: ${e.length}`),n>0&&k(`${n} offline models hidden — use --include-deprecated to include them.`)}function G_(e,t,n){return{keyword:t,total:e.length,hiddenOffline:n>0?n:void 0,items:e.map(({item:e,score:t})=>{let n=D_(e);return{model:e.model,name:e.name,provider:e.provider,capabilities:e.capabilities,features:e.features,category:e.category,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens,docUrl:e.docUrl,modalities:T_(e),prices:e.prices,score:t,offline:n.offline||void 0,upcomingOfflineAt:n.upcomingOfflineAt,announceUrl:n.announceUrl}})}}var K_=w({description:{"en-US":`Search the model catalog by keyword, ranked by relevance`,"zh-CN":`按关键词搜索模型目录,并按相关度排序`},auth:`none`,usageArgs:`--keyword <kw> [--limit <n>] [--input-modality <m>] [--output-modality <m>] [flags]`,flags:{keyword:{type:`string`,valueHint:`<kw>`,required:!0,description:{"en-US":`Keyword matched against model id, name, capabilities, features and description`,"zh-CN":`关键词,匹配模型 ID、名称、能力、特性与描述`}},limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum results to return (default: 20)`,"zh-CN":`最多返回的结果数(默认:20)`}},...__},exampleArgs:[`--keyword qwen`,`--keyword vision --output-modality Text`,`--keyword function-calling --provider alibaba`,`--keyword 长上下文 --limit 5`,`--keyword qwen --include-deprecated --output json`],notes:[{"en-US":`Search scans the whole catalog so that ranking sees every candidate; models already offline are hidden unless --include-deprecated is set.`,"zh-CN":`搜索会扫描完整目录以保证排序看到全部候选;已下线的模型默认隐藏,除非指定 --include-deprecated。`},{"en-US":`The model catalog endpoint is public — no console login needed.`,"zh-CN":`模型目录为公开接口,无需登录控制台。`}],validate:e=>{if(e.limit!=null&&e.limit<1)return`--limit must be a positive number.`},async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.limit??20,a=v_(n),o=oe(t);if(t.dryRun){A({action:`model.search`,keyword:n.keyword,limit:i,includeDeprecated:!!n.includeDeprecated,...a},r);return}let s=await Xe(o,a),c=k_(s,n),l=n.includeDeprecated?0:s.filter(e=>D_(e).offline).length,u=c.map(e=>({item:e,score:U_(e,n.keyword)})).filter(e=>e.score>0).sort((e,t)=>t.score-e.score||String(e.item.model).localeCompare(String(t.item.model))).slice(0,i);if(r===`json`){A(G_(u,n.keyword,l),r);return}W_(u,n.keyword,l)}});const q_={completions:`completionsAPI`,responses:`responsesAPI`},J_={node:`nodejs`,nodejs:`node`};function Y_(e){return Object.entries(e).map(([e,t])=>`${e} (${Object.entries(t??{}).map(([e,t])=>`${e}: ${Object.keys(t??{}).join(`,`)}`).join(` | `)})`).join(`; `)}function X_(e,t){return e.includes(t)?t:e[0]}function Z_(e,t){if(e[t])return t;let n=J_[t];return n&&e[n]?n:t}function Q_(e,t){let r=Y_(e),i=Object.keys(e);if(i.length===0)throw new n(`This model publishes no SDK sample code.`,f.GENERAL);let a=t.sdk??X_(i,`openai`)??i[0];if(!e[a])throw new n(`Unknown --sdk "${t.sdk}". Available: ${r}`,f.USAGE);let o=e[a],s=Object.keys(o),c;if(t.api){if(c=q_[t.api]??t.api,!o[c])throw new n(`Unknown --api "${t.api}" for sdk "${a}". Available: ${r}`,f.USAGE)}else c=X_(s,`completionsAPI`)??s[0];let l=o[c],u=Object.keys(l),d=t.lang?Z_(l,t.lang):X_(u,`python`)??u[0];if(!l[d])throw new n(`Unknown --lang "${t.lang}" for ${a}/${c}. Available: ${r}`,f.USAGE);let p=l[d]?.code;if(!p)throw new n(`No snippet published for ${a}/${c}/${d}. Available: ${r}`,f.GENERAL);return{sdk:a,apiStyle:c,lang:d,code:p}}function $_(e,t){let n=e.find(e=>e.model===t);return n?.sampleCodeV2?n:C_(e).find(e=>e.sampleCodeV2)??e.find(e=>e.sampleCodeV2)}var ev=w({description:{"en-US":`Print a ready-to-run SDK sample for calling a model`,"zh-CN":`打印调用指定模型的 SDK 示例代码`},auth:`none`,usageArgs:`--model <model> [--sdk <sdk>] [--api <style>] [--lang <lang>]`,flags:{model:{type:`string`,valueHint:`<model>`,required:!0,description:{"en-US":`Model to generate a sample for`,"zh-CN":`要生成示例代码的模型`}},sdk:{type:`string`,valueHint:`<sdk>`,description:{"en-US":`SDK flavour: openai (default) or dashscope`,"zh-CN":`SDK 类型:openai(默认)或 dashscope`}},api:{type:`string`,valueHint:`<style>`,description:{"en-US":`API style: completions (default) or responses; ignored when the SDK has one style`,"zh-CN":`API 形态:completions(默认)或 responses;SDK 只有一种形态时忽略`}},lang:{type:`string`,valueHint:`<lang>`,description:{"en-US":`Language of the snippet (default: python). Published per model — pass an unsupported value to list them`,"zh-CN":`示例代码语言(默认:python)。可选值按模型发布,传入不支持的值即可列出`}}},exampleArgs:[`--model qwen-max`,`--model qwen-max --lang curl`,`--model qwen-max --sdk dashscope --lang java`,`--model qwen-max --api responses --lang node`,`--model qwen-max --output json`],notes:[{"en-US":`Text output is the snippet alone, so it can be redirected straight into a file. Use --output json for the snippet plus its metadata.`,"zh-CN":`text 模式只输出代码本身,可直接重定向到文件;需要元信息请用 --output json。`},{"en-US":"Samples use a `[workspace-id]` placeholder in the base URL — replace it, or set BAILIAN_WORKSPACE_ID and use the DashScope endpoint.","zh-CN":"示例中的 base URL 含 `[workspace-id]` 占位符,请替换为实际 Workspace ID,或设置 BAILIAN_WORKSPACE_ID 后使用 DashScope 域名。"},{"en-US":`Available combinations are published per model; pass an unknown value to see the list for that model.`,"zh-CN":`可用组合按模型发布;传入不支持的取值即可看到该模型的可用列表。`}],async run(e){let{settings:t,flags:r}=e,i=t.outputExplicit?T(t.output):`text`,a=oe(t);if(t.dryRun){A({action:`model.code`,model:r.model,sdk:r.sdk,api:r.api,lang:r.lang},i);return}let o=await Je(a,r.model);if(!o)throw new n(`Model "${r.model}" not found.`,f.GENERAL,`Run "model list" to browse the catalog.`);let s=$_(o.items??[],r.model);if(!s?.sampleCodeV2)throw new n(`Model "${r.model}" publishes no SDK sample code.`,f.GENERAL,`Speech, image and video models are called through their own command groups.`);let c=Q_(s.sampleCodeV2,{sdk:r.sdk,api:r.api,lang:r.lang});if(i===`json`){A({model:s.model,requestedModel:r.model,sdk:c.sdk,apiStyle:c.apiStyle,lang:c.lang,available:Y_(s.sampleCodeV2),code:c.code},i);return}k(c.code)}});const tv=`zeldaEasy.bailian-dash-workspace.space.listWorkspaces`;function nv(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function rv(e){let t=nv(e,`data`);if(!t)return e;let n=nv(t,`DataV2`);if(n){let e=nv(n,`data`);return(e?nv(e,`data`):void 0)??e??n}return nv(t,`data`)??t}function iv(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(jr(e),...r.map(e=>jr(e[t])))),a=n.map((e,n)=>t.bold(j(e,i[n]))).join(` `),o=i.map(e=>t.dim(`─`.repeat(e))).join(`──`);process.stdout.write(a+`
2774
+ `)}function av(e){return e.type===`pipeline`?iv(e.summary,e.steps):rv(e.recommendations)}function ov(e){return e.type===`pipeline`?e.steps.length===0:e.recommendations.length===0}var sv=w({description:{"en-US":`Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking)`,"zh-CN":`为你的使用场景推荐最佳模型(意图分析 → 候选召回 → LLM 排序)`},auth:`apiKey`,usageArgs:`--message <text> [flags]`,flags:{message:{type:`string`,valueHint:`<text>`,description:{"en-US":`Describe your requirements`,"zh-CN":`描述你的需求`},required:!0}},exampleArgs:[{"en-US":`--message "I need a visual-understanding chatbot"`,"zh-CN":`--message "我需要一个能够理解图片的聊天机器人"`},{"en-US":`--message "Build an Agent that auto-generates animations"`,"zh-CN":`--message "构建一个可以自动生成动画的智能体"`},{"en-US":`--message "Legal contract review, high precision required"`,"zh-CN":`--message "审查法律合同,要求高准确率"`},{"en-US":`--message "Low-cost high-concurrency online customer service" --output text`,"zh-CN":`--message "低成本、高并发的在线客服" --output text`},{"en-US":`--message "Long document summarization" --dry-run`,"zh-CN":`--message "长文档摘要" --dry-run`}],async run(e){let{settings:t,flags:n}=e,r=n.message;await Qt();let i=t.outputExplicit?T(t.output):`json`,a=Nr(`Agent: Loading model data & analyzing intent...`);a.start();let o={onPrepareStart:()=>{}},s=!1,c=!1,l=vt(t,o).then(e=>(s=!0,c||a.update(`Agent: Model data loaded, analyzing intent...`),e)),u=ae(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...
2775
+ `),a.update(`Agent: Recalling candidates...`),a.start();let p=await kn(e.client,d,r,S,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 m=await Tn(e.client,p,f,r,3);if(a.stop(),ov(m)){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:m,candidates:p.length},i);return}k(ev(f)),k(``),k(av(m))}});const cv=Object.values(v),lv={provider:{type:`array`,valueHint:`<p>`,description:{"en-US":`Filter by provider (repeatable, e.g. --provider alibaba --provider deepseek)`,"zh-CN":`按提供商筛选(可重复,例如 --provider alibaba --provider deepseek)`}},capability:{type:`array`,valueHint:`<c>`,description:{"en-US":`Filter by capability code (TG, Reasoning, VU, IG, VG, TTS, ASR, …)`,"zh-CN":`按能力代码筛选(TG、Reasoning、VU、IG、VG、TTS、ASR 等)`}},feature:{type:`array`,valueHint:`<f>`,description:{"en-US":`Filter by feature (function-calling, web-search, structured-outputs, …)`,"zh-CN":`按特性筛选(function-calling、web-search、structured-outputs 等)`}},contextWindow:{type:`array`,valueHint:`<w>`,description:{"en-US":`Filter by context window range bucket`,"zh-CN":`按上下文窗口范围筛选`}},inputModality:{type:`array`,valueHint:`<m>`,choices:cv,description:{"en-US":`Require an input modality (repeatable: Text, Image, Video, Audio)`,"zh-CN":`限定输入模态(可重复:Text、Image、Video、Audio)`}},outputModality:{type:`array`,valueHint:`<m>`,choices:cv,description:{"en-US":`Require an output modality (repeatable: Text, Image, Video, Audio)`,"zh-CN":`限定输出模态(可重复:Text、Image、Video、Audio)`}},includeDeprecated:{type:`switch`,description:{"en-US":`Include models that are already offline (hidden by default)`,"zh-CN":`包含已下线的模型(默认隐藏)`}}};function uv(e){return{providers:e.provider?.length?e.provider:void 0,capabilities:e.capability?.length?e.capability:void 0,features:e.feature?.length?e.feature:void 0,contextWindows:e.contextWindow?.length?e.contextWindow:void 0}}function dv(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??``}`}const fv=/-\d{4}-\d{2}-\d{2}$/;function pv(e){return fv.test(e??``)}function mv(e){return e.toLowerCase().replace(fv,``).replace(/[\s_-]+/g,``)}function hv(e){if(e.length===0)return[];let t=e.filter(e=>!pv(e.model));return t.length>0?t:[...e].sort((e,t)=>String(t.model).localeCompare(String(e.model))).slice(0,1)}function gv(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&cv.includes(e)):[]}function _v(e){let t=e.inferenceMetadata??{};return{input:gv(t.request_modality),output:gv(t.response_modality)}}function vv(e,t,n){let r=_v(e);return!(t.length>0&&!t.some(e=>r.input.includes(e))||n.length>0&&!n.some(e=>r.output.includes(e)))}function yv(e,t=Date.now()){if(e.offlineAt&&Date.parse(e.offlineAt)<=t)return{offline:!0};let n=e.offlineInfo?.inference,r=n?.offlineTime;if(r){let e=Date.parse(r.replace(` `,`T`));if(!Number.isNaN(e))return{offline:!1,upcomingOfflineAt:r,announceUrl:n?.announceUrl||void 0}}return{offline:!1}}function bv(e){return e.offline?`OFFLINE`:e.upcomingOfflineAt?`OFFLINE ${e.upcomingOfflineAt.slice(0,10)}`:``}function xv(e,t,n=Date.now()){let r=t.inputModality??[],i=t.outputModality??[];return e.filter(e=>!(!vv(e,r,i)||!t.includeDeprecated&&yv(e,n).offline))}const Sv={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Show full details of a specific model family (switches to detail mode)`,"zh-CN":`显示指定模型系列的完整详情(切换到详情模式)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10)`,"zh-CN":`每页结果数(默认:10)`}},...lv,enrich:{type:`switch`,description:{"en-US":`Also fetch input parameter schema (predictConfig) for trunk models (detail mode only)`,"zh-CN":`同时获取主干模型的输入参数 Schema(predictConfig,仅详情模式)`}}};function Cv(e){return(e.model??``).replace(/^group-/,``)||e.name||`unknown`}function wv(e){let t=/* @__PURE__ */ new Set,n=/* @__PURE__ */ 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?dv([a]):void 0,prices:o}}function Tv(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=wv(e);return[e.name||Cv(e),t.providers||`-`,t.capabilities||`-`,String(t.modelCount),t.maxContext?String(t.maxContext):`-`,t.price??`-`]});for(let e of Hr(n,r))k(e);k(`\nTotal: ${t.total}`),t.hiddenModality>0&&k(`${t.hiddenModality} models on this page excluded by the modality filter (not reflected in Total).`),t.hiddenOffline>0&&k(`${t.hiddenOffline} offline models hidden — use --include-deprecated to include them.`)}function Ev(e,t){return{items:e.map(e=>{let t=wv(e),n=e.items?.[0];return{model:Cv(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 Dv(e,t){let n=e.items??[],r=hv(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=n.some(e=>bv(yv(e))!==``),o=[`MODEL`,`PROVIDER`,`CAPABILITIES`,`CONTEXT`,`OUTPUT`,`CATEGORY`,`PRICE`];a&&o.push(`STATUS`);let s=n.map(e=>{let t=[e.model??`-`,e.provider??`-`,(e.capabilities??[]).join(`,`)||`-`,e.contextWindow?String(e.contextWindow):`-`,e.maxOutputTokens?String(e.maxOutputTokens):`-`,e.category??`-`,dv(e.prices)];return a&&t.push(bv(yv(e))),t});for(let e of Hr(o,s))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 Hr(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 Hr(t,n))k(e)}if(t)for(let e of r)e.predictConfig&&e.predictConfig.length!==0&&(k(`\n── predictConfig: ${e.model} ──`),kv(e.predictConfig))}function Ov(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=yv(e),r={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,modalities:_v(e)};return e.prices&&(r.prices=e.prices),e.qpmInfo&&(r.qpmInfo=e.qpmInfo),n.offline&&(r.offline=!0),n.upcomingOfflineAt&&(r.upcomingOfflineAt=n.upcomingOfflineAt),n.announceUrl&&(r.announceUrl=n.announceUrl),t&&e.predictConfig&&(r.predictConfig=e.predictConfig),r})}}function kv(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 Hr(t,n))k(e)}var Av=w({description:{"en-US":`Browse model families or show detailed model info in the Bailian model marketplace`,"zh-CN":`浏览百炼模型市场中的模型系列,或查看模型详细信息`},auth:`none`,usageArgs:`[--model <model>] [--page <n>] [--page-size <n>] [--provider <p>] [--capability <c>] [--feature <f>] [--input-modality <m>] [--output-modality <m>] [--include-deprecated] [--enrich]`,flags:Sv,exampleArgs:[``,`--provider alibaba`,`--capability TG --capability Reasoning`,`--input-modality Image --output-modality Text`,`--include-deprecated`,`--model qwen-max`,`--model qwen-max --enrich --output json`,`--feature function-calling --output json`],notes:[{"en-US":`Both the catalog and --enrich parameter-schema endpoints are public — no console login needed.`,"zh-CN":`模型目录和 --enrich 使用的参数 Schema Endpoint 均为公开接口,无需登录控制台。`},{"en-US":`Browse mode hides models that are already offline; use --include-deprecated to include them. Detail mode (--model) always lists every version and flags its status instead.`,"zh-CN":`浏览模式会隐藏已下线的模型,可用 --include-deprecated 包含它们;详情模式(--model)始终列出全部版本并标注状态。`}],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.model,a=oe(t);if(i){let e=!!n.enrich;if(t.dryRun){A({action:`model.detail`,model:i,enrich:e},r);return}let o=await Je(a,i);if(!o){k(`Model "${i}" not found.`);return}if(e){let e=hv(o.items??[]);await Promise.all(e.map(async e=>{if(!e.model)return;let t=await Qe(a,e.model);t&&(e.predictConfig=t)}))}if(r===`json`){A(Ov(o,e),r);return}Dv(o,e);return}let o={pageNo:n.page,pageSize:n.pageSize??10,...uv(n)};if(t.dryRun){A({action:`model.list`,includeDeprecated:!!n.includeDeprecated,...o},r);return}let{total:s,groups:c}=await Ye(a,o),l=c.map(e=>({...e,items:xv(e.items??[],n)})).filter(e=>e.items.length>0),u=c.flatMap(e=>e.items??[]),d=n.includeDeprecated?0:u.filter(e=>yv(e).offline).length,f=u.filter(e=>!vv(e,n.inputModality??[],n.outputModality??[])).length;if(r===`json`){A(Ev(l,s),r);return}Tv(l,{total:s,hiddenOffline:d,hiddenModality:f})}});const jv={modelExact:100,modelPrefix:60,modelContains:40,nameContains:30,capability:20,feature:15,provider:12,description:8},Mv={recommended:10,flagship:6,trunk:5},Nv={announcedRetirement:25,offline:60};function Pv(e,t){return t.length>0?e.length/t.length:0}function Fv(e,t){let n=mv(t),r=t.trim().toLowerCase();if(!n&&!r)return 0;let i=mv(e.model??``),a=mv(e.name??``),o=0;if(n&&(i===n?o+=jv.modelExact:i.startsWith(n)?o+=jv.modelPrefix+Pv(n,i)*30:i.includes(n)?o+=jv.modelContains+Pv(n,i)*30:a.includes(n)&&(o+=jv.nameContains+Pv(n,a)*30),(e.capabilities??[]).some(e=>mv(e).includes(n))&&(o+=jv.capability),(e.features??[]).some(e=>mv(e).includes(n))&&(o+=jv.feature),mv(e.provider??``).includes(n)&&(o+=jv.provider)),r&&`${e.description??``} ${e.shortDescription??``}`.toLowerCase().includes(r)&&(o+=jv.description),o===0)return 0;e.aliyunRecommend===!0&&(o+=Mv.recommended),e.category===`Flagship`&&(o+=Mv.flagship),pv(e.model)||(o+=Mv.trunk);let s=yv(e);return s.offline?o-=Nv.offline:s.upcomingOfflineAt&&(o-=Nv.announcedRetirement),Math.round(o*10)/10}function Iv(e,t,n){if(e.length===0){k(`No models matched "${t}".`);return}let r=e.some(({item:e})=>bv(yv(e))!==``),i=[`MODEL`,`PROVIDER`,`CAPABILITIES`,`CONTEXT`,`PRICE`];r&&i.push(`STATUS`);let a=e.map(({item:e})=>{let t=[e.model??`-`,e.provider??`-`,(e.capabilities??[]).join(`,`)||`-`,e.contextWindow?String(e.contextWindow):`-`,dv(e.prices)];return r&&t.push(bv(yv(e))||`-`),t});for(let e of Hr(i,a))k(e);k(`\nMatches: ${e.length}`),n>0&&k(`${n} offline models hidden — use --include-deprecated to include them.`)}function Lv(e,t,n){return{keyword:t,total:e.length,hiddenOffline:n>0?n:void 0,items:e.map(({item:e,score:t})=>{let n=yv(e);return{model:e.model,name:e.name,provider:e.provider,capabilities:e.capabilities,features:e.features,category:e.category,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens,docUrl:e.docUrl,modalities:_v(e),prices:e.prices,score:t,offline:n.offline||void 0,upcomingOfflineAt:n.upcomingOfflineAt,announceUrl:n.announceUrl}})}}var Rv=w({description:{"en-US":`Search the model catalog by keyword, ranked by relevance`,"zh-CN":`按关键词搜索模型目录,并按相关度排序`},auth:`none`,usageArgs:`--keyword <kw> [--limit <n>] [--input-modality <m>] [--output-modality <m>] [flags]`,flags:{keyword:{type:`string`,valueHint:`<kw>`,required:!0,description:{"en-US":`Keyword matched against model id, name, capabilities, features and description`,"zh-CN":`关键词,匹配模型 ID、名称、能力、特性与描述`}},limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum results to return (default: 20)`,"zh-CN":`最多返回的结果数(默认:20)`}},...lv},exampleArgs:[`--keyword qwen`,`--keyword vision --output-modality Text`,`--keyword function-calling --provider alibaba`,`--keyword 长上下文 --limit 5`,`--keyword qwen --include-deprecated --output json`],notes:[{"en-US":`Search scans the whole catalog so that ranking sees every candidate; models already offline are hidden unless --include-deprecated is set.`,"zh-CN":`搜索会扫描完整目录以保证排序看到全部候选;已下线的模型默认隐藏,除非指定 --include-deprecated。`},{"en-US":`The model catalog endpoint is public — no console login needed.`,"zh-CN":`模型目录为公开接口,无需登录控制台。`}],validate:e=>{if(e.limit!=null&&e.limit<1)return`--limit must be a positive number.`},async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.limit??20,a=uv(n),o=oe(t);if(t.dryRun){A({action:`model.search`,keyword:n.keyword,limit:i,includeDeprecated:!!n.includeDeprecated,...a},r);return}let s=await Xe(o,a),c=xv(s,n),l=n.includeDeprecated?0:s.filter(e=>yv(e).offline).length,u=c.map(e=>({item:e,score:Fv(e,n.keyword)})).filter(e=>e.score>0).sort((e,t)=>t.score-e.score||String(e.item.model).localeCompare(String(t.item.model))).slice(0,i);if(r===`json`){A(Lv(u,n.keyword,l),r);return}Iv(u,n.keyword,l)}});const zv={completions:`completionsAPI`,responses:`responsesAPI`},Bv={node:`nodejs`,nodejs:`node`};function Vv(e){return Object.entries(e).map(([e,t])=>`${e} (${Object.entries(t??{}).map(([e,t])=>`${e}: ${Object.keys(t??{}).join(`,`)}`).join(` | `)})`).join(`; `)}function Hv(e,t){return e.includes(t)?t:e[0]}function Uv(e,t){if(e[t])return t;let n=Bv[t];return n&&e[n]?n:t}function Wv(e,t){let r=Vv(e),i=Object.keys(e);if(i.length===0)throw new n(`This model publishes no SDK sample code.`,f.GENERAL);let a=t.sdk??Hv(i,`openai`)??i[0];if(!e[a])throw new n(`Unknown --sdk "${t.sdk}". Available: ${r}`,f.USAGE);let o=e[a],s=Object.keys(o),c;if(t.api){if(c=zv[t.api]??t.api,!o[c])throw new n(`Unknown --api "${t.api}" for sdk "${a}". Available: ${r}`,f.USAGE)}else c=Hv(s,`completionsAPI`)??s[0];let l=o[c],u=Object.keys(l),d=t.lang?Uv(l,t.lang):Hv(u,`python`)??u[0];if(!l[d])throw new n(`Unknown --lang "${t.lang}" for ${a}/${c}. Available: ${r}`,f.USAGE);let p=l[d]?.code;if(!p)throw new n(`No snippet published for ${a}/${c}/${d}. Available: ${r}`,f.GENERAL);return{sdk:a,apiStyle:c,lang:d,code:p}}function Gv(e,t){let n=e.find(e=>e.model===t);return n?.sampleCodeV2?n:hv(e).find(e=>e.sampleCodeV2)??e.find(e=>e.sampleCodeV2)}var Kv=w({description:{"en-US":`Print a ready-to-run SDK sample for calling a model`,"zh-CN":`打印调用指定模型的 SDK 示例代码`},auth:`none`,usageArgs:`--model <model> [--sdk <sdk>] [--api <style>] [--lang <lang>]`,flags:{model:{type:`string`,valueHint:`<model>`,required:!0,description:{"en-US":`Model to generate a sample for`,"zh-CN":`要生成示例代码的模型`}},sdk:{type:`string`,valueHint:`<sdk>`,description:{"en-US":`SDK flavour: openai (default) or dashscope`,"zh-CN":`SDK 类型:openai(默认)或 dashscope`}},api:{type:`string`,valueHint:`<style>`,description:{"en-US":`API style: completions (default) or responses; ignored when the SDK has one style`,"zh-CN":`API 形态:completions(默认)或 responses;SDK 只有一种形态时忽略`}},lang:{type:`string`,valueHint:`<lang>`,description:{"en-US":`Language of the snippet (default: python). Published per model — pass an unsupported value to list them`,"zh-CN":`示例代码语言(默认:python)。可选值按模型发布,传入不支持的值即可列出`}}},exampleArgs:[`--model qwen-max`,`--model qwen-max --lang curl`,`--model qwen-max --sdk dashscope --lang java`,`--model qwen-max --api responses --lang node`,`--model qwen-max --output json`],notes:[{"en-US":`Text output is the snippet alone, so it can be redirected straight into a file. Use --output json for the snippet plus its metadata.`,"zh-CN":`text 模式只输出代码本身,可直接重定向到文件;需要元信息请用 --output json。`},{"en-US":"Samples use a `[workspace-id]` placeholder in the base URL — replace it, or set BAILIAN_WORKSPACE_ID and use the DashScope endpoint.","zh-CN":"示例中的 base URL 含 `[workspace-id]` 占位符,请替换为实际 Workspace ID,或设置 BAILIAN_WORKSPACE_ID 后使用 DashScope 域名。"},{"en-US":`Available combinations are published per model; pass an unknown value to see the list for that model.`,"zh-CN":`可用组合按模型发布;传入不支持的取值即可看到该模型的可用列表。`}],async run(e){let{settings:t,flags:r}=e,i=t.outputExplicit?T(t.output):`text`,a=oe(t);if(t.dryRun){A({action:`model.code`,model:r.model,sdk:r.sdk,api:r.api,lang:r.lang},i);return}let o=await Je(a,r.model);if(!o)throw new n(`Model "${r.model}" not found.`,f.GENERAL,`Run "model list" to browse the catalog.`);let s=Gv(o.items??[],r.model);if(!s?.sampleCodeV2)throw new n(`Model "${r.model}" publishes no SDK sample code.`,f.GENERAL,`Speech, image and video models are called through their own command groups.`);let c=Wv(s.sampleCodeV2,{sdk:r.sdk,api:r.api,lang:r.lang});if(i===`json`){A({model:s.model,requestedModel:r.model,sdk:c.sdk,apiStyle:c.apiStyle,lang:c.lang,available:Vv(s.sampleCodeV2),code:c.code},i);return}k(c.code)}});const qv=`zeldaEasy.bailian-dash-workspace.space.listWorkspaces`;function Jv(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Yv(e){let t=Jv(e,`data`);if(!t)return e;let n=Jv(t,`DataV2`);if(n){let e=Jv(n,`data`);return(e?Jv(e,`data`):void 0)??e??n}return Jv(t,`data`)??t}function Xv(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(Pr(e),...r.map(e=>Pr(e[t])))),a=n.map((e,n)=>t.bold(j(e,i[n]))).join(` `),o=i.map(e=>t.dim(`─`.repeat(e))).join(`──`);process.stdout.write(a+`
2777
2776
  `),process.stdout.write(o+`
2778
2777
  `);for(let e of r){let n=e.map((e,n)=>n===2&&e===`Yes`?t.green(j(e,i[n])):j(e,i[n]));process.stdout.write(n.join(` `)+`
2779
2778
  `)}process.stdout.write(t.dim(`\nTotal: ${e.length}`)+`
2780
- `)}var av=w({description:{"en-US":`List all workspaces`,"zh-CN":`列出全部 Workspace`},auth:`console`,usageArgs:`[flags]`,flags:{list:{type:`string`,valueHint:`<n>`,description:{"en-US":`Limit number of results`,"zh-CN":`限制结果数量`}}},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:tv,data:{}},i);return}let a=rv(await e.client.console(tv,{})).data;if(!Array.isArray(a)||a.length===0){i===`json`?A([],i):process.stdout.write(`No workspace found.
2781
- `);return}let o=a;if(r>0&&(o=o.slice(0,r)),i===`json`){let e=o.map(e=>({workspaceId:e.workspaceId,name:e.agentName,default:e.defaultAgent}));A(e,i);return}iv(o)}});function ov(e,t){if(e==null)return`-`;let n=t??60;return n===1?`${H(e)}/s`:n===60?`${H(e)}/min`:`${H(e)}/${n}s`}function sv(e){return e?ov(e.request_limit,e.request_limit_period):`-`}function cv(e){return e?ov(e.usage_limit,e.usage_limit_period):`-`}function lv(e){return!e||e.async_user_queue_limit==null&&e.async_user_concurrency_limit==null?`-`:`${e.async_user_queue_limit==null?`-`:H(e.async_user_queue_limit)}/${e.async_user_concurrency_limit==null?`-`:H(e.async_user_concurrency_limit)}`}function uv(e,t){if(e.length===0){process.stdout.write(`No rate limits found.
2782
- `);return}let n=[`Model`,`Req Limit`,`Usage Limit`,`WS Req`,`WS Usage`,`Async Q/C`],r=e.map(e=>[e.model,sv(e.model_limit),cv(e.model_limit),sv(e.workspace_limit),cv(e.workspace_limit),lv(e.model_limit)]),i=Jr({headers:n,rows:r,align:[`left`,`right`,`right`,`right`,`right`,`right`]});for(let e of i)process.stdout.write(e+`
2783
- `);process.stdout.write(`\nTotal: ${t}\n`)}var dv=w({description:{"en-US":`View model rate limits (QPM/TPM, account and workspace level)`,"zh-CN":`查看模型限流配置(QPM/TPM,账号级和 Workspace 级)`},auth:`apiKey`,usageArgs:`[--model <model>] [--name <name>] [--page <n>] [--page-size <n>]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated (exact match)`,"zh-CN":`模型名称,多个以逗号分隔(精确匹配)`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy search by model name`,"zh-CN":`按模型名称模糊搜索`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 20)`,"zh-CN":`每页结果数(默认:20)`}}},exampleArgs:[``,`--model qwen3-max`,`--model qwen3-max,qwen-plus`,`--name qwen --page-size 50`,`--output json`],notes:[{"en-US":"Usage-vs-limit pressure checks live in `quota check` (console auth).","zh-CN":"用量与限流压力检查位于 `quota check`(Console 鉴权)。"}],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(sn());if(t.dryRun){if(r){let e=W(r).map(e=>({endpoint:o,method:`GET`,query:{model:e,page_size:100}}));A({requests:e},a)}else A({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(W(r).map(t=>e.client.requestJson({path:sn()+kh({model:t,page_size:100})})))).flatMap(e=>e.output?.quotas??[]),c=s.length;else{let t=await e.client.requestJson({path:sn()+kh({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}uv(s,c)}}),fv=w({description:{"en-US":`Update model rate limits (QPM/TPM)`,"zh-CN":`更新模型限流配置(QPM/TPM)`},auth:`apiKey`,usageArgs:`--model <model> [--rpm <n>] [--tpm <n>]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (required)`,"zh-CN":`模型名称(必填)`},required:!0},rpm:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max requests per minute (QPM)`,"zh-CN":`每分钟最大请求数(QPM)`}},tpm:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max tokens per minute (TPM)`,"zh-CN":`每分钟最大 Token 数(TPM)`}}},exampleArgs:[`--model qwen-plus --rpm 60 --tpm 100000`,`--model qwen3-max --tpm 500000`,`--model qwen-plus --rpm 60 --output json`],notes:[{"en-US":`Fields you omit keep their current values (server-side OVERLAY merge). Clear all custom limits with the "quota delete" command instead.`,"zh-CN":`未指定的字段将保留当前值(服务端 OVERLAY 合并)。清除全部自定义限流配置请改用 “quota delete” 命令。`},{"en-US":`Setting TPM without an existing QPM limit is rejected server-side — pass --rpm first or together.`,"zh-CN":`若当前没有 QPM 限制,单独设置 TPM 会被服务端拒绝——请先设置 --rpm,或同时传入。`}],validate:e=>{if(e.rpm===void 0&&e.tpm===void 0)return`one of --rpm / --tpm 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.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(sn()),method:`POST`,request:o},i);return}let s=await e.client.requestJson({path:sn(),method:`POST`,body:o});if(i===`json`){A({model:r,...s},i);return}let c=[];n.rpm!==void 0&&c.push(`QPM ${H(n.rpm)}`),n.tpm!==void 0&&c.push(`TPM ${H(n.tpm)}`),process.stdout.write(`Rate limits updated for "${r}": ${c.join(`, `)}\n`)}}),pv=w({description:{"en-US":`Clear all custom rate limits (QPM/TPM) for a model`,"zh-CN":`清除模型的所有自定义限流配置(QPM/TPM)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently clears all custom QPM/TPM rate limits for the specified model and cannot be undone.`,"zh-CN":`该操作会永久清除指定模型的所有自定义 QPM/TPM 限流配置,且无法撤销。`}},usageArgs:`--model <model>`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (required)`,"zh-CN":`模型名称(必填)`},required:!0}},exampleArgs:[`--model qwen-plus`,`--model qwen-plus --dry-run --output json`,`--model qwen-plus --yes`],async run(e){let{settings:t,flags:n}=e,r=n.model,i=T(t.output),a={models:[{model:r,operation_type:`DELETE`}]};if(t.dryRun){A({endpoint:e.client.url(sn()),method:`POST`,request:a},i);return}let o=await e.client.requestJson({path:sn(),method:`POST`,body:a});if(i===`json`){A({model:r,...o},i);return}process.stdout.write(`Rate limits cleared for "${r}".\n`)}});const mv=`zeldaEasy.broadscope-platform.modelInstance.listModelLimitApplications`;function hv(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function gv(e){let t=hv(e,`data`);if(!t)return e;let n=hv(t,`DataV2`);if(n){let e=hv(n,`data`);return(e?hv(e,`data`):void 0)??e??n}return hv(t,`data`)??t}function _v(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 vv(e,t){let n=O(process.stdout),r=[`Model`,`Token Limit`,`Applied At`],i=e.map(e=>[e.deployedModel,H(e.usageLimit),_v(e.gmtCreate)]),a=r.map((e,t)=>Math.max(jr(e),...i.map(e=>jr(e[t])))),o=r.map((e,t)=>n.bold(j(e,a[t]))).join(` `),s=a.map(e=>n.dim(`─`.repeat(e))).join(`──`);process.stdout.write(o+`
2779
+ `)}var Zv=w({description:{"en-US":`List all workspaces`,"zh-CN":`列出全部 Workspace`},auth:`console`,usageArgs:`[flags]`,flags:{list:{type:`string`,valueHint:`<n>`,description:{"en-US":`Limit number of results`,"zh-CN":`限制结果数量`}}},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:qv,data:{}},i);return}let a=Yv(await e.client.console(qv,{})).data;if(!Array.isArray(a)||a.length===0){i===`json`?A([],i):process.stdout.write(`No workspace found.
2780
+ `);return}let o=a;if(r>0&&(o=o.slice(0,r)),i===`json`){let e=o.map(e=>({workspaceId:e.workspaceId,name:e.agentName,default:e.defaultAgent}));A(e,i);return}Xv(o)}});function Qv(e,t){if(e==null)return`-`;let n=t??60;return n===1?`${U(e)}/s`:n===60?`${U(e)}/min`:`${U(e)}/${n}s`}function $v(e){return e?Qv(e.request_limit,e.request_limit_period):`-`}function ey(e){return e?Qv(e.usage_limit,e.usage_limit_period):`-`}function ty(e){return!e||e.async_user_queue_limit==null&&e.async_user_concurrency_limit==null?`-`:`${e.async_user_queue_limit==null?`-`:U(e.async_user_queue_limit)}/${e.async_user_concurrency_limit==null?`-`:U(e.async_user_concurrency_limit)}`}function ny(e,t){if(e.length===0){process.stdout.write(`No rate limits found.
2781
+ `);return}let n=[`Model`,`Req Limit`,`Usage Limit`,`WS Req`,`WS Usage`,`Async Q/C`],r=e.map(e=>[e.model,$v(e.model_limit),ey(e.model_limit),$v(e.workspace_limit),ey(e.workspace_limit),ty(e.model_limit)]),i=Zr({headers:n,rows:r,align:[`left`,`right`,`right`,`right`,`right`,`right`]});for(let e of i)process.stdout.write(e+`
2782
+ `);process.stdout.write(`\nTotal: ${t}\n`)}var ry=w({description:{"en-US":`View model rate limits (QPM/TPM, account and workspace level)`,"zh-CN":`查看模型限流配置(QPM/TPM,账号级和 Workspace 级)`},auth:`apiKey`,usageArgs:`[--model <model>] [--name <name>] [--page <n>] [--page-size <n>]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated (exact match)`,"zh-CN":`模型名称,多个以逗号分隔(精确匹配)`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy search by model name`,"zh-CN":`按模型名称模糊搜索`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 20)`,"zh-CN":`每页结果数(默认:20)`}}},exampleArgs:[``,`--model qwen3-max`,`--model qwen3-max,qwen-plus`,`--name qwen --page-size 50`,`--output json`],notes:[{"en-US":"Usage-vs-limit pressure checks live in `quota check` (console auth).","zh-CN":"用量与限流压力检查位于 `quota check`(Console 鉴权)。"}],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(ln());if(t.dryRun){if(r){let e=V(r).map(e=>({endpoint:o,method:`GET`,query:{model:e,page_size:100}}));A({requests:e},a)}else A({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(V(r).map(t=>e.client.requestJson({path:ln()+Lf({model:t,page_size:100})})))).flatMap(e=>e.output?.quotas??[]),c=s.length;else{let t=await e.client.requestJson({path:ln()+Lf({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}ny(s,c)}}),iy=w({description:{"en-US":`Update model rate limits (QPM/TPM)`,"zh-CN":`更新模型限流配置(QPM/TPM)`},auth:`apiKey`,usageArgs:`--model <model> [--rpm <n>] [--tpm <n>]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (required)`,"zh-CN":`模型名称(必填)`},required:!0},rpm:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max requests per minute (QPM)`,"zh-CN":`每分钟最大请求数(QPM)`}},tpm:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max tokens per minute (TPM)`,"zh-CN":`每分钟最大 Token 数(TPM)`}}},exampleArgs:[`--model qwen-plus --rpm 60 --tpm 100000`,`--model qwen3-max --tpm 500000`,`--model qwen-plus --rpm 60 --output json`],notes:[{"en-US":`Fields you omit keep their current values (server-side OVERLAY merge). Clear all custom limits with the "quota delete" command instead.`,"zh-CN":`未指定的字段将保留当前值(服务端 OVERLAY 合并)。清除全部自定义限流配置请改用 “quota delete” 命令。`},{"en-US":`Setting TPM without an existing QPM limit is rejected server-side — pass --rpm first or together.`,"zh-CN":`若当前没有 QPM 限制,单独设置 TPM 会被服务端拒绝——请先设置 --rpm,或同时传入。`}],validate:e=>{if(e.rpm===void 0&&e.tpm===void 0)return`one of --rpm / --tpm 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.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(ln()),method:`POST`,request:o},i);return}let s=await e.client.requestJson({path:ln(),method:`POST`,body:o});if(i===`json`){A({model:r,...s},i);return}let c=[];n.rpm!==void 0&&c.push(`QPM ${U(n.rpm)}`),n.tpm!==void 0&&c.push(`TPM ${U(n.tpm)}`),process.stdout.write(`Rate limits updated for "${r}": ${c.join(`, `)}\n`)}}),ay=w({description:{"en-US":`Clear all custom rate limits (QPM/TPM) for a model`,"zh-CN":`清除模型的所有自定义限流配置(QPM/TPM)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently clears all custom QPM/TPM rate limits for the specified model and cannot be undone.`,"zh-CN":`该操作会永久清除指定模型的所有自定义 QPM/TPM 限流配置,且无法撤销。`}},usageArgs:`--model <model>`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (required)`,"zh-CN":`模型名称(必填)`},required:!0}},exampleArgs:[`--model qwen-plus`,`--model qwen-plus --dry-run --output json`,`--model qwen-plus --yes`],async run(e){let{settings:t,flags:n}=e,r=n.model,i=T(t.output),a={models:[{model:r,operation_type:`DELETE`}]};if(t.dryRun){A({endpoint:e.client.url(ln()),method:`POST`,request:a},i);return}let o=await e.client.requestJson({path:ln(),method:`POST`,body:a});if(i===`json`){A({model:r,...o},i);return}process.stdout.write(`Rate limits cleared for "${r}".\n`)}});const oy=`zeldaEasy.broadscope-platform.modelInstance.listModelLimitApplications`;function sy(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function cy(e){let t=sy(e,`data`);if(!t)return e;let n=sy(t,`DataV2`);if(n){let e=sy(n,`data`);return(e?sy(e,`data`):void 0)??e??n}return sy(t,`data`)??t}function ly(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 uy(e,t){let n=O(process.stdout),r=[`Model`,`Token Limit`,`Applied At`],i=e.map(e=>[e.deployedModel,U(e.usageLimit),ly(e.gmtCreate)]),a=r.map((e,t)=>Math.max(Pr(e),...i.map(e=>Pr(e[t])))),o=r.map((e,t)=>n.bold(j(e,a[t]))).join(` `),s=a.map(e=>n.dim(`─`.repeat(e))).join(`──`);process.stdout.write(o+`
2784
2783
  `),process.stdout.write(s+`
2785
2784
  `);for(let e of i)process.stdout.write(e.map((e,t)=>j(e,a[t])).join(` `)+`
2786
2785
  `);process.stdout.write(n.dim(`\nTotal: ${t} records`)+`
2787
- `)}var yv=w({description:{"en-US":`View quota change history`,"zh-CN":`查看额度变更历史`},auth:`console`,usageArgs:`[flags]`,flags:{page:{type:`string`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`string`,valueHint:`<n>`,description:{"en-US":`Page size (default: 10)`,"zh-CN":`每页数量(默认:10)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by model name`,"zh-CN":`按模型名称筛选`}}},exampleArgs:[``,`--page 2`,`--page-size 20`,`--model qwen-turbo`,`--output json`],async run(e){let{identity:t,settings:r,flags:i}=e,a=Number(i.page)||1,o=Number(i.pageSize)||10,s=i.model||void 0,c=T(r.output),l={input:{pageNo:a,pageSize:o}};if(r.dryRun){A({api:mv,data:l},c);return}let u;try{u=await e.client.console(mv,l)}catch(e){throw e instanceof n&&e.message.includes(`NotLogined`)?new n(`session expired.`,f.AUTH,`Run \`${t.binName} auth login --console\` to re-authenticate.`):e}let d=gv(u),p=d.records??[],m=d.items??p.length;if(s&&(p=p.filter(e=>e.deployedModel===s)),c===`json`){let e=p.map(e=>({model:e.deployedModel,tokenLimit:e.usageLimit,appliedAt:_v(e.gmtCreate)}));A({records:e,total:s?p.length:m},c);return}if(p.length===0){process.stdout.write(`No quota change history found.
2788
- `);return}vv(p,s?p.length:m)}});const bv=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function xv(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function Sv(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 Cv(e){let t=[],n=1;for(;;){let r=await e.console(_,{input:{pageNo:n,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}),i=lr(r),a=i.list??[],o=i.total??0;if(t.push(...a),t.length>=o||a.length===0)break;n++}return t}async function wv(e,t,r){let i=Date.now(),a=i-r*60*1e3;try{let n=await e.console(bv,{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:t,resourceType:`model`},startTime:a,endTime:i}}),r=lr(n),o=r.data??r;if(!Array.isArray(o))return{rpm:0,tpm:0};let s=0,c=0;for(let e of o){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(s=Math.round(t)),e.metricName===`model_total_amount`&&(c=Math.round(t))}return{rpm:s,tpm:c}}catch(e){if(e instanceof n&&e.exitCode===f.AUTH)throw e;return{rpm:-1,tpm:-1}}}function Tv(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=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,``,``]}),c=Jr({headers:n,rows:s,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 c)process.stdout.write(e+`
2789
- `)}var Ev=w({description:{"en-US":`Check current usage against rate limits`,"zh-CN":`根据限流额度检查当前用量`},auth:`console`,usageArgs:`[--model <model>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},period:{type:`string`,valueHint:`<minutes>`,description:{"en-US":`Query usage for the last N minutes (default: 2)`,"zh-CN":`查询最近 N 分钟的用量(默认: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:[_,bv],...E(t)},a);return}let o=await Cv(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.
2790
- `);return}let s=await Promise.all(o.map(t=>wv(e.client,t.model,i))),c=o.map((e,t)=>{let n=e.qpmInfo,r=n[`model-default`],i=n[`user-spec`],a=xv(i,r?.count_limit_period)||xv(r),o=Sv(i,r?.usage_limit_period)||Sv(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}Tv(c)}});const Dv=`zeldaEasy.bailian-telemetry.platform-model.getModelStatistic`;function Ov(e,t,n){let r=O(process.stdout);process.stdout.write(`${r.dim(`Time Range:`)} ${U(t)} ~ ${U(n)}\n\n`);let i=e.callCount&&e.callFailedCount!=null?`${(e.callFailedCount/e.callCount*100).toFixed(2)}%`:`-`,a=[[`Models Called`,H(e.resourceCount??0)],[`Total Calls`,H(e.callCount??0)],[`Successful Calls`,H(e.callSuccessCount??0)],[`Failed Calls`,H(e.callFailedCount??0)],[`Failure Rate`,i],[`4xx Errors`,H(e.call4xxErrorCount??0)],[`5xx Errors`,H(e.call5xxErrorCount??0)],[`Avg Call Duration`,e.avgCallDuration==null?`-`:`${H(e.avgCallDuration)} ms`],[`Avg First Token Duration`,e.avgFirstTokenDuration==null?`-`:`${H(e.avgFirstTokenDuration)} ms`]];for(let t of e.usages??[])a.push([`${t.key}${t.unit?` [${t.unit}]`:``}`,H(t.value)]);let o=Math.max(...a.map(([e])=>jr(e)));for(let[e,t]of a)process.stdout.write(`${r.bold(j(e,o+2))}${t}\n`)}var kv=w({description:{"en-US":`Show aggregated model call statistics (calls, failures, latency, token usage)`,"zh-CN":`查看模型调用汇总统计(调用量、失败率、耗时、Token 用量)`},auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{...Ph,...$h},exampleArgs:[``,`--days 30`,`--model qwen3.6-plus`,`--model qwen3.6-plus --api-key-id 12345 --days 7`,`--output json`],notes:[{"en-US":`Only real-time (online) inference calls are counted in the overview.`,"zh-CN":`汇总统计仅覆盖实时(在线)推理调用。`}],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n),o={...tg(n,t.workspaceId),startTime:i,endTime:a};if(t.dryRun){A({api:Dv,data:{reqDTO:o},...E(t)},r);return}G(t);let s=await Mh(e.client,Dv,o);if(r===`json`){A({period:{start:U(i),end:U(a)},...s},r);return}Ov(s,i,a)}});const Av=`zeldaEasy.bailian-telemetry.platform-model.listModelStatisticData`,jv=[`modelAndWorkspaceId`,`callCount`,`callSuccessCount`,`callFailedCount`,`callFailedPercent`,`avgCallDuration`,`avgFirstTokenDuration`];function Mv(e,t,n){let r=O(process.stdout);if(process.stdout.write(`${r.dim(`Time Range:`)} ${U(t)} ~ ${U(n)}\n\n`),e.length===0){process.stdout.write(`No monitor data found.
2791
- `);return}let i=[`Model`,`API Key`,`Calls`,`Failed`,`Fail%`,`Avg Duration`,`Avg First Token`],a=e.map(e=>[e.model??`-`,e.apikeyId??`-`,H(e.callCount??0),H(e.callFailedCount??0),e.callFailedPercent==null?`-`:`${(e.callFailedPercent*100).toFixed(2)}%`,e.avgCallDuration==null?`-`:`${H(Math.round(e.avgCallDuration))} ms`,e.avgFirstTokenDuration==null?`-`:`${H(Math.round(e.avgFirstTokenDuration))} ms`]),o=Jr({headers:i,rows:a,align:[`left`,`left`,`right`,`right`,`right`,`right`,`right`],cellColor:(e,t,n)=>{if(t!==4||n===`-`)return;let i=Number.parseFloat(n);return i>=5?r.red(n):i>0?r.yellow(n):r.green(n)}});for(let e of o)process.stdout.write(e+`
2786
+ `)}var dy=w({description:{"en-US":`View quota change history`,"zh-CN":`查看额度变更历史`},auth:`console`,usageArgs:`[flags]`,flags:{page:{type:`string`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`string`,valueHint:`<n>`,description:{"en-US":`Page size (default: 10)`,"zh-CN":`每页数量(默认:10)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by model name`,"zh-CN":`按模型名称筛选`}}},exampleArgs:[``,`--page 2`,`--page-size 20`,`--model qwen-turbo`,`--output json`],async run(e){let{identity:t,settings:r,flags:i}=e,a=Number(i.page)||1,o=Number(i.pageSize)||10,s=i.model||void 0,c=T(r.output),l={input:{pageNo:a,pageSize:o}};if(r.dryRun){A({api:oy,data:l},c);return}let u;try{u=await e.client.console(oy,l)}catch(e){throw e instanceof n&&e.message.includes(`NotLogined`)?new n(`session expired.`,f.AUTH,`Run \`${t.binName} auth login --console\` to re-authenticate.`):e}let d=cy(u),p=d.records??[],m=d.items??p.length;if(s&&(p=p.filter(e=>e.deployedModel===s)),c===`json`){let e=p.map(e=>({model:e.deployedModel,tokenLimit:e.usageLimit,appliedAt:ly(e.gmtCreate)}));A({records:e,total:s?p.length:m},c);return}if(p.length===0){process.stdout.write(`No quota change history found.
2787
+ `);return}uy(p,s?p.length:m)}});const fy=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function py(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function my(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 hy(e){let t=[],n=1;for(;;){let r=await e.console(_,{input:{pageNo:n,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}),i=fr(r),a=i.list??[],o=i.total??0;if(t.push(...a),t.length>=o||a.length===0)break;n++}return t}async function gy(e,t,r){let i=Date.now(),a=i-r*60*1e3;try{let n=await e.console(fy,{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:t,resourceType:`model`},startTime:a,endTime:i}}),r=fr(n),o=r.data??r;if(!Array.isArray(o))return{rpm:0,tpm:0};let s=0,c=0;for(let e of o){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(s=Math.round(t)),e.metricName===`model_total_amount`&&(c=Math.round(t))}return{rpm:s,tpm:c}}catch(e){if(e instanceof n&&e.exitCode===f.AUTH)throw e;return{rpm:-1,tpm:-1}}}function _y(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=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,``,``]}),c=Zr({headers:n,rows:s,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 c)process.stdout.write(e+`
2788
+ `)}var vy=w({description:{"en-US":`Check current usage against rate limits`,"zh-CN":`根据限流额度检查当前用量`},auth:`console`,usageArgs:`[--model <model>] [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},period:{type:`string`,valueHint:`<minutes>`,description:{"en-US":`Query usage for the last N minutes (default: 2)`,"zh-CN":`查询最近 N 分钟的用量(默认: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:[_,fy],...E(t)},a);return}let o=await hy(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.
2789
+ `);return}let s=await Promise.all(o.map(t=>gy(e.client,t.model,i))),c=o.map((e,t)=>{let n=e.qpmInfo,r=n[`model-default`],i=n[`user-spec`],a=py(i,r?.count_limit_period)||py(r),o=my(i,r?.usage_limit_period)||my(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}_y(c)}});const yy=`zeldaEasy.bailian-telemetry.platform-model.getModelStatistic`;function by(e,t,n){let r=O(process.stdout);process.stdout.write(`${r.dim(`Time Range:`)} ${W(t)} ~ ${W(n)}\n\n`);let i=e.callCount&&e.callFailedCount!=null?`${(e.callFailedCount/e.callCount*100).toFixed(2)}%`:`-`,a=[[`Models Called`,U(e.resourceCount??0)],[`Total Calls`,U(e.callCount??0)],[`Successful Calls`,U(e.callSuccessCount??0)],[`Failed Calls`,U(e.callFailedCount??0)],[`Failure Rate`,i],[`4xx Errors`,U(e.call4xxErrorCount??0)],[`5xx Errors`,U(e.call5xxErrorCount??0)],[`Avg Call Duration`,e.avgCallDuration==null?`-`:`${U(e.avgCallDuration)} ms`],[`Avg First Token Duration`,e.avgFirstTokenDuration==null?`-`:`${U(e.avgFirstTokenDuration)} ms`]];for(let t of e.usages??[])a.push([`${t.key}${t.unit?` [${t.unit}]`:``}`,U(t.value)]);let o=Math.max(...a.map(([e])=>Pr(e)));for(let[e,t]of a)process.stdout.write(`${r.bold(j(e,o+2))}${t}\n`)}var xy=w({description:{"en-US":`Show aggregated model call statistics (calls, failures, latency, token usage)`,"zh-CN":`查看模型调用汇总统计(调用量、失败率、耗时、Token 用量)`},auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{...Eg,...Gg},exampleArgs:[``,`--days 30`,`--model qwen3.6-plus`,`--model qwen3.6-plus --api-key-id 12345 --days 7`,`--output json`],notes:[{"en-US":`Only real-time (online) inference calls are counted in the overview.`,"zh-CN":`汇总统计仅覆盖实时(在线)推理调用。`}],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n),o={...qg(n,t.workspaceId),startTime:i,endTime:a};if(t.dryRun){A({api:yy,data:{reqDTO:o},...E(t)},r);return}Tg(t);let s=await Cg(e.client,yy,o);if(r===`json`){A({period:{start:W(i),end:W(a)},...s},r);return}by(s,i,a)}});const Sy=`zeldaEasy.bailian-telemetry.platform-model.listModelStatisticData`,Cy=[`modelAndWorkspaceId`,`callCount`,`callSuccessCount`,`callFailedCount`,`callFailedPercent`,`avgCallDuration`,`avgFirstTokenDuration`];function wy(e,t,n){let r=O(process.stdout);if(process.stdout.write(`${r.dim(`Time Range:`)} ${W(t)} ~ ${W(n)}\n\n`),e.length===0){process.stdout.write(`No monitor data found.
2790
+ `);return}let i=[`Model`,`API Key`,`Calls`,`Failed`,`Fail%`,`Avg Duration`,`Avg First Token`],a=e.map(e=>[e.model??`-`,e.apikeyId??`-`,U(e.callCount??0),U(e.callFailedCount??0),e.callFailedPercent==null?`-`:`${(e.callFailedPercent*100).toFixed(2)}%`,e.avgCallDuration==null?`-`:`${U(Math.round(e.avgCallDuration))} ms`,e.avgFirstTokenDuration==null?`-`:`${U(Math.round(e.avgFirstTokenDuration))} ms`]),o=Zr({headers:i,rows:a,align:[`left`,`left`,`right`,`right`,`right`,`right`,`right`],cellColor:(e,t,n)=>{if(t!==4||n===`-`)return;let i=Number.parseFloat(n);return i>=5?r.red(n):i>0?r.yellow(n):r.green(n)}});for(let e of o)process.stdout.write(e+`
2792
2791
  `);process.stdout.write(r.dim(`\nTotal: ${e.length} rows`)+`
2793
- `)}var Nv=w({description:{"en-US":`List per-model / per-API-key call statistics with server-side sort and paging`,"zh-CN":`按模型 / API Key 维度查看调用明细统计(服务端排序与分页)`},auth:`console`,usageArgs:`[--model <model>] [--sort-by <field>] [flags]`,flags:{...Ph,...$h,sortBy:{type:`string`,valueHint:`<field>`,choices:jv,description:{"en-US":`Sort field (default: callCount)`,"zh-CN":`排序字段(默认:callCount)`}},order:{type:`string`,valueHint:`<order>`,choices:[`ASC`,`DESC`],description:{"en-US":`Sort order (default: DESC)`,"zh-CN":`排序方向(默认:DESC)`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page, 1-50 (default: 10)`,"zh-CN":`每页数量,范围 1-50(默认:10)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},notes:[{"en-US":`Only real-time (online) inference calls are counted in monitor statistics.`,"zh-CN":`监控统计仅覆盖实时(在线)推理调用。`}],exampleArgs:[``,`--model qwen3.6-plus --days 1`,`--sort-by callFailedPercent --order DESC`,`--max-results 50 --output json`],validate:e=>{if(e.maxResults!=null&&(e.maxResults<1||e.maxResults>50))return`--max-results must be between 1 and 50.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n),o={...tg(n,t.workspaceId),startTime:i,endTime:a,sortField:n.sortBy??`callCount`,sortOrder:n.order??`DESC`,maxResults:n.maxResults??10,skip:n.skip??0,nextToken:n.nextToken};if(t.dryRun){A({api:Av,data:{reqDTO:o},...E(t)},r);return}G(t);let s=await Mh(e.client,Av,o),c=(s.list??[]).filter(Boolean),l=s.nextToken;if(r===`json`){A({period:{start:U(i),end:U(a)},totalCount:s.totalCount??0,nextToken:l,list:c},r);return}Mv(c,i,a),l&&process.stdout.write(`Next page: --next-token ${l}\n`)}});const Pv=`zeldaEasy.bailian-telemetry.platform-model.getModelMonitorDataWithOss`,Fv=[`model_call_count`,`model_call_duration`,`model_first_token_duration`,`model_generation_duration_per_token`,`model_call_failed_count`,`model_call_4xx_count`,`model_call_5xx_count`,`model_call_429_count`,`model_call_data_inspection_failed_count`,`model_total_amount`,`model_input_amount`,`model_output_amount`,`model_usage`,`model_tps_per_request`,`model_cache_hit_percent`,`model_ptu_token_quota`,`model_ptu_usage_quota`,`model_ptu_total_tokens`,`model_ptu_quota`,`model_ptu_utilization`],Iv=[`sum`,`avg`,`max`,`min`,`p50`,`p95`,`p99`,`cumsum`,`cumavg`,`sum_pm`],Lv=/* @__PURE__ */ new Set([`model_call_failed_count`,`model_call_4xx_count`,`model_call_5xx_count`,`model_call_429_count`,`model_call_data_inspection_failed_count`]);function Rv(e){let t=e.labels?Object.entries(e.labels).map(([e,t])=>`${e}=${t}`).join(`,`):``,n=`${e.metricName} (${e.aggMethod})`;return t?`${n} {${t}}`:n}function zv(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No monitor data found.
2794
- `);return}for(let n of e){process.stdout.write(t.bold(Rv(n))+`
2792
+ `)}var Ty=w({description:{"en-US":`List per-model / per-API-key call statistics with server-side sort and paging`,"zh-CN":`按模型 / API Key 维度查看调用明细统计(服务端排序与分页)`},auth:`console`,usageArgs:`[--model <model>] [--sort-by <field>] [flags]`,flags:{...Eg,...Gg,sortBy:{type:`string`,valueHint:`<field>`,choices:Cy,description:{"en-US":`Sort field (default: callCount)`,"zh-CN":`排序字段(默认:callCount)`}},order:{type:`string`,valueHint:`<order>`,choices:[`ASC`,`DESC`],description:{"en-US":`Sort order (default: DESC)`,"zh-CN":`排序方向(默认:DESC)`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page, 1-50 (default: 10)`,"zh-CN":`每页数量,范围 1-50(默认:10)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},notes:[{"en-US":`Only real-time (online) inference calls are counted in monitor statistics.`,"zh-CN":`监控统计仅覆盖实时(在线)推理调用。`}],exampleArgs:[``,`--model qwen3.6-plus --days 1`,`--sort-by callFailedPercent --order DESC`,`--max-results 50 --output json`],validate:e=>{if(e.maxResults!=null&&(e.maxResults<1||e.maxResults>50))return`--max-results must be between 1 and 50.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n),o={...qg(n,t.workspaceId),startTime:i,endTime:a,sortField:n.sortBy??`callCount`,sortOrder:n.order??`DESC`,maxResults:n.maxResults??10,skip:n.skip??0,nextToken:n.nextToken};if(t.dryRun){A({api:Sy,data:{reqDTO:o},...E(t)},r);return}Tg(t);let s=await Cg(e.client,Sy,o),c=(s.list??[]).filter(Boolean),l=s.nextToken;if(r===`json`){A({period:{start:W(i),end:W(a)},totalCount:s.totalCount??0,nextToken:l,list:c},r);return}wy(c,i,a),l&&process.stdout.write(`Next page: --next-token ${l}\n`)}});const Ey=`zeldaEasy.bailian-telemetry.platform-model.getModelMonitorDataWithOss`,Dy=[`model_call_count`,`model_call_duration`,`model_first_token_duration`,`model_generation_duration_per_token`,`model_call_failed_count`,`model_call_4xx_count`,`model_call_5xx_count`,`model_call_429_count`,`model_call_data_inspection_failed_count`,`model_total_amount`,`model_input_amount`,`model_output_amount`,`model_usage`,`model_tps_per_request`,`model_cache_hit_percent`,`model_ptu_token_quota`,`model_ptu_usage_quota`,`model_ptu_total_tokens`,`model_ptu_quota`,`model_ptu_utilization`],Oy=[`sum`,`avg`,`max`,`min`,`p50`,`p95`,`p99`,`cumsum`,`cumavg`,`sum_pm`],ky=/* @__PURE__ */ new Set([`model_call_failed_count`,`model_call_4xx_count`,`model_call_5xx_count`,`model_call_429_count`,`model_call_data_inspection_failed_count`]);function Ay(e){let t=e.labels?Object.entries(e.labels).map(([e,t])=>`${e}=${t}`).join(`,`):``,n=`${e.metricName} (${e.aggMethod})`;return t?`${n} {${t}}`:n}function jy(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No monitor data found.
2793
+ `);return}for(let n of e){process.stdout.write(t.bold(Ay(n))+`
2795
2794
  `);let e=n.points??[];if(e.length===0){process.stdout.write(t.dim(` (no data points)`)+`
2796
2795
 
2797
- `);continue}for(let n of e)process.stdout.write(` ${t.dim(U(n.timestamp))} ${H(n.value)}\n`);process.stdout.write(`
2798
- `)}}var Bv=w({description:{"en-US":`Query time-series monitor metrics (RPM/TPM, latency percentiles, token usage)`,"zh-CN":`查询时序监控指标(RPM/TPM、耗时分位数、Token 用量等)`},auth:`console`,usageArgs:`--metric <name>[,<name>...] [flags]`,flags:{...Ph,...$h,metric:{type:`string`,valueHint:`<name>[,<name>...]`,required:!0,description:{"en-US":`Metric name(s), comma-separated; see notes for the full list`,"zh-CN":`指标名称,多个以逗号分隔;完整列表见下方说明`}},agg:{type:`string`,valueHint:`<method>`,choices:Iv,description:{"en-US":`Aggregation method applied to every metric (default: sum)`,"zh-CN":`应用于所有指标的聚合方式(默认:sum)`}},step:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Data point interval in seconds: 60, 3600 or 86400 (default: auto by time range)`,"zh-CN":`数据点间隔(秒):60、3600 或 86400,默认按时间范围自动选择`}}},notes:[{"en-US":`Metrics: ${Fv.join(`, `)}`,"zh-CN":`可用指标:${Fv.join(`、`)}`},{"en-US":`Only real-time (online) inference calls are counted in monitor statistics.`,"zh-CN":`监控统计仅覆盖实时(在线)推理调用。`}],exampleArgs:[`--metric model_call_count --days 1`,`--metric model_call_duration --agg p99 --model qwen3.6-plus --days 1`,`--metric model_call_count,model_call_failed_count --step 300 --start-time 2026-08-01`,`--metric model_total_amount --output json`],validate:e=>{let t=W(e.metric).filter(e=>!Fv.includes(e));if(t.length>0)return`Unknown metric: ${t.join(`, `)}. See notes for the full list.`;if(e.step!=null&&!zh.includes(e.step))return`--step must be one of ${zh.join(`, `)} seconds.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n),o=W(n.metric).map(e=>({metricName:e,aggMethod:n.agg??`sum`})),s={...tg(n,t.workspaceId),metricFilters:o,startTime:i,endTime:a,step:n.step??Bh(i,a)};if(t.dryRun){A({api:Pv,data:{reqDTO:s},...E(t)},r);return}G(t);let c=await Vh(await Mh(e.client,Pv,s))??[];if(r===`json`){A({period:{start:U(i),end:U(a)},step:s.step,series:c},r);return}zv(c),W(n.metric).some(e=>Lv.has(e))&&process.stdout.write(O(process.stdout).dim(`\nFor the error-code breakdown, run \`${e.identity.binName} monitor errors\`.\n`))}});const Vv=`zeldaEasy.bailian-telemetry.platform-model.getModelErrorCodeStatisticData`;function Hv(e){let t=e.result??e.list??e.data;return Array.isArray(t)?t:Array.isArray(e)?e:[]}function Uv(e,t,n){let r=O(process.stdout);if(process.stdout.write(`${r.dim(`Time Range:`)} ${U(t)} ~ ${U(n)}\n\n`),e.length===0){process.stdout.write(`No failures found in this range.
2799
- `);return}let i=Jr({headers:[`HTTP Status`,`Error Code`,`Calls`,`Percent`],rows:e.map(e=>[e.httpStatusCode??`-`,e.errorCode??`-`,H(e.callCount??0),e.callPercent==null?`-`:`${(e.callPercent*100).toFixed(2)}%`]),align:[`left`,`left`,`right`,`right`]});for(let e of i)process.stdout.write(e+`
2800
- `)}var Wv=w({description:{"en-US":`Show failure breakdown by HTTP status code and error code`,"zh-CN":`查看失败明细(按 HTTP 状态码与错误码统计分布)`},auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{...Ph,...$h},exampleArgs:[``,`--model qwen3.6-plus --days 1`,`--model qwen3.6-plus --api-key-id 12345`,`--output json`],notes:[{"en-US":`Only real-time (online) inference calls are counted in monitor statistics.`,"zh-CN":`监控统计仅覆盖实时(在线)推理调用。`}],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n),o={...tg(n,t.workspaceId),startTime:i,endTime:a};if(t.dryRun){A({api:Vv,data:{reqDTO:o},...E(t)},r);return}G(t);let s=Hv(await Mh(e.client,Vv,o));if(r===`json`){A({period:{start:U(i),end:U(a)},list:s},r);return}Uv(s,i,a)}});function Gv(e,t,n,r){let i=O(process.stdout),a=[[`CMS SLR Authorization`,e?`Authorized`:`Not authorized`],[`Service Open`,t.openStatus?`Yes`:`No`],[`Instance Status`,t.instanceStatus??`-`],[`Delivery Switch`,n===null?`Never configured`:n?`On`:`Off`]],o=t.instanceInfo;o&&(a.push([`Instance ID`,o.instanceId]),o.instanceName&&a.push([`Instance Name`,o.instanceName]),o.regionName&&a.push([`Region`,o.regionName]),a.push([`Instance URL`,o.instanceUrl]),o.gmtCreate&&a.push([`Created At`,U(o.gmtCreate)]));let s=Math.max(...a.map(([e])=>jr(e)));for(let[e,t]of a)process.stdout.write(`${i.bold(j(e,s+2))}${t}\n`);(!t.openStatus||n!==!0)&&process.stdout.write(i.dim(`\nRun \`${r} monitor delivery enable\` to activate monitoring delivery.\n`))}var Kv=w({description:{"en-US":`Show monitoring delivery (Prometheus instance) status`,"zh-CN":`查看监控数据投递(Prometheus 实例)状态`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t,identity:n}=e,r=T(t.output);G(t);let[i,a,o]=await Promise.all([Gh(e.client,`Cms`,t.workspaceId),Uh(e.client,`ModelMonitor`,t.workspaceId),Xh(e.client,`Monitor`,t.workspaceId)]);if(r===`json`){A({cmsSlrAuthorized:i,deliverySwitch:o,...a},r);return}Gv(i,a,o,n.binName)}});const qv=`zeldaEasy.bailian-telemetry.activate.initCmsService`,Jv=`zeldaEasy.bailian-telemetry.activate.initTelemetryStoreInstance`,Yv=`ModelMonitor`,Xv=`Monitor`;async function Zv(e,t,n){let r=Date.now()+12e4,i=await Uh(e,Yv,t);for(;Date.now()<r;){if(n(i))return i;await new Promise(e=>setTimeout(e,3e3)),i=await Uh(e,Yv,t)}return i}var Qv=w({description:{"en-US":`Activate monitoring delivery: CMS SLR authorization, CMS service, and the dedicated Prometheus instance`,"zh-CN":`开通监控数据投递:CMS SLR 授权、开通 CMS 服务、创建用户独享 Prometheus 实例`},auth:`console`,usageArgs:`[--no-wait] [flags]`,flags:{noWait:{type:`switch`,description:{"en-US":`Submit the activation requests and return without waiting for Ready`,"zh-CN":`提交开通请求后直接返回,不等待实例就绪`}}},notes:[{"en-US":`Steps: 1) authorize the CMS service-linked role, 2) open the CMS service (async, polled via openStatus), 3) create the dedicated Prometheus instance (async, polled until Ready), 4) turn on the monitor delivery switch for all models. Server-side throttles duplicate submissions within 30s.`,"zh-CN":`开通链路:1)授权 CMS 服务关联角色;2)开通 CMS 服务(异步,以 openStatus 为准);3)创建用户独享 Prometheus 实例(异步,等待 Ready);4)为全部模型打开监控投递开关。服务端对 30 秒内的重复提交做节流。`}],exampleArgs:[``,`--no-wait`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=O(process.stderr);if(t.dryRun){A({apis:[`zeldaEasy.bailian-telemetry.activate.getTelemetrySlrStatus`,`zeldaEasy.bailian-telemetry.activate.createTelemetrySlr`,Hh,qv,Jv,qh],data:{reqDTO:{...t.workspaceId?{workspaceId:t.workspaceId}:{},slrType:`Cms`,serviceType:Yv,telemetryType:Xv}},...E(t)},r);return}G(t);let[a,o]=await Promise.all([Uh(e.client,Yv,t.workspaceId),Xh(e.client,Xv,t.workspaceId)]);if(a.openStatus&&a.instanceStatus===`Ready`&&o===!0){r===`json`?A({activated:!0,alreadyActive:!0,...a},r):process.stdout.write(`Monitoring delivery is already active.
2801
- `);return}if(await Kh(e.client,`Cms`,t.workspaceId,{onProgress:e=>process.stderr.write(i.dim(e+`
2796
+ `);continue}for(let n of e)process.stdout.write(` ${t.dim(W(n.timestamp))} ${U(n.value)}\n`);process.stdout.write(`
2797
+ `)}}var My=w({description:{"en-US":`Query time-series monitor metrics (RPM/TPM, latency percentiles, token usage)`,"zh-CN":`查询时序监控指标(RPM/TPM、耗时分位数、Token 用量等)`},auth:`console`,usageArgs:`--metric <name>[,<name>...] [flags]`,flags:{...Eg,...Gg,metric:{type:`string`,valueHint:`<name>[,<name>...]`,required:!0,description:{"en-US":`Metric name(s), comma-separated; see notes for the full list`,"zh-CN":`指标名称,多个以逗号分隔;完整列表见下方说明`}},agg:{type:`string`,valueHint:`<method>`,choices:Oy,description:{"en-US":`Aggregation method applied to every metric (default: sum)`,"zh-CN":`应用于所有指标的聚合方式(默认:sum)`}},step:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Data point interval in seconds: 60, 3600 or 86400 (default: auto by time range)`,"zh-CN":`数据点间隔(秒):60、3600 或 86400,默认按时间范围自动选择`}}},notes:[{"en-US":`Metrics: ${Dy.join(`, `)}`,"zh-CN":`可用指标:${Dy.join(`、`)}`},{"en-US":`Only real-time (online) inference calls are counted in monitor statistics.`,"zh-CN":`监控统计仅覆盖实时(在线)推理调用。`}],exampleArgs:[`--metric model_call_count --days 1`,`--metric model_call_duration --agg p99 --model qwen3.6-plus --days 1`,`--metric model_call_count,model_call_failed_count --step 300 --start-time 2026-08-01`,`--metric model_total_amount --output json`],validate:e=>{let t=V(e.metric).filter(e=>!Dy.includes(e));if(t.length>0)return`Unknown metric: ${t.join(`, `)}. See notes for the full list.`;if(e.step!=null&&!jg.includes(e.step))return`--step must be one of ${jg.join(`, `)} seconds.`},async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n),o=V(n.metric).map(e=>({metricName:e,aggMethod:n.agg??`sum`})),s={...qg(n,t.workspaceId),metricFilters:o,startTime:i,endTime:a,step:n.step??Mg(i,a)};if(t.dryRun){A({api:Ey,data:{reqDTO:s},...E(t)},r);return}Tg(t);let c=await Ng(await Cg(e.client,Ey,s))??[];if(r===`json`){A({period:{start:W(i),end:W(a)},step:s.step,series:c},r);return}jy(c),V(n.metric).some(e=>ky.has(e))&&process.stdout.write(O(process.stdout).dim(`\nFor the error-code breakdown, run \`${e.identity.binName} monitor errors\`.\n`))}});const Ny=`zeldaEasy.bailian-telemetry.platform-model.getModelErrorCodeStatisticData`;function Py(e){let t=e.result??e.list??e.data;return Array.isArray(t)?t:Array.isArray(e)?e:[]}function Fy(e,t,n){let r=O(process.stdout);if(process.stdout.write(`${r.dim(`Time Range:`)} ${W(t)} ~ ${W(n)}\n\n`),e.length===0){process.stdout.write(`No failures found in this range.
2798
+ `);return}let i=Zr({headers:[`HTTP Status`,`Error Code`,`Calls`,`Percent`],rows:e.map(e=>[e.httpStatusCode??`-`,e.errorCode??`-`,U(e.callCount??0),e.callPercent==null?`-`:`${(e.callPercent*100).toFixed(2)}%`]),align:[`left`,`left`,`right`,`right`]});for(let e of i)process.stdout.write(e+`
2799
+ `)}var Iy=w({description:{"en-US":`Show failure breakdown by HTTP status code and error code`,"zh-CN":`查看失败明细(按 HTTP 状态码与错误码统计分布)`},auth:`console`,usageArgs:`[--model <model>] [--days <days>] [flags]`,flags:{...Eg,...Gg},exampleArgs:[``,`--model qwen3.6-plus --days 1`,`--model qwen3.6-plus --api-key-id 12345`,`--output json`],notes:[{"en-US":`Only real-time (online) inference calls are counted in monitor statistics.`,"zh-CN":`监控统计仅覆盖实时(在线)推理调用。`}],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n),o={...qg(n,t.workspaceId),startTime:i,endTime:a};if(t.dryRun){A({api:Ny,data:{reqDTO:o},...E(t)},r);return}Tg(t);let s=Py(await Cg(e.client,Ny,o));if(r===`json`){A({period:{start:W(i),end:W(a)},list:s},r);return}Fy(s,i,a)}});function Ly(e,t,n,r){let i=O(process.stdout),a=[[`CMS SLR Authorization`,e?`Authorized`:`Not authorized`],[`Service Open`,t.openStatus?`Yes`:`No`],[`Instance Status`,t.instanceStatus??`-`],[`Delivery Switch`,n===null?`Never configured`:n?`On`:`Off`]],o=t.instanceInfo;o&&(a.push([`Instance ID`,o.instanceId]),o.instanceName&&a.push([`Instance Name`,o.instanceName]),o.regionName&&a.push([`Region`,o.regionName]),a.push([`Instance URL`,o.instanceUrl]),o.gmtCreate&&a.push([`Created At`,W(o.gmtCreate)]));let s=Math.max(...a.map(([e])=>Pr(e)));for(let[e,t]of a)process.stdout.write(`${i.bold(j(e,s+2))}${t}\n`);(!t.openStatus||n!==!0)&&process.stdout.write(i.dim(`\nRun \`${r} monitor delivery enable\` to activate monitoring delivery.\n`))}var Ry=w({description:{"en-US":`Show monitoring delivery (Prometheus instance) status`,"zh-CN":`查看监控数据投递(Prometheus 实例)状态`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t,identity:n}=e,r=T(t.output);Tg(t);let[i,a,o]=await Promise.all([Lg(e.client,`Cms`,t.workspaceId),Fg(e.client,`ModelMonitor`,t.workspaceId),Hg(e.client,`Monitor`,t.workspaceId)]);if(r===`json`){A({cmsSlrAuthorized:i,deliverySwitch:o,...a},r);return}Ly(i,a,o,n.binName)}});const zy=`zeldaEasy.bailian-telemetry.activate.initCmsService`,By=`zeldaEasy.bailian-telemetry.activate.initTelemetryStoreInstance`,Vy=`ModelMonitor`,Hy=`Monitor`;async function Uy(e,t,n){let r=Date.now()+12e4,i=await Fg(e,Vy,t);for(;Date.now()<r;){if(n(i))return i;await new Promise(e=>setTimeout(e,3e3)),i=await Fg(e,Vy,t)}return i}var Wy=w({description:{"en-US":`Activate monitoring delivery: CMS SLR authorization, CMS service, and the dedicated Prometheus instance`,"zh-CN":`开通监控数据投递:CMS SLR 授权、开通 CMS 服务、创建用户独享 Prometheus 实例`},auth:`console`,usageArgs:`[--no-wait] [flags]`,flags:{noWait:{type:`switch`,description:{"en-US":`Submit the activation requests and return without waiting for Ready`,"zh-CN":`提交开通请求后直接返回,不等待实例就绪`}}},notes:[{"en-US":`Steps: 1) authorize the CMS service-linked role, 2) open the CMS service (async, polled via openStatus), 3) create the dedicated Prometheus instance (async, polled until Ready), 4) turn on the monitor delivery switch for all models. Server-side throttles duplicate submissions within 30s.`,"zh-CN":`开通链路:1)授权 CMS 服务关联角色;2)开通 CMS 服务(异步,以 openStatus 为准);3)创建用户独享 Prometheus 实例(异步,等待 Ready);4)为全部模型打开监控投递开关。服务端对 30 秒内的重复提交做节流。`}],exampleArgs:[``,`--no-wait`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=O(process.stderr);if(t.dryRun){A({apis:[`zeldaEasy.bailian-telemetry.activate.getTelemetrySlrStatus`,`zeldaEasy.bailian-telemetry.activate.createTelemetrySlr`,Pg,zy,By,zg],data:{reqDTO:{...t.workspaceId?{workspaceId:t.workspaceId}:{},slrType:`Cms`,serviceType:Vy,telemetryType:Hy}},...E(t)},r);return}Tg(t);let[a,o]=await Promise.all([Fg(e.client,Vy,t.workspaceId),Hg(e.client,Hy,t.workspaceId)]);if(a.openStatus&&a.instanceStatus===`Ready`&&o===!0){r===`json`?A({activated:!0,alreadyActive:!0,...a},r):process.stdout.write(`Monitoring delivery is already active.
2800
+ `);return}if(await Rg(e.client,`Cms`,t.workspaceId,{onProgress:e=>process.stderr.write(i.dim(e+`
2802
2801
  `))}),a.openStatus||(process.stderr.write(i.dim(`Opening the CMS service...
2803
- `)),await e.client.console(qv,{reqDTO:{...t.workspaceId?{workspaceId:t.workspaceId}:{},slrType:`Cms`}}),n.noWait||(a=await Zv(e.client,t.workspaceId,e=>e.openStatus))),a.instanceStatus===`NotExist`&&(process.stderr.write(i.dim(`Creating the dedicated Prometheus instance...
2804
- `)),await Mh(e.client,Jv,{...t.workspaceId?{workspaceId:t.workspaceId}:{},serviceType:Yv})),n.noWait){r===`json`?A({activated:!1,submitted:!0},r):process.stdout.write(`Activation submitted. Run \`${e.identity.binName} monitor delivery status\` to check progress.\n`);return}process.stderr.write(i.dim(`Waiting for the Prometheus instance to become ready...
2805
- `));let s=await Zv(e.client,t.workspaceId,e=>e.openStatus&&e.instanceStatus===`Ready`);s.openStatus&&s.instanceStatus===`Ready`&&o!==!0&&(process.stderr.write(i.dim(`Turning on the monitor delivery switch...
2806
- `)),await e.client.console(qh,{reqDTO:Zh(t,Xv)}));let c=s.openStatus&&s.instanceStatus===`Ready`;if(r===`json`){A({activated:c,...s},r);return}c?(process.stdout.write(`Monitoring delivery is active.
2807
- `),s.instanceInfo&&(process.stdout.write(`Instance: ${s.instanceInfo.instanceId}\n`),process.stdout.write(`URL: ${s.instanceInfo.instanceUrl}\n`))):process.stdout.write(`Activation is still in progress. Run \`${e.identity.binName} monitor delivery status\` to check later.\n`)}});const $v=`Monitor`;var ey=w({description:{"en-US":`Disable monitor delivery for all models in the workspace`,"zh-CN":`关闭当前业务空间全部模型的监控数据投递`},auth:`console`,usageArgs:`[flags]`,notes:[{"en-US":"Only the delivery switch is turned off; the CMS service and the Prometheus instance (with stored data) are kept. Re-enable with `monitor delivery enable`.","zh-CN":"仅关闭投递开关;CMS 服务与 Prometheus 实例(含已存储数据)保留。可用 `monitor delivery enable` 重新开启。"}],exampleArgs:[``,`--dry-run`,`--output json`],async run(e){let{settings:t}=e,n=T(t.output);if(t.dryRun){A({api:Jh,data:{reqDTO:Zh(t,$v)},...E(t)},n);return}if(G(t),await e.client.console(Jh,{reqDTO:Zh(t,$v)}),n===`json`){A({disabled:!0},n);return}process.stdout.write(`Monitor delivery disabled.
2808
- `)}});function ty(e){if(!e)return{};if(typeof e==`string`)try{return JSON.parse(e)}catch{return{}}return e}const ny=[`SUCCESS`,`CLIENT_ERROR`,`SERVER_ERROR`,`CANCEL`];function ry(e){if(!e)return;let t=W(e).filter(e=>!ny.includes(e));if(t.length>0)return`Unknown status code type: ${t.join(`, `)}. Valid: ${ny.join(`, `)}.`}const iy={min:32,max:36};function ay(e){let t=e.length;if(t<iy.min||t>iy.max)return`--request-id must be ${iy.min}-${iy.max} characters.`}function oy(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No logs found in this range.
2809
- `);return}let n=Jr({headers:[`Time`,`Request ID`,`Model`,`Status`,`Duration`,`First Token`,`Tokens`],rows:e.map(e=>{let t=ty(e.usage),n=t.input_tokens!=null||t.output_tokens!=null?`${t.input_tokens??`-`}/${t.output_tokens??`-`}`:`-`;return[U(e.startTime),e.modelRequestId??`-`,e.model??`-`,e.httpStatusCode==null?`-`:String(e.httpStatusCode),e.callDuration==null?`-`:`${H(e.callDuration)} ms`,e.firstTokenDuration==null?`-`:`${H(e.firstTokenDuration)} ms`,n]}),align:[`left`,`left`,`left`,`right`,`right`,`right`,`right`],cellColor:(e,n,r)=>{if(n===3){if(r.startsWith(`2`))return t.green(r);if(r.startsWith(`5`))return t.red(r);if(r!==`-`)return t.yellow(r)}}});for(let e of n)process.stdout.write(e+`
2810
- `)}function sy(e){let t=O(process.stdout),n=ty(e.usage),r=[[`Request ID`,e.modelRequestId],[`Model`,e.model??`-`],[`Time`,e.startTime?U(e.startTime):`-`],[`Status`,e.httpStatusCode==null?`-`:String(e.httpStatusCode)],[`Duration`,e.callDuration==null?`-`:`${e.callDuration} ms`],[`First Token`,e.firstTokenDuration==null?`-`:`${e.firstTokenDuration} ms`],[`Tokens (in/out/total)`,`${n.input_tokens??`-`}/${n.output_tokens??`-`}/${n.total_tokens??`-`}`]];e.apikeyId&&r.push([`API Key ID`,e.apikeyId]),e.errorCode&&r.push([`Error Code`,e.errorCode]),e.errorMessage&&r.push([`Error Message`,e.errorMessage]);for(let[e,n]of r)process.stdout.write(`${t.bold(e)}: ${n}\n`);e.request&&process.stdout.write(`\n${t.bold(`Request:`)}\n${e.request}\n`),e.response&&process.stdout.write(`\n${t.bold(`Response:`)}\n${e.response}\n`)}const cy={audit:`AuditLog`,inference:`InferenceLog`},ly=`zeldaEasy.bailian-telemetry.activate.initTelemetryStoreInstance`;async function uy(e,t,n){return Xh(e,cy[t],n)}async function dy(e,t,r){let i=await uy(e,`audit`,t);for(let n=0;n<3&&i!==!0;n+=1)await new Promise(e=>setTimeout(e,2e3)),i=await uy(e,`audit`,t);if(i!==!0)throw new n(`Model audit log is not enabled yet.`,f.USAGE,`Inference log delivery requires the audit log. Run \`${r} log audit enable\` first, then check \`${r} log status\`.`)}function fy(e,t){return Zh(e,cy[t])}async function py(e,t,n){let{client:r,settings:i,format:a}=e,o=O(process.stderr);if(i.dryRun){A({apis:[`zeldaEasy.bailian-telemetry.activate.createTelemetrySlr`,ly,qh],data:{reqDTO:fy(i,t)},...E(i)},a);return}G(i),await Kh(r,`Log`,i.workspaceId,{pollRetries:5,onProgress:e=>process.stderr.write(o.dim(e+`
2811
- `))});let s=await Uh(r,n,i.workspaceId);if(s.instanceStatus===`NotExist`&&(process.stderr.write(o.dim(`Initializing the SLS store instance...
2812
- `)),await Mh(r,ly,{...i.workspaceId?{workspaceId:i.workspaceId}:{},serviceType:n}),!e.noWait)){process.stderr.write(o.dim(`Waiting for the SLS instance to become ready...
2813
- `));let e=Date.now()+18e4;for(;Date.now()<e&&s.instanceStatus!==`Ready`;)await new Promise(e=>setTimeout(e,3e3)),s=await Uh(r,n,i.workspaceId)}if(await r.console(qh,{reqDTO:fy(i,t)}),a===`json`){A({enabled:!0,kind:t,instanceStatus:s.instanceStatus},a);return}process.stdout.write(`${t===`audit`?`Audit`:`Inference`} log delivery enabled.\n`),e.noWait&&process.stdout.write(`The SLS instance may still be initializing; check \`${e.binName} log status\` later.\n`)}async function my(e,t,r){let{client:i,settings:a,format:o}=e;if(a.dryRun){A({api:Jh,data:{reqDTO:fy(a,t)},...E(a)},o);return}if(G(a),r&&await uy(i,`inference`,a.workspaceId)===!0)throw new n(`The audit log cannot be disabled while the inference log is enabled.`,f.USAGE,`Run \`${e.binName} log inference disable\` first, then disable the audit log.`);if(await i.console(Jh,{reqDTO:fy(a,t)}),o===`json`){A({disabled:!0,kind:t},o);return}process.stdout.write(`${t===`audit`?`Audit`:`Inference`} log delivery disabled.\n`)}const hy={noWait:{type:`switch`,description:{"en-US":`Return right after submitting, without waiting for the SLS instance`,"zh-CN":`提交后立即返回,不等待 SLS 实例就绪`}}};function gy(e){if(e!=null&&e<=0)return`--hours must be positive.`}const _y=`zeldaEasy.bailian-telemetry.model.countModelLogs`;async function vy(e,t,n,r){let{settings:i}=e,a=T(i.output),{startTime:o,endTime:s}=r(),c={...i.workspaceId?{workspaceId:i.workspaceId,filterWorkspaceId:i.workspaceId}:{},startTime:o,endTime:s,telemetryType:cy[t],models:n.model?W(n.model):void 0,apikeyIds:n.apiKeyId?W(n.apiKeyId):void 0};if(i.dryRun){A({api:_y,data:{reqDTO:c},...E(i)},a);return}G(i);let l=Rh(await e.client.console(_y,{reqDTO:c}));if(a===`json`){A({kind:t,period:{start:U(o),end:U(s)},count:l},a);return}process.stdout.write(`${t===`audit`?`Audit`:`Inference`} logs: ${H(l)} (${U(o)} ~ ${U(s)})\n`)}const yy={audit:`ModelAuditLog`,inference:`ModelInferenceLog`};async function by(e,t){let[n,r,i,a,o]=await Promise.all([e.console(`zeldaEasy.bailian-telemetry.activate.getTelemetrySlrStatus`,{reqDTO:{...t?{workspaceId:t}:{},slrType:`Log`}}),Uh(e,yy.audit,t),Uh(e,yy.inference,t),uy(e,`audit`,t),uy(e,`inference`,t)]);return{slrAuthorized:Rh(n)===!0,audit:r,inference:i,auditSwitch:a,inferenceSwitch:o}}function xy(e){return e.openStatus?e.instanceStatus??`-`:`Not activated`}function Sy(e){return e===null?`Never configured`:e?`On`:`Off`}var Cy=w({description:{"en-US":`Show model log delivery status (SLS authorization, audit / inference service and switches)`,"zh-CN":`查看模型日志投递状态(SLS 授权、审计 / 推理日志的服务与开关状态)`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],notes:[{"en-US":`Both log kinds have independent switches; the inference log additionally requires the audit log to stay on.`,"zh-CN":`审计与推理日志各有独立开关;推理日志还要求审计日志保持开启。`}],async run(e){let{settings:t,identity:n}=e,r=T(t.output);G(t);let i=await by(e.client,t.workspaceId);if(r===`json`){A(i,r);return}let a=O(process.stdout),o=[[`SLS Authorization (SLR)`,i.slrAuthorized?`Authorized`:`Not authorized`],[`Audit Log (service)`,xy(i.audit)],[`Audit Log (switch)`,Sy(i.auditSwitch)],[`Inference Log (service)`,xy(i.inference)],[`Inference Log (switch)`,Sy(i.inferenceSwitch)]],s=i.inference.instanceInfo?.instanceUrl;s&&o.push([`SLS Instance URL`,s]);let c=Math.max(...o.map(([e])=>jr(e)));for(let[e,t]of o)process.stdout.write(`${a.bold(j(e,c+2))}${t}\n`);i.auditSwitch===!0?i.inferenceSwitch!==!0&&process.stdout.write(a.dim(`\nRun \`${n.binName} log inference enable\` to enable inference log delivery.\n`)):process.stdout.write(a.dim(`\nRun \`${n.binName} log audit enable\` to enable audit log delivery.\n`))}});const wy=`zeldaEasy.bailian-telemetry.platform-model.listModelLogs`;var Ty=w({description:{"en-US":`Query model audit logs (call metadata; request/response content is not recorded)`,"zh-CN":`查询模型审计日志(调用元数据;不含请求/响应内容)`},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...Lh,...Qh,requestId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact model request ID`,"zh-CN":`精确匹配模型请求 ID`}},statusCode:{type:`string`,valueHint:`<type>`,description:{"en-US":`Status filter(s), comma-separated: SUCCESS, CLIENT_ERROR, SERVER_ERROR, CANCEL`,"zh-CN":`状态过滤,多个以逗号分隔:SUCCESS、CLIENT_ERROR、SERVER_ERROR、CANCEL`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},exampleArgs:[``,`--model qwen3.6-plus --hours 3`,`--status-code SERVER_ERROR,CLIENT_ERROR`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--output json`],notes:[{"en-US":"Audit logs carry call metadata only. For full request/response content, enable and query the inference log (`log inference list` / `log inference get`).","zh-CN":"审计日志只记录调用元数据。需要完整请求/响应内容时,请开启并查询推理日志(`log inference list` / `log inference get`)。"}],validate:e=>ry(e.statusCode)??gy(e.hours),async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n,1/24),o={...tg(n,t.workspaceId),filterWorkspaceId:t.workspaceId,startTime:i,endTime:a,maxResults:n.maxResults??20,skip:n.skip??0,nextToken:n.nextToken,modelRequestId:n.requestId,needFullContent:!1,statusCodeTypes:n.statusCode?W(n.statusCode):void 0};if(t.dryRun){A({api:wy,data:{reqDTO:o},...E(t)},r);return}G(t);let s=await Mh(e.client,wy,o),c=s.list??[],l=s.nextToken;if(r===`json`){A({totalCount:s.totalCount??0,nextToken:l,list:c},r);return}oy(c),l&&process.stdout.write(`Next page: --next-token ${l}\n`)}}),Ey=w({description:{"en-US":`Show a single audit log entry with its raw origin record`,"zh-CN":`查看单条审计日志详情(含原始审计记录)`},auth:`console`,usageArgs:`--request-id <id> [flags]`,flags:{...Lh,requestId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Model request ID (from `log audit list`)","zh-CN":`模型请求 ID(可由 log audit list 获得)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (narrows the search)`,"zh-CN":`模型名称(缩小查询范围)`}}},exampleArgs:[`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --hours 24`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --output json`],notes:[{"en-US":"Audit entries carry call metadata plus the raw audit record; request/response content lives in the inference log (`log inference get`).","zh-CN":"审计详情包含调用元数据与原始审计记录;请求/响应内容在推理日志中(`log inference get`)。"}],validate:e=>ay(e.requestId)??gy(e.hours),async run(e){let{settings:t,flags:r}=e,i=T(t.output),{startTime:a,endTime:o}=Ih(r,1),s={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},startTime:a,endTime:o,modelRequestId:r.requestId,maxResults:1,skip:0,needFullContent:!1};if(r.model&&(s.models=[r.model]),t.dryRun){A({api:wy,data:{reqDTO:s},...E(t)},i);return}G(t);let c=((await Mh(e.client,`zeldaEasy.bailian-telemetry.platform-model.listModelLogs`,s)).list??[])[0];if(!c)throw new n(`No audit log found for request ${r.requestId} in the selected range.`,f.GENERAL,`Widen the window with --hours/--start-time, or check the request ID.`);if(i===`json`){A(c,i);return}sy(c),c.originLog&&process.stdout.write(`\n${O(process.stdout).bold(`Origin record:`)}\n${JSON.stringify(c.originLog,null,2)}\n`)}});const Dy={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID(s), comma-separated`,"zh-CN":`API Key ID,多个以逗号分隔`}}};var Oy=w({description:{"en-US":`Count model audit logs in a time range (useful before exporting)`,"zh-CN":`统计时间范围内的模型审计日志条数(导出前预估量级)`},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...Lh,...Dy},exampleArgs:[``,`--model qwen3.6-plus --hours 24`,`--output json`],validate:e=>gy(e.hours),async run(e){await vy(e,`audit`,e.flags,()=>Ih(e.flags,1/24))}}),ky=w({description:{"en-US":`Enable audit log delivery to SLS (SLR authorization → SLS instance → log switch)`,"zh-CN":`开启审计日志投递到 SLS(SLR 授权 → SLS 实例初始化 → 打开日志开关)`},auth:`console`,usageArgs:`[--no-wait] [flags]`,flags:hy,notes:[{"en-US":`Steps: 1) authorize the SLS service-linked role, 2) initialize the SLS store instance (async), 3) turn on audit log delivery for all models in the workspace.`,"zh-CN":`开启链路:1)授权 SLS 服务关联角色;2)初始化 SLS 存储实例(异步);3)为当前业务空间全部模型打开审计日志开关。`},{"en-US":`The audit log records call metadata only and is required before enabling the inference log.`,"zh-CN":`审计日志只记录调用元数据,且是开启推理日志的前置条件。`}],exampleArgs:[``,`--no-wait`,`--output json`],async run(e){let t=T(e.settings.output);await py({client:e.client,settings:e.settings,binName:e.identity.binName,format:t,noWait:e.flags.noWait},`audit`,yy.audit)}}),Ay=w({description:{"en-US":`Disable audit log delivery for all models in the workspace`,"zh-CN":`关闭当前业务空间全部模型的审计日志投递`},auth:`console`,usageArgs:`[flags]`,notes:[{"en-US":`Refused while the inference log is still enabled — disable the inference log first (the console enforces the same rule).`,"zh-CN":`推理日志仍开启时不允许单独关闭审计日志——请先关闭推理日志(与控制台规则一致)。`}],exampleArgs:[``,`--dry-run`,`--output json`],async run(e){let t=T(e.settings.output);await my({client:e.client,settings:e.settings,binName:e.identity.binName,format:t},`audit`,!0)}});const jy=`zeldaEasy.bailian-telemetry.model.listModelLogs`,My=[`SUCCESS`,`CLIENT_ERROR`,`SERVER_ERROR`,`CANCEL`];var Ny=w({description:{"en-US":"Query model inference logs (requires inference log delivery; use `log inference get` for request/response content)","zh-CN":"查询模型推理日志(需已开启推理日志投递;请求/响应内容请用 `log inference get` 查看)"},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...Lh,model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (the inference log API accepts a single model)`,"zh-CN":`模型名称(推理日志接口仅支持单个模型)`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID (the inference log API accepts a single ID)`,"zh-CN":`API Key ID(推理日志接口仅支持单个 ID)`}},callSource:{type:`string`,valueHint:`<type>`,choices:[`Online`,`Offline`],description:{"en-US":`Inference type: Online, Offline`,"zh-CN":`推理类型:Online、Offline`}},requestId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact model request ID`,"zh-CN":`精确匹配模型请求 ID`}},statusCode:{type:`string`,valueHint:`<type>`,description:{"en-US":`Status filter(s), comma-separated: ${My.join(`, `)}`,"zh-CN":`状态过滤,多个以逗号分隔:${My.join(`、`)}`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}}},exampleArgs:[``,`--model qwen3.6-plus --hours 3`,`--status-code SERVER_ERROR,CLIENT_ERROR`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--output json`],notes:[{"en-US":"Requires inference log delivery (`log inference enable`), which itself requires the audit log. Entries here mirror the audit trail; full request/response content is fetched per request via `log inference get`.","zh-CN":"需先开启推理日志投递(`log inference enable`),且推理日志依赖审计日志。列表与审计口径同构;完整请求/响应内容按请求 ID 通过 `log inference get` 回捞。"}],validate:e=>ry(e.statusCode)??gy(e.hours),async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n,1/24),o={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},startTime:String(i),endTime:String(a),model:n.model,apikeyId:n.apiKeyId,modelCallSource:n.callSource,modelRequestId:n.requestId,maxResults:n.maxResults??20,skip:n.skip??0,needFullContent:!1,statusCodeTypes:n.statusCode?W(n.statusCode):void 0};if(t.dryRun){A({api:jy,data:{reqDTO:o},...E(t)},r);return}G(t);let s=await Mh(e.client,jy,o),c=s.list??[];if(r===`json`){A({totalCount:s.totalCount??0,list:c},r);return}oy(c)}});const Py=`zeldaEasy.bailian-telemetry.model.getModelOriginLog`;var Fy=w({description:{"en-US":`Show a single inference log entry with full request/response content`,"zh-CN":`查看单条推理日志详情(含完整请求/响应内容)`},auth:`console`,usageArgs:`--request-id <id> [flags]`,flags:{...Lh,requestId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Model request ID (from `log inference list`)","zh-CN":`模型请求 ID(可由 log inference list 获得)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (narrows the search)`,"zh-CN":`模型名称(缩小查询范围)`}}},exampleArgs:[`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --hours 24`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --output json`],notes:[{"en-US":`The origin content is fetched back by request ID from the inference log store, so inference log delivery must have been enabled when the call happened.`,"zh-CN":`原始内容按请求 ID 从推理日志存储回捞,因此调用发生时须已开启推理日志投递。`}],validate:e=>ay(e.requestId)??gy(e.hours),async run(e){let{settings:t,flags:r}=e,i=T(t.output),{startTime:a,endTime:o}=Ih(r,1),s={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},modelRequestId:r.requestId};if(t.dryRun){A({apis:[jy,Py],data:{reqDTO:{...s,startTime:String(a),endTime:String(o)}},...E(t)},i);return}G(t);let c=((await Mh(e.client,`zeldaEasy.bailian-telemetry.model.listModelLogs`,{...s,startTime:String(a),endTime:String(o),model:r.model,maxResults:1,skip:0,needFullContent:!1})).list??[])[0];if(!c)throw new n(`No inference log found for request ${r.requestId} in the selected range.`,f.GENERAL,`Widen the window with --hours/--start-time, or check the request ID.`);let l=(await Mh(e.client,Py,{...s,startTime:String(a),endTime:String(o),...c.taskUuid?{taskUuid:c.taskUuid}:{}})).originLog;if(c.request=c.request??l?.request,c.response=c.response??l?.response,i===`json`){A(c,i);return}sy(c),!c.request&&!c.response&&process.stdout.write(O(process.stdout).dim(`
2802
+ `)),await e.client.console(zy,{reqDTO:{...t.workspaceId?{workspaceId:t.workspaceId}:{},slrType:`Cms`}}),n.noWait||(a=await Uy(e.client,t.workspaceId,e=>e.openStatus))),a.instanceStatus===`NotExist`&&(process.stderr.write(i.dim(`Creating the dedicated Prometheus instance...
2803
+ `)),await Cg(e.client,By,{...t.workspaceId?{workspaceId:t.workspaceId}:{},serviceType:Vy})),n.noWait){r===`json`?A({activated:!1,submitted:!0},r):process.stdout.write(`Activation submitted. Run \`${e.identity.binName} monitor delivery status\` to check progress.\n`);return}process.stderr.write(i.dim(`Waiting for the Prometheus instance to become ready...
2804
+ `));let s=await Uy(e.client,t.workspaceId,e=>e.openStatus&&e.instanceStatus===`Ready`);s.openStatus&&s.instanceStatus===`Ready`&&o!==!0&&(process.stderr.write(i.dim(`Turning on the monitor delivery switch...
2805
+ `)),await e.client.console(zg,{reqDTO:Ug(t,Hy)}));let c=s.openStatus&&s.instanceStatus===`Ready`;if(r===`json`){A({activated:c,...s},r);return}c?(process.stdout.write(`Monitoring delivery is active.
2806
+ `),s.instanceInfo&&(process.stdout.write(`Instance: ${s.instanceInfo.instanceId}\n`),process.stdout.write(`URL: ${s.instanceInfo.instanceUrl}\n`))):process.stdout.write(`Activation is still in progress. Run \`${e.identity.binName} monitor delivery status\` to check later.\n`)}});const Gy=`Monitor`;var Ky=w({description:{"en-US":`Disable monitor delivery for all models in the workspace`,"zh-CN":`关闭当前业务空间全部模型的监控数据投递`},auth:`console`,usageArgs:`[flags]`,notes:[{"en-US":"Only the delivery switch is turned off; the CMS service and the Prometheus instance (with stored data) are kept. Re-enable with `monitor delivery enable`.","zh-CN":"仅关闭投递开关;CMS 服务与 Prometheus 实例(含已存储数据)保留。可用 `monitor delivery enable` 重新开启。"}],exampleArgs:[``,`--dry-run`,`--output json`],async run(e){let{settings:t}=e,n=T(t.output);if(t.dryRun){A({api:Bg,data:{reqDTO:Ug(t,Gy)},...E(t)},n);return}if(Tg(t),await e.client.console(Bg,{reqDTO:Ug(t,Gy)}),n===`json`){A({disabled:!0},n);return}process.stdout.write(`Monitor delivery disabled.
2807
+ `)}});function qy(e){if(!e)return{};if(typeof e==`string`)try{return JSON.parse(e)}catch{return{}}return e}const Jy=[`SUCCESS`,`CLIENT_ERROR`,`SERVER_ERROR`,`CANCEL`];function Yy(e){if(!e)return;let t=V(e).filter(e=>!Jy.includes(e));if(t.length>0)return`Unknown status code type: ${t.join(`, `)}. Valid: ${Jy.join(`, `)}.`}const Xy={min:32,max:36};function Zy(e){let t=e.length;if(t<Xy.min||t>Xy.max)return`--request-id must be ${Xy.min}-${Xy.max} characters.`}function Qy(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No logs found in this range.
2808
+ `);return}let n=Zr({headers:[`Time`,`Request ID`,`Model`,`Status`,`Duration`,`First Token`,`Tokens`],rows:e.map(e=>{let t=qy(e.usage),n=t.input_tokens!=null||t.output_tokens!=null?`${t.input_tokens??`-`}/${t.output_tokens??`-`}`:`-`;return[W(e.startTime),e.modelRequestId??`-`,e.model??`-`,e.httpStatusCode==null?`-`:String(e.httpStatusCode),e.callDuration==null?`-`:`${U(e.callDuration)} ms`,e.firstTokenDuration==null?`-`:`${U(e.firstTokenDuration)} ms`,n]}),align:[`left`,`left`,`left`,`right`,`right`,`right`,`right`],cellColor:(e,n,r)=>{if(n===3){if(r.startsWith(`2`))return t.green(r);if(r.startsWith(`5`))return t.red(r);if(r!==`-`)return t.yellow(r)}}});for(let e of n)process.stdout.write(e+`
2809
+ `)}function $y(e){let t=O(process.stdout),n=qy(e.usage),r=[[`Request ID`,e.modelRequestId],[`Model`,e.model??`-`],[`Time`,e.startTime?W(e.startTime):`-`],[`Status`,e.httpStatusCode==null?`-`:String(e.httpStatusCode)],[`Duration`,e.callDuration==null?`-`:`${e.callDuration} ms`],[`First Token`,e.firstTokenDuration==null?`-`:`${e.firstTokenDuration} ms`],[`Tokens (in/out/total)`,`${n.input_tokens??`-`}/${n.output_tokens??`-`}/${n.total_tokens??`-`}`]];e.apikeyId&&r.push([`API Key ID`,e.apikeyId]),e.errorCode&&r.push([`Error Code`,e.errorCode]),e.errorMessage&&r.push([`Error Message`,e.errorMessage]);for(let[e,n]of r)process.stdout.write(`${t.bold(e)}: ${n}\n`);e.request&&process.stdout.write(`\n${t.bold(`Request:`)}\n${e.request}\n`),e.response&&process.stdout.write(`\n${t.bold(`Response:`)}\n${e.response}\n`)}const eb={audit:`AuditLog`,inference:`InferenceLog`},tb=`zeldaEasy.bailian-telemetry.activate.initTelemetryStoreInstance`;async function nb(e,t,n){return Hg(e,eb[t],n)}async function rb(e,t,r){let i=await nb(e,`audit`,t);for(let n=0;n<3&&i!==!0;n+=1)await new Promise(e=>setTimeout(e,2e3)),i=await nb(e,`audit`,t);if(i!==!0)throw new n(`Model audit log is not enabled yet.`,f.USAGE,`Inference log delivery requires the audit log. Run \`${r} log audit enable\` first, then check \`${r} log status\`.`)}function ib(e,t){return Ug(e,eb[t])}async function ab(e,t,n){let{client:r,settings:i,format:a}=e,o=O(process.stderr);if(i.dryRun){A({apis:[`zeldaEasy.bailian-telemetry.activate.createTelemetrySlr`,tb,zg],data:{reqDTO:ib(i,t)},...E(i)},a);return}Tg(i),await Rg(r,`Log`,i.workspaceId,{pollRetries:5,onProgress:e=>process.stderr.write(o.dim(e+`
2810
+ `))});let s=await Fg(r,n,i.workspaceId);if(s.instanceStatus===`NotExist`&&(process.stderr.write(o.dim(`Initializing the SLS store instance...
2811
+ `)),await Cg(r,tb,{...i.workspaceId?{workspaceId:i.workspaceId}:{},serviceType:n}),!e.noWait)){process.stderr.write(o.dim(`Waiting for the SLS instance to become ready...
2812
+ `));let e=Date.now()+18e4;for(;Date.now()<e&&s.instanceStatus!==`Ready`;)await new Promise(e=>setTimeout(e,3e3)),s=await Fg(r,n,i.workspaceId)}if(await r.console(zg,{reqDTO:ib(i,t)}),a===`json`){A({enabled:!0,kind:t,instanceStatus:s.instanceStatus},a);return}process.stdout.write(`${t===`audit`?`Audit`:`Inference`} log delivery enabled.\n`),e.noWait&&process.stdout.write(`The SLS instance may still be initializing; check \`${e.binName} log status\` later.\n`)}async function ob(e,t,r){let{client:i,settings:a,format:o}=e;if(a.dryRun){A({api:Bg,data:{reqDTO:ib(a,t)},...E(a)},o);return}if(Tg(a),r&&await nb(i,`inference`,a.workspaceId)===!0)throw new n(`The audit log cannot be disabled while the inference log is enabled.`,f.USAGE,`Run \`${e.binName} log inference disable\` first, then disable the audit log.`);if(await i.console(Bg,{reqDTO:ib(a,t)}),o===`json`){A({disabled:!0,kind:t},o);return}process.stdout.write(`${t===`audit`?`Audit`:`Inference`} log delivery disabled.\n`)}const sb={noWait:{type:`switch`,description:{"en-US":`Return right after submitting, without waiting for the SLS instance`,"zh-CN":`提交后立即返回,不等待 SLS 实例就绪`}}};function cb(e){if(e!=null&&e<=0)return`--hours must be positive.`}const lb=`zeldaEasy.bailian-telemetry.model.countModelLogs`;async function ub(e,t,n,r){let{settings:i}=e,a=T(i.output),{startTime:o,endTime:s}=r(),c={...i.workspaceId?{workspaceId:i.workspaceId,filterWorkspaceId:i.workspaceId}:{},startTime:o,endTime:s,telemetryType:eb[t],models:n.model?V(n.model):void 0,apikeyIds:n.apiKeyId?V(n.apiKeyId):void 0};if(i.dryRun){A({api:lb,data:{reqDTO:c},...E(i)},a);return}Tg(i);let l=Ag(await e.client.console(lb,{reqDTO:c}));if(a===`json`){A({kind:t,period:{start:W(o),end:W(s)},count:l},a);return}process.stdout.write(`${t===`audit`?`Audit`:`Inference`} logs: ${U(l)} (${W(o)} ~ ${W(s)})\n`)}const db={audit:`ModelAuditLog`,inference:`ModelInferenceLog`};async function fb(e,t){let[n,r,i,a,o]=await Promise.all([e.console(`zeldaEasy.bailian-telemetry.activate.getTelemetrySlrStatus`,{reqDTO:{...t?{workspaceId:t}:{},slrType:`Log`}}),Fg(e,db.audit,t),Fg(e,db.inference,t),nb(e,`audit`,t),nb(e,`inference`,t)]);return{slrAuthorized:Ag(n)===!0,audit:r,inference:i,auditSwitch:a,inferenceSwitch:o}}function pb(e){return e.openStatus?e.instanceStatus??`-`:`Not activated`}function mb(e){return e===null?`Never configured`:e?`On`:`Off`}var hb=w({description:{"en-US":`Show model log delivery status (SLS authorization, audit / inference service and switches)`,"zh-CN":`查看模型日志投递状态(SLS 授权、审计 / 推理日志的服务与开关状态)`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],notes:[{"en-US":`Both log kinds have independent switches; the inference log additionally requires the audit log to stay on.`,"zh-CN":`审计与推理日志各有独立开关;推理日志还要求审计日志保持开启。`}],async run(e){let{settings:t,identity:n}=e,r=T(t.output);Tg(t);let i=await fb(e.client,t.workspaceId);if(r===`json`){A(i,r);return}let a=O(process.stdout),o=[[`SLS Authorization (SLR)`,i.slrAuthorized?`Authorized`:`Not authorized`],[`Audit Log (service)`,pb(i.audit)],[`Audit Log (switch)`,mb(i.auditSwitch)],[`Inference Log (service)`,pb(i.inference)],[`Inference Log (switch)`,mb(i.inferenceSwitch)]],s=i.inference.instanceInfo?.instanceUrl;s&&o.push([`SLS Instance URL`,s]);let c=Math.max(...o.map(([e])=>Pr(e)));for(let[e,t]of o)process.stdout.write(`${a.bold(j(e,c+2))}${t}\n`);i.auditSwitch===!0?i.inferenceSwitch!==!0&&process.stdout.write(a.dim(`\nRun \`${n.binName} log inference enable\` to enable inference log delivery.\n`)):process.stdout.write(a.dim(`\nRun \`${n.binName} log audit enable\` to enable audit log delivery.\n`))}});const gb=`zeldaEasy.bailian-telemetry.platform-model.listModelLogs`;var _b=w({description:{"en-US":`Query model audit logs (call metadata; request/response content is not recorded)`,"zh-CN":`查询模型审计日志(调用元数据;不含请求/响应内容)`},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...kg,...Wg,requestId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact model request ID`,"zh-CN":`精确匹配模型请求 ID`}},statusCode:{type:`string`,valueHint:`<type>`,description:{"en-US":`Status filter(s), comma-separated: SUCCESS, CLIENT_ERROR, SERVER_ERROR, CANCEL`,"zh-CN":`状态过滤,多个以逗号分隔:SUCCESS、CLIENT_ERROR、SERVER_ERROR、CANCEL`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},exampleArgs:[``,`--model qwen3.6-plus --hours 3`,`--status-code SERVER_ERROR,CLIENT_ERROR`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--output json`],notes:[{"en-US":"Audit logs carry call metadata only. For full request/response content, enable and query the inference log (`log inference list` / `log inference get`).","zh-CN":"审计日志只记录调用元数据。需要完整请求/响应内容时,请开启并查询推理日志(`log inference list` / `log inference get`)。"}],validate:e=>Yy(e.statusCode)??cb(e.hours),async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n,1/24),o={...qg(n,t.workspaceId),filterWorkspaceId:t.workspaceId,startTime:i,endTime:a,maxResults:n.maxResults??20,skip:n.skip??0,nextToken:n.nextToken,modelRequestId:n.requestId,needFullContent:!1,statusCodeTypes:n.statusCode?V(n.statusCode):void 0};if(t.dryRun){A({api:gb,data:{reqDTO:o},...E(t)},r);return}Tg(t);let s=await Cg(e.client,gb,o),c=s.list??[],l=s.nextToken;if(r===`json`){A({totalCount:s.totalCount??0,nextToken:l,list:c},r);return}Qy(c),l&&process.stdout.write(`Next page: --next-token ${l}\n`)}}),vb=w({description:{"en-US":`Show a single audit log entry with its raw origin record`,"zh-CN":`查看单条审计日志详情(含原始审计记录)`},auth:`console`,usageArgs:`--request-id <id> [flags]`,flags:{...kg,requestId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Model request ID (from `log audit list`)","zh-CN":`模型请求 ID(可由 log audit list 获得)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (narrows the search)`,"zh-CN":`模型名称(缩小查询范围)`}}},exampleArgs:[`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --hours 24`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --output json`],notes:[{"en-US":"Audit entries carry call metadata plus the raw audit record; request/response content lives in the inference log (`log inference get`).","zh-CN":"审计详情包含调用元数据与原始审计记录;请求/响应内容在推理日志中(`log inference get`)。"}],validate:e=>Zy(e.requestId)??cb(e.hours),async run(e){let{settings:t,flags:r}=e,i=T(t.output),{startTime:a,endTime:o}=Og(r,1),s={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},startTime:a,endTime:o,modelRequestId:r.requestId,maxResults:1,skip:0,needFullContent:!1};if(r.model&&(s.models=[r.model]),t.dryRun){A({api:gb,data:{reqDTO:s},...E(t)},i);return}Tg(t);let c=((await Cg(e.client,`zeldaEasy.bailian-telemetry.platform-model.listModelLogs`,s)).list??[])[0];if(!c)throw new n(`No audit log found for request ${r.requestId} in the selected range.`,f.GENERAL,`Widen the window with --hours/--start-time, or check the request ID.`);if(i===`json`){A(c,i);return}$y(c),c.originLog&&process.stdout.write(`\n${O(process.stdout).bold(`Origin record:`)}\n${JSON.stringify(c.originLog,null,2)}\n`)}});const yb={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID(s), comma-separated`,"zh-CN":`API Key ID,多个以逗号分隔`}}};var bb=w({description:{"en-US":`Count model audit logs in a time range (useful before exporting)`,"zh-CN":`统计时间范围内的模型审计日志条数(导出前预估量级)`},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...kg,...yb},exampleArgs:[``,`--model qwen3.6-plus --hours 24`,`--output json`],validate:e=>cb(e.hours),async run(e){await ub(e,`audit`,e.flags,()=>Og(e.flags,1/24))}}),xb=w({description:{"en-US":`Enable audit log delivery to SLS (SLR authorization → SLS instance → log switch)`,"zh-CN":`开启审计日志投递到 SLS(SLR 授权 → SLS 实例初始化 → 打开日志开关)`},auth:`console`,usageArgs:`[--no-wait] [flags]`,flags:sb,notes:[{"en-US":`Steps: 1) authorize the SLS service-linked role, 2) initialize the SLS store instance (async), 3) turn on audit log delivery for all models in the workspace.`,"zh-CN":`开启链路:1)授权 SLS 服务关联角色;2)初始化 SLS 存储实例(异步);3)为当前业务空间全部模型打开审计日志开关。`},{"en-US":`The audit log records call metadata only and is required before enabling the inference log.`,"zh-CN":`审计日志只记录调用元数据,且是开启推理日志的前置条件。`}],exampleArgs:[``,`--no-wait`,`--output json`],async run(e){let t=T(e.settings.output);await ab({client:e.client,settings:e.settings,binName:e.identity.binName,format:t,noWait:e.flags.noWait},`audit`,db.audit)}}),Sb=w({description:{"en-US":`Disable audit log delivery for all models in the workspace`,"zh-CN":`关闭当前业务空间全部模型的审计日志投递`},auth:`console`,usageArgs:`[flags]`,notes:[{"en-US":`Refused while the inference log is still enabled — disable the inference log first (the console enforces the same rule).`,"zh-CN":`推理日志仍开启时不允许单独关闭审计日志——请先关闭推理日志(与控制台规则一致)。`}],exampleArgs:[``,`--dry-run`,`--output json`],async run(e){let t=T(e.settings.output);await ob({client:e.client,settings:e.settings,binName:e.identity.binName,format:t},`audit`,!0)}});const Cb=`zeldaEasy.bailian-telemetry.model.listModelLogs`,wb=[`SUCCESS`,`CLIENT_ERROR`,`SERVER_ERROR`,`CANCEL`];var Tb=w({description:{"en-US":"Query model inference logs (requires inference log delivery; use `log inference get` for request/response content)","zh-CN":"查询模型推理日志(需已开启推理日志投递;请求/响应内容请用 `log inference get` 查看)"},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...kg,model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (the inference log API accepts a single model)`,"zh-CN":`模型名称(推理日志接口仅支持单个模型)`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID (the inference log API accepts a single ID)`,"zh-CN":`API Key ID(推理日志接口仅支持单个 ID)`}},callSource:{type:`string`,valueHint:`<type>`,choices:[`Online`,`Offline`],description:{"en-US":`Inference type: Online, Offline`,"zh-CN":`推理类型:Online、Offline`}},requestId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact model request ID`,"zh-CN":`精确匹配模型请求 ID`}},statusCode:{type:`string`,valueHint:`<type>`,description:{"en-US":`Status filter(s), comma-separated: ${wb.join(`, `)}`,"zh-CN":`状态过滤,多个以逗号分隔:${wb.join(`、`)}`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}}},exampleArgs:[``,`--model qwen3.6-plus --hours 3`,`--status-code SERVER_ERROR,CLIENT_ERROR`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--output json`],notes:[{"en-US":"Requires inference log delivery (`log inference enable`), which itself requires the audit log. Entries here mirror the audit trail; full request/response content is fetched per request via `log inference get`.","zh-CN":"需先开启推理日志投递(`log inference enable`),且推理日志依赖审计日志。列表与审计口径同构;完整请求/响应内容按请求 ID 通过 `log inference get` 回捞。"}],validate:e=>Yy(e.statusCode)??cb(e.hours),async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n,1/24),o={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},startTime:String(i),endTime:String(a),model:n.model,apikeyId:n.apiKeyId,modelCallSource:n.callSource,modelRequestId:n.requestId,maxResults:n.maxResults??20,skip:n.skip??0,needFullContent:!1,statusCodeTypes:n.statusCode?V(n.statusCode):void 0};if(t.dryRun){A({api:Cb,data:{reqDTO:o},...E(t)},r);return}Tg(t);let s=await Cg(e.client,Cb,o),c=s.list??[];if(r===`json`){A({totalCount:s.totalCount??0,list:c},r);return}Qy(c)}});const Eb=`zeldaEasy.bailian-telemetry.model.getModelOriginLog`;var Db=w({description:{"en-US":`Show a single inference log entry with full request/response content`,"zh-CN":`查看单条推理日志详情(含完整请求/响应内容)`},auth:`console`,usageArgs:`--request-id <id> [flags]`,flags:{...kg,requestId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Model request ID (from `log inference list`)","zh-CN":`模型请求 ID(可由 log inference list 获得)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name (narrows the search)`,"zh-CN":`模型名称(缩小查询范围)`}}},exampleArgs:[`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --hours 24`,`--request-id 6f6b2f1e-xxxx-xxxx-xxxx-xxxxxxxxxxxx --output json`],notes:[{"en-US":`The origin content is fetched back by request ID from the inference log store, so inference log delivery must have been enabled when the call happened.`,"zh-CN":`原始内容按请求 ID 从推理日志存储回捞,因此调用发生时须已开启推理日志投递。`}],validate:e=>Zy(e.requestId)??cb(e.hours),async run(e){let{settings:t,flags:r}=e,i=T(t.output),{startTime:a,endTime:o}=Og(r,1),s={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},modelRequestId:r.requestId};if(t.dryRun){A({apis:[Cb,Eb],data:{reqDTO:{...s,startTime:String(a),endTime:String(o)}},...E(t)},i);return}Tg(t);let c=((await Cg(e.client,`zeldaEasy.bailian-telemetry.model.listModelLogs`,{...s,startTime:String(a),endTime:String(o),model:r.model,maxResults:1,skip:0,needFullContent:!1})).list??[])[0];if(!c)throw new n(`No inference log found for request ${r.requestId} in the selected range.`,f.GENERAL,`Widen the window with --hours/--start-time, or check the request ID.`);let l=(await Cg(e.client,Eb,{...s,startTime:String(a),endTime:String(o),...c.taskUuid?{taskUuid:c.taskUuid}:{}})).originLog;if(c.request=c.request??l?.request,c.response=c.response??l?.response,i===`json`){A(c,i);return}$y(c),!c.request&&!c.response&&process.stdout.write(O(process.stdout).dim(`
2814
2813
  Request/response content is only available when inference log delivery was enabled at call time.
2815
- `))}});const Iy={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID(s), comma-separated`,"zh-CN":`API Key ID,多个以逗号分隔`}}};var Ly=w({description:{"en-US":`Count model inference logs in a time range (useful before exporting)`,"zh-CN":`统计时间范围内的模型推理日志条数(导出前预估量级)`},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...Lh,...Iy},exampleArgs:[``,`--model qwen3.6-plus --hours 24`,`--output json`],notes:[{"en-US":`Only calls made while inference log delivery was enabled are counted.`,"zh-CN":`仅统计推理日志投递开启期间产生的调用。`}],validate:e=>gy(e.hours),async run(e){await vy(e,`inference`,e.flags,()=>Ih(e.flags,1/24))}}),Ry=w({description:{"en-US":`Enable inference log delivery to SLS (SLR authorization → SLS instance → log switch)`,"zh-CN":`开启推理日志投递到 SLS(SLR 授权 → SLS 实例初始化 → 打开日志开关)`},auth:`console`,usageArgs:`[--no-wait] [flags]`,flags:hy,notes:[{"en-US":`Steps: 1) authorize the SLS service-linked role, 2) initialize the SLS store instance (async), 3) turn on inference log delivery for all models in the workspace.`,"zh-CN":`开启链路:1)授权 SLS 服务关联角色;2)初始化 SLS 存储实例(异步);3)为当前业务空间全部模型打开推理日志开关。`},{"en-US":"Requires the audit log to be enabled first (`log audit enable`) — the console enforces the same rule.","zh-CN":"需先开启审计日志(`log audit enable`)——与控制台规则一致。"}],exampleArgs:[``,`--no-wait`,`--output json`],async run(e){let t=T(e.settings.output),n={client:e.client,settings:e.settings,binName:e.identity.binName,format:t,noWait:e.flags.noWait};e.settings.dryRun||await dy(e.client,e.settings.workspaceId,e.identity.binName),await py(n,`inference`,yy.inference)}}),zy=w({description:{"en-US":`Disable inference log delivery for all models in the workspace`,"zh-CN":`关闭当前业务空间全部模型的推理日志投递`},auth:`console`,usageArgs:`[flags]`,notes:[{"en-US":"Only the inference log (request/response content) is disabled; the audit log keeps its own switch (`log audit disable`).","zh-CN":"仅关闭推理日志(请求/响应内容);审计日志有独立开关(`log audit disable`)。"}],exampleArgs:[``,`--dry-run`,`--output json`],async run(e){let t=T(e.settings.output);await my({client:e.client,settings:e.settings,binName:e.identity.binName,format:t},`inference`)}});const By=`zeldaEasy.bailian-telemetry.trace.listTracesWithOss`,Vy={0:`Unset`,1:`OK`,2:`Error`};function Hy(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No traces found in this range.
2816
- `);return}let n=Jr({headers:[`Time`,`Trace ID`,`Span`,`Status`,`Duration`,`Tokens`],rows:e.map(e=>[U(e.startTime),e.traceId??`-`,e.spanName??`-`,Vy[e.statusCode??`0`]??e.statusCode??`-`,e.callDuration==null?e.duration??`-`:`${H(e.callDuration)} ms`,e.totalTokens==null?`-`:H(e.totalTokens)]),align:[`left`,`left`,`left`,`left`,`right`,`right`],cellColor:(e,n,r)=>{if(n===3){if(r===`Error`)return t.red(r);if(r===`OK`)return t.green(r)}}});for(let e of n)process.stdout.write(e+`
2817
- `)}var Uy=w({description:{"en-US":`List call traces for a model or app`,"zh-CN":`查询模型或应用的调用链列表`},auth:`console`,usageArgs:`--resource-id <id> [flags]`,flags:{...Lh,resourceId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Model name or app ID to query traces for`,"zh-CN":`要查询调用链的模型名称或应用 ID`}},resourceType:{type:`string`,valueHint:`<type>`,choices:[`model`,`app`],description:{"en-US":`Resource type: model, app (default: model)`,"zh-CN":`资源类型:model、app(默认:model)`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}}},exampleArgs:[`--resource-id qwen3.6-plus`,`--resource-id qwen3.6-plus --hours 24 --max-results 50`,`--resource-id 123456 --resource-type app --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n,1/24),o={...t.workspaceId?{workspaceId:t.workspaceId}:{},resourceId:n.resourceId,resourceType:n.resourceType??`model`,startTime:i,endTime:a,maxResults:n.maxResults??20,skip:n.skip??0,nextToken:``};if(t.dryRun){A({api:By,data:{reqDTO:o},...E(t)},r);return}G(t);let s=await Vh(await Mh(e.client,By,o)),c=Array.isArray(s)?s:s?.list??[],l=Array.isArray(s)?void 0:s?.totalCount;if(r===`json`){A({totalCount:l,list:c},r);return}Hy(c)}});const Wy=`zeldaEasy.bailian-telemetry.trace.getTraceWithOss`;function Gy(e,t){let n=O(process.stdout),r=` `.repeat(t),i=Vy[e.statusCode??`0`]??`-`,a=e.callDuration==null?e.duration??`-`:`${H(e.callDuration)} ms`,o=e.totalTokens==null?``:`, ${H(e.totalTokens)} tokens`,s=i===`Error`?n.red(i):i;process.stdout.write(`${r}${e.spanName??`-`} ${n.dim(`[${s}, ${a}${o}]`)}\n`),e.statusCode===`2`&&e.statusMessage&&process.stdout.write(`${r} ${n.red(e.statusMessage)}\n`);for(let n of e.children??[])Gy(n,t+1)}var Ky=w({description:{"en-US":`Show a single call trace with its span tree`,"zh-CN":`查看单条调用链详情(含 span 树)`},auth:`console`,usageArgs:`--trace-id <id> [flags]`,flags:{...Lh,traceId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Trace ID (from `log trace list`)","zh-CN":`调用链 ID(可由 log trace list 获得)`}},resourceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Model name or app ID (narrows the search)`,"zh-CN":`模型名称或应用 ID(缩小查询范围)`}}},exampleArgs:[`--trace-id 0a1b2c3d4e5f --hours 24`,`--trace-id 0a1b2c3d4e5f --resource-id qwen3.6-plus`,`--trace-id 0a1b2c3d4e5f --output json`],async run(e){let{settings:t,flags:r}=e,i=T(t.output),{startTime:a,endTime:o}=Ih(r,1),s={...t.workspaceId?{workspaceId:t.workspaceId}:{},traceId:r.traceId,resourceId:r.resourceId,startTime:a,endTime:o};if(t.dryRun){A({api:Wy,data:{reqDTO:s},...E(t)},i);return}G(t);let c=await Vh(await Mh(e.client,Wy,s));if(!c||!c.traceId)throw new n(`No trace found for ${r.traceId} in the selected range.`,f.GENERAL,`Widen the window with --hours/--start-time, or check the trace ID.`);if(i===`json`){A(c,i);return}let l=O(process.stdout);process.stdout.write(`${l.bold(`Trace`)} ${c.traceId} ${l.dim(U(c.startTime))}\n\n`),Gy(c,0)}});const qy=`zeldaEasy.bailian-telemetry.trace.getTraceStatistic`;var Jy=w({description:{"en-US":`Show per-resource trace statistics (calls, tokens, latency)`,"zh-CN":`查看调用链维度统计(调用量、Token、延迟)`},auth:`console`,usageArgs:`[--resource-id <id>] [flags]`,flags:{...Lh,resourceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Model name(s) or app ID(s), comma-separated; omit for all`,"zh-CN":`模型名称或应用 ID,多个以逗号分隔;省略表示全部`}},resourceType:{type:`string`,valueHint:`<type>`,choices:[`model`,`app`],description:{"en-US":`Resource type: model, app (default: model)`,"zh-CN":`资源类型:model、app(默认:model)`}}},exampleArgs:[``,`--resource-id qwen3.6-plus --hours 24`,`--resource-type app --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Ih(n,1/24),o={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},resourceIdList:n.resourceId?W(n.resourceId):void 0,resourceType:n.resourceType??`model`,startTime:i,endTime:a};if(t.dryRun){A({api:qy,data:{reqDTO:o},...E(t)},r);return}G(t);let s=await Mh(e.client,qy,o),c=Object.values(s);if(r===`json`){A({period:{start:U(i),end:U(a)},list:c},r);return}if(c.length===0){process.stdout.write(`No trace statistics found in this range.
2818
- `);return}let l=Jr({headers:[`Resource`,`Calls`,`Total Tokens`,`Avg Duration`,`Avg First Token`],rows:c.map(e=>[e.resourceId??`-`,H(Number(e.callCount??0)),H(Number(e.totalTokens??0)),e.avgDuration?`${H(Math.round(Number(e.avgDuration)))} ms`:`-`,e.avgLlmFirstTokenDuration?`${H(Math.round(Number(e.avgLlmFirstTokenDuration)))} ms`:`-`]),align:[`left`,`right`,`right`,`right`,`right`]});for(let e of l)process.stdout.write(e+`
2819
- `)}});const Yy=[`INFO`,`WARNING`,`ERROR`],Xy={name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Alert rule name (max 64 chars)`,"zh-CN":`告警规则名称(最长 64 字符)`}},templateId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Alert template ID (from `alert template list`)","zh-CN":`告警模板 ID(可由 alert template list 获得)`}},model:{type:`string`,valueHint:`<model>`,required:!0,description:{"en-US":`Model name(s) to alert on, comma-separated`,"zh-CN":`告警生效的模型名称,多个以逗号分隔`}},message:{type:`string`,valueHint:`<text>`,description:{"en-US":`Alert notification content (Go template); defaults to the console template`,"zh-CN":`告警通知内容(Go 模板语法),默认与控制台一致`}},level:{type:`string`,valueHint:`<level>`,choices:Yy,description:{"en-US":`Alert level (default: INFO)`,"zh-CN":`告警等级(默认:INFO)`}},interval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Check interval in seconds (default: 60)`,"zh-CN":`告警检查周期(秒,默认:60)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`How long the condition must hold before alerting; 0 = immediately (default: 60)`,"zh-CN":`条件持续多久后告警(秒),0 表示立即告警(默认:60)`}},contact:{type:`string`,valueHint:`<id>`,description:{"en-US":`CMS alert contact ID(s), comma-separated; create them in the CloudMonitor console`,"zh-CN":`云监控告警联系人 ID,多个以逗号分隔;需在云监控控制台创建`}},contactGroup:{type:`string`,valueHint:`<id>`,description:{"en-US":`CMS alert contact group ID(s), comma-separated`,"zh-CN":`云监控告警联系组 ID,多个以逗号分隔`}},notifyWindow:{type:`string`,valueHint:`<HH:mm-HH:mm>`,description:{"en-US":`Daily notification window (default: 00:00-23:59)`,"zh-CN":`每日通知时间窗口(默认:00:00-23:59)`}},notifyDays:{type:`string`,valueHint:`<days>`,description:{"en-US":`Days of week to notify, 1-7 comma-separated (default: every day)`,"zh-CN":`每周通知日,1-7 逗号分隔(默认:每天)`}},silence:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Silence period between repeat notifications (default: never repeat)`,"zh-CN":`重复通知的静默时间(秒,默认:不重复通知)`}},gmtOffset:{type:`string`,valueHint:`<offset>`,description:{"en-US":`Timezone offset for the notify window (default: +0800)`,"zh-CN":`通知窗口的时区偏移(默认:+0800)`}}};function Zy(e){if(e.notifyWindow&&!/^(\d{2}:\d{2})-(\d{2}:\d{2})$/.exec(e.notifyWindow))return`--notify-window must be in HH:mm-HH:mm format, e.g. 09:00-18:00.`;if(e.notifyDays&&W(e.notifyDays).filter(e=>!/^[1-7]$/.test(e)).length>0)return`--notify-days accepts values 1-7, e.g. 1,2,3,4,5.`;if(e.interval!=null&&e.interval<1)return`--interval must be positive seconds.`;if(e.duration!=null&&e.duration<0)return`--duration must be >= 0 seconds.`;if(e.silence!=null&&e.silence<0)return`--silence must be >= 0 seconds.`;if(e.gmtOffset!=null&&!/^[+-]\d{4}$/.test(e.gmtOffset))return`--gmt-offset must look like +0800.`}function Qy(e){if(e.interval===0)throw new C(`--interval must be positive seconds.`);let t=e.notifyWindow?/^(\d{2}:\d{2})-(\d{2}:\d{2})$/.exec(e.notifyWindow):null;return{name:e.name,templateId:e.templateId,resourceIds:W(e.model),message:e.message??`业务空间({{$tags.workspace_id}})下的模型({{$tags.model}})发生告警,当前值为{{ printf "%.2f" $value }}`,level:e.level??`INFO`,interval:e.interval??60,duration:e.duration??60,notification:{startTime:t?.[1]??`00:00`,endTime:t?.[2]??`23:59`,gmtOffset:e.gmtOffset??`+0800`,dayOfWeek:e.notifyDays?W(e.notifyDays).map(Number):[1,2,3,4,5,6,7],silenceTime:e.silence??2147483647,contacts:e.contact?W(e.contact):void 0,contactGroups:e.contactGroup?W(e.contactGroup):void 0}}}async function $y(e,t,n,r){G(r),await Wh(e,{serviceType:`ModelMonitor`,workspaceId:t,enableCommand:`${n} monitor delivery enable`,requireInstance:!1})}const eb=[`>`,`>=`,`<`,`<=`,`==`,`!=`];function tb(e){let t=e.split(`:`);if(t.length!==5)throw new C(`Invalid --condition "${e}". Expected metricName:aggregator:compareType:value:period. If the value contains > or <, wrap the whole condition in quotes so the shell does not treat it as redirection.`);let[n,r,i,a,o]=t;if(!n||!r)throw new C(`Invalid --condition "${e}": metricName and aggregator are required.`);if(!eb.includes(i))throw new C(`Invalid --condition "${e}": compareType must be one of ${eb.join(` `)}.`);let s=Number(o);if(!Number.isFinite(s)||s<1)throw new C(`Invalid --condition "${e}": period must be positive seconds.`);return{metricName:n,aggregator:r,compareType:i,compareValue:a,period:s}}function nb(e,t){if(!e||e.length===0)return t?void 0:`At least one --condition is required (or use --from to copy a template).`;if(e.length>10)return`At most 10 --condition entries are allowed.`;for(let t of e)try{tb(t)}catch(e){return e instanceof Error?e.message:String(e)}}function rb(e){let t=lr(e);return{list:t.list??[],totalCount:t.totalCount??0,nextToken:t.nextToken}}const ib=`zeldaEasy.bailian-telemetry.alertMetric.listMetrics`;var ab=w({description:{"en-US":`List metrics that alert rules can be created on, with supported aggregations`,"zh-CN":`查看可创建告警的指标及其支持的聚合方式`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=t.outputExplicit?T(t.output):`json`;if(t.dryRun){A({api:ib,data:{reqDTO:{workspaceId:t.workspaceId,resourceType:`model`}},...E(t)},n);return}await $y(e.client,t.workspaceId,e.identity.binName,t);let r=await e.client.console(ib,{reqDTO:{workspaceId:t.workspaceId,resourceType:`model`}}),i=lr(r),a=Array.isArray(i)?i:i.list??i.result??[];if(n===`json`){A(a,n);return}if(a.length===0){process.stdout.write(`No alertable metrics found.
2820
- `);return}let o=Jr({headers:[`Metric`,`Aggregations`,`Unit`,`Description`],rows:a.map(e=>[e.metricName,(e.aggregators??[]).join(`, `),e.unit??`-`,e.desc??`-`]),align:[`left`,`left`,`left`,`left`]});for(let e of o)process.stdout.write(e+`
2821
- `)}});const ob=`zeldaEasy.bailian-telemetry.alertTemplate.listAlertTemplates`;function sb(e){let t=e.metricName??e.alertMetric??`?`;return`${e.aggregator?`${e.aggregator} `:``}${t} ${e.compareType} ${e.compareValue} (${e.period}s)`}var cb=w({description:{"en-US":`List alert templates (official and custom); pass --template-id for details`,"zh-CN":`查看告警模板(官方与自定义);传 --template-id 查看单个模板详情`},auth:`console`,usageArgs:`[--name <name>] [--source <source>] [flags]`,flags:{templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact template ID (view a single template)`,"zh-CN":`精确模板 ID(查看单个模板)`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy filter by template name`,"zh-CN":`按模板名称模糊过滤`}},source:{type:`string`,valueHint:`<source>`,choices:[`Official`,`Customize`],description:{"en-US":`Template source: Official, Customize; omit for all`,"zh-CN":`模板来源:Official、Customize;省略表示全部`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 50)`,"zh-CN":`每页数量(默认:50)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}}},exampleArgs:[``,`--source Official`,`--name 失败率`,`--template-id 123 --output json`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={resourceType:`model`,templateId:n.templateId,templateName:n.name,source:n.source,maxResults:n.maxResults??50,skip:n.skip??0};if(t.dryRun){A({api:ob,data:{reqDTO:i},...E(t)},r);return}await $y(e.client,t.workspaceId,e.identity.binName,t);let a=rb(await e.client.console(ob,{reqDTO:i}));if(r===`json`){A(a,r);return}if(a.list.length===0){process.stdout.write(`No alert templates found.
2822
- `);return}let o=Jr({headers:[`Template ID`,`Name`,`Source`,`Conditions`],rows:a.list.map(e=>[e.templateId,e.templateName,e.source===`Official`?`Official`:`Custom`,(e.conditions??[]).map(sb).join(e.logicalOperator===`and`?` AND `:` OR `)||`-`]),align:[`left`,`left`,`left`,`left`]});for(let e of o)process.stdout.write(e+`
2823
- `)}});const lb=`zeldaEasy.bailian-telemetry.alertTemplate.createAlertTemplate`;async function ub(e,t){if(t.condition?.length)return t.condition.map(tb);if(!t.from)return[];let r=rb(await e.client.console(`zeldaEasy.bailian-telemetry.alertTemplate.listAlertTemplates`,{reqDTO:{resourceType:`model`,templateId:t.from,maxResults:1,skip:0}})).list[0];if(!r)throw new n(`Source template not found: ${t.from}`,f.GENERAL,"Check the ID with `alert template list`.");return(r.conditions??[]).map(e=>({metricName:e.metricName,aggregator:e.aggregator,compareType:e.compareType,compareValue:e.compareValue,period:e.period}))}var db=w({description:{"en-US":`Create a custom alert template (or copy an official one with --from)`,"zh-CN":`创建自定义告警模板(或用 --from 复制官方模板)`},auth:`console`,usageArgs:`--name <name> [--condition <metric:agg:cmp:value:period>...] [--from <template-id>] [flags]`,flags:{name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Template name (max 64 chars)`,"zh-CN":`模板名称(最长 64 字符)`}},condition:{type:`array`,valueHint:`<metric:agg:cmp:value:period>`,description:{"en-US":"Alert condition, repeatable (1-10). Example: 'model_call_failed_count:sum:>:10:60' (quote it: > is a shell metacharacter). See `alert metrics` for metric names","zh-CN":"告警条件,可重复(1-10 条)。示例:'model_call_failed_count:sum:>:10:60'(含 > 等 shell 特殊字符,需加引号)。指标名见 `alert metrics`"}},from:{type:`string`,valueHint:`<template-id>`,description:{"en-US":`Copy conditions from an existing (e.g. official) template`,"zh-CN":`复制已有(如官方)模板的条件`}},logicalOperator:{type:`string`,valueHint:`<op>`,choices:[`or`,`and`],description:{"en-US":`How multiple conditions combine (default: or)`,"zh-CN":`多条件组合逻辑(默认:or)`}}},exampleArgs:[`--name 失败率告警 --condition 'model_call_failed_count:sum:>:10:60'`,`--name 高延迟 --condition 'model_call_duration:avg:>:3000:300' --condition 'model_call_5xx_count:sum:>:5:60' --logical-operator and`,`--name 我的模板 --from <template-id>`,`--name test --condition 'model_call_count:sum:>:100:60' --dry-run`],validate:e=>nb(e.condition,!!e.from),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.condition?.length?n.condition.map(tb):void 0;if(t.dryRun){A({api:lb,data:{reqDTO:{templateName:n.name,resourceType:`model`,logicalOperator:n.logicalOperator??`or`,srcTemplateId:n.from,conditions:i??`(copied from --from template)`}},...E(t)},r);return}await $y(e.client,t.workspaceId,e.identity.binName,t);let a={templateName:n.name,resourceType:`model`,logicalOperator:n.logicalOperator??`or`,srcTemplateId:n.from,conditions:i??await ub(e,n)},o=await e.client.console(lb,{reqDTO:a}),s=lr(o),c=s.data??s.templateId??s;if(r===`json`){A({created:!0,templateId:c},r);return}process.stdout.write(`Alert template created${c?`: ${c}`:`.`}\n`)}});const fb=`zeldaEasy.bailian-telemetry.alertTemplate.updateAlertTemplate`;var pb=w({description:{"en-US":`Update a custom alert template (full replacement of conditions)`,"zh-CN":`更新自定义告警模板(整体替换条件)`},auth:`console`,usageArgs:`--template-id <id> --name <name> --condition <metric:agg:cmp:value:period>... [flags]`,flags:{templateId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Template ID (from `alert template list`)","zh-CN":`模板 ID(可由 alert template list 获得)`}},name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Template name (max 64 chars)`,"zh-CN":`模板名称(最长 64 字符)`}},condition:{type:`array`,valueHint:`<metric:agg:cmp:value:period>`,description:{"en-US":`Alert condition, repeatable (1-10). Example: 'model_call_failed_count:sum:>:10:60' (quote it: > is a shell metacharacter)`,"zh-CN":`告警条件,可重复(1-10 条)。示例:'model_call_failed_count:sum:>:10:60'(含 > 等 shell 特殊字符,需加引号)`}},logicalOperator:{type:`string`,valueHint:`<op>`,choices:[`or`,`and`],description:{"en-US":`How multiple conditions combine (default: or)`,"zh-CN":`多条件组合逻辑(默认:or)`}}},exampleArgs:[`--template-id 123 --name 失败率告警 --condition 'model_call_failed_count:sum:>:20:60'`,`--template-id 123 --name test --condition 'model_call_count:sum:>:100:60' --dry-run`],validate:e=>nb(e.condition,!1),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={templateId:n.templateId,templateName:n.name,resourceType:`model`,logicalOperator:n.logicalOperator??`or`,conditions:(n.condition??[]).map(tb)};if(t.dryRun){A({api:fb,data:{reqDTO:i},...E(t)},r);return}if(await $y(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(fb,{reqDTO:i}),r===`json`){A({updated:!0,templateId:n.templateId},r);return}process.stdout.write(`Alert template updated: ${n.templateId}\n`)}});const mb=`zeldaEasy.bailian-telemetry.alertTemplate.deleteAlertTemplates`;var hb=w({description:{"en-US":`Delete custom alert templates (official templates cannot be deleted)`,"zh-CN":`删除自定义告警模板(官方模板不可删除)`},auth:`console`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified alert templates and cannot be undone.`,"zh-CN":`该操作会永久删除指定的告警模板,且无法撤销。`}},usageArgs:`--template-id <id>[,<id>...] [--yes]`,flags:{templateId:{type:`string`,valueHint:`<id>[,<id>...]`,required:!0,description:{"en-US":`Template ID(s) to delete, comma-separated`,"zh-CN":`要删除的模板 ID,多个以逗号分隔`}}},exampleArgs:[`--template-id 123`,`--template-id 123,124 --dry-run`,`--template-id 123 --yes`],notes:[{"en-US":`Irreversible — the alert templates are permanently removed.`,"zh-CN":`该操作不可撤销——告警模板将被永久删除。`}],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={templateIds:W(n.templateId)};if(t.dryRun){A({api:mb,data:{reqDTO:i},...E(t)},r);return}await $y(e.client,t.workspaceId,e.identity.binName,t);let a=await e.client.console(mb,{reqDTO:i}),o=lr(a);if(r===`json`){A({deleted:i.templateIds,result:o},r);return}process.stdout.write(`Deleted ${i.templateIds.length} alert template(s).\n`)}});const gb=`zeldaEasy.bailian-telemetry.alertRule.listAlertRules`;function _b(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No alert rules found.
2824
- `);return}let n=Jr({headers:[`Rule ID`,`Name`,`Level`,`Enabled`,`Models`,`Interval`],rows:e.map(e=>[e.ruleId,e.name,e.level??`-`,e.enabled?`ON`:`OFF`,(e.resourceIds??[]).join(`, `)||`-`,e.interval==null?`-`:`${e.interval}s`]),align:[`left`,`left`,`left`,`left`,`left`,`right`],cellColor:(e,n,r)=>{if(n===3)return r===`ON`?t.green(r):t.yellow(r);if(n===2&&r===`ERROR`)return t.red(r)}});for(let e of n)process.stdout.write(e+`
2825
- `)}var vb=w({description:{"en-US":`List model alert rules`,"zh-CN":`查看模型告警规则列表`},auth:`console`,usageArgs:`[--name <name>] [--enabled true|false] [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact rule ID filter`,"zh-CN":`按规则 ID 精确过滤`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy filter by rule name`,"zh-CN":`按规则名称模糊过滤`}},enabled:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Filter by enabled state`,"zh-CN":`按启用状态过滤`}},level:{type:`string`,valueHint:`<level>`,choices:Yy,description:{"en-US":`Filter by alert level`,"zh-CN":`按告警等级过滤`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},exampleArgs:[``,`--enabled true`,`--name 失败率 --level ERROR`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={workspaceId:t.workspaceId,bizSource:`bailian`,resourceType:`model`,ruleId:n.ruleId,name:n.name,enabled:n.enabled,level:n.level,maxResults:n.maxResults??20,skip:n.skip??0,nextToken:n.nextToken};if(t.dryRun){A({api:gb,data:{reqDTO:i},...E(t)},r);return}await $y(e.client,t.workspaceId,e.identity.binName,t);let a=rb(await e.client.console(gb,{reqDTO:i}));if(r===`json`){A(a,r);return}_b(a.list),a.nextToken&&process.stdout.write(`Next page: --next-token ${a.nextToken}\n`)}});const yb=`zeldaEasy.bailian-telemetry.alertRule.createAlertRule`;var bb=w({description:{"en-US":`Create a model alert rule from an alert template`,"zh-CN":`基于告警模板创建模型告警规则`},auth:`console`,usageArgs:`--name <name> --template-id <id> --model <model> [flags]`,flags:Xy,notes:[{"en-US":"Alert conditions come from the template; browse `alert template list` first. Notification contacts/contact groups are created in the CloudMonitor console — pass their IDs via --contact/--contact-group.","zh-CN":"告警条件来自模板,请先用 `alert template list` 挑选。通知联系人/联系组需在云监控控制台创建,本命令通过 --contact/--contact-group 接收其 ID。"}],exampleArgs:[`--name high-failure-rate --template-id 123 --model qwen3.6-plus`,`--name latency --template-id 456 --model qwen3.6-plus,qwen-turbo --level ERROR --contact-group 4004200`,`--name nightly --template-id 123 --model qwen3.6-plus --notify-window 09:00-18:00 --notify-days 1,2,3,4,5 --silence 3600`,`--name test --template-id 123 --model qwen3.6-plus --dry-run`],validate:e=>Zy(e),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={...t.workspaceId?{workspaceId:t.workspaceId}:{},...Qy(n)};if(t.dryRun){A({api:yb,data:{reqDTO:i},...E(t)},r);return}await $y(e.client,t.workspaceId,e.identity.binName,t);let a=await e.client.console(yb,{reqDTO:i}),o=lr(a),s=o.data??o.ruleId??o;if(r===`json`){A({created:!0,ruleId:s},r);return}process.stdout.write(`Alert rule created${s?`: ${s}`:`.`}\n`)}});const xb=`zeldaEasy.bailian-telemetry.alertRule.updateAlertRule`;var Sb=w({description:{"en-US":`Update a model alert rule (full replacement; same fields as create)`,"zh-CN":`更新模型告警规则(整体替换,字段与 create 一致)`},auth:`console`,usageArgs:`--rule-id <id> --name <name> --template-id <id> --model <model> [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Alert rule ID (from `alert list`)","zh-CN":`告警规则 ID(可由 alert list 获得)`}},...Xy},exampleArgs:[`--rule-id 789 --name high-failure-rate --template-id 123 --model qwen3.6-plus --level WARNING`,`--rule-id 789 --name nightly --template-id 123 --model qwen3.6-plus --silence 1800`,`--rule-id 789 --name test --template-id 123 --model qwen3.6-plus --dry-run`],validate:e=>Zy(e),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={...t.workspaceId?{workspaceId:t.workspaceId}:{},ruleId:n.ruleId,...Qy(n)};if(t.dryRun){A({api:xb,data:{reqDTO:i},...E(t)},r);return}if(await $y(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(xb,{reqDTO:i}),r===`json`){A({updated:!0,ruleId:n.ruleId},r);return}process.stdout.write(`Alert rule updated: ${n.ruleId}\n`)}});const Cb=`zeldaEasy.bailian-telemetry.alertRule.deleteAlertRules`;var wb=w({description:{"en-US":`Delete model alert rules`,"zh-CN":`删除模型告警规则`},auth:`console`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified alert rules and cannot be undone.`,"zh-CN":`该操作会永久删除指定的告警规则,且无法撤销。`}},usageArgs:`--rule-id <id>[,<id>...] [--yes]`,flags:{ruleId:{type:`string`,valueHint:`<id>[,<id>...]`,required:!0,description:{"en-US":`Rule ID(s) to delete, comma-separated`,"zh-CN":`要删除的规则 ID,多个以逗号分隔`}}},exampleArgs:[`--rule-id 789`,`--rule-id 789,790 --dry-run`,`--rule-id 789 --yes`],notes:[{"en-US":`Irreversible — the alert rules are permanently removed.`,"zh-CN":`该操作不可撤销——告警规则将被永久删除。`}],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={ruleIds:W(n.ruleId)};if(t.dryRun){A({api:Cb,data:{reqDTO:i},...E(t)},r);return}if(await $y(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(Cb,{reqDTO:i}),r===`json`){A({deleted:i.ruleIds},r);return}process.stdout.write(`Deleted ${i.ruleIds.length} alert rule(s).\n`)}}),Tb=w({description:{"en-US":`Enable a model alert rule`,"zh-CN":`启用模型告警规则`},auth:`console`,usageArgs:`--rule-id <id> [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Alert rule ID`,"zh-CN":`告警规则 ID`}}},exampleArgs:[`--rule-id 789`,`--rule-id 789 --dry-run`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={workspaceId:t.workspaceId,bizSource:`bailian`,ruleId:n.ruleId};if(t.dryRun){A({api:`zeldaEasy.bailian-telemetry.alertRule.enableAlertRule`,data:{reqDTO:i},...E(t)},r);return}if(await $y(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(`zeldaEasy.bailian-telemetry.alertRule.enableAlertRule`,{reqDTO:i}),r===`json`){A({enabled:!0,ruleId:n.ruleId},r);return}process.stdout.write(`Alert rule enabled: ${n.ruleId}\n`)}});const Eb=`zeldaEasy.bailian-telemetry.alertRule.disableAlertRule`;var Db=w({description:{"en-US":`Disable a model alert rule (keeps the rule, stops notifications)`,"zh-CN":`停用模型告警规则(保留规则,停止通知)`},auth:`console`,usageArgs:`--rule-id <id> [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Alert rule ID`,"zh-CN":`告警规则 ID`}}},exampleArgs:[`--rule-id 789`,`--rule-id 789 --dry-run`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={workspaceId:t.workspaceId,bizSource:`bailian`,ruleId:n.ruleId};if(t.dryRun){A({api:Eb,data:{reqDTO:i},...E(t)},r);return}if(await $y(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(Eb,{reqDTO:i}),r===`json`){A({enabled:!1,ruleId:n.ruleId},r);return}process.stdout.write(`Alert rule disabled: ${n.ruleId}\n`)}});const Ob=`zeldaEasy.bailian-telemetry.alertRule.listAlertHistories`;function kb(e){let t=e.instanceDetail;return t&&Object.entries(t).map(([e,t])=>`${e}:${t}`).join(`,`)||`-`}var Ab=w({description:{"en-US":`List model alert history (firing and recovered events)`,"zh-CN":`查看模型告警历史(告警中与已恢复事件)`},auth:`console`,usageArgs:`[--rule-id <id>] [--status <status>] [flags]`,flags:{...Ph,ruleId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by alert rule ID`,"zh-CN":`按告警规则 ID 过滤`}},status:{type:`string`,valueHint:`<status>`,choices:[`ALARM`,`OK`],description:{"en-US":`Alert state: ALARM (firing), OK (recovered)`,"zh-CN":`告警状态:ALARM(告警中)、OK(已恢复)`}},level:{type:`string`,valueHint:`<level>`,choices:Yy,description:{"en-US":`Filter by highest alert level`,"zh-CN":`按最高告警等级过滤`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page, 1-50 (default: 10)`,"zh-CN":`每页数量,范围 1-50(默认:10)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},exampleArgs:[``,`--status ALARM --days 1`,`--rule-id 789 --days 30`,`--level ERROR --output json`],validate:e=>{if(e.maxResults!=null&&(e.maxResults<1||e.maxResults>50))return`--max-results must be between 1 and 50.`},async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,{startTime:i,endTime:a}=Ih(n),o={workspaceId:t.workspaceId,bizSource:`bailian`,resourceType:`model`,alertRuleId:n.ruleId,status:n.status,maxLevel:n.level,startTimeFrom:i,startTimeTo:a,maxResults:n.maxResults??10,skip:n.skip??0,nextToken:n.nextToken};if(t.dryRun){A({api:Ob,data:{reqDTO:o},...E(t)},r);return}await $y(e.client,t.workspaceId,e.identity.binName,t);let s=rb(await e.client.console(Ob,{reqDTO:o}));if(r===`json`){A(s,r);return}if(s.list.length===0){process.stdout.write(`No alert history found in this range.
2826
- `);return}let c=O(process.stdout),l=Jr({headers:[`Start Time`,`Rule`,`Status`,`Max Level`,`Count`,`Instance`],rows:s.list.map(e=>[e.startTime?U(e.startTime):`-`,e.ruleDisplayName??e.alertRuleId,e.status??`-`,e.maxLevel??`-`,String(e.count??0),kb(e)]),align:[`left`,`left`,`left`,`left`,`right`,`left`],cellColor:(e,t,n)=>{if(t===2)return n===`ALARM`?c.red(n):c.green(n);if(t===3&&n===`ERROR`)return c.red(n)}});for(let e of l)process.stdout.write(e+`
2827
- `);s.nextToken&&process.stdout.write(`Next page: --next-token ${s.nextToken}\n`)}});function jb(e){return e==null?`-`:e?`yes`:`no`}function Mb(e,t,n){if(e.length===0){process.stdout.write(`No model permissions found.\n${n}\n`);return}let r=[`Model`,`Name`,`Inference`,`Fine-tune`,`Deploy`],i=e.map(e=>[e.model,e.name??`-`,jb(e.permissions?.inference),jb(e.permissions?.fine_tune),jb(e.permissions?.deploy)]),a=Jr({headers:r,rows:i,align:[`left`,`left`,`right`,`right`,`right`]});for(let e of a)process.stdout.write(e+`
2828
- `);process.stdout.write(`\nTotal: ${t}\n`)}var Nb=w({description:{"en-US":`List model permissions (inference / fine-tune / deploy) in the workspace`,"zh-CN":`列出 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:{"en-US":`Authorization scope: authorizable (default, full catalog), authorized`,"zh-CN":`授权范围:authorizable(默认,完整目录)、authorized(已授权)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (exact match)`,"zh-CN":`模型 ID(精确匹配)`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy search by model name or ID`,"zh-CN":`按模型名称或 ID 模糊搜索`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 20)`,"zh-CN":`每页结果数(默认:20)`}}},exampleArgs:[``,`--model qwen-plus`,`--scope authorized`,`--name qwen --page-size 50`,`--output text`],notes:[{"en-US":"Default scope is `authorizable` (the full grantable catalog); use `--scope authorized` to see only models already granted.","zh-CN":"默认范围为 `authorizable`(完整可授权目录);使用 `--scope authorized` 仅查看已授权模型。"},{"en-US":"Output defaults to JSON; pass `--output text` for a table. Permission values are tri-state: true / false / null (never set).","zh-CN":"默认输出 JSON;传入 `--output text` 可查看表格。权限值为三态:true / false / null(从未设置)。"},{"en-US":`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.`,"zh-CN":`这些值原样反映 API Key 所绑定 Workspace 的服务端授权记录。显示 false/null 的模型仍可能可以调用(访问权限可能来自其他渠道);准确语义请参阅百炼模型授权文档。`}],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(cn()),method:`GET`,query:a},r);return}let o=await e.client.requestJson({path:cn()+kh(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;Mb(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 Pb=[`inference`,`finetune`,`deploy`];function Fb(e){if(!e)return[`inference`];let t=W(e);if(t.length===0)return{error:`--action must not be empty.`};for(let e of t)if(!Pb.includes(e))return{error:`--action "${e}" is invalid; use ${Pb.join(`, `)}.`};return t}function Ib(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=Fb(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=W(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 Lb(e,t,n){let r=e.settings.outputExplicit?T(e.settings.output):`json`,i=Fb(t.action),a=t.model?W(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(cn()),method:`POST`,request:o},r);return}let s=await e.client.requestJson({path:cn(),method:`POST`,body:o}),c=n?`granted`:`revoked`;if(r===`json`){let e=t.all?{all:!0,action:`inference`}:{models:a,actions:i};A({...e,[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).
2814
+ `))}});const Ob={model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model name(s), comma-separated`,"zh-CN":`模型名称,多个名称以逗号分隔`}},apiKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`API key ID(s), comma-separated`,"zh-CN":`API Key ID,多个以逗号分隔`}}};var kb=w({description:{"en-US":`Count model inference logs in a time range (useful before exporting)`,"zh-CN":`统计时间范围内的模型推理日志条数(导出前预估量级)`},auth:`console`,usageArgs:`[--model <model>] [--hours <n>] [flags]`,flags:{...kg,...Ob},exampleArgs:[``,`--model qwen3.6-plus --hours 24`,`--output json`],notes:[{"en-US":`Only calls made while inference log delivery was enabled are counted.`,"zh-CN":`仅统计推理日志投递开启期间产生的调用。`}],validate:e=>cb(e.hours),async run(e){await ub(e,`inference`,e.flags,()=>Og(e.flags,1/24))}}),Ab=w({description:{"en-US":`Enable inference log delivery to SLS (SLR authorization → SLS instance → log switch)`,"zh-CN":`开启推理日志投递到 SLS(SLR 授权 → SLS 实例初始化 → 打开日志开关)`},auth:`console`,usageArgs:`[--no-wait] [flags]`,flags:sb,notes:[{"en-US":`Steps: 1) authorize the SLS service-linked role, 2) initialize the SLS store instance (async), 3) turn on inference log delivery for all models in the workspace.`,"zh-CN":`开启链路:1)授权 SLS 服务关联角色;2)初始化 SLS 存储实例(异步);3)为当前业务空间全部模型打开推理日志开关。`},{"en-US":"Requires the audit log to be enabled first (`log audit enable`) — the console enforces the same rule.","zh-CN":"需先开启审计日志(`log audit enable`)——与控制台规则一致。"}],exampleArgs:[``,`--no-wait`,`--output json`],async run(e){let t=T(e.settings.output),n={client:e.client,settings:e.settings,binName:e.identity.binName,format:t,noWait:e.flags.noWait};e.settings.dryRun||await rb(e.client,e.settings.workspaceId,e.identity.binName),await ab(n,`inference`,db.inference)}}),jb=w({description:{"en-US":`Disable inference log delivery for all models in the workspace`,"zh-CN":`关闭当前业务空间全部模型的推理日志投递`},auth:`console`,usageArgs:`[flags]`,notes:[{"en-US":"Only the inference log (request/response content) is disabled; the audit log keeps its own switch (`log audit disable`).","zh-CN":"仅关闭推理日志(请求/响应内容);审计日志有独立开关(`log audit disable`)。"}],exampleArgs:[``,`--dry-run`,`--output json`],async run(e){let t=T(e.settings.output);await ob({client:e.client,settings:e.settings,binName:e.identity.binName,format:t},`inference`)}});const Mb=`zeldaEasy.bailian-telemetry.trace.listTracesWithOss`,Nb={0:`Unset`,1:`OK`,2:`Error`};function Pb(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No traces found in this range.
2815
+ `);return}let n=Zr({headers:[`Time`,`Trace ID`,`Span`,`Status`,`Duration`,`Tokens`],rows:e.map(e=>[W(e.startTime),e.traceId??`-`,e.spanName??`-`,Nb[e.statusCode??`0`]??e.statusCode??`-`,e.callDuration==null?e.duration??`-`:`${U(e.callDuration)} ms`,e.totalTokens==null?`-`:U(e.totalTokens)]),align:[`left`,`left`,`left`,`left`,`right`,`right`],cellColor:(e,n,r)=>{if(n===3){if(r===`Error`)return t.red(r);if(r===`OK`)return t.green(r)}}});for(let e of n)process.stdout.write(e+`
2816
+ `)}var Fb=w({description:{"en-US":`List call traces for a model or app`,"zh-CN":`查询模型或应用的调用链列表`},auth:`console`,usageArgs:`--resource-id <id> [flags]`,flags:{...kg,resourceId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Model name or app ID to query traces for`,"zh-CN":`要查询调用链的模型名称或应用 ID`}},resourceType:{type:`string`,valueHint:`<type>`,choices:[`model`,`app`],description:{"en-US":`Resource type: model, app (default: model)`,"zh-CN":`资源类型:model、app(默认:model)`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}}},exampleArgs:[`--resource-id qwen3.6-plus`,`--resource-id qwen3.6-plus --hours 24 --max-results 50`,`--resource-id 123456 --resource-type app --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n,1/24),o={...t.workspaceId?{workspaceId:t.workspaceId}:{},resourceId:n.resourceId,resourceType:n.resourceType??`model`,startTime:i,endTime:a,maxResults:n.maxResults??20,skip:n.skip??0,nextToken:``};if(t.dryRun){A({api:Mb,data:{reqDTO:o},...E(t)},r);return}Tg(t);let s=await Ng(await Cg(e.client,Mb,o)),c=Array.isArray(s)?s:s?.list??[],l=Array.isArray(s)?void 0:s?.totalCount;if(r===`json`){A({totalCount:l,list:c},r);return}Pb(c)}});const Ib=`zeldaEasy.bailian-telemetry.trace.getTraceWithOss`;function Lb(e,t){let n=O(process.stdout),r=` `.repeat(t),i=Nb[e.statusCode??`0`]??`-`,a=e.callDuration==null?e.duration??`-`:`${U(e.callDuration)} ms`,o=e.totalTokens==null?``:`, ${U(e.totalTokens)} tokens`,s=i===`Error`?n.red(i):i;process.stdout.write(`${r}${e.spanName??`-`} ${n.dim(`[${s}, ${a}${o}]`)}\n`),e.statusCode===`2`&&e.statusMessage&&process.stdout.write(`${r} ${n.red(e.statusMessage)}\n`);for(let n of e.children??[])Lb(n,t+1)}var Rb=w({description:{"en-US":`Show a single call trace with its span tree`,"zh-CN":`查看单条调用链详情(含 span 树)`},auth:`console`,usageArgs:`--trace-id <id> [flags]`,flags:{...kg,traceId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Trace ID (from `log trace list`)","zh-CN":`调用链 ID(可由 log trace list 获得)`}},resourceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Model name or app ID (narrows the search)`,"zh-CN":`模型名称或应用 ID(缩小查询范围)`}}},exampleArgs:[`--trace-id 0a1b2c3d4e5f --hours 24`,`--trace-id 0a1b2c3d4e5f --resource-id qwen3.6-plus`,`--trace-id 0a1b2c3d4e5f --output json`],async run(e){let{settings:t,flags:r}=e,i=T(t.output),{startTime:a,endTime:o}=Og(r,1),s={...t.workspaceId?{workspaceId:t.workspaceId}:{},traceId:r.traceId,resourceId:r.resourceId,startTime:a,endTime:o};if(t.dryRun){A({api:Ib,data:{reqDTO:s},...E(t)},i);return}Tg(t);let c=await Ng(await Cg(e.client,Ib,s));if(!c||!c.traceId)throw new n(`No trace found for ${r.traceId} in the selected range.`,f.GENERAL,`Widen the window with --hours/--start-time, or check the trace ID.`);if(i===`json`){A(c,i);return}let l=O(process.stdout);process.stdout.write(`${l.bold(`Trace`)} ${c.traceId} ${l.dim(W(c.startTime))}\n\n`),Lb(c,0)}});const zb=`zeldaEasy.bailian-telemetry.trace.getTraceStatistic`;var Bb=w({description:{"en-US":`Show per-resource trace statistics (calls, tokens, latency)`,"zh-CN":`查看调用链维度统计(调用量、Token、延迟)`},auth:`console`,usageArgs:`[--resource-id <id>] [flags]`,flags:{...kg,resourceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Model name(s) or app ID(s), comma-separated; omit for all`,"zh-CN":`模型名称或应用 ID,多个以逗号分隔;省略表示全部`}},resourceType:{type:`string`,valueHint:`<type>`,choices:[`model`,`app`],description:{"en-US":`Resource type: model, app (default: model)`,"zh-CN":`资源类型:model、app(默认:model)`}}},exampleArgs:[``,`--resource-id qwen3.6-plus --hours 24`,`--resource-type app --output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),{startTime:i,endTime:a}=Og(n,1/24),o={...t.workspaceId?{workspaceId:t.workspaceId,filterWorkspaceId:t.workspaceId}:{},resourceIdList:n.resourceId?V(n.resourceId):void 0,resourceType:n.resourceType??`model`,startTime:i,endTime:a};if(t.dryRun){A({api:zb,data:{reqDTO:o},...E(t)},r);return}Tg(t);let s=await Cg(e.client,zb,o),c=Object.values(s);if(r===`json`){A({period:{start:W(i),end:W(a)},list:c},r);return}if(c.length===0){process.stdout.write(`No trace statistics found in this range.
2817
+ `);return}let l=Zr({headers:[`Resource`,`Calls`,`Total Tokens`,`Avg Duration`,`Avg First Token`],rows:c.map(e=>[e.resourceId??`-`,U(Number(e.callCount??0)),U(Number(e.totalTokens??0)),e.avgDuration?`${U(Math.round(Number(e.avgDuration)))} ms`:`-`,e.avgLlmFirstTokenDuration?`${U(Math.round(Number(e.avgLlmFirstTokenDuration)))} ms`:`-`]),align:[`left`,`right`,`right`,`right`,`right`]});for(let e of l)process.stdout.write(e+`
2818
+ `)}});const Vb=[`INFO`,`WARNING`,`ERROR`],Hb={name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Alert rule name (max 64 chars)`,"zh-CN":`告警规则名称(最长 64 字符)`}},templateId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Alert template ID (from `alert template list`)","zh-CN":`告警模板 ID(可由 alert template list 获得)`}},model:{type:`string`,valueHint:`<model>`,required:!0,description:{"en-US":`Model name(s) to alert on, comma-separated`,"zh-CN":`告警生效的模型名称,多个以逗号分隔`}},message:{type:`string`,valueHint:`<text>`,description:{"en-US":`Alert notification content (Go template); defaults to the console template`,"zh-CN":`告警通知内容(Go 模板语法),默认与控制台一致`}},level:{type:`string`,valueHint:`<level>`,choices:Vb,description:{"en-US":`Alert level (default: INFO)`,"zh-CN":`告警等级(默认:INFO)`}},interval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Check interval in seconds (default: 60)`,"zh-CN":`告警检查周期(秒,默认:60)`}},duration:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`How long the condition must hold before alerting; 0 = immediately (default: 60)`,"zh-CN":`条件持续多久后告警(秒),0 表示立即告警(默认:60)`}},contact:{type:`string`,valueHint:`<id>`,description:{"en-US":`CMS alert contact ID(s), comma-separated; create them in the CloudMonitor console`,"zh-CN":`云监控告警联系人 ID,多个以逗号分隔;需在云监控控制台创建`}},contactGroup:{type:`string`,valueHint:`<id>`,description:{"en-US":`CMS alert contact group ID(s), comma-separated`,"zh-CN":`云监控告警联系组 ID,多个以逗号分隔`}},notifyWindow:{type:`string`,valueHint:`<HH:mm-HH:mm>`,description:{"en-US":`Daily notification window (default: 00:00-23:59)`,"zh-CN":`每日通知时间窗口(默认:00:00-23:59)`}},notifyDays:{type:`string`,valueHint:`<days>`,description:{"en-US":`Days of week to notify, 1-7 comma-separated (default: every day)`,"zh-CN":`每周通知日,1-7 逗号分隔(默认:每天)`}},silence:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Silence period between repeat notifications (default: never repeat)`,"zh-CN":`重复通知的静默时间(秒,默认:不重复通知)`}},gmtOffset:{type:`string`,valueHint:`<offset>`,description:{"en-US":`Timezone offset for the notify window (default: +0800)`,"zh-CN":`通知窗口的时区偏移(默认:+0800)`}}};function Ub(e){if(e.notifyWindow&&!/^(\d{2}:\d{2})-(\d{2}:\d{2})$/.exec(e.notifyWindow))return`--notify-window must be in HH:mm-HH:mm format, e.g. 09:00-18:00.`;if(e.notifyDays&&V(e.notifyDays).filter(e=>!/^[1-7]$/.test(e)).length>0)return`--notify-days accepts values 1-7, e.g. 1,2,3,4,5.`;if(e.interval!=null&&e.interval<1)return`--interval must be positive seconds.`;if(e.duration!=null&&e.duration<0)return`--duration must be >= 0 seconds.`;if(e.silence!=null&&e.silence<0)return`--silence must be >= 0 seconds.`;if(e.gmtOffset!=null&&!/^[+-]\d{4}$/.test(e.gmtOffset))return`--gmt-offset must look like +0800.`}function Wb(e){if(e.interval===0)throw new C(`--interval must be positive seconds.`);let t=e.notifyWindow?/^(\d{2}:\d{2})-(\d{2}:\d{2})$/.exec(e.notifyWindow):null;return{name:e.name,templateId:e.templateId,resourceIds:V(e.model),message:e.message??`业务空间({{$tags.workspace_id}})下的模型({{$tags.model}})发生告警,当前值为{{ printf "%.2f" $value }}`,level:e.level??`INFO`,interval:e.interval??60,duration:e.duration??60,notification:{startTime:t?.[1]??`00:00`,endTime:t?.[2]??`23:59`,gmtOffset:e.gmtOffset??`+0800`,dayOfWeek:e.notifyDays?V(e.notifyDays).map(Number):[1,2,3,4,5,6,7],silenceTime:e.silence??2147483647,contacts:e.contact?V(e.contact):void 0,contactGroups:e.contactGroup?V(e.contactGroup):void 0}}}async function Gb(e,t,n,r){Tg(r),await Ig(e,{serviceType:`ModelMonitor`,workspaceId:t,enableCommand:`${n} monitor delivery enable`,requireInstance:!1})}const Kb=[`>`,`>=`,`<`,`<=`,`==`,`!=`];function qb(e){let t=e.split(`:`);if(t.length!==5)throw new C(`Invalid --condition "${e}". Expected metricName:aggregator:compareType:value:period. If the value contains > or <, wrap the whole condition in quotes so the shell does not treat it as redirection.`);let[n,r,i,a,o]=t;if(!n||!r)throw new C(`Invalid --condition "${e}": metricName and aggregator are required.`);if(!Kb.includes(i))throw new C(`Invalid --condition "${e}": compareType must be one of ${Kb.join(` `)}.`);let s=Number(o);if(!Number.isFinite(s)||s<1)throw new C(`Invalid --condition "${e}": period must be positive seconds.`);return{metricName:n,aggregator:r,compareType:i,compareValue:a,period:s}}function Jb(e,t){if(!e||e.length===0)return t?void 0:`At least one --condition is required (or use --from to copy a template).`;if(e.length>10)return`At most 10 --condition entries are allowed.`;for(let t of e)try{qb(t)}catch(e){return e instanceof Error?e.message:String(e)}}function Yb(e){let t=fr(e);return{list:t.list??[],totalCount:t.totalCount??0,nextToken:t.nextToken}}const Xb=`zeldaEasy.bailian-telemetry.alertMetric.listMetrics`;var Zb=w({description:{"en-US":`List metrics that alert rules can be created on, with supported aggregations`,"zh-CN":`查看可创建告警的指标及其支持的聚合方式`},auth:`console`,usageArgs:`[flags]`,exampleArgs:[``,`--output json`],async run(e){let{settings:t}=e,n=t.outputExplicit?T(t.output):`json`;if(t.dryRun){A({api:Xb,data:{reqDTO:{workspaceId:t.workspaceId,resourceType:`model`}},...E(t)},n);return}await Gb(e.client,t.workspaceId,e.identity.binName,t);let r=await e.client.console(Xb,{reqDTO:{workspaceId:t.workspaceId,resourceType:`model`}}),i=fr(r),a=Array.isArray(i)?i:i.list??i.result??[];if(n===`json`){A(a,n);return}if(a.length===0){process.stdout.write(`No alertable metrics found.
2819
+ `);return}let o=Zr({headers:[`Metric`,`Aggregations`,`Unit`,`Description`],rows:a.map(e=>[e.metricName,(e.aggregators??[]).join(`, `),e.unit??`-`,e.desc??`-`]),align:[`left`,`left`,`left`,`left`]});for(let e of o)process.stdout.write(e+`
2820
+ `)}});const Qb=`zeldaEasy.bailian-telemetry.alertTemplate.listAlertTemplates`;function $b(e){let t=e.metricName??e.alertMetric??`?`;return`${e.aggregator?`${e.aggregator} `:``}${t} ${e.compareType} ${e.compareValue} (${e.period}s)`}var ex=w({description:{"en-US":`List alert templates (official and custom); pass --template-id for details`,"zh-CN":`查看告警模板(官方与自定义);传 --template-id 查看单个模板详情`},auth:`console`,usageArgs:`[--name <name>] [--source <source>] [flags]`,flags:{templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact template ID (view a single template)`,"zh-CN":`精确模板 ID(查看单个模板)`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy filter by template name`,"zh-CN":`按模板名称模糊过滤`}},source:{type:`string`,valueHint:`<source>`,choices:[`Official`,`Customize`],description:{"en-US":`Template source: Official, Customize; omit for all`,"zh-CN":`模板来源:Official、Customize;省略表示全部`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 50)`,"zh-CN":`每页数量(默认:50)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}}},exampleArgs:[``,`--source Official`,`--name 失败率`,`--template-id 123 --output json`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={resourceType:`model`,templateId:n.templateId,templateName:n.name,source:n.source,maxResults:n.maxResults??50,skip:n.skip??0};if(t.dryRun){A({api:Qb,data:{reqDTO:i},...E(t)},r);return}await Gb(e.client,t.workspaceId,e.identity.binName,t);let a=Yb(await e.client.console(Qb,{reqDTO:i}));if(r===`json`){A(a,r);return}if(a.list.length===0){process.stdout.write(`No alert templates found.
2821
+ `);return}let o=Zr({headers:[`Template ID`,`Name`,`Source`,`Conditions`],rows:a.list.map(e=>[e.templateId,e.templateName,e.source===`Official`?`Official`:`Custom`,(e.conditions??[]).map($b).join(e.logicalOperator===`and`?` AND `:` OR `)||`-`]),align:[`left`,`left`,`left`,`left`]});for(let e of o)process.stdout.write(e+`
2822
+ `)}});const tx=`zeldaEasy.bailian-telemetry.alertTemplate.createAlertTemplate`;async function nx(e,t){if(t.condition?.length)return t.condition.map(qb);if(!t.from)return[];let r=Yb(await e.client.console(`zeldaEasy.bailian-telemetry.alertTemplate.listAlertTemplates`,{reqDTO:{resourceType:`model`,templateId:t.from,maxResults:1,skip:0}})).list[0];if(!r)throw new n(`Source template not found: ${t.from}`,f.GENERAL,"Check the ID with `alert template list`.");return(r.conditions??[]).map(e=>({metricName:e.metricName,aggregator:e.aggregator,compareType:e.compareType,compareValue:e.compareValue,period:e.period}))}var rx=w({description:{"en-US":`Create a custom alert template (or copy an official one with --from)`,"zh-CN":`创建自定义告警模板(或用 --from 复制官方模板)`},auth:`console`,usageArgs:`--name <name> [--condition <metric:agg:cmp:value:period>...] [--from <template-id>] [flags]`,flags:{name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Template name (max 64 chars)`,"zh-CN":`模板名称(最长 64 字符)`}},condition:{type:`array`,valueHint:`<metric:agg:cmp:value:period>`,description:{"en-US":"Alert condition, repeatable (1-10). Example: 'model_call_failed_count:sum:>:10:60' (quote it: > is a shell metacharacter). See `alert metrics` for metric names","zh-CN":"告警条件,可重复(1-10 条)。示例:'model_call_failed_count:sum:>:10:60'(含 > 等 shell 特殊字符,需加引号)。指标名见 `alert metrics`"}},from:{type:`string`,valueHint:`<template-id>`,description:{"en-US":`Copy conditions from an existing (e.g. official) template`,"zh-CN":`复制已有(如官方)模板的条件`}},logicalOperator:{type:`string`,valueHint:`<op>`,choices:[`or`,`and`],description:{"en-US":`How multiple conditions combine (default: or)`,"zh-CN":`多条件组合逻辑(默认:or)`}}},exampleArgs:[`--name 失败率告警 --condition 'model_call_failed_count:sum:>:10:60'`,`--name 高延迟 --condition 'model_call_duration:avg:>:3000:300' --condition 'model_call_5xx_count:sum:>:5:60' --logical-operator and`,`--name 我的模板 --from <template-id>`,`--name test --condition 'model_call_count:sum:>:100:60' --dry-run`],validate:e=>Jb(e.condition,!!e.from),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i=n.condition?.length?n.condition.map(qb):void 0;if(t.dryRun){A({api:tx,data:{reqDTO:{templateName:n.name,resourceType:`model`,logicalOperator:n.logicalOperator??`or`,srcTemplateId:n.from,conditions:i??`(copied from --from template)`}},...E(t)},r);return}await Gb(e.client,t.workspaceId,e.identity.binName,t);let a={templateName:n.name,resourceType:`model`,logicalOperator:n.logicalOperator??`or`,srcTemplateId:n.from,conditions:i??await nx(e,n)},o=await e.client.console(tx,{reqDTO:a}),s=fr(o),c=s.data??s.templateId??s;if(r===`json`){A({created:!0,templateId:c},r);return}process.stdout.write(`Alert template created${c?`: ${c}`:`.`}\n`)}});const ix=`zeldaEasy.bailian-telemetry.alertTemplate.updateAlertTemplate`;var ax=w({description:{"en-US":`Update a custom alert template (full replacement of conditions)`,"zh-CN":`更新自定义告警模板(整体替换条件)`},auth:`console`,usageArgs:`--template-id <id> --name <name> --condition <metric:agg:cmp:value:period>... [flags]`,flags:{templateId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Template ID (from `alert template list`)","zh-CN":`模板 ID(可由 alert template list 获得)`}},name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Template name (max 64 chars)`,"zh-CN":`模板名称(最长 64 字符)`}},condition:{type:`array`,valueHint:`<metric:agg:cmp:value:period>`,description:{"en-US":`Alert condition, repeatable (1-10). Example: 'model_call_failed_count:sum:>:10:60' (quote it: > is a shell metacharacter)`,"zh-CN":`告警条件,可重复(1-10 条)。示例:'model_call_failed_count:sum:>:10:60'(含 > 等 shell 特殊字符,需加引号)`}},logicalOperator:{type:`string`,valueHint:`<op>`,choices:[`or`,`and`],description:{"en-US":`How multiple conditions combine (default: or)`,"zh-CN":`多条件组合逻辑(默认:or)`}}},exampleArgs:[`--template-id 123 --name 失败率告警 --condition 'model_call_failed_count:sum:>:20:60'`,`--template-id 123 --name test --condition 'model_call_count:sum:>:100:60' --dry-run`],validate:e=>Jb(e.condition,!1),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={templateId:n.templateId,templateName:n.name,resourceType:`model`,logicalOperator:n.logicalOperator??`or`,conditions:(n.condition??[]).map(qb)};if(t.dryRun){A({api:ix,data:{reqDTO:i},...E(t)},r);return}if(await Gb(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(ix,{reqDTO:i}),r===`json`){A({updated:!0,templateId:n.templateId},r);return}process.stdout.write(`Alert template updated: ${n.templateId}\n`)}});const ox=`zeldaEasy.bailian-telemetry.alertTemplate.deleteAlertTemplates`;var sx=w({description:{"en-US":`Delete custom alert templates (official templates cannot be deleted)`,"zh-CN":`删除自定义告警模板(官方模板不可删除)`},auth:`console`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified alert templates and cannot be undone.`,"zh-CN":`该操作会永久删除指定的告警模板,且无法撤销。`}},usageArgs:`--template-id <id>[,<id>...] [--yes]`,flags:{templateId:{type:`string`,valueHint:`<id>[,<id>...]`,required:!0,description:{"en-US":`Template ID(s) to delete, comma-separated`,"zh-CN":`要删除的模板 ID,多个以逗号分隔`}}},exampleArgs:[`--template-id 123`,`--template-id 123,124 --dry-run`,`--template-id 123 --yes`],notes:[{"en-US":`Irreversible — the alert templates are permanently removed.`,"zh-CN":`该操作不可撤销——告警模板将被永久删除。`}],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={templateIds:V(n.templateId)};if(t.dryRun){A({api:ox,data:{reqDTO:i},...E(t)},r);return}await Gb(e.client,t.workspaceId,e.identity.binName,t);let a=await e.client.console(ox,{reqDTO:i}),o=fr(a);if(r===`json`){A({deleted:i.templateIds,result:o},r);return}process.stdout.write(`Deleted ${i.templateIds.length} alert template(s).\n`)}});const cx=`zeldaEasy.bailian-telemetry.alertRule.listAlertRules`;function lx(e){let t=O(process.stdout);if(e.length===0){process.stdout.write(`No alert rules found.
2823
+ `);return}let n=Zr({headers:[`Rule ID`,`Name`,`Level`,`Enabled`,`Models`,`Interval`],rows:e.map(e=>[e.ruleId,e.name,e.level??`-`,e.enabled?`ON`:`OFF`,(e.resourceIds??[]).join(`, `)||`-`,e.interval==null?`-`:`${e.interval}s`]),align:[`left`,`left`,`left`,`left`,`left`,`right`],cellColor:(e,n,r)=>{if(n===3)return r===`ON`?t.green(r):t.yellow(r);if(n===2&&r===`ERROR`)return t.red(r)}});for(let e of n)process.stdout.write(e+`
2824
+ `)}var ux=w({description:{"en-US":`List model alert rules`,"zh-CN":`查看模型告警规则列表`},auth:`console`,usageArgs:`[--name <name>] [--enabled true|false] [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Exact rule ID filter`,"zh-CN":`按规则 ID 精确过滤`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy filter by rule name`,"zh-CN":`按规则名称模糊过滤`}},enabled:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Filter by enabled state`,"zh-CN":`按启用状态过滤`}},level:{type:`string`,valueHint:`<level>`,choices:Vb,description:{"en-US":`Filter by alert level`,"zh-CN":`按告警等级过滤`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page (default: 20)`,"zh-CN":`每页数量(默认:20)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},exampleArgs:[``,`--enabled true`,`--name 失败率 --level ERROR`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={workspaceId:t.workspaceId,bizSource:`bailian`,resourceType:`model`,ruleId:n.ruleId,name:n.name,enabled:n.enabled,level:n.level,maxResults:n.maxResults??20,skip:n.skip??0,nextToken:n.nextToken};if(t.dryRun){A({api:cx,data:{reqDTO:i},...E(t)},r);return}await Gb(e.client,t.workspaceId,e.identity.binName,t);let a=Yb(await e.client.console(cx,{reqDTO:i}));if(r===`json`){A(a,r);return}lx(a.list),a.nextToken&&process.stdout.write(`Next page: --next-token ${a.nextToken}\n`)}});const dx=`zeldaEasy.bailian-telemetry.alertRule.createAlertRule`;var fx=w({description:{"en-US":`Create a model alert rule from an alert template`,"zh-CN":`基于告警模板创建模型告警规则`},auth:`console`,usageArgs:`--name <name> --template-id <id> --model <model> [flags]`,flags:Hb,notes:[{"en-US":"Alert conditions come from the template; browse `alert template list` first. Notification contacts/contact groups are created in the CloudMonitor console — pass their IDs via --contact/--contact-group.","zh-CN":"告警条件来自模板,请先用 `alert template list` 挑选。通知联系人/联系组需在云监控控制台创建,本命令通过 --contact/--contact-group 接收其 ID。"}],exampleArgs:[`--name high-failure-rate --template-id 123 --model qwen3.6-plus`,`--name latency --template-id 456 --model qwen3.6-plus,qwen-turbo --level ERROR --contact-group 4004200`,`--name nightly --template-id 123 --model qwen3.6-plus --notify-window 09:00-18:00 --notify-days 1,2,3,4,5 --silence 3600`,`--name test --template-id 123 --model qwen3.6-plus --dry-run`],validate:e=>Ub(e),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={...t.workspaceId?{workspaceId:t.workspaceId}:{},...Wb(n)};if(t.dryRun){A({api:dx,data:{reqDTO:i},...E(t)},r);return}await Gb(e.client,t.workspaceId,e.identity.binName,t);let a=await e.client.console(dx,{reqDTO:i}),o=fr(a),s=o.data??o.ruleId??o;if(r===`json`){A({created:!0,ruleId:s},r);return}process.stdout.write(`Alert rule created${s?`: ${s}`:`.`}\n`)}});const px=`zeldaEasy.bailian-telemetry.alertRule.updateAlertRule`;var mx=w({description:{"en-US":`Update a model alert rule (full replacement; same fields as create)`,"zh-CN":`更新模型告警规则(整体替换,字段与 create 一致)`},auth:`console`,usageArgs:`--rule-id <id> --name <name> --template-id <id> --model <model> [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":"Alert rule ID (from `alert list`)","zh-CN":`告警规则 ID(可由 alert list 获得)`}},...Hb},exampleArgs:[`--rule-id 789 --name high-failure-rate --template-id 123 --model qwen3.6-plus --level WARNING`,`--rule-id 789 --name nightly --template-id 123 --model qwen3.6-plus --silence 1800`,`--rule-id 789 --name test --template-id 123 --model qwen3.6-plus --dry-run`],validate:e=>Ub(e),async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={...t.workspaceId?{workspaceId:t.workspaceId}:{},ruleId:n.ruleId,...Wb(n)};if(t.dryRun){A({api:px,data:{reqDTO:i},...E(t)},r);return}if(await Gb(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(px,{reqDTO:i}),r===`json`){A({updated:!0,ruleId:n.ruleId},r);return}process.stdout.write(`Alert rule updated: ${n.ruleId}\n`)}});const hx=`zeldaEasy.bailian-telemetry.alertRule.deleteAlertRules`;var gx=w({description:{"en-US":`Delete model alert rules`,"zh-CN":`删除模型告警规则`},auth:`console`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified alert rules and cannot be undone.`,"zh-CN":`该操作会永久删除指定的告警规则,且无法撤销。`}},usageArgs:`--rule-id <id>[,<id>...] [--yes]`,flags:{ruleId:{type:`string`,valueHint:`<id>[,<id>...]`,required:!0,description:{"en-US":`Rule ID(s) to delete, comma-separated`,"zh-CN":`要删除的规则 ID,多个以逗号分隔`}}},exampleArgs:[`--rule-id 789`,`--rule-id 789,790 --dry-run`,`--rule-id 789 --yes`],notes:[{"en-US":`Irreversible — the alert rules are permanently removed.`,"zh-CN":`该操作不可撤销——告警规则将被永久删除。`}],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={ruleIds:V(n.ruleId)};if(t.dryRun){A({api:hx,data:{reqDTO:i},...E(t)},r);return}if(await Gb(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(hx,{reqDTO:i}),r===`json`){A({deleted:i.ruleIds},r);return}process.stdout.write(`Deleted ${i.ruleIds.length} alert rule(s).\n`)}}),_x=w({description:{"en-US":`Enable a model alert rule`,"zh-CN":`启用模型告警规则`},auth:`console`,usageArgs:`--rule-id <id> [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Alert rule ID`,"zh-CN":`告警规则 ID`}}},exampleArgs:[`--rule-id 789`,`--rule-id 789 --dry-run`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={workspaceId:t.workspaceId,bizSource:`bailian`,ruleId:n.ruleId};if(t.dryRun){A({api:`zeldaEasy.bailian-telemetry.alertRule.enableAlertRule`,data:{reqDTO:i},...E(t)},r);return}if(await Gb(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(`zeldaEasy.bailian-telemetry.alertRule.enableAlertRule`,{reqDTO:i}),r===`json`){A({enabled:!0,ruleId:n.ruleId},r);return}process.stdout.write(`Alert rule enabled: ${n.ruleId}\n`)}});const vx=`zeldaEasy.bailian-telemetry.alertRule.disableAlertRule`;var yx=w({description:{"en-US":`Disable a model alert rule (keeps the rule, stops notifications)`,"zh-CN":`停用模型告警规则(保留规则,停止通知)`},auth:`console`,usageArgs:`--rule-id <id> [flags]`,flags:{ruleId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Alert rule ID`,"zh-CN":`告警规则 ID`}}},exampleArgs:[`--rule-id 789`,`--rule-id 789 --dry-run`],async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,i={workspaceId:t.workspaceId,bizSource:`bailian`,ruleId:n.ruleId};if(t.dryRun){A({api:vx,data:{reqDTO:i},...E(t)},r);return}if(await Gb(e.client,t.workspaceId,e.identity.binName,t),await e.client.console(vx,{reqDTO:i}),r===`json`){A({enabled:!1,ruleId:n.ruleId},r);return}process.stdout.write(`Alert rule disabled: ${n.ruleId}\n`)}});const bx=`zeldaEasy.bailian-telemetry.alertRule.listAlertHistories`;function xx(e){let t=e.instanceDetail;return t&&Object.entries(t).map(([e,t])=>`${e}:${t}`).join(`,`)||`-`}var Sx=w({description:{"en-US":`List model alert history (firing and recovered events)`,"zh-CN":`查看模型告警历史(告警中与已恢复事件)`},auth:`console`,usageArgs:`[--rule-id <id>] [--status <status>] [flags]`,flags:{...Eg,ruleId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by alert rule ID`,"zh-CN":`按告警规则 ID 过滤`}},status:{type:`string`,valueHint:`<status>`,choices:[`ALARM`,`OK`],description:{"en-US":`Alert state: ALARM (firing), OK (recovered)`,"zh-CN":`告警状态:ALARM(告警中)、OK(已恢复)`}},level:{type:`string`,valueHint:`<level>`,choices:Vb,description:{"en-US":`Filter by highest alert level`,"zh-CN":`按最高告警等级过滤`}},maxResults:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows per page, 1-50 (default: 10)`,"zh-CN":`每页数量,范围 1-50(默认:10)`}},skip:{type:`number`,valueHint:`<n>`,description:{"en-US":`Rows to skip (default: 0)`,"zh-CN":`跳过的记录数(默认:0)`}},nextToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Pagination token from a previous response`,"zh-CN":`上一次响应返回的分页标记`}}},exampleArgs:[``,`--status ALARM --days 1`,`--rule-id 789 --days 30`,`--level ERROR --output json`],validate:e=>{if(e.maxResults!=null&&(e.maxResults<1||e.maxResults>50))return`--max-results must be between 1 and 50.`},async run(e){let{settings:t,flags:n}=e,r=t.outputExplicit?T(t.output):`json`,{startTime:i,endTime:a}=Og(n),o={workspaceId:t.workspaceId,bizSource:`bailian`,resourceType:`model`,alertRuleId:n.ruleId,status:n.status,maxLevel:n.level,startTimeFrom:i,startTimeTo:a,maxResults:n.maxResults??10,skip:n.skip??0,nextToken:n.nextToken};if(t.dryRun){A({api:bx,data:{reqDTO:o},...E(t)},r);return}await Gb(e.client,t.workspaceId,e.identity.binName,t);let s=Yb(await e.client.console(bx,{reqDTO:o}));if(r===`json`){A(s,r);return}if(s.list.length===0){process.stdout.write(`No alert history found in this range.
2825
+ `);return}let c=O(process.stdout),l=Zr({headers:[`Start Time`,`Rule`,`Status`,`Max Level`,`Count`,`Instance`],rows:s.list.map(e=>[e.startTime?W(e.startTime):`-`,e.ruleDisplayName??e.alertRuleId,e.status??`-`,e.maxLevel??`-`,String(e.count??0),xx(e)]),align:[`left`,`left`,`left`,`left`,`right`,`left`],cellColor:(e,t,n)=>{if(t===2)return n===`ALARM`?c.red(n):c.green(n);if(t===3&&n===`ERROR`)return c.red(n)}});for(let e of l)process.stdout.write(e+`
2826
+ `);s.nextToken&&process.stdout.write(`Next page: --next-token ${s.nextToken}\n`)}});function Cx(e){return e==null?`-`:e?`yes`:`no`}function wx(e,t,n){if(e.length===0){process.stdout.write(`No model permissions found.\n${n}\n`);return}let r=[`Model`,`Name`,`Inference`,`Fine-tune`,`Deploy`],i=e.map(e=>[e.model,e.name??`-`,Cx(e.permissions?.inference),Cx(e.permissions?.fine_tune),Cx(e.permissions?.deploy)]),a=Zr({headers:r,rows:i,align:[`left`,`left`,`right`,`right`,`right`]});for(let e of a)process.stdout.write(e+`
2827
+ `);process.stdout.write(`\nTotal: ${t}\n`)}var Tx=w({description:{"en-US":`List model permissions (inference / fine-tune / deploy) in the workspace`,"zh-CN":`列出 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:{"en-US":`Authorization scope: authorizable (default, full catalog), authorized`,"zh-CN":`授权范围:authorizable(默认,完整目录)、authorized(已授权)`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Model ID (exact match)`,"zh-CN":`模型 ID(精确匹配)`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Fuzzy search by model name or ID`,"zh-CN":`按模型名称或 ID 模糊搜索`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 20)`,"zh-CN":`每页结果数(默认:20)`}}},exampleArgs:[``,`--model qwen-plus`,`--scope authorized`,`--name qwen --page-size 50`,`--output text`],notes:[{"en-US":"Default scope is `authorizable` (the full grantable catalog); use `--scope authorized` to see only models already granted.","zh-CN":"默认范围为 `authorizable`(完整可授权目录);使用 `--scope authorized` 仅查看已授权模型。"},{"en-US":"Output defaults to JSON; pass `--output text` for a table. Permission values are tri-state: true / false / null (never set).","zh-CN":"默认输出 JSON;传入 `--output text` 可查看表格。权限值为三态:true / false / null(从未设置)。"},{"en-US":`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.`,"zh-CN":`这些值原样反映 API Key 所绑定 Workspace 的服务端授权记录。显示 false/null 的模型仍可能可以调用(访问权限可能来自其他渠道);准确语义请参阅百炼模型授权文档。`}],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(un()),method:`GET`,query:a},r);return}let o=await e.client.requestJson({path:un()+Lf(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;wx(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 Ex=[`inference`,`finetune`,`deploy`];function Dx(e){if(!e)return[`inference`];let t=V(e);if(t.length===0)return{error:`--action must not be empty.`};for(let e of t)if(!Ex.includes(e))return{error:`--action "${e}" is invalid; use ${Ex.join(`, `)}.`};return t}function Ox(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=Dx(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=V(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 kx(e,t,n){let r=e.settings.outputExplicit?T(e.settings.output):`json`,i=Dx(t.action),a=t.model?V(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(un()),method:`POST`,request:o},r);return}let s=await e.client.requestJson({path:un(),method:`POST`,body:o}),c=n?`granted`:`revoked`;if(r===`json`){let e=t.all?{all:!0,action:`inference`}:{models:a,actions:i};A({...e,[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).
2829
2828
  `:`One-key authorization closed; historical inference grants cleared.
2830
- `);return}process.stdout.write(`Permissions ${c} (${i.join(`, `)}): ${a.join(`, `)}\n`)}var Rb=w({description:{"en-US":`Grant model permissions (inference / finetune / deploy)`,"zh-CN":`授予模型权限(推理 / 微调 / 部署)`},auth:`apiKey`,usageArgs:`--model <models> [--action <actions>] | --all`,flags:{model:{type:`string`,valueHint:`<models>`,description:{"en-US":`Model ID(s), comma-separated (max 20)`,"zh-CN":`模型 ID,多个以逗号分隔(最多 20 个)`}},action:{type:`string`,valueHint:`<actions>`,description:{"en-US":`Permission action(s), comma-separated: inference, finetune, deploy (default: inference)`,"zh-CN":`权限操作,多个以逗号分隔:inference、finetune、deploy(默认:inference)`}},all:{type:`switch`,description:{"en-US":`One-key grant inference for all models in the workspace (including future ones)`,"zh-CN":`一键授予 Workspace 中所有模型的推理权限(包括未来新增模型)`}}},exampleArgs:[`--model qwen-plus`,`--model qwen-plus,qwen3-max --action inference,finetune`,`--all`,`--model qwen-plus --dry-run --output json`],notes:[{"en-US":`Grants apply to the business workspace your API key belongs to.`,"zh-CN":`授权将应用于 API Key 所属的业务 Workspace。`},{"en-US":`--all maps to the server one-key switch (access_all_entities: OPEN) and only covers inference.`,"zh-CN":`--all 对应服务端一键授权开关(access_all_entities: OPEN),仅涵盖推理权限。`},{"en-US":`Actions you omit keep their current grants (server-side tri-state patch).`,"zh-CN":`未指定的操作将保留当前授权状态(服务端三态增量更新)。`}],validate:e=>Ib(e),async run(e){await Lb(e,e.flags,!0)}}),zb=w({description:{"en-US":`Revoke model permissions (inference / finetune / deploy)`,"zh-CN":`撤销模型权限(推理 / 微调 / 部署)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This revokes model permissions and may interrupt inference, fine-tuning, or deployment workloads. With --all, it also clears all historical inference grants.`,"zh-CN":`该操作会撤销模型权限,可能导致推理、精调或部署任务中断;使用 --all 时会清除全部历史推理授权。`}},usageArgs:`--model <models> [--action <actions>] | --all [flags]`,flags:{model:{type:`string`,valueHint:`<models>`,description:{"en-US":`Model ID(s), comma-separated (max 20)`,"zh-CN":`模型 ID,多个以逗号分隔(最多 20 个)`}},action:{type:`string`,valueHint:`<actions>`,description:{"en-US":`Permission action(s), comma-separated: inference, finetune, deploy (default: inference)`,"zh-CN":`权限操作,多个以逗号分隔:inference、finetune、deploy(默认:inference)`}},all:{type:`switch`,description:{"en-US":`Close one-key authorization and clear ALL historical inference grants`,"zh-CN":`关闭一键授权并清除所有历史推理授权`}}},exampleArgs:[`--model qwen-plus --yes`,`--model qwen-plus,qwen3-max --action inference,finetune --yes`,`--all --yes`,`--model qwen-plus --dry-run --output json`],notes:[{"en-US":`Grants apply to the business workspace your API key belongs to.`,"zh-CN":`授权将应用于 API Key 所属的业务 Workspace。`},{"en-US":`All revoke operations require --yes; use --dry-run to preview the request without confirmation.`,"zh-CN":`所有撤权操作均需使用 --yes;可通过 --dry-run 免确认预览请求。`},{"en-US":`--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.`,"zh-CN":`--all 对应服务端一键授权开关(access_all_entities: CLOSE):它会清除所有历史推理授权且无法撤销,因此必须同时传入 --yes。`},{"en-US":`Actions you omit keep their current grants (server-side tri-state patch).`,"zh-CN":`未指定的操作将保留当前授权状态(服务端三态增量更新)。`}],validate:e=>Ib(e),async run(e){await Lb(e,e.flags,!1)}}),Bb=w({description:{"en-US":`Upload a dataset file (.jsonl or .zip) to Bailian`,"zh-CN":`将数据集文件(.jsonl 或 .zip)上传到百炼`},auth:`apiKey`,usageArgs:`--file <path> [--purpose <name>] [--schema <chatml|dpo|cpt|decision|tts|image|video>] [--no-validate] [--full-validate]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Local dataset file (.jsonl or .zip; ≤200MB SFT/DPO, ≤300MB CPT/decision, ≤2GB media zip)`,"zh-CN":`本地数据集文件(.jsonl 或 .zip;SFT/DPO 不超过 200MB,CPT/决策模型不超过 300MB,媒体 ZIP 不超过 2GB)`},required:!0},purpose:{type:`string`,valueHint:`<name>`,description:{"en-US":`Dataset purpose tag (default: "fine-tune"; e.g. "evaluation")`,"zh-CN":`数据集用途标签(默认:"fine-tune";例如 "evaluation")`}},schema:{type:`string`,valueHint:`<s>`,description:{"en-US":`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "decision" (state/questions), "tts" (audio), "image" (image generation), or "video" (video generation). Default auto-detects per record.`,"zh-CN":`记录 Schema:"chatml"(SFT)、"dpo"(chosen/rejected)、"cpt"(原始文本)、"decision"(state/questions 决策数据)、"tts"(音频)、"image"(图片生成)或 "video"(视频生成)。默认逐条自动识别。`}},noValidate:{type:`switch`,description:{"en-US":`Skip the local JSONL pre-flight check (not recommended)`,"zh-CN":`跳过本地 JSONL 预检查(不推荐)`}},fullValidate:{type:`switch`,description:{"en-US":`JSON.parse every line instead of sampling (slower)`,"zh-CN":`使用 JSON.parse 检查每一行,而不是抽样检查(速度较慢)`}}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file decision.jsonl --schema decision`,`--file audio.zip --schema tts`,`--file eval.jsonl --purpose evaluation`,`--file train.jsonl --full-validate`,`--file train.jsonl --no-validate`],notes:[{"en-US":`Supports .jsonl (text/decision) and .zip (audio/image/video archives with a data.jsonl manifest). Seven record schemas are recognized: chatml = {messages:[...]} (SFT); dpo = {messages:[...], chosen, rejected}; cpt = {text:"..."}; decision = {state:{content}, questions:{...}}; tts = {wav_fn:"train/xxx.wav", text:"..."}; image = {img_path:"..."}; video = {first_frame_path:...}.`,"zh-CN":`支持 .jsonl(文本/决策)和 .zip(包含 data.jsonl 清单的音频、图片或视频归档)。可识别七种记录 Schema:chatml = {messages:[...]}(SFT);dpo = {messages:[...], chosen, rejected};cpt = {text:"..."};decision = {state:{content}, questions:{...}};tts = {wav_fn:"train/xxx.wav", text:"..."};image = {img_path:"..."};video = {first_frame_path:...}。`},{"en-US":`With no --schema, state/questions is validated as decision data, wav_fn as TTS, img_path as image, chosen/rejected as DPO, text (no messages) as CPT, otherwise ChatML.`,"zh-CN":`未指定 --schema 时,state/questions 记录按 decision 验证,包含 wav_fn 的按 TTS 验证,包含 img_path 的按 image 验证,包含 chosen/rejected 的按 DPO 验证,仅含 text(无 messages)的按 CPT 验证,其他记录按 ChatML 验证。`},{"en-US":`Upload cap: 200MB SFT/DPO text, 300MB CPT/decision data, 2GB media zip. For decision files over 200MB, pass --schema decision so the correct cap is applied. Upload uses the OpenAI-compatible /compatible-mode/v1/files endpoint so the purpose tag is persisted.`,"zh-CN":`上传上限:SFT/DPO 文本 200MB、CPT/决策模型数据 300MB、媒体 ZIP 2GB。决策数据超过 200MB 时请显式传入 --schema decision,以应用正确上限。上传使用 OpenAI 兼容的 /compatible-mode/v1/files 接口,以确保持久化 purpose 标签。`}],async run(e){let{identity:t,settings:r,flags:i}=e,a=i.file,o=i.purpose||`fine-tune`,s=fn(i.schema),c=s===`image`||s===`video`?g:s===`decision`?h:s===`cpt`?p:m;if(!i.noValidate){let e=await hr(a,{fullValidate:i.fullValidate,schema:s,maxBytes:c});if(!e.valid){let r=[`Dataset validation failed for ${a}`,...e.errors.slice(0,10).map(rt)];throw e.errors.length>10&&r.push(` … and ${e.errors.length-10} more error(s).`),r.push(``,`Hint: re-run \`${t.binName} dataset validate --file <path>\` for the full report,`,` or pass --no-validate to skip this check at your own risk.`),new n(r.join(`
2831
- `),f.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(`${rt(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:c,validate:!i.noValidate,schema:s??`auto`},`json`);return}let{request_id:l,...u}=await pr(e.client,{filePath:a,purpose:o});r.quiet?k(u.file_id):A({...u,request_id:l},`json`)}}),Vb=w({description:{"en-US":`List uploaded dataset files`,"zh-CN":`列出已上传的数据集文件`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--purpose <name>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max 100)`,"zh-CN":`每页结果数(默认:10,最多:100)`}},purpose:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by purpose (e.g. "fine-tune", "evaluation"). Omit to list all.`,"zh-CN":`按用途筛选(例如 "fine-tune"、"evaluation")。省略时列出全部。`}}},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 Ut(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`)}}),Hb=w({description:{"en-US":`Get details of a single dataset file`,"zh-CN":`获取单个数据集文件的详情`},auth:`apiKey`,usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Dataset file ID (required)`,"zh-CN":`数据集文件 ID(必填)`},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 ft(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`)}}),Ub=w({description:{"en-US":`Delete a dataset file by ID`,"zh-CN":`通过 ID 删除数据集文件`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified dataset file and cannot be undone.`,"zh-CN":`该操作会永久删除指定的数据集文件,且无法撤销。`}},usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Dataset file ID (required)`,"zh-CN":`数据集文件 ID(必填)`},required:!0}},exampleArgs:[`--file-id file-id-xxx`,`--file-id file-id-xxx --dry-run`,`--file-id file-id-xxx --yes`],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 Ie(e.client,r);t.quiet?k(r):A(i,`json`)}}),Wb=w({description:{"en-US":`Locally validate a dataset file (.jsonl or .zip) without uploading`,"zh-CN":`在本地验证数据集文件(.jsonl 或 .zip),不执行上传`},auth:`none`,usageArgs:`--file <path> [--full-validate] [--schema <chatml|dpo|cpt|decision|tts|image|video>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Local dataset file (.jsonl or .zip)`,"zh-CN":`本地数据集文件(.jsonl 或 .zip)`},required:!0},fullValidate:{type:`switch`,description:{"en-US":`JSON.parse every line instead of sampling (slower)`,"zh-CN":`使用 JSON.parse 检查每一行,而不是抽样检查(速度较慢)`}},schema:{type:`string`,valueHint:`<s>`,description:{"en-US":`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "decision" (state/questions), "tts" (audio), "image" (image generation), or "video" (video generation). Default auto-detects per record.`,"zh-CN":`记录 Schema:"chatml"(SFT)、"dpo"(chosen/rejected)、"cpt"(原始文本)、"decision"(state/questions 决策数据)、"tts"(音频)、"image"(图片生成)或 "video"(视频生成)。默认逐条自动识别。`}}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file decision.jsonl --schema decision`,`--file audio.zip --schema tts`,`--file wan-i2v-training-dataset.zip --schema video`,`--file eval.jsonl --full-validate`,`--file train.jsonl --output json`],notes:[{"en-US":`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.`,"zh-CN":`默认扫描:先对每一行进行结构检查,再抽取约 160 行(前 50 行、均匀抽取 100 行、最后 10 行),使用 JSON.parse 按当前 Schema 验证。`},{"en-US":`Schemas: chatml = {messages:[...]}; dpo = {messages:[...], chosen, rejected}; cpt = {text:"..."}; decision = {state:{content}, questions:{...}}; tts = {wav_fn:"train/xxx.wav", text:"..."}; image = {img_path:"..."}; video = {first_frame_path:"...", video_path:"..."}.`,"zh-CN":`Schema:chatml = {messages:[...]};dpo = {messages:[...], chosen, rejected};cpt = {text:"..."};decision = {state:{content}, questions:{...}};tts = {wav_fn:"train/xxx.wav", text:"..."};image = {img_path:"..."};video = {first_frame_path:"...", video_path:"..."}。`},{"en-US":`With no --schema, state/questions is validated as decision data, wav_fn as TTS, img_path as image, first_frame_path/video_path as video, chosen/rejected as DPO, text (no messages) as CPT, otherwise ChatML.`,"zh-CN":`未指定 --schema 时,state/questions 记录按 decision 验证,包含 wav_fn 的按 TTS 验证,包含 img_path 的按 image 验证,包含 first_frame_path/video_path 的按 video 验证,包含 chosen/rejected 的按 DPO 验证,仅含 text(无 messages)的按 CPT 验证,其他记录按 ChatML 验证。`},{"en-US":`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.`,"zh-CN":`ZIP 归档(.zip)除逐条检查记录内容外,还会执行结构验证(存在 data.jsonl、媒体引用可解析)。使用 --full-validate 对每一行执行 JSON.parse。`}],async run(e){let{settings:t,flags:r}=e,i=r.file,a=fn(r.schema);if(t.dryRun){A({action:`dataset.validate`,file:i,full:r.fullValidate,schema:a??`auto`},`json`);return}let o=await hr(i,{fullValidate:r.fullValidate,schema:a,maxBytes:a===`decision`?h:void 0});if(t.quiet?k(o.valid?`ok`:`fail`):A(o,`json`),!o.valid)throw new n(`Dataset validation failed: ${o.errors.length} error(s).`,f.GENERAL)}});function Gb(e){return li(e)&&pi(e).isFile()}async function Kb(e,t,r,i,a,o,s,c){let l=r.split(`,`).map(e=>e.trim()).filter(Boolean);if(l.length===0)throw new n(`--${i} must contain at least one entry.`,f.USAGE);let u=[],d=[],p,m,h=!0;for(let r of l){if(!Gb(r)){u.push(r),h=!1;continue}if(u.push(r),d.push(r),e.dryRun)continue;let i=c&&c.path===r?c.modality:o,l=await a.validate(r,i,{model:s});if(!l.valid){let e=[`Dataset validation failed for ${r}`,...l.errors.slice(0,10).map(rt)];throw l.errors.length>10&&e.push(` … and ${l.errors.length-10} more error(s).`),e.push(``,`Hint: re-run \`${t} dataset validate --file <path>\` for the full report,`,` or upload manually with \`${t} dataset upload --no-validate\` and`,` pass the resulting file-id here.`),new n(e.join(`
2832
- `),f.GENERAL)}if(l.warnings.length>0&&!e.quiet){process.stderr.write(`Dataset validation passed with ${l.warnings.length} warning(s) for ${r}:\n`);for(let e of l.warnings.slice(0,5))process.stderr.write(`${rt(e)}\n`);l.warnings.length>5&&process.stderr.write(` … and ${l.warnings.length-5} more.\n`)}let g=l.stats.totalRecords;typeof g==`number`&&(m=(m??0)+g),p===void 0&&(p=pi(r).size)}return{fileIds:u,localPaths:d,firstSize:p,recordCount:h?m:void 0}}async function qb(e,t,r,i,a){let o=[];for(let[s,c]of r.fileIds.entries()){if(!Gb(c))continue;let l=await pr(e,{filePath:c,purpose:i});if(!l.file_id)throw new n(`Upload of ${c} succeeded but no file_id was returned.`,f.GENERAL);o.push(l),r.fileIds[s]=l.file_id,t.quiet||process.stderr.write(`Uploaded ${hi(c)} → ${l.file_id} (auto from --${a})\n`)}return o}const Jb={baseModel:{type:`string`,valueHint:`<model>`,description:{"en-US":`Base model to fine-tune (e.g. qwen3-8b; not the output model name)`,"zh-CN":`要微调的基础模型(例如 qwen3-8b;不是输出模型名称)`},required:!0},datasets:{type:`string`,valueHint:`<ids|paths>`,description:{"en-US":`Comma-separated dataset file IDs or local paths (.jsonl for text, .zip for audio/image/video). Local paths are uploaded (validated) first, then their file-ids are used.`,"zh-CN":`数据集文件 ID 或本地路径,以逗号分隔(文本使用 .jsonl,音频、图片和视频使用 .zip)。本地路径会先验证并上传,再使用对应的 file-id。`},required:!0},validations:{type:`string`,valueHint:`<ids|paths>`,description:{"en-US":`Comma-separated validation dataset file IDs or local paths (auto-uploaded like --datasets).`,"zh-CN":`验证数据集文件 ID 或本地路径,以逗号分隔(与 --datasets 一样自动上传)。`}},modelName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Output model name (after training)`,"zh-CN":`训练完成后的输出模型名称`}},suffix:{type:`string`,valueHint:`<text>`,description:{"en-US":`Output suffix appended by the platform (finetuned_output_suffix)`,"zh-CN":`平台追加的输出后缀(finetuned_output_suffix)`}}},Yb={...Jb,jobName:{type:`string`,valueHint:`<value>`,description:{"en-US":`Training job display name (job_name)`,"zh-CN":`训练任务显示名称(job_name)`}},priority:{type:`string`,valueHint:`<value>`,description:{"en-US":`Requested scheduling priority; verify the service response`,"zh-CN":`请求的调度优先级;请核对服务端回执`},choices:[`L0`,`L1`,`L2`,`L3`]},evalSteps:{type:`number`,valueHint:`<value>`,description:{"en-US":`Validation interval in training steps`,"zh-CN":`训练验证间隔步数`}},loraAlpha:{type:`number`,valueHint:`<value>`,description:{"en-US":`LoRA scaling coefficient`,"zh-CN":`LoRA 缩放系数`}},loraDropout:{type:`number`,valueHint:`<value>`,description:{"en-US":`LoRA dropout probability`,"zh-CN":`LoRA 丢弃率`}},loraRank:{type:`number`,valueHint:`<value>`,description:{"en-US":`LoRA matrix rank`,"zh-CN":`LoRA 矩阵秩`}},lrSchedulerType:{type:`string`,valueHint:`<value>`,description:{"en-US":`Learning rate scheduler supported by the selected model`,"zh-CN":`所选模型支持的学习率调度策略`}},saveStrategy:{type:`string`,valueHint:`<value>`,description:{"en-US":`Checkpoint saving strategy`,"zh-CN":`Checkpoint 保存策略`},choices:[`epoch`,`steps`]},saveTotalLimit:{type:`number`,valueHint:`<value>`,description:{"en-US":`Maximum number of saved checkpoints`,"zh-CN":`最多保存的 Checkpoint 数量`}},saveSteps:{type:`number`,valueHint:`<value>`,description:{"en-US":`Checkpoint saving interval for strategy=steps`,"zh-CN":`按 steps 保存时的间隔`}},split:{type:`number`,valueHint:`<value>`,description:{"en-US":`Training fraction when no validation dataset is supplied`,"zh-CN":`未指定验证集时训练集所占比例`}},maxSplitValDatasetSample:{type:`number`,valueHint:`<value>`,description:{"en-US":`Maximum automatically split validation samples`,"zh-CN":`自动切分验证集的样本数量上限`}},dataAugmentation:{type:`string`,valueHint:`<value>`,description:{"en-US":`Mix platform training data (true or false)`,"zh-CN":`是否混入平台训练数据(true 或 false)`},choices:[`true`,`false`]},trainingType:{type:`string`,valueHint:`<t>`,description:{"en-US":`Training type: ${ne.join(` | `)} (default: ${u}). Mapping to the server happens at the interface boundary (e.g. sft-lora -> efficient_sft, dpo -> dpo_full).`,"zh-CN":`训练类型:${ne.join(` | `)}(默认:${u})。在接口边界转换为服务端值(例如 sft-lora -> efficient_sft、dpo -> dpo_full)。`}},nEpochs:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of epochs (default: 3)`,"zh-CN":`训练轮数(默认:3)`}},batchSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Per-device batch size (clamped to [8, 1024]). Auto-set to 8 for small datasets (<100KB)`,"zh-CN":`单设备 Batch Size(限制在 [8, 1024])。小数据集(<100KB)自动设为 8`}},learningRate:{type:`string`,valueHint:`<str>`,description:{"en-US":`Learning rate as a string to preserve precision (e.g. "1.6e-5")`,"zh-CN":`以字符串形式指定学习率以保留精度(例如 "1.6e-5")`}},maxLength:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max sequence length`,"zh-CN":`最大序列长度`}}},Xb={...Jb},Zb={...Jb,generationType:{type:`string`,choices:[`t2i`,`i2i`],valueHint:`<t2i|i2i>`,description:{"en-US":`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).`,"zh-CN":`生成类型:t2i(默认)| i2i。用于设置 generation_type/max_pixels。通过 file-id 训练 I2I 或使用 --dry-run 时必填(本地数据会自动识别 input_img)。`}},learningRate:{type:`string`,valueHint:`<str>`,description:{"en-US":`Learning rate as a string to preserve precision (e.g. "3e-5")`,"zh-CN":`以字符串形式指定学习率以保留精度(例如 "3e-5")`}}},Qb={...Jb,nEpochs:{type:`number`,valueHint:`<n>`,description:{"en-US":`Training epochs (default: 50)`,"zh-CN":`训练轮数(默认:50)`}},batchSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Batch size (default: model-specific, 1 for wan2.7, 4 for wan2.5/2.2)`,"zh-CN":`Batch Size(默认值因模型而异:wan2.7 为 1,wan2.5/2.2 为 4)`}},learningRate:{type:`string`,valueHint:`<str>`,description:{"en-US":`Learning rate as a string to preserve precision (default: "2e-5")`,"zh-CN":`以字符串形式指定学习率以保留精度(默认:"2e-5")`}}},$b=[{"en-US":`Creating a job uploads any local datasets and consumes training quota.`,"zh-CN":`创建任务会上传所有本地数据集并消耗训练额度。`},{"en-US":`Use --dry-run to preview the request body without submitting.`,"zh-CN":`使用 --dry-run 预览请求体,不实际提交。`},{"en-US":"--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.","zh-CN":"--datasets / --validations 可接受 file-id(来自 `dataset upload`)或本地路径。本地路径会先验证并上传,再提交对应的 file-id,实现一步上传并训练。"}],ex=[...$b,{"en-US":"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.","zh-CN":"训练类型遵循 `<method>` / `<method>-lora` 命名约定:sft(全量)| sft-lora(LoRA)| dpo(全量)| dpo-lora(LoRA)| cpt。这些值会在接口边界映射为服务端 training_type,因此 CLI 的其他部分不会接触服务端原始字符串。"},{"en-US":`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.`,"zh-CN":`提交任务前(非 dry-run),会通过 listFoundationModels 检查模型训练能力(无需登录控制台);如果训练类型不受支持,会立即失败并列出该模型实际支持的训练类型。`},{"en-US":`n_epochs defaults to 3. Other hyper-parameters are platform defaults unless set.`,"zh-CN":`n_epochs 默认为 3。其他超参数未设置时使用平台默认值。`},{"en-US":`Learning rate is forwarded as a string to avoid JSON-number precision loss.`,"zh-CN":`学习率以字符串形式传递,避免 JSON 数字精度损失。`},{"en-US":`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).`,"zh-CN":`提交前检查:如果训练数据集的样本数不大于 batch_size,会在上传或消耗额度前拒绝任务(否则平台会在数据处理约 10 分钟后才失败)。`}],tx=[...$b,{"en-US":`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.`,"zh-CN":`音频 TTS 训练使用 sft-lora(efficient_sft)和固定的 CosyVoice 超参数默认值;没有可设置的训练类型或超参数选项。`}],nx=[...$b,{"en-US":`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.`,"zh-CN":`图片生成训练使用 sft-lora(efficient_sft)和固定默认值;仅 --learning-rate 可覆盖。通过 --generation-type(默认 t2i)声明 T2I 或 I2I,并设置 generation_type/max_pixels。本地数据会自动识别类型(包含 input_img 的记录训练 I2I);通过 file-id 训练 I2I 或使用 --dry-run 时,请显式传入 --generation-type。`}];async function rx(e,t){let{identity:r,settings:i}=t,a=t.flags,o=a.baseModel,s=a.datasets;if(e===`audio`){let e=s.split(`,`).map(e=>e.trim()).filter(Boolean);if(e.length>1)throw new n(`Audio (TTS) fine-tuning accepts exactly one training file, got ${e.length}.`,f.USAGE,`Merge your recordings into a single .zip (or pass one file-id).`)}let c=a.trainingType||u;if(!Pt(c))throw new n(`--training-type "${c}" is not supported.`,f.USAGE,`Supported values: ${ne.join(`, `)} (default: ${u}).`);let l=yt(c),d=s.split(`,`).map(e=>e.trim()).find(e=>Gb(e)),p=e;if(e===`image`){let e=a.generationType;(e===`i2i`||!e&&d&&!i.dryRun&&await Ve(d)===`image-i2i`)&&(p=`image-i2i`)}e===`video`&&d&&!i.dryRun&&await Ve(d)===`video-kf2v`&&(p=`video-kf2v`);let m=await Kb(i,r.binName,s,`datasets`,l,p,o,d?{path:d,modality:p}:void 0),h=m.fileIds,g=a.validations?await Kb(i,r.binName,a.validations,`validations`,l,p,o):void 0,_=g?.fileIds,v=a.modelName,y=a.suffix,b=l.resolveHyperParameters(p,a);if(e===`text`){for(let[e,t]of Object.entries({evalSteps:`eval_steps`,loraAlpha:`lora_alpha`,loraDropout:`lora_dropout`,loraRank:`lora_rank`,lrSchedulerType:`lr_scheduler_type`,saveStrategy:`save_strategy`,saveTotalLimit:`save_total_limit`,saveSteps:`save_steps`,split:`split`,maxSplitValDatasetSample:`max_split_val_dataset_sample`})){let n=a[e];n!==void 0&&(b[t]=n)}for(let e of[`eval_steps`,`lora_alpha`,`lora_rank`,`save_total_limit`,`save_steps`,`max_split_val_dataset_sample`]){let t=b[e];if(t!==void 0&&(typeof t!=`number`||!Number.isInteger(t)||t<=0))throw new n(`${e} must be a positive integer. / 必须为正整数。`,f.USAGE)}if(b.lora_dropout!==void 0&&(typeof b.lora_dropout!=`number`||!Number.isFinite(b.lora_dropout)||b.lora_dropout<0||b.lora_dropout>=1))throw new n(`lora_dropout must be in [0, 1). / LoRA 丢弃率必须在 [0, 1) 内。`,f.USAGE);if(b.split!==void 0&&(typeof b.split!=`number`||!Number.isFinite(b.split)||b.split<=0||b.split>=1||a.validations))throw new n(`split must be in (0, 1) and cannot be combined with validations. / 切分比例须在 (0, 1) 内,且不能与独立验证集同时设置。`,f.USAGE);if(a.dataAugmentation!==void 0&&(b.data_augmentation=a.dataAugmentation===`true`),b.save_strategy===`steps`&&b.save_steps===void 0)throw new n(`save_strategy=steps requires --save-steps. / 按步保存时必须指定 --save-steps。`,f.USAGE)}if(a.batchSize!==void 0&&b.batch_size!==void 0&&!i.quiet&&!l.shouldSkipGate(`batch_size`,p)){let e=a.batchSize;b.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} clamped to ${b.batch_size} (server range [8, 1024] for the common training types).\n`)}if(a.batchSize!==void 0&&!i.quiet&&l.shouldSkipGate(`batch_size`,p)){let e=a.batchSize;b.batch_size!==void 0&&b.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} ignored for ${p} training (model uses a fixed batch_size of ${b.batch_size}).\n`)}if(p===`text`&&b.batch_size===void 0&&!i.dryRun){let e=m.firstSize??0;if(e===0)try{e=(await ft(t.client,h[0])).data?.size??0}catch{}e>0&&e<102400&&(b.batch_size=8)}if(!i.dryRun&&m.recordCount!==void 0&&!l.shouldSkipGate(`batch_size`,p)){let e=b.batch_size??16,t=yn({recordCount:m.recordCount,batchSize:e});if(!t.ok&&t.issue)throw new n(t.issue.message,f.GENERAL,t.hint)}if(!i.dryRun&&!l.shouldSkipCapabilityCheck(p)){let e;try{e=await qe(i,o)}catch(e){i.quiet||process.stderr.write(`warning: model capability lookup failed (${e.message}); proceeding without local pre-flight.
2833
- `)}if(e&&!Yt(e).includes(c)){let t=Yt(e);throw new n(`Model "${o}" does not support training type "${c}".`,f.USAGE,t.length?`This model supports: ${t.join(`, `)}.`:`This model reports no supported training types.`)}}i.dryRun||(await qb(t.client,i,m,`fine-tune`,`datasets`),g&&await qb(t.client,i,g,`fine-tune`,`validations`));let x={model:o,training_file_ids:h,training_type:l.serverTrainingType,hyper_parameters:b};if(_&&_.length>0&&(x.validation_file_ids=_),typeof a.jobName==`string`&&(x.job_name=a.jobName),typeof a.priority==`string`&&(x.priority=a.priority),v&&(x.model_name=v),y&&(x.finetuned_output_suffix=y),i.dryRun){let e=[...m.localPaths.map(e=>({field:`datasets`,path:e})),...(g?.localPaths??[]).map(e=>({field:`validations`,path:e}))];A(e.length>0?{action:`finetune.create`,body:x,pending_uploads:e}:{action:`finetune.create`,body:x},`json`);return}let S=await Oe(t.client,x),ee=S.output??S.data;i.quiet?ee?.job_id&&k(ee.job_id):A(S,`json`)}const ix=w({description:{"en-US":`Create a text model fine-tune job (sft | sft-lora | dpo | dpo-lora | cpt)`,"zh-CN":`创建文本模型微调任务(sft | sft-lora | dpo | dpo-lora | cpt)`},auth:`apiKey`,usageArgs:`--base-model <model> --datasets <id|path,...> [--validations <id|path,...>] [--job-name <name>] [--priority <L0|L1|L2|L3>] [--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:Yb,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 ./jev-train.jsonl --job-name jev-train-v1 --priority L0 --lora-rank 8 --lora-alpha 16 --lora-dropout 0.1 --lr-scheduler-type linear --eval-steps 50 --save-strategy epoch --save-total-limit 3 --split 0.9 --max-split-val-dataset-sample 1000 --data-augmentation false --dry-run`,`--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:ex,run:e=>rx(`text`,e)}),ax=w({description:{"en-US":`Create an audio TTS model fine-tune job (sft-lora)`,"zh-CN":`创建音频 TTS 模型微调任务(sft-lora)`},auth:`apiKey`,usageArgs:`--base-model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>]`,flags:Xb,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:tx,run:e=>rx(`audio`,e)}),ox=w({description:{"en-US":`Create an image generation model fine-tune job (sft-lora)`,"zh-CN":`创建图片生成模型微调任务(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:Zb,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:nx,run:e=>rx(`image`,e)}),sx=[...$b,{"en-US":`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.`,"zh-CN":`视频生成训练(Wan i2v/kf2v)使用 efficient_sft 和模型专属默认值:wan2.7(batch_size=1、max_pixels=102400),wan2.5/2.2(batch_size=4,max_pixels 因模型而异)。可通过 --batch-size/--n-epochs 覆盖。`},{"en-US":`Datasets are .zip archives with data.jsonl + frame images + videos.`,"zh-CN":`数据集为包含 data.jsonl、帧图片和视频的 .zip 归档。`},{"en-US":`Recommended: ≥10 training samples, 20-100 for stable results.`,"zh-CN":`建议至少准备 10 个训练样本;20–100 个样本可获得更稳定的效果。`}],cx=w({description:{"en-US":`Create a video generation model fine-tune job (Wan i2v/kf2v, efficient_sft)`,"zh-CN":`创建视频生成模型微调任务(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:Qb,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:sx,run:e=>rx(`video`,e)});var lx=w({description:{"en-US":`List fine-tune jobs`,"zh-CN":`列出微调任务`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>] [--base-model <model>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max 100)`,"zh-CN":`每页结果数(默认:10,最多:100)`}},status:{type:`string`,valueHint:`<s>`,description:{"en-US":`Filter by status (PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`,"zh-CN":`按状态筛选(PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`}},baseModel:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by base model ID (server-side)`,"zh-CN":`按基础模型 ID 筛选(服务端筛选)`}}},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 Kt(e.client,{pageNo:r,pageSize:i,status:a,model:o}),c=s.output??s.data,l=c?.jobs??[],u=c?.total,d=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??``}));A({items:d,total:u,request_id:s.request_id},`json`)}});async function ux(e,t){let n=E(e),r=await ve({region:n.consoleRegion,site:n.consoleSite,switchAgent:n.consoleSwitchAgent},e.timeout,{api:_,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}}}),i=lr(r).list??[];for(let e of i){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 dx(e,t,n){try{let r=await ux(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 fx=w({description:{"en-US":`Get details of a single fine-tune job`,"zh-CN":`获取单个微调任务的详情`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},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 mt(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=Object.entries(o??{}).map(([e,t])=>`${e}=${typeof t==`string`?t:JSON.stringify(t)}`),c=typeof a.usage==`number`?a.usage:void 0,l={job_id:a.job_id??r,job_name:a.job_name??``,priority:a.priority??``,hyper_parameters:o??{},max_output_cnt:a.max_output_cnt??null,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 dx(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`)}}),px=w({description:{"en-US":`Cancel a running fine-tune job`,"zh-CN":`取消正在运行的微调任务`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`],notes:[{"en-US":`Only PENDING / RUNNING jobs can be cancelled. Completed / failed / already-cancelled jobs return a server-side error (passed through verbatim).`,"zh-CN":`只有 PENDING / RUNNING 状态的任务可以取消。已完成、失败或已取消的任务会返回服务端错误(原样透传)。`}],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 be(e.client,r);t.quiet?k(r):A(i,`json`)}}),mx=w({description:{"en-US":`Delete a fine-tune job record`,"zh-CN":`删除微调任务记录`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified fine-tune job record and cannot be undone.`,"zh-CN":`该操作会永久删除指定的微调任务记录,且无法撤销。`}},usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`,`--job-id ft-xxx --yes`],notes:[{"en-US":`Irreversible — the job record is permanently removed.`,"zh-CN":`该操作不可撤销——任务记录将被永久删除。`},{"en-US":"Cancel a RUNNING job first via `finetune cancel` — the platform refuses to delete jobs that are still in flight.","zh-CN":"请先通过 `finetune cancel` 取消 RUNNING 任务,平台拒绝删除仍在运行的任务。"}],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 Re(e.client,r);t.quiet?k(r):A(i,`json`)}});function hx(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 gx(e,t){return hx(e).toLowerCase().includes(t)}async function _x(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await ht(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 vx=w({description:{"en-US":`Fetch training logs for a fine-tune job`,"zh-CN":`获取微调任务的训练日志`},auth:`apiKey`,usageArgs:`--job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Lines per page (default: server-defined)`,"zh-CN":`每页行数(默认:由服务端决定)`}},search:{type:`string`,valueHint:`<keyword>`,description:{"en-US":`Case-insensitive substring filter. When set, all log pages are fetched and filtered client-side (--page is ignored).`,"zh-CN":`不区分大小写的子字符串筛选。设置后会获取全部日志页并在客户端筛选(忽略 --page)。`}},tail:{type:`number`,valueHint:`<n>`,description:{"en-US":`Keep only the last N entries. When set, all log pages are fetched and the trailing N are kept (--page is ignored).`,"zh-CN":`仅保留最后 N 条记录。设置后会获取全部日志页并保留末尾 N 条(忽略 --page)。`}}},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 _x(e.client,r,a??100),i=t,c;if(o){let e=o.toLowerCase();i=t.filter(t=>gx(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}let c=await ht(e.client,r,{pageNo:i,pageSize:a});A(c,`json`)}}),yx=w({description:{"en-US":`List checkpoints produced by a fine-tune job`,"zh-CN":`列出微调任务生成的 Checkpoint`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],notes:[{"en-US":"`model_name` (shown for SUCCEEDED checkpoints) is the direct input for `deploy create --model-name`.","zh-CN":"SUCCEEDED Checkpoint 中显示的 `model_name` 可直接作为 `deploy create --model-name` 的输入。"},{"en-US":"Checkpoints expire ~15 days after creation; `expire_time` shows the deadline. Export or deploy before expiry.","zh-CN":"Checkpoint 创建后约 15 天过期,`expire_time` 显示截止时间。请在过期前导出或部署。"}],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 Bt(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.
2834
- `)}}),bx=w({description:{"en-US":`Publish a checkpoint as a deployable model`,"zh-CN":`将 Checkpoint 发布为可部署模型`},auth:`apiKey`,usageArgs:`--job-id <id> --checkpoint <name> --model-name <name>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0},checkpoint:{type:`string`,valueHint:`<name>`,description:{"en-US":"Checkpoint identifier from `finetune checkpoints` (required)","zh-CN":"来自 `finetune checkpoints` 的 Checkpoint 标识(必填)"},required:!0},modelName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Deployable model name (required)`,"zh-CN":`可部署模型名称(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx --checkpoint ckpt-3 --model-name my-qwen-sft`],notes:[{"en-US":"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.","zh-CN":"必须先执行此操作,`deploy <modality> create` 才能使用 Checkpoint。任务达到 SUCCEEDED 后,平台可能自动导出最佳 Checkpoint;对于非最佳 Checkpoint,显式导出是标准方式。"}],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 We(e.client,r,i,a),s=(o.output??o.data)?.model_name??a;t.quiet?k(s):A(o,`json`)}});const xx=/* @__PURE__ */ new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function Sx(){let e=/* @__PURE__ */ new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Cx(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 wx(e,t){return new Promise((n,r)=>{if(t.aborted){r(/* @__PURE__ */ Error(`aborted`));return}let i=()=>{clearTimeout(a),r(/* @__PURE__ */ Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var Tx=w({description:{"en-US":`Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal.`,"zh-CN":`查询微调任务状态(默认:单次非阻塞获取)。使用 --follow 持续轮询至终态。`},auth:`apiKey`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0},follow:{type:`switch`,description:{"en-US":`Block and poll until a terminal state (the legacy behavior). Without it, a single status probe is performed and the command returns immediately.`,"zh-CN":`阻塞并轮询至终态(旧版行为)。不使用时仅查询一次状态并立即返回。`}},interval:{type:`number`,valueHint:`<sec>`,description:{"en-US":`Seconds between polls with --follow (default: 10, min: 1). Ignored without --follow.`,"zh-CN":`使用 --follow 时的轮询间隔秒数(默认:10,最小:1)。未使用 --follow 时忽略。`}},pollTimeout:{type:`number`,valueHint:`<sec>`,description:{"en-US":`With --follow, stop polling after this many seconds (default: no limit). Ignored without --follow.`,"zh-CN":`使用 --follow 时,在指定秒数后停止轮询(默认:无限制)。未使用 --follow 时忽略。`}}},exampleArgs:[{"en-US":`--job-id ft-xxx # single probe, returns immediately`,"zh-CN":`--job-id ft-xxx # 单次查询,立即返回`},{"en-US":`--job-id ft-xxx --output json # status probe for agents`,"zh-CN":`--job-id ft-xxx --output json # 供智能体查询状态`},{"en-US":`--job-id ft-xxx --follow # block until terminal`,"zh-CN":`--job-id ft-xxx --follow # 阻塞等待至终态`},`--job-id ft-xxx --follow --interval 5`,`--job-id ft-xxx --follow --poll-timeout 3600`],notes:[{"en-US":`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.`,"zh-CN":`默认不使用 --follow,执行非阻塞的单次状态查询:获取一次后立即返回。该模式适用于 Agent / 脚本,由调用方控制轮询节奏,CLI 不会持续占用终端。`},{"en-US":`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.`,"zh-CN":`终态 FAILED/CANCELED 会触发普通 CLI 错误(非零退出码);SUCCEEDED 或仍在运行时返回 0。使用 --follow 时,超过 --poll-timeout 会触发超时错误。`},{"en-US":`Use --follow for the blocking, human-terminal-follow experience; use the default mode when driving the loop yourself (e.g. from an agent).`,"zh-CN":`需要在人工终端中阻塞跟踪时使用 --follow;自行驱动轮询(例如通过 Agent)时使用默认模式。`},{"en-US":"For per-step training output (not status), use `finetune logs`.","zh-CN":"要查看逐步骤训练输出(而非状态),请使用 `finetune logs`。"}],async run(e){let{settings:t,flags:r}=e,i=r.jobId,a=r.follow,o=Math.max(1,r.interval??10),s=r.pollTimeout;if(t.dryRun){A({action:`finetune.watch`,job_id:i,follow:a,interval:o,timeout:s},`json`);return}if(!a){let r=await mt(e.client,i),a=r.output??r.data,o=String(a?.status??``).toUpperCase(),s=xx.has(o);if(t.quiet)k(o||`UNKNOWN`);else{let e={job_id:i,status:o||`UNKNOWN`,terminal:s,request_id:r.request_id},n=typeof a?.usage==`number`?a.usage:void 0;if(s&&n&&n>0&&a?.model){e.usage_tokens=n;let r=await dx(t,a.model,n);r&&(e.training_cost=r.cost,e.cost_basis=`${r.unitPrice} 元/${r.priceUnit}`)}A(e,`json`)}if(s&&o!==`SUCCEEDED`)throw new n(`Fine-tune job ${i} ended in status ${o}.`,f.GENERAL);return}let c=new AbortController,l=()=>c.abort();process.on(`SIGINT`,l);try{let r=``,a=Date.now();for(;;){let l=await mt(e.client,i,c.signal),u=l.output??l.data,d=String(u?.status??``).toUpperCase();if(!t.quiet&&d!==r&&(process.stderr.write(`${Sx()} ${i} ${d||`UNKNOWN`}\n`),r=d),xx.has(d)){let e=Date.now()-a;if(t.quiet)k(d||`UNKNOWN`);else{let e=typeof u?.usage==`number`?u.usage:void 0,n={...l};if(e&&e>0&&u?.model){let r=await dx(t,u.model,e);r&&(n.training_cost=r.cost,n.usage_tokens=e,n.cost_basis=`${r.unitPrice} 元/${r.priceUnit}`)}A(n,`json`)}if(d!==`SUCCEEDED`)throw new n(`Fine-tune job ${i} ended in status ${d} (elapsed ${Cx(e)}).`,f.GENERAL);return}if(s!==void 0&&(Date.now()-a)/1e3>=s)throw new n(`Watching fine-tune job ${i} timed out after ${Cx(Date.now()-a)} (last status: ${d||`UNKNOWN`}).`,f.TIMEOUT);await wx(o*1e3,c.signal)}}catch(e){if(c.signal.aborted){process.stderr.write(`
2829
+ `);return}process.stdout.write(`Permissions ${c} (${i.join(`, `)}): ${a.join(`, `)}\n`)}var Ax=w({description:{"en-US":`Grant model permissions (inference / finetune / deploy)`,"zh-CN":`授予模型权限(推理 / 微调 / 部署)`},auth:`apiKey`,usageArgs:`--model <models> [--action <actions>] | --all`,flags:{model:{type:`string`,valueHint:`<models>`,description:{"en-US":`Model ID(s), comma-separated (max 20)`,"zh-CN":`模型 ID,多个以逗号分隔(最多 20 个)`}},action:{type:`string`,valueHint:`<actions>`,description:{"en-US":`Permission action(s), comma-separated: inference, finetune, deploy (default: inference)`,"zh-CN":`权限操作,多个以逗号分隔:inference、finetune、deploy(默认:inference)`}},all:{type:`switch`,description:{"en-US":`One-key grant inference for all models in the workspace (including future ones)`,"zh-CN":`一键授予 Workspace 中所有模型的推理权限(包括未来新增模型)`}}},exampleArgs:[`--model qwen-plus`,`--model qwen-plus,qwen3-max --action inference,finetune`,`--all`,`--model qwen-plus --dry-run --output json`],notes:[{"en-US":`Grants apply to the business workspace your API key belongs to.`,"zh-CN":`授权将应用于 API Key 所属的业务 Workspace。`},{"en-US":`--all maps to the server one-key switch (access_all_entities: OPEN) and only covers inference.`,"zh-CN":`--all 对应服务端一键授权开关(access_all_entities: OPEN),仅涵盖推理权限。`},{"en-US":`Actions you omit keep their current grants (server-side tri-state patch).`,"zh-CN":`未指定的操作将保留当前授权状态(服务端三态增量更新)。`}],validate:e=>Ox(e),async run(e){await kx(e,e.flags,!0)}}),jx=w({description:{"en-US":`Revoke model permissions (inference / finetune / deploy)`,"zh-CN":`撤销模型权限(推理 / 微调 / 部署)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This revokes model permissions and may interrupt inference, fine-tuning, or deployment workloads. With --all, it also clears all historical inference grants.`,"zh-CN":`该操作会撤销模型权限,可能导致推理、精调或部署任务中断;使用 --all 时会清除全部历史推理授权。`}},usageArgs:`--model <models> [--action <actions>] | --all [flags]`,flags:{model:{type:`string`,valueHint:`<models>`,description:{"en-US":`Model ID(s), comma-separated (max 20)`,"zh-CN":`模型 ID,多个以逗号分隔(最多 20 个)`}},action:{type:`string`,valueHint:`<actions>`,description:{"en-US":`Permission action(s), comma-separated: inference, finetune, deploy (default: inference)`,"zh-CN":`权限操作,多个以逗号分隔:inference、finetune、deploy(默认:inference)`}},all:{type:`switch`,description:{"en-US":`Close one-key authorization and clear ALL historical inference grants`,"zh-CN":`关闭一键授权并清除所有历史推理授权`}}},exampleArgs:[`--model qwen-plus --yes`,`--model qwen-plus,qwen3-max --action inference,finetune --yes`,`--all --yes`,`--model qwen-plus --dry-run --output json`],notes:[{"en-US":`Grants apply to the business workspace your API key belongs to.`,"zh-CN":`授权将应用于 API Key 所属的业务 Workspace。`},{"en-US":`All revoke operations require --yes; use --dry-run to preview the request without confirmation.`,"zh-CN":`所有撤权操作均需使用 --yes;可通过 --dry-run 免确认预览请求。`},{"en-US":`--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.`,"zh-CN":`--all 对应服务端一键授权开关(access_all_entities: CLOSE):它会清除所有历史推理授权且无法撤销,因此必须同时传入 --yes。`},{"en-US":`Actions you omit keep their current grants (server-side tri-state patch).`,"zh-CN":`未指定的操作将保留当前授权状态(服务端三态增量更新)。`}],validate:e=>Ox(e),async run(e){await kx(e,e.flags,!1)}}),Mx=w({description:{"en-US":`Upload a dataset file (.jsonl or .zip) to Bailian`,"zh-CN":`将数据集文件(.jsonl 或 .zip)上传到百炼`},auth:`apiKey`,usageArgs:`--file <path> [--purpose <name>] [--schema <chatml|dpo|cpt|decision|tts|image|video>] [--no-validate] [--full-validate]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Local dataset file (.jsonl or .zip; ≤200MB SFT/DPO, ≤300MB CPT/decision, ≤2GB media zip)`,"zh-CN":`本地数据集文件(.jsonl 或 .zip;SFT/DPO 不超过 200MB,CPT/决策模型不超过 300MB,媒体 ZIP 不超过 2GB)`},required:!0},purpose:{type:`string`,valueHint:`<name>`,description:{"en-US":`Dataset purpose tag (default: "fine-tune"; e.g. "evaluation")`,"zh-CN":`数据集用途标签(默认:"fine-tune";例如 "evaluation")`}},schema:{type:`string`,valueHint:`<s>`,description:{"en-US":`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "decision" (state/questions), "tts" (audio), "image" (image generation), or "video" (video generation). Default auto-detects per record.`,"zh-CN":`记录 Schema:"chatml"(SFT)、"dpo"(chosen/rejected)、"cpt"(原始文本)、"decision"(state/questions 决策数据)、"tts"(音频)、"image"(图片生成)或 "video"(视频生成)。默认逐条自动识别。`}},noValidate:{type:`switch`,description:{"en-US":`Skip the local JSONL pre-flight check (not recommended)`,"zh-CN":`跳过本地 JSONL 预检查(不推荐)`}},fullValidate:{type:`switch`,description:{"en-US":`JSON.parse every line instead of sampling (slower)`,"zh-CN":`使用 JSON.parse 检查每一行,而不是抽样检查(速度较慢)`}}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file decision.jsonl --schema decision`,`--file audio.zip --schema tts`,`--file eval.jsonl --purpose evaluation`,`--file train.jsonl --full-validate`,`--file train.jsonl --no-validate`],notes:[{"en-US":`Supports .jsonl (text/decision) and .zip (audio/image/video archives with a data.jsonl manifest). Seven record schemas are recognized: chatml = {messages:[...]} (SFT); dpo = {messages:[...], chosen, rejected}; cpt = {text:"..."}; decision = {state:{content}, questions:{...}}; tts = {wav_fn:"train/xxx.wav", text:"..."}; image = {img_path:"..."}; video = {first_frame_path:...}.`,"zh-CN":`支持 .jsonl(文本/决策)和 .zip(包含 data.jsonl 清单的音频、图片或视频归档)。可识别七种记录 Schema:chatml = {messages:[...]}(SFT);dpo = {messages:[...], chosen, rejected};cpt = {text:"..."};decision = {state:{content}, questions:{...}};tts = {wav_fn:"train/xxx.wav", text:"..."};image = {img_path:"..."};video = {first_frame_path:...}。`},{"en-US":`With no --schema, state/questions is validated as decision data, wav_fn as TTS, img_path as image, chosen/rejected as DPO, text (no messages) as CPT, otherwise ChatML.`,"zh-CN":`未指定 --schema 时,state/questions 记录按 decision 验证,包含 wav_fn 的按 TTS 验证,包含 img_path 的按 image 验证,包含 chosen/rejected 的按 DPO 验证,仅含 text(无 messages)的按 CPT 验证,其他记录按 ChatML 验证。`},{"en-US":`Upload cap: 200MB SFT/DPO text, 300MB CPT/decision data, 2GB media zip. For decision files over 200MB, pass --schema decision so the correct cap is applied. Upload uses the OpenAI-compatible /compatible-mode/v1/files endpoint so the purpose tag is persisted.`,"zh-CN":`上传上限:SFT/DPO 文本 200MB、CPT/决策模型数据 300MB、媒体 ZIP 2GB。决策数据超过 200MB 时请显式传入 --schema decision,以应用正确上限。上传使用 OpenAI 兼容的 /compatible-mode/v1/files 接口,以确保持久化 purpose 标签。`}],async run(e){let{identity:t,settings:r,flags:i}=e,a=i.file,o=i.purpose||`fine-tune`,s=mn(i.schema),c=s===`image`||s===`video`?g:s===`decision`?h:s===`cpt`?p:m;if(!i.noValidate){let e=await vr(a,{fullValidate:i.fullValidate,schema:s,maxBytes:c});if(!e.valid){let r=[`Dataset validation failed for ${a}`,...e.errors.slice(0,10).map(rt)];throw e.errors.length>10&&r.push(` … and ${e.errors.length-10} more error(s).`),r.push(``,`Hint: re-run \`${t.binName} dataset validate --file <path>\` for the full report,`,` or pass --no-validate to skip this check at your own risk.`),new n(r.join(`
2830
+ `),f.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(`${rt(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:c,validate:!i.noValidate,schema:s??`auto`},`json`);return}let{request_id:l,...u}=await gr(e.client,{filePath:a,purpose:o});r.quiet?k(u.file_id):A({...u,request_id:l},`json`)}}),Nx=w({description:{"en-US":`List uploaded dataset files`,"zh-CN":`列出已上传的数据集文件`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--purpose <name>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max 100)`,"zh-CN":`每页结果数(默认:10,最多:100)`}},purpose:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by purpose (e.g. "fine-tune", "evaluation"). Omit to list all.`,"zh-CN":`按用途筛选(例如 "fine-tune"、"evaluation")。省略时列出全部。`}}},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 Ht(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`)}}),Px=w({description:{"en-US":`Get details of a single dataset file`,"zh-CN":`获取单个数据集文件的详情`},auth:`apiKey`,usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Dataset file ID (required)`,"zh-CN":`数据集文件 ID(必填)`},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 ft(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`)}}),Fx=w({description:{"en-US":`Delete a dataset file by ID`,"zh-CN":`通过 ID 删除数据集文件`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified dataset file and cannot be undone.`,"zh-CN":`该操作会永久删除指定的数据集文件,且无法撤销。`}},usageArgs:`--file-id <id>`,flags:{fileId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Dataset file ID (required)`,"zh-CN":`数据集文件 ID(必填)`},required:!0}},exampleArgs:[`--file-id file-id-xxx`,`--file-id file-id-xxx --dry-run`,`--file-id file-id-xxx --yes`],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 Ie(e.client,r);t.quiet?k(r):A(i,`json`)}}),Ix=w({description:{"en-US":`Locally validate a dataset file (.jsonl or .zip) without uploading`,"zh-CN":`在本地验证数据集文件(.jsonl 或 .zip),不执行上传`},auth:`none`,usageArgs:`--file <path> [--full-validate] [--schema <chatml|dpo|cpt|decision|tts|image|video>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Local dataset file (.jsonl or .zip)`,"zh-CN":`本地数据集文件(.jsonl 或 .zip)`},required:!0},fullValidate:{type:`switch`,description:{"en-US":`JSON.parse every line instead of sampling (slower)`,"zh-CN":`使用 JSON.parse 检查每一行,而不是抽样检查(速度较慢)`}},schema:{type:`string`,valueHint:`<s>`,description:{"en-US":`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), "cpt" (raw text), "decision" (state/questions), "tts" (audio), "image" (image generation), or "video" (video generation). Default auto-detects per record.`,"zh-CN":`记录 Schema:"chatml"(SFT)、"dpo"(chosen/rejected)、"cpt"(原始文本)、"decision"(state/questions 决策数据)、"tts"(音频)、"image"(图片生成)或 "video"(视频生成)。默认逐条自动识别。`}}},exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file decision.jsonl --schema decision`,`--file audio.zip --schema tts`,`--file wan-i2v-training-dataset.zip --schema video`,`--file eval.jsonl --full-validate`,`--file train.jsonl --output json`],notes:[{"en-US":`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.`,"zh-CN":`默认扫描:先对每一行进行结构检查,再抽取约 160 行(前 50 行、均匀抽取 100 行、最后 10 行),使用 JSON.parse 按当前 Schema 验证。`},{"en-US":`Schemas: chatml = {messages:[...]}; dpo = {messages:[...], chosen, rejected}; cpt = {text:"..."}; decision = {state:{content}, questions:{...}}; tts = {wav_fn:"train/xxx.wav", text:"..."}; image = {img_path:"..."}; video = {first_frame_path:"...", video_path:"..."}.`,"zh-CN":`Schema:chatml = {messages:[...]};dpo = {messages:[...], chosen, rejected};cpt = {text:"..."};decision = {state:{content}, questions:{...}};tts = {wav_fn:"train/xxx.wav", text:"..."};image = {img_path:"..."};video = {first_frame_path:"...", video_path:"..."}。`},{"en-US":`With no --schema, state/questions is validated as decision data, wav_fn as TTS, img_path as image, first_frame_path/video_path as video, chosen/rejected as DPO, text (no messages) as CPT, otherwise ChatML.`,"zh-CN":`未指定 --schema 时,state/questions 记录按 decision 验证,包含 wav_fn 的按 TTS 验证,包含 img_path 的按 image 验证,包含 first_frame_path/video_path 的按 video 验证,包含 chosen/rejected 的按 DPO 验证,仅含 text(无 messages)的按 CPT 验证,其他记录按 ChatML 验证。`},{"en-US":`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.`,"zh-CN":`ZIP 归档(.zip)除逐条检查记录内容外,还会执行结构验证(存在 data.jsonl、媒体引用可解析)。使用 --full-validate 对每一行执行 JSON.parse。`}],async run(e){let{settings:t,flags:r}=e,i=r.file,a=mn(r.schema);if(t.dryRun){A({action:`dataset.validate`,file:i,full:r.fullValidate,schema:a??`auto`},`json`);return}let o=await vr(i,{fullValidate:r.fullValidate,schema:a,maxBytes:a===`decision`?h:void 0});if(t.quiet?k(o.valid?`ok`:`fail`):A(o,`json`),!o.valid)throw new n(`Dataset validation failed: ${o.errors.length} error(s).`,f.GENERAL)}});function Lx(e){return fi(e)&&gi(e).isFile()}async function Rx(e,t,r,i,a,o,s,c){let l=r.split(`,`).map(e=>e.trim()).filter(Boolean);if(l.length===0)throw new n(`--${i} must contain at least one entry.`,f.USAGE);let u=[],d=[],p,m,h=!0;for(let r of l){if(!Lx(r)){u.push(r),h=!1;continue}if(u.push(r),d.push(r),e.dryRun)continue;let i=c&&c.path===r?c.modality:o,l=await a.validate(r,i,{model:s});if(!l.valid){let e=[`Dataset validation failed for ${r}`,...l.errors.slice(0,10).map(rt)];throw l.errors.length>10&&e.push(` … and ${l.errors.length-10} more error(s).`),e.push(``,`Hint: re-run \`${t} dataset validate --file <path>\` for the full report,`,` or upload manually with \`${t} dataset upload --no-validate\` and`,` pass the resulting file-id here.`),new n(e.join(`
2831
+ `),f.GENERAL)}if(l.warnings.length>0&&!e.quiet){process.stderr.write(`Dataset validation passed with ${l.warnings.length} warning(s) for ${r}:\n`);for(let e of l.warnings.slice(0,5))process.stderr.write(`${rt(e)}\n`);l.warnings.length>5&&process.stderr.write(` … and ${l.warnings.length-5} more.\n`)}let g=l.stats.totalRecords;typeof g==`number`&&(m=(m??0)+g),p===void 0&&(p=gi(r).size)}return{fileIds:u,localPaths:d,firstSize:p,recordCount:h?m:void 0}}async function zx(e,t,r,i,a){let o=[];for(let[s,c]of r.fileIds.entries()){if(!Lx(c))continue;let l=await gr(e,{filePath:c,purpose:i});if(!l.file_id)throw new n(`Upload of ${c} succeeded but no file_id was returned.`,f.GENERAL);o.push(l),r.fileIds[s]=l.file_id,t.quiet||process.stderr.write(`Uploaded ${vi(c)} → ${l.file_id} (auto from --${a})\n`)}return o}const Bx={baseModel:{type:`string`,valueHint:`<model>`,description:{"en-US":`Base model to fine-tune (e.g. qwen3-8b; not the output model name)`,"zh-CN":`要微调的基础模型(例如 qwen3-8b;不是输出模型名称)`},required:!0},datasets:{type:`string`,valueHint:`<ids|paths>`,description:{"en-US":`Comma-separated dataset file IDs or local paths (.jsonl for text, .zip for audio/image/video). Local paths are uploaded (validated) first, then their file-ids are used.`,"zh-CN":`数据集文件 ID 或本地路径,以逗号分隔(文本使用 .jsonl,音频、图片和视频使用 .zip)。本地路径会先验证并上传,再使用对应的 file-id。`},required:!0},validations:{type:`string`,valueHint:`<ids|paths>`,description:{"en-US":`Comma-separated validation dataset file IDs or local paths (auto-uploaded like --datasets).`,"zh-CN":`验证数据集文件 ID 或本地路径,以逗号分隔(与 --datasets 一样自动上传)。`}},modelName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Output model name (after training)`,"zh-CN":`训练完成后的输出模型名称`}},suffix:{type:`string`,valueHint:`<text>`,description:{"en-US":`Output suffix appended by the platform (finetuned_output_suffix)`,"zh-CN":`平台追加的输出后缀(finetuned_output_suffix)`}}},Vx={...Bx,jobName:{type:`string`,valueHint:`<value>`,description:{"en-US":`Training job display name (job_name)`,"zh-CN":`训练任务显示名称(job_name)`}},priority:{type:`string`,valueHint:`<value>`,description:{"en-US":`Requested scheduling priority; verify the service response`,"zh-CN":`请求的调度优先级;请核对服务端回执`},choices:[`L0`,`L1`,`L2`,`L3`]},evalSteps:{type:`number`,valueHint:`<value>`,description:{"en-US":`Validation interval in training steps`,"zh-CN":`训练验证间隔步数`}},loraAlpha:{type:`number`,valueHint:`<value>`,description:{"en-US":`LoRA scaling coefficient`,"zh-CN":`LoRA 缩放系数`}},loraDropout:{type:`number`,valueHint:`<value>`,description:{"en-US":`LoRA dropout probability`,"zh-CN":`LoRA 丢弃率`}},loraRank:{type:`number`,valueHint:`<value>`,description:{"en-US":`LoRA matrix rank`,"zh-CN":`LoRA 矩阵秩`}},lrSchedulerType:{type:`string`,valueHint:`<value>`,description:{"en-US":`Learning rate scheduler supported by the selected model`,"zh-CN":`所选模型支持的学习率调度策略`}},saveStrategy:{type:`string`,valueHint:`<value>`,description:{"en-US":`Checkpoint saving strategy`,"zh-CN":`Checkpoint 保存策略`},choices:[`epoch`,`steps`]},saveTotalLimit:{type:`number`,valueHint:`<value>`,description:{"en-US":`Maximum number of saved checkpoints`,"zh-CN":`最多保存的 Checkpoint 数量`}},saveSteps:{type:`number`,valueHint:`<value>`,description:{"en-US":`Checkpoint saving interval for strategy=steps`,"zh-CN":`按 steps 保存时的间隔`}},split:{type:`number`,valueHint:`<value>`,description:{"en-US":`Training fraction when no validation dataset is supplied`,"zh-CN":`未指定验证集时训练集所占比例`}},maxSplitValDatasetSample:{type:`number`,valueHint:`<value>`,description:{"en-US":`Maximum automatically split validation samples`,"zh-CN":`自动切分验证集的样本数量上限`}},dataAugmentation:{type:`string`,valueHint:`<value>`,description:{"en-US":`Mix platform training data (true or false)`,"zh-CN":`是否混入平台训练数据(true 或 false)`},choices:[`true`,`false`]},trainingType:{type:`string`,valueHint:`<t>`,description:{"en-US":`Training type: ${ne.join(` | `)} (default: ${u}). Mapping to the server happens at the interface boundary (e.g. sft-lora -> efficient_sft, dpo -> dpo_full).`,"zh-CN":`训练类型:${ne.join(` | `)}(默认:${u})。在接口边界转换为服务端值(例如 sft-lora -> efficient_sft、dpo -> dpo_full)。`}},nEpochs:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of epochs (default: 3)`,"zh-CN":`训练轮数(默认:3)`}},batchSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Per-device batch size (clamped to [8, 1024]). Auto-set to 8 for small datasets (<100KB)`,"zh-CN":`单设备 Batch Size(限制在 [8, 1024])。小数据集(<100KB)自动设为 8`}},learningRate:{type:`string`,valueHint:`<str>`,description:{"en-US":`Learning rate as a string to preserve precision (e.g. "1.6e-5")`,"zh-CN":`以字符串形式指定学习率以保留精度(例如 "1.6e-5")`}},maxLength:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max sequence length`,"zh-CN":`最大序列长度`}}},Hx={...Bx},Ux={...Bx,generationType:{type:`string`,choices:[`t2i`,`i2i`],valueHint:`<t2i|i2i>`,description:{"en-US":`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).`,"zh-CN":`生成类型:t2i(默认)| i2i。用于设置 generation_type/max_pixels。通过 file-id 训练 I2I 或使用 --dry-run 时必填(本地数据会自动识别 input_img)。`}},learningRate:{type:`string`,valueHint:`<str>`,description:{"en-US":`Learning rate as a string to preserve precision (e.g. "3e-5")`,"zh-CN":`以字符串形式指定学习率以保留精度(例如 "3e-5")`}}},Wx={...Bx,nEpochs:{type:`number`,valueHint:`<n>`,description:{"en-US":`Training epochs (default: 50)`,"zh-CN":`训练轮数(默认:50)`}},batchSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Batch size (default: model-specific, 1 for wan2.7, 4 for wan2.5/2.2)`,"zh-CN":`Batch Size(默认值因模型而异:wan2.7 为 1,wan2.5/2.2 为 4)`}},learningRate:{type:`string`,valueHint:`<str>`,description:{"en-US":`Learning rate as a string to preserve precision (default: "2e-5")`,"zh-CN":`以字符串形式指定学习率以保留精度(默认:"2e-5")`}}},Gx=[{"en-US":`Creating a job uploads any local datasets and consumes training quota.`,"zh-CN":`创建任务会上传所有本地数据集并消耗训练额度。`},{"en-US":`Use --dry-run to preview the request body without submitting.`,"zh-CN":`使用 --dry-run 预览请求体,不实际提交。`},{"en-US":"--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.","zh-CN":"--datasets / --validations 可接受 file-id(来自 `dataset upload`)或本地路径。本地路径会先验证并上传,再提交对应的 file-id,实现一步上传并训练。"}],Kx=[...Gx,{"en-US":"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.","zh-CN":"训练类型遵循 `<method>` / `<method>-lora` 命名约定:sft(全量)| sft-lora(LoRA)| dpo(全量)| dpo-lora(LoRA)| cpt。这些值会在接口边界映射为服务端 training_type,因此 CLI 的其他部分不会接触服务端原始字符串。"},{"en-US":`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.`,"zh-CN":`提交任务前(非 dry-run),会通过 listFoundationModels 检查模型训练能力(无需登录控制台);如果训练类型不受支持,会立即失败并列出该模型实际支持的训练类型。`},{"en-US":`n_epochs defaults to 3. Other hyper-parameters are platform defaults unless set.`,"zh-CN":`n_epochs 默认为 3。其他超参数未设置时使用平台默认值。`},{"en-US":`Learning rate is forwarded as a string to avoid JSON-number precision loss.`,"zh-CN":`学习率以字符串形式传递,避免 JSON 数字精度损失。`},{"en-US":`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).`,"zh-CN":`提交前检查:如果训练数据集的样本数不大于 batch_size,会在上传或消耗额度前拒绝任务(否则平台会在数据处理约 10 分钟后才失败)。`}],qx=[...Gx,{"en-US":`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.`,"zh-CN":`音频 TTS 训练使用 sft-lora(efficient_sft)和固定的 CosyVoice 超参数默认值;没有可设置的训练类型或超参数选项。`}],Jx=[...Gx,{"en-US":`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.`,"zh-CN":`图片生成训练使用 sft-lora(efficient_sft)和固定默认值;仅 --learning-rate 可覆盖。通过 --generation-type(默认 t2i)声明 T2I 或 I2I,并设置 generation_type/max_pixels。本地数据会自动识别类型(包含 input_img 的记录训练 I2I);通过 file-id 训练 I2I 或使用 --dry-run 时,请显式传入 --generation-type。`}];async function Yx(e,t){let{identity:r,settings:i}=t,a=t.flags,o=a.baseModel,s=a.datasets;if(e===`audio`){let e=s.split(`,`).map(e=>e.trim()).filter(Boolean);if(e.length>1)throw new n(`Audio (TTS) fine-tuning accepts exactly one training file, got ${e.length}.`,f.USAGE,`Merge your recordings into a single .zip (or pass one file-id).`)}let c=a.trainingType||u;if(!Pt(c))throw new n(`--training-type "${c}" is not supported.`,f.USAGE,`Supported values: ${ne.join(`, `)} (default: ${u}).`);let l=yt(c),d=s.split(`,`).map(e=>e.trim()).find(e=>Lx(e)),p=e;if(e===`image`){let e=a.generationType;(e===`i2i`||!e&&d&&!i.dryRun&&await Ve(d)===`image-i2i`)&&(p=`image-i2i`)}e===`video`&&d&&!i.dryRun&&await Ve(d)===`video-kf2v`&&(p=`video-kf2v`);let m=await Rx(i,r.binName,s,`datasets`,l,p,o,d?{path:d,modality:p}:void 0),h=m.fileIds,g=a.validations?await Rx(i,r.binName,a.validations,`validations`,l,p,o):void 0,_=g?.fileIds,v=a.modelName,y=a.suffix,b=l.resolveHyperParameters(p,a);if(e===`text`){for(let[e,t]of Object.entries({evalSteps:`eval_steps`,loraAlpha:`lora_alpha`,loraDropout:`lora_dropout`,loraRank:`lora_rank`,lrSchedulerType:`lr_scheduler_type`,saveStrategy:`save_strategy`,saveTotalLimit:`save_total_limit`,saveSteps:`save_steps`,split:`split`,maxSplitValDatasetSample:`max_split_val_dataset_sample`})){let n=a[e];n!==void 0&&(b[t]=n)}for(let e of[`eval_steps`,`lora_alpha`,`lora_rank`,`save_total_limit`,`save_steps`,`max_split_val_dataset_sample`]){let t=b[e];if(t!==void 0&&(typeof t!=`number`||!Number.isInteger(t)||t<=0))throw new n(`${e} must be a positive integer. / 必须为正整数。`,f.USAGE)}if(b.lora_dropout!==void 0&&(typeof b.lora_dropout!=`number`||!Number.isFinite(b.lora_dropout)||b.lora_dropout<0||b.lora_dropout>=1))throw new n(`lora_dropout must be in [0, 1). / LoRA 丢弃率必须在 [0, 1) 内。`,f.USAGE);if(b.split!==void 0&&(typeof b.split!=`number`||!Number.isFinite(b.split)||b.split<=0||b.split>=1||a.validations))throw new n(`split must be in (0, 1) and cannot be combined with validations. / 切分比例须在 (0, 1) 内,且不能与独立验证集同时设置。`,f.USAGE);if(a.dataAugmentation!==void 0&&(b.data_augmentation=a.dataAugmentation===`true`),b.save_strategy===`steps`&&b.save_steps===void 0)throw new n(`save_strategy=steps requires --save-steps. / 按步保存时必须指定 --save-steps。`,f.USAGE)}if(a.batchSize!==void 0&&b.batch_size!==void 0&&!i.quiet&&!l.shouldSkipGate(`batch_size`,p)){let e=a.batchSize;b.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} clamped to ${b.batch_size} (server range [8, 1024] for the common training types).\n`)}if(a.batchSize!==void 0&&!i.quiet&&l.shouldSkipGate(`batch_size`,p)){let e=a.batchSize;b.batch_size!==void 0&&b.batch_size!==e&&process.stderr.write(`warning: --batch-size ${e} ignored for ${p} training (model uses a fixed batch_size of ${b.batch_size}).\n`)}if(p===`text`&&b.batch_size===void 0&&!i.dryRun){let e=m.firstSize??0;if(e===0)try{e=(await ft(t.client,h[0])).data?.size??0}catch{}e>0&&e<102400&&(b.batch_size=8)}if(!i.dryRun&&m.recordCount!==void 0&&!l.shouldSkipGate(`batch_size`,p)){let e=b.batch_size??16,t=xn({recordCount:m.recordCount,batchSize:e});if(!t.ok&&t.issue)throw new n(t.issue.message,f.GENERAL,t.hint)}if(!i.dryRun&&!l.shouldSkipCapabilityCheck(p)){let e;try{e=await qe(i,o)}catch(e){i.quiet||process.stderr.write(`warning: model capability lookup failed (${e.message}); proceeding without local pre-flight.
2832
+ `)}if(e&&!Jt(e).includes(c)){let t=Jt(e);throw new n(`Model "${o}" does not support training type "${c}".`,f.USAGE,t.length?`This model supports: ${t.join(`, `)}.`:`This model reports no supported training types.`)}}i.dryRun||(await zx(t.client,i,m,`fine-tune`,`datasets`),g&&await zx(t.client,i,g,`fine-tune`,`validations`));let x={model:o,training_file_ids:h,training_type:l.serverTrainingType,hyper_parameters:b};if(_&&_.length>0&&(x.validation_file_ids=_),typeof a.jobName==`string`&&(x.job_name=a.jobName),typeof a.priority==`string`&&(x.priority=a.priority),v&&(x.model_name=v),y&&(x.finetuned_output_suffix=y),i.dryRun){let e=[...m.localPaths.map(e=>({field:`datasets`,path:e})),...(g?.localPaths??[]).map(e=>({field:`validations`,path:e}))];A(e.length>0?{action:`finetune.create`,body:x,pending_uploads:e}:{action:`finetune.create`,body:x},`json`);return}let S=await Oe(t.client,x),ee=S.output??S.data;i.quiet?ee?.job_id&&k(ee.job_id):A(S,`json`)}const Xx=w({description:{"en-US":`Create a text model fine-tune job (sft | sft-lora | dpo | dpo-lora | cpt)`,"zh-CN":`创建文本模型微调任务(sft | sft-lora | dpo | dpo-lora | cpt)`},auth:`apiKey`,usageArgs:`--base-model <model> --datasets <id|path,...> [--validations <id|path,...>] [--job-name <name>] [--priority <L0|L1|L2|L3>] [--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:Vx,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 ./jev-train.jsonl --job-name jev-train-v1 --priority L0 --lora-rank 8 --lora-alpha 16 --lora-dropout 0.1 --lr-scheduler-type linear --eval-steps 50 --save-strategy epoch --save-total-limit 3 --split 0.9 --max-split-val-dataset-sample 1000 --data-augmentation false --dry-run`,`--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:Kx,run:e=>Yx(`text`,e)}),Zx=w({description:{"en-US":`Create an audio TTS model fine-tune job (sft-lora)`,"zh-CN":`创建音频 TTS 模型微调任务(sft-lora)`},auth:`apiKey`,usageArgs:`--base-model <model> --datasets <id|path> [--validations <id|path>] [--model-name <name>] [--suffix <text>]`,flags:Hx,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:qx,run:e=>Yx(`audio`,e)}),Qx=w({description:{"en-US":`Create an image generation model fine-tune job (sft-lora)`,"zh-CN":`创建图片生成模型微调任务(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:Ux,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:Jx,run:e=>Yx(`image`,e)}),$x=[...Gx,{"en-US":`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.`,"zh-CN":`视频生成训练(Wan i2v/kf2v)使用 efficient_sft 和模型专属默认值:wan2.7(batch_size=1、max_pixels=102400),wan2.5/2.2(batch_size=4,max_pixels 因模型而异)。可通过 --batch-size/--n-epochs 覆盖。`},{"en-US":`Datasets are .zip archives with data.jsonl + frame images + videos.`,"zh-CN":`数据集为包含 data.jsonl、帧图片和视频的 .zip 归档。`},{"en-US":`Recommended: ≥10 training samples, 20-100 for stable results.`,"zh-CN":`建议至少准备 10 个训练样本;20–100 个样本可获得更稳定的效果。`}],eS=w({description:{"en-US":`Create a video generation model fine-tune job (Wan i2v/kf2v, efficient_sft)`,"zh-CN":`创建视频生成模型微调任务(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:Wx,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:$x,run:e=>Yx(`video`,e)});var tS=w({description:{"en-US":`List fine-tune jobs`,"zh-CN":`列出微调任务`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>] [--base-model <model>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max 100)`,"zh-CN":`每页结果数(默认:10,最多:100)`}},status:{type:`string`,valueHint:`<s>`,description:{"en-US":`Filter by status (PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`,"zh-CN":`按状态筛选(PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`}},baseModel:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by base model ID (server-side)`,"zh-CN":`按基础模型 ID 筛选(服务端筛选)`}}},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 Gt(e.client,{pageNo:r,pageSize:i,status:a,model:o}),c=s.output??s.data,l=c?.jobs??[],u=c?.total,d=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??``}));A({items:d,total:u,request_id:s.request_id},`json`)}});async function nS(e,t){let n=E(e),r=await ve({region:n.consoleRegion,site:n.consoleSite,switchAgent:n.consoleSwitchAgent},e.timeout,{api:_,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}}}),i=fr(r).list??[];for(let e of i){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 rS(e,t,n){try{let r=await nS(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 iS=w({description:{"en-US":`Get details of a single fine-tune job`,"zh-CN":`获取单个微调任务的详情`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},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 mt(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=Object.entries(o??{}).map(([e,t])=>`${e}=${typeof t==`string`?t:JSON.stringify(t)}`),c=typeof a.usage==`number`?a.usage:void 0,l={job_id:a.job_id??r,job_name:a.job_name??``,priority:a.priority??``,hyper_parameters:o??{},max_output_cnt:a.max_output_cnt??null,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 rS(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`)}}),aS=w({description:{"en-US":`Cancel a running fine-tune job`,"zh-CN":`取消正在运行的微调任务`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`],notes:[{"en-US":`Only PENDING / RUNNING jobs can be cancelled. Completed / failed / already-cancelled jobs return a server-side error (passed through verbatim).`,"zh-CN":`只有 PENDING / RUNNING 状态的任务可以取消。已完成、失败或已取消的任务会返回服务端错误(原样透传)。`}],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 be(e.client,r);t.quiet?k(r):A(i,`json`)}}),oS=w({description:{"en-US":`Delete a fine-tune job record`,"zh-CN":`删除微调任务记录`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified fine-tune job record and cannot be undone.`,"zh-CN":`该操作会永久删除指定的微调任务记录,且无法撤销。`}},usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --dry-run`,`--job-id ft-xxx --yes`],notes:[{"en-US":`Irreversible — the job record is permanently removed.`,"zh-CN":`该操作不可撤销——任务记录将被永久删除。`},{"en-US":"Cancel a RUNNING job first via `finetune cancel` — the platform refuses to delete jobs that are still in flight.","zh-CN":"请先通过 `finetune cancel` 取消 RUNNING 任务,平台拒绝删除仍在运行的任务。"}],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 Re(e.client,r);t.quiet?k(r):A(i,`json`)}});function sS(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 cS(e,t){return sS(e).toLowerCase().includes(t)}async function lS(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await ht(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 uS=w({description:{"en-US":`Fetch training logs for a fine-tune job`,"zh-CN":`获取微调任务的训练日志`},auth:`apiKey`,usageArgs:`--job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Lines per page (default: server-defined)`,"zh-CN":`每页行数(默认:由服务端决定)`}},search:{type:`string`,valueHint:`<keyword>`,description:{"en-US":`Case-insensitive substring filter. When set, all log pages are fetched and filtered client-side (--page is ignored).`,"zh-CN":`不区分大小写的子字符串筛选。设置后会获取全部日志页并在客户端筛选(忽略 --page)。`}},tail:{type:`number`,valueHint:`<n>`,description:{"en-US":`Keep only the last N entries. When set, all log pages are fetched and the trailing N are kept (--page is ignored).`,"zh-CN":`仅保留最后 N 条记录。设置后会获取全部日志页并保留末尾 N 条(忽略 --page)。`}}},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 lS(e.client,r,a??100),i=t,c;if(o){let e=o.toLowerCase();i=t.filter(t=>cS(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}let c=await ht(e.client,r,{pageNo:i,pageSize:a});A(c,`json`)}}),dS=w({description:{"en-US":`List checkpoints produced by a fine-tune job`,"zh-CN":`列出微调任务生成的 Checkpoint`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],notes:[{"en-US":"`model_name` (shown for SUCCEEDED checkpoints) is the direct input for `deploy create --model-name`.","zh-CN":"SUCCEEDED Checkpoint 中显示的 `model_name` 可直接作为 `deploy create --model-name` 的输入。"},{"en-US":"Checkpoints expire ~15 days after creation; `expire_time` shows the deadline. Export or deploy before expiry.","zh-CN":"Checkpoint 创建后约 15 天过期,`expire_time` 显示截止时间。请在过期前导出或部署。"}],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 zt(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.
2833
+ `)}}),fS=w({description:{"en-US":`Publish a checkpoint as a deployable model`,"zh-CN":`将 Checkpoint 发布为可部署模型`},auth:`apiKey`,usageArgs:`--job-id <id> --checkpoint <name> --model-name <name>`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0},checkpoint:{type:`string`,valueHint:`<name>`,description:{"en-US":"Checkpoint identifier from `finetune checkpoints` (required)","zh-CN":"来自 `finetune checkpoints` 的 Checkpoint 标识(必填)"},required:!0},modelName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Deployable model name (required)`,"zh-CN":`可部署模型名称(必填)`},required:!0}},exampleArgs:[`--job-id ft-xxx --checkpoint ckpt-3 --model-name my-qwen-sft`],notes:[{"en-US":"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.","zh-CN":"必须先执行此操作,`deploy <modality> create` 才能使用 Checkpoint。任务达到 SUCCEEDED 后,平台可能自动导出最佳 Checkpoint;对于非最佳 Checkpoint,显式导出是标准方式。"}],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 We(e.client,r,i,a),s=(o.output??o.data)?.model_name??a;t.quiet?k(s):A(o,`json`)}});const pS=/* @__PURE__ */ new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function mS(){let e=/* @__PURE__ */ new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function hS(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 gS(e,t){return new Promise((n,r)=>{if(t.aborted){r(/* @__PURE__ */ Error(`aborted`));return}let i=()=>{clearTimeout(a),r(/* @__PURE__ */ Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var _S=w({description:{"en-US":`Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal.`,"zh-CN":`查询微调任务状态(默认:单次非阻塞获取)。使用 --follow 持续轮询至终态。`},auth:`apiKey`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]`,flags:{jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Fine-tune job ID (required)`,"zh-CN":`微调任务 ID(必填)`},required:!0},follow:{type:`switch`,description:{"en-US":`Block and poll until a terminal state (the legacy behavior). Without it, a single status probe is performed and the command returns immediately.`,"zh-CN":`阻塞并轮询至终态(旧版行为)。不使用时仅查询一次状态并立即返回。`}},interval:{type:`number`,valueHint:`<sec>`,description:{"en-US":`Seconds between polls with --follow (default: 10, min: 1). Ignored without --follow.`,"zh-CN":`使用 --follow 时的轮询间隔秒数(默认:10,最小:1)。未使用 --follow 时忽略。`}},pollTimeout:{type:`number`,valueHint:`<sec>`,description:{"en-US":`With --follow, stop polling after this many seconds (default: no limit). Ignored without --follow.`,"zh-CN":`使用 --follow 时,在指定秒数后停止轮询(默认:无限制)。未使用 --follow 时忽略。`}}},exampleArgs:[{"en-US":`--job-id ft-xxx # single probe, returns immediately`,"zh-CN":`--job-id ft-xxx # 单次查询,立即返回`},{"en-US":`--job-id ft-xxx --output json # status probe for agents`,"zh-CN":`--job-id ft-xxx --output json # 供智能体查询状态`},{"en-US":`--job-id ft-xxx --follow # block until terminal`,"zh-CN":`--job-id ft-xxx --follow # 阻塞等待至终态`},`--job-id ft-xxx --follow --interval 5`,`--job-id ft-xxx --follow --poll-timeout 3600`],notes:[{"en-US":`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.`,"zh-CN":`默认不使用 --follow,执行非阻塞的单次状态查询:获取一次后立即返回。该模式适用于 Agent / 脚本,由调用方控制轮询节奏,CLI 不会持续占用终端。`},{"en-US":`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.`,"zh-CN":`终态 FAILED/CANCELED 会触发普通 CLI 错误(非零退出码);SUCCEEDED 或仍在运行时返回 0。使用 --follow 时,超过 --poll-timeout 会触发超时错误。`},{"en-US":`Use --follow for the blocking, human-terminal-follow experience; use the default mode when driving the loop yourself (e.g. from an agent).`,"zh-CN":`需要在人工终端中阻塞跟踪时使用 --follow;自行驱动轮询(例如通过 Agent)时使用默认模式。`},{"en-US":"For per-step training output (not status), use `finetune logs`.","zh-CN":"要查看逐步骤训练输出(而非状态),请使用 `finetune logs`。"}],async run(e){let{settings:t,flags:r}=e,i=r.jobId,a=r.follow,o=Math.max(1,r.interval??10),s=r.pollTimeout;if(t.dryRun){A({action:`finetune.watch`,job_id:i,follow:a,interval:o,timeout:s},`json`);return}if(!a){let r=await mt(e.client,i),a=r.output??r.data,o=String(a?.status??``).toUpperCase(),s=pS.has(o);if(t.quiet)k(o||`UNKNOWN`);else{let e={job_id:i,status:o||`UNKNOWN`,terminal:s,request_id:r.request_id},n=typeof a?.usage==`number`?a.usage:void 0;if(s&&n&&n>0&&a?.model){e.usage_tokens=n;let r=await rS(t,a.model,n);r&&(e.training_cost=r.cost,e.cost_basis=`${r.unitPrice} 元/${r.priceUnit}`)}A(e,`json`)}if(s&&o!==`SUCCEEDED`)throw new n(`Fine-tune job ${i} ended in status ${o}.`,f.GENERAL);return}let c=new AbortController,l=()=>c.abort();process.on(`SIGINT`,l);try{let r=``,a=Date.now();for(;;){let l=await mt(e.client,i,c.signal),u=l.output??l.data,d=String(u?.status??``).toUpperCase();if(!t.quiet&&d!==r&&(process.stderr.write(`${mS()} ${i} ${d||`UNKNOWN`}\n`),r=d),pS.has(d)){let e=Date.now()-a;if(t.quiet)k(d||`UNKNOWN`);else{let e=typeof u?.usage==`number`?u.usage:void 0,n={...l};if(e&&e>0&&u?.model){let r=await rS(t,u.model,e);r&&(n.training_cost=r.cost,n.usage_tokens=e,n.cost_basis=`${r.unitPrice} 元/${r.priceUnit}`)}A(n,`json`)}if(d!==`SUCCEEDED`)throw new n(`Fine-tune job ${i} ended in status ${d} (elapsed ${hS(e)}).`,f.GENERAL);return}if(s!==void 0&&(Date.now()-a)/1e3>=s)throw new n(`Watching fine-tune job ${i} timed out after ${hS(Date.now()-a)} (last status: ${d||`UNKNOWN`}).`,f.TIMEOUT);await gS(o*1e3,c.signal)}}catch(e){if(c.signal.aborted){process.stderr.write(`
2835
2834
  Interrupted.
2836
- `);return}throw e}finally{process.off(`SIGINT`,l)}}});async function Ex(e){return await Ze(oe(e))}const Dx={baseModel:{type:`string`,valueHint:`<m>`,description:{"en-US":`List training types supported by this base model.`,"zh-CN":`列出该基础模型支持的训练类型。`}},trainingType:{type:`string`,valueHint:`<t>`,description:{"en-US":`List models supporting this training type: ${ne.join(` | `)}.`,"zh-CN":`列出支持该训练类型的模型:${ne.join(` | `)}。`}}};var Ox=w({description:{"en-US":`Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it)`,"zh-CN":`查询微调训练能力:按模型查询其支持的训练类型,或按训练类型查询支持它的模型`},auth:`none`,usageArgs:`--base-model <m> | --training-type <t>`,flags:Dx,exampleArgs:[`--base-model qwen3-8b`,`--training-type sft-lora`,`--training-type cpt --output json`,`--training-type sft --quiet`],notes:[{"en-US":`Exactly one of --base-model / --training-type is required.`,"zh-CN":`--base-model 和 --training-type 必须且只能指定一个。`},{"en-US":"Training-type values use the `<method>` / `<method>-lora` convention: sft | sft-lora | dpo | dpo-lora | cpt. (cpt has no -lora variant server-side.)","zh-CN":"训练类型遵循 `<method>` / `<method>-lora` 命名约定:sft | sft-lora | dpo | dpo-lora | cpt。(服务端没有 cpt-lora 变体。)"},{"en-US":`Queries listFoundationModels, a public API — no console login needed.`,"zh-CN":`查询公开 API listFoundationModels,无需登录控制台。`}],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 qe(t,r);if(!e){A({model:r,error:`No foundation model found matching "${r}".`},`json`);return}let n=Yt(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||!Pt(i))throw new C(`--training-type "${i}" is not supported. Valid: ${ne.join(`, `)}.`);let{method:a,variant:o}=or(i),s=(await Ex(t)).filter(e=>on(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 kx={baseModel:{type:`string`,valueHint:`<model>`,description:{"en-US":`Base model to fine-tune (e.g. qwen3-8b; not the output model name)`,"zh-CN":`待微调的基座模型(例如 qwen3-8b;不是输出模型名称)`},required:!0},datasets:{type:`string`,valueHint:`<ids>`,description:{"en-US":`Training dataset file IDs, comma-separated (required)`,"zh-CN":`训练数据集文件 ID,多个以逗号分隔(必填)`},required:!0},trainingType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Training type: sft | dpo | cpt (default: sft)`,"zh-CN":`训练类型:sft | dpo | cpt(默认:sft)`}},nEpochs:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of training epochs (default: 3)`,"zh-CN":`训练轮数(默认:3)`}}},Ax=[`sft`,`dpo`,`cpt`];var jx=w({description:{"en-US":`Estimate the training cost for a fine-tune job (token billing)`,"zh-CN":`估算微调任务的训练费用(按 Token 计费)`},auth:`console`,usageArgs:`--base-model <model> --datasets <ids> [--training-type <type>] [--n-epochs <n>]`,flags:kx,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:[{"en-US":`Estimate only — the server computes token usage from the datasets; final cost is subject to the bill.`,"zh-CN":`该结果仅为估算值——服务端根据数据集计算 Token 用量,最终费用以账单为准。`},{"en-US":`Covers token billing for sft / dpo / cpt. Training-unit (MTU) billing is not supported by this command.`,"zh-CN":`支持估算 sft / dpo / cpt 的 Token 计费;此命令不支持训练单元(MTU)计费估算。`},{"en-US":`Hyper-parameters other than --n-epochs are fixed at representative defaults for estimation.`,"zh-CN":`除 --n-epochs 外,其他超参数会使用具有代表性的固定默认值进行估算。`}],async run(e){let{settings:t,flags:r}=e,i=r.baseModel,a=r.datasets.split(`,`).map(e=>e.trim()).filter(Boolean),o=(r.trainingType??`sft`).toLowerCase(),s=r.nEpochs??3;if(!Ax.includes(o))throw new n(`Unsupported training type "${o}". Supported: ${Ax.join(`, `)}.`,f.USAGE);if(a.length===0)throw new n(`--datasets must contain at least one file ID.`,f.USAGE);if(t.dryRun){A({action:`finetune.price`,model:i,datasets:a,trainingType:o,nEpochs:s},`json`);return}let c=await et(e.client,i),l=Number(c.price);if(!Number.isFinite(l))throw new n(`No training price found for model "${i}".`,f.GENERAL,void 0,{rawResponse:JSON.stringify(c)});let u=o===`cpt`?await He(e.client,i,a.join(`,`),s):await Ue(e.client,a,{nEpochs:s,batchSize:16,maxLength:8192}),d=u.estimatedDatasetConsumedTokensMinPerEpoch??0,p=u.estimatedDatasetConsumedTokensMaxPerEpoch??0,m=u.estimatedMixedConsumedTokensMinPerEpoch??0,h=u.estimatedMixedConsumedTokensMaxPerEpoch??0,g=(d+m)*s,_=(p+h)*s,v=g/1e3*l,y=_/1e3*l;A({model:i,training_type:o,n_epochs:s,unit_price:l,price_unit:c.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`)}}),Mx=w({description:{"en-US":`List quantizable models and their compression templates`,"zh-CN":`列出可量化模型及其压缩模板`},auth:`apiKey`,usageArgs:`[--model <model>]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by custom model ID or base model name`,"zh-CN":`按自定义模型 ID 或基础模型名称筛选`}}},exampleArgs:[``,`--model qwen3.5-flash-2026-02-23-ft-xxx`],notes:[{"en-US":`Only supported full-parameter fine-tuned models are returned. LoRA and already-quantized models are excluded.`,"zh-CN":`仅返回支持压缩的全参调优模型;LoRA 模型和已量化模型不会返回。`},{"en-US":`Template IDs live in output.custom_models[].templates[].template_id. output.base_models only lists quantizable base model names and carries no templates, so an empty custom_models array means no template ID is available yet.`,"zh-CN":`模板 ID 位于 output.custom_models[].templates[].template_id;output.base_models 只列出可量化的基础模型名称,不含模板,因此 custom_models 为空数组时说明当前还拿不到任何模板 ID。`},{"en-US":`An empty templates[].hyper_parameters array means that template exposes no tunable hyper-parameters; omit --hparam when creating the compression job.`,"zh-CN":`templates[].hyper_parameters 为空数组表示该模板没有可调超参,创建压缩任务时不要传 --hparam。`},{"en-US":"template_name and description are localized server-side from the CLI language setting (default en-US), sent as the lang query parameter. Run `config set --key language --value zh-CN` to get Chinese text.","zh-CN":"template_name 和 description 由服务端按 CLI 的 language 设置本地化(默认 en-US,作为 lang 查询参数下发);需要中文执行 `config set --key language --value zh-CN`。"}],async run(e){let t=e.flags.model||void 0,n=e.localize({"en-US":`en-US`,"zh-CN":`zh-CN`});if(e.settings.dryRun){A({action:`finetune.compress.templates`,model:t,lang:n},`json`);return}let r=await Ht(e.client,{model:t,lang:n});A(r,`json`)}});const Nx={jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Compression job ID (required)`,"zh-CN":`压缩任务 ID(必填)`},required:!0}},Px=/* @__PURE__ */ new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function Fx(e){let t={};for(let r of e??[]){let e=r.indexOf(`=`);if(e<=0)throw new n(`--hparam values must use KEY=VALUE format. / --hparam 必须使用 KEY=VALUE 格式。`,f.USAGE);let i=r.slice(0,e).trim();if(!i)throw new n(`--hparam requires a non-empty key. / --hparam 的键不能为空。`,f.USAGE);t[i]=r.slice(e+1)}return t}function Ix(e){if(!e)return;let t=[...new Set(e.split(`,`).map(e=>e.trim()).filter(Boolean))];return t.length?t:void 0}function Lx(e,t,r){return new n(r||`Compression job ${e} ended in status ${t}. / 压缩任务 ${e} 已以 ${t} 状态结束。`,f.GENERAL)}function Rx(e,t){return new Promise((n,r)=>{if(t.aborted){r(/* @__PURE__ */ Error(`aborted`));return}let i=()=>{clearTimeout(a),r(/* @__PURE__ */ Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var zx=w({description:{"en-US":`Create a model compression job`,"zh-CN":`创建模型压缩任务`},auth:`apiKey`,usageArgs:`--model <model> --template-id <id> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Source custom model ID (required)`,"zh-CN":`源自定义模型 ID(必填)`},required:!0},templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Compression template ID (required)`,"zh-CN":`压缩模板 ID(必填)`},required:!0},jobName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Unique job name (max 50 characters)`,"zh-CN":`唯一任务名称(最多 50 字符)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Job description (max 200 characters)`,"zh-CN":`任务描述(最多 200 字符)`}},hparam:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Hyper-parameter override; repeat for multiple values`,"zh-CN":`超参数覆盖;可重复传入多个值`}},calibrationFiles:{type:`string`,valueHint:`<file-id,...>`,description:{"en-US":`Comma-separated calibration dataset file IDs`,"zh-CN":`逗号分隔的校准数据集文件 ID`}},suffix:{type:`string`,valueHint:`<suffix>`,description:{"en-US":`Output model suffix (1–8 lowercase letters or digits)`,"zh-CN":`产出模型后缀(1–8 个小写字母或数字)`}}},validate(e){if(e.jobName!==void 0&&e.jobName.length>50)return`--job-name must be at most 50 characters. / --job-name 最多 50 个字符。`;if(e.description!==void 0&&e.description.length>200)return`--description must be at most 200 characters. / --description 最多 200 个字符。`;if(e.suffix!==void 0&&!/^[a-z0-9]{1,8}$/.test(e.suffix))return`--suffix must contain 1–8 lowercase letters or digits. / --suffix 必须为 1–8 个小写字母或数字。`},exampleArgs:[`--model qwen3.5-flash-2026-02-23-ft-xxx --template-id quant-flash-nvfp4-mlp-nomtp`,`--model qwen3.5-flash-2026-02-23-ft-xxx --template-id quant-flash-nvfp4-mlp-nomtp --suffix test --hparam calib_input=true`],notes:[{"en-US":"Run `finetune compress templates` first to get a compatible template ID.","zh-CN":"请先运行 `finetune compress templates` 获取兼容的模板 ID。"},{"en-US":`Model compression APIs are currently available only in the Beijing region.`,"zh-CN":`模型压缩 API 当前仅在北京 Region 开放。`}],async run(e){let t=Fx(e.flags.hparam),n=Ix(e.flags.calibrationFiles),r={model:e.flags.model,template_id:e.flags.templateId,...e.flags.jobName?{job_name:e.flags.jobName}:{},...e.flags.description?{job_description:e.flags.description}:{},...Object.keys(t).length?{hyper_parameters:t}:{},...n?{custom_calibration_file_ids:n}:{},...e.flags.suffix?{output_model_suffix:e.flags.suffix}:{}};if(e.settings.dryRun){A({action:`finetune.compress.create`,request:r},`json`);return}let i=await Ee(e.client,r);e.settings.quiet?k(i.output?.job_id??``):A(i,`json`)}}),Bx=w({description:{"en-US":`List model compression jobs`,"zh-CN":`列出模型压缩任务`},auth:`apiKey`,usageArgs:`[filters] [--page <n>] [--page-size <n>]`,flags:{status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter by job status`,"zh-CN":`按任务状态筛选`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by source model ID`,"zh-CN":`按源模型 ID 筛选`}},templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by template ID`,"zh-CN":`按模板 ID 筛选`}},quantSpec:{type:`string`,valueHint:`<spec>`,description:{"en-US":`Filter by quantization specification`,"zh-CN":`按量化规格筛选`}},quantMethod:{type:`string`,valueHint:`<method>`,description:{"en-US":`Filter by quantization method`,"zh-CN":`按量化算法筛选`}},startTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Filter jobs starting no earlier than this time`,"zh-CN":`筛选开始时间不早于该时间的任务`}},endTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Filter jobs ending no later than this time`,"zh-CN":`筛选结束时间不晚于该时间的任务`}},search:{type:`string`,valueHint:`<keyword>`,description:{"en-US":`Search job ID or name`,"zh-CN":`搜索任务 ID 或名称`}},searchField:{type:`string`,valueHint:`<field>`,choices:[`job_id`,`job_name`],description:{"en-US":`Limit --search to job_id or job_name`,"zh-CN":`将 --search 限制为 job_id 或 job_name`}},sortOrder:{type:`string`,valueHint:`<order>`,choices:[`asc`,`desc`],description:{"en-US":`Sort order by create_time (default: desc)`,"zh-CN":`按 create_time 排序(默认:desc)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max: 100)`,"zh-CN":`每页数量(默认:10,最多:100)`}}},validate(e){if(e.page!==void 0&&(!Number.isInteger(e.page)||e.page<1))return`--page must be an integer of at least 1. / --page 必须是大于等于 1 的整数。`;if(e.pageSize!==void 0&&(!Number.isInteger(e.pageSize)||e.pageSize<1||e.pageSize>100))return`--page-size must be an integer between 1 and 100. / --page-size 必须是 1–100 的整数。`;if(e.searchField&&!e.search)return`--search-field requires --search. / --search-field 必须与 --search 一起使用。`},exampleArgs:[``,`--status SUCCEEDED --page-size 20`,`--quant-method gptq`,`--search qwen3 --search-field job_name --sort-order asc`],async run(e){let t={status:e.flags.status,model:e.flags.model,templateId:e.flags.templateId,quantSpec:e.flags.quantSpec,quantMethod:e.flags.quantMethod,startTime:e.flags.startTime,endTime:e.flags.endTime,searchKey:e.flags.search,selectKey:e.flags.searchField,sortOrder:e.flags.sortOrder,pageNo:e.flags.page,pageSize:e.flags.pageSize};if(e.settings.dryRun){A({action:`finetune.compress.list`,...t},`json`);return}let n=await Vt(e.client,t),r=n.output,i=(r?.jobs??[]).map(e=>({job_id:e.job_id??``,job_name:e.job_name??``,status:e.status??``,model:e.model??``,template_name:e.template_name??``,quantized_output:e.quantized_output??``,create_time:e.create_time??``}));A({items:i,total:r?.total,page_no:r?.page_no,page_size:r?.page_size,request_id:n.request_id},`json`)}}),Vx=w({description:{"en-US":`Get a compression job`,"zh-CN":`查询压缩任务详情`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:Nx,exampleArgs:[`--job-id quant-xxx`],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.get`,job_id:t},`json`);return}A(await lt(e.client,t),`json`)}});const Hx={...Nx,follow:{type:`switch`,description:{"en-US":`Poll until the job reaches a terminal state`,"zh-CN":`持续轮询直至任务进入终态`}},interval:{type:`number`,valueHint:`<sec>`,description:{"en-US":`Polling interval with --follow (default: 10, min: 1)`,"zh-CN":`使用 --follow 时的轮询间隔(默认:10,最小:1)`}},pollTimeout:{type:`number`,valueHint:`<sec>`,description:{"en-US":`Stop polling after this many seconds`,"zh-CN":`在指定秒数后停止轮询`}}};var Ux=w({description:{"en-US":`Probe or follow a compression job's status`,"zh-CN":`查询或持续跟踪压缩任务状态`},auth:`apiKey`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]`,flags:Hx,validate(e){if(e.interval!==void 0&&(!Number.isFinite(e.interval)||e.interval<1))return`--interval must be at least 1 second. / --interval 必须至少为 1 秒。`;if(e.pollTimeout!==void 0&&(!Number.isFinite(e.pollTimeout)||e.pollTimeout<1))return`--poll-timeout must be at least 1 second. / --poll-timeout 必须至少为 1 秒。`},exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --follow`,`--job-id quant-xxx --follow --interval 30 --poll-timeout 7200`],notes:[{"en-US":`Without --follow, the command performs one non-blocking status probe.`,"zh-CN":`不使用 --follow 时仅执行一次非阻塞状态查询。`},{"en-US":"On success, quantized_output can be passed to `deploy text create --model-name`.","zh-CN":"成功后可将 quantized_output 传给 `deploy text create --model-name`。"}],async run(e){let t=e.flags.jobId,r=e.flags.interval??10;if(e.settings.dryRun){A({action:`finetune.compress.watch`,job_id:t,follow:e.flags.follow,interval:r,timeout:e.flags.pollTimeout},`json`);return}if(!e.flags.follow){let n=await lt(e.client,t),r=String(n.output?.status??`UNKNOWN`).toUpperCase();if(e.settings.quiet?k(r):A({job_id:t,status:r,terminal:Px.has(r),quantized_output:n.output?.quantized_output,request_id:n.request_id},`json`),Px.has(r)&&r!==`SUCCEEDED`)throw Lx(t,r,n.output?.error?.message);return}let i=new AbortController,a=()=>i.abort();process.on(`SIGINT`,a);let o=Date.now();try{for(;;){let a=await lt(e.client,t,i.signal),s=String(a.output?.status??`UNKNOWN`).toUpperCase();if(Px.has(s)){if(e.settings.quiet?k(s):A(a,`json`),s!==`SUCCEEDED`)throw Lx(t,s,a.output?.error?.message);return}if(e.flags.pollTimeout!==void 0&&(Date.now()-o)/1e3>=e.flags.pollTimeout)throw new n(`Watching compression job ${t} timed out. / 等待压缩任务 ${t} 超时。`,f.TIMEOUT);await Rx(r*1e3,i.signal)}}catch(t){if(i.signal.aborted){process.stderr.write(`\n${e.localize({"en-US":`Interrupted.`,"zh-CN":`已中断。`})}\n`);return}throw t}finally{process.off(`SIGINT`,a)}}});const Wx={...Nx,offset:{type:`number`,valueHint:`<n>`,description:{"en-US":`Skip the first N lines (default: 0)`,"zh-CN":`跳过前 N 行(默认:0)`}},lines:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of lines to read (default: 100, max: 1000)`,"zh-CN":`读取行数(默认:100,最多:1000)`}},tail:{type:`number`,valueHint:`<n>`,description:{"en-US":`Read the last N log lines`,"zh-CN":`读取最后 N 行日志`}}};var Gx=w({description:{"en-US":`Get compression job logs`,"zh-CN":`获取压缩任务日志`},auth:`apiKey`,usageArgs:`--job-id <id> [--offset <n>] [--lines <n> | --tail <n>]`,flags:Wx,validate(e){if(e.offset!==void 0&&(!Number.isInteger(e.offset)||e.offset<0))return`--offset must be a non-negative integer. / --offset 必须是非负整数。`;if(e.lines!==void 0&&(!Number.isInteger(e.lines)||e.lines<1||e.lines>1e3))return`--lines must be an integer between 1 and 1000. / --lines 必须是 1–1000 的整数。`;if(e.tail!==void 0&&(!Number.isInteger(e.tail)||e.tail<1||e.tail>1e3))return`--tail must be an integer between 1 and 1000. / --tail 必须是 1–1000 的整数。`;if(e.tail!==void 0&&(e.offset!==void 0||e.lines!==void 0))return`--tail cannot be combined with --offset or --lines. / --tail 不能与 --offset 或 --lines 同时使用。`},exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --offset 0 --lines 50`,`--job-id quant-xxx --tail 20`],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.logs`,job_id:t,offset:e.flags.offset,line:e.flags.lines,tail:e.flags.tail},`json`);return}if(e.flags.tail!==void 0){let n=(await ut(e.client,t,{offset:0,line:1})).output?.total??0,r=Math.max(0,n-e.flags.tail);A(await ut(e.client,t,{offset:r,line:e.flags.tail}),`json`);return}A(await ut(e.client,t,{offset:e.flags.offset,line:e.flags.lines}),`json`)}}),Kx=w({description:{"en-US":`Cancel a compression job`,"zh-CN":`取消压缩任务`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:Nx,exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --dry-run`],notes:[{"en-US":`Only PENDING, QUEUING, or RUNNING jobs can be cancelled.`,"zh-CN":`只有 PENDING、QUEUING 或 RUNNING 状态的任务可以取消。`}],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.cancel`,job_id:t},`json`);return}let n=await ye(e.client,t);e.settings.quiet?k(t):A(n,`json`)}}),qx=w({description:{"en-US":`Delete a compression job record`,"zh-CN":`删除压缩任务记录`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the compression job record and cannot be undone.`,"zh-CN":`该操作会永久删除压缩任务记录,且无法撤销。`}},usageArgs:`--job-id <id>`,flags:Nx,exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --dry-run`,`--job-id quant-xxx --yes`],notes:[{"en-US":`Only terminal jobs can be deleted. Deleting a job record does not delete its quantized output model.`,"zh-CN":`只有终态任务可以删除;删除任务记录不会删除其产出的量化模型。`}],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.delete`,job_id:t},`json`);return}let n=await Pe(e.client,t);e.settings.quiet?k(t):A(n,`json`)}});const Jx={deployedModel:{type:`string`,valueHint:`<code>`,required:!0,description:{"en-US":`Deployed model identifier (ModelCode)`,"zh-CN":`部署调用标识(ModelCode)`}}},Yx={instanceId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Capacity instance ID returned by the API`,"zh-CN":`接口返回的容量实例 ID`}}},Xx={...Jx,operationId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Capacity operation ID returned by a write request`,"zh-CN":`写请求返回的容量操作 ID`}}};function Zx(e){for(let[t,n]of Object.entries(e))if([`deployedModel`,`instanceId`,`operationId`].includes(t)&&typeof n==`string`&&!n.trim())return`Identifiers must not be empty. / 标识不能为空。`}function Qx(e){if(e.page!==void 0&&(!Number.isSafeInteger(e.page)||e.page<1))return`--page must be a positive integer. / --page 必须是正整数。`;if(e.pageSize!==void 0&&(!Number.isSafeInteger(e.pageSize)||e.pageSize<1||e.pageSize>100))return`--page-size must be an integer from 1 to 100. / --page-size 必须是 1–100 的整数。`}function $x(e){return e===void 0?void 0:e.split(`,`).map(e=>e.trim())}const eS=2147483;function tS(e,t){return new Promise((n,r)=>{t.throwIfAborted();let i=()=>{clearTimeout(a),r(t.reason)},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}async function nS(e,t,r,i){let a=new AbortController,o,s=i.initialResponse,c=()=>new n(`Capacity operation wait timed out; query the same operation ID before retrying any write. / 等待容量操作超时;重试写操作前请查询同一操作 ID。`,f.TIMEOUT,void 0,{cause:{deployed_model:t,operation_id:r,last_response:o}}),l=()=>a.abort(i.signal?.reason);i.signal?.addEventListener(`abort`,l,{once:!0}),i.signal?.aborted&&l();let u=Date.now()+i.pollTimeout*1e3,d=setTimeout(()=>a.abort(c()),i.pollTimeout*1e3),p=()=>{Date.now()>=u&&!a.signal.aborted&&a.abort(c()),a.signal.throwIfAborted()},m=i.interval*1e3,h=Math.max(m,3e4);try{for(;;){p();let c=s??await ct(e,t,r,a.signal);s=void 0,o=c,p();let l=c.output??c.data;if(l?.operation_status===`FAILED`)throw new n(l.error_message??l.error_code??`Capacity operation failed. / 容量操作失败。`,f.GENERAL,void 0,{api:{httpStatus:200,apiCode:l.error_code,requestId:c.request_id},cause:l,rawResponse:JSON.stringify(c)});if(l?.operation_status===`SUCCEEDED`){let n=l.instance_id??i.fallbackInstanceId,r=n?await st(e,t,n,a.signal):void 0;p();let o=await pt(e,t,a.signal);return p(),{...c,instance:r,deployment:o}}if(l?.operation_status!==`PROCESSING`)throw new n(`Missing or unsupported operation_status; cannot determine completion. / 缺少或不支持的 operation_status,无法判断完成状态。`,f.GENERAL,void 0,{cause:c,rawResponse:JSON.stringify(c)});await tS(Math.min(m,Math.max(0,u-Date.now())),a.signal),m=Math.min(m*2,h)}}catch(e){throw a.signal.aborted?a.signal.reason:e}finally{clearTimeout(d),i.signal?.removeEventListener(`abort`,l)}}const rS={...Xx,interval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Initial poll interval (1–3600 seconds, default: 2); doubles up to max(initial, 30)`,"zh-CN":`初始轮询间隔(1–3600 秒,默认:2);逐次翻倍至 max(初始值, 30)`}},pollTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Total wait budget including requests and refresh (default: 600 seconds)`,"zh-CN":`总等待时限,包含请求及刷新(默认:600 秒)`}}};var iS=w({description:{"en-US":`Wait for a capacity operation and refresh confirmed capacity`,"zh-CN":`等待容量操作完成并刷新已确认容量`},auth:`apiKey`,flags:rS,usageArgs:`--deployed-model <code> --operation-id <id> [--interval <seconds>] [--poll-timeout <seconds>]`,exampleArgs:[`--deployed-model example-model-code --operation-id 100001`,`--deployed-model example-model-code --operation-id 100001 --interval 2 --poll-timeout 600`],notes:[{"en-US":`Read-only GET polling: PROCESSING continues, FAILED exits 1 with the server error, SUCCEEDED refreshes the instance (when an ID is returned) and deployment. Output preserves the operation envelope and adds instance/deployment response envelopes. Missing or unknown status fails rather than assuming success.`,"zh-CN":`只读 GET 轮询:PROCESSING 继续等待,FAILED 透传服务端错误并退出 1,SUCCEEDED 刷新实例(返回 ID 时)及部署。输出保留操作响应结构,追加 instance/deployment 响应结构。缺失或未知状态报错,不推定成功。`},{"en-US":`--timeout limits each HTTP request; --poll-timeout bounds the entire wait (exit 5 on expiry). Ctrl-C stops local waiting, not the remote operation. No write is retried; use the original operation ID after a timeout or interruption.`,"zh-CN":`--timeout 限制单次 HTTP 请求,--poll-timeout 限制整个等待过程(超时退出 5)。Ctrl-C 只停止本地等待,不取消远端操作。不重试任何写请求;超时或中断后仍使用原操作 ID 查询。`}],validate(e){let t=Zx(e);if(t)return t;if(e.interval!==void 0&&(!Number.isFinite(e.interval)||e.interval<1||e.interval>3600))return`--interval must be 1–3600 seconds. / --interval 必须为 1–3600 秒。`;if(e.pollTimeout!==void 0&&(!Number.isFinite(e.pollTimeout)||e.pollTimeout<=0||e.pollTimeout>eS))return`--poll-timeout must be > 0 and <= ${eS} seconds. / --poll-timeout 必须大于 0 且不超过 ${eS} 秒。`},async run(e){let{flags:t,settings:n}=e,r=t.interval??2,i=t.pollTimeout??600;if(n.dryRun){A({action:`deploy.operation.wait`,deployed_model:t.deployedModel,operation_id:t.operationId,interval:r,poll_timeout:i},`json`);return}let a=new AbortController,o=()=>a.abort(/* @__PURE__ */ Error(`Interrupted. / 已中断。`));process.once(`SIGINT`,o);try{let n=await nS(e.client,t.deployedModel,t.operationId,{interval:r,pollTimeout:i,signal:a.signal});A(n,`json`)}catch(e){if(!a.signal.aborted)throw e}finally{process.removeListener(`SIGINT`,o)}}});const aS={inputTpm:{type:`number`,valueHint:`<kTPM>`,description:{"en-US":`Absolute input capacity in kTPM (1 kTPM = 1000 tokens/minute)`,"zh-CN":`输入绝对容量,单位 kTPM(1 kTPM = 1000 Tokens/分钟)`}},outputTpm:{type:`number`,valueHint:`<kTPM>`,description:{"en-US":`Absolute output capacity in kTPM`,"zh-CN":`输出绝对容量,单位 kTPM`}}},oS={duration:{type:`number`,valueHint:`<days>`,description:{"en-US":`Prepaid purchase/renewal duration, positive integer days`,"zh-CN":`预付费购买或续订天数,正整数`}},autoRenewal:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Explicitly enable or disable automatic renewal for prepaid purchases`,"zh-CN":`显式开启或关闭预付费自动续费`}},autoRenewalDuration:{type:`number`,valueHint:`<days>`,description:{"en-US":`Automatic renewal duration; required when enabled`,"zh-CN":`自动续费天数,开启自动续费时必填`}},autoRenewalCycle:{type:`string`,valueHint:`<cycle>`,description:{"en-US":`Optional supported renewal cycle, e.g. Day`,"zh-CN":`可选续费周期单位,按服务支持的值传入,如 Day`}}},sS={wait:{type:`switch`,description:{"en-US":`Wait for the returned capacity operation and refresh capacity`,"zh-CN":`等待返回的容量操作完成并刷新容量`}},interval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Initial wait poll interval (1–3600, default: 2 seconds)`,"zh-CN":`等待初始轮询间隔(1–3600,默认:2 秒)`}},pollTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Wait budget after submission (default: 600 seconds)`,"zh-CN":`提交后的等待总时限(默认:600 秒)`}}},cS={requestId:{type:`string`,valueHint:`<uuid>`,description:{"en-US":`Request identifier; generated if omitted. Reuse with identical parameters only for the same capacity operation`,"zh-CN":`请求标识,省略时生成;仅重试同一容量操作时保持标识和参数一致`}},...sS},lS={orderType:{type:`string`,valueHint:`<UPGRADE|DOWNGRADE>`,choices:[`UPGRADE`,`DOWNGRADE`],description:{"en-US":`Optional order direction; otherwise the server decides`,"zh-CN":`可选变配方向,省略时由服务端判定`}}},uS=[{"en-US":`Use --dry-run before confirming with --yes. A write is submitted once, never automatically retried. HTTP 200 is not operation success: inspect operation_status or pass --wait. After interruption or timeout, query the saved ModelCode/operation ID before considering another write.`,"zh-CN":`先用 --dry-run 预览,确认后再用 --yes。写请求只提交一次,不自动重试。HTTP 200 不等于操作成功:检查 operation_status 或使用 --wait。中断或超时后,先查询已保存的 ModelCode/操作 ID,再考虑是否重试写请求。`},{"en-US":`Capacities are absolute kTPM for one instance, not increments or ModelCode totals. Zero capacity is not release. Model-specific steps, limits and purchase periods are validated by the server. Automatic renewal configuration is part of purchase/scale/renew, not a standalone free setting change.`,"zh-CN":`容量是单个实例的绝对 kTPM,不是增量或 ModelCode 总量;容量归零不等于释放。模型步长、上下限及购买时长限制由服务端校验。自动续费配置属于购买、变配或续订流程,不是独立免费设置操作。`}];function dS(e){if(e.requestId!==void 0&&(!e.requestId.trim()||/[\r\n]/.test(e.requestId)))return`--request-id must be non-empty and contain no line breaks. / --request-id 不能为空或包含换行。`;if(!e.wait&&(e.interval!==void 0||e.pollTimeout!==void 0))return`--interval/--poll-timeout require --wait. / --interval/--poll-timeout 需要同时指定 --wait。`;if(e.interval!==void 0&&(!Number.isFinite(e.interval)||e.interval<1||e.interval>3600))return`--interval must be 1–3600 seconds. / --interval 必须为 1–3600 秒。`;if(e.pollTimeout!==void 0&&(!Number.isFinite(e.pollTimeout)||e.pollTimeout<=0||e.pollTimeout>2147483))return`--poll-timeout must be > 0 and <= 2147483 seconds. / --poll-timeout 必须大于 0 且不超过 2147483 秒。`}async function fS(e,t,r,i){let a=await st(e,t,r),o=a.output??a.data;if(!o||o.deleted===!0||o[`can_${i}`]!==!0)throw new n(`Capacity instance does not currently allow ${i}; refresh its details. / 容量实例当前不允许 ${i},请刷新详情。`,f.USAGE,void 0,{cause:a});return o}async function pS(e,t){try{return await t()}catch(t){let r={client_request_id:e,error:t instanceof Error?t.message:t},i=`Request ID: ${e}. No automatic retry; first check whether the operation was accepted. / 请求标识:${e}。未自动重试,请先核查操作是否已受理。`;if(t instanceof n)throw new n(t.message,t.exitCode,[t.hint,i].filter(Boolean).join(`
2837
- `),{api:t.api,rawResponse:t.rawResponse,cause:{...r,original_cause:t.cause}});if(t instanceof Error)try{t.message+=`\n${i}`}catch{}throw t}}async function mS(e,t,r,i,a,o=!1,s){let c=r.output??r.data,l={...r,...a?{client_request_id:a}:{}};if(c?.operation_status===`FAILED`){let e=typeof c.error_message==`string`?c.error_message:typeof c.error_code==`string`?c.error_code:`Capacity operation failed. / 容量操作失败。`;throw new n(e,f.GENERAL,void 0,{api:{httpStatus:200,apiCode:typeof c.error_code==`string`?c.error_code:void 0,requestId:r.request_id},cause:l,rawResponse:JSON.stringify(l)})}if(o&&![`PROCESSING`,`SUCCEEDED`].includes(String(c?.operation_status)))throw new n(`Missing or unsupported operation_status after submission; do not repeat the write. / 提交后缺少或不支持的 operation_status,请勿重复写入。`,f.GENERAL,void 0,{cause:l});if(!i.wait){A(l,`json`);return}let u=t??(typeof c?.deployed_model==`string`?c.deployed_model:void 0),d=c?.operation_id;if(!u||typeof d!=`string`||!d.trim())throw new n(`Write submitted but no ModelCode/operation ID was returned for waiting; query the deployment before retrying. / 写请求已提交,但未返回等待所需的 ModelCode/操作 ID;重试前请查询部署。`,f.GENERAL,void 0,{cause:l,rawResponse:JSON.stringify(l)});process.stderr.write(`${JSON.stringify({submitted:!0,deployed_model:u,operation_id:d,client_request_id:a})}\n`);let p=new AbortController,m=()=>p.abort(/* @__PURE__ */ Error(`Interrupted. / 已中断。`));process.once(`SIGINT`,m);try{let t=await nS(e,u,d,{interval:i.interval??2,pollTimeout:i.pollTimeout??600,signal:p.signal,initialResponse:c?.operation_status===`SUCCEEDED`?r:void 0,fallbackInstanceId:s}),o=t.output??t.data,l=t.output?`output`:`data`,m={...t,...o?{[l]:{...o,operation_id:o.operation_id??d}}:{},...a?{client_request_id:a}:{}};if(s&&(t.instance?.output??t.instance?.data)?.deleted!==!0)throw new n(`Release operation completed but deleted=true is not confirmed; refresh the instance before deleting the ModelCode. / 释放操作已结束,但未确认 deleted=true;删除 ModelCode 前请刷新实例。`,f.GENERAL,void 0,{cause:m});A(m,`json`)}catch(e){if(!p.signal.aborted)throw e}finally{process.removeListener(`SIGINT`,m)}}const hS={modelName:{type:`string`,valueHint:`<model_name>`,description:{"en-US":`Model to deploy — fine-tuned output name or catalog model (required)`,"zh-CN":`要部署的模型:微调输出模型名称或模型目录中的模型(必填)`},required:!0},displayName:{type:`string`,valueHint:`<display_name>`,description:{"en-US":`Console display name (optional for PTU; required for other plans)`,"zh-CN":`控制台显示名称(PTU 可选;其他方案必填)`}},plan:{type:`string`,valueHint:`<plan>`,description:{"en-US":`Billing plan: lora (default, Token-billed) | ptu (throughput reservation) | mu`,"zh-CN":`计费方案:lora(默认,按 Token 计费)| ptu(吞吐预留)| mu`}},deploySpec:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deploy spec (only used by plan=mu; auto-picked if omitted)`,"zh-CN":`部署规格(仅 plan=mu 使用;省略时自动选择)`}},capacity:{type:`number`,valueHint:`<n>`,description:{"en-US":`Resource units (plan=mu only; required by API; defaults to the template's unit)`,"zh-CN":`资源单元数(仅 plan=mu;API 必填;默认为模板的单元数)`}},billingMethod:{type:`string`,valueHint:`<m>`,description:{"en-US":`Billing method (plan=mu only; default "POST_PAY", the only supported value)`,"zh-CN":`计费方式(仅 plan=mu;默认且仅支持 "POST_PAY")`}},...aS,thinkingOutputTpm:{type:`number`,valueHint:`<n>`,description:{"en-US":`Legacy thinking-output capacity flag; not supported for PTU`,"zh-CN":`旧版思考输出容量参数;PTU 不支持此参数`}},chargeType:{type:`string`,valueHint:`<type>`,choices:[`pre_paid`,`post_paid`],description:{"en-US":`PTU payment type (required for plan=ptu): pre_paid or post_paid`,"zh-CN":`PTU 付费方式(plan=ptu 必填):pre_paid 或 post_paid`}},serviceTier:{type:`string`,valueHint:`<tier>`,choices:[`ptu_fast`,`ptu_default`],description:{"en-US":`PTU service tier: ptu_fast (default) or ptu_default (prepaid only)`,"zh-CN":`PTU 性能档位:ptu_fast(默认高速)或 ptu_default(标速,仅预付费)`}},suffix:{type:`string`,valueHint:`<suffix>`,description:{"en-US":`Optional PTU ModelCode suffix; generated by the service when omitted`,"zh-CN":`可选 PTU ModelCode 后缀;省略时由服务端生成`}},...oS,...sS},gS=`--model-name <model_name> [--display-name <display_name>] [--plan <plan>] [--charge-type <type>] [--service-tier <tier>] [--suffix <suffix>] [--input-tpm <n> --output-tpm <n>] [flags]`,_S={level:`high`,message:{"en-US":`Creating a deployment purchases or provisions resources and may incur charges.`,"zh-CN":`创建部署会购买或开通资源,可能产生费用。`}},vS=[{"en-US":"Plan defaults to `lora` (Token-billed) for text/image and `mu` (model-unit-billed) for audio (CosyVoice TTS). Pass --plan to override.","zh-CN":"文本和图片部署默认使用 `lora`(按 Token 计费),音频(CosyVoice TTS)默认使用 `mu`(按模型单元计费)。可通过 --plan 覆盖。"},{"en-US":`For plan=ptu, --charge-type, --input-tpm and --output-tpm are required. Capacity is in kTPM (1 kTPM = 1000 tokens/minute). Separate thinking-output capacity is unsupported. Prepaid requires --duration and explicit --auto-renewal true|false.`,"zh-CN":`plan=ptu 时,--charge-type、--input-tpm 和 --output-tpm 必填。容量单位为 kTPM(1 kTPM = 1000 Token/分钟),不支持单独的思考输出容量。预付费须提供 --duration 和显式 --auto-renewal true|false。`},{"en-US":"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.","zh-CN":"plan=mu 时,`capacity`、`billing_method` 和 `deploy_spec` 必填。billing_method 默认且仅支持 POST_PAY;省略 deploy_spec 和 capacity 时,会从 GET /deployments/models 自动选择。"},{"en-US":"Use `deploy models --source base` to inspect available templates.","zh-CN":"使用 `deploy models --source base` 查看可用模板。"},{"en-US":`PTU creation preserves the original JSON and operation_id even with --quiet. --wait only queries the returned operation; pending capacity is not effective capacity. Check the actual status before invoking the model.`,"zh-CN":`PTU 创建即使指定 --quiet 也保留原始 JSON 和 operation_id。--wait 仅查询返回的操作;待生效容量不等于已生效容量。调用模型前请确认实际状态。`},{"en-US":"--model-name identifies the source model; the returned deployed_model is the invocation identifier (ModelCode). Use it for inference (`text chat --model <deployed_model>`) and deployment lifecycle commands.","zh-CN":"--model-name 标识源模型;返回的 deployed_model 为调用标识(ModelCode),用于推理(`text chat --model <deployed_model>`)和部署生命周期命令。"},{"en-US":`Initial ModelCode creation does not support --request-id or promise idempotency. A timeout is not proof of failure: check whether the deployment was created before trying again. This command never automatically resubmits creation.`,"zh-CN":`首次创建 ModelCode 不支持 --request-id,也不承诺幂等。超时不代表失败:再次尝试前先确认部署是否已创建。本命令不会自动重新提交创建请求。`},{"en-US":`Use --dry-run to preview without requests. Pass --yes only after confirming the costs.`,"zh-CN":`使用 --dry-run 离线预览;仅在确认费用后传入 --yes 执行。`}];function yS(e,t){let n=t.plan||Me(e),r=ee[n];if(!r)return`Unsupported plan "${n}". Supported plans: ${Object.keys(ee).join(`, `)}. / 不支持方案 "${n}";支持的方案:${Object.keys(ee).join(`, `)}。`;if(n!==`ptu`){if(t.chargeType!==void 0||t.serviceTier!==void 0||t.suffix!==void 0||Ct(t)||t.wait||t.interval!==void 0||t.pollTimeout!==void 0)return`Payment, service tier, suffix, prepaid and wait options are PTU-only. / 付费方式、性能档位、后缀、预付费和等待参数仅适用于 PTU。`;if(!t.displayName?.trim())return`--display-name is required for non-PTU plans. / 非 PTU 方案必须提供 --display-name。`}else if(t.thinkingOutputTpm!==void 0)return`--thinking-output-tpm is not supported for PTU. / PTU 不支持 --thinking-output-tpm。`;return dS(t)??r.validateFlags(t)}async function bS(e,t){let{identity:n,settings:r,flags:i}=t,a=i.plan||Me(e),o=_n(a),s=async e=>{let r=await o.resolve({client:t.client,dryRun:e,binName:n.binName,flags:i,model:i.modelName,name:i.displayName});return{model_name:i.modelName,...i.displayName===void 0?{}:{name:i.displayName},plan:a,...r.body}};if(r.dryRun){A({action:`deploy.create`,body:await s(!0)},`json`);return}let c=await De(t.client,await s(!1)),l=c.output??c.data;a===`ptu`?await mS(t.client,l?.deployed_model,c,i):r.quiet?k(l?.deployed_model??``):A(c,`json`)}const xS=w({description:{"en-US":`Create a text model deployment`,"zh-CN":`创建文本模型部署`},auth:`apiKey`,risk:_S,usageArgs:gS,flags:hS,exampleArgs:[`--model-name my-qwen-sft --display-name my-sft-test`,`--model-name qwen3.6-flash-2026-04-16 --plan ptu --charge-type post_paid --input-tpm 10000 --output-tpm 1000 --dry-run`,`--model-name qwen3.6-flash-2026-04-16 --plan ptu --charge-type pre_paid --service-tier ptu_default --input-tpm 10000 --output-tpm 1000 --duration 30 --auto-renewal false --dry-run`,`--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:vS,validate:e=>yS(`text`,e),run:e=>bS(`text`,e)}),SS=w({description:{"en-US":`Create an audio (TTS) model deployment`,"zh-CN":`创建音频(TTS)模型部署`},auth:`apiKey`,risk:_S,usageArgs:gS,flags:hS,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:vS,validate:e=>yS(`audio`,e),run:e=>bS(`audio`,e)}),CS=w({description:{"en-US":`Create an image generation model deployment`,"zh-CN":`创建图片生成模型部署`},auth:`apiKey`,risk:_S,usageArgs:gS,flags:hS,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:vS,validate:e=>yS(`image`,e),run:e=>bS(`image`,e)});var wS=w({description:{"en-US":`List model deployments and throughput reservations`,"zh-CN":`列出模型部署及吞吐预留`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--plan <plan>] [--status <status>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max 100)`,"zh-CN":`每页结果数(默认:10,最多:100)`}},plan:{type:`string`,valueHint:`<plan>`,description:{"en-US":`Server-side plan filter; use ptu for throughput reservations`,"zh-CN":`服务端方案筛选;吞吐预留使用 ptu`}},status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter only the fetched page locally by ModelCode status; total remains unfiltered`,"zh-CN":`仅在已获取的当前页本地筛选 ModelCode 状态;total 仍为筛选前总数`}}},exampleArgs:[``,`--plan ptu`,`--plan ptu --status RUNNING --page-size 100`,`--page-size 20 --output json`],notes:[{"en-US":`The deployment list API supports page_no/page_size/plan, not status. --status filters only the requested page, not the entire account; an empty filtered page does not mean there are no matches on later pages. total is the server total before local filtering; local_filter reports the current-page match count. PTU capacities are kTPM.`,"zh-CN":`部署列表 API 支持 page_no/page_size/plan,不支持 status。--status 仅筛选所请求的当前页,不代表全账号筛选;当前页为空不代表后续页没有匹配项。total 是本地筛选前的服务端总数,local_filter 给出当前页匹配数量。PTU 容量单位为 kTPM。`}],validate(e){return Qx(e)??([e.plan,e.status].some(e=>e!==void 0&&!e.trim())?`Filters must not be empty. / 筛选条件不能为空。`:void 0)},async run(e){let{settings:t,flags:n}=e,r=n.page??1,i=n.pageSize??10,a=n.status?.trim(),o=n.plan?.trim();if(t.dryRun){A({action:`deploy.list`,page:r,page_size:i,plan:o,status:a,...a?{filter_scope:`page`}:{}},`json`);return}let s=await Gt(e.client,{pageNo:r,pageSize:i,plan:o}),c=s.output??s.data,l=c?.deployments??[],u=(a?l.filter(e=>e.status===a):l).map(e=>({...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??``}));A({items:u,total:c?.total,page_no:c?.page_no??r,page_size:c?.page_size??i,...a?{local_filter:{status:a,scope:`page`,matched_count:u.length,unfiltered_page_count:l.length}}:{},request_id:s.request_id},`json`)}}),TS=w({description:{"en-US":`Get details of a single model deployment`,"zh-CN":`获取单个模型部署的详情`},auth:`apiKey`,usageArgs:`--deployed-model <id>`,flags:Jx,exampleArgs:[`--deployed-model qwen-plus-2025-12-01-b6d61c71`,`--deployed-model qwen-plus-2025-12-01-b6d61c71 --output json`],notes:[{"en-US":`Preserves deployment fields including ptu_capacity (aggregate effective kTPM), ptu_service_tier, overflow_strategy and pre_paid_info. For mixed billing or multiple instances, query capacity list/get for each instance's status, expiry and capacity; ModelCode status is not instance status.`,"zh-CN":`保留部署字段,包括 ptu_capacity(汇总生效容量,kTPM)、ptu_service_tier、overflow_strategy 及 pre_paid_info。混合付费或多实例时,通过 capacity list/get 查询各实例状态、到期时间和容量;ModelCode 状态不等于实例状态。`}],validate:Zx,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 pt(e.client,r),a=i.output??i.data;if(!a){A({deployed_model:r,request_id:i.request_id},`json`);return}let o={...a,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`)}});const ES={...Jx,page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (1–100, default: 20)`,"zh-CN":`每页条数(1–100,默认:20)`}},includeDeleted:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Include released instances (default: true)`,"zh-CN":`包含已释放实例(默认:true)`}},statuses:{type:`string`,valueHint:`<status,...>`,description:{"en-US":`Instance statuses, comma-separated (not ModelCode statuses)`,"zh-CN":`实例状态,逗号分隔(非 ModelCode 状态)`}},chargeTypes:{type:`string`,valueHint:`<pre_paid,post_paid>`,description:{"en-US":`Charge types: pre_paid, post_paid; comma-separated`,"zh-CN":`付费类型:pre_paid、post_paid,逗号分隔`}}};var DS=w({description:{"en-US":`List throughput reservation capacity instances`,"zh-CN":`查询吞吐预留容量实例列表`},auth:`apiKey`,flags:ES,usageArgs:`--deployed-model <code> [--page <n>] [--page-size <n>] [--include-deleted <true|false>] [--statuses <status,...>] [--charge-types <pre_paid,post_paid>]`,exampleArgs:[`--deployed-model example-model-code`,`--deployed-model example-model-code --include-deleted false --statuses RUNNING,STOPPED`],notes:[{"en-US":`Preserves the API envelope and records/items/page/itemsPerPage/pageCount pagination. Capacities are kTPM; effective, configured and target capacities are distinct. STOPPED alone does not mean released: inspect deleted.`,"zh-CN":`保留 API 响应结构及 records/items/page/itemsPerPage/pageCount 分页字段。容量单位为 kTPM,区分生效、配置和目标容量。仅 STOPPED 不代表已释放,需检查 deleted。`}],validate(e){let t=Zx(e)??Qx(e);if(t)return t;if([e.statuses,e.chargeTypes].some(e=>$x(e)?.some(e=>!e)))return`Filter lists must not contain empty values. / 筛选列表不能包含空值。`;if($x(e.chargeTypes)?.some(e=>![`pre_paid`,`post_paid`].includes(e)))return`--charge-types accepts pre_paid,post_paid. / --charge-types 仅支持 pre_paid、post_paid。`},async run(e){let{flags:t,settings:n}=e,r={pageNo:t.page??1,pageSize:t.pageSize??20,includeDeleted:t.includeDeleted??!0,statuses:$x(t.statuses),chargeTypes:$x(t.chargeTypes)};if(n.dryRun){A({action:`deploy.capacity.list`,deployed_model:t.deployedModel,query:{page_no:r.pageNo,page_size:r.pageSize,include_deleted:r.includeDeleted,statuses:r.statuses?.join(`,`),charge_types:r.chargeTypes?.join(`,`)}},`json`);return}A(await zt(e.client,t.deployedModel,r),`json`)}}),OS=w({description:{"en-US":`Get a throughput reservation capacity instance`,"zh-CN":`查询吞吐预留容量实例详情`},auth:`apiKey`,flags:{...Jx,...Yx},usageArgs:`--deployed-model <code> --instance-id <id>`,exampleArgs:[`--deployed-model example-model-code --instance-id example-capacity-instance`],notes:[{"en-US":`Read-only; released instances can also be queried. Preserves the API envelope, capacity fields, can_scale/can_renew/can_delete and deleted. Capacities are kTPM; the instance must belong to this ModelCode.`,"zh-CN":`只读查询,已释放实例也可查询。保留 API 响应结构、容量字段、can_scale/can_renew/can_delete 和 deleted。容量单位为 kTPM,实例必须属于指定 ModelCode。`}],validate:Zx,async run(e){let{settings:t,flags:n}=e;if(t.dryRun){A({action:`deploy.capacity.get`,deployed_model:n.deployedModel,instance_id:n.instanceId},`json`);return}A(await st(e.client,n.deployedModel,n.instanceId),`json`)}});const kS={...Jx,...aS,...oS,...cS,billingMethod:{type:`string`,valueHint:`<PRE_PAY|POST_PAY>`,required:!0,choices:[`PRE_PAY`,`POST_PAY`],description:{"en-US":`Capacity instance billing method (case-sensitive)`,"zh-CN":`容量实例付费方式(区分大小写)`}}},AS=w({description:{"en-US":`Purchase an additional capacity instance for a ModelCode`,"zh-CN":`为已有 ModelCode 叠加购买容量实例`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Purchases additional throughput capacity and may enable recurring charges.`,"zh-CN":`该操作将购买额外吞吐容量,可能开启持续续费。`}},flags:kS,usageArgs:`--deployed-model <code> --billing-method <PRE_PAY|POST_PAY> --input-tpm <kTPM> --output-tpm <kTPM> [--duration <days>] [--auto-renewal <true|false>] [--wait]`,exampleArgs:[`--deployed-model example-code --billing-method POST_PAY --input-tpm 10000 --output-tpm 1000 --dry-run`,`--deployed-model example-code --billing-method PRE_PAY --input-tpm 10000 --output-tpm 1000 --duration 30 --auto-renewal false --dry-run`],notes:[...uS,{"en-US":`Keeps the ModelCode, model and performance tier. Only one unreleased postpaid instance is allowed per ModelCode; the server validates purchase eligibility and slot limits.`,"zh-CN":`沿用原 ModelCode、模型和性能档位。同一 ModelCode 只允许一个未释放的后付费实例;购买资格和实例数量限制由服务端校验。`}],validate(e){return(Zx(e)??dS(e)??_r(e,!0))||(e.billingMethod===`POST_PAY`&&Ct(e)?`POST_PAY cannot include prepaid settings. / 后付费不能携带预付费配置。`:gr(e,e.billingMethod===`PRE_PAY`))},async run(e){let{flags:t,settings:n}=e,r=he(t),i={billing_method:t.billingMethod,ptu_capacity:ge(t),...r?{pre_paid_info:r}:{}};if(n.dryRun){A({action:`deploy.capacity.create`,deployed_model:t.deployedModel,body:i,client_request_id:t.requestId??`<generated UUID>`,wait:t.wait},`json`);return}let a=t.requestId??ni(),o=await pS(a,()=>Te(e.client,t.deployedModel,i,{requestId:a}));await mS(e.client,t.deployedModel,o,t,a,!0)}}),jS={...Jx,...Yx,...aS,...oS,...lS,...cS},MS=w({description:{"en-US":`Scale the absolute capacity of one reservation instance`,"zh-CN":`调整单个预留实例的绝对容量`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Changes purchased capacity, may incur charges and can reduce serving capacity to zero.`,"zh-CN":`该操作会变更购买容量、可能产生费用,也可能将服务容量降至零。`}},flags:jS,usageArgs:`--deployed-model <code> --instance-id <id> --input-tpm <kTPM> --output-tpm <kTPM> [--order-type <UPGRADE|DOWNGRADE>] [--wait]`,exampleArgs:[`--deployed-model example-code --instance-id example-instance --input-tpm 20000 --output-tpm 2000 --dry-run`,`--deployed-model example-code --instance-id example-instance --input-tpm 0 --output-tpm 0 --dry-run`],notes:[...uS,{"en-US":`Refreshes can_scale before writing. Omitted prepaid settings remain omitted, so the server can reuse saved information. Postpaid instances cannot receive prepaid settings.`,"zh-CN":`写入前刷新 can_scale。未指定预付费参数时不发送该对象,由服务端复用已保存的信息。后付费实例不能携带预付费配置。`}],validate:e=>Zx(e)??dS(e)??_r(e,!0)??gr(e,!1),async run(e){let{flags:t,settings:r}=e,i=he(t),a={ptu_capacity:ge(t),...t.orderType?{order_type:t.orderType}:{},...i?{pre_paid_info:i}:{}};if(r.dryRun){A({action:`deploy.capacity.scale`,deployed_model:t.deployedModel,instance_id:t.instanceId,body:a,client_request_id:t.requestId??`<generated UUID>`,precheck:`can_scale`,wait:t.wait},`json`);return}let o=await fS(e.client,t.deployedModel,t.instanceId,`scale`);if(![`pre_paid`,`post_paid`].includes(o.charge_type??``))throw new n(`Unknown instance billing type; cannot safely scale. / 实例付费类型不明确,无法安全变配。`,f.USAGE);if(i&&o.charge_type!==`pre_paid`)throw new n(`Prepaid settings require a prepaid instance. / 预付费配置只能用于预付费实例。`,f.USAGE);let s=t.requestId??ni(),c=await pS(s,()=>Kn(e.client,t.deployedModel,t.instanceId,a,{requestId:s}));await mS(e.client,t.deployedModel,c,t,s,!0)}}),NS={...Jx,...Yx,...aS,...oS,...cS,isChange:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Change capacity during renewal (default: false)`,"zh-CN":`续订时同时变更容量(默认:false)`}}},PS=w({description:{"en-US":`Renew a prepaid capacity instance, optionally changing capacity`,"zh-CN":`续订预付费容量实例,可同时变更容量`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Renews a paid capacity instance and may enable automatic recurring renewal.`,"zh-CN":`该操作将付费续订容量实例,可能开启自动持续续费。`}},flags:NS,usageArgs:`--deployed-model <code> --instance-id <id> --duration <days> --auto-renewal <true|false> [--is-change <true|false>] [--input-tpm <kTPM>] [--output-tpm <kTPM>] [--wait]`,exampleArgs:[`--deployed-model example-code --instance-id example-instance --duration 30 --auto-renewal false --dry-run`,`--deployed-model example-code --instance-id example-instance --duration 30 --auto-renewal true --auto-renewal-duration 30 --dry-run`],notes:[...uS,{"en-US":`Prepaid only; refreshes can_renew. Different capacity requires --is-change true; an unchanged capacity may be sent with false. No order_type is accepted by this endpoint.`,"zh-CN":`仅支持预付费,写入前刷新 can_renew。变更容量必须指定 --is-change true;相同配置容量可随 false 发送。本接口不接受 order_type。`}],validate:e=>Zx(e)??dS(e)??_r(e,!1)??gr(e,!0),async run(e){let{flags:t,settings:r}=e,i=t.inputTpm===void 0?void 0:ge(t),a={pre_paid_info:he(t),is_change:t.isChange??!1,...i?{ptu_capacity:i}:{}};if(r.dryRun){A({action:`deploy.capacity.renew`,deployed_model:t.deployedModel,instance_id:t.instanceId,body:a,client_request_id:t.requestId??`<generated UUID>`,precheck:`can_renew/pre_paid/configured_capacity`,wait:t.wait},`json`);return}let o=await fS(e.client,t.deployedModel,t.instanceId,`renew`);if(o.charge_type!==`pre_paid`)throw new n(`Only prepaid instances can be renewed. / 仅预付费实例可以续订。`,f.USAGE);if(i&&!t.isChange&&(i.input_tpm!==o.configured_capacity?.input_tpm||i.output_tpm!==o.configured_capacity?.output_tpm))throw new n(`Different capacity requires --is-change true. / 变更容量必须指定 --is-change true。`,f.USAGE);let s=t.requestId??ni(),c=await pS(s,()=>kn(e.client,t.deployedModel,t.instanceId,a,{requestId:s}));await mS(e.client,t.deployedModel,c,t,s,!0)}}),FS={...Jx,...Yx,...cS,reason:{type:`string`,valueHint:`<text>`,description:{"en-US":`Optional release reason, sent as a query parameter`,"zh-CN":`可选释放原因,以查询参数发送`}}},IS=w({description:{"en-US":`Release a capacity instance without deleting its ModelCode`,"zh-CN":`释放容量实例,保留所属 ModelCode`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Releases serving capacity and may interrupt requests; this cannot be undone by this command. This is not a prepaid unsubscribe/refund action.`,"zh-CN":`该操作将释放服务容量,可能中断请求,不能通过本命令撤销。这不是预付费退订或退款操作。`}},flags:FS,usageArgs:`--deployed-model <code> --instance-id <id> [--reason <text>] [--wait]`,exampleArgs:[`--deployed-model example-code --instance-id example-instance --dry-run`],notes:[...uS,{"en-US":"Active prepaid instances must be unsubscribed via `deploy capacity unsubscribe` (billing console link), even when can_delete=true. Failed prepaid instances may have no associated order; only the server can decide whether direct release is supported. Release is asynchronous; verify deleted=true, not merely STOPPED or zero capacity.","zh-CN":"已生效预付费实例须通过 `deploy capacity unsubscribe` 获取费用中心退订链接完成退订,即使 can_delete=true 也不能直接删除。失败的预付费实例可能尚未关联订单,能否直接释放由服务端裁决。释放是异步操作,须确认 deleted=true,不能只看 STOPPED 或零容量。"}],validate:e=>Zx(e)??dS(e),async run(e){let{flags:t,settings:r}=e;if(r.dryRun){A({action:`deploy.capacity.delete`,deployed_model:t.deployedModel,instance_id:t.instanceId,query:t.reason===void 0?{}:{reason:t.reason},client_request_id:t.requestId??`<generated UUID>`,precheck:`can_delete/prepaid_unsubscribe`,wait:t.wait},`json`);return}let i=await fS(e.client,t.deployedModel,t.instanceId,`delete`);if(i.charge_type===`pre_paid`&&i.status!==`FAILED`)throw new n("Prepaid instances must be unsubscribed in the billing console; DELETE is not a refund. Run `deploy capacity unsubscribe --instance-id <id>` to get the refund page link. / 预付费实例请在费用中心退订,DELETE 不能替代退订退款。运行 `deploy capacity unsubscribe --instance-id <id>` 获取退订页面链接。",f.USAGE);if(![`pre_paid`,`post_paid`].includes(i.charge_type??``))throw new n(`Unknown instance billing type; cannot safely release. / 实例付费类型不明确,无法安全释放。`,f.USAGE);let a=t.requestId??ni(),o=await pS(a,()=>Ne(e.client,t.deployedModel,t.instanceId,{requestId:a,reason:t.reason}));await mS(e.client,t.deployedModel,o,t,a,!0,t.instanceId)}});var LS=w({description:{"en-US":`Build the Aliyun billing console unsubscribe link for a prepaid capacity instance`,"zh-CN":`生成预付费容量实例在阿里云费用中心的退订链接`},auth:`none`,flags:Yx,usageArgs:`--instance-id <id>`,exampleArgs:[`--instance-id example-instance`],notes:[{"en-US":`No API is called and nothing is unsubscribed by this command; it only builds the refund page link. Open the link and finish the unsubscribe flow in the billing console with the account that placed the order.`,"zh-CN":`本命令不调用任何接口,也不会执行退订,只生成费用中心退订页面链接。请用下单账号打开链接,在费用中心完成退订流程。`},{"en-US":"Only prepaid instances are unsubscribed this way; postpaid instances are released with `deploy capacity delete`. The ID is the capacity instance ID (see `deploy capacity list` / `get`), not the ModelCode. Unsubscription may interrupt serving and is irreversible; refund rules are decided by the billing console.","zh-CN":"仅预付费实例通过此方式退订;后付费实例请使用 `deploy capacity delete` 释放。此处为容量实例 ID(见 `deploy capacity list` / `get`),不是 ModelCode。退订可能中断服务且不可撤销,退款规则以费用中心为准。"}],validate:Zx,async run(e){let{settings:t,flags:n}=e,r=qr(n.instanceId);if(t.quiet){k(r);return}A({action:`deploy.capacity.unsubscribe`,instance_id:n.instanceId,refund_url:r},`json`)}}),RS=w({description:{"en-US":`Set the overflow strategy for a throughput reservation ModelCode`,"zh-CN":`设置吞吐预留 ModelCode 的溢出策略`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Enabling overflow incurs pay-as-you-go charges beyond reserved capacity; disabling it rate-limits excess requests.`,"zh-CN":`开启溢出后,预留容量外的流量将产生按量费用;关闭后,超额请求会被限流。`}},flags:{...Jx,strategy:{type:`string`,valueHint:`<enable|disable>`,required:!0,choices:[`enable`,`disable`],description:{"en-US":`Allow pay-as-you-go overflow or restrict requests to reserved capacity`,"zh-CN":`允许按量溢出或将请求限制在预留容量内`}}},usageArgs:`--deployed-model <code> --strategy <enable|disable>`,exampleArgs:[`--deployed-model example-code --strategy enable --dry-run`,`--deployed-model example-code --strategy disable --dry-run`],notes:[{"en-US":`Applies to the whole ModelCode, not one capacity instance. Sends one update then one GET to confirm the strategy. Never retries the update automatically; a read-back failure does not mean the change was not applied.`,"zh-CN":`配置作用于整个 ModelCode,而非单个容量实例。提交一次更新后 GET 回读确认策略。不自动重试更新;回读失败不代表配置未生效。`}],validate:Zx,async run(e){let{settings:t,flags:r}=e;if(t.dryRun){A({action:`deploy.overflow`,deployed_model:r.deployedModel,body:{overflow_strategy:r.strategy}},`json`);return}let i=await dr(e.client,r.deployedModel,r.strategy),a=await pt(e.client,r.deployedModel);if((a.output??a.data)?.overflow_strategy!==r.strategy)throw new n(`Overflow update submitted but not confirmed by read-back; query the deployment before retrying. / 溢出配置已提交,但回读未确认,请先查询部署再决定是否重试。`,f.GENERAL,void 0,{cause:{response:i,deployment:a}});A({...i,deployment:a},`json`)}}),zS=w({description:{"en-US":`Query a throughput reservation capacity operation once`,"zh-CN":`单次查询吞吐预留容量操作`},auth:`apiKey`,flags:Xx,usageArgs:`--deployed-model <code> --operation-id <id>`,exampleArgs:[`--deployed-model example-model-code --operation-id 100001`],notes:[{"en-US":`Preserves the API envelope, including FAILED and its error fields; a successful GET returns exit code 0 regardless of operation status. Use operation wait to wait for success or fail with a non-zero exit. Use the actual returned operation ID; do not construct one.`,"zh-CN":`保留 API 响应结构,包括 FAILED 状态及错误字段;GET 请求成功即返回退出码 0,不以操作状态判断。需要等待成功或失败时非零退出,请使用 operation wait。操作 ID 必须使用实际返回值,不要自行构造。`}],validate:Zx,async run(e){let{settings:t,flags:n}=e;if(t.dryRun){A({action:`deploy.operation.get`,deployed_model:n.deployedModel,operation_id:n.operationId},`json`);return}A(await ct(e.client,n.deployedModel,n.operationId),`json`)}}),BS=w({description:{"en-US":`List models available for deployment`,"zh-CN":`列出可部署的模型`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--catalog-version <v>] [--source <custom|public>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 100)`,"zh-CN":`每页结果数(默认:100)`}},catalogVersion:{type:`string`,valueHint:`<v>`,description:{"en-US":`Catalog version filter (default: v1.0; required for new catalog models)`,"zh-CN":`模型目录版本筛选(默认:v1.0;新目录模型必填)`}},source:{type:`string`,valueHint:`<s>`,description:{"en-US":`Model source filter: custom (fine-tuned) | base (catalog) | public`,"zh-CN":`模型来源筛选:custom(微调模型)| base(模型目录)| 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 Wt(e.client,{pageNo:n.page,pageSize:n.pageSize,version:r,modelSource:i}),o=a.output??a.data,s=o?.models??[],c=o?.total,l=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});A({items:l,total:c,request_id:a.request_id},`json`)}});const VS={deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},capacity:{type:`number`,valueHint:`<n>`,description:{"en-US":`MU target capacity: non-negative integer in plan units; must satisfy base_capacity`,"zh-CN":`MU 目标容量:非负整数,单位为方案单元;须满足 base_capacity 约束`}},...aS,instanceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`PTU capacity instance ID; required when multiple unreleased instances exist`,"zh-CN":`PTU 容量实例 ID;存在多个未释放实例时必填`}},...oS,...cS,...lS};async function HS(e,t){let r=await zt(e,t,{includeDeleted:!1,pageNo:1,pageSize:2}),i=r.output??r.data,a=i?.records;if(!Array.isArray(a)||a.length!==1||i?.items!==1||i.page!==void 0&&i.page!==1||i.pageCount!==void 0&&i.pageCount!==1||a[0]?.deleted===!0||typeof a[0]?.instance_id!=`string`||!a[0].instance_id.trim())throw new n(`Cannot confirm exactly one unreleased capacity instance. Specify --instance-id; multiple instances must never be selected implicitly. / 无法确认恰好一个未释放容量实例,请指定 --instance-id;多个实例不能自动选择。`,f.USAGE);return a[0].instance_id}var US=w({description:{"en-US":`Scale a deployment's capacity`,"zh-CN":`调整部署容量`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Scaling changes purchased capacity and may incur charges or reduce serving capacity.`,"zh-CN":`扩缩容会变更购买的容量,可能产生费用或降低服务容量。`}},usageArgs:`--deployed-model <id> (--capacity <n> | --input-tpm <n> --output-tpm <n>) [--instance-id <id>] [flags]`,flags:VS,exampleArgs:[`--deployed-model dep-... --capacity 8 --dry-run`,`--deployed-model dep-... --instance-id instance-... --input-tpm 20000 --output-tpm 2000 --order-type UPGRADE --dry-run`],notes:[...uS,{"en-US":`PTU input/output values are the selected instance's absolute target capacity in kTPM (1 kTPM = 1000 tokens/minute), not deltas or deployment totals. Both zero is valid and does not release the instance. PTU options cannot be combined with --capacity.`,"zh-CN":`PTU 输入/输出值为选中实例的绝对目标容量,单位 kTPM(1 kTPM = 1000 Token/分钟),不是增量或部署总容量。允许同时为零,但不等于释放实例。PTU 参数不能与 --capacity 混用。`},{"en-US":`Without --instance-id, execution must confirm exactly one unreleased instance and recheck can_scale. Dry-run does not resolve an instance or validate its billing type. Pass --yes only after confirming the costs and target.`,"zh-CN":`省略 --instance-id 时,执行前必须确认恰好一个未释放实例并复查 can_scale。dry-run 不解析实例或验证其付费方式;仅在确认费用及目标后传入 --yes 执行。`}],validate(e){return(Zx(e)??dS(e))||(e.capacity===void 0?_r(e,!0)??gr(e,!1):!Number.isSafeInteger(e.capacity)||e.capacity<0?`--capacity must be a non-negative safe integer. / --capacity 必须是非负安全整数。`:e.inputTpm!==void 0||e.outputTpm!==void 0||e.instanceId!==void 0||e.orderType!==void 0||Ct(e)||e.wait||e.requestId!==void 0||e.interval!==void 0||e.pollTimeout!==void 0?`PTU options cannot be used with --capacity. / PTU 参数不能与 --capacity 混用。`:void 0)},async run(e){let{settings:t,flags:r}=e,i=r.deployedModel,a=r.capacity===void 0,o=a?{ptu_capacity:ge(r),...r.instanceId===void 0?{}:{instance_id:r.instanceId},...r.orderType===void 0?{}:{order_type:r.orderType},...Ct(r)?{pre_paid_info:he(r)}:{}}:{capacity:r.capacity};if(t.dryRun){A({action:`deploy.scale`,deployed_model:i,body:o,...a&&r.instanceId===void 0?{instance_resolution:`Execution must resolve exactly one unreleased instance or require --instance-id. / 执行时须确认唯一未释放实例,否则必须指定 --instance-id。`}:{}},`json`);return}if(a){let t=r.instanceId??await HS(e.client,i),a=await fS(e.client,i,t,`scale`);if(![`pre_paid`,`post_paid`].includes(a.charge_type??``))throw new n(`Unknown instance billing type; cannot safely scale. / 实例付费类型不明确,无法安全变配。`,f.USAGE);if(a.charge_type===`post_paid`&&Ct(r))throw new n(`Postpaid instances do not accept prepaid options. / 后付费实例不接受预付费参数。`,f.USAGE);o.instance_id=t;let s=r.requestId??ni(),c=await pS(s,()=>qn(e.client,i,o,void 0,s));await mS(e.client,i,c,r,s);return}let s=await qn(e.client,i,o);t.quiet?k(i):A(s,`json`)}}),WS=w({description:{"en-US":`Update a deployment's rate limits (rpm_limit / tpm_limit)`,"zh-CN":`更新部署的限流配置(rpm_limit / tpm_limit)`},auth:`apiKey`,usageArgs:`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},rpmLimit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Requests per minute`,"zh-CN":`每分钟请求数`}},tpmLimit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Tokens per minute`,"zh-CN":`每分钟 Token 数`}}},exampleArgs:[`--deployed-model dep-... --rpm-limit 1000`,`--deployed-model dep-... --rpm-limit 1000 --tpm-limit 200000`],notes:[{"en-US":`At least one of --rpm-limit / --tpm-limit must be provided.`,"zh-CN":`--rpm-limit / --tpm-limit 至少需要提供一个。`}],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 ur(e.client,r,i);t.quiet?k(r):A(a,`json`)}}),GS=w({description:{"en-US":`Delete a model deployment (PTU must be STOPPED with all capacity released)`,"zh-CN":`删除模型部署(PTU 须为 STOPPED 且已释放全部容量)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified model deployment and cannot be undone.`,"zh-CN":`该操作会永久删除指定的模型部署,且无法撤销。`}},usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},skipPrecheck:{type:`switch`,description:{"en-US":`Skip local checks only; the service still validates deletion prerequisites`,"zh-CN":`仅跳过本地检查;服务端仍验证删除前提条件`}}},exampleArgs:[`--deployed-model dep-... --dry-run`,{"en-US":`--deployed-model dep-... --yes # Execute only after confirming deletion`,"zh-CN":`--deployed-model dep-... --yes # 仅在确认删除后执行`}],notes:[{"en-US":`PTU deletion requires STOPPED, all capacity instances released, and no processing or queued capacity operations. Pausing or scaling to zero does not release an instance; prepaid capacity may require unsubscription.`,"zh-CN":`PTU 删除要求状态为 STOPPED、全部容量实例已释放,且不存在执行中或排队的容量操作。暂停或缩容到零不等于释放实例;预付费容量可能需要先退订。`},{"en-US":`Local checks inspect the deployment, unreleased instances and any returned operation_id. There is no public queued-operation list API, so these checks cannot confirm all operations are finished; the service makes the final decision. --skip-precheck only omits local checks, never service validation or resource release requirements.`,"zh-CN":`本地检查部署、未释放实例及返回的 operation_id。没有公开的排队操作列表接口,因此无法在本地确认所有操作均已完成,最终以服务端裁决为准。--skip-precheck 仅省略本地检查,不绕过服务端验证或资源释放要求。`}],async run(e){let{settings:t,flags:r}=e,i=r.deployedModel;if(t.dryRun){A({action:`deploy.delete`,deployed_model:i},`json`);return}if(!r.skipPrecheck){let t=await pt(e.client,i),r=t.output??t.data,a=(r?.status??``).toUpperCase();if(r?.plan===`ptu`||r?.plan===`ptu_v2`||r?.ptu_capacity!==void 0||r?.ptu_service_tier!==void 0){if(a!==`STOPPED`)throw new n(`PTU deployment ${i} must be STOPPED before deletion (current: ${a||`unknown`}). Release all capacity instances first; pausing is not release. / PTU 部署 ${i} 删除前必须为 STOPPED(当前:${a||`未知`});请先释放全部容量实例,暂停不等于释放。`,f.USAGE);let t=await zt(e.client,i,{includeDeleted:!1,pageNo:1,pageSize:1}),o=t.output??t.data;if(Array.isArray(o?.records)&&o.records.length>0||typeof o?.items==`number`&&o.items>0||typeof o?.total==`number`&&o.total>0)throw new n(`Release all capacity instances before deleting the PTU deployment; STOPPED or zero capacity does not mean released. / 删除 PTU 部署前请先释放全部容量实例;STOPPED 或零容量不等于已释放。`,f.USAGE);if(!Array.isArray(o?.records)||o.records.length!==0||o.items!==0||o.total!==void 0&&o.total!==0||o.page!==void 0&&o.page!==1||o.pageCount!==void 0&&o.pageCount!==0&&o.pageCount!==1)throw new n(`Cannot confirm all capacity instances are released from the list response; deletion was not submitted. / 无法从列表响应确认全部容量实例已释放;未提交删除请求。`,f.USAGE);if(r?.operation_id){let t=await ct(e.client,i,r.operation_id),a=t.output??t.data;if(a?.operation_status===`PROCESSING`)throw new n(`A capacity operation is processing or queued. Wait for it to finish before deleting the deployment. / 存在执行中或排队的容量操作,请等待其结束后再删除部署。`,f.USAGE);if(a?.operation_status!==`SUCCEEDED`&&a?.operation_status!==`FAILED`)throw new n(`Cannot confirm the returned capacity operation has finished; deletion was not submitted. / 无法确认返回的容量操作已结束;未提交删除请求。`,f.USAGE)}}else if(a!==`STOPPED`&&a!==`FAILED`)throw new n(`Deployment ${i} must be STOPPED or FAILED before deletion (current: ${a||`unknown`}). / 部署 ${i} 删除前必须为 STOPPED 或 FAILED(当前:${a||`未知`})。`,f.USAGE,"Check the deployment status with `deploy get` before deletion. / 删除前请使用 `deploy get` 检查部署状态。")}let a=await Le(e.client,i);t.quiet?k(i):A(a,`json`)}}),KS=w({description:{"en-US":`Pause a running model deployment (stops billing for mu/ptu)`,"zh-CN":`暂停运行中的模型部署(mu/ptu 方案将停止计费)`},auth:`console`,usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},skipPrecheck:{type:`switch`,description:{"en-US":`Skip the local RUNNING/PENDING status precheck`,"zh-CN":`跳过本地 RUNNING/PENDING 状态预检查`}}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --skip-precheck`,`--deployed-model dep-... --dry-run`],notes:[{"en-US":"While paused, billing ceases for mu/ptu plans. Use `deploy resume` to bring it back online or `deploy delete` to remove.","zh-CN":"暂停期间,mu/ptu 方案将停止计费。使用 `deploy resume` 恢复服务,或使用 `deploy delete` 删除部署。"},{"en-US":`Precheck verifies status is RUNNING/PENDING before issuing the pause; pass --skip-precheck to bypass.`,"zh-CN":`发起暂停前会预检查部署状态是否为 RUNNING/PENDING;可传入 --skip-precheck 跳过检查。`}],async run(e){let{settings:t,flags:r}=e,i=r.deployedModel;if(t.dryRun){A({action:`deploy.pause`,deployed_model:i},`json`);return}if(!r.skipPrecheck)try{let t=await qt(e.client),r=tt(t,i);if(r){let e=(r.status??``).toUpperCase();if(e&&e!==`RUNNING`&&e!==`PENDING`)throw new n(`Deployment ${i} is ${e}. Only RUNNING / PENDING deployments can be paused. Pass --skip-precheck to attempt the pause anyway.`,f.USAGE)}}catch(e){if(e instanceof n)throw e}let a=await tr(e.client,i);t.quiet?k(i):A({deployed_model:i,action:`pause`,...a},`json`)}}),qS=w({description:{"en-US":`Resume a paused model deployment (brings service back online)`,"zh-CN":`恢复已暂停的模型部署(使服务重新上线)`},auth:`console`,usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},skipPrecheck:{type:`switch`,description:{"en-US":`Skip the local STOPPED status precheck`,"zh-CN":`跳过本地 STOPPED 状态预检查`}}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --skip-precheck`,`--deployed-model dep-... --dry-run`],notes:[{"en-US":`Precheck verifies status is STOPPED before issuing the resume; pass --skip-precheck to bypass.`,"zh-CN":`发起恢复前会预检查部署状态是否为 STOPPED;可传入 --skip-precheck 跳过检查。`},{"en-US":`For mu/ptu plans, billing resumes once the service is back online.`,"zh-CN":`对于 mu/ptu 方案,服务重新上线后将恢复计费。`}],async run(e){let{settings:t,flags:r}=e,i=r.deployedModel;if(t.dryRun){A({action:`deploy.resume`,deployed_model:i},`json`);return}if(!r.skipPrecheck)try{let t=await qt(e.client),r=tt(t,i);if(r){let e=(r.status??``).toUpperCase();if(e&&e!==`STOPPED`)throw new n(`Deployment ${i} is ${e}. Only STOPPED deployments can be resumed. Pass --skip-precheck to attempt the resume anyway.`,f.USAGE)}}catch(e){if(e instanceof n)throw e}let a=await er(e.client,i);t.quiet?k(i):A({deployed_model:i,action:`resume`,...a},`json`)}});const JS={callerUacAccountId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Caller UAC account ID`,"zh-CN":`调用方 UAC 账号 ID`}},namespaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Product namespace ID (Token Plan default: namespace-1)`,"zh-CN":`产品 Namespace ID(Token Plan 默认:namespace-1)`}}},YS={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`,"zh-CN":`Workspace ID(环境变量:BAILIAN_WORKSPACE_ID,配置项:workspace_id)`}}},XS={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function ZS(e){for(let[t,n]of Object.entries(b))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function QS(e){let t=ZS(e);return XS[t]??XS.cn}function $S(e,t,r){let i=t.workspaceId||e.workspaceId;if(!i)throw new n(`Missing workspace ID.
2838
- Set via: --workspace-id flag, env: BAILIAN_WORKSPACE_ID, or config: ${r} config set workspace_id <id>`,f.USAGE);return i}function eC(e,t){t.callerUacAccountId&&(e.CallerUacAccountId=t.callerUacAccountId),t.namespaceId&&(e.NamespaceId=t.namespaceId)}function tC(e,t,n){let r=ue(n),i=QS(e);return{host:i,endpoint:`https://${i}${t}${r?`?${r}`:``}`,queryString:r,queryParams:n}}async function nC(e){let{client:t,baseUrl:n,action:r,path:i,method:a,queryParams:o}=e,{host:s}=tC(n,i,o);return t.openApiQueryJson({host:s,path:i,action:r,version:`2026-02-10`,method:a,queryParams:o})}const rC=`/tokenplan/subscription/seat-detail`,iC={pageNo:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size (default: 10)`,"zh-CN":`每页数量(默认:10)`}},...JS,status:{type:`array`,valueHint:`<status>`,description:{"en-US":`Seat status filter (repeatable): CREATING, NORMAL, LIMIT, RELEASE, STOP, REFUNDED`,"zh-CN":`席位状态筛选(可重复):CREATING、NORMAL、LIMIT、RELEASE、STOP、REFUNDED`}},statusListStr:{type:`string`,valueHint:`<json>`,description:{"en-US":`StatusList as JSON string, e.g. '["NORMAL"]'`,"zh-CN":`JSON 字符串格式的 StatusList,例如 '["NORMAL"]'`}},seatId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by seat ID`,"zh-CN":`按席位 ID 筛选`}},seatType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Seat tier: standard, pro, or max`,"zh-CN":`席位档位:standard、pro 或 max`}},queryAssigned:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Filter by assignment: true=assigned, false=unassigned`,"zh-CN":`按分配状态筛选:true=已分配,false=未分配`}}};var aC=w({description:{"en-US":`List Token Plan subscription seat details`,"zh-CN":`列出 Token Plan 订阅席位详情`},auth:`openapi`,usageArgs:`[flags]`,flags:iC,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=oC(n);if(t.dryRun){let{endpoint:t,queryParams:n}=tC(e.client.baseUrl,rC,i);A({endpoint:t,query:n},r);return}let a=await nC({client:e.client,baseUrl:e.client.baseUrl,action:`GetSubscriptionSeatDetails`,path:rC,method:`GET`,queryParams:i}),o=a.Data?.Items??[];t.quiet||r===`text`?sC(o,a.Data?.Total,a.Data?.PageNo,a.Data?.PageSize):A(a,r)}});function oC(e){let t={};if(e.pageNo!==void 0&&(t.PageNo=String(e.pageNo)),e.pageSize!==void 0&&(t.PageSize=String(e.pageSize)),eC(t,e),e.statusListStr&&(t.StatusListStr=e.statusListStr),e.status&&e.status.length>0&&(t.StatusList=e.status),e.seatId&&(t.SeatId=e.seatId),e.seatType&&(t.SeatType=e.seatType),typeof e.queryAssigned==`string`&&e.queryAssigned.length>0){let r=e.queryAssigned.toLowerCase();if(r!==`true`&&r!==`false`)throw new n(`--query-assigned must be 'true' or 'false'.`,f.USAGE);t.QueryAssigned=r}return t}function sC(e,t,n,r){if(e.length===0){k(`No seats found.`);return}let i=[j(`SeatId`,18),j(`Type`,10),j(`Status`,10),j(`Assigned`,12),j(`Account`,20)].join(` `);k(i),k(`-`.repeat(i.length));for(let t of e){let e=[j(t.SeatId??`-`,18),j(t.SpecType??`-`,10),j(t.Status??`-`,10),j(t.AssignedStatus??`-`,12),j(t.AccountName??t.AccountId??`-`,20)].join(` `);k(e)}t!==void 0&&(k(``),k(`Total: ${t}${n===void 0?``:` | Page: ${n}`}${r===void 0?``:` | PageSize: ${r}`}`))}const cC=`/tokenplan/api-keys`,lC={accountId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Target member account ID`,"zh-CN":`目标成员账号 ID`},required:!0},...YS,description:{type:`string`,valueHint:`<text>`,description:{"en-US":`API key description`,"zh-CN":`API Key 描述`}},...JS};var uC=w({description:{"en-US":`Create a Token Plan API key for a seat`,"zh-CN":`为席位创建 Token Plan API Key`},auth:`openapi`,usageArgs:`--account-id <id> --workspace-id <id> [flags]`,flags:lC,exampleArgs:[`--account-id acc_123 --workspace-id ws_456`,{"en-US":`--account-id acc_123 --workspace-id ws_456 --description 'Dev key'`,"zh-CN":`--account-id acc_123 --workspace-id ws_456 --description '开发密钥'`}],async run(e){let{identity:t,settings:n,flags:r}=e,i=T(n.output),a=$S(n,r,t.binName),o=dC(r,{accountId:r.accountId,workspaceId:a});if(n.dryRun){let{endpoint:t,queryParams:n}=tC(e.client.baseUrl,cC,o);A({endpoint:t,query:n},i);return}let s=await nC({client:e.client,baseUrl:e.client.baseUrl,action:`CreateTokenPlanKey`,path:cC,method:`POST`,queryParams:o});n.quiet||i===`text`?fC(s):A(s,i)}});function dC(e,t){let n={};return n.AccountId=t.accountId,n.WorkspaceId=t.workspaceId,e.description&&(n.Description=e.description),eC(n,e),n}function fC(e){let t=e.Data;if(!t){k(`API key created.`);return}k(`${j(`ApiKeyId`,14)} ${t.ApiKeyId??`-`}`),k(`${j(`MaskedApiKey`,14)} ${t.MaskedApiKey??`-`}`),t.Description&&k(`${j(`Description`,14)} ${t.Description}`),t.PlainApiKey&&(k(``),k(`PlainApiKey (shown once): ${t.PlainApiKey}`))}const pC=`/tokenplan/subscription/seat-assignments`,mC={...YS,seatType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Seat tier: standard, pro, or max`,"zh-CN":`席位档位:standard、pro 或 max`},required:!0},accountId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Target member account ID (repeatable)`,"zh-CN":`目标成员账号 ID(可重复)`}},...JS,locale:{type:`string`,valueHint:`<locale>`,description:{"en-US":`Language: zh-CN or en-US`,"zh-CN":`语言:zh-CN 或 en-US`}}};var hC=w({description:{"en-US":`Batch assign Token Plan seats to members`,"zh-CN":`批量向成员分配 Token Plan 席位`},auth:`openapi`,usageArgs:`--workspace-id <id> --seat-type <type> --account-id <id> [flags]`,flags:mC,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=gC(r,$S(n,r,t.binName));if(n.dryRun){let{endpoint:t,queryParams:n}=tC(e.client.baseUrl,pC,a);A({endpoint:t,query:n},i);return}let o=await nC({client:e.client,baseUrl:e.client.baseUrl,action:`BatchAssignSeats`,path:pC,method:`POST`,queryParams:a});n.quiet||i===`text`?k(`Seats assigned successfully.`):A(o,i)}});function gC(e,t){let n={};return n.WorkspaceId=t,e.seatType&&(n.SeatType=e.seatType),eC(n,e),e.locale&&(n.Locale=e.locale),e.accountId&&e.accountId.length>0&&(n.AccountIds=e.accountId),n}const _C=`/tokenplan/organization/member-additions`,vC={accountName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Member display name`,"zh-CN":`成员显示名称`},required:!0},orgId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Organization ID`,"zh-CN":`组织 ID`},required:!0},orgRoleCode:{type:`string`,valueHint:`<code>`,description:{"en-US":`Organization role: ORG_ADMIN or ORG_MEMBER (default: ORG_MEMBER)`,"zh-CN":`组织角色:ORG_ADMIN 或 ORG_MEMBER(默认:ORG_MEMBER)`}},specType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Seat tier to assign on creation: standard, pro, or max`,"zh-CN":`创建时分配的席位档位:standard、pro 或 max`}},...JS};var yC=w({description:{"en-US":`Add a member to a Token Plan organization`,"zh-CN":`向 Token Plan 组织添加成员`},auth:`openapi`,usageArgs:`--account-name <name> --org-id <id> [flags]`,flags:vC,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=bC(n);if(t.dryRun){let{endpoint:t,queryParams:n}=tC(e.client.baseUrl,_C,i);A({endpoint:t,query:n},r);return}let a=await nC({client:e.client,baseUrl:e.client.baseUrl,action:`AddOrganizationMember`,path:_C,method:`POST`,queryParams:i});t.quiet||r===`text`?xC(a):A(a,r)}});function bC(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),eC(t,e),t}function xC(e){let t=e.Data;if(!t){k(`Member added.`);return}k(`${j(`AccountId`,14)} ${t.AccountId??`-`}`),k(`${j(`SeatAssigned`,14)} ${String(t.SeatAssigned??`-`)}`)}const SC=`zeldaEasy.broadscope-bailian.token-plan.detail`,CC=`zeldaEasy.bailian-commerce.tokenPlan.queryTokenPlanEquityInfo`;function wC(e,t){let n=lr(e)[t];return Array.isArray(n)?n:[]}function TC(e,t){let n=[];for(let r of e){if(r.hasResourcePack!==!0)continue;let e=r.planCodes??[],i=t.find(t=>t.equityType&&e.includes(t.equityType)),a=i?.equityType??e[0]??``,o={planCode:a,title:r.title??a,type:r.type??``,status:i?`issued`:`issuing`,quotaUnit:r.quotaUnit??r.priceInfo?.unit??``};if(!i){n.push(o);continue}i.instanceId&&(o.instanceId=i.instanceId);let s=Ng(i.totalQuota);s!==void 0&&(o.totalQuota=s);let c=Ng(i.availableQuota);c!==void 0&&(o.availableQuota=c),s!==void 0&&c!==void 0&&(o.usedQuota=Math.max(s-c,0),s>0&&(o.usedPercent=Math.round(o.usedQuota/s*1e3)/10));let l=Ng(i.instanceStartTime);l!==void 0&&(o.instanceStartTime=l);let u=Ng(i.instanceEndTime);u!==void 0&&(o.instanceEndTime=u),n.push(o)}return n}function EC(e){let t={label:`${e.title} (${e.planCode})`,emptyMessage:e.status===`issuing`?`Quota is being issued; issuance can take up to 5 minutes.`:`No positive quota total reported; check the Bailian Token Plan console.`};if(e.status===`issuing`)return t;if(e.totalQuota!==void 0&&e.usedQuota!==void 0){let n=e.quotaUnit?` ${e.quotaUnit}`:``;t.detail=`Used: ${H(e.usedQuota)} / ${H(e.totalQuota)}${n}`,e.totalQuota>0&&(t.percentage=e.usedQuota/e.totalQuota)}return e.instanceEndTime!==void 0&&(t.resetTime=e.instanceEndTime),t}var DC=w({description:{"en-US":`Show Token Plan harness entitlement quota usage`,"zh-CN":`查看 Token Plan harness 权益额度用量`},auth:`console`,usageArgs:`[flags]`,flags:{type:{type:`string`,valueHint:`<type>`,choices:[`official_tool`,`infrastructure`],description:{"en-US":`Filter harness list by type: official_tool, infrastructure`,"zh-CN":`按类型筛选 harness 列表:official_tool、infrastructure`}}},exampleArgs:[``,`--type official_tool`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.type?{type:n.type}:{},a={queryTokenPlanEquityInfoRequest:{requestId:ni()}};if(t.dryRun){A({requests:[{api:SC,data:i},{api:CC,data:a}]},r);return}let[o,s]=await Promise.all([e.client.console(SC,i),e.client.console(CC,a)]),c=TC(wC(o,`items`),wC(s,`tokenPlanEquityInfos`));if(r===`json`){A({generatedAt:Date.now(),items:c},r);return}if(c.length===0){process.stdout.write(`No harness with entitlement quota found.
2839
- `);return}Ig(`Token Plan Harness Quota`,c.map(EC),Date.now())}});function OC(e){return`version: "1"
2835
+ `);return}throw e}finally{process.off(`SIGINT`,l)}}});async function vS(e){return await Ze(oe(e))}const yS={baseModel:{type:`string`,valueHint:`<m>`,description:{"en-US":`List training types supported by this base model.`,"zh-CN":`列出该基础模型支持的训练类型。`}},trainingType:{type:`string`,valueHint:`<t>`,description:{"en-US":`List models supporting this training type: ${ne.join(` | `)}.`,"zh-CN":`列出支持该训练类型的模型:${ne.join(` | `)}。`}}};var bS=w({description:{"en-US":`Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it)`,"zh-CN":`查询微调训练能力:按模型查询其支持的训练类型,或按训练类型查询支持它的模型`},auth:`none`,usageArgs:`--base-model <m> | --training-type <t>`,flags:yS,exampleArgs:[`--base-model qwen3-8b`,`--training-type sft-lora`,`--training-type cpt --output json`,`--training-type sft --quiet`],notes:[{"en-US":`Exactly one of --base-model / --training-type is required.`,"zh-CN":`--base-model 和 --training-type 必须且只能指定一个。`},{"en-US":"Training-type values use the `<method>` / `<method>-lora` convention: sft | sft-lora | dpo | dpo-lora | cpt. (cpt has no -lora variant server-side.)","zh-CN":"训练类型遵循 `<method>` / `<method>-lora` 命名约定:sft | sft-lora | dpo | dpo-lora | cpt。(服务端没有 cpt-lora 变体。)"},{"en-US":`Queries listFoundationModels, a public API — no console login needed.`,"zh-CN":`查询公开 API listFoundationModels,无需登录控制台。`}],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 qe(t,r);if(!e){A({model:r,error:`No foundation model found matching "${r}".`},`json`);return}let n=Jt(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||!Pt(i))throw new C(`--training-type "${i}" is not supported. Valid: ${ne.join(`, `)}.`);let{method:a,variant:o}=lr(i),s=(await vS(t)).filter(e=>cn(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 xS={baseModel:{type:`string`,valueHint:`<model>`,description:{"en-US":`Base model to fine-tune (e.g. qwen3-8b; not the output model name)`,"zh-CN":`待微调的基座模型(例如 qwen3-8b;不是输出模型名称)`},required:!0},datasets:{type:`string`,valueHint:`<ids>`,description:{"en-US":`Training dataset file IDs, comma-separated (required)`,"zh-CN":`训练数据集文件 ID,多个以逗号分隔(必填)`},required:!0},trainingType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Training type: sft | dpo | cpt (default: sft)`,"zh-CN":`训练类型:sft | dpo | cpt(默认:sft)`}},nEpochs:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of training epochs (default: 3)`,"zh-CN":`训练轮数(默认:3)`}}},SS=[`sft`,`dpo`,`cpt`];var CS=w({description:{"en-US":`Estimate the training cost for a fine-tune job (token billing)`,"zh-CN":`估算微调任务的训练费用(按 Token 计费)`},auth:`console`,usageArgs:`--base-model <model> --datasets <ids> [--training-type <type>] [--n-epochs <n>]`,flags:xS,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:[{"en-US":`Estimate only — the server computes token usage from the datasets; final cost is subject to the bill.`,"zh-CN":`该结果仅为估算值——服务端根据数据集计算 Token 用量,最终费用以账单为准。`},{"en-US":`Covers token billing for sft / dpo / cpt. Training-unit (MTU) billing is not supported by this command.`,"zh-CN":`支持估算 sft / dpo / cpt 的 Token 计费;此命令不支持训练单元(MTU)计费估算。`},{"en-US":`Hyper-parameters other than --n-epochs are fixed at representative defaults for estimation.`,"zh-CN":`除 --n-epochs 外,其他超参数会使用具有代表性的固定默认值进行估算。`}],async run(e){let{settings:t,flags:r}=e,i=r.baseModel,a=r.datasets.split(`,`).map(e=>e.trim()).filter(Boolean),o=(r.trainingType??`sft`).toLowerCase(),s=r.nEpochs??3;if(!SS.includes(o))throw new n(`Unsupported training type "${o}". Supported: ${SS.join(`, `)}.`,f.USAGE);if(a.length===0)throw new n(`--datasets must contain at least one file ID.`,f.USAGE);if(t.dryRun){A({action:`finetune.price`,model:i,datasets:a,trainingType:o,nEpochs:s},`json`);return}let c=await et(e.client,i),l=Number(c.price);if(!Number.isFinite(l))throw new n(`No training price found for model "${i}".`,f.GENERAL,void 0,{rawResponse:JSON.stringify(c)});let u=o===`cpt`?await He(e.client,i,a.join(`,`),s):await Ue(e.client,a,{nEpochs:s,batchSize:16,maxLength:8192}),d=u.estimatedDatasetConsumedTokensMinPerEpoch??0,p=u.estimatedDatasetConsumedTokensMaxPerEpoch??0,m=u.estimatedMixedConsumedTokensMinPerEpoch??0,h=u.estimatedMixedConsumedTokensMaxPerEpoch??0,g=(d+m)*s,_=(p+h)*s,v=g/1e3*l,y=_/1e3*l;A({model:i,training_type:o,n_epochs:s,unit_price:l,price_unit:c.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`)}}),wS=w({description:{"en-US":`List quantizable models and their compression templates`,"zh-CN":`列出可量化模型及其压缩模板`},auth:`apiKey`,usageArgs:`[--model <model>]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by custom model ID or base model name`,"zh-CN":`按自定义模型 ID 或基础模型名称筛选`}}},exampleArgs:[``,`--model qwen3.5-flash-2026-02-23-ft-xxx`],notes:[{"en-US":`Only supported full-parameter fine-tuned models are returned. LoRA and already-quantized models are excluded.`,"zh-CN":`仅返回支持压缩的全参调优模型;LoRA 模型和已量化模型不会返回。`},{"en-US":`Template IDs live in output.custom_models[].templates[].template_id. output.base_models only lists quantizable base model names and carries no templates, so an empty custom_models array means no template ID is available yet.`,"zh-CN":`模板 ID 位于 output.custom_models[].templates[].template_id;output.base_models 只列出可量化的基础模型名称,不含模板,因此 custom_models 为空数组时说明当前还拿不到任何模板 ID。`},{"en-US":`An empty templates[].hyper_parameters array means that template exposes no tunable hyper-parameters; omit --hparam when creating the compression job.`,"zh-CN":`templates[].hyper_parameters 为空数组表示该模板没有可调超参,创建压缩任务时不要传 --hparam。`},{"en-US":"template_name and description are localized server-side from the CLI language setting (default en-US), sent as the lang query parameter. Run `config set --key language --value zh-CN` to get Chinese text.","zh-CN":"template_name 和 description 由服务端按 CLI 的 language 设置本地化(默认 en-US,作为 lang 查询参数下发);需要中文执行 `config set --key language --value zh-CN`。"}],async run(e){let t=e.flags.model||void 0,n=e.localize({"en-US":`en-US`,"zh-CN":`zh-CN`});if(e.settings.dryRun){A({action:`finetune.compress.templates`,model:t,lang:n},`json`);return}let r=await Vt(e.client,{model:t,lang:n});A(r,`json`)}});const TS={jobId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Compression job ID (required)`,"zh-CN":`压缩任务 ID(必填)`},required:!0}},ES=/* @__PURE__ */ new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function DS(e){let t={};for(let r of e??[]){let e=r.indexOf(`=`);if(e<=0)throw new n(`--hparam values must use KEY=VALUE format. / --hparam 必须使用 KEY=VALUE 格式。`,f.USAGE);let i=r.slice(0,e).trim();if(!i)throw new n(`--hparam requires a non-empty key. / --hparam 的键不能为空。`,f.USAGE);t[i]=r.slice(e+1)}return t}function OS(e){if(!e)return;let t=[...new Set(e.split(`,`).map(e=>e.trim()).filter(Boolean))];return t.length?t:void 0}function kS(e,t,r){return new n(r||`Compression job ${e} ended in status ${t}. / 压缩任务 ${e} 已以 ${t} 状态结束。`,f.GENERAL)}function AS(e,t){return new Promise((n,r)=>{if(t.aborted){r(/* @__PURE__ */ Error(`aborted`));return}let i=()=>{clearTimeout(a),r(/* @__PURE__ */ Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var jS=w({description:{"en-US":`Create a model compression job`,"zh-CN":`创建模型压缩任务`},auth:`apiKey`,usageArgs:`--model <model> --template-id <id> [flags]`,flags:{model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Source custom model ID (required)`,"zh-CN":`源自定义模型 ID(必填)`},required:!0},templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Compression template ID (required)`,"zh-CN":`压缩模板 ID(必填)`},required:!0},jobName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Unique job name (max 50 characters)`,"zh-CN":`唯一任务名称(最多 50 字符)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Job description (max 200 characters)`,"zh-CN":`任务描述(最多 200 字符)`}},hparam:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Hyper-parameter override; repeat for multiple values`,"zh-CN":`超参数覆盖;可重复传入多个值`}},calibrationFiles:{type:`string`,valueHint:`<file-id,...>`,description:{"en-US":`Comma-separated calibration dataset file IDs`,"zh-CN":`逗号分隔的校准数据集文件 ID`}},suffix:{type:`string`,valueHint:`<suffix>`,description:{"en-US":`Output model suffix (1–8 lowercase letters or digits)`,"zh-CN":`产出模型后缀(1–8 个小写字母或数字)`}}},validate(e){if(e.jobName!==void 0&&e.jobName.length>50)return`--job-name must be at most 50 characters. / --job-name 最多 50 个字符。`;if(e.description!==void 0&&e.description.length>200)return`--description must be at most 200 characters. / --description 最多 200 个字符。`;if(e.suffix!==void 0&&!/^[a-z0-9]{1,8}$/.test(e.suffix))return`--suffix must contain 1–8 lowercase letters or digits. / --suffix 必须为 1–8 个小写字母或数字。`},exampleArgs:[`--model qwen3.5-flash-2026-02-23-ft-xxx --template-id quant-flash-nvfp4-mlp-nomtp`,`--model qwen3.5-flash-2026-02-23-ft-xxx --template-id quant-flash-nvfp4-mlp-nomtp --suffix test --hparam calib_input=true`],notes:[{"en-US":"Run `finetune compress templates` first to get a compatible template ID.","zh-CN":"请先运行 `finetune compress templates` 获取兼容的模板 ID。"},{"en-US":`Model compression APIs are currently available only in the Beijing region.`,"zh-CN":`模型压缩 API 当前仅在北京 Region 开放。`}],async run(e){let t=DS(e.flags.hparam),n=OS(e.flags.calibrationFiles),r={model:e.flags.model,template_id:e.flags.templateId,...e.flags.jobName?{job_name:e.flags.jobName}:{},...e.flags.description?{job_description:e.flags.description}:{},...Object.keys(t).length?{hyper_parameters:t}:{},...n?{custom_calibration_file_ids:n}:{},...e.flags.suffix?{output_model_suffix:e.flags.suffix}:{}};if(e.settings.dryRun){A({action:`finetune.compress.create`,request:r},`json`);return}let i=await Ee(e.client,r);e.settings.quiet?k(i.output?.job_id??``):A(i,`json`)}}),MS=w({description:{"en-US":`List model compression jobs`,"zh-CN":`列出模型压缩任务`},auth:`apiKey`,usageArgs:`[filters] [--page <n>] [--page-size <n>]`,flags:{status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter by job status`,"zh-CN":`按任务状态筛选`}},model:{type:`string`,valueHint:`<model>`,description:{"en-US":`Filter by source model ID`,"zh-CN":`按源模型 ID 筛选`}},templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by template ID`,"zh-CN":`按模板 ID 筛选`}},quantSpec:{type:`string`,valueHint:`<spec>`,description:{"en-US":`Filter by quantization specification`,"zh-CN":`按量化规格筛选`}},quantMethod:{type:`string`,valueHint:`<method>`,description:{"en-US":`Filter by quantization method`,"zh-CN":`按量化算法筛选`}},startTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Filter jobs starting no earlier than this time`,"zh-CN":`筛选开始时间不早于该时间的任务`}},endTime:{type:`string`,valueHint:`<time>`,description:{"en-US":`Filter jobs ending no later than this time`,"zh-CN":`筛选结束时间不晚于该时间的任务`}},search:{type:`string`,valueHint:`<keyword>`,description:{"en-US":`Search job ID or name`,"zh-CN":`搜索任务 ID 或名称`}},searchField:{type:`string`,valueHint:`<field>`,choices:[`job_id`,`job_name`],description:{"en-US":`Limit --search to job_id or job_name`,"zh-CN":`将 --search 限制为 job_id 或 job_name`}},sortOrder:{type:`string`,valueHint:`<order>`,choices:[`asc`,`desc`],description:{"en-US":`Sort order by create_time (default: desc)`,"zh-CN":`按 create_time 排序(默认:desc)`}},page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max: 100)`,"zh-CN":`每页数量(默认:10,最多:100)`}}},validate(e){if(e.page!==void 0&&(!Number.isInteger(e.page)||e.page<1))return`--page must be an integer of at least 1. / --page 必须是大于等于 1 的整数。`;if(e.pageSize!==void 0&&(!Number.isInteger(e.pageSize)||e.pageSize<1||e.pageSize>100))return`--page-size must be an integer between 1 and 100. / --page-size 必须是 1–100 的整数。`;if(e.searchField&&!e.search)return`--search-field requires --search. / --search-field 必须与 --search 一起使用。`},exampleArgs:[``,`--status SUCCEEDED --page-size 20`,`--quant-method gptq`,`--search qwen3 --search-field job_name --sort-order asc`],async run(e){let t={status:e.flags.status,model:e.flags.model,templateId:e.flags.templateId,quantSpec:e.flags.quantSpec,quantMethod:e.flags.quantMethod,startTime:e.flags.startTime,endTime:e.flags.endTime,searchKey:e.flags.search,selectKey:e.flags.searchField,sortOrder:e.flags.sortOrder,pageNo:e.flags.page,pageSize:e.flags.pageSize};if(e.settings.dryRun){A({action:`finetune.compress.list`,...t},`json`);return}let n=await Bt(e.client,t),r=n.output,i=(r?.jobs??[]).map(e=>({job_id:e.job_id??``,job_name:e.job_name??``,status:e.status??``,model:e.model??``,template_name:e.template_name??``,quantized_output:e.quantized_output??``,create_time:e.create_time??``}));A({items:i,total:r?.total,page_no:r?.page_no,page_size:r?.page_size,request_id:n.request_id},`json`)}}),NS=w({description:{"en-US":`Get a compression job`,"zh-CN":`查询压缩任务详情`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:TS,exampleArgs:[`--job-id quant-xxx`],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.get`,job_id:t},`json`);return}A(await lt(e.client,t),`json`)}});const PS={...TS,follow:{type:`switch`,description:{"en-US":`Poll until the job reaches a terminal state`,"zh-CN":`持续轮询直至任务进入终态`}},interval:{type:`number`,valueHint:`<sec>`,description:{"en-US":`Polling interval with --follow (default: 10, min: 1)`,"zh-CN":`使用 --follow 时的轮询间隔(默认:10,最小:1)`}},pollTimeout:{type:`number`,valueHint:`<sec>`,description:{"en-US":`Stop polling after this many seconds`,"zh-CN":`在指定秒数后停止轮询`}}};var FS=w({description:{"en-US":`Probe or follow a compression job's status`,"zh-CN":`查询或持续跟踪压缩任务状态`},auth:`apiKey`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]`,flags:PS,validate(e){if(e.interval!==void 0&&(!Number.isFinite(e.interval)||e.interval<1))return`--interval must be at least 1 second. / --interval 必须至少为 1 秒。`;if(e.pollTimeout!==void 0&&(!Number.isFinite(e.pollTimeout)||e.pollTimeout<1))return`--poll-timeout must be at least 1 second. / --poll-timeout 必须至少为 1 秒。`},exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --follow`,`--job-id quant-xxx --follow --interval 30 --poll-timeout 7200`],notes:[{"en-US":`Without --follow, the command performs one non-blocking status probe.`,"zh-CN":`不使用 --follow 时仅执行一次非阻塞状态查询。`},{"en-US":"On success, quantized_output can be passed to `deploy text create --model-name`.","zh-CN":"成功后可将 quantized_output 传给 `deploy text create --model-name`。"}],async run(e){let t=e.flags.jobId,r=e.flags.interval??10;if(e.settings.dryRun){A({action:`finetune.compress.watch`,job_id:t,follow:e.flags.follow,interval:r,timeout:e.flags.pollTimeout},`json`);return}if(!e.flags.follow){let n=await lt(e.client,t),r=String(n.output?.status??`UNKNOWN`).toUpperCase();if(e.settings.quiet?k(r):A({job_id:t,status:r,terminal:ES.has(r),quantized_output:n.output?.quantized_output,request_id:n.request_id},`json`),ES.has(r)&&r!==`SUCCEEDED`)throw kS(t,r,n.output?.error?.message);return}let i=new AbortController,a=()=>i.abort();process.on(`SIGINT`,a);let o=Date.now();try{for(;;){let a=await lt(e.client,t,i.signal),s=String(a.output?.status??`UNKNOWN`).toUpperCase();if(ES.has(s)){if(e.settings.quiet?k(s):A(a,`json`),s!==`SUCCEEDED`)throw kS(t,s,a.output?.error?.message);return}if(e.flags.pollTimeout!==void 0&&(Date.now()-o)/1e3>=e.flags.pollTimeout)throw new n(`Watching compression job ${t} timed out. / 等待压缩任务 ${t} 超时。`,f.TIMEOUT);await AS(r*1e3,i.signal)}}catch(t){if(i.signal.aborted){process.stderr.write(`\n${e.localize({"en-US":`Interrupted.`,"zh-CN":`已中断。`})}\n`);return}throw t}finally{process.off(`SIGINT`,a)}}});const IS={...TS,offset:{type:`number`,valueHint:`<n>`,description:{"en-US":`Skip the first N lines (default: 0)`,"zh-CN":`跳过前 N 行(默认:0)`}},lines:{type:`number`,valueHint:`<n>`,description:{"en-US":`Number of lines to read (default: 100, max: 1000)`,"zh-CN":`读取行数(默认:100,最多:1000)`}},tail:{type:`number`,valueHint:`<n>`,description:{"en-US":`Read the last N log lines`,"zh-CN":`读取最后 N 行日志`}}};var LS=w({description:{"en-US":`Get compression job logs`,"zh-CN":`获取压缩任务日志`},auth:`apiKey`,usageArgs:`--job-id <id> [--offset <n>] [--lines <n> | --tail <n>]`,flags:IS,validate(e){if(e.offset!==void 0&&(!Number.isInteger(e.offset)||e.offset<0))return`--offset must be a non-negative integer. / --offset 必须是非负整数。`;if(e.lines!==void 0&&(!Number.isInteger(e.lines)||e.lines<1||e.lines>1e3))return`--lines must be an integer between 1 and 1000. / --lines 必须是 1–1000 的整数。`;if(e.tail!==void 0&&(!Number.isInteger(e.tail)||e.tail<1||e.tail>1e3))return`--tail must be an integer between 1 and 1000. / --tail 必须是 1–1000 的整数。`;if(e.tail!==void 0&&(e.offset!==void 0||e.lines!==void 0))return`--tail cannot be combined with --offset or --lines. / --tail 不能与 --offset 或 --lines 同时使用。`},exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --offset 0 --lines 50`,`--job-id quant-xxx --tail 20`],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.logs`,job_id:t,offset:e.flags.offset,line:e.flags.lines,tail:e.flags.tail},`json`);return}if(e.flags.tail!==void 0){let n=(await ut(e.client,t,{offset:0,line:1})).output?.total??0,r=Math.max(0,n-e.flags.tail);A(await ut(e.client,t,{offset:r,line:e.flags.tail}),`json`);return}A(await ut(e.client,t,{offset:e.flags.offset,line:e.flags.lines}),`json`)}}),RS=w({description:{"en-US":`Cancel a compression job`,"zh-CN":`取消压缩任务`},auth:`apiKey`,usageArgs:`--job-id <id>`,flags:TS,exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --dry-run`],notes:[{"en-US":`Only PENDING, QUEUING, or RUNNING jobs can be cancelled.`,"zh-CN":`只有 PENDING、QUEUING 或 RUNNING 状态的任务可以取消。`}],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.cancel`,job_id:t},`json`);return}let n=await ye(e.client,t);e.settings.quiet?k(t):A(n,`json`)}}),zS=w({description:{"en-US":`Delete a compression job record`,"zh-CN":`删除压缩任务记录`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the compression job record and cannot be undone.`,"zh-CN":`该操作会永久删除压缩任务记录,且无法撤销。`}},usageArgs:`--job-id <id>`,flags:TS,exampleArgs:[`--job-id quant-xxx`,`--job-id quant-xxx --dry-run`,`--job-id quant-xxx --yes`],notes:[{"en-US":`Only terminal jobs can be deleted. Deleting a job record does not delete its quantized output model.`,"zh-CN":`只有终态任务可以删除;删除任务记录不会删除其产出的量化模型。`}],async run(e){let t=e.flags.jobId;if(e.settings.dryRun){A({action:`finetune.compress.delete`,job_id:t},`json`);return}let n=await Pe(e.client,t);e.settings.quiet?k(t):A(n,`json`)}});const BS={deployedModel:{type:`string`,valueHint:`<code>`,required:!0,description:{"en-US":`Deployed model identifier (ModelCode)`,"zh-CN":`部署调用标识(ModelCode)`}}},VS={instanceId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Capacity instance ID returned by the API`,"zh-CN":`接口返回的容量实例 ID`}}},HS={...BS,operationId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Capacity operation ID returned by a write request`,"zh-CN":`写请求返回的容量操作 ID`}}};function US(e){for(let[t,n]of Object.entries(e))if([`deployedModel`,`instanceId`,`operationId`].includes(t)&&typeof n==`string`&&!n.trim())return`Identifiers must not be empty. / 标识不能为空。`}function WS(e){if(e.page!==void 0&&(!Number.isSafeInteger(e.page)||e.page<1))return`--page must be a positive integer. / --page 必须是正整数。`;if(e.pageSize!==void 0&&(!Number.isSafeInteger(e.pageSize)||e.pageSize<1||e.pageSize>100))return`--page-size must be an integer from 1 to 100. / --page-size 必须是 1–100 的整数。`}function GS(e){return e===void 0?void 0:e.split(`,`).map(e=>e.trim())}const KS=2147483;function qS(e,t){return new Promise((n,r)=>{t.throwIfAborted();let i=()=>{clearTimeout(a),r(t.reason)},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}async function JS(e,t,r,i){let a=new AbortController,o,s=i.initialResponse,c=()=>new n(`Capacity operation wait timed out; query the same operation ID before retrying any write. / 等待容量操作超时;重试写操作前请查询同一操作 ID。`,f.TIMEOUT,void 0,{cause:{deployed_model:t,operation_id:r,last_response:o}}),l=()=>a.abort(i.signal?.reason);i.signal?.addEventListener(`abort`,l,{once:!0}),i.signal?.aborted&&l();let u=Date.now()+i.pollTimeout*1e3,d=setTimeout(()=>a.abort(c()),i.pollTimeout*1e3),p=()=>{Date.now()>=u&&!a.signal.aborted&&a.abort(c()),a.signal.throwIfAborted()},m=i.interval*1e3,h=Math.max(m,3e4);try{for(;;){p();let c=s??await ct(e,t,r,a.signal);s=void 0,o=c,p();let l=c.output??c.data;if(l?.operation_status===`FAILED`)throw new n(l.error_message??l.error_code??`Capacity operation failed. / 容量操作失败。`,f.GENERAL,void 0,{api:{httpStatus:200,apiCode:l.error_code,requestId:c.request_id},cause:l,rawResponse:JSON.stringify(c)});if(l?.operation_status===`SUCCEEDED`){let n=l.instance_id??i.fallbackInstanceId,r=n?await st(e,t,n,a.signal):void 0;p();let o=await pt(e,t,a.signal);return p(),{...c,instance:r,deployment:o}}if(l?.operation_status!==`PROCESSING`)throw new n(`Missing or unsupported operation_status; cannot determine completion. / 缺少或不支持的 operation_status,无法判断完成状态。`,f.GENERAL,void 0,{cause:c,rawResponse:JSON.stringify(c)});await qS(Math.min(m,Math.max(0,u-Date.now())),a.signal),m=Math.min(m*2,h)}}catch(e){throw a.signal.aborted?a.signal.reason:e}finally{clearTimeout(d),i.signal?.removeEventListener(`abort`,l)}}const YS={...HS,interval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Initial poll interval (1–3600 seconds, default: 2); doubles up to max(initial, 30)`,"zh-CN":`初始轮询间隔(1–3600 秒,默认:2);逐次翻倍至 max(初始值, 30)`}},pollTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Total wait budget including requests and refresh (default: 600 seconds)`,"zh-CN":`总等待时限,包含请求及刷新(默认:600 秒)`}}};var XS=w({description:{"en-US":`Wait for a capacity operation and refresh confirmed capacity`,"zh-CN":`等待容量操作完成并刷新已确认容量`},auth:`apiKey`,flags:YS,usageArgs:`--deployed-model <code> --operation-id <id> [--interval <seconds>] [--poll-timeout <seconds>]`,exampleArgs:[`--deployed-model example-model-code --operation-id 100001`,`--deployed-model example-model-code --operation-id 100001 --interval 2 --poll-timeout 600`],notes:[{"en-US":`Read-only GET polling: PROCESSING continues, FAILED exits 1 with the server error, SUCCEEDED refreshes the instance (when an ID is returned) and deployment. Output preserves the operation envelope and adds instance/deployment response envelopes. Missing or unknown status fails rather than assuming success.`,"zh-CN":`只读 GET 轮询:PROCESSING 继续等待,FAILED 透传服务端错误并退出 1,SUCCEEDED 刷新实例(返回 ID 时)及部署。输出保留操作响应结构,追加 instance/deployment 响应结构。缺失或未知状态报错,不推定成功。`},{"en-US":`--timeout limits each HTTP request; --poll-timeout bounds the entire wait (exit 5 on expiry). Ctrl-C stops local waiting, not the remote operation. No write is retried; use the original operation ID after a timeout or interruption.`,"zh-CN":`--timeout 限制单次 HTTP 请求,--poll-timeout 限制整个等待过程(超时退出 5)。Ctrl-C 只停止本地等待,不取消远端操作。不重试任何写请求;超时或中断后仍使用原操作 ID 查询。`}],validate(e){let t=US(e);if(t)return t;if(e.interval!==void 0&&(!Number.isFinite(e.interval)||e.interval<1||e.interval>3600))return`--interval must be 1–3600 seconds. / --interval 必须为 1–3600 秒。`;if(e.pollTimeout!==void 0&&(!Number.isFinite(e.pollTimeout)||e.pollTimeout<=0||e.pollTimeout>KS))return`--poll-timeout must be > 0 and <= ${KS} seconds. / --poll-timeout 必须大于 0 且不超过 ${KS} 秒。`},async run(e){let{flags:t,settings:n}=e,r=t.interval??2,i=t.pollTimeout??600;if(n.dryRun){A({action:`deploy.operation.wait`,deployed_model:t.deployedModel,operation_id:t.operationId,interval:r,poll_timeout:i},`json`);return}let a=new AbortController,o=()=>a.abort(/* @__PURE__ */ Error(`Interrupted. / 已中断。`));process.once(`SIGINT`,o);try{let n=await JS(e.client,t.deployedModel,t.operationId,{interval:r,pollTimeout:i,signal:a.signal});A(n,`json`)}catch(e){if(!a.signal.aborted)throw e}finally{process.removeListener(`SIGINT`,o)}}});const ZS={inputTpm:{type:`number`,valueHint:`<kTPM>`,description:{"en-US":`Absolute input capacity in kTPM (1 kTPM = 1000 tokens/minute)`,"zh-CN":`输入绝对容量,单位 kTPM(1 kTPM = 1000 Tokens/分钟)`}},outputTpm:{type:`number`,valueHint:`<kTPM>`,description:{"en-US":`Absolute output capacity in kTPM`,"zh-CN":`输出绝对容量,单位 kTPM`}}},QS={duration:{type:`number`,valueHint:`<days>`,description:{"en-US":`Prepaid purchase/renewal duration, positive integer days`,"zh-CN":`预付费购买或续订天数,正整数`}},autoRenewal:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Explicitly enable or disable automatic renewal for prepaid purchases`,"zh-CN":`显式开启或关闭预付费自动续费`}},autoRenewalDuration:{type:`number`,valueHint:`<days>`,description:{"en-US":`Automatic renewal duration; required when enabled`,"zh-CN":`自动续费天数,开启自动续费时必填`}},autoRenewalCycle:{type:`string`,valueHint:`<cycle>`,description:{"en-US":`Optional supported renewal cycle, e.g. Day`,"zh-CN":`可选续费周期单位,按服务支持的值传入,如 Day`}}},$S={wait:{type:`switch`,description:{"en-US":`Wait for the returned capacity operation and refresh capacity`,"zh-CN":`等待返回的容量操作完成并刷新容量`}},interval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Initial wait poll interval (1–3600, default: 2 seconds)`,"zh-CN":`等待初始轮询间隔(1–3600,默认:2 秒)`}},pollTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Wait budget after submission (default: 600 seconds)`,"zh-CN":`提交后的等待总时限(默认:600 秒)`}}},eC={requestId:{type:`string`,valueHint:`<uuid>`,description:{"en-US":`Request identifier; generated if omitted. Reuse with identical parameters only for the same capacity operation`,"zh-CN":`请求标识,省略时生成;仅重试同一容量操作时保持标识和参数一致`}},...$S},tC={orderType:{type:`string`,valueHint:`<UPGRADE|DOWNGRADE>`,choices:[`UPGRADE`,`DOWNGRADE`],description:{"en-US":`Optional order direction; otherwise the server decides`,"zh-CN":`可选变配方向,省略时由服务端判定`}}},nC=[{"en-US":`Use --dry-run before confirming with --yes. A write is submitted once, never automatically retried. HTTP 200 is not operation success: inspect operation_status or pass --wait. After interruption or timeout, query the saved ModelCode/operation ID before considering another write.`,"zh-CN":`先用 --dry-run 预览,确认后再用 --yes。写请求只提交一次,不自动重试。HTTP 200 不等于操作成功:检查 operation_status 或使用 --wait。中断或超时后,先查询已保存的 ModelCode/操作 ID,再考虑是否重试写请求。`},{"en-US":`Capacities are absolute kTPM for one instance, not increments or ModelCode totals. Zero capacity is not release. Model-specific steps, limits and purchase periods are validated by the server. Automatic renewal configuration is part of purchase/scale/renew, not a standalone free setting change.`,"zh-CN":`容量是单个实例的绝对 kTPM,不是增量或 ModelCode 总量;容量归零不等于释放。模型步长、上下限及购买时长限制由服务端校验。自动续费配置属于购买、变配或续订流程,不是独立免费设置操作。`}];function rC(e){if(e.requestId!==void 0&&(!e.requestId.trim()||/[\r\n]/.test(e.requestId)))return`--request-id must be non-empty and contain no line breaks. / --request-id 不能为空或包含换行。`;if(!e.wait&&(e.interval!==void 0||e.pollTimeout!==void 0))return`--interval/--poll-timeout require --wait. / --interval/--poll-timeout 需要同时指定 --wait。`;if(e.interval!==void 0&&(!Number.isFinite(e.interval)||e.interval<1||e.interval>3600))return`--interval must be 1–3600 seconds. / --interval 必须为 1–3600 秒。`;if(e.pollTimeout!==void 0&&(!Number.isFinite(e.pollTimeout)||e.pollTimeout<=0||e.pollTimeout>2147483))return`--poll-timeout must be > 0 and <= 2147483 seconds. / --poll-timeout 必须大于 0 且不超过 2147483 秒。`}async function iC(e,t,r,i){let a=await st(e,t,r),o=a.output??a.data;if(!o||o.deleted===!0||o[`can_${i}`]!==!0)throw new n(`Capacity instance does not currently allow ${i}; refresh its details. / 容量实例当前不允许 ${i},请刷新详情。`,f.USAGE,void 0,{cause:a});return o}async function aC(e,t){try{return await t()}catch(t){let r={client_request_id:e,error:t instanceof Error?t.message:t},i=`Request ID: ${e}. No automatic retry; first check whether the operation was accepted. / 请求标识:${e}。未自动重试,请先核查操作是否已受理。`;if(t instanceof n)throw new n(t.message,t.exitCode,[t.hint,i].filter(Boolean).join(`
2836
+ `),{api:t.api,rawResponse:t.rawResponse,cause:{...r,original_cause:t.cause}});if(t instanceof Error)try{t.message+=`\n${i}`}catch{}throw t}}async function oC(e,t,r,i,a,o=!1,s){let c=r.output??r.data,l={...r,...a?{client_request_id:a}:{}};if(c?.operation_status===`FAILED`){let e=typeof c.error_message==`string`?c.error_message:typeof c.error_code==`string`?c.error_code:`Capacity operation failed. / 容量操作失败。`;throw new n(e,f.GENERAL,void 0,{api:{httpStatus:200,apiCode:typeof c.error_code==`string`?c.error_code:void 0,requestId:r.request_id},cause:l,rawResponse:JSON.stringify(l)})}if(o&&![`PROCESSING`,`SUCCEEDED`].includes(String(c?.operation_status)))throw new n(`Missing or unsupported operation_status after submission; do not repeat the write. / 提交后缺少或不支持的 operation_status,请勿重复写入。`,f.GENERAL,void 0,{cause:l});if(!i.wait){A(l,`json`);return}let u=t??(typeof c?.deployed_model==`string`?c.deployed_model:void 0),d=c?.operation_id;if(!u||typeof d!=`string`||!d.trim())throw new n(`Write submitted but no ModelCode/operation ID was returned for waiting; query the deployment before retrying. / 写请求已提交,但未返回等待所需的 ModelCode/操作 ID;重试前请查询部署。`,f.GENERAL,void 0,{cause:l,rawResponse:JSON.stringify(l)});process.stderr.write(`${JSON.stringify({submitted:!0,deployed_model:u,operation_id:d,client_request_id:a})}\n`);let p=new AbortController,m=()=>p.abort(/* @__PURE__ */ Error(`Interrupted. / 已中断。`));process.once(`SIGINT`,m);try{let t=await JS(e,u,d,{interval:i.interval??2,pollTimeout:i.pollTimeout??600,signal:p.signal,initialResponse:c?.operation_status===`SUCCEEDED`?r:void 0,fallbackInstanceId:s}),o=t.output??t.data,l=t.output?`output`:`data`,m={...t,...o?{[l]:{...o,operation_id:o.operation_id??d}}:{},...a?{client_request_id:a}:{}};if(s&&(t.instance?.output??t.instance?.data)?.deleted!==!0)throw new n(`Release operation completed but deleted=true is not confirmed; refresh the instance before deleting the ModelCode. / 释放操作已结束,但未确认 deleted=true;删除 ModelCode 前请刷新实例。`,f.GENERAL,void 0,{cause:m});A(m,`json`)}catch(e){if(!p.signal.aborted)throw e}finally{process.removeListener(`SIGINT`,m)}}const sC={modelName:{type:`string`,valueHint:`<model_name>`,description:{"en-US":`Model to deploy — fine-tuned output name or catalog model (required)`,"zh-CN":`要部署的模型:微调输出模型名称或模型目录中的模型(必填)`},required:!0},displayName:{type:`string`,valueHint:`<display_name>`,description:{"en-US":`Console display name (optional for PTU; required for other plans)`,"zh-CN":`控制台显示名称(PTU 可选;其他方案必填)`}},plan:{type:`string`,valueHint:`<plan>`,description:{"en-US":`Billing plan: lora (default, Token-billed) | ptu (throughput reservation) | mu`,"zh-CN":`计费方案:lora(默认,按 Token 计费)| ptu(吞吐预留)| mu`}},deploySpec:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deploy spec (only used by plan=mu; auto-picked if omitted)`,"zh-CN":`部署规格(仅 plan=mu 使用;省略时自动选择)`}},capacity:{type:`number`,valueHint:`<n>`,description:{"en-US":`Resource units (plan=mu only; required by API; defaults to the template's unit)`,"zh-CN":`资源单元数(仅 plan=mu;API 必填;默认为模板的单元数)`}},billingMethod:{type:`string`,valueHint:`<m>`,description:{"en-US":`Billing method (plan=mu only; default "POST_PAY", the only supported value)`,"zh-CN":`计费方式(仅 plan=mu;默认且仅支持 "POST_PAY")`}},...ZS,thinkingOutputTpm:{type:`number`,valueHint:`<n>`,description:{"en-US":`Legacy thinking-output capacity flag; not supported for PTU`,"zh-CN":`旧版思考输出容量参数;PTU 不支持此参数`}},chargeType:{type:`string`,valueHint:`<type>`,choices:[`pre_paid`,`post_paid`],description:{"en-US":`PTU payment type (required for plan=ptu): pre_paid or post_paid`,"zh-CN":`PTU 付费方式(plan=ptu 必填):pre_paid 或 post_paid`}},serviceTier:{type:`string`,valueHint:`<tier>`,choices:[`ptu_fast`,`ptu_default`],description:{"en-US":`PTU service tier: ptu_fast (default) or ptu_default (prepaid only)`,"zh-CN":`PTU 性能档位:ptu_fast(默认高速)或 ptu_default(标速,仅预付费)`}},suffix:{type:`string`,valueHint:`<suffix>`,description:{"en-US":`Optional PTU ModelCode suffix; generated by the service when omitted`,"zh-CN":`可选 PTU ModelCode 后缀;省略时由服务端生成`}},...QS,...$S},cC=`--model-name <model_name> [--display-name <display_name>] [--plan <plan>] [--charge-type <type>] [--service-tier <tier>] [--suffix <suffix>] [--input-tpm <n> --output-tpm <n>] [flags]`,lC={level:`high`,message:{"en-US":`Creating a deployment purchases or provisions resources and may incur charges.`,"zh-CN":`创建部署会购买或开通资源,可能产生费用。`}},uC=[{"en-US":"Plan defaults to `lora` (Token-billed) for text/image and `mu` (model-unit-billed) for audio (CosyVoice TTS). Pass --plan to override.","zh-CN":"文本和图片部署默认使用 `lora`(按 Token 计费),音频(CosyVoice TTS)默认使用 `mu`(按模型单元计费)。可通过 --plan 覆盖。"},{"en-US":`For plan=ptu, --charge-type, --input-tpm and --output-tpm are required. Capacity is in kTPM (1 kTPM = 1000 tokens/minute). Separate thinking-output capacity is unsupported. Prepaid requires --duration and explicit --auto-renewal true|false.`,"zh-CN":`plan=ptu 时,--charge-type、--input-tpm 和 --output-tpm 必填。容量单位为 kTPM(1 kTPM = 1000 Token/分钟),不支持单独的思考输出容量。预付费须提供 --duration 和显式 --auto-renewal true|false。`},{"en-US":"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.","zh-CN":"plan=mu 时,`capacity`、`billing_method` 和 `deploy_spec` 必填。billing_method 默认且仅支持 POST_PAY;省略 deploy_spec 和 capacity 时,会从 GET /deployments/models 自动选择。"},{"en-US":"Use `deploy models --source base` to inspect available templates.","zh-CN":"使用 `deploy models --source base` 查看可用模板。"},{"en-US":`PTU creation preserves the original JSON and operation_id even with --quiet. --wait only queries the returned operation; pending capacity is not effective capacity. Check the actual status before invoking the model.`,"zh-CN":`PTU 创建即使指定 --quiet 也保留原始 JSON 和 operation_id。--wait 仅查询返回的操作;待生效容量不等于已生效容量。调用模型前请确认实际状态。`},{"en-US":"--model-name identifies the source model; the returned deployed_model is the invocation identifier (ModelCode). Use it for inference (`text chat --model <deployed_model>`) and deployment lifecycle commands.","zh-CN":"--model-name 标识源模型;返回的 deployed_model 为调用标识(ModelCode),用于推理(`text chat --model <deployed_model>`)和部署生命周期命令。"},{"en-US":`Initial ModelCode creation does not support --request-id or promise idempotency. A timeout is not proof of failure: check whether the deployment was created before trying again. This command never automatically resubmits creation.`,"zh-CN":`首次创建 ModelCode 不支持 --request-id,也不承诺幂等。超时不代表失败:再次尝试前先确认部署是否已创建。本命令不会自动重新提交创建请求。`},{"en-US":`Use --dry-run to preview without requests. Pass --yes only after confirming the costs.`,"zh-CN":`使用 --dry-run 离线预览;仅在确认费用后传入 --yes 执行。`}];function dC(e,t){let n=t.plan||Me(e),r=ee[n];if(!r)return`Unsupported plan "${n}". Supported plans: ${Object.keys(ee).join(`, `)}. / 不支持方案 "${n}";支持的方案:${Object.keys(ee).join(`, `)}。`;if(n!==`ptu`){if(t.chargeType!==void 0||t.serviceTier!==void 0||t.suffix!==void 0||Ct(t)||t.wait||t.interval!==void 0||t.pollTimeout!==void 0)return`Payment, service tier, suffix, prepaid and wait options are PTU-only. / 付费方式、性能档位、后缀、预付费和等待参数仅适用于 PTU。`;if(!t.displayName?.trim())return`--display-name is required for non-PTU plans. / 非 PTU 方案必须提供 --display-name。`}else if(t.thinkingOutputTpm!==void 0)return`--thinking-output-tpm is not supported for PTU. / PTU 不支持 --thinking-output-tpm。`;return rC(t)??r.validateFlags(t)}async function fC(e,t){let{identity:n,settings:r,flags:i}=t,a=i.plan||Me(e),o=yn(a),s=async e=>{let r=await o.resolve({client:t.client,dryRun:e,binName:n.binName,flags:i,model:i.modelName,name:i.displayName});return{model_name:i.modelName,...i.displayName===void 0?{}:{name:i.displayName},plan:a,...r.body}};if(r.dryRun){A({action:`deploy.create`,body:await s(!0)},`json`);return}let c=await De(t.client,await s(!1)),l=c.output??c.data;a===`ptu`?await oC(t.client,l?.deployed_model,c,i):r.quiet?k(l?.deployed_model??``):A(c,`json`)}const pC=w({description:{"en-US":`Create a text model deployment`,"zh-CN":`创建文本模型部署`},auth:`apiKey`,risk:lC,usageArgs:cC,flags:sC,exampleArgs:[`--model-name my-qwen-sft --display-name my-sft-test`,`--model-name qwen3.6-flash-2026-04-16 --plan ptu --charge-type post_paid --input-tpm 10000 --output-tpm 1000 --dry-run`,`--model-name qwen3.6-flash-2026-04-16 --plan ptu --charge-type pre_paid --service-tier ptu_default --input-tpm 10000 --output-tpm 1000 --duration 30 --auto-renewal false --dry-run`,`--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:uC,validate:e=>dC(`text`,e),run:e=>fC(`text`,e)}),mC=w({description:{"en-US":`Create an audio (TTS) model deployment`,"zh-CN":`创建音频(TTS)模型部署`},auth:`apiKey`,risk:lC,usageArgs:cC,flags:sC,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:uC,validate:e=>dC(`audio`,e),run:e=>fC(`audio`,e)}),hC=w({description:{"en-US":`Create an image generation model deployment`,"zh-CN":`创建图片生成模型部署`},auth:`apiKey`,risk:lC,usageArgs:cC,flags:sC,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:uC,validate:e=>dC(`image`,e),run:e=>fC(`image`,e)});var gC=w({description:{"en-US":`List model deployments and throughput reservations`,"zh-CN":`列出模型部署及吞吐预留`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--plan <plan>] [--status <status>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 10, max 100)`,"zh-CN":`每页结果数(默认:10,最多:100)`}},plan:{type:`string`,valueHint:`<plan>`,description:{"en-US":`Server-side plan filter; use ptu for throughput reservations`,"zh-CN":`服务端方案筛选;吞吐预留使用 ptu`}},status:{type:`string`,valueHint:`<status>`,description:{"en-US":`Filter only the fetched page locally by ModelCode status; total remains unfiltered`,"zh-CN":`仅在已获取的当前页本地筛选 ModelCode 状态;total 仍为筛选前总数`}}},exampleArgs:[``,`--plan ptu`,`--plan ptu --status RUNNING --page-size 100`,`--page-size 20 --output json`],notes:[{"en-US":`The deployment list API supports page_no/page_size/plan, not status. --status filters only the requested page, not the entire account; an empty filtered page does not mean there are no matches on later pages. total is the server total before local filtering; local_filter reports the current-page match count. PTU capacities are kTPM.`,"zh-CN":`部署列表 API 支持 page_no/page_size/plan,不支持 status。--status 仅筛选所请求的当前页,不代表全账号筛选;当前页为空不代表后续页没有匹配项。total 是本地筛选前的服务端总数,local_filter 给出当前页匹配数量。PTU 容量单位为 kTPM。`}],validate(e){return WS(e)??([e.plan,e.status].some(e=>e!==void 0&&!e.trim())?`Filters must not be empty. / 筛选条件不能为空。`:void 0)},async run(e){let{settings:t,flags:n}=e,r=n.page??1,i=n.pageSize??10,a=n.status?.trim(),o=n.plan?.trim();if(t.dryRun){A({action:`deploy.list`,page:r,page_size:i,plan:o,status:a,...a?{filter_scope:`page`}:{}},`json`);return}let s=await Wt(e.client,{pageNo:r,pageSize:i,plan:o}),c=s.output??s.data,l=c?.deployments??[],u=(a?l.filter(e=>e.status===a):l).map(e=>({...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??``}));A({items:u,total:c?.total,page_no:c?.page_no??r,page_size:c?.page_size??i,...a?{local_filter:{status:a,scope:`page`,matched_count:u.length,unfiltered_page_count:l.length}}:{},request_id:s.request_id},`json`)}}),_C=w({description:{"en-US":`Get details of a single model deployment`,"zh-CN":`获取单个模型部署的详情`},auth:`apiKey`,usageArgs:`--deployed-model <id>`,flags:BS,exampleArgs:[`--deployed-model qwen-plus-2025-12-01-b6d61c71`,`--deployed-model qwen-plus-2025-12-01-b6d61c71 --output json`],notes:[{"en-US":`Preserves deployment fields including ptu_capacity (aggregate effective kTPM), ptu_service_tier, overflow_strategy and pre_paid_info. For mixed billing or multiple instances, query capacity list/get for each instance's status, expiry and capacity; ModelCode status is not instance status.`,"zh-CN":`保留部署字段,包括 ptu_capacity(汇总生效容量,kTPM)、ptu_service_tier、overflow_strategy 及 pre_paid_info。混合付费或多实例时,通过 capacity list/get 查询各实例状态、到期时间和容量;ModelCode 状态不等于实例状态。`}],validate:US,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 pt(e.client,r),a=i.output??i.data;if(!a){A({deployed_model:r,request_id:i.request_id},`json`);return}let o={...a,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`)}});const vC={...BS,page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (1–100, default: 20)`,"zh-CN":`每页条数(1–100,默认:20)`}},includeDeleted:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Include released instances (default: true)`,"zh-CN":`包含已释放实例(默认:true)`}},statuses:{type:`string`,valueHint:`<status,...>`,description:{"en-US":`Instance statuses, comma-separated (not ModelCode statuses)`,"zh-CN":`实例状态,逗号分隔(非 ModelCode 状态)`}},chargeTypes:{type:`string`,valueHint:`<pre_paid,post_paid>`,description:{"en-US":`Charge types: pre_paid, post_paid; comma-separated`,"zh-CN":`付费类型:pre_paid、post_paid,逗号分隔`}}};var yC=w({description:{"en-US":`List throughput reservation capacity instances`,"zh-CN":`查询吞吐预留容量实例列表`},auth:`apiKey`,flags:vC,usageArgs:`--deployed-model <code> [--page <n>] [--page-size <n>] [--include-deleted <true|false>] [--statuses <status,...>] [--charge-types <pre_paid,post_paid>]`,exampleArgs:[`--deployed-model example-model-code`,`--deployed-model example-model-code --include-deleted false --statuses RUNNING,STOPPED`],notes:[{"en-US":`Preserves the API envelope and records/items/page/itemsPerPage/pageCount pagination. Capacities are kTPM; effective, configured and target capacities are distinct. STOPPED alone does not mean released: inspect deleted.`,"zh-CN":`保留 API 响应结构及 records/items/page/itemsPerPage/pageCount 分页字段。容量单位为 kTPM,区分生效、配置和目标容量。仅 STOPPED 不代表已释放,需检查 deleted。`}],validate(e){let t=US(e)??WS(e);if(t)return t;if([e.statuses,e.chargeTypes].some(e=>GS(e)?.some(e=>!e)))return`Filter lists must not contain empty values. / 筛选列表不能包含空值。`;if(GS(e.chargeTypes)?.some(e=>![`pre_paid`,`post_paid`].includes(e)))return`--charge-types accepts pre_paid,post_paid. / --charge-types 仅支持 pre_paid、post_paid。`},async run(e){let{flags:t,settings:n}=e,r={pageNo:t.page??1,pageSize:t.pageSize??20,includeDeleted:t.includeDeleted??!0,statuses:GS(t.statuses),chargeTypes:GS(t.chargeTypes)};if(n.dryRun){A({action:`deploy.capacity.list`,deployed_model:t.deployedModel,query:{page_no:r.pageNo,page_size:r.pageSize,include_deleted:r.includeDeleted,statuses:r.statuses?.join(`,`),charge_types:r.chargeTypes?.join(`,`)}},`json`);return}A(await Rt(e.client,t.deployedModel,r),`json`)}}),bC=w({description:{"en-US":`Get a throughput reservation capacity instance`,"zh-CN":`查询吞吐预留容量实例详情`},auth:`apiKey`,flags:{...BS,...VS},usageArgs:`--deployed-model <code> --instance-id <id>`,exampleArgs:[`--deployed-model example-model-code --instance-id example-capacity-instance`],notes:[{"en-US":`Read-only; released instances can also be queried. Preserves the API envelope, capacity fields, can_scale/can_renew/can_delete and deleted. Capacities are kTPM; the instance must belong to this ModelCode.`,"zh-CN":`只读查询,已释放实例也可查询。保留 API 响应结构、容量字段、can_scale/can_renew/can_delete 和 deleted。容量单位为 kTPM,实例必须属于指定 ModelCode。`}],validate:US,async run(e){let{settings:t,flags:n}=e;if(t.dryRun){A({action:`deploy.capacity.get`,deployed_model:n.deployedModel,instance_id:n.instanceId},`json`);return}A(await st(e.client,n.deployedModel,n.instanceId),`json`)}});const xC={...BS,...ZS,...QS,...eC,billingMethod:{type:`string`,valueHint:`<PRE_PAY|POST_PAY>`,required:!0,choices:[`PRE_PAY`,`POST_PAY`],description:{"en-US":`Capacity instance billing method (case-sensitive)`,"zh-CN":`容量实例付费方式(区分大小写)`}}},SC=w({description:{"en-US":`Purchase an additional capacity instance for a ModelCode`,"zh-CN":`为已有 ModelCode 叠加购买容量实例`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Purchases additional throughput capacity and may enable recurring charges.`,"zh-CN":`该操作将购买额外吞吐容量,可能开启持续续费。`}},flags:xC,usageArgs:`--deployed-model <code> --billing-method <PRE_PAY|POST_PAY> --input-tpm <kTPM> --output-tpm <kTPM> [--duration <days>] [--auto-renewal <true|false>] [--wait]`,exampleArgs:[`--deployed-model example-code --billing-method POST_PAY --input-tpm 10000 --output-tpm 1000 --dry-run`,`--deployed-model example-code --billing-method PRE_PAY --input-tpm 10000 --output-tpm 1000 --duration 30 --auto-renewal false --dry-run`],notes:[...nC,{"en-US":`Keeps the ModelCode, model and performance tier. Only one unreleased postpaid instance is allowed per ModelCode; the server validates purchase eligibility and slot limits.`,"zh-CN":`沿用原 ModelCode、模型和性能档位。同一 ModelCode 只允许一个未释放的后付费实例;购买资格和实例数量限制由服务端校验。`}],validate(e){return(US(e)??rC(e)??br(e,!0))||(e.billingMethod===`POST_PAY`&&Ct(e)?`POST_PAY cannot include prepaid settings. / 后付费不能携带预付费配置。`:yr(e,e.billingMethod===`PRE_PAY`))},async run(e){let{flags:t,settings:n}=e,r=he(t),i={billing_method:t.billingMethod,ptu_capacity:ge(t),...r?{pre_paid_info:r}:{}};if(n.dryRun){A({action:`deploy.capacity.create`,deployed_model:t.deployedModel,body:i,client_request_id:t.requestId??`<generated UUID>`,wait:t.wait},`json`);return}let a=t.requestId??ai(),o=await aC(a,()=>Te(e.client,t.deployedModel,i,{requestId:a}));await oC(e.client,t.deployedModel,o,t,a,!0)}}),CC={...BS,...VS,...ZS,...QS,...tC,...eC},wC=w({description:{"en-US":`Scale the absolute capacity of one reservation instance`,"zh-CN":`调整单个预留实例的绝对容量`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Changes purchased capacity, may incur charges and can reduce serving capacity to zero.`,"zh-CN":`该操作会变更购买容量、可能产生费用,也可能将服务容量降至零。`}},flags:CC,usageArgs:`--deployed-model <code> --instance-id <id> --input-tpm <kTPM> --output-tpm <kTPM> [--order-type <UPGRADE|DOWNGRADE>] [--wait]`,exampleArgs:[`--deployed-model example-code --instance-id example-instance --input-tpm 20000 --output-tpm 2000 --dry-run`,`--deployed-model example-code --instance-id example-instance --input-tpm 0 --output-tpm 0 --dry-run`],notes:[...nC,{"en-US":`Refreshes can_scale before writing. Omitted prepaid settings remain omitted, so the server can reuse saved information. Postpaid instances cannot receive prepaid settings.`,"zh-CN":`写入前刷新 can_scale。未指定预付费参数时不发送该对象,由服务端复用已保存的信息。后付费实例不能携带预付费配置。`}],validate:e=>US(e)??rC(e)??br(e,!0)??yr(e,!1),async run(e){let{flags:t,settings:r}=e,i=he(t),a={ptu_capacity:ge(t),...t.orderType?{order_type:t.orderType}:{},...i?{pre_paid_info:i}:{}};if(r.dryRun){A({action:`deploy.capacity.scale`,deployed_model:t.deployedModel,instance_id:t.instanceId,body:a,client_request_id:t.requestId??`<generated UUID>`,precheck:`can_scale`,wait:t.wait},`json`);return}let o=await iC(e.client,t.deployedModel,t.instanceId,`scale`);if(![`pre_paid`,`post_paid`].includes(o.charge_type??``))throw new n(`Unknown instance billing type; cannot safely scale. / 实例付费类型不明确,无法安全变配。`,f.USAGE);if(i&&o.charge_type!==`pre_paid`)throw new n(`Prepaid settings require a prepaid instance. / 预付费配置只能用于预付费实例。`,f.USAGE);let s=t.requestId??ai(),c=await aC(s,()=>Yn(e.client,t.deployedModel,t.instanceId,a,{requestId:s}));await oC(e.client,t.deployedModel,c,t,s,!0)}}),TC={...BS,...VS,...ZS,...QS,...eC,isChange:{type:`boolean`,valueHint:`<true|false>`,description:{"en-US":`Change capacity during renewal (default: false)`,"zh-CN":`续订时同时变更容量(默认:false)`}}},EC=w({description:{"en-US":`Renew a prepaid capacity instance, optionally changing capacity`,"zh-CN":`续订预付费容量实例,可同时变更容量`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Renews a paid capacity instance and may enable automatic recurring renewal.`,"zh-CN":`该操作将付费续订容量实例,可能开启自动持续续费。`}},flags:TC,usageArgs:`--deployed-model <code> --instance-id <id> --duration <days> --auto-renewal <true|false> [--is-change <true|false>] [--input-tpm <kTPM>] [--output-tpm <kTPM>] [--wait]`,exampleArgs:[`--deployed-model example-code --instance-id example-instance --duration 30 --auto-renewal false --dry-run`,`--deployed-model example-code --instance-id example-instance --duration 30 --auto-renewal true --auto-renewal-duration 30 --dry-run`],notes:[...nC,{"en-US":`Prepaid only; refreshes can_renew. Different capacity requires --is-change true; an unchanged capacity may be sent with false. No order_type is accepted by this endpoint.`,"zh-CN":`仅支持预付费,写入前刷新 can_renew。变更容量必须指定 --is-change true;相同配置容量可随 false 发送。本接口不接受 order_type。`}],validate:e=>US(e)??rC(e)??br(e,!1)??yr(e,!0),async run(e){let{flags:t,settings:r}=e,i=t.inputTpm===void 0?void 0:ge(t),a={pre_paid_info:he(t),is_change:t.isChange??!1,...i?{ptu_capacity:i}:{}};if(r.dryRun){A({action:`deploy.capacity.renew`,deployed_model:t.deployedModel,instance_id:t.instanceId,body:a,client_request_id:t.requestId??`<generated UUID>`,precheck:`can_renew/pre_paid/configured_capacity`,wait:t.wait},`json`);return}let o=await iC(e.client,t.deployedModel,t.instanceId,`renew`);if(o.charge_type!==`pre_paid`)throw new n(`Only prepaid instances can be renewed. / 仅预付费实例可以续订。`,f.USAGE);if(i&&!t.isChange&&(i.input_tpm!==o.configured_capacity?.input_tpm||i.output_tpm!==o.configured_capacity?.output_tpm))throw new n(`Different capacity requires --is-change true. / 变更容量必须指定 --is-change true。`,f.USAGE);let s=t.requestId??ai(),c=await aC(s,()=>Mn(e.client,t.deployedModel,t.instanceId,a,{requestId:s}));await oC(e.client,t.deployedModel,c,t,s,!0)}}),DC={...BS,...VS,...eC,reason:{type:`string`,valueHint:`<text>`,description:{"en-US":`Optional release reason, sent as a query parameter`,"zh-CN":`可选释放原因,以查询参数发送`}}},OC=w({description:{"en-US":`Release a capacity instance without deleting its ModelCode`,"zh-CN":`释放容量实例,保留所属 ModelCode`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Releases serving capacity and may interrupt requests; this cannot be undone by this command. This is not a prepaid unsubscribe/refund action.`,"zh-CN":`该操作将释放服务容量,可能中断请求,不能通过本命令撤销。这不是预付费退订或退款操作。`}},flags:DC,usageArgs:`--deployed-model <code> --instance-id <id> [--reason <text>] [--wait]`,exampleArgs:[`--deployed-model example-code --instance-id example-instance --dry-run`],notes:[...nC,{"en-US":"Active prepaid instances must be unsubscribed via `deploy capacity unsubscribe` (billing console link), even when can_delete=true. Failed prepaid instances may have no associated order; only the server can decide whether direct release is supported. Release is asynchronous; verify deleted=true, not merely STOPPED or zero capacity.","zh-CN":"已生效预付费实例须通过 `deploy capacity unsubscribe` 获取费用中心退订链接完成退订,即使 can_delete=true 也不能直接删除。失败的预付费实例可能尚未关联订单,能否直接释放由服务端裁决。释放是异步操作,须确认 deleted=true,不能只看 STOPPED 或零容量。"}],validate:e=>US(e)??rC(e),async run(e){let{flags:t,settings:r}=e;if(r.dryRun){A({action:`deploy.capacity.delete`,deployed_model:t.deployedModel,instance_id:t.instanceId,query:t.reason===void 0?{}:{reason:t.reason},client_request_id:t.requestId??`<generated UUID>`,precheck:`can_delete/prepaid_unsubscribe`,wait:t.wait},`json`);return}let i=await iC(e.client,t.deployedModel,t.instanceId,`delete`);if(i.charge_type===`pre_paid`&&i.status!==`FAILED`)throw new n("Prepaid instances must be unsubscribed in the billing console; DELETE is not a refund. Run `deploy capacity unsubscribe --instance-id <id>` to get the refund page link. / 预付费实例请在费用中心退订,DELETE 不能替代退订退款。运行 `deploy capacity unsubscribe --instance-id <id>` 获取退订页面链接。",f.USAGE);if(![`pre_paid`,`post_paid`].includes(i.charge_type??``))throw new n(`Unknown instance billing type; cannot safely release. / 实例付费类型不明确,无法安全释放。`,f.USAGE);let a=t.requestId??ai(),o=await aC(a,()=>Ne(e.client,t.deployedModel,t.instanceId,{requestId:a,reason:t.reason}));await oC(e.client,t.deployedModel,o,t,a,!0,t.instanceId)}});var kC=w({description:{"en-US":`Build the Aliyun billing console unsubscribe link for a prepaid capacity instance`,"zh-CN":`生成预付费容量实例在阿里云费用中心的退订链接`},auth:`none`,flags:VS,usageArgs:`--instance-id <id>`,exampleArgs:[`--instance-id example-instance`],notes:[{"en-US":`No API is called and nothing is unsubscribed by this command; it only builds the refund page link. Open the link and finish the unsubscribe flow in the billing console with the account that placed the order.`,"zh-CN":`本命令不调用任何接口,也不会执行退订,只生成费用中心退订页面链接。请用下单账号打开链接,在费用中心完成退订流程。`},{"en-US":"Only prepaid instances are unsubscribed this way; postpaid instances are released with `deploy capacity delete`. The ID is the capacity instance ID (see `deploy capacity list` / `get`), not the ModelCode. Unsubscription may interrupt serving and is irreversible; refund rules are decided by the billing console.","zh-CN":"仅预付费实例通过此方式退订;后付费实例请使用 `deploy capacity delete` 释放。此处为容量实例 ID(见 `deploy capacity list` / `get`),不是 ModelCode。退订可能中断服务且不可撤销,退款规则以费用中心为准。"}],validate:US,async run(e){let{settings:t,flags:n}=e,r=Xr(n.instanceId);if(t.quiet){k(r);return}A({action:`deploy.capacity.unsubscribe`,instance_id:n.instanceId,refund_url:r},`json`)}}),AC=w({description:{"en-US":`Set the overflow strategy for a throughput reservation ModelCode`,"zh-CN":`设置吞吐预留 ModelCode 的溢出策略`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Enabling overflow incurs pay-as-you-go charges beyond reserved capacity; disabling it rate-limits excess requests.`,"zh-CN":`开启溢出后,预留容量外的流量将产生按量费用;关闭后,超额请求会被限流。`}},flags:{...BS,strategy:{type:`string`,valueHint:`<enable|disable>`,required:!0,choices:[`enable`,`disable`],description:{"en-US":`Allow pay-as-you-go overflow or restrict requests to reserved capacity`,"zh-CN":`允许按量溢出或将请求限制在预留容量内`}}},usageArgs:`--deployed-model <code> --strategy <enable|disable>`,exampleArgs:[`--deployed-model example-code --strategy enable --dry-run`,`--deployed-model example-code --strategy disable --dry-run`],notes:[{"en-US":`Applies to the whole ModelCode, not one capacity instance. Sends one update then one GET to confirm the strategy. Never retries the update automatically; a read-back failure does not mean the change was not applied.`,"zh-CN":`配置作用于整个 ModelCode,而非单个容量实例。提交一次更新后 GET 回读确认策略。不自动重试更新;回读失败不代表配置未生效。`}],validate:US,async run(e){let{settings:t,flags:r}=e;if(t.dryRun){A({action:`deploy.overflow`,deployed_model:r.deployedModel,body:{overflow_strategy:r.strategy}},`json`);return}let i=await mr(e.client,r.deployedModel,r.strategy),a=await pt(e.client,r.deployedModel);if((a.output??a.data)?.overflow_strategy!==r.strategy)throw new n(`Overflow update submitted but not confirmed by read-back; query the deployment before retrying. / 溢出配置已提交,但回读未确认,请先查询部署再决定是否重试。`,f.GENERAL,void 0,{cause:{response:i,deployment:a}});A({...i,deployment:a},`json`)}}),jC=w({description:{"en-US":`Query a throughput reservation capacity operation once`,"zh-CN":`单次查询吞吐预留容量操作`},auth:`apiKey`,flags:HS,usageArgs:`--deployed-model <code> --operation-id <id>`,exampleArgs:[`--deployed-model example-model-code --operation-id 100001`],notes:[{"en-US":`Preserves the API envelope, including FAILED and its error fields; a successful GET returns exit code 0 regardless of operation status. Use operation wait to wait for success or fail with a non-zero exit. Use the actual returned operation ID; do not construct one.`,"zh-CN":`保留 API 响应结构,包括 FAILED 状态及错误字段;GET 请求成功即返回退出码 0,不以操作状态判断。需要等待成功或失败时非零退出,请使用 operation wait。操作 ID 必须使用实际返回值,不要自行构造。`}],validate:US,async run(e){let{settings:t,flags:n}=e;if(t.dryRun){A({action:`deploy.operation.get`,deployed_model:n.deployedModel,operation_id:n.operationId},`json`);return}A(await ct(e.client,n.deployedModel,n.operationId),`json`)}}),MC=w({description:{"en-US":`List models available for deployment`,"zh-CN":`列出可部署的模型`},auth:`apiKey`,usageArgs:`[--page <n>] [--page-size <n>] [--catalog-version <v>] [--source <custom|public>]`,flags:{page:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Results per page (default: 100)`,"zh-CN":`每页结果数(默认:100)`}},catalogVersion:{type:`string`,valueHint:`<v>`,description:{"en-US":`Catalog version filter (default: v1.0; required for new catalog models)`,"zh-CN":`模型目录版本筛选(默认:v1.0;新目录模型必填)`}},source:{type:`string`,valueHint:`<s>`,description:{"en-US":`Model source filter: custom (fine-tuned) | base (catalog) | public`,"zh-CN":`模型来源筛选:custom(微调模型)| base(模型目录)| 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 Ut(e.client,{pageNo:n.page,pageSize:n.pageSize,version:r,modelSource:i}),o=a.output??a.data,s=o?.models??[],c=o?.total,l=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});A({items:l,total:c,request_id:a.request_id},`json`)}});const NC={deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},capacity:{type:`number`,valueHint:`<n>`,description:{"en-US":`MU target capacity: non-negative integer in plan units; must satisfy base_capacity`,"zh-CN":`MU 目标容量:非负整数,单位为方案单元;须满足 base_capacity 约束`}},...ZS,instanceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`PTU capacity instance ID; required when multiple unreleased instances exist`,"zh-CN":`PTU 容量实例 ID;存在多个未释放实例时必填`}},...QS,...eC,...tC};async function PC(e,t){let r=await Rt(e,t,{includeDeleted:!1,pageNo:1,pageSize:2}),i=r.output??r.data,a=i?.records;if(!Array.isArray(a)||a.length!==1||i?.items!==1||i.page!==void 0&&i.page!==1||i.pageCount!==void 0&&i.pageCount!==1||a[0]?.deleted===!0||typeof a[0]?.instance_id!=`string`||!a[0].instance_id.trim())throw new n(`Cannot confirm exactly one unreleased capacity instance. Specify --instance-id; multiple instances must never be selected implicitly. / 无法确认恰好一个未释放容量实例,请指定 --instance-id;多个实例不能自动选择。`,f.USAGE);return a[0].instance_id}var FC=w({description:{"en-US":`Scale a deployment's capacity`,"zh-CN":`调整部署容量`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`Scaling changes purchased capacity and may incur charges or reduce serving capacity.`,"zh-CN":`扩缩容会变更购买的容量,可能产生费用或降低服务容量。`}},usageArgs:`--deployed-model <id> (--capacity <n> | --input-tpm <n> --output-tpm <n>) [--instance-id <id>] [flags]`,flags:NC,exampleArgs:[`--deployed-model dep-... --capacity 8 --dry-run`,`--deployed-model dep-... --instance-id instance-... --input-tpm 20000 --output-tpm 2000 --order-type UPGRADE --dry-run`],notes:[...nC,{"en-US":`PTU input/output values are the selected instance's absolute target capacity in kTPM (1 kTPM = 1000 tokens/minute), not deltas or deployment totals. Both zero is valid and does not release the instance. PTU options cannot be combined with --capacity.`,"zh-CN":`PTU 输入/输出值为选中实例的绝对目标容量,单位 kTPM(1 kTPM = 1000 Token/分钟),不是增量或部署总容量。允许同时为零,但不等于释放实例。PTU 参数不能与 --capacity 混用。`},{"en-US":`Without --instance-id, execution must confirm exactly one unreleased instance and recheck can_scale. Dry-run does not resolve an instance or validate its billing type. Pass --yes only after confirming the costs and target.`,"zh-CN":`省略 --instance-id 时,执行前必须确认恰好一个未释放实例并复查 can_scale。dry-run 不解析实例或验证其付费方式;仅在确认费用及目标后传入 --yes 执行。`}],validate(e){return(US(e)??rC(e))||(e.capacity===void 0?br(e,!0)??yr(e,!1):!Number.isSafeInteger(e.capacity)||e.capacity<0?`--capacity must be a non-negative safe integer. / --capacity 必须是非负安全整数。`:e.inputTpm!==void 0||e.outputTpm!==void 0||e.instanceId!==void 0||e.orderType!==void 0||Ct(e)||e.wait||e.requestId!==void 0||e.interval!==void 0||e.pollTimeout!==void 0?`PTU options cannot be used with --capacity. / PTU 参数不能与 --capacity 混用。`:void 0)},async run(e){let{settings:t,flags:r}=e,i=r.deployedModel,a=r.capacity===void 0,o=a?{ptu_capacity:ge(r),...r.instanceId===void 0?{}:{instance_id:r.instanceId},...r.orderType===void 0?{}:{order_type:r.orderType},...Ct(r)?{pre_paid_info:he(r)}:{}}:{capacity:r.capacity};if(t.dryRun){A({action:`deploy.scale`,deployed_model:i,body:o,...a&&r.instanceId===void 0?{instance_resolution:`Execution must resolve exactly one unreleased instance or require --instance-id. / 执行时须确认唯一未释放实例,否则必须指定 --instance-id。`}:{}},`json`);return}if(a){let t=r.instanceId??await PC(e.client,i),a=await iC(e.client,i,t,`scale`);if(![`pre_paid`,`post_paid`].includes(a.charge_type??``))throw new n(`Unknown instance billing type; cannot safely scale. / 实例付费类型不明确,无法安全变配。`,f.USAGE);if(a.charge_type===`post_paid`&&Ct(r))throw new n(`Postpaid instances do not accept prepaid options. / 后付费实例不接受预付费参数。`,f.USAGE);o.instance_id=t;let s=r.requestId??ai(),c=await aC(s,()=>Xn(e.client,i,o,void 0,s));await oC(e.client,i,c,r,s);return}let s=await Xn(e.client,i,o);t.quiet?k(i):A(s,`json`)}}),IC=w({description:{"en-US":`Update a deployment's rate limits (rpm_limit / tpm_limit)`,"zh-CN":`更新部署的限流配置(rpm_limit / tpm_limit)`},auth:`apiKey`,usageArgs:`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},rpmLimit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Requests per minute`,"zh-CN":`每分钟请求数`}},tpmLimit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Tokens per minute`,"zh-CN":`每分钟 Token 数`}}},exampleArgs:[`--deployed-model dep-... --rpm-limit 1000`,`--deployed-model dep-... --rpm-limit 1000 --tpm-limit 200000`],notes:[{"en-US":`At least one of --rpm-limit / --tpm-limit must be provided.`,"zh-CN":`--rpm-limit / --tpm-limit 至少需要提供一个。`}],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 pr(e.client,r,i);t.quiet?k(r):A(a,`json`)}}),LC=w({description:{"en-US":`Delete a model deployment (PTU must be STOPPED with all capacity released)`,"zh-CN":`删除模型部署(PTU 须为 STOPPED 且已释放全部容量)`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified model deployment and cannot be undone.`,"zh-CN":`该操作会永久删除指定的模型部署,且无法撤销。`}},usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},skipPrecheck:{type:`switch`,description:{"en-US":`Skip local checks only; the service still validates deletion prerequisites`,"zh-CN":`仅跳过本地检查;服务端仍验证删除前提条件`}}},exampleArgs:[`--deployed-model dep-... --dry-run`,{"en-US":`--deployed-model dep-... --yes # Execute only after confirming deletion`,"zh-CN":`--deployed-model dep-... --yes # 仅在确认删除后执行`}],notes:[{"en-US":`PTU deletion requires STOPPED, all capacity instances released, and no processing or queued capacity operations. Pausing or scaling to zero does not release an instance; prepaid capacity may require unsubscription.`,"zh-CN":`PTU 删除要求状态为 STOPPED、全部容量实例已释放,且不存在执行中或排队的容量操作。暂停或缩容到零不等于释放实例;预付费容量可能需要先退订。`},{"en-US":`Local checks inspect the deployment, unreleased instances and any returned operation_id. There is no public queued-operation list API, so these checks cannot confirm all operations are finished; the service makes the final decision. --skip-precheck only omits local checks, never service validation or resource release requirements.`,"zh-CN":`本地检查部署、未释放实例及返回的 operation_id。没有公开的排队操作列表接口,因此无法在本地确认所有操作均已完成,最终以服务端裁决为准。--skip-precheck 仅省略本地检查,不绕过服务端验证或资源释放要求。`}],async run(e){let{settings:t,flags:r}=e,i=r.deployedModel;if(t.dryRun){A({action:`deploy.delete`,deployed_model:i},`json`);return}if(!r.skipPrecheck){let t=await pt(e.client,i),r=t.output??t.data,a=(r?.status??``).toUpperCase();if(r?.plan===`ptu`||r?.plan===`ptu_v2`||r?.ptu_capacity!==void 0||r?.ptu_service_tier!==void 0){if(a!==`STOPPED`)throw new n(`PTU deployment ${i} must be STOPPED before deletion (current: ${a||`unknown`}). Release all capacity instances first; pausing is not release. / PTU 部署 ${i} 删除前必须为 STOPPED(当前:${a||`未知`});请先释放全部容量实例,暂停不等于释放。`,f.USAGE);let t=await Rt(e.client,i,{includeDeleted:!1,pageNo:1,pageSize:1}),o=t.output??t.data;if(Array.isArray(o?.records)&&o.records.length>0||typeof o?.items==`number`&&o.items>0||typeof o?.total==`number`&&o.total>0)throw new n(`Release all capacity instances before deleting the PTU deployment; STOPPED or zero capacity does not mean released. / 删除 PTU 部署前请先释放全部容量实例;STOPPED 或零容量不等于已释放。`,f.USAGE);if(!Array.isArray(o?.records)||o.records.length!==0||o.items!==0||o.total!==void 0&&o.total!==0||o.page!==void 0&&o.page!==1||o.pageCount!==void 0&&o.pageCount!==0&&o.pageCount!==1)throw new n(`Cannot confirm all capacity instances are released from the list response; deletion was not submitted. / 无法从列表响应确认全部容量实例已释放;未提交删除请求。`,f.USAGE);if(r?.operation_id){let t=await ct(e.client,i,r.operation_id),a=t.output??t.data;if(a?.operation_status===`PROCESSING`)throw new n(`A capacity operation is processing or queued. Wait for it to finish before deleting the deployment. / 存在执行中或排队的容量操作,请等待其结束后再删除部署。`,f.USAGE);if(a?.operation_status!==`SUCCEEDED`&&a?.operation_status!==`FAILED`)throw new n(`Cannot confirm the returned capacity operation has finished; deletion was not submitted. / 无法确认返回的容量操作已结束;未提交删除请求。`,f.USAGE)}}else if(a!==`STOPPED`&&a!==`FAILED`)throw new n(`Deployment ${i} must be STOPPED or FAILED before deletion (current: ${a||`unknown`}). / 部署 ${i} 删除前必须为 STOPPED 或 FAILED(当前:${a||`未知`})。`,f.USAGE,"Check the deployment status with `deploy get` before deletion. / 删除前请使用 `deploy get` 检查部署状态。")}let a=await Le(e.client,i);t.quiet?k(i):A(a,`json`)}}),RC=w({description:{"en-US":`Pause a running model deployment (stops billing for mu/ptu)`,"zh-CN":`暂停运行中的模型部署(mu/ptu 方案将停止计费)`},auth:`console`,usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},skipPrecheck:{type:`switch`,description:{"en-US":`Skip the local RUNNING/PENDING status precheck`,"zh-CN":`跳过本地 RUNNING/PENDING 状态预检查`}}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --skip-precheck`,`--deployed-model dep-... --dry-run`],notes:[{"en-US":"While paused, billing ceases for mu/ptu plans. Use `deploy resume` to bring it back online or `deploy delete` to remove.","zh-CN":"暂停期间,mu/ptu 方案将停止计费。使用 `deploy resume` 恢复服务,或使用 `deploy delete` 删除部署。"},{"en-US":`Precheck verifies status is RUNNING/PENDING before issuing the pause; pass --skip-precheck to bypass.`,"zh-CN":`发起暂停前会预检查部署状态是否为 RUNNING/PENDING;可传入 --skip-precheck 跳过检查。`}],async run(e){let{settings:t,flags:r}=e,i=r.deployedModel;if(t.dryRun){A({action:`deploy.pause`,deployed_model:i},`json`);return}if(!r.skipPrecheck)try{let t=await Kt(e.client),r=tt(t,i);if(r){let e=(r.status??``).toUpperCase();if(e&&e!==`RUNNING`&&e!==`PENDING`)throw new n(`Deployment ${i} is ${e}. Only RUNNING / PENDING deployments can be paused. Pass --skip-precheck to attempt the pause anyway.`,f.USAGE)}}catch(e){if(e instanceof n)throw e}let a=await ir(e.client,i);t.quiet?k(i):A({deployed_model:i,action:`pause`,...a},`json`)}}),zC=w({description:{"en-US":`Resume a paused model deployment (brings service back online)`,"zh-CN":`恢复已暂停的模型部署(使服务重新上线)`},auth:`console`,usageArgs:`--deployed-model <id> [--skip-precheck]`,flags:{deployedModel:{type:`string`,valueHint:`<id>`,description:{"en-US":`Deployed model identifier (required)`,"zh-CN":`已部署模型标识(必填)`},required:!0},skipPrecheck:{type:`switch`,description:{"en-US":`Skip the local STOPPED status precheck`,"zh-CN":`跳过本地 STOPPED 状态预检查`}}},exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --skip-precheck`,`--deployed-model dep-... --dry-run`],notes:[{"en-US":`Precheck verifies status is STOPPED before issuing the resume; pass --skip-precheck to bypass.`,"zh-CN":`发起恢复前会预检查部署状态是否为 STOPPED;可传入 --skip-precheck 跳过检查。`},{"en-US":`For mu/ptu plans, billing resumes once the service is back online.`,"zh-CN":`对于 mu/ptu 方案,服务重新上线后将恢复计费。`}],async run(e){let{settings:t,flags:r}=e,i=r.deployedModel;if(t.dryRun){A({action:`deploy.resume`,deployed_model:i},`json`);return}if(!r.skipPrecheck)try{let t=await Kt(e.client),r=tt(t,i);if(r){let e=(r.status??``).toUpperCase();if(e&&e!==`STOPPED`)throw new n(`Deployment ${i} is ${e}. Only STOPPED deployments can be resumed. Pass --skip-precheck to attempt the resume anyway.`,f.USAGE)}}catch(e){if(e instanceof n)throw e}let a=await rr(e.client,i);t.quiet?k(i):A({deployed_model:i,action:`resume`,...a},`json`)}});const BC={callerUacAccountId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Caller UAC account ID`,"zh-CN":`调用方 UAC 账号 ID`}},namespaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Product namespace ID (Token Plan default: namespace-1)`,"zh-CN":`产品 Namespace ID(Token Plan 默认:namespace-1)`}}},VC={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`,"zh-CN":`Workspace ID(环境变量:BAILIAN_WORKSPACE_ID,配置项:workspace_id)`}}},HC={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function UC(e){for(let[t,n]of Object.entries(b))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function WC(e){let t=UC(e);return HC[t]??HC.cn}function GC(e,t,r){let i=t.workspaceId||e.workspaceId;if(!i)throw new n(`Missing workspace ID.
2837
+ Set via: --workspace-id flag, env: BAILIAN_WORKSPACE_ID, or config: ${r} config set workspace_id <id>`,f.USAGE);return i}function KC(e,t){t.callerUacAccountId&&(e.CallerUacAccountId=t.callerUacAccountId),t.namespaceId&&(e.NamespaceId=t.namespaceId)}function qC(e,t,n){let r=ue(n),i=WC(e);return{host:i,endpoint:`https://${i}${t}${r?`?${r}`:``}`,queryString:r,queryParams:n}}async function JC(e){let{client:t,baseUrl:n,action:r,path:i,method:a,queryParams:o}=e,{host:s}=qC(n,i,o);return t.openApiQueryJson({host:s,path:i,action:r,version:`2026-02-10`,method:a,queryParams:o})}const YC=`/tokenplan/subscription/seat-detail`,XC={pageNo:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page number (default: 1)`,"zh-CN":`页码(默认:1)`}},pageSize:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size (default: 10)`,"zh-CN":`每页数量(默认:10)`}},...BC,status:{type:`array`,valueHint:`<status>`,description:{"en-US":`Seat status filter (repeatable): CREATING, NORMAL, LIMIT, RELEASE, STOP, REFUNDED`,"zh-CN":`席位状态筛选(可重复):CREATING、NORMAL、LIMIT、RELEASE、STOP、REFUNDED`}},statusListStr:{type:`string`,valueHint:`<json>`,description:{"en-US":`StatusList as JSON string, e.g. '["NORMAL"]'`,"zh-CN":`JSON 字符串格式的 StatusList,例如 '["NORMAL"]'`}},seatId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by seat ID`,"zh-CN":`按席位 ID 筛选`}},seatType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Seat tier: standard, pro, or max`,"zh-CN":`席位档位:standard、pro 或 max`}},queryAssigned:{type:`string`,valueHint:`<bool>`,description:{"en-US":`Filter by assignment: true=assigned, false=unassigned`,"zh-CN":`按分配状态筛选:true=已分配,false=未分配`}}};var ZC=w({description:{"en-US":`List Token Plan subscription seat details`,"zh-CN":`列出 Token Plan 订阅席位详情`},auth:`openapi`,usageArgs:`[flags]`,flags:XC,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=QC(n);if(t.dryRun){let{endpoint:t,queryParams:n}=qC(e.client.baseUrl,YC,i);A({endpoint:t,query:n},r);return}let a=await JC({client:e.client,baseUrl:e.client.baseUrl,action:`GetSubscriptionSeatDetails`,path:YC,method:`GET`,queryParams:i}),o=a.Data?.Items??[];t.quiet||r===`text`?$C(o,a.Data?.Total,a.Data?.PageNo,a.Data?.PageSize):A(a,r)}});function QC(e){let t={};if(e.pageNo!==void 0&&(t.PageNo=String(e.pageNo)),e.pageSize!==void 0&&(t.PageSize=String(e.pageSize)),KC(t,e),e.statusListStr&&(t.StatusListStr=e.statusListStr),e.status&&e.status.length>0&&(t.StatusList=e.status),e.seatId&&(t.SeatId=e.seatId),e.seatType&&(t.SeatType=e.seatType),typeof e.queryAssigned==`string`&&e.queryAssigned.length>0){let r=e.queryAssigned.toLowerCase();if(r!==`true`&&r!==`false`)throw new n(`--query-assigned must be 'true' or 'false'.`,f.USAGE);t.QueryAssigned=r}return t}function $C(e,t,n,r){if(e.length===0){k(`No seats found.`);return}let i=[j(`SeatId`,18),j(`Type`,10),j(`Status`,10),j(`Assigned`,12),j(`Account`,20)].join(` `);k(i),k(`-`.repeat(i.length));for(let t of e){let e=[j(t.SeatId??`-`,18),j(t.SpecType??`-`,10),j(t.Status??`-`,10),j(t.AssignedStatus??`-`,12),j(t.AccountName??t.AccountId??`-`,20)].join(` `);k(e)}t!==void 0&&(k(``),k(`Total: ${t}${n===void 0?``:` | Page: ${n}`}${r===void 0?``:` | PageSize: ${r}`}`))}const ew=`/tokenplan/api-keys`,tw={accountId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Target member account ID`,"zh-CN":`目标成员账号 ID`},required:!0},...VC,description:{type:`string`,valueHint:`<text>`,description:{"en-US":`API key description`,"zh-CN":`API Key 描述`}},...BC};var nw=w({description:{"en-US":`Create a Token Plan API key for a seat`,"zh-CN":`为席位创建 Token Plan API Key`},auth:`openapi`,usageArgs:`--account-id <id> --workspace-id <id> [flags]`,flags:tw,exampleArgs:[`--account-id acc_123 --workspace-id ws_456`,{"en-US":`--account-id acc_123 --workspace-id ws_456 --description 'Dev key'`,"zh-CN":`--account-id acc_123 --workspace-id ws_456 --description '开发密钥'`}],async run(e){let{identity:t,settings:n,flags:r}=e,i=T(n.output),a=GC(n,r,t.binName),o=rw(r,{accountId:r.accountId,workspaceId:a});if(n.dryRun){let{endpoint:t,queryParams:n}=qC(e.client.baseUrl,ew,o);A({endpoint:t,query:n},i);return}let s=await JC({client:e.client,baseUrl:e.client.baseUrl,action:`CreateTokenPlanKey`,path:ew,method:`POST`,queryParams:o});n.quiet||i===`text`?iw(s):A(s,i)}});function rw(e,t){let n={};return n.AccountId=t.accountId,n.WorkspaceId=t.workspaceId,e.description&&(n.Description=e.description),KC(n,e),n}function iw(e){let t=e.Data;if(!t){k(`API key created.`);return}k(`${j(`ApiKeyId`,14)} ${t.ApiKeyId??`-`}`),k(`${j(`MaskedApiKey`,14)} ${t.MaskedApiKey??`-`}`),t.Description&&k(`${j(`Description`,14)} ${t.Description}`),t.PlainApiKey&&(k(``),k(`PlainApiKey (shown once): ${t.PlainApiKey}`))}const aw=`/tokenplan/subscription/seat-assignments`,ow={...VC,seatType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Seat tier: standard, pro, or max`,"zh-CN":`席位档位:standard、pro 或 max`},required:!0},accountId:{type:`array`,valueHint:`<id>`,description:{"en-US":`Target member account ID (repeatable)`,"zh-CN":`目标成员账号 ID(可重复)`}},...BC,locale:{type:`string`,valueHint:`<locale>`,description:{"en-US":`Language: zh-CN or en-US`,"zh-CN":`语言:zh-CN 或 en-US`}}};var sw=w({description:{"en-US":`Batch assign Token Plan seats to members`,"zh-CN":`批量向成员分配 Token Plan 席位`},auth:`openapi`,usageArgs:`--workspace-id <id> --seat-type <type> --account-id <id> [flags]`,flags:ow,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=cw(r,GC(n,r,t.binName));if(n.dryRun){let{endpoint:t,queryParams:n}=qC(e.client.baseUrl,aw,a);A({endpoint:t,query:n},i);return}let o=await JC({client:e.client,baseUrl:e.client.baseUrl,action:`BatchAssignSeats`,path:aw,method:`POST`,queryParams:a});n.quiet||i===`text`?k(`Seats assigned successfully.`):A(o,i)}});function cw(e,t){let n={};return n.WorkspaceId=t,e.seatType&&(n.SeatType=e.seatType),KC(n,e),e.locale&&(n.Locale=e.locale),e.accountId&&e.accountId.length>0&&(n.AccountIds=e.accountId),n}const lw=`/tokenplan/organization/member-additions`,uw={accountName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Member display name`,"zh-CN":`成员显示名称`},required:!0},orgId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Organization ID`,"zh-CN":`组织 ID`},required:!0},orgRoleCode:{type:`string`,valueHint:`<code>`,description:{"en-US":`Organization role: ORG_ADMIN or ORG_MEMBER (default: ORG_MEMBER)`,"zh-CN":`组织角色:ORG_ADMIN 或 ORG_MEMBER(默认:ORG_MEMBER)`}},specType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Seat tier to assign on creation: standard, pro, or max`,"zh-CN":`创建时分配的席位档位:standard、pro 或 max`}},...BC};var dw=w({description:{"en-US":`Add a member to a Token Plan organization`,"zh-CN":`向 Token Plan 组织添加成员`},auth:`openapi`,usageArgs:`--account-name <name> --org-id <id> [flags]`,flags:uw,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=fw(n);if(t.dryRun){let{endpoint:t,queryParams:n}=qC(e.client.baseUrl,lw,i);A({endpoint:t,query:n},r);return}let a=await JC({client:e.client,baseUrl:e.client.baseUrl,action:`AddOrganizationMember`,path:lw,method:`POST`,queryParams:i});t.quiet||r===`text`?pw(a):A(a,r)}});function fw(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),KC(t,e),t}function pw(e){let t=e.Data;if(!t){k(`Member added.`);return}k(`${j(`AccountId`,14)} ${t.AccountId??`-`}`),k(`${j(`SeatAssigned`,14)} ${String(t.SeatAssigned??`-`)}`)}const mw=`zeldaEasy.broadscope-bailian.token-plan.detail`,hw=`zeldaEasy.bailian-commerce.tokenPlan.queryTokenPlanEquityInfo`;function gw(e,t){let n=fr(e)[t];return Array.isArray(n)?n:[]}function _w(e,t){let n=[];for(let r of e){if(r.hasResourcePack!==!0)continue;let e=r.planCodes??[],i=t.find(t=>t.equityType&&e.includes(t.equityType)),a=i?.equityType??e[0]??``,o={planCode:a,title:r.title??a,type:r.type??``,status:i?`issued`:`issuing`,quotaUnit:r.quotaUnit??r.priceInfo?.unit??``};if(!i){n.push(o);continue}i.instanceId&&(o.instanceId=i.instanceId);let s=T_(i.totalQuota);s!==void 0&&(o.totalQuota=s);let c=T_(i.availableQuota);c!==void 0&&(o.availableQuota=c),s!==void 0&&c!==void 0&&(o.usedQuota=Math.max(s-c,0),s>0&&(o.usedPercent=Math.round(o.usedQuota/s*1e3)/10));let l=T_(i.instanceStartTime);l!==void 0&&(o.instanceStartTime=l);let u=T_(i.instanceEndTime);u!==void 0&&(o.instanceEndTime=u),n.push(o)}return n}function vw(e){let t={label:`${e.title} (${e.planCode})`,emptyMessage:e.status===`issuing`?`Quota is being issued; issuance can take up to 5 minutes.`:`No positive quota total reported; check the Bailian Token Plan console.`};if(e.status===`issuing`)return t;if(e.totalQuota!==void 0&&e.usedQuota!==void 0){let n=e.quotaUnit?` ${e.quotaUnit}`:``;t.detail=`Used: ${U(e.usedQuota)} / ${U(e.totalQuota)}${n}`,e.totalQuota>0&&(t.percentage=e.usedQuota/e.totalQuota)}return e.instanceEndTime!==void 0&&(t.resetTime=e.instanceEndTime),t}var yw=w({description:{"en-US":`Show Token Plan harness entitlement quota usage`,"zh-CN":`查看 Token Plan harness 权益额度用量`},auth:`console`,usageArgs:`[flags]`,flags:{type:{type:`string`,valueHint:`<type>`,choices:[`official_tool`,`infrastructure`],description:{"en-US":`Filter harness list by type: official_tool, infrastructure`,"zh-CN":`按类型筛选 harness 列表:official_tool、infrastructure`}}},exampleArgs:[``,`--type official_tool`,`--output json`],async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.type?{type:n.type}:{},a={queryTokenPlanEquityInfoRequest:{requestId:ai()}};if(t.dryRun){A({requests:[{api:mw,data:i},{api:hw,data:a}]},r);return}let[o,s]=await Promise.all([e.client.console(mw,i),e.client.console(hw,a)]),c=_w(gw(o,`items`),gw(s,`tokenPlanEquityInfos`));if(r===`json`){A({generatedAt:Date.now(),items:c},r);return}if(c.length===0){process.stdout.write(`No harness with entitlement quota found.
2838
+ `);return}O_(`Token Plan Harness Quota`,c.map(vw),Date.now())}});function bw(e){return`version: "1"
2840
2839
 
2841
2840
  providers:
2842
2841
  bailian:
@@ -2863,19 +2862,19 @@ agents:
2863
2862
  environment: dev
2864
2863
  tools:
2865
2864
  builtin: [bash, read, glob, grep]
2866
- `}var kC=w({description:{"en-US":`Create an agents.yaml template`,"zh-CN":`创建 agents.yaml 模板`},auth:`none`,usageArgs:`[--agent-name <name>] [--file <path>] [--force]`,flags:{agentName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Name of the first agent (default: assistant)`,"zh-CN":`第一个 Agent 的名称(默认:assistant)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Output config path (default: agents.yaml)`,"zh-CN":`输出配置路径(默认:agents.yaml)`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing config file`,"zh-CN":`覆盖已有配置文件`}}},exampleArgs:[``,`--agent-name assistant`],async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.agentName??`assistant`,o=r.file??`agents.yaml`;if(M(o)&&!r.force)throw new n(`${P(o)} already exists.`,f.USAGE,`Pass --force to overwrite.`);let s=`.gitignore`;if(t.dryRun){let e=!0;M(s)&&(e=!(await Ui(s,`utf8`)).includes(`agents.state.json`)),A({would_create:o,provider:`bailian`,agent:a,would_update_gitignore:e},i);return}let c=OC({agentName:a});if(await qi(o,c,`utf8`),M(s)){let e=await Ui(s,`utf8`);e.includes(`agents.state.json`)||await qi(s,e+`
2865
+ `}var xw=w({description:{"en-US":`Create an agents.yaml template`,"zh-CN":`创建 agents.yaml 模板`},auth:`none`,usageArgs:`[--agent-name <name>] [--file <path>] [--force]`,flags:{agentName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Name of the first agent (default: assistant)`,"zh-CN":`第一个 Agent 的名称(默认:assistant)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Output config path (default: agents.yaml)`,"zh-CN":`输出配置路径(默认:agents.yaml)`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing config file`,"zh-CN":`覆盖已有配置文件`}}},exampleArgs:[``,`--agent-name assistant`],async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.agentName??`assistant`,o=r.file??`agents.yaml`;if(M(o)&&!r.force)throw new n(`${P(o)} already exists.`,f.USAGE,`Pass --force to overwrite.`);let s=`.gitignore`;if(t.dryRun){let e=!0;M(s)&&(e=!(await Ki(s,`utf8`)).includes(`agents.state.json`)),A({would_create:o,provider:`bailian`,agent:a,would_update_gitignore:e},i);return}let c=bw({agentName:a});if(await Xi(o,c,`utf8`),M(s)){let e=await Ki(s,`utf8`);e.includes(`agents.state.json`)||await Xi(s,e+`
2867
2866
  # agents
2868
2867
  agents.state.json
2869
2868
  .openagentpack/versions/
2870
2869
  .env
2871
- `,`utf8`)}else await qi(s,`# agents
2870
+ `,`utf8`)}else await Xi(s,`# agents
2872
2871
  agents.state.json
2873
2872
  .openagentpack/versions/
2874
2873
  .env
2875
- `,`utf8`);i===`json`?A({created:o,provider:`bailian`,agent:a},i):(k(`Created ${P(o)}`),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 AC=`/api/v1/agentstudio`,jC=[.../* @__PURE__ */ new Set([...Object.values(Qi).flatMap(e=>e.map(e=>e.key)),`BAILIAN_API_KEY`,`BAILIAN_BASE_URL`,`CLAUDE_API_KEY`,`QODER_API_KEY`])],MC={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.`},NC={"en-US":`bl managed-agent supports the Bailian provider only; configurations containing other providers are rejected.`,"zh-CN":`bl managed-agent 仅支持百炼 Provider;包含其他 Provider 的配置会被拒绝。`},K=[NC,{"en-US":"Bailian credentials come from bl's auth chain: --api-key > DASHSCOPE_API_KEY > `bl auth login` (active config profile).","zh-CN":"百炼凭证来自 bl 鉴权链:--api-key > DASHSCOPE_API_KEY > `bl auth login`(当前激活的配置 Profile)。"},{"en-US":`Resolved credentials are injected into the SDK in-memory and cleared from the environment; they never persist in process env.`,"zh-CN":`解析后的凭证仅在内存中注入 SDK,并从环境中清除;不会持久保留在进程环境变量中。`}],PC=[NC,{"en-US":`Runs fully offline against local files: no login or provider credentials required.`,"zh-CN":`完全离线处理本地文件:无需登录或提供 Provider 凭证。`}];function FC(){ia();for(let e of jC)process.env[e]===void 0&&(process.env[e]=``)}function IC(e,t,n={}){let r=e.bailian;if(!r||typeof r!=`object`)return;let i=r,a=t.client.exportApiCredential();if(a&&(i.api_key=a.token),`base_url`in i&&(n.overrideBaseUrl||!i.base_url)){let e=t.client.baseUrl.replace(/\/+$/,``);i.base_url=e.endsWith(AC)?e:`${e}${AC}`}`workspace_id`in i&&!i.workspace_id&&t.settings.workspaceId&&(i.workspace_id=t.settings.workspaceId)}function LC(){for(let e of jC)delete process.env[e]}function RC(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 zC(e,t){for(let[r,i]of Object.entries(e)){if(t&&!t.includes(r)||!i||typeof i!=`object`)continue;let e=i;if(!(`api_key`in e))continue;let a=e.api_key;if(!(typeof a==`string`&&a.trim()))throw new n(`Provider '${r}' is configured but its API key is empty.`,f.AUTH,MC[r]??`Provide credentials for provider '${r}'.`)}}function BC(e,t){let n=P(e);return{projectId:t??Di(Oi(n))}}async function VC(e,t,n){let r=P(e),i=new $i({configPath:r,statePath:t}).getStatePath(BC(r,n));return ta.load(i)}let HC=!1;function UC(e){if(HC)return;let t=Zi.setDefaultFetch;typeof t==`function`&&(t(ke(e)),HC=!0)}const WC=`bailian`;async function GC(e,t,n={}){FC();let r=await lo(t,n);return RC(r.config.providers),IC(r.config.providers,e,{overrideBaseUrl:n.overrideBailianBaseUrl}),LC(),KC(r.config.providers),(n.credentials??`all`)!==`none`&&zC(r.config.providers),r}async function q(e,t,n={}){UC(e);let{config:r,configPath:i,projectName:a}=await GC(e,t,n),o=await VC(i,n.statePath,a);return{...ca({projectName:a,config:r,state:o,configPath:i,providers:r.providers}),configPath:i}}function KC(e){let t=Object.keys(e).filter(e=>e!==WC);if(t.length>0){let e=t.join(`, `);throw new n(`bl managed-agent only supports provider '${WC}'; remove unsupported providers: ${e}. / bl managed-agent 仅支持 Provider '${WC}';请移除不支持的 Provider:${e}。`,f.USAGE)}if(!(`bailian`in e))throw new n(`bl managed-agent requires a '${WC}' provider configuration. / bl managed-agent 需要配置 Provider '${WC}'。`,f.USAGE)}function qC(e){let t=e;return typeof t.statusCode==`number`&&typeof t.responseBody==`string`}function JC(e){try{let t=JSON.parse(e);if(t&&typeof t==`object`)return t}catch{}return{message:e.trim()||void 0}}function YC(e){return/did not complete within the timeout/i.test(e.message)}function XC(e,t){let n=e.filter(e=>e.severity===`error`),r=n[0];if(!r)return t;let i=r.code?.trim()?`[${r.code}] `:``,a=n.length-1,o=a>0?` (+${a} more errors)`:``;return`${i}${r.message}${o}`}function ZC(e,t,r){if(e instanceof n)return new n(e.message,e.exitCode,t,{api:e.api,rawResponse:e.rawResponse,cause:e.cause});if(e instanceof Error)return new n(e.message,f.GENERAL,t,{cause:e});let i=typeof e==`string`&&e.trim()?e:r;return new n(i,f.GENERAL,t)}async function J(e){try{return await e()}catch(e){throw e instanceof n?e:e instanceof na?YC(e)?new n(e.message,f.TIMEOUT,"The session may still be running — check `bl managed-agent session get --session-id <id>` or `session events`."):new n(e.message,f.USAGE):e instanceof Error&&qC(e)?Zt(e.statusCode,JC(e.responseBody)):e instanceof TypeError&&e.message===`fetch failed`?e:e instanceof Error?new n(e.message,f.GENERAL):e}}var QC=w({description:{"en-US":`Validate an agents.yaml configuration (offline)`,"zh-CN":`离线验证 agents.yaml 配置`},auth:`none`,usageArgs:`[--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[``,`--file agents.yaml`],notes:PC,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`,o=await J(async()=>{let{config:t}=await GC(e,a,{credentials:`none`});return Eo(t)}),s=o.filter(e=>e.severity===`error`).length;if(i===`json`)A({valid:s===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}`)}s===0&&k(`Configuration is valid.`)}if(s>0)throw new n(XC(o,`Validation failed with ${s} error(s).`),f.GENERAL)}});function $C(e){return`${e.type}.${e.name} (${e.provider})`}async function Y(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 ew(e){process.stderr.write(`${e.message}\n`)}var tw=w({description:{"en-US":`Show what changes would be applied to agent infrastructure`,"zh-CN":`显示将应用到 Agent 基础设施的变更`},auth:`apiKey`,usageArgs:`[--file <path>] [--no-refresh] [--refresh-only]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},noRefresh:{type:`switch`,description:{"en-US":`Skip refreshing state from remote before planning`,"zh-CN":`规划前跳过从远端刷新状态`}},refreshOnly:{type:`switch`,description:{"en-US":`Refresh state and show drift without planning remote mutations`,"zh-CN":`刷新状态并显示漂移,不规划远端变更`}}},exampleArgs:[``,`--no-refresh`],notes:[...K,{"en-US":`--no-refresh and --dry-run plan offline from local config and state: no remote requests, no state writes, provider keys are not checked.`,"zh-CN":`--no-refresh 和 --dry-run 基于本地配置与 State 离线规划:不发送远端请求、不写入 State,也不检查 Provider Key。`}],async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`,o=!!r.noRefresh||t.dryRun,s=(await J(()=>Y(async()=>{let t=await q(e,a,{credentials:o?`none`:`all`});return ro(t,{provider:`bailian`,refresh:!o,quiet:i===`json`,onFeedback:i===`json`?void 0:ew})}))).plan,c=s.diagnostics.some(e=>e.severity===`error`),l=XC(s.diagnostics,`Plan contains errors.`);if(i===`json`){if(A(s,i),c)throw new n(l,f.GENERAL);return}for(let e of s.diagnostics)k(`[${e.severity}] ${e.code}: ${e.message}`);if(c)throw new n(l,f.GENERAL);let u=s.actions.filter(e=>e.action===`create`),d=s.actions.filter(e=>e.action===`update`),p=s.actions.filter(e=>e.action===`delete`);if(u.length+d.length+p.length===0){k(`No changes. Infrastructure is up-to-date.`),r.refreshOnly&&k(`Refresh-only mode: no remote mutations were performed.`);return}k(`
2874
+ `,`utf8`);i===`json`?A({created:o,provider:`bailian`,agent:a},i):(k(`Created ${P(o)}`),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 Sw=`/api/v1/agentstudio`,Cw=[.../* @__PURE__ */ new Set([...Object.values(ta).flatMap(e=>e.map(e=>e.key)),`BAILIAN_API_KEY`,`BAILIAN_BASE_URL`,`CLAUDE_API_KEY`,`QODER_API_KEY`])],ww={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.`},Tw={"en-US":`bl managed-agent supports the Bailian provider only; configurations containing other providers are rejected.`,"zh-CN":`bl managed-agent 仅支持百炼 Provider;包含其他 Provider 的配置会被拒绝。`},G=[Tw,{"en-US":"Bailian credentials come from bl's auth chain: --api-key > DASHSCOPE_API_KEY > `bl auth login` (active config profile).","zh-CN":"百炼凭证来自 bl 鉴权链:--api-key > DASHSCOPE_API_KEY > `bl auth login`(当前激活的配置 Profile)。"},{"en-US":`Resolved credentials are injected into the SDK in-memory and cleared from the environment; they never persist in process env.`,"zh-CN":`解析后的凭证仅在内存中注入 SDK,并从环境中清除;不会持久保留在进程环境变量中。`}],Ew=[Tw,{"en-US":`Runs fully offline against local files: no login or provider credentials required.`,"zh-CN":`完全离线处理本地文件:无需登录或提供 Provider 凭证。`}];function Dw(){sa();for(let e of Cw)process.env[e]===void 0&&(process.env[e]=``)}function Ow(e,t,n={}){let r=e.bailian;if(!r||typeof r!=`object`)return;let i=r,a=t.client.exportApiCredential();if(a&&(i.api_key=a.token),`base_url`in i&&(n.overrideBaseUrl||!i.base_url)){let e=t.client.baseUrl.replace(/\/+$/,``);i.base_url=e.endsWith(Sw)?e:`${e}${Sw}`}`workspace_id`in i&&!i.workspace_id&&t.settings.workspaceId&&(i.workspace_id=t.settings.workspaceId)}function kw(){for(let e of Cw)delete process.env[e]}function Aw(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 jw(e,t){for(let[r,i]of Object.entries(e)){if(t&&!t.includes(r)||!i||typeof i!=`object`)continue;let e=i;if(!(`api_key`in e))continue;let a=e.api_key;if(!(typeof a==`string`&&a.trim()))throw new n(`Provider '${r}' is configured but its API key is empty.`,f.AUTH,ww[r]??`Provide credentials for provider '${r}'.`)}}function Mw(e,t){let n=P(e);return{projectId:t??Ai(ji(n))}}async function Nw(e,t,n){let r=P(e),i=new na({configPath:r,statePath:t}).getStatePath(Mw(r,n));return ia.load(i)}let Pw=!1;function Fw(e){if(Pw)return;let t=ea.setDefaultFetch;typeof t==`function`&&(t(ke(e)),Pw=!0)}const Iw=`bailian`;async function Lw(e,t,n={}){Dw();let r=await po(t,n);return Aw(r.config.providers),Ow(r.config.providers,e,{overrideBaseUrl:n.overrideBailianBaseUrl}),kw(),Rw(r.config.providers),(n.credentials??`all`)!==`none`&&jw(r.config.providers),r}async function K(e,t,n={}){Fw(e);let{config:r,configPath:i,projectName:a}=await Lw(e,t,n),o=await Nw(i,n.statePath,a);return{...da({projectName:a,config:r,state:o,configPath:i,providers:r.providers}),configPath:i}}function Rw(e){let t=Object.keys(e).filter(e=>e!==Iw);if(t.length>0){let e=t.join(`, `);throw new n(`bl managed-agent only supports provider '${Iw}'; remove unsupported providers: ${e}. / bl managed-agent 仅支持 Provider '${Iw}';请移除不支持的 Provider:${e}。`,f.USAGE)}if(!(`bailian`in e))throw new n(`bl managed-agent requires a '${Iw}' provider configuration. / bl managed-agent 需要配置 Provider '${Iw}'。`,f.USAGE)}function zw(e){let t=e;return typeof t.statusCode==`number`&&typeof t.responseBody==`string`}function Bw(e){try{let t=JSON.parse(e);if(t&&typeof t==`object`)return t}catch{}return{message:e.trim()||void 0}}function Vw(e){return/did not complete within the timeout/i.test(e.message)}function Hw(e,t){let n=e.filter(e=>e.severity===`error`),r=n[0];if(!r)return t;let i=r.code?.trim()?`[${r.code}] `:``,a=n.length-1,o=a>0?` (+${a} more errors)`:``;return`${i}${r.message}${o}`}function Uw(e,t,r){if(e instanceof n)return new n(e.message,e.exitCode,t,{api:e.api,rawResponse:e.rawResponse,cause:e.cause});if(e instanceof Error)return new n(e.message,f.GENERAL,t,{cause:e});let i=typeof e==`string`&&e.trim()?e:r;return new n(i,f.GENERAL,t)}async function q(e){try{return await e()}catch(e){throw e instanceof n?e:e instanceof aa?Vw(e)?new n(e.message,f.TIMEOUT,"The session may still be running — check `bl managed-agent session get --session-id <id>` or `session events`."):new n(e.message,f.USAGE):e instanceof Error&&zw(e)?Xt(e.statusCode,Bw(e.responseBody)):e instanceof TypeError&&e.message===`fetch failed`?e:e instanceof Error?new n(e.message,f.GENERAL):e}}var Ww=w({description:{"en-US":`Validate an agents.yaml configuration (offline)`,"zh-CN":`离线验证 agents.yaml 配置`},auth:`none`,usageArgs:`[--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[``,`--file agents.yaml`],notes:Ew,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`,o=await q(async()=>{let{config:t}=await Lw(e,a,{credentials:`none`});return ko(t)}),s=o.filter(e=>e.severity===`error`).length;if(i===`json`)A({valid:s===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}`)}s===0&&k(`Configuration is valid.`)}if(s>0)throw new n(Hw(o,`Validation failed with ${s} error(s).`),f.GENERAL)}});function Gw(e){return`${e.type}.${e.name} (${e.provider})`}async function J(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 Kw(e){process.stderr.write(`${e.message}\n`)}var qw=w({description:{"en-US":`Show what changes would be applied to agent infrastructure`,"zh-CN":`显示将应用到 Agent 基础设施的变更`},auth:`apiKey`,usageArgs:`[--file <path>] [--no-refresh] [--refresh-only]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},noRefresh:{type:`switch`,description:{"en-US":`Skip refreshing state from remote before planning`,"zh-CN":`规划前跳过从远端刷新状态`}},refreshOnly:{type:`switch`,description:{"en-US":`Refresh state and show drift without planning remote mutations`,"zh-CN":`刷新状态并显示漂移,不规划远端变更`}}},exampleArgs:[``,`--no-refresh`],notes:[...G,{"en-US":`--no-refresh and --dry-run plan offline from local config and state: no remote requests, no state writes, provider keys are not checked.`,"zh-CN":`--no-refresh 和 --dry-run 基于本地配置与 State 离线规划:不发送远端请求、不写入 State,也不检查 Provider Key。`}],async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`,o=!!r.noRefresh||t.dryRun,s=(await q(()=>J(async()=>{let t=await K(e,a,{credentials:o?`none`:`all`});return oo(t,{provider:`bailian`,refresh:!o,quiet:i===`json`,onFeedback:i===`json`?void 0:Kw})}))).plan,c=s.diagnostics.some(e=>e.severity===`error`),l=Hw(s.diagnostics,`Plan contains errors.`);if(i===`json`){if(A(s,i),c)throw new n(l,f.GENERAL);return}for(let e of s.diagnostics)k(`[${e.severity}] ${e.code}: ${e.message}`);if(c)throw new n(l,f.GENERAL);let u=s.actions.filter(e=>e.action===`create`),d=s.actions.filter(e=>e.action===`update`),p=s.actions.filter(e=>e.action===`delete`);if(u.length+d.length+p.length===0){k(`No changes. Infrastructure is up-to-date.`),r.refreshOnly&&k(`Refresh-only mode: no remote mutations were performed.`);return}k(`
2876
2875
  Planned actions:
2877
- `);for(let e of u)k(` + ${$C(e.address)}`);for(let e of d)k(` ~ ${$C(e.address)}`),e.reason&&k(` ${e.reason}`);for(let e of p)k(` - ${$C(e.address)}`);k(`\nPlan: ${u.length} to create, ${d.length} to update, ${p.length} to destroy.`),r.refreshOnly&&k(`Refresh-only mode: no remote mutations will be performed.`)}}),nw=w({description:{"en-US":`Apply planned changes to create/update/delete agent resources`,"zh-CN":`应用规划的变更,创建、更新或删除 Agent 资源`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This applies the current plan and may create, update, or delete remote managed Agent resources.`,"zh-CN":`该操作会应用当前计划,可能创建、更新或删除远端托管 Agent 资源。`}},usageArgs:`[--file <path>] [--concurrency <n>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},noRefresh:{type:`switch`,description:{"en-US":`Skip refreshing state from remote before planning`,"zh-CN":`规划前跳过从远端刷新状态`}},concurrency:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max independent resources to apply in parallel (default 6, max 10)`,"zh-CN":`最大并行应用资源数(默认:6,最多:10)`}}},exampleArgs:[`--yes`],notes:K,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`;if(t.dryRun){A({would_apply:{provider:`bailian`,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 J(()=>Y(async()=>{let t=await q(e,a);return ro(t,{provider:`bailian`,refresh:!r.noRefresh,quiet:!0,onFeedback:ew})})),s=o.plan,c=e=>{i===`json`?process.stderr.write(`${e}\n`):k(e)},l=s.diagnostics.filter(e=>e.severity===`error`);if(l.length>0){for(let e of l)c(`[error] ${e.code}: ${e.message}`);throw new n(XC(l,`Cannot apply: resolve the errors above first.`),f.GENERAL)}let u=s.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}for(let e of u)c(` ${e.action===`create`?`+`:e.action===`update`?`~`:`-`} ${$C(e.address)}`);let d=await J(()=>Y(()=>xa(o,{onFeedback:ew,policy:`force`,concurrency:r.concurrency}))),p=d.results.filter(e=>e.status===`success`).length,m=d.results.filter(e=>e.status===`failed`),h=m.length,g=d.results.filter(e=>e.status===`skipped`).length;if(i===`json`?A({succeeded:p,failed:h,skipped:g,results:d.results},i):k(`\nApply finished: ${p} succeeded, ${h} failed, ${g} skipped.`),h>0){let e=m.find(e=>e.error);throw new n(e?.error??`Apply failed.`,f.GENERAL)}}}),rw=w({description:{"en-US":`Destroy all managed agent resources tracked in state`,"zh-CN":`销毁 State 中跟踪的全部托管 Agent 资源`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes every managed Agent resource tracked in state; --cascade may also delete dependent resources.`,"zh-CN":`该操作会删除 State 中跟踪的全部托管 Agent 资源;--cascade 还可能删除依赖资源。`}},usageArgs:`[--file <path>] [--cascade]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},cascade:{type:`switch`,description:{"en-US":`Auto-delete dependent resources (e.g. sessions referencing an environment)`,"zh-CN":`自动删除依赖资源(例如引用某个环境的 Session)`}}},exampleArgs:[`--yes`,`--yes --cascade`],notes:K,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`;if(t.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 J(()=>Y(async()=>{let t=await q(e,a),n=no(t);return{...n,resources:n.resources.filter(e=>e.address.provider===`bailian`),defaultMemoryStores:(n.defaultMemoryStores??[]).filter(e=>e.provider===`bailian`)}})),s=o.resources;if(s.length===0){i===`json`?A({destroyed:0,total:0},i):k(`No resources in state. Nothing to destroy.`);return}for(let e of s){let t=` - ${$C(e.address)} [${e.remote_id}]`;i===`json`?process.stderr.write(`${t}\n`):k(t)}let c=await J(()=>Y(()=>ga(o,{cascade:r.cascade,onCascadeRequired:async()=>!!r.cascade,onResourceResult:e=>{let t=$C(e.resource.address);process.stderr.write(` ${e.status===`success`?`✓`:`✗`} ${t}\n`)}})));if(i===`json`)A({destroyed:c.destroyed,total:c.resources.length},i);else{let e=c.partial?`Destroy incomplete`:`Destroy complete`;k(`\n${e}. ${c.destroyed}/${c.resources.length} resources removed.`)}if(c.partial){let e=c.results.find(e=>e.status!==`success`);throw new n(e?.error||`Destroy incomplete: ${c.destroyed}/${c.resources.length} resources removed.`,f.GENERAL)}}});const iw=`@openagentpack/playground`,aw=Do(ai),ow=/running at http:\/\/localhost:(\d+)/i;async function sw(e){lw();let t=e.port??4848;if(!Number.isInteger(t)||t<=0||t>65535)throw new n(`Invalid --port '${t}'.`,f.USAGE);let r=P(e.surface===`workbench`?e.project??`.`:e.file??`agents.yaml`),i=ei(`sha256`).update(r).digest(`hex`).slice(0,16),a=await uw(),o=await gw(t);if(o){if(o.projectId===i&&(a.version===void 0||o.version===a.version)){k(`Workbench already running at http://localhost:${t} (pid ${o.pid}).`),await vw(t,e.surface,e.agent,e.open);return}if(!await _w(o,t))throw new n(`Could not stop the existing Workbench process (pid ${o.pid}) on port ${t}.`,f.GENERAL,`Stop it manually or choose another --port.`)}let s=mw(e,t,r);a.fetched&&k(`Fetching ${iw} (first run may take a moment)...`);let c=oi(a.command,a.args,{env:s,stdio:[`inherit`,`pipe`,`inherit`]}),l=xw(c);try{let r=await hw(c,t,3e4,i);if(r===null)throw new n(`Workbench did not become ready in time. Check the logs above, then open http://localhost:${t}.`,f.GENERAL);k(`Workbench ready at http://localhost:${r}`),await vw(r,e.surface,e.agent,e.open);let a=await Sw(c);if(a!==0)throw new n(`Workbench exited with code ${a}.`,f.GENERAL)}finally{l()}}function cw(e,t,n){if(t.status!==`valid`)return{url:e};let r=(t.agents??[]).map(e=>e.agent?.id?.trim()).filter(e=>!!e),i=n?.trim();return i?r.includes(i)?{url:`${e}/agents/${encodeURIComponent(i)}/preview`}:{url:e,warning:`Agent '${i}' was not found. Opening the project Workbench instead.`}:r.length===1?{url:`${e}/agents/${encodeURIComponent(r[0])}/preview`}:r.length>1?{url:e,warning:`This project declares multiple Agents. Opening the Workbench; rerun with --agent <id> for Preview.`}:{url:e}}function lw(){let e=Number(process.versions.node.split(`.`)[0]);if(!(Number.isFinite(e)&&e>=22))throw new n(`Managed Agent Workbench requires Node.js 22 or later.`,f.USAGE,`Upgrade Node.js for Workbench; other Bailian CLI commands continue to support Node.js 18.17+.`)}async function uw(){let e=process.env.BAILIAN_MANAGED_AGENT_PLAYGROUND_BIN?.trim()||process.env.AGENTS_PLAYGROUND_BIN?.trim();if(e){if(!M(e))throw new n(`Configured Workbench binary does not exist: ${e}`,f.USAGE);return{command:process.execPath,args:[e],fetched:!1}}let t=process.env.BAILIAN_MANAGED_AGENT_PLAYGROUND_VERSION?.trim()||`latest`,{stdout:r}=await aw(`npm`,[`view`,`${iw}@${t}`,`version`,`--json`,`--prefer-online`,`--fetch-retries=0`,`--fetch-timeout=10000`],{timeout:15e3,maxBuffer:1048576}),i;try{i=JSON.parse(r)}catch{i=void 0}if(typeof i!=`string`||!/^\d+\.\d+\.\d+(?:-[\da-zA-Z.-]+)?(?:\+[\da-zA-Z.-]+)?$/.test(i))throw new n(`npm did not return a single valid Playground version. Specify an exact version or dist-tag. / npm 未返回唯一有效的 Playground 版本号。请指定精确版本或 dist-tag。`,f.GENERAL);let a=fw();if(a?.version===i)return a;let o=pw(process.cwd());return o&&dw(P(Oi(o),`../../package.json`))===i?{command:process.execPath,args:[o],version:i,fetched:!1}:{command:`npx`,args:[`-y`,`${iw}@${i}`],version:i,fetched:!0}}function dw(e){try{return JSON.parse(Si(e,`utf8`)).version}catch{return}}function fw(){try{let t=e(import.meta.url).resolve(`${iw}/package.json`),n=JSON.parse(Si(t,`utf8`)),r=typeof n.bin==`string`?n.bin:n.bin?.[`agents-playground`];if(!r)return;let i=P(Oi(t),r);return M(i)?{command:process.execPath,args:[i],version:n.version,fetched:!1}:void 0}catch{return}}function pw(e){let t=e;for(let e=0;e<10;e+=1){let e=P(t,`packages/playground/dist/bin/playground.js`);if(M(e))return e;let n=Oi(t);if(n===t)break;t=n}}function mw(e,t,n){let r=e.client.exportApiCredential(),i={...process.env,PORT:String(t),AGENTS_PLAYGROUND_TOKEN:ti(32).toString(`hex`)};e.surface===`workbench`?(delete i.AGENTS_CONFIG_PATH,i.AGENTS_PROJECT_ROOT=n):(delete i.AGENTS_PROJECT_ROOT,i.AGENTS_CONFIG_PATH=n),r&&(i.DASHSCOPE_API_KEY=r.token);let a=e.client.baseUrl.replace(/\/+$/,``);return i.BAILIAN_BASE_URL=a.endsWith(`/api/v1/agentstudio`)?a:`${a}/api/v1/agentstudio`,e.settings.workspaceId&&(i.BAILIAN_WORKSPACE_ID=e.settings.workspaceId),i}async function hw(e,t,n,r){let i=t,a=``;e.stdout?.on(`data`,e=>{process.stdout.write(e),a+=e.toString();let t=a.match(ow);t?.[1]&&(i=Number(t[1]))});let o=Date.now()+n;for(;Date.now()<=o;){if(e.exitCode!==null)return null;try{let e=await fetch(`http://localhost:${i}/health`,{signal:AbortSignal.timeout(1e3)});if((e.ok?await e.json():void 0)?.playground?.project_id===r)return i}catch{}await new Promise(e=>setTimeout(e,300))}return null}async function gw(e){try{let t=await fetch(`http://localhost:${e}/health`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return null;let n=await t.json();return n.playground?.pid?{version:n.playground.version??`unknown`,pid:n.playground.pid,projectId:n.playground.project_id}:null}catch{return null}}async function _w(e,t){k(`Replacing Workbench v${e.version} (pid ${e.pid}) on port ${t}...`);try{process.kill(e.pid,`SIGTERM`)}catch{return!0}for(let e=0;e<30;e+=1)if(await new Promise(e=>setTimeout(e,100)),!await gw(t))return!0;return!1}async function vw(e,t,n,r){if(!r)return;let i=t===`workbench`?{url:`http://localhost:${e}`}:await yw(e,n);i.warning&&k(`Warning: ${i.warning}`),bw(i.url)}async function yw(e,t){let n=`http://localhost:${e}`;try{let e=await fetch(`${n}/api/project`,{signal:AbortSignal.timeout(3e3)});return e.ok?cw(n,await e.json(),t):{url:n}}catch{return{url:n}}}function bw(e){let t=process.platform===`darwin`?`open`:process.platform===`win32`?`start`:`xdg-open`,n=process.platform===`win32`?[``,e]:[e];try{oi(t,n,{stdio:`ignore`,detached:!0,shell:process.platform===`win32`}).unref()}catch{k(`Could not open a browser automatically. Visit ${e}`)}}function xw(e){let t=()=>e.kill(`SIGINT`),n=()=>e.kill(`SIGTERM`);return process.on(`SIGINT`,t),process.on(`SIGTERM`,n),()=>{process.off(`SIGINT`,t),process.off(`SIGTERM`,n)}}function Sw(e){return e.exitCode===null?new Promise((t,n)=>{e.once(`exit`,e=>t(e??0)),e.once(`error`,n)}):Promise.resolve(e.exitCode)}const Cw={file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},port:{type:`number`,valueHint:`<n>`,description:{"en-US":`Local port (default: 4848)`,"zh-CN":`本地端口(默认:4848)`}},noOpen:{type:`switch`,description:{"en-US":`Do not open a browser automatically`,"zh-CN":`不自动打开浏览器`}},agent:{type:`string`,valueHint:`<id>`,description:{"en-US":`Agent to preview (required when the project declares multiple Agents)`,"zh-CN":`要预览的 Agent(项目包含多个 Agent 时需要指定)`}}},ww=[...K,{"en-US":`Session Preview requires Node.js 22+ and keeps using an agents.yaml source. Directory Workbench is available under managed-agent project workbench.`,"zh-CN":`会话预览需要 Node.js 22+,并继续使用 agents.yaml;目录 Workbench 位于 managed-agent project workbench。`}],Tw=w({description:{"en-US":`Launch a Session Preview for an agents.yaml Agent`,"zh-CN":`为 agents.yaml 中的 Agent 启动会话预览`},auth:`apiKey`,usageArgs:`[--file <path>] [--agent <id>] [--port <n>] [--no-open]`,flags:Cw,exampleArgs:[``,`--agent assistant`,`--file agents.yaml --no-open`],notes:ww,async run(e){let t=e.flags.file??`agents.yaml`,n=e.flags.port??4848;if(e.settings.dryRun){A({would_launch:`playground`,config_file:t,agent:e.flags.agent,port:n,open_browser:!e.flags.noOpen},T(e.settings.output));return}await sw({file:t,agent:e.flags.agent,port:n,open:!e.flags.noOpen,surface:`preview`,client:e.client,settings:e.settings})}}),Ew={project:{type:`string`,valueHint:`<directory>`,description:{"en-US":`Directory project root (default: current directory)`,"zh-CN":`目录项目根路径(默认:当前目录)`}}},Dw=w({description:{"en-US":`Create a directory project or convert the local agents.yaml`,"zh-CN":`创建目录项目,或转换当前 agents.yaml`},auth:`none`,usageArgs:`[--project <directory>]`,flags:{project:{...Ew.project,description:{"en-US":`Directory project root (default: ./managed-agent under the current directory)`,"zh-CN":`目录项目根路径(默认:当前目录下的 ./managed-agent)`}}},exampleArgs:[``,`--project ./my-agent`,`--project .`],notes:[{"en-US":`Without --project, creates a managed-agent/ subdirectory. Enter it before running other project commands. Use --project . to initialize in place or convert the current agents.yaml; existing project files are not overwritten.`,"zh-CN":`不传 --project 时创建 managed-agent/ 子目录;后续项目操作请先进入该目录。使用 --project . 可在当前目录初始化或转换 agents.yaml;不会覆盖已有项目文件。`},{"en-US":`New projects include Skill, File, Vault, and Environment examples under each resource directory's _examples/. They are not referenced by agent.json and are excluded from Build/Publish. Copy an example outside _examples/ to enable it, then configure its Agent reference.`,"zh-CN":`新项目在四类资源目录的 _examples/ 下生成配置示例,不写入 agent.json 引用,也不参与 Build/Publish。需要使用时,将示例复制到 _examples/ 外,再配置 Agent 引用。`}],async run(e){let t=e.flags.project??`./managed-agent`;if(e.settings.dryRun){A({would_initialize_project:t},T(e.settings.output));return}let n=await jo({projectRoot:t});A(n,T(e.settings.output))}}),Ow=w({description:{"en-US":`Validate a directory Agent project`,"zh-CN":`校验目录式 Agent 项目`},auth:`none`,usageArgs:`[--project <directory>]`,flags:Ew,exampleArgs:[``,`--project ./my-agent`],async run(e){let t=await Fo(e.flags.project??`.`),r=T(e.settings.output);if(r===`json`)A(Bw(t),r);else{for(let e of[...t.diagnostics,...t.warnings])k(`${e.severity}: ${e.code}: ${e.message}`);t.diagnostics.some(e=>e.severity===`error`)||k(`Project is valid (${t.project_revision.slice(0,12)}).`)}if(t.diagnostics.some(e=>e.severity===`error`))throw new n(`Directory project validation failed.`,f.GENERAL)}}),kw=w({description:{"en-US":`Organize directory source and generate the immutable Publish Build`,"zh-CN":`整理目录源文件并生成不可变的发布 Build`},auth:`none`,notes:[{"en-US":`Build writes local project files without confirmation, including inferred resource associations and migration of plaintext Vault secrets into .env. Use --dry-run to preview without writing. Publish still requires explicit confirmation before remote changes.`,"zh-CN":`Build 无需确认即可写入本地项目文件,包括推断的资源关联及将 Vault 明文密钥移入 .env。使用 --dry-run 可只预览不写入。Publish 变更远端资源前仍需显式确认。`}],usageArgs:`[--project <directory>]`,flags:Ew,exampleArgs:[``,`--dry-run`,`--project ./my-agent`],async validate(e){await J(async()=>{let t=await Po(e.project??`.`);if(!(await Gi(N(t,`project.json`)).catch(e=>{if(e.code===`ENOENT`)return null;throw e}))?.isFile())throw new n(`Not a project root: ${t} (project.json is missing).`,f.USAGE,`Run from the directory containing project.json, or pass --project <directory>.`)})},async run(e){let t=e.flags.project??`.`,r=await No(t),i=T(e.settings.output);if(e.settings.dryRun){A(Bw(r),i);return}if(!r.can_build)throw new n(r.diagnostics.find(e=>e.severity===`error`)?.message??`Directory project is invalid and cannot be built.`,f.GENERAL);let a=await Oo({projectRoot:t,baseRevision:r.project_revision});A({manifest:a.manifest,organization_moves:r.organization_moves},i)}}),Aw=w({description:{"en-US":`Publish the current directory-project Build and record a version`,"zh-CN":`发布当前目录项目 Build 并记录版本`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This publishes the current directory-project Build and may create, update, or delete remote managed Agent resources.`,"zh-CN":`该操作会发布当前目录项目 Build,可能创建、更新或删除远端托管 Agent 资源。`}},usageArgs:`[--project <directory>] [--no-refresh] [--concurrency <n>]`,flags:{...Ew,noRefresh:{type:`switch`,description:{"en-US":`Skip remote refresh before planning`,"zh-CN":`规划前跳过远端刷新`}},concurrency:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum parallel resource operations`,"zh-CN":`最大并行资源操作数`}}},exampleArgs:[`--yes`,`--project ./my-agent --yes`],notes:K,async run(e){UC(e);let t=e.flags.project??`.`,n=async(t,n)=>await GC(e,t,{environment:n?.environment,overrideBailianBaseUrl:!0}),r=await J(()=>Y(()=>Mo(t,{provider:`bailian`,refresh:!e.flags.noRefresh,quiet:!0,onFeedback:ew,resolveBuild:n}))),i=r.planned.plan.actions.filter(e=>e.action!==`no-op`);if(e.settings.dryRun){A({project_revision:r.project_revision,build_manifest:r.build_manifest,plan:r.planned.plan},T(e.settings.output));return}for(let e of i){let t=e.action===`create`?`+`:e.action===`update`?`~`:`-`;k(`${t} ${$C(e.address)}`)}let a=await J(()=>Y(()=>Ao({projectRoot:r.project_root,expectedProjectRevision:r.project_revision,expectedYamlHash:r.build_manifest.yaml_hash,expectedPlanFingerprint:r.plan_fingerprint,provider:`bailian`,refresh:!e.flags.noRefresh,concurrency:e.flags.concurrency,policy:`force`,onFeedback:ew,resolveBuild:n})));A(a,T(e.settings.output))}}),jw=w({description:{"en-US":`Launch the directory project Workbench`,"zh-CN":`启动目录项目 Workbench`},auth:`apiKey`,usageArgs:`[--project <directory>] [--port <n>] [--no-open]`,flags:{...Ew,port:{type:`number`,valueHint:`<n>`,description:{"en-US":`Local port (default: 4848)`,"zh-CN":`本地端口(默认:4848)`}},noOpen:{type:`switch`,description:{"en-US":`Do not open a browser`,"zh-CN":`不自动打开浏览器`}}},exampleArgs:[``,`--project ./my-agent --no-open`],notes:K,async run(e){let t=e.flags.project??`.`;if(e.settings.dryRun){A({would_launch:`workbench`,project_root:t,port:e.flags.port??4848},T(e.settings.output));return}await sw({project:t,port:e.flags.port??4848,open:!e.flags.noOpen,surface:`workbench`,client:e.client,settings:e.settings})}}),Mw=Pw(!0),Nw=Pw(!1);function Pw(e){return w({description:e?{"en-US":`Enable directory project versions`,"zh-CN":`启用目录项目版本管理`}:{"en-US":`Disable directory project versions`,"zh-CN":`关闭目录项目版本管理`},auth:`none`,usageArgs:`[--project <directory>]`,flags:Ew,exampleArgs:[``,`--project ./my-agent`],async run(t){let n=ko(t.flags.project??`.`);if(t.settings.dryRun){A({would_set_enabled:e,status:await n.status()},T(t.settings.output));return}let r=e?await n.enable(`Enable project versions`):await n.disable();A(r,T(t.settings.output))}})}const Fw=w({description:{"en-US":`Show directory project version status`,"zh-CN":`显示目录项目版本状态`},auth:`none`,usageArgs:`[--project <directory>]`,flags:Ew,exampleArgs:[``,`--project ./my-agent --output json`],async run(e){A(await ko(e.flags.project??`.`).status(),T(e.settings.output))}}),Iw=w({description:{"en-US":`List directory project versions`,"zh-CN":`列出目录项目版本`},auth:`none`,usageArgs:`[--project <directory>] [--limit <n>] [--cursor <cursor>]`,flags:{...Ew,limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum versions to return`,"zh-CN":`最多返回的版本数`}},cursor:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Pagination cursor`,"zh-CN":`分页游标`}}},exampleArgs:[``,`--limit 20 --output json`],async run(e){A(await ko(e.flags.project??`.`).listVersions({limit:e.flags.limit,cursor:e.flags.cursor}),T(e.settings.output))}}),Lw={versionId:{type:`string`,valueHint:`<full-version>`,required:!0,description:{"en-US":`Full project version ID`,"zh-CN":`完整的项目版本 ID`}}},Rw=w({description:{"en-US":`Preview a directory project version`,"zh-CN":`预览目录项目历史版本`},auth:`none`,usageArgs:`--version-id <full-version> [--project <directory>]`,flags:{...Ew,...Lw},exampleArgs:[`--version-id <full-version>`],async run(e){A(await ko(e.flags.project??`.`).previewVersion(e.flags.versionId),T(e.settings.output))}}),zw=w({description:{"en-US":`Restore a version to the project working directory`,"zh-CN":`将历史版本恢复到项目工作目录`},auth:`none`,risk:{level:`high`,message:{"en-US":`This restores the full directory source to the working tree. Version history and remote State will not move.`,"zh-CN":`该操作会将完整目录源文件恢复到工作区;版本历史和远端 State 不会移动。`}},usageArgs:`--version-id <full-version> [--project <directory>]`,flags:{...Ew,...Lw},exampleArgs:[`--version-id <full-version>`,`--version-id <full-version> --yes`],async run(e){let t=ko(e.flags.project??`.`),r=await t.previewVersion(e.flags.versionId);if(!r.can_restore)throw new n(r.blockers[0]??r.diagnostics[0]?.message??`Version cannot be restored.`,f.GENERAL);if(e.settings.dryRun){A({would_restore:e.flags.versionId,preview:r},T(e.settings.output));return}let i=await t.restoreVersion(e.flags.versionId,{headVersion:r.base_head_version,projectRevision:r.base_project_revision});A(i,T(e.settings.output))}});function Bw(e){return{project_root:e.project_root,project_revision:e.project_revision,source_manifest_hash:e.source_manifest_hash,yaml_hash:e.yaml_hash,diagnostics:e.diagnostics,warnings:e.warnings,organization_moves:e.organization_moves,before_yaml:`before_yaml`in e?e.before_yaml:void 0,after_yaml:e.canonical_yaml,can_build:`can_build`in e?e.can_build:void 0}}var Vw=w({description:{"en-US":`List resources tracked in agents state`,"zh-CN":`列出 Agent State 中跟踪的资源`},auth:`none`,usageArgs:`[--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[``,`--file agents.yaml`],notes:PC,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=await J(()=>Y(async()=>(await q(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 zr(o,s))k(e);k(`\nTotal: ${a.length}`)}}),Hw=w({description:{"en-US":`Show details of a resource in agents state`,"zh-CN":`显示 Agent State 中资源的详情`},auth:`none`,usageArgs:`--address <provider.type.name> [--file <path>]`,flags:{address:{type:`string`,valueHint:`<provider.type.name>`,description:{"en-US":`Resource state address (required)`,"zh-CN":`资源 State 地址(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--address bailian.agent.assistant`],notes:PC,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`,o=await J(()=>Y(async()=>{let t=await q(e,a,{credentials:`none`}),n=to(r.address,{requireProvider:!1});return t.state.findResource(n)}));if(!o)throw new n(`Resource not found: ${r.address}`,f.GENERAL);i===`json`?A(o,i):k(JSON.stringify(o,null,2))}}),Uw=w({description:{"en-US":`Remove a resource from state without destroying it remotely`,"zh-CN":`从 State 中移除资源,但不销毁远端资源`},auth:`none`,risk:{level:`high`,message:{"en-US":`This removes the resource from local state without deleting it remotely, so this project will no longer track it.`,"zh-CN":`该操作会从本地 State 中移除资源但不会删除远端资源,此项目将不再跟踪该资源。`}},usageArgs:`--address <provider.type.name> [--file <path>]`,flags:{address:{type:`string`,valueHint:`<provider.type.name>`,description:{"en-US":`Resource state address (required)`,"zh-CN":`资源 State 地址(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--address bailian.agent.assistant --yes`],notes:PC,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`;if(t.dryRun){await J(async()=>{to(r.address,{requireProvider:!1})}),A({would_remove:r.address,config_file:a},i);return}await J(()=>Y(async()=>{let t=await q(e,a,{credentials:`none`}),i=to(r.address,{requireProvider:!1}),o=t.state.findResource(i);if(!o)throw new n(`Resource not found: ${r.address}`,f.GENERAL);t.state.removeResource(o.address),await t.state.save()}));let o=`Removed ${r.address} from state (remote resource not deleted).`;i===`json`?A({removed:r.address},i):k(o)}});const Ww={address:{type:`string`,valueHint:`<bailian.type.name>`,description:{"en-US":`Resource state address (required)`,"zh-CN":`资源 State 地址(必填)`},required:!0},remoteId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Existing remote resource ID to import (required)`,"zh-CN":`要导入的已有远端资源 ID(必填)`},required:!0},resourceVersion:{type:`number`,valueHint:`<n>`,description:{"en-US":`Resource version (for versioned resources like agents)`,"zh-CN":`资源版本(用于 Agent 等带版本的资源)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}};function Gw(e){let t=to(e,{requireProvider:!0});if(t.provider!==`bailian`)throw new n(`bl managed-agent can import only Bailian resources; address provider was '${t.provider}'. / bl managed-agent 只能导入百炼资源;地址中的 Provider 为 '${t.provider}'。`,f.USAGE);return t}var Kw=w({description:{"en-US":`Import an existing remote resource into agents state`,"zh-CN":`将已有远端资源导入 Agent State`},auth:`apiKey`,usageArgs:`--address <bailian.type.name> --remote-id <id> [--resource-version <n>] [--file <path>]`,flags:Ww,exampleArgs:[`--address bailian.agent.assistant --remote-id agent-abc123`],notes:K,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`;if(t.dryRun){await J(async()=>{Gw(n.address)}),A({would_import:n.address,remote_id:n.remoteId,resource_version:n.resourceVersion,config_file:i},r);return}await J(()=>Y(async()=>{let t=Gw(n.address),r=await q(e,i);await Fa(r,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.`)}});const qw={environment_variables:{type:`array`,valueHint:`<KEY=VALUE>`,description:{"en-US":`Runtime environment variable; repeat for multiple values (last value wins)`,"zh-CN":`运行时环境变量;可重复传入,同名变量以后一次为准`}}};function Jw(e){if(e?.length)return Object.fromEntries(e.map(e=>{let t=e.indexOf(`=`);if(t<0)throw new n(`--environment_variables values must use KEY=VALUE format. / --environment_variables 必须使用 KEY=VALUE 格式。`,f.USAGE);let r=e.slice(0,t).trim();if(!r)throw new n(`--environment_variables keys must not be empty. / --environment_variables 的键不能为空。`,f.USAGE);return[r,e.slice(t+1)]}))}function Yw(e){return e===void 0?void 0:Object.fromEntries(Object.keys(e).map(e=>[e,`[REDACTED]`]))}const Xw=[{"en-US":`Without --yes, this command only previews. --dry-run is fully offline. The scoped flow checks only the target resource and its transitive dependencies; unrelated resources are not refreshed or drift-checked.`,"zh-CN":`不带 --yes 时仅预览;--dry-run 完全离线。定向流程只检查目标资源及其传递依赖,不刷新或检测无关资源的 Drift。`}];function Zw(e){let t=e=>Array.isArray(e)?e.map(t):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>[e,t(n)]));return JSON.stringify(t(e))}function Qw(e,t=`resource`){return e.normalize(`NFKC`).trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,`-`).replace(/^-+|-+$/g,``)||t}function $w(e){let t=new Set(e.state.listResources().filter(t=>t.address.provider===e.provider&&e.resourceTypes.includes(t.address.type)&&!(t.address.type===`memory_store`&&t.remote_id&&t.memory_initialization)).map(e=>e.address.name)),n=Zw(e.candidate);for(let[r,i]of Object.entries(e.declarations))if(!(e.effectiveName(r,i)!==e.displayName||t.has(r))&&Zw(i)===n)return{key:r,reusedPending:!0};let r=Qw(e.displayName,e.fallbackKey);if(!(r in e.declarations))return{key:r,reusedPending:!1};let i=2;for(;`${r}-${i}`in e.declarations;)i+=1;return{key:`${r}-${i}`,reusedPending:!1}}async function eT(e,t){let r=await Ui(P(t),`utf8`).catch(e=>{throw e.code===`ENOENT`?new n(`Config file not found: ${t}`,f.USAGE,"Run `bl managed-agent init` first."):e}),i=await J(()=>GC(e,t,{credentials:`none`})),a=await Ui(i.configPath,`utf8`);if(a!==r)throw new n(`${t} changed while it was being loaded.`,f.GENERAL,`Re-run the command against the latest file.`);let o=`bailian`;e.settings.dryRun||zC(i.config.providers,[o]),UC(e);let s=new $i({configPath:i.configPath});return{...i,source:a,provider:o,stateBackend:s,stateScope:BC(i.configPath,i.projectName)}}async function tT(e){let t=`__bailian_cli_create_candidate__`,n={version:e.project.config.version,providers:e.project.config.providers,defaults:e.project.config.defaults,[e.group]:{[t]:e.rawDeclaration}};return(await J(()=>uo(n,{projectName:e.project.projectName,basePath:Oi(e.project.configPath)}))).config[e.group]?.[t]??e.rawDeclaration}async function nT(e){let{project:t,host:r}=e,i=T(r.settings.output),a=await t.stateBackend.read(t.stateScope,n=>$w({displayName:e.displayName,provider:t.provider,resourceTypes:[e.resourceType],declarations:e.existingDeclarations,candidate:e.resolvedDeclaration,effectiveName:e.effectiveName,fallbackKey:e.fallbackKey,state:n})),o=a.key,s=structuredClone(t.config),c=s[e.group]??{};s[e.group]={...c,[o]:e.resolvedDeclaration},s._resolved=!0;let l=Fi(t.source);if(l.errors.length>0)throw new n(`YAML parse error: ${l.errors.map(e=>e.message).join(`; `)}`,f.USAGE);l.setIn([e.group,o],e.rawDeclaration);let u=l.toString(),d={type:e.resourceType,name:o,provider:t.provider},p={projectName:t.projectName,config:s,configPath:t.configPath,providers:{[t.provider]:t.config.providers[t.provider]},stateBackend:t.stateBackend,stateScope:t.stateScope};if(r.settings.dryRun||!e.yes){let n=await J(()=>Y(()=>io(p,{provider:t.provider,scope:{roots:[d]},mode:`create-only`,refresh:!r.settings.dryRun,quiet:i===`json`}))),s=!n.plan.diagnostics.some(e=>e.severity===`error`),c={resource:{type:e.resourceType,key:o,name:e.displayName,provider:t.provider},config_file:t.configPath,yaml_written:!1,reused_pending:a.reusedPending,requires_confirmation:!r.settings.dryRun,ready_to_create:s,actions:n.plan.actions,diagnostics:n.plan.diagnostics};i===`json`?A(c,i):(k(`Generated YAML key: ${o}`),oT(n.plan.actions,n.plan.diagnostics),k(r.settings.dryRun?`Dry run: YAML, State, and remote resources were not changed.`:`Preview only: re-run with --yes to write YAML and create this resource.`));return}await rT(t.configPath,t.source,u);let m;try{m=await J(()=>Y(()=>bo(p,{provider:t.provider,scope:{roots:[d]},mode:`create-only`,refresh:!0,quiet:i===`json`,policy:`block`})))}catch(t){throw ZC(t,`The YAML declaration was kept. Fix the related dependency or provider error, then re-run the same create command.`,`Scoped ${e.resourceType} create failed.`)}let h=await t.stateBackend.read(t.stateScope,e=>e.getResource(d)?.remote_id),g=m.execution?.results??[],_=g.find(e=>e.status===`failed`),v={resource:{type:e.resourceType,key:o,name:e.displayName,provider:t.provider,remote_id:h},config_file:t.configPath,yaml_written:!0,reused_pending:a.reusedPending,actions:m.planned.plan.actions,diagnostics:m.planned.plan.diagnostics,results:g,error:_?.error};if(i===`json`?A(v,i):(k(`Wrote ${t.configPath} with ${e.resourceType} key '${o}'.`),_||k(`Created ${e.resourceType} '${e.displayName}'.`)),_)throw new n(_.error??`Scoped ${e.resourceType} create failed.`,f.GENERAL,`The YAML declaration was kept. Fix the provider error, then re-run the same create command.`)}async function rT(e,t,r){let i=P(e);if(await Ui(i,`utf8`)!==t)throw new n(`${e} changed while resource create was being prepared.`,f.GENERAL,`Review the latest YAML and re-run the command; no file was overwritten.`);let a=await Gi(i),o=P(Oi(i),`.${Di(i)}.${ni()}.tmp`);await qi(o,r,{flag:`wx`,mode:a.mode});try{await Wi(o,i)}catch(e){throw await Ki(o).catch(()=>void 0),e}}function iT(e){if(!e?.length)return;let t={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new n(`Invalid metadata '${r}'.`,f.USAGE,`Use --metadata key=value.`);let i=r.slice(0,e).trim();if(!i)throw new n(`Metadata key must not be empty.`,f.USAGE);t[i]=r.slice(e+1)}return t}async function aT(e,t){let r=[];for(let i of e??[]){let e=i.startsWith(`@`)?await Ui(P(i.slice(1)),`utf8`):i,a;try{a=JSON.parse(e)}catch(e){throw new n(`Invalid ${t} JSON: ${e instanceof Error?e.message:String(e)}`,f.USAGE)}Array.isArray(a)?r.push(...a):r.push(a)}return r}function oT(e,t){for(let e of t)k(`[${e.severity}] ${e.code}: ${e.message}`);for(let t of e.filter(e=>e.action!==`no-op`)){let e=t.action===`create`?`+`:t.action===`update`?`~`:`-`;k(` ${e} ${$C(t.address)}`)}}const sT={resource:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`Session resource JSON (repeatable); memory_store uses a YAML key, access and instructions`,"zh-CN":`Session 资源 JSON(可重复);memory_store 使用 YAML key、access 和 instructions`}}};async function cT(e){if(e===void 0)return;let t=await aT(e,`resource`);if(t.some(e=>typeof e!=`object`||!e||!(`type`in e)||e.type!==`memory_store`))throw new n(`Bailian Session resources only support memory_store. / 百炼 Session 资源仅支持 memory_store。`,f.USAGE);return J(async()=>eo(t))}function lT(e){return e.type!==`thinking`&&(e.type!==`message`||e.role!==`user`)}function uT(e,t){t||process.stderr.write(`\n[session ${e}]\n`)}function dT(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 fT(e,t){if(e===`failed`)throw new n(t??`Session failed.`,f.GENERAL)}async function pT(e,t,n={}){let r=[],i,a;for await(let n of e)if(t?r.push(n):mT(n),n.type===`error`&&n.content?.trim()&&(a=n.content),n.type===`status`&&La(n.status)){i=n.status,uT(n.status??``,t);break}t&&process.stdout.write(`${JSON.stringify({...n,events:Io(r)},null,2)}\n`),fT(i,a)}function mT(e){if(lT(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(`
2876
+ `);for(let e of u)k(` + ${Gw(e.address)}`);for(let e of d)k(` ~ ${Gw(e.address)}`),e.reason&&k(` ${e.reason}`);for(let e of p)k(` - ${Gw(e.address)}`);k(`\nPlan: ${u.length} to create, ${d.length} to update, ${p.length} to destroy.`),r.refreshOnly&&k(`Refresh-only mode: no remote mutations will be performed.`)}}),Jw=w({description:{"en-US":`Apply planned changes to create/update/delete agent resources`,"zh-CN":`应用规划的变更,创建、更新或删除 Agent 资源`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This applies the current plan and may create, update, or delete remote managed Agent resources.`,"zh-CN":`该操作会应用当前计划,可能创建、更新或删除远端托管 Agent 资源。`}},usageArgs:`[--file <path>] [--concurrency <n>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},noRefresh:{type:`switch`,description:{"en-US":`Skip refreshing state from remote before planning`,"zh-CN":`规划前跳过从远端刷新状态`}},concurrency:{type:`number`,valueHint:`<n>`,description:{"en-US":`Max independent resources to apply in parallel (default 6, max 10)`,"zh-CN":`最大并行应用资源数(默认:6,最多:10)`}}},exampleArgs:[`--yes`],notes:G,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`;if(t.dryRun){A({would_apply:{provider:`bailian`,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 q(()=>J(async()=>{let t=await K(e,a);return oo(t,{provider:`bailian`,refresh:!r.noRefresh,quiet:!0,onFeedback:Kw})})),s=o.plan,c=e=>{i===`json`?process.stderr.write(`${e}\n`):k(e)},l=s.diagnostics.filter(e=>e.severity===`error`);if(l.length>0){for(let e of l)c(`[error] ${e.code}: ${e.message}`);throw new n(Hw(l,`Cannot apply: resolve the errors above first.`),f.GENERAL)}let u=s.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}for(let e of u)c(` ${e.action===`create`?`+`:e.action===`update`?`~`:`-`} ${Gw(e.address)}`);let d=await q(()=>J(()=>wa(o,{onFeedback:Kw,policy:`force`,concurrency:r.concurrency}))),p=d.results.filter(e=>e.status===`success`).length,m=d.results.filter(e=>e.status===`failed`),h=m.length,g=d.results.filter(e=>e.status===`skipped`).length;if(i===`json`?A({succeeded:p,failed:h,skipped:g,results:d.results},i):k(`\nApply finished: ${p} succeeded, ${h} failed, ${g} skipped.`),h>0){let e=m.find(e=>e.error);throw new n(e?.error??`Apply failed.`,f.GENERAL)}}}),Yw=w({description:{"en-US":`Destroy all managed agent resources tracked in state`,"zh-CN":`销毁 State 中跟踪的全部托管 Agent 资源`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes every managed Agent resource tracked in state; --cascade may also delete dependent resources.`,"zh-CN":`该操作会删除 State 中跟踪的全部托管 Agent 资源;--cascade 还可能删除依赖资源。`}},usageArgs:`[--file <path>] [--cascade]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},cascade:{type:`switch`,description:{"en-US":`Auto-delete dependent resources (e.g. sessions referencing an environment)`,"zh-CN":`自动删除依赖资源(例如引用某个环境的 Session)`}}},exampleArgs:[`--yes`,`--yes --cascade`],notes:G,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`;if(t.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 q(()=>J(async()=>{let t=await K(e,a),n=ao(t);return{...n,resources:n.resources.filter(e=>e.address.provider===`bailian`),defaultMemoryStores:(n.defaultMemoryStores??[]).filter(e=>e.provider===`bailian`)}})),s=o.resources;if(s.length===0){i===`json`?A({destroyed:0,total:0},i):k(`No resources in state. Nothing to destroy.`);return}for(let e of s){let t=` - ${Gw(e.address)} [${e.remote_id}]`;i===`json`?process.stderr.write(`${t}\n`):k(t)}let c=await q(()=>J(()=>ya(o,{cascade:r.cascade,onCascadeRequired:async()=>!!r.cascade,onResourceResult:e=>{let t=Gw(e.resource.address);process.stderr.write(` ${e.status===`success`?`✓`:`✗`} ${t}\n`)}})));if(i===`json`)A({destroyed:c.destroyed,total:c.resources.length},i);else{let e=c.partial?`Destroy incomplete`:`Destroy complete`;k(`\n${e}. ${c.destroyed}/${c.resources.length} resources removed.`)}if(c.partial){let e=c.results.find(e=>e.status!==`success`);throw new n(e?.error||`Destroy incomplete: ${c.destroyed}/${c.resources.length} resources removed.`,f.GENERAL)}}});const Xw=`@openagentpack/playground`,Zw=Ao(ci),Qw=/running at http:\/\/localhost:(\d+)/i;async function $w(e){tT();let t=e.port??4848;if(!Number.isInteger(t)||t<=0||t>65535)throw new n(`Invalid --port '${t}'.`,f.USAGE);let r=P(e.surface===`workbench`?e.project??`.`:e.file??`agents.yaml`),i=ri(`sha256`).update(r).digest(`hex`).slice(0,16),a=await nT(),o=await cT(t);if(o){if(o.projectId===i&&(a.version===void 0||o.version===a.version)){k(`Workbench already running at http://localhost:${t} (pid ${o.pid}).`),await uT(t,e.surface,e.agent,e.open);return}if(!await lT(o,t))throw new n(`Could not stop the existing Workbench process (pid ${o.pid}) on port ${t}.`,f.GENERAL,`Stop it manually or choose another --port.`)}let s=oT(e,t,r);a.fetched&&k(`Fetching ${Xw} (first run may take a moment)...`);let c=li(a.command,a.args,{env:s,stdio:[`inherit`,`pipe`,`inherit`]}),l=pT(c);try{let r=await sT(c,t,3e4,i);if(r===null)throw new n(`Workbench did not become ready in time. Check the logs above, then open http://localhost:${t}.`,f.GENERAL);k(`Workbench ready at http://localhost:${r}`),await uT(r,e.surface,e.agent,e.open);let a=await mT(c);if(a!==0)throw new n(`Workbench exited with code ${a}.`,f.GENERAL)}finally{l()}}function eT(e,t,n){if(t.status!==`valid`)return{url:e};let r=(t.agents??[]).map(e=>e.agent?.id?.trim()).filter(e=>!!e),i=n?.trim();return i?r.includes(i)?{url:`${e}/agents/${encodeURIComponent(i)}/preview`}:{url:e,warning:`Agent '${i}' was not found. Opening the project Workbench instead.`}:r.length===1?{url:`${e}/agents/${encodeURIComponent(r[0])}/preview`}:r.length>1?{url:e,warning:`This project declares multiple Agents. Opening the Workbench; rerun with --agent <id> for Preview.`}:{url:e}}function tT(){let e=Number(process.versions.node.split(`.`)[0]);if(!(Number.isFinite(e)&&e>=22))throw new n(`Managed Agent Workbench requires Node.js 22 or later.`,f.USAGE,`Upgrade Node.js for Workbench; other Bailian CLI commands continue to support Node.js 18.17+.`)}async function nT(){let e=process.env.BAILIAN_MANAGED_AGENT_PLAYGROUND_BIN?.trim()||process.env.AGENTS_PLAYGROUND_BIN?.trim();if(e){if(!M(e))throw new n(`Configured Workbench binary does not exist: ${e}`,f.USAGE);return{command:process.execPath,args:[e],fetched:!1}}let t=process.env.BAILIAN_MANAGED_AGENT_PLAYGROUND_VERSION?.trim()||`latest`,{stdout:r}=await Zw(`npm`,[`view`,`${Xw}@${t}`,`version`,`--json`,`--prefer-online`,`--fetch-retries=0`,`--fetch-timeout=10000`],{timeout:15e3,maxBuffer:1048576}),i;try{i=JSON.parse(r)}catch{i=void 0}if(typeof i!=`string`||!/^\d+\.\d+\.\d+(?:-[\da-zA-Z.-]+)?(?:\+[\da-zA-Z.-]+)?$/.test(i))throw new n(`npm did not return a single valid Playground version. Specify an exact version or dist-tag. / npm 未返回唯一有效的 Playground 版本号。请指定精确版本或 dist-tag。`,f.GENERAL);let a=iT();if(a?.version===i)return a;let o=aT(process.cwd());return o&&rT(P(ji(o),`../../package.json`))===i?{command:process.execPath,args:[o],version:i,fetched:!1}:{command:`npx`,args:[`-y`,`${Xw}@${i}`],version:i,fetched:!0}}function rT(e){try{return JSON.parse(Ti(e,`utf8`)).version}catch{return}}function iT(){try{let t=e(import.meta.url).resolve(`${Xw}/package.json`),n=JSON.parse(Ti(t,`utf8`)),r=typeof n.bin==`string`?n.bin:n.bin?.[`agents-playground`];if(!r)return;let i=P(ji(t),r);return M(i)?{command:process.execPath,args:[i],version:n.version,fetched:!1}:void 0}catch{return}}function aT(e){let t=e;for(let e=0;e<10;e+=1){let e=P(t,`packages/playground/dist/bin/playground.js`);if(M(e))return e;let n=ji(t);if(n===t)break;t=n}}function oT(e,t,n){let r=e.client.exportApiCredential(),i={...process.env,PORT:String(t),AGENTS_PLAYGROUND_TOKEN:ii(32).toString(`hex`)};e.surface===`workbench`?(delete i.AGENTS_CONFIG_PATH,i.AGENTS_PROJECT_ROOT=n):(delete i.AGENTS_PROJECT_ROOT,i.AGENTS_CONFIG_PATH=n),r&&(i.DASHSCOPE_API_KEY=r.token);let a=e.client.baseUrl.replace(/\/+$/,``);return i.BAILIAN_BASE_URL=a.endsWith(`/api/v1/agentstudio`)?a:`${a}/api/v1/agentstudio`,e.settings.workspaceId&&(i.BAILIAN_WORKSPACE_ID=e.settings.workspaceId),i}async function sT(e,t,n,r){let i=t,a=``;e.stdout?.on(`data`,e=>{process.stdout.write(e),a+=e.toString();let t=a.match(Qw);t?.[1]&&(i=Number(t[1]))});let o=Date.now()+n;for(;Date.now()<=o;){if(e.exitCode!==null)return null;try{let e=await fetch(`http://localhost:${i}/health`,{signal:AbortSignal.timeout(1e3)});if((e.ok?await e.json():void 0)?.playground?.project_id===r)return i}catch{}await new Promise(e=>setTimeout(e,300))}return null}async function cT(e){try{let t=await fetch(`http://localhost:${e}/health`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return null;let n=await t.json();return n.playground?.pid?{version:n.playground.version??`unknown`,pid:n.playground.pid,projectId:n.playground.project_id}:null}catch{return null}}async function lT(e,t){k(`Replacing Workbench v${e.version} (pid ${e.pid}) on port ${t}...`);try{process.kill(e.pid,`SIGTERM`)}catch{return!0}for(let e=0;e<30;e+=1)if(await new Promise(e=>setTimeout(e,100)),!await cT(t))return!0;return!1}async function uT(e,t,n,r){if(!r)return;let i=t===`workbench`?{url:`http://localhost:${e}`}:await dT(e,n);i.warning&&k(`Warning: ${i.warning}`),fT(i.url)}async function dT(e,t){let n=`http://localhost:${e}`;try{let e=await fetch(`${n}/api/project`,{signal:AbortSignal.timeout(3e3)});return e.ok?eT(n,await e.json(),t):{url:n}}catch{return{url:n}}}function fT(e){let t=process.platform===`darwin`?`open`:process.platform===`win32`?`start`:`xdg-open`,n=process.platform===`win32`?[``,e]:[e];try{li(t,n,{stdio:`ignore`,detached:!0,shell:process.platform===`win32`}).unref()}catch{k(`Could not open a browser automatically. Visit ${e}`)}}function pT(e){let t=()=>e.kill(`SIGINT`),n=()=>e.kill(`SIGTERM`);return process.on(`SIGINT`,t),process.on(`SIGTERM`,n),()=>{process.off(`SIGINT`,t),process.off(`SIGTERM`,n)}}function mT(e){return e.exitCode===null?new Promise((t,n)=>{e.once(`exit`,e=>t(e??0)),e.once(`error`,n)}):Promise.resolve(e.exitCode)}const hT={file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},port:{type:`number`,valueHint:`<n>`,description:{"en-US":`Local port (default: 4848)`,"zh-CN":`本地端口(默认:4848)`}},noOpen:{type:`switch`,description:{"en-US":`Do not open a browser automatically`,"zh-CN":`不自动打开浏览器`}},agent:{type:`string`,valueHint:`<id>`,description:{"en-US":`Agent to preview (required when the project declares multiple Agents)`,"zh-CN":`要预览的 Agent(项目包含多个 Agent 时需要指定)`}}},gT=[...G,{"en-US":`Session Preview requires Node.js 22+ and keeps using an agents.yaml source. Directory Workbench is available under managed-agent project workbench.`,"zh-CN":`会话预览需要 Node.js 22+,并继续使用 agents.yaml;目录 Workbench 位于 managed-agent project workbench。`}],_T=w({description:{"en-US":`Launch a Session Preview for an agents.yaml Agent`,"zh-CN":`为 agents.yaml 中的 Agent 启动会话预览`},auth:`apiKey`,usageArgs:`[--file <path>] [--agent <id>] [--port <n>] [--no-open]`,flags:hT,exampleArgs:[``,`--agent assistant`,`--file agents.yaml --no-open`],notes:gT,async run(e){let t=e.flags.file??`agents.yaml`,n=e.flags.port??4848;if(e.settings.dryRun){A({would_launch:`playground`,config_file:t,agent:e.flags.agent,port:n,open_browser:!e.flags.noOpen},T(e.settings.output));return}await $w({file:t,agent:e.flags.agent,port:n,open:!e.flags.noOpen,surface:`preview`,client:e.client,settings:e.settings})}}),vT={project:{type:`string`,valueHint:`<directory>`,description:{"en-US":`Directory project root (default: current directory)`,"zh-CN":`目录项目根路径(默认:当前目录)`}}},yT=w({description:{"en-US":`Create a directory project or convert the local agents.yaml`,"zh-CN":`创建目录项目,或转换当前 agents.yaml`},auth:`none`,usageArgs:`[--project <directory>]`,flags:{project:{...vT.project,description:{"en-US":`Directory project root (default: ./managed-agent under the current directory)`,"zh-CN":`目录项目根路径(默认:当前目录下的 ./managed-agent)`}}},exampleArgs:[``,`--project ./my-agent`,`--project .`],notes:[{"en-US":`Without --project, creates a managed-agent/ subdirectory. Enter it before running other project commands. Use --project . to initialize in place or convert the current agents.yaml; existing project files are not overwritten.`,"zh-CN":`不传 --project 时创建 managed-agent/ 子目录;后续项目操作请先进入该目录。使用 --project . 可在当前目录初始化或转换 agents.yaml;不会覆盖已有项目文件。`},{"en-US":`New projects include Skill, File, Vault, and Environment examples under each resource directory's _examples/. They are not referenced by agent.json and are excluded from Build/Publish. Copy an example outside _examples/ to enable it, then configure its Agent reference.`,"zh-CN":`新项目在四类资源目录的 _examples/ 下生成配置示例,不写入 agent.json 引用,也不参与 Build/Publish。需要使用时,将示例复制到 _examples/ 外,再配置 Agent 引用。`}],async run(e){let t=e.flags.project??`./managed-agent`;if(e.settings.dryRun){A({would_initialize_project:t},T(e.settings.output));return}let n=await Po({projectRoot:t});A(n,T(e.settings.output))}}),bT=w({description:{"en-US":`Validate a directory Agent project`,"zh-CN":`校验目录式 Agent 项目`},auth:`none`,usageArgs:`[--project <directory>]`,flags:vT,exampleArgs:[``,`--project ./my-agent`],async run(e){let t=await Ro(e.flags.project??`.`),r=T(e.settings.output);if(r===`json`)A(MT(t),r);else{for(let e of[...t.diagnostics,...t.warnings])k(`${e.severity}: ${e.code}: ${e.message}`);t.diagnostics.some(e=>e.severity===`error`)||k(`Project is valid (${t.project_revision.slice(0,12)}).`)}if(t.diagnostics.some(e=>e.severity===`error`))throw new n(`Directory project validation failed.`,f.GENERAL)}}),xT=w({description:{"en-US":`Organize directory source and generate the immutable Publish Build`,"zh-CN":`整理目录源文件并生成不可变的发布 Build`},auth:`none`,notes:[{"en-US":`Build writes local project files without confirmation, including inferred resource associations and migration of plaintext Vault secrets into .env. Use --dry-run to preview without writing. Publish still requires explicit confirmation before remote changes.`,"zh-CN":`Build 无需确认即可写入本地项目文件,包括推断的资源关联及将 Vault 明文密钥移入 .env。使用 --dry-run 可只预览不写入。Publish 变更远端资源前仍需显式确认。`}],usageArgs:`[--project <directory>]`,flags:vT,exampleArgs:[``,`--dry-run`,`--project ./my-agent`],async validate(e){await q(async()=>{let t=await Lo(e.project??`.`);if(!(await Ji(N(t,`project.json`)).catch(e=>{if(e.code===`ENOENT`)return null;throw e}))?.isFile())throw new n(`Not a project root: ${t} (project.json is missing).`,f.USAGE,`Run from the directory containing project.json, or pass --project <directory>.`)})},async run(e){let t=e.flags.project??`.`,r=await Io(t),i=T(e.settings.output);if(e.settings.dryRun){A(MT(r),i);return}if(!r.can_build)throw new n(r.diagnostics.find(e=>e.severity===`error`)?.message??`Directory project is invalid and cannot be built.`,f.GENERAL);let a=await jo({projectRoot:t,baseRevision:r.project_revision});A({manifest:a.manifest,organization_moves:r.organization_moves},i)}}),ST=w({description:{"en-US":`Publish the current directory-project Build and record a version`,"zh-CN":`发布当前目录项目 Build 并记录版本`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This publishes the current directory-project Build and may create, update, or delete remote managed Agent resources.`,"zh-CN":`该操作会发布当前目录项目 Build,可能创建、更新或删除远端托管 Agent 资源。`}},usageArgs:`[--project <directory>] [--no-refresh] [--concurrency <n>]`,flags:{...vT,noRefresh:{type:`switch`,description:{"en-US":`Skip remote refresh before planning`,"zh-CN":`规划前跳过远端刷新`}},concurrency:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum parallel resource operations`,"zh-CN":`最大并行资源操作数`}}},exampleArgs:[`--yes`,`--project ./my-agent --yes`],notes:G,async run(e){Fw(e);let t=e.flags.project??`.`,n=async(t,n)=>await Lw(e,t,{environment:n?.environment,overrideBailianBaseUrl:!0}),r=await q(()=>J(()=>Fo(t,{provider:`bailian`,refresh:!e.flags.noRefresh,quiet:!0,onFeedback:Kw,resolveBuild:n}))),i=r.planned.plan.actions.filter(e=>e.action!==`no-op`);if(e.settings.dryRun){A({project_revision:r.project_revision,build_manifest:r.build_manifest,plan:r.planned.plan},T(e.settings.output));return}for(let e of i){let t=e.action===`create`?`+`:e.action===`update`?`~`:`-`;k(`${t} ${Gw(e.address)}`)}let a=await q(()=>J(()=>No({projectRoot:r.project_root,expectedProjectRevision:r.project_revision,expectedYamlHash:r.build_manifest.yaml_hash,expectedPlanFingerprint:r.plan_fingerprint,provider:`bailian`,refresh:!e.flags.noRefresh,concurrency:e.flags.concurrency,policy:`force`,onFeedback:Kw,resolveBuild:n})));A(a,T(e.settings.output))}}),CT=w({description:{"en-US":`Launch the directory project Workbench`,"zh-CN":`启动目录项目 Workbench`},auth:`apiKey`,usageArgs:`[--project <directory>] [--port <n>] [--no-open]`,flags:{...vT,port:{type:`number`,valueHint:`<n>`,description:{"en-US":`Local port (default: 4848)`,"zh-CN":`本地端口(默认:4848)`}},noOpen:{type:`switch`,description:{"en-US":`Do not open a browser`,"zh-CN":`不自动打开浏览器`}}},exampleArgs:[``,`--project ./my-agent --no-open`],notes:G,async run(e){let t=e.flags.project??`.`;if(e.settings.dryRun){A({would_launch:`workbench`,project_root:t,port:e.flags.port??4848},T(e.settings.output));return}await $w({project:t,port:e.flags.port??4848,open:!e.flags.noOpen,surface:`workbench`,client:e.client,settings:e.settings})}}),wT=ET(!0),TT=ET(!1);function ET(e){return w({description:e?{"en-US":`Enable directory project versions`,"zh-CN":`启用目录项目版本管理`}:{"en-US":`Disable directory project versions`,"zh-CN":`关闭目录项目版本管理`},auth:`none`,usageArgs:`[--project <directory>]`,flags:vT,exampleArgs:[``,`--project ./my-agent`],async run(t){let n=Mo(t.flags.project??`.`);if(t.settings.dryRun){A({would_set_enabled:e,status:await n.status()},T(t.settings.output));return}let r=e?await n.enable(`Enable project versions`):await n.disable();A(r,T(t.settings.output))}})}const DT=w({description:{"en-US":`Show directory project version status`,"zh-CN":`显示目录项目版本状态`},auth:`none`,usageArgs:`[--project <directory>]`,flags:vT,exampleArgs:[``,`--project ./my-agent --output json`],async run(e){A(await Mo(e.flags.project??`.`).status(),T(e.settings.output))}}),OT=w({description:{"en-US":`List directory project versions`,"zh-CN":`列出目录项目版本`},auth:`none`,usageArgs:`[--project <directory>] [--limit <n>] [--cursor <cursor>]`,flags:{...vT,limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum versions to return`,"zh-CN":`最多返回的版本数`}},cursor:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Pagination cursor`,"zh-CN":`分页游标`}}},exampleArgs:[``,`--limit 20 --output json`],async run(e){A(await Mo(e.flags.project??`.`).listVersions({limit:e.flags.limit,cursor:e.flags.cursor}),T(e.settings.output))}}),kT={versionId:{type:`string`,valueHint:`<full-version>`,required:!0,description:{"en-US":`Full project version ID`,"zh-CN":`完整的项目版本 ID`}}},AT=w({description:{"en-US":`Preview a directory project version`,"zh-CN":`预览目录项目历史版本`},auth:`none`,usageArgs:`--version-id <full-version> [--project <directory>]`,flags:{...vT,...kT},exampleArgs:[`--version-id <full-version>`],async run(e){A(await Mo(e.flags.project??`.`).previewVersion(e.flags.versionId),T(e.settings.output))}}),jT=w({description:{"en-US":`Restore a version to the project working directory`,"zh-CN":`将历史版本恢复到项目工作目录`},auth:`none`,risk:{level:`high`,message:{"en-US":`This restores the full directory source to the working tree. Version history and remote State will not move.`,"zh-CN":`该操作会将完整目录源文件恢复到工作区;版本历史和远端 State 不会移动。`}},usageArgs:`--version-id <full-version> [--project <directory>]`,flags:{...vT,...kT},exampleArgs:[`--version-id <full-version>`,`--version-id <full-version> --yes`],async run(e){let t=Mo(e.flags.project??`.`),r=await t.previewVersion(e.flags.versionId);if(!r.can_restore)throw new n(r.blockers[0]??r.diagnostics[0]?.message??`Version cannot be restored.`,f.GENERAL);if(e.settings.dryRun){A({would_restore:e.flags.versionId,preview:r},T(e.settings.output));return}let i=await t.restoreVersion(e.flags.versionId,{headVersion:r.base_head_version,projectRevision:r.base_project_revision});A(i,T(e.settings.output))}});function MT(e){return{project_root:e.project_root,project_revision:e.project_revision,source_manifest_hash:e.source_manifest_hash,yaml_hash:e.yaml_hash,diagnostics:e.diagnostics,warnings:e.warnings,organization_moves:e.organization_moves,before_yaml:`before_yaml`in e?e.before_yaml:void 0,after_yaml:e.canonical_yaml,can_build:`can_build`in e?e.can_build:void 0}}var NT=w({description:{"en-US":`List resources tracked in agents state`,"zh-CN":`列出 Agent State 中跟踪的资源`},auth:`none`,usageArgs:`[--file <path>]`,flags:{file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[``,`--file agents.yaml`],notes:Ew,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=await q(()=>J(async()=>(await K(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 Hr(o,s))k(e);k(`\nTotal: ${a.length}`)}}),PT=w({description:{"en-US":`Show details of a resource in agents state`,"zh-CN":`显示 Agent State 中资源的详情`},auth:`none`,usageArgs:`--address <provider.type.name> [--file <path>]`,flags:{address:{type:`string`,valueHint:`<provider.type.name>`,description:{"en-US":`Resource state address (required)`,"zh-CN":`资源 State 地址(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--address bailian.agent.assistant`],notes:Ew,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`,o=await q(()=>J(async()=>{let t=await K(e,a,{credentials:`none`}),n=io(r.address,{requireProvider:!1});return t.state.findResource(n)}));if(!o)throw new n(`Resource not found: ${r.address}`,f.GENERAL);i===`json`?A(o,i):k(JSON.stringify(o,null,2))}}),FT=w({description:{"en-US":`Remove a resource from state without destroying it remotely`,"zh-CN":`从 State 中移除资源,但不销毁远端资源`},auth:`none`,risk:{level:`high`,message:{"en-US":`This removes the resource from local state without deleting it remotely, so this project will no longer track it.`,"zh-CN":`该操作会从本地 State 中移除资源但不会删除远端资源,此项目将不再跟踪该资源。`}},usageArgs:`--address <provider.type.name> [--file <path>]`,flags:{address:{type:`string`,valueHint:`<provider.type.name>`,description:{"en-US":`Resource state address (required)`,"zh-CN":`资源 State 地址(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--address bailian.agent.assistant --yes`],notes:Ew,async run(e){let{settings:t,flags:r}=e,i=T(t.output),a=r.file??`agents.yaml`;if(t.dryRun){await q(async()=>{io(r.address,{requireProvider:!1})}),A({would_remove:r.address,config_file:a},i);return}await q(()=>J(async()=>{let t=await K(e,a,{credentials:`none`}),i=io(r.address,{requireProvider:!1}),o=t.state.findResource(i);if(!o)throw new n(`Resource not found: ${r.address}`,f.GENERAL);t.state.removeResource(o.address),await t.state.save()}));let o=`Removed ${r.address} from state (remote resource not deleted).`;i===`json`?A({removed:r.address},i):k(o)}});const IT={address:{type:`string`,valueHint:`<bailian.type.name>`,description:{"en-US":`Resource state address (required)`,"zh-CN":`资源 State 地址(必填)`},required:!0},remoteId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Existing remote resource ID to import (required)`,"zh-CN":`要导入的已有远端资源 ID(必填)`},required:!0},resourceVersion:{type:`number`,valueHint:`<n>`,description:{"en-US":`Resource version (for versioned resources like agents)`,"zh-CN":`资源版本(用于 Agent 等带版本的资源)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}};function LT(e){let t=io(e,{requireProvider:!0});if(t.provider!==`bailian`)throw new n(`bl managed-agent can import only Bailian resources; address provider was '${t.provider}'. / bl managed-agent 只能导入百炼资源;地址中的 Provider 为 '${t.provider}'。`,f.USAGE);return t}var RT=w({description:{"en-US":`Import an existing remote resource into agents state`,"zh-CN":`将已有远端资源导入 Agent State`},auth:`apiKey`,usageArgs:`--address <bailian.type.name> --remote-id <id> [--resource-version <n>] [--file <path>]`,flags:IT,exampleArgs:[`--address bailian.agent.assistant --remote-id agent-abc123`],notes:G,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`;if(t.dryRun){await q(async()=>{LT(n.address)}),A({would_import:n.address,remote_id:n.remoteId,resource_version:n.resourceVersion,config_file:i},r);return}await q(()=>J(async()=>{let t=LT(n.address),r=await K(e,i);await Ra(r,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.`)}});const zT={environment_variables:{type:`array`,valueHint:`<KEY=VALUE>`,description:{"en-US":`Runtime environment variable; repeat for multiple values (last value wins)`,"zh-CN":`运行时环境变量;可重复传入,同名变量以后一次为准`}}};function BT(e){if(e?.length)return Object.fromEntries(e.map(e=>{let t=e.indexOf(`=`);if(t<0)throw new n(`--environment_variables values must use KEY=VALUE format. / --environment_variables 必须使用 KEY=VALUE 格式。`,f.USAGE);let r=e.slice(0,t).trim();if(!r)throw new n(`--environment_variables keys must not be empty. / --environment_variables 的键不能为空。`,f.USAGE);return[r,e.slice(t+1)]}))}function VT(e){return e===void 0?void 0:Object.fromEntries(Object.keys(e).map(e=>[e,`[REDACTED]`]))}const HT=[{"en-US":`Without --yes, this command only previews. --dry-run is fully offline. The scoped flow checks only the target resource and its transitive dependencies; unrelated resources are not refreshed or drift-checked.`,"zh-CN":`不带 --yes 时仅预览;--dry-run 完全离线。定向流程只检查目标资源及其传递依赖,不刷新或检测无关资源的 Drift。`}];function UT(e){let t=e=>Array.isArray(e)?e.map(t):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>[e,t(n)]));return JSON.stringify(t(e))}function WT(e,t=`resource`){return e.normalize(`NFKC`).trim().toLowerCase().replace(/[^\p{L}\p{N}]+/gu,`-`).replace(/^-+|-+$/g,``)||t}function GT(e){let t=new Set(e.state.listResources().filter(t=>t.address.provider===e.provider&&e.resourceTypes.includes(t.address.type)&&!(t.address.type===`memory_store`&&t.remote_id&&t.memory_initialization)).map(e=>e.address.name)),n=UT(e.candidate);for(let[r,i]of Object.entries(e.declarations))if(!(e.effectiveName(r,i)!==e.displayName||t.has(r))&&UT(i)===n)return{key:r,reusedPending:!0};let r=WT(e.displayName,e.fallbackKey);if(!(r in e.declarations))return{key:r,reusedPending:!1};let i=2;for(;`${r}-${i}`in e.declarations;)i+=1;return{key:`${r}-${i}`,reusedPending:!1}}async function KT(e,t){let r=await Ki(P(t),`utf8`).catch(e=>{throw e.code===`ENOENT`?new n(`Config file not found: ${t}`,f.USAGE,"Run `bl managed-agent init` first."):e}),i=await q(()=>Lw(e,t,{credentials:`none`})),a=await Ki(i.configPath,`utf8`);if(a!==r)throw new n(`${t} changed while it was being loaded.`,f.GENERAL,`Re-run the command against the latest file.`);let o=`bailian`;e.settings.dryRun||jw(i.config.providers,[o]),Fw(e);let s=new na({configPath:i.configPath});return{...i,source:a,provider:o,stateBackend:s,stateScope:Mw(i.configPath,i.projectName)}}async function qT(e){let t=`__bailian_cli_create_candidate__`,n={version:e.project.config.version,providers:e.project.config.providers,defaults:e.project.config.defaults,[e.group]:{[t]:e.rawDeclaration}};return(await q(()=>mo(n,{projectName:e.project.projectName,basePath:ji(e.project.configPath)}))).config[e.group]?.[t]??e.rawDeclaration}async function JT(e){let{project:t,host:r}=e,i=T(r.settings.output),a=await t.stateBackend.read(t.stateScope,n=>GT({displayName:e.displayName,provider:t.provider,resourceTypes:[e.resourceType],declarations:e.existingDeclarations,candidate:e.resolvedDeclaration,effectiveName:e.effectiveName,fallbackKey:e.fallbackKey,state:n})),o=a.key,s=structuredClone(t.config),c=s[e.group]??{};s[e.group]={...c,[o]:e.resolvedDeclaration},s._resolved=!0;let l=Ri(t.source);if(l.errors.length>0)throw new n(`YAML parse error: ${l.errors.map(e=>e.message).join(`; `)}`,f.USAGE);l.setIn([e.group,o],e.rawDeclaration);let u=l.toString(),d={type:e.resourceType,name:o,provider:t.provider},p={projectName:t.projectName,config:s,configPath:t.configPath,providers:{[t.provider]:t.config.providers[t.provider]},stateBackend:t.stateBackend,stateScope:t.stateScope};if(r.settings.dryRun||!e.yes){let n=await q(()=>J(()=>so(p,{provider:t.provider,scope:{roots:[d]},mode:`create-only`,refresh:!r.settings.dryRun,quiet:i===`json`}))),s=!n.plan.diagnostics.some(e=>e.severity===`error`),c={resource:{type:e.resourceType,key:o,name:e.displayName,provider:t.provider},config_file:t.configPath,yaml_written:!1,reused_pending:a.reusedPending,requires_confirmation:!r.settings.dryRun,ready_to_create:s,actions:n.plan.actions,diagnostics:n.plan.diagnostics};i===`json`?A(c,i):(k(`Generated YAML key: ${o}`),QT(n.plan.actions,n.plan.diagnostics),k(r.settings.dryRun?`Dry run: YAML, State, and remote resources were not changed.`:`Preview only: re-run with --yes to write YAML and create this resource.`));return}await YT(t.configPath,t.source,u);let m;try{m=await q(()=>J(()=>Co(p,{provider:t.provider,scope:{roots:[d]},mode:`create-only`,refresh:!0,quiet:i===`json`,policy:`block`})))}catch(t){throw Uw(t,`The YAML declaration was kept. Fix the related dependency or provider error, then re-run the same create command.`,`Scoped ${e.resourceType} create failed.`)}let h=await t.stateBackend.read(t.stateScope,e=>e.getResource(d)?.remote_id),g=m.execution?.results??[],_=g.find(e=>e.status===`failed`),v={resource:{type:e.resourceType,key:o,name:e.displayName,provider:t.provider,remote_id:h},config_file:t.configPath,yaml_written:!0,reused_pending:a.reusedPending,actions:m.planned.plan.actions,diagnostics:m.planned.plan.diagnostics,results:g,error:_?.error};if(i===`json`?A(v,i):(k(`Wrote ${t.configPath} with ${e.resourceType} key '${o}'.`),_||k(`Created ${e.resourceType} '${e.displayName}'.`)),_)throw new n(_.error??`Scoped ${e.resourceType} create failed.`,f.GENERAL,`The YAML declaration was kept. Fix the provider error, then re-run the same create command.`)}async function YT(e,t,r){let i=P(e);if(await Ki(i,`utf8`)!==t)throw new n(`${e} changed while resource create was being prepared.`,f.GENERAL,`Review the latest YAML and re-run the command; no file was overwritten.`);let a=await Ji(i),o=P(ji(i),`.${Ai(i)}.${ai()}.tmp`);await Xi(o,r,{flag:`wx`,mode:a.mode});try{await qi(o,i)}catch(e){throw await Yi(o).catch(()=>void 0),e}}function XT(e){if(!e?.length)return;let t={};for(let r of e){let e=r.indexOf(`=`);if(e<=0)throw new n(`Invalid metadata '${r}'.`,f.USAGE,`Use --metadata key=value.`);let i=r.slice(0,e).trim();if(!i)throw new n(`Metadata key must not be empty.`,f.USAGE);t[i]=r.slice(e+1)}return t}async function ZT(e,t){let r=[];for(let i of e??[]){let e=i.startsWith(`@`)?await Ki(P(i.slice(1)),`utf8`):i,a;try{a=JSON.parse(e)}catch(e){throw new n(`Invalid ${t} JSON: ${e instanceof Error?e.message:String(e)}`,f.USAGE)}Array.isArray(a)?r.push(...a):r.push(a)}return r}function QT(e,t){for(let e of t)k(`[${e.severity}] ${e.code}: ${e.message}`);for(let t of e.filter(e=>e.action!==`no-op`)){let e=t.action===`create`?`+`:t.action===`update`?`~`:`-`;k(` ${e} ${Gw(t.address)}`)}}const $T={resource:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`Session resource JSON (repeatable); memory_store uses a YAML key, access and instructions`,"zh-CN":`Session 资源 JSON(可重复);memory_store 使用 YAML key、access 和 instructions`}}};async function eE(e){if(e===void 0)return;let t=await ZT(e,`resource`);if(t.some(e=>typeof e!=`object`||!e||!(`type`in e)||e.type!==`memory_store`))throw new n(`Bailian Session resources only support memory_store. / 百炼 Session 资源仅支持 memory_store。`,f.USAGE);return q(async()=>ro(t))}function tE(e){return e.type!==`thinking`&&(e.type!==`message`||e.role!==`user`)}function nE(e,t){t||process.stderr.write(`\n[session ${e}]\n`)}function rE(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 iE(e,t){if(e===`failed`)throw new n(t??`Session failed.`,f.GENERAL)}async function aE(e,t,n={}){let r=[],i,a;for await(let n of e)if(t?r.push(n):oE(n),n.type===`error`&&n.content?.trim()&&(a=n.content),n.type===`status`&&Ba(n.status)){i=n.status,nE(n.status??``,t);break}t&&process.stdout.write(`${JSON.stringify({...n,events:zo(r)},null,2)}\n`),iE(i,a)}function oE(e){if(tE(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(`
2878
2877
  [session running]
2879
- `):e.type===`error`&&process.stderr.write(`\n[error] ${e.content??`unknown error`}\n`)}}function hT(e,t,n={}){if(t)process.stdout.write(`${JSON.stringify({...n,events:Io(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)mT(t);uT(e.terminalStatus,t)}fT(e.terminalStatus,dT(e.result.events))}function gT(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):void 0}const _T={...qw,...sT,file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Agent name (auto-detected when only one agent is configured)`,"zh-CN":`Agent 名称(仅配置一个 Agent 时自动识别)`}},environment:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared environment`,"zh-CN":`覆盖 Agent 声明的环境`}},vault:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared vault`,"zh-CN":`覆盖 Agent 声明的 Vault`}},memoryStores:{type:`string`,valueHint:`<names>`,description:{"en-US":`Override memory stores with comma-separated YAML keys`,"zh-CN":`使用逗号分隔的 YAML key 覆盖 Memory Store`}},title:{type:`string`,valueHint:`<title>`,description:{"en-US":`Session title`,"zh-CN":`Session 标题`}}};var vT=w({description:{"en-US":`Create a new session for an agent`,"zh-CN":`为 Agent 创建新 Session`},auth:`apiKey`,usageArgs:`[--agent <name>] [--environment <name>] [--title <title>] [--environment_variables <KEY=VALUE>...] [--memory-stores <keys>] [--resource <json|@path>...] [--file <path>]`,flags:_T,exampleArgs:[`--agent assistant --environment_variables LOG_LEVEL=info --environment_variables FEATURE_FLAG=on`,`--agent assistant --resource '{"type":"memory_store","memory_store":"notes","access":"read_only"}'`,``,`--agent assistant`,{"en-US":`--agent assistant --title 'debug run'`,"zh-CN":`--agent assistant --title '调试运行'`}],notes:K,async validate(e){Jw(e.environment_variables),await cT(e.resource)},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=Jw(n.environment_variables),o=await cT(n.resource);if(t.dryRun){A({would_create_session:{agent:n.agent??`auto`,provider:`bailian`,environment:n.environment,environment_variables:Yw(a),vault:n.vault,memory_stores:gT(n.memoryStores),resources:o,title:n.title},config_file:i},r);return}let{agentName:s,session:c}=await J(()=>Y(async()=>{let t=await q(e,i);return ua(t,{agent:n.agent,provider:`bailian`,environment:n.environment,environmentVariables:a,vault:n.vault,memoryStores:gT(n.memoryStores),resources:o,title:n.title})}));if(r===`json`){A({agent:s,session:c},r);return}k(`Session created: ${c.id}`),k(` Agent: ${s}`),k(` Environment: ${c.environment_id}`),k(` Status: ${c.status}`),c.vault_ids.length&&k(` Vaults: ${c.vault_ids.join(`, `)}`),c.memory_store_ids.length&&k(` Memory: ${c.memory_store_ids.join(`, `)}`)}});async function yT(e,t,n){let r=await e(n),i=[...r.items],a=r.hasMore,o=r.nextPage;for(;t&&o;){let t=await e(o);i.push(...t.items),a=t.hasMore,o=t.nextPage}return{items:i,hasMore:a,nextPage:o}}const X={file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},bT={limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size (1-100)`,"zh-CN":`单页数量(1-100)`}},page:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Opaque page cursor returned by a previous request`,"zh-CN":`上一次请求返回的不透明分页 Cursor`}},all:{type:`switch`,description:{"en-US":`Fetch all pages by following opaque cursors`,"zh-CN":`跟随不透明 Cursor 获取全部分页`}}},xT={query:{type:`string`,valueHint:`<text>`,required:!0,description:{"en-US":`Case-insensitive text to find in IDs, names, and descriptions`,"zh-CN":`在 ID、名称和描述中进行不区分大小写的文本搜索`}},pageLimit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum pages to scan for client-side search (default: 10)`,"zh-CN":`客户端搜索最多扫描的页数(默认:10)`}}},ST={includeArchived:{type:`switch`,description:{"en-US":`Include archived resources`,"zh-CN":`包含已归档资源`}}};function CT(e){if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>100))return`--limit must be an integer between 1 and 100.`;if(e.pageLimit!==void 0&&(!Number.isInteger(e.pageLimit)||e.pageLimit<1||e.pageLimit>100))return`--page-limit must be an integer between 1 and 100.`}function wT(e){if(!e)return;let t=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t.length>0?t:void 0}function TT(e,...t){let n=e.trim().toLocaleLowerCase();return!n||t.some(e=>e!=null&&(typeof e==`string`?e:JSON.stringify(e)).toLocaleLowerCase().includes(n))}async function ET(e,t,n=10){let r=[],i,a=!1,o,s=0;do{let n=await e(i);s+=1,r.push(...n.items.filter(t)),a=n.hasMore,o=n.nextPage,i=n.nextPage}while(a&&i&&s<n);return{items:r,hasMore:a,nextPage:o,scannedPages:s,truncated:!!(a&&o)}}function DT(e){let{format:t,key:n,items:r,headers:i,rows:a,hasMore:o=!1,nextPage:s,truncated:c,scannedPages:l,emptyMessage:u=`No resources found.`}=e;if(t===`json`){A({[n]:r,has_more:o,next_page:s,...c===void 0?{}:{truncated:c},...l===void 0?{}:{scanned_pages:l}},t);return}if(r.length===0){k(u);return}for(let e of zr(i,a))k(e);k(`\nTotal: ${r.length}`),c?k(`Search stopped at --page-limit; more pages remain.`):o&&k(`More results are available.${s?` Next page: ${s}`:``}`)}function Z(e,t=40){if(e==null||e===``)return`-`;let n=typeof e==`string`?e:JSON.stringify(e);return n.length>t?`${n.slice(0,t-3)}...`:n}const OT={file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by agent name`,"zh-CN":`按 Agent 名称筛选`}},all:{type:`switch`,description:{"en-US":`Fetch all pages by following the cursor`,"zh-CN":`跟随 Cursor 获取全部分页`}},limit:bT.limit,page:bT.page,statuses:{type:`string`,valueHint:`<statuses>`,description:{"en-US":`Comma-separated session statuses`,"zh-CN":`Session 状态,多个以逗号分隔`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this RFC 3339 timestamp`,"zh-CN":`创建时间不早于该 RFC 3339 时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this RFC 3339 timestamp`,"zh-CN":`创建时间不晚于该 RFC 3339 时间戳`}}};var kT=w({description:{"en-US":`List sessions from the provider`,"zh-CN":`列出 Provider 中的 Session`},auth:`apiKey`,usageArgs:`[--agent <name>] [--statuses <statuses>] [--limit <n>] [--page <cursor>] [--all]`,flags:OT,exampleArgs:[``,`--agent assistant`,`--all`],notes:K,validate:CT,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,{items:a,hasMore:o,nextPage:s}=await J(()=>Y(async()=>{let t=await q(e,i);return yT(async e=>{let r=await $a(t,{agent:n.agent,provider:`bailian`,filter:{page:e,limit:n.limit,statuses:wT(n.statuses),created_at_gte:n.createdAtGte,created_at_lte:n.createdAtLte}});return{items:r.summaries,hasMore:r.hasMore,nextPage:r.nextPage}},n.all,n.page)})),c=a.map(e=>e.session);if(r===`json`){A({sessions:c,has_more:o,next_page:s},r);return}if(c.length===0){k(`No sessions found.`);return}let l=new Map(a.filter(e=>e.agentName).map(e=>[e.session.id,e.agentName])),u=[`ID`,`TITLE`,`AGENT`,`STATUS`,`CREATED`],d=c.map(e=>[e.id,(e.title??``).slice(0,20),l.get(e.id)??e.agent_id.slice(0,12),e.status,e.created_at]);for(let e of zr(u,d))k(e);k(`\nTotal: ${c.length}`),o&&k(`More sessions available. Use --all to fetch all.`)}}),AT=w({description:{"en-US":`Get details of a session`,"zh-CN":`获取 Session 详情`},auth:`apiKey`,usageArgs:`--session-id <id> [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID (required)`,"zh-CN":`Session ID(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--session-id sess_abc123`],notes:K,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=await J(()=>Y(async()=>{let t=await q(e,i);return Pa(t,n.sessionId,`bailian`)}));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}`)}}),jT=w({description:{"en-US":`Delete a session`,"zh-CN":`删除 Session`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes the specified remote managed Agent Session.`,"zh-CN":`该操作会删除指定的远端托管 Agent Session。`}},usageArgs:`--session-id <id> [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID (required)`,"zh-CN":`Session ID(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--session-id sess_abc123 --yes`],notes:K,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:`bailian`,config_file:i},r);return}await J(()=>Y(async()=>{let t=await q(e,i);await ha(t,n.sessionId,`bailian`)})),r===`json`?A({deleted:n.sessionId},r):k(`Session ${n.sessionId} deleted.`)}});const MT={...qw,...sT,prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Prompt to send (required)`,"zh-CN":`要发送的 Prompt(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Agent name (auto-detected when only one agent is configured)`,"zh-CN":`Agent 名称(仅配置一个 Agent 时自动识别)`}},environment:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared environment`,"zh-CN":`覆盖 Agent 声明的环境`}},vault:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared vault`,"zh-CN":`覆盖 Agent 声明的 Vault`}},memoryStores:{type:`string`,valueHint:`<names>`,description:{"en-US":`Override memory stores with comma-separated YAML keys`,"zh-CN":`使用逗号分隔的 YAML key 覆盖 Memory Store`}},title:{type:`string`,valueHint:`<title>`,description:{"en-US":`Session title`,"zh-CN":`Session 标题`}},noStream:{type:`switch`,description:{"en-US":`Use polling instead of SSE streaming`,"zh-CN":`使用轮询代替 SSE 流式传输`}}};var NT=w({description:{"en-US":`Create a session, send a message, and stream the response`,"zh-CN":`创建 Session、发送消息并流式输出响应`},auth:`apiKey`,usageArgs:`--prompt <text> [--agent <name>] [--no-stream] [--environment_variables <KEY=VALUE>...] [--memory-stores <keys>] [--resource <json|@path>...] [--file <path>]`,flags:MT,exampleArgs:[{"en-US":`--agent assistant --environment_variables LOG_LEVEL=info --prompt "hello"`,"zh-CN":`--agent assistant --environment_variables LOG_LEVEL=info --prompt "你好"`},{"en-US":`--agent assistant --resource '{"type":"memory_store","memory_store":"notes","access":"read_only"}' --prompt "hello"`,"zh-CN":`--agent assistant --resource '{"type":"memory_store","memory_store":"notes","access":"read_only"}' --prompt "你好"`},{"en-US":`--prompt "hello"`,"zh-CN":`--prompt "你好"`},{"en-US":`--agent assistant --prompt "summarize this repo"`,"zh-CN":`--agent assistant --prompt "总结这个代码仓库"`}],notes:[...K,{"en-US":"--output json emits one envelope: { session_id, provider, agent, events } — read session_id to chain `session send/get/events/delete`.","zh-CN":"--output json 输出一个 Envelope:{ session_id, provider, agent, events }。读取 session_id 后可串联调用 `session send/get/events/delete`。"}],async validate(e){Jw(e.environment_variables),await cT(e.resource)},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=Jw(n.environment_variables),o=await cT(n.resource),s=r===`json`,c={agent:n.agent,provider:`bailian`,environment:n.environment,environmentVariables:a,vault:n.vault,memoryStores:gT(n.memoryStores),resources:o,title:n.title};if(t.dryRun){A({would_run:{prompt:n.prompt,agent:n.agent??`auto`,provider:`bailian`,environment:n.environment,environment_variables:Yw(a),vault:n.vault,memory_stores:c.memoryStores,resources:o,title:n.title,mode:n.noStream?`polling`:`streaming`},config_file:i},r);return}await J(()=>Y(async()=>{let t=await q(e,i);if(n.noStream){let e=await vo(t,n.prompt,c);s||process.stderr.write(`Session created: ${e.session.id}\n`),hT(e,s,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}else{let e=await _o(t,n.prompt,c);s||process.stderr.write(`Session created: ${e.session.id}\n`),await pT(e.events,s,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}}))}}),PT=w({description:{"en-US":`Send a message to an existing session and stream the response`,"zh-CN":`向已有 Session 发送消息并流式输出响应`},auth:`apiKey`,usageArgs:`--session-id <id> --message <text> [--no-stream] [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID (required)`,"zh-CN":`Session ID(必填)`},required:!0},message:{type:`string`,valueHint:`<text>`,description:{"en-US":`Message to send (required)`,"zh-CN":`要发送的消息(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},noStream:{type:`switch`,description:{"en-US":`Use polling instead of SSE streaming`,"zh-CN":`使用轮询代替 SSE 流式传输`}}},exampleArgs:[{"en-US":`--session-id sess_abc123 --message "continue"`,"zh-CN":`--session-id sess_abc123 --message "继续"`}],notes:K,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:`bailian`,mode:n.noStream?`polling`:`streaming`},config_file:i},r);return}await J(()=>Y(async()=>{let t=await q(e,i);n.noStream?hT(await mo(t,n.sessionId,n.message,{provider:`bailian`}),a,{session_id:n.sessionId}):await pT(await ho(t,n.sessionId,n.message,{provider:`bailian`}),a,{session_id:n.sessionId})}))}});async function FT(e){return new Uint8Array(await Ui(P(e)))}async function IT(e){let t=e.startsWith(`@`)?await Ui(P(e.slice(1)),`utf8`):e;try{return JSON.parse(t)}catch(e){let t=e instanceof Error?e.message:String(e);throw new n(`Invalid JSON input: ${t}`,f.USAGE)}}async function LT(e,t,r=!1){let i=P(e),a=Oi(i);await Hi(a,{recursive:!0});let o=`${i}.${ni()}.tmp`;await qi(o,t,{flag:`wx`});try{if(r)await Wi(o,i);else{try{await Vi(o,i)}catch(e){throw e.code===`EEXIST`?new n(`Output file already exists: ${i}`,f.USAGE,`Choose another --output-file path or re-run with --force.`):e}await Ki(o)}return i}catch(e){throw await Ki(o).catch(()=>void 0),e}}function RT(e){let t=Di(e).toLocaleLowerCase();return t.endsWith(`.json`)?`application/json`:t.endsWith(`.md`)?`text/markdown`:t.endsWith(`.txt`)?`text/plain`:t.endsWith(`.pdf`)?`application/pdf`:t.endsWith(`.png`)?`image/png`:t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)?`image/jpeg`:t.endsWith(`.zip`)?`application/zip`:`application/octet-stream`}const zT={sessionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Session ID`,"zh-CN":`Session ID`}}},BT={...X,...zT,...bT,order:{type:`string`,valueHint:`<order>`,choices:[`asc`,`desc`],description:{"en-US":`Event order: asc or desc`,"zh-CN":`事件顺序:asc 或 desc`}},types:{type:`string`,valueHint:`<types>`,description:{"en-US":`Comma-separated raw event types`,"zh-CN":`原始事件类型,多个以逗号分隔`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this timestamp`,"zh-CN":`创建时间不早于该时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this timestamp`,"zh-CN":`创建时间不晚于该时间戳`}}},VT={...X,...zT,event:{type:`string`,valueHint:`<json|@path>`,required:!0,description:{"en-US":`Raw event object/array as JSON or @event.json`,"zh-CN":`原始事件对象/数组 JSON,或 @event.json`}}},HT={...X,...zT,afterId:{type:`string`,valueHint:`<event-id>`,description:{"en-US":`Resume after this event ID`,"zh-CN":`从该 Event ID 之后继续`}}};function UT(e){return e.map(e=>[Z(e.id),e.raw_type,Z(e.session_thread_id),Z(e.content??e.status??e.tool_name,70)])}function WT(e){let t=Array.isArray(e)?e:[e];if(t.length===0||t.some(e=>!e||typeof e!=`object`||Array.isArray(e)))throw new n(`Event input must be a JSON object or a non-empty array of objects.`,f.USAGE);for(let[e,r]of t.entries()){let t=ea.safeParse(r);if(t.success)continue;let i=t.error.issues[0],a=i?.path.length?` at ${i.path.join(`.`)}`:``;throw new n(`Invalid event at index ${e}${a}: ${i?.message??`does not match the Session event schema`}.`,f.USAGE)}return t}const GT=w({description:{"en-US":`List events for a Managed Agent session`,"zh-CN":`列出托管 Agent Session 事件`},auth:`apiKey`,usageArgs:`--session-id <id> [--types <types>] [--order asc|desc] [--limit <n>] [--page <cursor>] [--all]`,flags:BT,exampleArgs:[`--session-id sess_abc`,`--session-id sess_abc --all --output json`],notes:[...K,{"en-US":`--types is applied client-side to each page returned by the provider.`,"zh-CN":`--types 会在客户端对 Provider 返回的每一页结果进行过滤。`}],validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Qa(t,e.flags.sessionId,{provider:`bailian`,limit:e.flags.limit,page_token:n,order:e.flags.order,types:wT(e.flags.types),created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte});return{items:r.events,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`events`,items:Io(n.items),headers:[`ID`,`TYPE`,`THREAD`,`CONTENT`],rows:UT(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No events found.`})}}),KT=w({description:{"en-US":`Send raw events to a Managed Agent session`,"zh-CN":`向托管 Agent Session 发送原始事件`},auth:`apiKey`,usageArgs:`--session-id <id> --event <json|@path>`,flags:VT,exampleArgs:[`--session-id sess_abc --event '{"type":"message","role":"user","content":[{"type":"text","text":"hello"}]}'`,`--session-id sess_abc --event @event.json`],notes:K,async run(e){let t=T(e.settings.output),n=WT(await IT(e.flags.event));if(e.settings.dryRun){A({would_send_events:n,session_id:e.flags.sessionId},t);return}let r=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return po(t,e.flags.sessionId,n,{provider:`bailian`})}));t===`json`?A({session_id:e.flags.sessionId,...r},t):k(`Sent ${n.length} event(s): ${r.event_ids.join(`, `)}`)}}),qT=w({description:{"en-US":`Stream events from a Managed Agent session`,"zh-CN":`流式读取托管 Agent Session 事件`},auth:`apiKey`,usageArgs:`--session-id <id> [--after-id <event-id>]`,flags:HT,exampleArgs:[`--session-id sess_abc`,`--session-id sess_abc --after-id evt_123 --output json`],notes:[...K,{"en-US":`When the provider has no native event cursor, --after-id resumes through paginated history polling and event ID de-duplication.`,"zh-CN":`当 Provider 不支持原生事件 Cursor 时,--after-id 会通过分页历史轮询和 Event ID 去重实现续传。`}],async run(e){let t=T(e.settings.output);await J(()=>Y(async()=>{let n=await q(e,e.flags.file??`agents.yaml`),r=[];for await(let i of yo(n,e.flags.sessionId,{provider:`bailian`,after_id:e.flags.afterId}))if(r.push(i),t!==`json`&&k(JSON.stringify(Io([i])[0])),i.type===`status`&&La(i.status))break;t===`json`&&A({session_id:e.flags.sessionId,events:Io(r)},t)}))}}),JT={source:{type:`string`,valueHint:`<source>`,choices:[`custom`,`official`,`all`],description:{"en-US":`Skill catalog: custom (default), official, or all`,"zh-CN":`Skill Catalog:custom(默认)、official 或 all`}}},YT={...X,...bT,...JT},XT={...X,limit:bT.limit,...xT,...JT},ZT={...X,skillId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Skill ID`,"zh-CN":`Skill ID`}}},QT={...ZT,...bT},$T={...ZT,skillVersion:{type:`string`,valueHint:`<version>`,required:!0,description:{"en-US":`Skill version`,"zh-CN":`Skill 版本`}},outputFile:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Destination ZIP path`,"zh-CN":`目标 ZIP 路径`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing output file`,"zh-CN":`覆盖已存在的输出文件`}}};function eE(e){return e.map(e=>[e.id,Z(e.name),e.source,e.status,Z(e.latest_version),Z(e.updated_at??e.created_at)])}function tE(e){return e.map(e=>[Z(e.version),Z(e.name),Z(e.type),Z(e.status),Z(e.updated_at??e.created_at)])}function nE(e,t){return{source:e,skills:t.items,has_more:t.hasMore,next_page:t.nextPage}}async function rE(e,t,n){return yT(async r=>{let i=await Ja(e,{provider:`bailian`,source:t,limit:n.limit,page:r});return{items:i.data,hasMore:i.has_more,nextPage:i.next_page}},n.all,n.page)}var iE=w({description:{"en-US":`List Managed Agent skills`,"zh-CN":`列出托管 Agent Skill`},auth:`apiKey`,usageArgs:`[--source custom|official|all] [--limit <n>] [--page <cursor>] [--all]`,flags:YT,exampleArgs:[``,`--source official`,`--source all --all --output json`],notes:[...K,{"en-US":`--source all combines one page from each catalog, or every page with --all; it does not accept --page.`,"zh-CN":`--source all 默认合并两个 Catalog 的各一页,传入 --all 时获取全部分页;该模式不接受 --page。`}],validate:e=>CT(e)??(e.source===`all`&&e.page?`--source all cannot be combined with --page.`:void 0),async run(e){let t=T(e.settings.output),n=e.flags.source??`custom`,r=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);if(n!==`all`)return rE(t,n,{limit:e.flags.limit,page:e.flags.page,all:e.flags.all});let[r,i]=await Promise.all([rE(t,`custom`,{limit:e.flags.limit,all:e.flags.all}),rE(t,`official`,{limit:e.flags.limit,all:e.flags.all})]);return{items:[...r.items,...i.items],hasMore:r.hasMore||i.hasMore,nextPage:void 0}}));if(t===`json`){A(nE(n,r),t);return}DT({format:t,key:`skills`,items:r.items,headers:[`ID`,`NAME`,`SOURCE`,`STATUS`,`VERSION`,`UPDATED`],rows:eE(r.items),hasMore:r.hasMore,nextPage:r.nextPage,emptyMessage:`No skills found.`})}});const aE={name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Agent display name; the YAML key is generated automatically`,"zh-CN":`远端 Agent 显示名称;YAML key 将自动生成`}},model:{type:`string`,valueHint:`<model>`,required:!0,description:{"en-US":`Model ID`,"zh-CN":`模型 ID`}},instructions:{type:`string`,valueHint:`<text|path>`,required:!0,description:{"en-US":`Inline instructions or a ./, ../, or absolute file path`,"zh-CN":`内联指令,或以 ./、../、/ 开头的文件路径`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Agent description`,"zh-CN":`Agent 描述`}},skill:{type:`array`,valueHint:`<id>`,description:{"en-US":`Existing remote Skill ID (repeatable)`,"zh-CN":`已存在的远端 Skill ID(可重复)`}},skillDir:{type:`array`,valueHint:`<path>`,description:{"en-US":`Local Skill directory or ZIP to declare, upload, and attach through the same scoped create (repeatable)`,"zh-CN":`通过同一次定向创建声明、上传并绑定的本地 Skill 目录或 ZIP(可重复)`}},type:{type:`string`,valueHint:`<custom|official>`,choices:[`custom`,`official`],description:{"en-US":`Type applied to every --skill value (default: custom)`,"zh-CN":`应用于所有 --skill 的类型(默认:custom)`}},tool:{type:`array`,valueHint:`<name>`,description:{"en-US":`Builtin tool name (repeatable)`,"zh-CN":`内置工具名称(可重复)`}},environment:{type:`string`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Environment key from agents.yaml, used as the default Session/Deployment environment`,"zh-CN":`agents.yaml 中已有的 Environment key,作为 Session/Deployment 的默认环境`}},vault:{type:`string`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Vault key from agents.yaml, used as the default Session/Deployment vault`,"zh-CN":`agents.yaml 中已有的 Vault key,作为 Session/Deployment 的默认 Vault`}},mcp:{type:`array`,valueHint:`<server-code>`,description:{"en-US":`MCP market server code; all of its tools are enabled (repeatable)`,"zh-CN":`MCP 市场服务 code,启用其全部工具(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}};function oE(e){return $w({displayName:e.displayName,provider:e.provider,resourceTypes:[`agent`,`template`],declarations:e.agents,candidate:e.candidate,effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`agent`,state:e.state})}function sE(e){if(e===void 0||e===`custom`)return`custom`;if(e===`official`)return`official`;throw new n(`--type must be either custom or official.`,f.USAGE)}function cE(e,t=`custom`){let r=/* @__PURE__ */ new Set,i=[];for(let a of e??[]){let e=a.trim();if(!e)throw new n(`--skill values must not be empty.`,f.USAGE);r.has(e)||(r.add(e),i.push({type:t,skill_id:e}))}return i}function lE(e){let t=/* @__PURE__ */ new Set,r=[];for(let i of e??[]){let e=i.trim();if(!e)throw new n(`--mcp values must not be empty.`,f.USAGE);t.has(e)||(t.add(e),r.push({serverName:e,serverType:`official`,defaultEnabled:!0}))}return r}function uE(e,t,r,i){if(t!==void 0&&r?.[t]===void 0)throw new n(`${e} '${t}' is not declared in ${i}.`,f.USAGE,`Create the ${e} first with the managed-agent ${e.toLowerCase()} create command, then pass its YAML key.`)}function dE(e){let t=e=>Array.isArray(e)?e.map(t):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>[e,t(n)]));return JSON.stringify(t(e))}function fE(e){let t=new Set(e.state.listResources().filter(t=>t.address.provider===e.provider&&t.address.type===`skill`).map(e=>e.address.name)),r=Object.entries(e.declarations).filter(([t,n])=>(typeof n.name==`string`?n.name:t)===e.displayName),i=r.find(([n,r])=>t.has(n)&&dE(r)===dE(e.candidate));if(i)return{key:i[0],needsCreate:!1,reusedPending:!1,reusedTracked:!0};if(r.find(([e])=>t.has(e)))throw new n(`Skill '${e.displayName}' is already tracked with a different declaration.`,f.USAGE,"Modify its existing YAML declaration and run full `bl managed-agent apply`, or bind its remote ID with --skill.");return{...$w({displayName:e.displayName,provider:e.provider,resourceTypes:[`skill`],declarations:e.declarations,candidate:e.candidate,effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`skill`,state:e.state}),needsCreate:!0,reusedTracked:!1}}async function pE(e,t){let r={...e.config.skills??{}},i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Map;for(let o of t??[]){let t=o.trim();if(!t)throw new n(`--skill-dir values must not be empty.`,f.USAGE);let s=await J(()=>Ia(t,{basePath:process.cwd()})),c=await Gi(s.sourcePath);if(!(c.isDirectory()||c.isFile()&&ki(s.sourcePath).toLowerCase()===`.zip`))throw new n(`--skill-dir requires a Skill directory or .zip file: ${t}`,f.USAGE);if(i.has(s.sourcePath))continue;let l=Ai(Oi(e.configPath),s.sourcePath).split(ji).join(`/`)||`.`,u={name:s.name,source:l,origin:`custom`,provider:e.provider},d=await tT({project:e,group:`skills`,rawDeclaration:u}),p=await e.stateBackend.read(e.stateScope,t=>fE({displayName:s.name,provider:e.provider,declarations:r,candidate:d,state:t})),m=a.get(p.key);if(m){i.set(s.sourcePath,m);continue}let h={...p,name:s.name,source:l,rawDeclaration:u,resolvedDeclaration:d};r[p.key]=d,i.set(s.sourcePath,h),a.set(p.key,h)}return[...a.values()]}var mE=w({description:{"en-US":`Declare and create one Managed Agent through an isolated YAML apply`,"zh-CN":`通过隔离的 YAML Apply 声明并创建一个托管 Agent`},auth:`apiKey`,usageArgs:`--name <name> --model <model> --instructions <text|path> [--description <text>] [--skill <id>...] [--type custom|official] [--skill-dir <path>...] [--tool <name>...] [--environment <yaml-key>] [--vault <yaml-key>] [--mcp <server-code>...] [--file <path>] [--yes]`,flags:aE,exampleArgs:[`--name assistant --model qwen3.8-max --instructions "You are helpful."`,`--name assistant --model qwen3.8-max --instructions ./prompts/assistant.md --skill skill_abc --yes`,`--name slides --model qwen3.8-max --instructions ./prompts/slides.md --skill skill_pptx --type official --yes`,`--name reviewer --model qwen3.8-max --instructions ./prompts/reviewer.md --skill-dir ./skills/code-review --yes`,`--name researcher --model qwen3.8-max --instructions ./prompts/researcher.md --environment dev --vault secrets --mcp market-cmgjmcp00074952 --yes`],notes:[...K,{"en-US":`Without --yes, previews the generated YAML key and scoped plan. --dry-run stays offline. Unrelated resources are not refreshed or drift-checked.`,"zh-CN":`不带 --yes 时预览自动生成的 YAML key 和定向计划;--dry-run 完全离线。无关资源不会刷新或检测 Drift。`},{"en-US":`--skill writes an external Skill reference directly into the Agent declaration. --type defaults to custom; use --type official for platform Skills. These Skills are not managed through the top-level skills map.`,"zh-CN":`--skill 会把外部 Skill 引用直接写入 Agent 声明。--type 默认为 custom;平台 Skill 使用 --type official。这些 Skill 不通过顶层 skills 资源管理。`},{"en-US":`--skill-dir accepts a local Skill directory or ZIP, writes it as a top-level custom Skill declaration, and writes its generated YAML key into the Agent skills list. Skill and Agent are created together in dependency order. --type applies only to --skill IDs.`,"zh-CN":`--skill-dir 接收本地 Skill 目录或 ZIP,将其写为顶层 custom Skill 声明,并把生成的 YAML key 写入 Agent 的 skills 列表;Skill 与 Agent 按依赖顺序一并创建。--type 只作用于 --skill ID。`},{"en-US":`--environment and --vault write existing YAML keys into the Agent declaration as default runtime bindings; they are not sent to the Agent API. session create|run and deployment create use them unless those commands pass their own. The referenced Environment and Vault must already be created.`,"zh-CN":`--environment 与 --vault 把已有的 YAML key 写入 Agent 声明,作为默认运行时绑定,不会发送给 Agent API;session create|run 与 deployment create 未显式传入时使用它们。引用的 Environment 与 Vault 必须已创建。`},{"en-US":`--mcp accepts MCP market server codes (see mcp list) and enables all of their tools. To toggle individual tools, edit tools.mcp in YAML and run a full apply.`,"zh-CN":`--mcp 接收 MCP 市场服务 code(见 mcp list),并启用其全部工具;如需按工具开关,修改 YAML 中的 tools.mcp 后执行全量 apply。`}],validate:e=>{if(!e.name.trim())return`--name must not be empty.`;if(!e.model.trim())return`--model must not be empty.`;if(!e.instructions.trim())return`--instructions must not be empty.`;if(e.type&&!e.skill?.length)return`--type requires at least one --skill.`;if(e.skill?.some(e=>!e.trim()))return`--skill values must not be empty.`;if(e.skillDir?.some(e=>!e.trim()))return`--skill-dir values must not be empty.`;if(e.environment!==void 0&&!e.environment.trim())return`--environment must not be empty.`;if(e.vault!==void 0&&!e.vault.trim())return`--vault must not be empty.`;if(e.mcp?.some(e=>!e.trim()))return`--mcp values must not be empty.`},async run(e){let{flags:t,settings:r}=e,i=T(r.output),a=await eT(e,t.file??`agents.yaml`),o=a.provider,s=t.environment?.trim(),c=t.vault?.trim();uE(`Environment`,s,a.config.environments,a.configPath),uE(`Vault`,c,a.config.vaults,a.configPath);let l=lE(t.mcp),u={environment:s,vault:c,mcp:l.map(e=>e.serverName)},d=cE(t.skill,sE(t.type)),p=await pE(a,t.skillDir),m=[...d,...p.map(e=>e.key)],h=aa(void 0,{name:t.name.trim(),description:t.description,model:t.model,instructions:t.instructions,environment:s,vault:c,provider:o,builtinTools:t.tool,mcp:l}).agent;h.skills=m;let g=structuredClone(a.config);g.skills={...g.skills};for(let e of p)g.skills[e.key]=e.resolvedDeclaration;g._resolved=!0;let _=await tT({project:{...a,config:g},group:`agents`,rawDeclaration:h}),v=await a.stateBackend.read(a.stateScope,e=>oE({displayName:t.name.trim(),provider:o,agents:a.config.agents??{},candidate:_,state:e})),y=v.key;g.agents={...g.agents,[y]:_},g._resolved=!0;let b=Fi(a.source);if(b.errors.length>0)throw new n(`YAML parse error: ${b.errors.map(e=>e.message).join(`; `)}`,f.USAGE);for(let e of p)b.setIn([`skills`,e.key],e.rawDeclaration);b.setIn([`agents`,y],h);let x=b.toString(),S={type:`agent`,name:y,provider:o},ee=[...p.filter(e=>e.needsCreate).map(e=>({type:`skill`,name:e.key,provider:o})),S],te={projectName:a.projectName,config:g,configPath:a.configPath,providers:{[o]:g.providers[o]},stateBackend:a.stateBackend,stateScope:a.stateScope};if(r.dryRun||!t.yes){let e=await J(()=>Y(()=>io(te,{provider:o,scope:{roots:ee},refresh:!r.dryRun,quiet:i===`json`,mode:`create-only`}))),n=!e.plan.diagnostics.some(e=>e.severity===`error`),s={agent:{key:y,name:t.name.trim(),provider:o,skills:m,...u},local_skills:p.map(e=>({key:e.key,name:e.name,source:e.source,reused_pending:e.reusedPending,reused_tracked:e.reusedTracked})),config_file:a.configPath,yaml_written:!1,reused_pending:v.reusedPending,requires_confirmation:!r.dryRun,ready_to_create:n,actions:e.plan.actions,diagnostics:e.plan.diagnostics};if(i===`json`)A(s,i);else{for(let e of p)k(`Generated Skill YAML key: ${e.key}`);k(`Generated Agent YAML key: ${y}`);for(let t of e.plan.diagnostics)k(`[${t.severity}] ${t.code}: ${t.message}`);for(let t of e.plan.actions.filter(e=>e.action!==`no-op`)){let e=t.action===`create`?`+`:t.action===`update`?`~`:`-`;k(` ${e} ${$C(t.address)}`)}k(r.dryRun?`Dry run: YAML, State, and remote resources were not changed.`:`Preview only: re-run with --yes to write YAML and create this Agent.`)}return}await rT(a.configPath,a.source,x);let ne;try{ne=await J(()=>Y(()=>bo(te,{provider:o,scope:{roots:ee},refresh:!0,quiet:i===`json`,mode:`create-only`,policy:`block`})))}catch(e){throw ZC(e,`The YAML declarations were kept. Fix the related dependency or provider error, then re-run the same create command.`,`Scoped Agent and Skill create failed.`)}let C=await a.stateBackend.read(a.stateScope,e=>({agentId:e.getResource(S)?.remote_id,skillIds:Object.fromEntries(p.map(t=>[t.key,e.getResource({type:`skill`,name:t.key,provider:o})?.remote_id]))})),re=ne.execution?.results??[],ie=re.find(e=>e.status===`failed`),ae=ie?`failed`:`completed`,oe={agent:{key:y,name:t.name.trim(),provider:o,remote_id:C.agentId,skills:m,...u},local_skills:p.map(e=>({key:e.key,name:e.name,source:e.source,remote_id:C.skillIds[e.key],reused_pending:e.reusedPending,reused_tracked:e.reusedTracked})),config_file:a.configPath,yaml_written:!0,reused_pending:v.reusedPending,status:ae,actions:ne.planned.plan.actions,diagnostics:ne.planned.plan.diagnostics,results:re,error:ie?.error};if(i===`json`?A(oe,i):(k(`Wrote ${a.configPath} with Agent key '${y}'${p.length?` and ${p.length} local Skill declaration(s)`:``}.`),k(ae===`completed`?`Created Agent '${t.name.trim()}'.`:`Scoped create ${ae}: ${ie?.error??`unknown error`}`)),ie)throw new n(ie.error??`Scoped Agent create failed.`,f.GENERAL,`The YAML declarations were kept. Fix the related dependency or provider error, then re-run the same create command.`)}});const hE={name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Environment display name; the YAML key is generated automatically`,"zh-CN":`远端 Environment 显示名称;YAML key 将自动生成`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Environment description`,"zh-CN":`Environment 描述`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},apt:_E(`APT`),pip:_E(`pip`),npm:_E(`npm`),cargo:_E(`Cargo`),gem:_E(`Ruby gem`),go:_E(`Go`),file:vE(),yes:yE()};var gE=w({description:{"en-US":`Declare and create one Managed Agent Environment through a scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建一个托管 Agent Environment`},auth:`apiKey`,usageArgs:`--name <name> [--description <text>] [--metadata <key=value>...] [--apt <package>...] [--pip <package>...] [--npm <package>...] [--cargo <package>...] [--gem <package>...] [--go <package>...] [--file <path>] [--yes]`,flags:hE,exampleArgs:[`--name Development`,`--name Development --pip pandas --npm typescript --metadata owner=platform --yes`],notes:[...K,...Xw,{"en-US":`Creates a cloud Environment with unrestricted networking. Without --yes, only previews the generated YAML key and scoped plan.`,"zh-CN":`创建使用 unrestricted 网络的 cloud Environment。不带 --yes 时仅预览自动生成的 YAML key 和定向计划。`}],validate:e=>e.name.trim()?void 0:`--name must not be empty.`,async run(e){let t=await eT(e,e.flags.file??`agents.yaml`),n=Object.fromEntries([`apt`,`pip`,`npm`,`cargo`,`gem`,`go`].map(t=>[t,e.flags[t]]).filter(e=>Array.isArray(e[1])&&e[1].length>0)),r={name:e.flags.name.trim(),description:e.flags.description,provider:t.provider,config:{type:`cloud`,networking:{type:`unrestricted`},...Object.keys(n).length>0?{packages:n}:{}},metadata:iT(e.flags.metadata)},i=await tT({project:t,group:`environments`,rawDeclaration:r});await nT({host:e,project:t,group:`environments`,resourceType:`environment`,displayName:e.flags.name.trim(),rawDeclaration:r,resolvedDeclaration:i,existingDeclarations:t.config.environments??{},effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`environment`,yes:e.flags.yes})}});function _E(e){return{type:`array`,valueHint:`<package>`,description:{"en-US":`${e} package (repeatable)`,"zh-CN":`${e} 软件包(可重复)`}}}function vE(){return{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}}function yE(){return{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}}var bE=w({description:{"en-US":`Declare and create one custom Managed Agent Skill from a local source`,"zh-CN":`从本地来源声明并创建一个自定义托管 Agent Skill`},auth:`apiKey`,usageArgs:`--source <directory|zip|SKILL.md> [--file <path>] [--yes]`,flags:{source:{type:`string`,valueHint:`<directory|zip|SKILL.md>`,required:!0,description:{"en-US":`Local Skill directory, ZIP archive, or single SKILL.md`,"zh-CN":`本地 Skill 目录、ZIP 压缩包或单个 SKILL.md`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and upload the Skill through the scoped create`,"zh-CN":`写入 YAML 并通过定向创建上传 Skill`}}},exampleArgs:[`--source ./skills/code-review`,`--source ./skill.zip --yes`],notes:[...K,...Xw,{"en-US":`The YAML key is derived from SKILL.md frontmatter name. Remote URLs remain available through handwritten YAML plus full apply.`,"zh-CN":`YAML key 从 SKILL.md frontmatter 的 name 生成。远程 URL 仍可手工写入 YAML 后执行全量 Apply。`}],validate:e=>e.source.trim()?void 0:`--source must not be empty.`,async run(e){let t=await eT(e,e.flags.file??`agents.yaml`),r=await Ia(e.flags.source,{basePath:process.cwd()}),i=Ai(Oi(t.configPath),r.sourcePath).split(ji).join(`/`)||`.`,a=t.config.skills??{};if(await t.stateBackend.read(t.stateScope,e=>e.listResources().some(e=>{if(e.address.provider!==t.provider||e.address.type!==`skill`)return!1;let n=a[e.address.name];return(typeof n?.name==`string`?n.name:e.address.name)===r.name})))throw new n(`Skill '${r.name}' is already tracked.`,f.USAGE,"Modify its existing YAML declaration and run full `bl managed-agent apply` to create a new version.");let o={name:r.name,source:i,origin:`custom`,provider:t.provider},s=await tT({project:t,group:`skills`,rawDeclaration:o});await nT({host:e,project:t,group:`skills`,resourceType:`skill`,displayName:r.name,rawDeclaration:o,resolvedDeclaration:s,existingDeclarations:a,effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`skill`,yes:e.flags.yes})}}),xE=w({description:{"en-US":`Declare and create one empty Managed Agent Vault through a scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建一个空的托管 Agent Vault`},auth:`apiKey`,usageArgs:`--name <name> [--metadata <key=value>...] [--file <path>] [--yes]`,flags:{name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Vault display name; the YAML key is generated automatically`,"zh-CN":`远端 Vault 显示名称;YAML key 将自动生成`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}},exampleArgs:[`--name Production`,`--name Production --metadata owner=platform --yes`],notes:[...K,...Xw,{"en-US":"Creates an empty Vault. Add secrets later with `vault credential create`.","zh-CN":"创建空 Vault;随后使用 `vault credential create` 添加 Secret。"}],validate:e=>e.name.trim()?void 0:`--name must not be empty.`,async run(e){let t=await eT(e,e.flags.file??`agents.yaml`),n={display_name:e.flags.name.trim(),provider:t.provider,credentials:[],metadata:iT(e.flags.metadata)},r=await tT({project:t,group:`vaults`,rawDeclaration:n});await nT({host:e,project:t,group:`vaults`,resourceType:`vault`,displayName:e.flags.name.trim(),rawDeclaration:n,resolvedDeclaration:r,existingDeclarations:t.config.vaults??{},effectiveName:(e,t)=>typeof t.display_name==`string`?t.display_name:e,fallbackKey:`vault`,yes:e.flags.yes})}}),SE=w({description:{"en-US":`Append and create one environment-variable Credential in a tracked Vault`,"zh-CN":`在已跟踪 Vault 中追加并创建一个环境变量 Credential`},auth:`apiKey`,usageArgs:`--vault <yaml-key> --name <name> --secret-name <name> --secret-env <env-name> [--metadata <key=value>...] [--file <path>] [--yes]`,flags:{vault:{type:`string`,valueHint:`<yaml-key>`,required:!0,description:{"en-US":`Existing tracked Vault key from agents.yaml`,"zh-CN":`agents.yaml 中已跟踪的 Vault key`}},name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Credential display name`,"zh-CN":`Credential 显示名称`}},secretName:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Environment variable name exposed to the Agent`,"zh-CN":`提供给 Agent 的环境变量名`}},secretEnv:{type:`string`,valueHint:`<env-name>`,required:!0,description:{"en-US":`Local environment variable containing the secret value`,"zh-CN":`保存真实 Secret 的本地环境变量名`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and create the remote Credential`,"zh-CN":`写入 YAML 并创建远端 Credential`}}},exampleArgs:[`--vault production --name api-token --secret-name API_TOKEN --secret-env PROD_API_TOKEN`,`--vault production --name api-token --secret-name API_TOKEN --secret-env PROD_API_TOKEN --yes`],notes:[...K,...Xw,{"en-US":`--secret-env is an environment variable name, not the secret itself. The CLI auto-loads the nearest .env from the current directory upward; shell exports and CI secret injection also work.`,"zh-CN":`--secret-env 接收环境变量名,不接收 Secret 本身。CLI 会从当前目录向上自动加载最近的 .env,也支持 Shell export 和 CI Secret 注入。`},{"en-US":"YAML stores only ${ENV_NAME}. Never commit .env; subsequent full apply runs must provide the same environment variable.","zh-CN":"YAML 只保存 ${ENV_NAME}。不要提交 .env;后续执行全量 Apply 时仍需提供同名环境变量。"}],validate:e=>{if(!e.vault.trim())return`--vault must not be empty.`;if(!e.name.trim())return`--name must not be empty.`;if(!e.secretName.trim())return`--secret-name must not be empty.`;if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e.secretEnv))return`--secret-env must be a valid environment variable name.`},async run(e){let t=T(e.settings.output);ia();let r=process.env[e.flags.secretEnv],i=await eT(e,e.flags.file??`agents.yaml`).finally(()=>{delete process.env[e.flags.secretEnv]});if(!i.config.vaults?.[e.flags.vault])throw new n(`Vault '${e.flags.vault}' is not declared in agents.yaml.`,f.USAGE);if(e.flags.yes&&!e.settings.dryRun&&!r)throw new n(`Environment variable '${e.flags.secretEnv}' is not set or is empty.`,f.USAGE,`Set it in your shell, CI secret store, or a local .env file, then re-run with --secret-env ${e.flags.secretEnv}.`);let a=iT(e.flags.metadata),o={name:e.flags.name.trim(),type:`environment_variable`,secret_name:e.flags.secretName.trim(),secret_value:`\${${e.flags.secretEnv}}`,networking:{type:`unrestricted`},...a?{metadata:a}:{}},s={...o,secret_value:r??`__dry_run_secret__`},c=Fi(i.source);if(c.errors.length>0)throw new n(`YAML parse error: ${c.errors.map(e=>e.message).join(`; `)}`,f.USAGE);let l=c.toJS().vaults?.[e.flags.vault]?.credentials??[],u=l.filter(e=>!(!e||typeof e!=`object`||Array.isArray(e)||e.name!==o.name)),d=!1;if(u.length>0){let t=l.at(-1),r=u[0];if(u.length!==1||r!==t||!CE(r,o))throw new n(`Vault '${e.flags.vault}' already declares a different credential named '${o.name}'.`,f.USAGE,"Modify the existing YAML declaration and run full `bl managed-agent apply`; create never overwrites it.");d=!0}let p=structuredClone(i.config),m=p.vaults,h=m[e.flags.vault];d||(m[e.flags.vault]={...h,credentials:[...h.credentials??[],s]});let g=(await J(()=>uo(p,{projectName:i.projectName,basePath:Oi(i.configPath)}))).config;d||c.addIn([`vaults`,e.flags.vault,`credentials`],o);let _=d?i.source:c.toString(),v={projectName:i.projectName,config:g,configPath:i.configPath,providers:{[i.provider]:g.providers[i.provider]},stateBackend:i.stateBackend,stateScope:i.stateScope};if(e.settings.dryRun||!e.flags.yes){let n=await J(()=>Y(()=>ao(v,e.flags.vault,e.flags.name.trim(),{provider:i.provider,refresh:!e.settings.dryRun,quiet:t===`json`,checkRemote:!e.settings.dryRun}))),r={vault:{key:e.flags.vault,remote_id:n.vaultRemoteId},credential:{name:e.flags.name.trim(),secret_name:e.flags.secretName.trim(),secret_env:e.flags.secretEnv},config_file:i.configPath,yaml_written:!1,reused_pending:d,requires_confirmation:!e.settings.dryRun,ready_to_create:!0,remote_checked:n.remoteChecked,reuse_remote:n.reuseRemote};t===`json`?A(r,t):(k(`Vault: ${e.flags.vault}`),k(`Credential: ${e.flags.name.trim()} (secret from ${e.flags.secretEnv})`),k(e.settings.dryRun?`Dry run: YAML, State, and remote resources were not changed.`:`Preview only: re-run with --yes to append YAML and create this Credential.`));return}await rT(i.configPath,i.source,_);let y;try{y=await J(()=>Y(()=>da(v,e.flags.vault,e.flags.name.trim(),{provider:i.provider,refresh:!0,quiet:t===`json`})))}catch(e){throw ZC(e,`The YAML declaration was kept. Restore the same secret environment variable and re-run this command; an already-created matching Credential will be adopted.`,`Vault Credential create failed.`)}let b={vault:{key:e.flags.vault,remote_id:y.vaultRemoteId},credential:{id:y.credentialId,name:e.flags.name.trim(),secret_name:e.flags.secretName.trim(),secret_env:e.flags.secretEnv},config_file:i.configPath,yaml_written:!0,reused_pending:d,adopted:y.adopted,status:`completed`};t===`json`?A(b,t):k(`Wrote ${i.configPath} and created Credential '${e.flags.name.trim()}'.`)}});function CE(e,t){return wE(e)===wE(t)}function wE(e){let t=e=>Array.isArray(e)?e.map(t):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>[e,t(n)]));return JSON.stringify(t(e))}const TE={...qw,name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Deployment display name; the YAML key is generated automatically`,"zh-CN":`远端 Deployment 显示名称;YAML key 将自动生成`}},agent:{type:`string`,valueHint:`<yaml-key>`,required:!0,description:{"en-US":`Existing Agent key from agents.yaml`,"zh-CN":`agents.yaml 中已有的 Agent key`}},agentVersion:{type:`number`,valueHint:`<number>`,description:{"en-US":`Agent version`,"zh-CN":`Agent 版本`}},environment:{type:`string`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Environment key from agents.yaml`,"zh-CN":`agents.yaml 中已有的 Environment key`}},vault:{type:`array`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Vault key from agents.yaml (repeatable)`,"zh-CN":`agents.yaml 中已有的 Vault key(可重复)`}},message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Initial user message (repeatable)`,"zh-CN":`初始用户消息(可重复)`}},event:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`Initial user.message or system.message JSON (repeatable)`,"zh-CN":`初始 user.message 或 system.message JSON(可重复)`}},resource:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`File Resource JSON with source or file_id (repeatable)`,"zh-CN":`包含 source 或 file_id 的 File Resource JSON(可重复)`}},schedule:{type:`string`,valueHint:`<cron>`,description:{"en-US":`Five-field cron expression`,"zh-CN":`五段式 Cron 表达式`}},timezone:{type:`string`,valueHint:`<timezone>`,description:{"en-US":`IANA schedule timezone`,"zh-CN":`Schedule 的 IANA 时区`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Deployment description`,"zh-CN":`Deployment 描述`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}};var EE=w({description:{"en-US":`Declare and create one Managed Agent Deployment through a scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建一个托管 Agent Deployment`},auth:`apiKey`,usageArgs:`--name <name> --agent <yaml-key> (--message <text>... | --event <json|@path>...) [--agent-version <number>] [--environment <yaml-key>] [--environment_variables <KEY=VALUE>...] [--vault <yaml-key>...] [--resource <json|@path>...] [--schedule <cron> --timezone <timezone>] [--description <text>] [--metadata <key=value>...] [--file <path>] [--yes]`,flags:TE,exampleArgs:[{"en-US":`--name Daily --agent assistant --message "Generate the report" --environment_variables LOG_LEVEL=info`,"zh-CN":`--name Daily --agent assistant --message "生成报告" --environment_variables LOG_LEVEL=info`},{"en-US":`--name Daily --agent assistant --event '{"type":"system.message","content":"Be concise"}' --yes`,"zh-CN":`--name Daily --agent assistant --event '{"type":"system.message","content":"保持简洁"}' --yes`}],notes:[...K,...Xw,{"en-US":"--environment_variables writes string values to the Deployment YAML declaration when --yes is used. Repeat the flag for multiple variables; empty values and values containing = are allowed. Later apply runs manage these values; removing the field or using {} clears them. YAML stores these values; the key `__proto__` is reserved.","zh-CN":"使用 --yes 时,--environment_variables 将字符串值写入 Deployment 的 YAML 声明。可重复传入,允许空值及包含 = 的值。后续 apply 会管理这些值;删除字段或设置为 {} 会清空变量。YAML 会保存这些值;不支持保留键 `__proto__`。"},{"en-US":`Initial Events must contain 1-50 user.message/system.message entries. --resource accepts only File Resources in this release.`,"zh-CN":`Initial Events 必须包含 1–50 条 user.message/system.message;本期 --resource 仅接受 File Resource。`},{"en-US":`Use either repeatable --message values or repeatable --event values; the two input forms cannot be mixed.`,"zh-CN":`重复使用 --message 或重复使用 --event;两种输入形式不能混用。`}],validate:e=>{if(DE(e.environment_variables),!e.name.trim())return`--name must not be empty.`;if(!e.agent.trim())return`--agent must not be empty.`;if(e.message?.length&&e.event?.length)return`--message and --event cannot be used together.`;if(!e.message?.length&&!e.event?.length)return`Pass at least one --message or --event.`;if(!!e.schedule!=!!e.timezone)return`--schedule and --timezone must be provided together.`;if(e.agentVersion!==void 0&&(!Number.isInteger(e.agentVersion)||e.agentVersion<1))return`--agent-version must be a positive integer.`},async run(e){let t=await eT(e,e.flags.file??`agents.yaml`),r=[...(e.flags.message??[]).map(e=>({type:`user.message`,content:e})),...OE(await aT(e.flags.event,`event`))];if(r.length<1||r.length>50)throw new n(`Initial Events must contain 1-50 entries.`,f.USAGE);let i=kE(await aT(e.flags.resource,`resource`));if(e.flags.schedule&&e.flags.schedule.trim().split(/\s+/).length!==5)throw new n(`--schedule must be a five-field cron expression.`,f.USAGE);e.flags.timezone&&AE(e.flags.timezone);let a={name:e.flags.name.trim(),agent:e.flags.agent,agent_version:e.flags.agentVersion,environment:e.flags.environment,environment_variables:DE(e.flags.environment_variables),vaults:e.flags.vault,resources:i,initial_events:r,schedule:e.flags.schedule&&e.flags.timezone?{expression:e.flags.schedule,timezone:e.flags.timezone}:void 0,description:e.flags.description,provider:t.provider,metadata:iT(e.flags.metadata)},o=await tT({project:t,group:`deployments`,rawDeclaration:a});await nT({host:e,project:t,group:`deployments`,resourceType:`deployment`,displayName:e.flags.name.trim(),rawDeclaration:a,resolvedDeclaration:o,existingDeclarations:t.config.deployments??{},effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`deployment`,yes:e.flags.yes})}});function DE(e){let t=Jw(e);if(t&&Object.hasOwn(t,`__proto__`))throw new n(`Deployment environment_variables cannot use the reserved key __proto__. / Deployment 环境变量不能使用保留键 __proto__。`,f.USAGE);return t}function OE(e){return e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`Each --event must be a JSON object.`,f.USAGE);let t=e;if(t.type!==`user.message`&&t.type!==`system.message`)throw new n(`--event type must be user.message or system.message.`,f.USAGE);if(typeof t.content!=`string`||!t.content.trim())throw new n(`--event content must be a non-empty string.`,f.USAGE);return{type:t.type,content:t.content}})}function kE(e){return e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`Each --resource must be a JSON object.`,f.USAGE);let t=e;if(t.type!==`file`)throw new n(`--resource currently accepts only type=file.`,f.USAGE);let r=typeof t.source==`string`?t.source:void 0,i=typeof t.file_id==`string`?t.file_id:void 0;if(!!r==!!i)throw new n(`A File Resource must provide exactly one of source or file_id.`,f.USAGE);if(t.mount_path!==void 0&&typeof t.mount_path!=`string`)throw new n(`File Resource mount_path must be a string.`,f.USAGE);return{type:`file`,source:r,file_id:i,mount_path:t.mount_path}})}function AE(e){try{new Intl.DateTimeFormat(`en-US`,{timeZone:e}).format()}catch{throw new n(`Invalid IANA timezone: ${e}`,f.USAGE)}}const jE={...X,...bT,...ST},ME={...X,limit:bT.limit,...xT,...ST},NE={...X,agentId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Agent ID`,"zh-CN":`Agent ID`}},agentVersion:{type:`number`,valueHint:`<n>`,description:{"en-US":`Specific agent version`,"zh-CN":`指定 Agent 版本`}}},PE={...X,...bT,agentId:NE.agentId};function FE(e){return e.map(e=>[e.id,Z(e.name),Z(e.version),Z(e.type),Z(e.updated_at)])}var IE=w({description:{"en-US":`Get a Managed Agent`,"zh-CN":`获取托管 Agent 详情`},auth:`apiKey`,usageArgs:`--agent-id <id> [--agent-version <n>] [--file <path>]`,flags:NE,exampleArgs:[`--agent-id agent_abc`,`--agent-id agent_abc --agent-version 3 --output json`],notes:K,validate:e=>e.agentVersion!==void 0&&(!Number.isInteger(e.agentVersion)||e.agentVersion<1)?`--agent-version must be a positive integer.`:void 0,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return Da(t,e.flags.agentId,{provider:`bailian`,version:e.flags.agentVersion})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${Z(n.name)}`),k(`Description: ${Z(n.description,120)}`),k(`Version: ${Z(n.version)}`),k(`Type: ${Z(n.type)}`),k(`Created: ${Z(n.created_at)}`),k(`Updated: ${Z(n.updated_at)}`)}}),LE=w({description:{"en-US":`List Managed Agents`,"zh-CN":`列出托管 Agent`},auth:`apiKey`,usageArgs:`[--limit <n>] [--page <cursor>] [--all] [--include-archived] [--file <path>]`,flags:jE,exampleArgs:[``,`--limit 50`,`--all --include-archived --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Ha(t,{provider:`bailian`,limit:e.flags.limit,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`agents`,items:n.items,headers:[`ID`,`NAME`,`VERSION`,`TYPE`,`UPDATED`],rows:FE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No agents found.`})}}),RE=w({description:{"en-US":`Search Managed Agents`,"zh-CN":`搜索托管 Agent`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page-limit <n>] [--include-archived]`,flags:ME,exampleArgs:[`--query assistant`,`--query code --page-limit 20 --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ET(async n=>{let r=await Ha(t,{provider:`bailian`,limit:e.flags.limit??100,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>TT(e.flags.query,t.id,t.name,t.description),e.flags.pageLimit)}));DT({format:t,key:`agents`,items:n.items,headers:[`ID`,`NAME`,`VERSION`,`TYPE`,`UPDATED`],rows:FE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching agents found.`})}}),zE=w({description:{"en-US":`List Managed Agent versions`,"zh-CN":`列出托管 Agent 版本`},auth:`apiKey`,usageArgs:`--agent-id <id> [--limit <n>] [--page <cursor>] [--all]`,flags:PE,exampleArgs:[`--agent-id agent_abc`,`--agent-id agent_abc --all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Va(t,e.flags.agentId,{provider:`bailian`,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`versions`,items:n.items,headers:[`ID`,`NAME`,`VERSION`,`TYPE`,`UPDATED`],rows:FE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No agent versions found.`})}});const BE={...X,...bT,...ST},VE={...X,limit:bT.limit,...xT,...ST},HE={...X,environmentId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Environment ID`,"zh-CN":`Environment ID`}}};function UE(e){return e.map(e=>[e.id,Z(e.name),Z(e.scope),Z(e.version),Z(e.updated_at)])}var WE=w({description:{"en-US":`Get a Managed Agent environment`,"zh-CN":`获取托管 Agent 环境详情`},auth:`apiKey`,usageArgs:`--environment-id <id>`,flags:HE,exampleArgs:[`--environment-id env_abc`],notes:K,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return Aa(t,e.flags.environmentId,{provider:`bailian`})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${Z(n.name)}`),k(`Description: ${Z(n.description,120)}`),k(`Scope: ${Z(n.scope)}`),k(`Version: ${Z(n.version)}`),k(`Updated: ${Z(n.updated_at)}`)}}),GE=w({description:{"en-US":`List Managed Agent environments`,"zh-CN":`列出托管 Agent 环境`},auth:`apiKey`,usageArgs:`[--limit <n>] [--page <cursor>] [--all] [--include-archived]`,flags:BE,exampleArgs:[``,`--all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Ga(t,{provider:`bailian`,limit:e.flags.limit,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`environments`,items:n.items,headers:[`ID`,`NAME`,`SCOPE`,`VERSION`,`UPDATED`],rows:UE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No environments found.`})}}),KE=w({description:{"en-US":`Search Managed Agent environments`,"zh-CN":`搜索托管 Agent 环境`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page-limit <n>] [--include-archived]`,flags:VE,exampleArgs:[`--query sandbox`,`--query production --page-limit 20 --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ET(async n=>{let r=await Ga(t,{provider:`bailian`,limit:e.flags.limit??100,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>TT(e.flags.query,t.id,t.name,t.description),e.flags.pageLimit)}));DT({format:t,key:`environments`,items:n.items,headers:[`ID`,`NAME`,`SCOPE`,`VERSION`,`UPDATED`],rows:UE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching environments found.`})}}),qE=w({description:{"en-US":`Download a Managed Agent skill version`,"zh-CN":`下载托管 Agent Skill 版本`},auth:`apiKey`,usageArgs:`--skill-id <id> --skill-version <version> --output-file <path> [--force]`,flags:$T,exampleArgs:[`--skill-id skill_abc --skill-version 3 --output-file ./skill.zip`],notes:K,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_download_skill:e.flags.skillId,version:e.flags.skillVersion,output_file:e.flags.outputFile},t);return}let n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ya(t,e.flags.skillId,e.flags.skillVersion,{provider:`bailian`})})),r=await LT(e.flags.outputFile,n,e.flags.force);t===`json`?A({downloaded:e.flags.skillId,version:e.flags.skillVersion,output_file:r},t):k(`Skill downloaded to ${r}`)}}),JE=w({description:{"en-US":`Get a Managed Agent skill`,"zh-CN":`获取托管 Agent Skill 详情`},auth:`apiKey`,usageArgs:`--skill-id <id>`,flags:ZT,exampleArgs:[`--skill-id skill_abc`],notes:K,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ja(t,e.flags.skillId,{provider:`bailian`})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${n.name}`),k(`Description: ${Z(n.description,120)}`),k(`Source: ${n.source}`),k(`Status: ${n.status}`),k(`Version: ${Z(n.latest_version)}`)}}),YE=w({description:{"en-US":`Search Managed Agent skills`,"zh-CN":`搜索托管 Agent Skill`},auth:`apiKey`,usageArgs:`--query <text> [--source custom|official|all] [--limit <n>] [--page-limit <n>]`,flags:XT,exampleArgs:[`--query browser --source official`,`--query report --source all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=e.flags.source??`custom`,r=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`),r=n=>ET(async r=>{let i=await Ja(t,{provider:`bailian`,source:n,limit:e.flags.limit??100,page:r});return{items:i.data,hasMore:i.has_more,nextPage:i.next_page}},t=>TT(e.flags.query,t.id,t.name,t.description),e.flags.pageLimit);if(n!==`all`)return r(n);let[i,a]=await Promise.all([r(`custom`),r(`official`)]);return{items:[...i.items,...a.items],hasMore:i.hasMore||a.hasMore,nextPage:void 0,scannedPages:i.scannedPages+a.scannedPages,truncated:i.truncated||a.truncated}}));DT({format:t,key:`skills`,items:r.items,headers:[`ID`,`NAME`,`SOURCE`,`STATUS`,`VERSION`,`UPDATED`],rows:eE(r.items),hasMore:r.hasMore,nextPage:r.nextPage,truncated:r.truncated,scannedPages:r.scannedPages,emptyMessage:`No matching skills found.`})}}),XE=w({description:{"en-US":`List Managed Agent skill versions`,"zh-CN":`列出托管 Agent Skill 版本`},auth:`apiKey`,usageArgs:`--skill-id <id> [--limit <n>] [--page <cursor>] [--all]`,flags:QT,exampleArgs:[`--skill-id skill_abc`,`--skill-id skill_abc --all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await qa(t,e.flags.skillId,{provider:`bailian`,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`versions`,items:n.items,headers:[`VERSION`,`NAME`,`TYPE`,`STATUS`,`UPDATED`],rows:tE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No skill versions found.`})}});const ZE={...X,...bT,...ST},QE={...X,limit:bT.limit,...xT,...ST},$E={...X,vaultId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Vault ID`,"zh-CN":`Vault ID`}}};function eD(e){return e.map(e=>[e.id,Z(e.display_name),Z(e.type),Z(e.created_at),Z(e.updated_at)])}var tD=w({description:{"en-US":`Get a Managed Agent vault`,"zh-CN":`获取托管 Agent Vault 详情`},auth:`apiKey`,usageArgs:`--vault-id <id>`,flags:$E,exampleArgs:[`--vault-id vault_abc`],notes:K,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return Ma(t,e.flags.vaultId,{provider:`bailian`})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${Z(n.display_name)}`),k(`Type: ${Z(n.type)}`),k(`Created: ${Z(n.created_at)}`),k(`Updated: ${Z(n.updated_at)}`)}}),nD=w({description:{"en-US":`List Managed Agent vaults`,"zh-CN":`列出托管 Agent Vault`},auth:`apiKey`,usageArgs:`[--limit <n>] [--page <cursor>] [--all] [--include-archived]`,flags:ZE,exampleArgs:[``,`--all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Ya(t,{provider:`bailian`,limit:e.flags.limit,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`vaults`,items:n.items,headers:[`ID`,`NAME`,`TYPE`,`CREATED`,`UPDATED`],rows:eD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No vaults found.`})}}),rD=w({description:{"en-US":`Search Managed Agent vaults`,"zh-CN":`搜索托管 Agent Vault`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page-limit <n>] [--include-archived]`,flags:QE,exampleArgs:[`--query github`,`--query production --page-limit 20 --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ET(async n=>{let r=await Ya(t,{provider:`bailian`,limit:e.flags.limit??100,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>TT(e.flags.query,t.id,t.display_name,t.metadata),e.flags.pageLimit)}));DT({format:t,key:`vaults`,items:n.items,headers:[`ID`,`NAME`,`TYPE`,`CREATED`,`UPDATED`],rows:eD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching vaults found.`})}});const iD={deploymentId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Deployment ID`,"zh-CN":`Deployment ID`}}},aD={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by agent ID`,"zh-CN":`按 Agent ID 筛选`}},status:{type:`string`,valueHint:`<status>`,choices:[`active`,`paused`],description:{"en-US":`Filter by deployment status`,"zh-CN":`按 Deployment 状态筛选`}},...ST,createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this timestamp`,"zh-CN":`创建时间不早于该时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this timestamp`,"zh-CN":`创建时间不晚于该时间戳`}}},oD={...X,...bT,...aD},sD={...X,...iD},cD={...X,...bT,query:xT.query,...aD},lD={...X,...iD,...bT},uD={...X,runId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Deployment run ID`,"zh-CN":`Deployment Run ID`}}},dD={...X,deployment:{type:`string`,valueHint:`<name>`,description:{"en-US":`Logical deployment name in agents.yaml/state`,"zh-CN":`agents.yaml/State 中的逻辑 Deployment 名称`}},deploymentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Direct deployment ID`,"zh-CN":`直接指定 Deployment ID`}}};function fD(e){if(!!e.deployment==!!e.deploymentId)return`Provide exactly one of --deployment or --deployment-id.`}function pD(e){return e.map(e=>[Z(e.id),e.status,Z(e.schedule?.expression),Z(e.paused_reason?.type)])}function mD(e){return e.map(e=>[e.id,Z(e.deployment_id),Z(e.session_id),Z(e.status),Z(e.created_at)])}async function hD(e,t){if(t.deploymentId)return t.deploymentId;let n=e.state.getResource({provider:`bailian`,type:`deployment`,name:t.deployment});if(!n?.remote_id)throw new na(`Deployment '${t.deployment}' is not tracked in state. Use --deployment-id or run managed-agent apply/import first.`);return n.remote_id}var gD=w({description:{"en-US":`Get a Managed Agent deployment`,"zh-CN":`获取托管 Agent Deployment 详情`},auth:`apiKey`,usageArgs:`--deployment-id <id>`,flags:sD,exampleArgs:[`--deployment-id dep_abc`],notes:K,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return Oa(t,e.flags.deploymentId,{provider:`bailian`})}));t===`json`?A(n,t):(k(`ID: ${Z(n.id)}`),k(`Status: ${n.status}`),k(`Schedule:${Z(n.schedule?.expression)}`),k(`Paused: ${Z(n.paused_reason)}`))}}),_D=w({description:{"en-US":`List Managed Agent deployments`,"zh-CN":`列出托管 Agent Deployment`},auth:`apiKey`,usageArgs:`[--agent-id <id>] [--status active|paused] [--limit <n>] [--page <cursor>] [--all]`,flags:oD,exampleArgs:[``,`--status active --all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Wa(t,{provider:`bailian`,agent_id:e.flags.agentId,status:e.flags.status,include_archived:e.flags.includeArchived,created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte,limit:e.flags.limit,page:n});return{items:r.deployments,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`deployments`,items:n.items,headers:[`ID`,`STATUS`,`SCHEDULE`,`PAUSED REASON`],rows:pD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No deployments found.`})}});function vD(e){return w({description:e?{"en-US":`Pause a Managed Agent deployment`,"zh-CN":`暂停托管 Agent Deployment`}:{"en-US":`Unpause a Managed Agent deployment`,"zh-CN":`恢复托管 Agent Deployment`},auth:`apiKey`,risk:{level:`high`,message:e?{"en-US":`This pauses the specified Managed Agent deployment and stops its scheduled executions until resumed.`,"zh-CN":`该操作会暂停指定的托管 Agent Deployment,并停止其定时执行直至恢复。`}:{"en-US":`This resumes the specified Managed Agent deployment and may restart scheduled executions and related usage.`,"zh-CN":`该操作会恢复指定的托管 Agent Deployment,可能重新开始定时执行并产生相关用量。`}},usageArgs:`(--deployment <name> | --deployment-id <id>)`,flags:dD,exampleArgs:[`--deployment daily-report --dry-run`,`--deployment-id dep_abc --yes`],notes:K,validate:fD,async run(t){let n=T(t.settings.output);if(t.settings.dryRun){A({[e?`would_pause_deployment`:`would_unpause_deployment`]:t.flags.deploymentId??t.flags.deployment,target_kind:t.flags.deploymentId?`id`:`state_name`},n);return}let r=await J(()=>Y(async()=>{let n=await q(t,t.flags.file??`agents.yaml`),r=await hD(n,t.flags);return{deploymentId:r,deployment:await go(n,r,e,{provider:`bailian`})}}));n===`json`?A({deployment_id:r.deploymentId,deployment:r.deployment},n):k(`Deployment ${r.deploymentId} ${e?`paused`:`unpaused`}.`)}})}var yD=vD(!0),bD=w({description:{"en-US":`Run a Managed Agent deployment now`,"zh-CN":`立即运行托管 Agent Deployment`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This immediately starts a run for the specified Managed Agent deployment and may incur usage or trigger configured actions.`,"zh-CN":`该操作会立即运行指定的托管 Agent Deployment,可能产生用量或触发已配置的动作。`}},usageArgs:`(--deployment <name> | --deployment-id <id>)`,flags:dD,exampleArgs:[`--deployment daily-report --dry-run`,`--deployment-id dep_abc --yes`],notes:K,validate:fD,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_run_deployment:e.flags.deploymentId??e.flags.deployment,target_kind:e.flags.deploymentId?`id`:`state_name`},t);return}let n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`),n=await hD(t,e.flags);return{deploymentId:n,run:await fo(t,n,{provider:`bailian`})}}));t===`json`?A({deployment_id:n.deploymentId,...n.run},t):k(`Deployment ${n.deploymentId} started. Run: ${n.run.run_id??`-`}`)}}),xD=w({description:{"en-US":`Get a Managed Agent deployment run`,"zh-CN":`获取托管 Agent Deployment Run 详情`},auth:`apiKey`,usageArgs:`--run-id <id>`,flags:uD,exampleArgs:[`--run-id run_abc`],notes:K,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ka(t,e.flags.runId,{provider:`bailian`})}));t===`json`?A(n,t):(k(`ID: ${n.id}`),k(`Deployment: ${Z(n.deployment_id)}`),k(`Session: ${Z(n.session_id)}`),k(`Status: ${Z(n.status)}`),k(`Created: ${Z(n.created_at)}`),k(`Error: ${Z(n.error)}`))}}),SD=w({description:{"en-US":`List runs for a Managed Agent deployment`,"zh-CN":`列出托管 Agent Deployment Run`},auth:`apiKey`,usageArgs:`--deployment-id <id> [--limit <n>] [--page <cursor>] [--all]`,flags:lD,exampleArgs:[`--deployment-id dep_abc`,`--deployment-id dep_abc --all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Ua(t,e.flags.deploymentId,{provider:`bailian`,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`runs`,items:n.items,headers:[`ID`,`DEPLOYMENT`,`SESSION`,`STATUS`,`CREATED`],rows:mD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No deployment runs found.`})}}),CD=w({description:{"en-US":`Search Managed Agent deployments`,"zh-CN":`搜索托管 Agent Deployment`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page <cursor>] [--all]`,flags:cD,exampleArgs:[`--query report`,`--query nightly --all --output json`],notes:[...K,{"en-US":`Deployment search maps --query to the provider's server-side keyword parameter.`,"zh-CN":`Deployment 搜索会把 --query 映射为 Provider 服务端 keyword 参数。`}],validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Wa(t,{provider:`bailian`,keyword:e.flags.query,agent_id:e.flags.agentId,status:e.flags.status,include_archived:e.flags.includeArchived,created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte,limit:e.flags.limit,page:n});return{items:r.deployments,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`deployments`,items:n.items,headers:[`ID`,`STATUS`,`SCHEDULE`,`PAUSED REASON`],rows:pD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No matching deployments found.`})}}),wD=vD(!1);const TD={sessionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Session ID`,"zh-CN":`Session ID`}}},ED={...X,limit:bT.limit,...xT,agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by configured agent name`,"zh-CN":`按配置中的 Agent 名称筛选`}},statuses:{type:`string`,valueHint:`<statuses>`,description:{"en-US":`Comma-separated session statuses`,"zh-CN":`Session 状态,多个以逗号分隔`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this timestamp`,"zh-CN":`创建时间不早于该时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this timestamp`,"zh-CN":`创建时间不晚于该时间戳`}}},DD={...X,...TD,title:{type:`string`,valueHint:`<title>`,description:{"en-US":`New session title`,"zh-CN":`新的 Session 标题`}},metadata:{type:`string`,valueHint:`<json|@path>`,description:{"en-US":`String-valued metadata JSON or @file`,"zh-CN":`值为字符串的 Metadata JSON 或 @file`}}},OD={...X,...TD};function kD(e){return e.map(e=>[e.id,Z(e.title),Z(e.agent_id),e.status,Z(e.updated_at)])}async function AD(e){if(!e)return;let t=await IT(e);if(!t||typeof t!=`object`||Array.isArray(t))throw new n(`--metadata must be a JSON object.`,f.USAGE);for(let[e,r]of Object.entries(t))if(typeof r!=`string`)throw new n(`Metadata value for '${e}' must be a string.`,f.USAGE);return t}const jD=w({description:{"en-US":`Search Managed Agent sessions`,"zh-CN":`搜索托管 Agent Session`},auth:`apiKey`,usageArgs:`--query <text> [--agent <name>] [--statuses <statuses>] [--limit <n>] [--page-limit <n>]`,flags:ED,exampleArgs:[`--query debug`,`--query failed --statuses failed --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ET(async n=>{let r=await $a(t,{agent:e.flags.agent,provider:`bailian`,filter:{page:n,limit:e.flags.limit??100,statuses:wT(e.flags.statuses),created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte}});return{items:r.summaries,hasMore:r.hasMore,nextPage:r.nextPage}},t=>TT(e.flags.query,t.session.id,t.session.title,t.session.status,t.session.agent_id,t.agentName),e.flags.pageLimit)})),r=n.items.map(e=>e.session);DT({format:t,key:`sessions`,items:r,headers:[`ID`,`TITLE`,`AGENT`,`STATUS`,`UPDATED`],rows:kD(r),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching sessions found.`})}}),MD=w({description:{"en-US":`Update a Managed Agent session`,"zh-CN":`更新托管 Agent Session`},auth:`apiKey`,usageArgs:`--session-id <id> [--title <title>] [--metadata <json|@path>]`,flags:DD,exampleArgs:[`--session-id sess_abc --title 'investigation'`,`--session-id sess_abc --metadata @metadata.json`],notes:K,validate:e=>!e.title&&!e.metadata?`Provide --title or --metadata.`:void 0,async run(e){let t=T(e.settings.output),n={title:e.flags.title,metadata:await AD(e.flags.metadata)};if(e.settings.dryRun){A({would_update_session:e.flags.sessionId,input:n},t);return}let r=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return Co(t,e.flags.sessionId,n,{provider:`bailian`})}));t===`json`?A(r,t):k(`Session ${r.id} updated.`)}}),ND=w({description:{"en-US":`Archive a Managed Agent session`,"zh-CN":`归档托管 Agent Session`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This archives the specified remote Managed Agent Session.`,"zh-CN":`该操作会归档指定的远端托管 Agent Session。`}},usageArgs:`--session-id <id>`,flags:OD,exampleArgs:[`--session-id sess_abc --dry-run`,`--session-id sess_abc --yes`],notes:K,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_archive_session:e.flags.sessionId},t);return}let n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ra(t,e.flags.sessionId,{provider:`bailian`})}));t===`json`?A({archived:e.flags.sessionId,session:n},t):k(`Session ${e.flags.sessionId} archived.`)}}),PD={sessionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Session ID`,"zh-CN":`Session ID`}}},FD={...X,...PD},ID={...FD,outputFile:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Destination ZIP path`,"zh-CN":`目标 ZIP 路径`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing output file`,"zh-CN":`覆盖已存在的输出文件`}}};function LD(e){return e instanceof Error?e.message:String(e)}async function RD(e,t,n){let r=await Pa(e,t,n),i=n??(e.providers.size===1?Array.from(e.providers.keys())[0]:`bailian`),a=[],o=[],s=[];try{o=(await yT(async r=>{let i=await Qa(e,t,{provider:n,limit:100,page_token:r,order:`asc`});return{items:i.events,hasMore:i.has_more,nextPage:i.next_page}},!0)).items}catch(e){a.push({component:`events`,message:LD(e)})}try{s=(await yT(async r=>{let i=await Ka(e,{provider:n,scope_id:t,limit:100,page:r});return{items:i.data,hasMore:i.has_more,nextPage:i.next_page}},!0)).items}catch(e){a.push({component:`files`,message:LD(e)})}return{session:r,events:Io(o),files:s,capabilities:Ca(i),errors:a}}const zD=String.raw`(?:api[_-]?key|access[_-]?key|private[_-]?key|secret|token|authorization|credential|password|signature|signed[_-]?url)`,BD=RegExp(`${zD}|tool[_-]?input`,`i`),VD=RegExp(`([?&][^=&#\\s]*(?:${zD})[^=&#\\s]*=)[^&#\\s"'<>),}\\]]*`,`gi`),HD=RegExp(`("[^"]*(?:${zD})[^"]*"\\s*:\\s*")[^"]*(")`,`gi`),UD=RegExp(`('[^']*(?:${zD})[^']*'\\s*:\\s*')[^']*(')`,`gi`),WD=RegExp(`(\\b[^\\s=:,;]*(?:${zD})[^\\s=:,;]*\\s*=\\s*)(?!\\[REDACTED\\])(?:"[^"]*"|'[^']*'|[^\\s,;&]+)`,`gi`),GD=/\b(authorization\s*:\s*)(?:bearer\s+)?[^\s,;]+/gi,KD=/\b(bearer\s+)[A-Za-z0-9._~+/=-]+/gi,qD=/\bsk-[A-Za-z0-9_-]{8,}\b/g;function JD(e){return e.replace(VD,`$1[REDACTED]`).replace(HD,`$1[REDACTED]$2`).replace(UD,`$1[REDACTED]$2`).replace(WD,`$1[REDACTED]`).replace(GD,`$1[REDACTED]`).replace(KD,`$1[REDACTED]`).replace(qD,`[REDACTED]`)}function YD(e){return Array.isArray(e)?e.map(YD):typeof e==`string`?JD(e):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,t])=>e===`environment_variables`&&typeof t==`object`&&t&&!Array.isArray(t)?[e,Yw(t)]:[e,BD.test(e)?`[REDACTED]`:YD(t)]))}function XD(e){return new TextEncoder().encode(`${JSON.stringify(YD(e),null,2)}\n`)}function ZD(e){let t=4294967295;for(let n of e){t^=n;for(let e=0;e<8;e+=1)t=t>>>1^(t&1?3988292384:0)}return(t^4294967295)>>>0}function QD(e){let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function $D(e){let t=e.reduce((e,[,t])=>e+t,0),n=new ArrayBuffer(t),r=new DataView(n),i=0;for(let[t,n]of e)n===2?r.setUint16(i,t,!0):r.setUint32(i,t,!0),i+=n;return new Uint8Array(n)}function eO(e){let t=new TextEncoder,n=[],r=[],i=0;for(let a of e){let e=t.encode(a.name),o=ZD(a.content),s=QD([$D([[67324752,4],[20,2],[0,2],[0,2],[0,2],[0,2],[o,4],[a.content.length,4],[a.content.length,4],[e.length,2],[0,2]]),e,a.content]);n.push(s);let c=$D([[33639248,4],[20,2],[20,2],[0,2],[0,2],[0,2],[0,2],[o,4],[a.content.length,4],[a.content.length,4],[e.length,2],[0,2],[0,2],[0,2],[0,2],[0,4],[i,4]]);r.push(QD([c,e])),i+=s.length}let a=QD(r),o=$D([[101010256,4],[0,2],[0,2],[e.length,2],[e.length,2],[a.length,4],[i,4],[0,2]]);return QD([...n,a,o])}const tO=w({description:{"en-US":`Aggregate session diagnostics`,"zh-CN":`聚合 Session 诊断信息`},auth:`apiKey`,usageArgs:`--session-id <id>`,flags:FD,exampleArgs:[`--session-id sess_abc`,`--session-id sess_abc --output json`],notes:K,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>RD(await q(e,e.flags.file??`agents.yaml`),e.flags.sessionId,`bailian`))),r=YD(n);if(t===`json`){A(r,t);return}k(`Session: ${n.session.id} (${n.session.status})`),k(`Events: ${n.events.length}`),k(`Scoped files: ${n.files.length}`),k(`Partial errors: ${n.errors.length}`);for(let e of n.errors)k(` ${e.component}: ${e.message}`)}}),nO=w({description:{"en-US":`Export session diagnostics as a ZIP`,"zh-CN":`将 Session 诊断信息导出为 ZIP`},auth:`apiKey`,usageArgs:`--session-id <id> --output-file <path> [--force]`,flags:ID,exampleArgs:[`--session-id sess_abc --output-file ./session-debug.zip`],notes:[...K,{"en-US":`The ZIP contains metadata only; file bodies and credential-like values are excluded/redacted.`,"zh-CN":`ZIP 仅包含元数据;不会包含文件正文,凭证类字段会被移除或脱敏。`}],async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_export_session:e.flags.sessionId,output_file:e.flags.outputFile},t);return}let n=await J(()=>Y(async()=>RD(await q(e,e.flags.file??`agents.yaml`),e.flags.sessionId,`bailian`))),r={schema_version:1,generated_at:(/* @__PURE__ */ new Date()).toISOString(),session_id:n.session.id,partial:n.errors.length>0,counts:{events:n.events.length,files:n.files.length,errors:n.errors.length},contents:[`session.json`,`events.json`,`files.json`,`capabilities.json`,`errors.json`],note:`File bodies are not included. Credential-like fields are redacted.`},i=eO([{name:`manifest.json`,content:XD(r)},{name:`session.json`,content:XD(n.session)},{name:`events.json`,content:XD(n.events)},{name:`files.json`,content:XD(n.files)},{name:`capabilities.json`,content:XD(n.capabilities)},{name:`errors.json`,content:XD(n.errors)}]),a=await LT(e.flags.outputFile,i,e.flags.force);t===`json`?A({exported:n.session.id,output_file:a,partial:r.partial},t):k(`Session diagnostics exported to ${a}${r.partial?` (partial)`:``}`)}}),rO={fileId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote file ID`,"zh-CN":`远端 File ID`}}},iO={scopeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by scope ID`,"zh-CN":`按 Scope ID 筛选`}}},aO={...X,path:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Local file path`,"zh-CN":`本地文件路径`}},filename:{type:`string`,valueHint:`<name>`,description:{"en-US":`Remote filename override`,"zh-CN":`覆盖远端文件名`}},mimeType:{type:`string`,valueHint:`<type>`,description:{"en-US":`MIME type override`,"zh-CN":`覆盖 MIME 类型`}}},oO={...X,...bT,...iO},sO={...X,limit:bT.limit,...xT,...iO},cO={...X,...rO},lO={...cO,outputFile:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Destination path`,"zh-CN":`目标路径`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing output file`,"zh-CN":`覆盖已存在的输出文件`}}},uO={...cO};function dO(e){return e.map(e=>[e.id,Z(e.filename),Z(e.status),String(e.size_bytes),Z(e.scope?.id),Z(e.created_at)])}const fO=w({description:{"en-US":`Upload a Managed Agent file`,"zh-CN":`上传托管 Agent 文件`},auth:`apiKey`,usageArgs:`--path <path> [--filename <name>] [--mime-type <type>]`,flags:aO,exampleArgs:[`--path ./report.pdf`],notes:K,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_upload_file:e.flags.path,filename:e.flags.filename??Di(e.flags.path),mime_type:e.flags.mimeType??RT(e.flags.path)},t);return}let n=await FT(e.flags.path),r=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return To(t,n,e.flags.filename??Di(e.flags.path),{provider:`bailian`,mimeType:e.flags.mimeType??RT(e.flags.path)})}));t===`json`?A(r,t):k(`File uploaded: ${r.id} (${r.filename})`)}}),pO=w({description:{"en-US":`List Managed Agent files`,"zh-CN":`列出托管 Agent 文件`},auth:`apiKey`,usageArgs:`[--scope-id <id>] [--limit <n>] [--page <cursor>] [--all]`,flags:oO,exampleArgs:[``,`--scope-id sess_abc --all --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return yT(async n=>{let r=await Ka(t,{provider:`bailian`,scope_id:e.flags.scopeId,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));DT({format:t,key:`files`,items:n.items,headers:[`ID`,`FILENAME`,`STATUS`,`BYTES`,`SCOPE`,`CREATED`],rows:dO(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No files found.`})}}),mO=w({description:{"en-US":`Get Managed Agent file metadata`,"zh-CN":`获取托管 Agent 文件元数据`},auth:`apiKey`,usageArgs:`--file-id <id>`,flags:cO,exampleArgs:[`--file-id file_abc`],notes:K,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return Sa(t,e.flags.fileId,{provider:`bailian`})}));t===`json`?A(n,t):(k(`ID: ${n.id}`),k(`Filename: ${n.filename}`),k(`MIME: ${n.mime_type}`),k(`Bytes: ${n.size_bytes}`),k(`Status: ${Z(n.status)}`),k(`Scope: ${Z(n.scope?.id)}`))}}),hO=w({description:{"en-US":`Search Managed Agent files`,"zh-CN":`搜索托管 Agent 文件`},auth:`apiKey`,usageArgs:`--query <text> [--scope-id <id>] [--limit <n>] [--page-limit <n>]`,flags:sO,exampleArgs:[`--query report`,`--query pdf --scope-id sess_abc --output json`],notes:K,validate:CT,async run(e){let t=T(e.settings.output),n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return ET(async n=>{let r=await Ka(t,{provider:`bailian`,scope_id:e.flags.scopeId,limit:e.flags.limit??100,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>TT(e.flags.query,t.id,t.filename,t.mime_type),e.flags.pageLimit)}));DT({format:t,key:`files`,items:n.items,headers:[`ID`,`FILENAME`,`STATUS`,`BYTES`,`SCOPE`,`CREATED`],rows:dO(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching files found.`})}}),gO=w({description:{"en-US":`Download Managed Agent file content`,"zh-CN":`下载托管 Agent 文件内容`},auth:`apiKey`,usageArgs:`--file-id <id> --output-file <path> [--force]`,flags:lO,exampleArgs:[`--file-id file_abc --output-file ./artifact.pdf`],notes:K,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_download_file:e.flags.fileId,output_file:e.flags.outputFile},t);return}let n=await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);return va(t,e.flags.fileId,{provider:`bailian`})})),r=await LT(e.flags.outputFile,n,e.flags.force);t===`json`?A({downloaded:e.flags.fileId,output_file:r},t):k(`File downloaded to ${r}`)}}),_O=w({description:{"en-US":`Delete a Managed Agent file`,"zh-CN":`删除托管 Agent 文件`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified remote Managed Agent file.`,"zh-CN":`该操作会永久删除指定的远端托管 Agent 文件。`}},usageArgs:`--file-id <id>`,flags:uO,exampleArgs:[`--file-id file_abc --dry-run`,`--file-id file_abc --yes`],notes:K,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_delete_file:e.flags.fileId},t);return}await J(()=>Y(async()=>{let t=await q(e,e.flags.file??`agents.yaml`);await fa(t,e.flags.fileId,{provider:`bailian`})})),t===`json`?A({deleted:e.flags.fileId},t):k(`File ${e.flags.fileId} deleted.`)}});function vO(e){let t=e.client.url(``,()=>``)||void 0,r=e.flags.workspaceId??e.settings.workspaceId;if(!t&&!r?.trim())throw new n(`Workspace ID is required when no base URL is configured. / 未配置 Base URL 时必须提供 Workspace ID。`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID, configure workspace_id, or set --base-url. / 请传入 --workspace-id、设置 BAILIAN_WORKSPACE_ID 或 workspace_id 配置,或通过 --base-url 指定地址。`);try{return co({baseUrl:t,workspaceId:r})}catch(e){throw e instanceof na?new n(t?`The configured API base URL is invalid. / 配置的 API Base URL 无效。`:`Workspace ID must be a valid hostname label. / Workspace ID 必须是有效的主机名标签。`,f.USAGE,t?`Configure a valid HTTP or HTTPS API base URL. / 请配置有效的 HTTP 或 HTTPS API Base URL。`:`Use a workspace ID such as workspace-example, or set --base-url. / 请使用 workspace-example 这样的有效 Workspace ID,或设置 --base-url。`):e}}function yO(e){let t=e.client.exportApiCredential();if(!t?.token.trim())throw new n(`A Bailian API key is required. / 必须提供百炼 API Key。`,f.AUTH,`Pass --api-key, set DASHSCOPE_API_KEY, or log in with auth login --api-key <key>. / 请传入 --api-key、设置 DASHSCOPE_API_KEY,或使用 auth login --api-key <key> 登录。`);let r=vO(e);return UC(e),oa({providers:{bailian:{api_key:t.token,base_url:r,workspace_id:e.flags.workspaceId??e.settings.workspaceId}}})}const bO={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID; optional when a base URL is configured`,"zh-CN":`Workspace ID;已配置 Base URL 时可省略`}}},xO={...bO,webhookId:{type:`string`,valueHint:`<wep_id>`,description:{"en-US":`Webhook endpoint ID`,"zh-CN":`Webhook 端点 ID`},required:!0}},SO={url:{type:`string`,valueHint:`<url>`,description:{"en-US":`Public HTTP or HTTPS callback URL`,"zh-CN":`公网 HTTP 或 HTTPS 回调地址`}},event:{type:`array`,valueHint:`<type>`,description:{"en-US":`Named event subscription; repeat for multiple events, wildcards are unsupported`,"zh-CN":`具名订阅事件;可重复传入多个事件,不支持通配符`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Description, up to 256 characters; an empty string clears it on update`,"zh-CN":`描述,最多 256 个字符;更新时传空字符串可清空`}}},CO=[{"en-US":`Manages workspace-level Webhooks directly; no agents.yaml or local state is required.`,"zh-CN":`直接管理工作空间级 Webhook;无需 agents.yaml 或本地状态文件。`},{"en-US":`Auth: --api-key > DASHSCOPE_API_KEY > active profile API key. Credentials are injected into the SDK in memory only.`,"zh-CN":`鉴权:--api-key > DASHSCOPE_API_KEY > 当前 Profile 的 API Key。凭证仅在内存中注入 SDK。`},{"en-US":`Base URL: --base-url > DASHSCOPE_BASE_URL > profile base_url. Without a configured URL, use --workspace-id > BAILIAN_WORKSPACE_ID > config workspace_id for the cn-beijing endpoint.`,"zh-CN":`Base URL:--base-url > DASHSCOPE_BASE_URL > Profile 的 base_url。未配置地址时,按 --workspace-id > BAILIAN_WORKSPACE_ID > 配置项 workspace_id 选择 cn-beijing 端点。`}],wO={"en-US":`Signing Secret is returned only on create/reset. Save it from this successful response; the CLI does not persist it.`,"zh-CN":`Signing Secret 仅在创建或重置时返回。请从本次成功响应中保存;CLI 不会自动持久化。`};function TO(e){if(e.webhookId!==void 0&&!e.webhookId.trim())return`--webhook-id must not be empty. / --webhook-id 不能为空。`;if(e.workspaceId!==void 0&&!e.workspaceId.trim())return`--workspace-id must not be empty. / --workspace-id 不能为空。`;if(e.url!==void 0)try{let t=new URL(e.url);if(t.protocol!==`http:`&&t.protocol!==`https:`)return`--url must use HTTP or HTTPS. / --url 必须使用 HTTP 或 HTTPS。`}catch{return`--url must be a valid HTTP or HTTPS URL. / --url 必须是有效的 HTTP 或 HTTPS 地址。`}if(e.event!==void 0&&(e.event.length===0||e.event.some(e=>!e.trim()||e.includes(`*`))))return`--event requires non-empty named events without wildcards. / --event 必须是非空具名事件,不能使用通配符。`;if(e.description!==void 0&&Array.from(e.description).length>256)return`--description must contain at most 256 characters. / --description 最多包含 256 个字符。`;if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>100))return`--limit must be an integer between 1 and 100. / --limit 必须是 1 到 100 之间的整数。`;if(e.page!==void 0&&!e.page.trim())return`--page must be a non-empty pagination cursor. / --page 必须是非空分页游标。`}function EO(e,t){let n=T(t.settings.output);n===`json`?A(e,n):k(JSON.stringify(e,null,2))}async function DO(e,t){let r=vO(e);if(e.settings.dryRun){EO({operation:`webhook.${t.operation}`,provider:`bailian`,base_url:r,...t.webhookId===void 0?{}:{webhook_id:t.webhookId},...t.request===void 0?{}:{request:t.request},...t.limit===void 0?{}:{limit:t.limit},...t.page===void 0?{}:{page:t.page}},e);return}let i=e.settings.timeout;if(!Number.isFinite(i)||i<=0||i*1e3>2147483647)throw new n(`--timeout must be greater than 0 and at most 2147483.647 seconds. / --timeout 必须大于 0 且不超过 2147483.647 秒。`,f.USAGE);EO(await J(()=>Y(async()=>{let r=yO(e),a=new AbortController,o=setTimeout(()=>a.abort(),Math.ceil(i*1e3));try{return await t.invoke(r,{provider:`bailian`,signal:a.signal})}catch(e){throw a.signal.aborted?new n(`Webhook request timed out after ${i} seconds. / Webhook 请求在 ${i} 秒后超时。`,f.TIMEOUT,`Check the endpoint state before retrying a mutation; increase --timeout if needed. / 重试变更操作前请先检查端点状态;可按需增大 --timeout。`):e}finally{clearTimeout(o)}})),e),t.returnsSecret&&process.stderr.write(`Signing Secret is shown only in this successful create/reset response; save it now. / Signing Secret 仅在本次创建或重置成功响应中返回,请立即保存。
2880
- `)}const OO=w({description:{"en-US":`Create a Webhook endpoint`,"zh-CN":`创建 Webhook 端点`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This creates a Webhook and starts delivering subscribed events to its callback URL.`,"zh-CN":`该操作会创建 Webhook,并开始向回调地址投递订阅事件。`}},flags:{...bO,...SO,url:{...SO.url,required:!0},event:{...SO.event,required:!0}},usageArgs:`--url <url> --event <type> [--event <type>] [--description <text>] [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --url https://example.com/webhooks --event session.updated --yes`],notes:[...CO,wO],validate:TO,async run(e){let t={url:e.flags.url,events:e.flags.event,...e.flags.description===void 0?{}:{description:e.flags.description}};await DO(e,{operation:`create`,request:t,returnsSecret:!0,invoke:(e,n)=>la(e,t,n)})}}),kO=w({description:{"en-US":`List all Webhook endpoints`,"zh-CN":`列出全部 Webhook 端点`},auth:`apiKey`,flags:bO,usageArgs:`[--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --output json`],notes:[...CO,{"en-US":`Returns every undeleted Webhook without pagination.`,"zh-CN":`返回所有未删除的 Webhook,不分页。`}],validate:TO,async run(e){await DO(e,{operation:`list`,invoke:(e,t)=>Xa(e,t)})}});function AO(e){return w({description:e.description,auth:`apiKey`,risk:e.risk,flags:xO,usageArgs:`--webhook-id <wep_id> [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --webhook-id wep_example${e.risk?` --yes`:``}`],notes:[...CO,...e.notes??[]],validate:TO,async run(t){await DO(t,{operation:e.operation,webhookId:t.flags.webhookId,returnsSecret:e.returnsSecret,invoke:(n,r)=>e.invoke(n,t.flags.webhookId,r)})}})}const jO=AO({operation:`get`,description:{"en-US":`Get a Webhook endpoint`,"zh-CN":`查询 Webhook 端点详情`},invoke:Na}),MO=w({description:{"en-US":`Update a Webhook endpoint`,"zh-CN":`更新 Webhook 端点`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This updates the callback URL, description, or event subscriptions of the Webhook.`,"zh-CN":`该操作会更新 Webhook 的回调地址、描述或订阅事件。`}},flags:{...xO,...SO},usageArgs:`--webhook-id <wep_id> [--url <url>] [--event <type>] [--description <text>] [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --webhook-id wep_example --description "" --yes`],notes:[...CO,{"en-US":`Omitted fields stay unchanged; --event replaces the complete subscription list.`,"zh-CN":`未传字段保持不变;--event 会替换整个订阅列表。`}],validate(e){let t=TO(e);if(t)return t;if(e.url===void 0&&e.event===void 0&&e.description===void 0)return`Provide --url, --event, or --description to update. / 更新时请至少提供 --url、--event 或 --description。`},async run(e){let t={...e.flags.url===void 0?{}:{url:e.flags.url},...e.flags.event===void 0?{}:{events:e.flags.event},...e.flags.description===void 0?{}:{description:e.flags.description}};await DO(e,{operation:`update`,webhookId:e.flags.webhookId,request:t,invoke:(n,r)=>wo(n,e.flags.webhookId,t,r)})}}),NO=AO({operation:`delete`,description:{"en-US":`Delete a Webhook endpoint`,"zh-CN":`删除 Webhook 端点`},risk:{level:`high`,message:{"en-US":`This deletes the Webhook and cancels its pending deliveries.`,"zh-CN":`该操作会删除 Webhook,并取消尚未投递的事件。`}},invoke:ma}),PO=AO({operation:`enable`,description:{"en-US":`Enable a Webhook endpoint`,"zh-CN":`启用 Webhook 端点`},risk:{level:`high`,message:{"en-US":`This resumes new event deliveries. Events from the disabled period are not replayed.`,"zh-CN":`该操作会恢复新事件投递,不会补发禁用期间的事件。`}},invoke:ba}),FO=AO({operation:`disable`,description:{"en-US":`Disable a Webhook endpoint`,"zh-CN":`禁用 Webhook 端点`},risk:{level:`high`,message:{"en-US":`This stops new event deliveries and cancels pending deliveries.`,"zh-CN":`该操作会停止新事件投递,并取消尚未投递的事件。`}},invoke:_a}),IO=AO({operation:`test`,description:{"en-US":`Send a real Webhook test event`,"zh-CN":`实际发送一次 Webhook 测试事件`},risk:{level:`high`,message:{"en-US":`This sends a real callback request; redirects or security validation failures may disable the Webhook.`,"zh-CN":`该操作会实际发送回调请求;重定向或安全校验失败可能禁用 Webhook。`}},notes:[{"en-US":`Tests are synchronous, are not retried or recorded, and do not affect consecutive failure counts.`,"zh-CN":`测试同步执行,不重试、不保存投递记录,也不影响连续失败计数。`}],invoke:xo}),LO=AO({operation:`reset-secret`,description:{"en-US":`Reset a Webhook signing secret`,"zh-CN":`重置 Webhook 验签密钥`},risk:{level:`high`,message:{"en-US":`This immediately invalidates the previous signing secret. Save the new secret and update your receiver.`,"zh-CN":`该操作会立即使旧验签密钥失效。请保存新密钥并更新接收端。`}},notes:[wO],returnsSecret:!0,invoke:so}),RO=w({description:{"en-US":`List recent Webhook delivery events`,"zh-CN":`查询最近的 Webhook 投递事件`},auth:`apiKey`,flags:{...xO,limit:{type:`number`,valueHint:`<count>`,description:{"en-US":`Page size, 1–100 (default: 20)`,"zh-CN":`每页数量,1–100(默认:20)`}},page:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Opaque next_page cursor from the previous response`,"zh-CN":`上一页响应中的不透明 next_page 游标`}}},usageArgs:`--webhook-id <wep_id> [--limit <count>] [--page <cursor>] [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --webhook-id wep_example --limit 20 --output json`],notes:[...CO,{"en-US":`Returns one page of delivery events retained for 7 days. Continue with next_page; deleted Webhooks' retained events remain queryable.`,"zh-CN":`返回一页保留 7 天的投递事件。可用 next_page 继续查询;Webhook 删除后仍可查询保留期内的事件。`}],validate:TO,async run(e){await DO(e,{operation:`events`,webhookId:e.flags.webhookId,limit:e.flags.limit,page:e.flags.page,invoke:(t,n)=>Za(t,e.flags.webhookId,{...n,limit:e.flags.limit,page:e.flags.page})})}}),zO={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`},BO={accessKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Alibaba Cloud Access Key ID`,"zh-CN":`阿里云 Access Key ID`}},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:{"en-US":`Alibaba Cloud Access Key Secret`,"zh-CN":`阿里云 Access Key Secret`}},securityToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Alibaba Cloud STS Security Token (optional)`,"zh-CN":`阿里云 STS Security Token(可选)`}}},VO=1e3;function HO(e){return new Promise(t=>setTimeout(t,e))}function UO(e){return e?.data?.DataV2?.data?.data}function WO(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 GO=w({description:{"en-US":`Initialize Bailian workspace and activate postpaid services`,"zh-CN":`初始化百炼 Workspace 并开通后付费服务`},auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> [--security-token <token>]`,flags:BO,exampleArgs:[`--access-key-id LTAIxxxxx --access-key-secret xxxxx`],async run(e){let{settings:t,flags:r}=e,i=T(t.output);if(t.dryRun){A({apis:[{step:0,api:`GenerateCLIAccessToken`,description:`Generate CLI access token from AK/SK`},{step:1,api:zO.loginInfo,description:`Check login & workspace status`},{step:2,api:zO.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:zO.queryBuyResult,description:`Query postpaid order status`},{step:7,api:zO.commodityOrderInfo,description:`Query commodity activation status`},{step:8,api:zO.buyCommodity,description:`Activate postpaid commodities (if needed)`}]},i);return}let{accessKeyId:a,accessKeySecret:o}=r;if(!a||!o)throw new n(`workspace init requires --access-key-id and --access-key-secret.`,f.USAGE);let s=r.securityToken||void 0,c=(await it({identity:e.identity,settings:t,baseUrl:e.client.baseUrl,accessKeyId:a,accessKeySecret:o,securityToken:s})).cliAccessToken;if(!c)throw new n(`Failed to generate CLI access token from AK/SK.`,f.GENERAL);let l=E(t),u={region:l.consoleRegion,site:l.consoleSite,...l.consoleSwitchAgent==null?{}:{switchAgent:l.consoleSwitchAgent},token:c},d=t.verbose,p=async(e,r={})=>{d&&process.stderr.write(`> ${e}\n`);try{let n=await ve(u,t.timeout,{api:e,data:r},t);return d&&process.stderr.write(`< ${JSON.stringify(n)}\n`),n}catch(e){if(d){let t=e instanceof n?e.rawResponse??e.message:String(e);process.stderr.write(`< ERROR: ${t}\n`)}throw e}};k(`Checking workspace status...`);let m=UO(await p(zO.loginInfo));m?.spaceInited===!0?k(`Workspace already initialized.`):(k(`Initializing workspace...`),await p(zO.initSpace),k(`Workspace initialized.`));let h=m?.aliyun?.uid;if(typeof h!=`string`||h.length===0)throw new n(`Console login info did not include aliyun.uid.`,f.GENERAL);let g={identity:e.identity,settings:t,baseUrl:e.client.baseUrl,regionId:l.consoleRegion,accessKeyId:a,accessKeySecret:o,securityToken:s};try{await we({...g,reqDTO:{outerKey:h,nickName:h,userName:h}})}catch(e){if(!(e instanceof n)||!/already exists/i.test(e.message))throw e;k(`Console user already exists, continuing.`)}k(`Resolving workspace agent...`);let _=WO(await Rt(g));if(_==null)throw new n(`Could not resolve agentId from ListWorkspaces response.`,f.GENERAL,`Re-run with --verbose to inspect the ListWorkspaces response body.`);k(`Authorizing user permissions...`),await jn({...g,outerKey:h,agentId:_,policyIndexList:[1]}),await KO(p,i)}});async function KO(e,t){k(`Checking service activation status...`);let r;for(let t=0;t<20;t++){let n=UO(await e(zO.queryBuyResult));if(r=typeof n==`string`?n:n?.result,r!==`buying`)break;t===0&&k(`Service activation in progress, polling...`),await HO(VO)}if(r===`fail`)throw new n(`Service activation failed.`,f.GENERAL);if(r===`success`){await YO(e,t);return}await JO(e,t)}function qO(e){let t=UO(e);return Array.isArray(t)?t:[]}async function JO(e,t){let n=qO(await e(zO.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(zO.buyCommodity),await YO(e,t);return}let a=n.filter(e=>e.status===10);A({status:`ready`,activeServices:a.map(e=>e.commodityCode)},t)}async function YO(e,t){k(`Waiting for services to activate...`);for(let n=0;n<20;n++){let n=qO(await e(zO.commodityOrderInfo));if(n.filter(e=>e.status!==10&&e.status!==11).length===0){let e=n.filter(e=>e.status===11);if(e.length>0){k(`Warning: Some services are overdue:`);for(let t of e)k(` - ${t.commodityCode}`)}let r=n.filter(e=>e.status===10);A({status:`ready`,activeServices:r.map(e=>e.commodityCode)},t);return}await HO(VO)}throw new n(`Timed out waiting for services to activate.`,f.TIMEOUT)}var XO=w({description:{"en-US":`Install or upgrade an allowlisted Command Pack`,"zh-CN":`安装或升级白名单内的 Command Pack`},auth:`none`,usageArgs:`--package <name[@version]>`,flags:{package:{type:`string`,valueHint:`<name[@version]>`,description:{"en-US":`Allowlisted Command Pack package and optional version or tag`,"zh-CN":`白名单内的 Command Pack 包名,以及可选的版本或 Tag`},required:!0}},exampleArgs:[`--package @ali/bailian-plugin-agent`,`--package @ali/bailian-plugin-agent@beta`],async run(e){let t=await e.commandPacks.install(e.flags.package);A({installed:t},T(e.settings.output))}}),ZO=w({description:{"en-US":`Link an allowlisted local Command Pack for development`,"zh-CN":`链接白名单内的本地 Command Pack 用于开发`},auth:`none`,usageArgs:`--path <directory>`,flags:{path:{type:`string`,valueHint:`<directory>`,description:{"en-US":`Local Command Pack package directory`,"zh-CN":`本地 Command Pack 包目录`},required:!0}},exampleArgs:[`--path ../bailian-plugin-agent`],async run(e){let t=await e.commandPacks.link(e.flags.path);A({linked:t},T(e.settings.output))}}),QO=w({description:{"en-US":`List installed Command Packs and their load status`,"zh-CN":`列出已安装的 Command Pack 及其加载状态`},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 zr([`NAME`,`VERSION`,`SOURCE`,`STATUS`,`COMMANDS / ERROR`],r))k(e)}}),$O=w({description:{"en-US":`Remove an installed Command Pack`,"zh-CN":`移除已安装的 Command Pack`},auth:`none`,usageArgs:`--name <package>`,flags:{name:{type:`string`,valueHint:`<package>`,description:{"en-US":`Allowlisted Command Pack package name`,"zh-CN":`白名单内的 Command Pack 包名`},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))}});function ek(e){return e.map(e=>({id:e.id,skillsDir:e.skillsDir}))}function tk(e){try{let t=bi(e);return t.isSymbolicLink()?{exists:!0,kind:`symlink`,hasSkillMd:!1}:t.isDirectory()?{exists:!0,kind:`directory`,hasSkillMd:M(N(e,`SKILL.md`))}:{exists:!0,kind:`file`,hasSkillMd:!1}}catch{return{exists:!1,kind:`absent`,hasSkillMd:!1}}}function nk(e,t){return t.map(t=>{let n=N(t.skillsDir,e);return{agent:t.id,path:n,...tk(n)}})}var rk=w({description:{"en-US":`Install skills from the Bailian skill registry into local agents`,"zh-CN":`将百炼 Skill Registry 中的 Skill 安装到本地 Agent`},auth:`none`,usageArgs:`--all | --name <name,...>`,flags:{all:{type:`switch`,description:{"en-US":`Install all skills from the registry`,"zh-CN":`安装 Registry 中的全部 Skill`}},name:{type:`string`,valueHint:`<name,...>`,description:{"en-US":`Comma-separated skill names to install`,"zh-CN":`要安装的 Skill 名称,以逗号分隔`}}},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 t=e.settings.outputExplicit?e.settings.output:`json`,r=await $e(),i=Object.keys(r.skills),a=e.flags.all?`all`:hn(e.flags.name,!1),o=a===`all`?i:a,s=Be();if(e.settings.dryRun){let e=o.map(e=>{let t=r.skills[e];return t?{name:e,status:`install`,publishedAt:t.publishedAt,links:nk(e,s)}:{name:e,status:`failed`,reason:`skill not found in registry`}});A({action:`skill.add`,registry:bt(),agents:ek(s),skills:e},t);let i=e.filter(e=>e.status===`failed`);if(i.length>0)throw new n(`${i.length}/${e.length} skill(s) failed to install`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill add`);return}let c=wn(),l=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 Ot(e,t,s,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)}}}),u=await zn(l,3);if(xr(c),t===`json`)A({registry:bt(),agents:s.map(e=>e.id),skills:u},t);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 zr([`NAME`,`STATUS`,`PUBLISHED`,`AGENTS / REASON`],e))k(t)}let d=u.filter(e=>e.status===`failed`);if(d.length>0)throw new n(`${d.length}/${u.length} skill(s) failed to install`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill add`)}}),ik=w({description:{"en-US":`Update installed skills to the latest registry versions`,"zh-CN":`将已安装的 Skill 更新到 Registry 最新版本`},auth:`none`,usageArgs:`[--all] [--name <name,...>]`,flags:{all:{type:`switch`,description:{"en-US":`Update all installed skills (default when neither --all nor --name is given)`,"zh-CN":`更新全部已安装 Skill(未指定 --all 或 --name 时的默认行为)`}},name:{type:`string`,valueHint:`<name,...>`,description:{"en-US":`Comma-separated skill names to update (must be already installed)`,"zh-CN":`要更新的 Skill 名称,以逗号分隔(必须已安装)`}}},validate(e){if(e.all&&e.name)return`Use either --all or --name, not both`},exampleArgs:[``,`--all`,`--name spark-video`],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,r=e.flags.all||!e.flags.name?`all`:hn(e.flags.name,!1),i=await $e(),a=wn(),o=new Set(Jt()),s=Be(),c=[],l=[];if(r===`all`)for(let[t,n]of Object.entries(a.skills)){let r=i.skills[t];if(!r){c.push({name:t,status:`skipped`,reason:`delisted from remote; local copy retained`});continue}if(r.contentHash===n.contentHash&&o.has(t)){if(e.settings.dryRun){c.push({name:t,status:`up-to-date`,publishedAt:n.publishedAt});continue}let r=Ke(t,s,n.links??[]);a.skills[t]={...n,links:r.links},c.push({name:t,status:`up-to-date`,publishedAt:n.publishedAt});continue}l.push(t)}else for(let e of r){if(!a.skills[e]){c.push({name:e,status:`failed`,reason:`not installed; run bl skill add --name `+e+` first`});continue}l.push(e)}if(e.settings.dryRun){let e=c.map(e=>e.status===`up-to-date`?{name:e.name,status:`up-to-date`,publishedAt:e.publishedAt,links:nk(e.name,s)}:e.status===`skipped`?{name:e.name,status:`skipped`,publishedAt:e.publishedAt,reason:e.reason}:{name:e.name,status:`failed`,publishedAt:e.publishedAt,reason:e.reason});for(let t of l){let n=i.skills[t];if(!n){e.push({name:t,status:`failed`,reason:`skill not found in registry`});continue}e.push({name:t,status:`update`,publishedAt:n.publishedAt,links:nk(t,s)})}A({action:`skill.update`,registry:bt(),agents:ek(s),skills:e},t);let r=e.filter(e=>e.status===`failed`);if(r.length>0)throw new n(`${r.length} skill(s) failed to update`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill update`);return}let u=l.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 Ot(e,t,s,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)}}}),d=await zn(u,3);if(c.push(...d),xr(a),t===`json`)A({registry:bt(),skills:c},t);else if(c.length===0)k(`No skills installed locally; run bl skill add first.`);else{let e=c.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,10):`-`]);for(let t of zr([`NAME`,`STATUS`,`PUBLISHED`],e))k(t);let t=c.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 p=c.filter(e=>e.status===`failed`);if(p.length>0)throw new n(`${p.length} skill(s) failed to update`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill update`)}}),ak=w({description:{"en-US":`Remove locally installed skills (registry is untouched)`,"zh-CN":`移除本地已安装的 Skill(不修改 Registry)`},auth:`none`,usageArgs:`--name <all|name,...>`,flags:{name:{type:`string`,valueHint:`<all|name,...>`,description:{"en-US":`Skills to remove: all or comma-separated skill names`,"zh-CN":`要移除的 Skill:all 或以逗号分隔的 Skill 名称`},required:!0}},exampleArgs:[`--name spark-video`,`--name all`],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,r=hn(e.flags.name,!1),i=wn(),a=r===`all`?Object.keys(i.skills):r;if(a.length===0){A({skills:[]},t),t===`text`&&k(`No skills installed locally; nothing to remove.`);return}let o=new Set(Jt()),s=xt();if(e.settings.dryRun){let e=a.map(e=>{let t=i.skills[e];return t?{name:e,status:`remove`,canonical:N(s,e),links:vn(e,t.links??[])}:{name:e,status:`failed`,reason:o.has(e)?`directory not managed by bl skill (untracked); remove manually if needed`:`not installed`}});A({action:`skill.remove`,skills:e},t);let r=e.filter(e=>e.status===`failed`);if(r.length>0)throw new n(`${r.length}/${e.length} skill(s) failed to remove`,f.GENERAL,`Check the reason for failed skills in the output; use bl skill list to verify local install status`);return}let 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=sr(e,t.links??[]);On(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(xr(i),t===`json`)A({skills:c},t);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 zr([`NAME`,`STATUS`,`DETAIL`],e))k(t)}let l=c.filter(e=>e.status===`failed`);if(l.length>0)throw new n(`${l.length}/${c.length} skill(s) failed to remove`,f.GENERAL,`Check the reason for failed skills in the output; use bl skill list to verify local install status`)}});function ok(e){return e?e.length>60?`${e.slice(0,59)}…`:e:`-`}var sk=w({description:{"en-US":`List registry skills and diff against local installs`,"zh-CN":`列出 Registry Skill,并与本地安装结果比较`},auth:`none`,exampleArgs:[``,`--output json`],notes:[{"en-US":`STATUS: installed | outdated | not-installed | missing (lock has it, dir deleted) | untracked (dir exists, not managed)`,"zh-CN":`STATUS:installed | outdated | not-installed | missing(Lock 中存在但目录已删除)| untracked(目录存在但未被管理)`}],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,n=await $e(),r=wn(),i=Ce(n,r,Jt());if(t===`json`){A({registry:bt(),...n.updatedAt?{updatedAt:n.updatedAt}:{},skills:i},t);return}if(i.length===0){k(`Skill registry is empty and no skills are installed locally.`);return}let a=i.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,19).replace(`T`,` `):`-`,ok(e.description)]);for(let e of zr([`NAME`,`STATUS`,`UPDATEDAT`,`DESCRIPTION`],a))k(e)}});const ck=`json`,lk={success:`success`,partial:`partial`,failed:`failed`};var uk=w({description:{"en-US":`Install all bailian-* skills (one-shot bootstrap for new environments)`,"zh-CN":`安装全部 bailian-* Skill(用于新环境的一次性初始化)`},auth:`none`,usageArgs:``,exampleArgs:[``],notes:[{"en-US":"Fetches the registry index and installs every skill whose name starts with `bailian-`.","zh-CN":"获取 Registry 索引并安装名称以 `bailian-` 开头的所有 Skill。"},{"en-US":"Equivalent to: `bl skill add --all` (filtered to `bailian-*` skills).","zh-CN":"等价于:`bl skill add --all`(筛选为 `bailian-*` Skill)。"}],async run(e){let t=e.settings.outputExplicit?e.settings.output:ck,r=await $e(),i=Object.keys(r.skills).filter(e=>e.startsWith(`bailian-`)),a=Be();if(e.settings.dryRun){A({action:`skill.init`,skills:i.map(e=>({name:e,links:nk(e,a)})),agents:ek(a)},t);return}let o=wn(),s=i.map(e=>async()=>{let t=r.skills[e];try{let n=await Ot(e,t,a,o.skills[e]?.links??[]);return o.skills[e]=n.lockEntry,{name:e,status:lk.success}}catch(t){return{name:e,status:lk.failed,reason:t instanceof Error?t.message:String(t)}}}),c=await zn(s,3);xr(o);let l=c.filter(e=>e.status===lk.success),u=c.filter(e=>e.status===lk.failed),d=u.length===0?lk.success:l.length===0?lk.failed:lk.partial;if(t===ck){let e=a.map(e=>e.id),n={status:d,skills:l.map(e=>e.name)};u.length>0&&(n.failed=u.map(t=>({name:t.name,reason:t.reason,agents:e}))),A(n,t)}else if(c.length===0)k(`No bailian-* skills found in the registry.`);else if(k(d===lk.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 n(`${u.length}/${c.length} skill(s) failed to install`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill init`)}});const dk=[{id:`code-interpreter`,imageName:`代码解释器`,imageUrl:`fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/code-interpreter-v1:v0.0.44`,icon:`https://img.alicdn.com/imgextra/i2/O1CN01iX8RH9ckFvC093x2_!!6000000000905-2-tps-72-72.png`,description:{"en-US":`Python / Node.js runtimes with common data-processing libraries`,"zh-CN":`Python / Node.js 运行时+常用数据处理库`}},{id:`browser`,imageName:`浏览器`,imageUrl:`fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/browser:v0.0.44`,icon:`https://img.alicdn.com/imgextra/i4/O1CN01ShCbPEunrRI093x2_!!6000000000155-2-tps-72-72.png`,description:{"en-US":`Chromium and a visual desktop for clicking, filling forms, and screenshots`,"zh-CN":`Chromium +可视化桌面,支持点击/ 填表/截图`}},{id:`all-in-one`,imageName:`全能型`,imageUrl:`fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/all-in-one:v0.0.44`,icon:`https://img.alicdn.com/imgextra/i1/O1CN01smhklUahsyE093x2_!!6000000006657-2-tps-72-72.png`,description:{"en-US":`Code execution and browser capabilities together`,"zh-CN":`代码执行+浏览器双能力`}}],fk=dk.flatMap(e=>[e.id,e.imageName]),pk=dk.map(e=>({"en-US":`${e.id} (${e.imageName}): ${e.description[`en-US`]}. ${e.imageUrl}`,"zh-CN":`${e.id}(${e.imageName}):${e.description[`zh-CN`]}。${e.imageUrl}`}));function mk(e){let t=dk.find(t=>t.id===e||t.imageName===e);if(!t)throw new C(`Unknown built-in image / 未知内置镜像: ${e}. ${fk.join(`, `)}`);return t}const hk=w({description:{"en-US":`List the built-in Sandbox base images (offline)`,"zh-CN":`列出 CLI 内置的 Sandbox 基础镜像(离线)`},auth:`none`,exampleArgs:[``,`--output json`,`--quiet`],notes:[{"en-US":`Use a preset ID or Chinese name with template create/update --image. These are pinned cn-beijing images; other environments may differ. Use --from-image for a custom image.`,"zh-CN":`在 template create/update 中通过 --image 传入预设 ID 或中文名。这些是固定版本的 cn-beijing 镜像,其他环境可能不同;自定义镜像使用 --from-image。`},...pk],async run(e){if(e.settings.quiet){for(let e of dk)k(e.id);return}if(T(e.settings.output)===`json`){A(dk,`json`);return}for(let e of dk)k(`${e.id} (${e.imageName})`),k(` ${e.imageUrl}`),k(` ${e.description[`en-US`]} / ${e.description[`zh-CN`]}`)}}),gk={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for the default Sandbox endpoint; optional with a configured base URL`,"zh-CN":`默认 Sandbox Endpoint 的 Workspace ID;已配置 Base URL 时可省略`}}},_k={body:{type:`string`,valueHint:`<json|@path>`,description:{"en-US":`JSON request body, inline or loaded from an @file path; explicit flags override it`,"zh-CN":`JSON 请求体,可内联或从 @文件路径读取;显式 Flag 优先`}}},vk={instanceTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Sandbox lifetime after this operation (300-604800 seconds)`,"zh-CN":`本次操作后的 Sandbox 存活时间(300–604800 秒)`}}},yk={showCredentials:{type:`switch`,description:{"en-US":`Print envd and traffic access tokens instead of redacting them`,"zh-CN":`输出 envd 与流量访问 Token 原值,不进行脱敏`}}},bk={pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Template build polling interval (default: 5 seconds)`,"zh-CN":`模版构建轮询间隔(默认:5 秒)`}}},xk=[{"en-US":`Auth: uses a Bailian API Key as an Authorization Bearer token; no E2B key is sent.`,"zh-CN":`鉴权:使用百炼 API Key 作为 Authorization Bearer Token;不会发送 E2B Key。`},{"en-US":`Base URL: --base-url > DASHSCOPE_BASE_URL > login/profile base_url. The CLI uses its origin and appends /api/v1/agentstudio/sandbox; otherwise it uses the workspace-scoped cn-beijing endpoint.`,"zh-CN":`Base URL 优先级:--base-url > DASHSCOPE_BASE_URL > 登录/Profile 的 base_url。CLI 取其 origin 并追加 /api/v1/agentstudio/sandbox;未配置时使用工作空间的 cn-beijing Endpoint。`},{"en-US":`Without a configured base URL, workspace is required: --workspace-id > BAILIAN_WORKSPACE_ID > config workspace_id.`,"zh-CN":`未配置 Base URL 时必须提供 Workspace:--workspace-id > BAILIAN_WORKSPACE_ID > 配置项 workspace_id。`},{"en-US":`Sandbox is currently available in cn-beijing only and requires prior SLR authorization.`,"zh-CN":`Sandbox 当前仅支持 cn-beijing,首次使用前需完成 SLR 授权。`},{"en-US":`Global --timeout limits HTTP requests and total template-build polling; --instance-timeout maps to the Sandbox API lifetime field.`,"zh-CN":`全局 --timeout 限制 HTTP 请求和模版构建总轮询时间;--instance-timeout 映射到 Sandbox API 的实例存活时间字段。`}];function Sk(e,t){return e.client.url(Bn(t),()=>Vn(Ck(e)))}function Ck(e){let t=e.flags.workspaceId||e.settings.workspaceId;if(!t)throw new n(`Workspace ID is required when no base URL is configured. / 未配置 Base URL 时必须提供 Workspace ID。`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID, configure workspace_id, or set --base-url. / 请传入 --workspace-id、设置 BAILIAN_WORKSPACE_ID 或 workspace_id 配置,或通过 --base-url 指定地址。`);return t}function wk(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw new n(`${t} must contain a JSON object.`,f.USAGE);return e}async function Tk(e){if(!e)return{};let t=e.startsWith(`@`)?e.slice(1):void 0;if(t!==void 0&&t.length===0)throw new n(`--body @path must include a file path.`,f.USAGE);let r=t===void 0?e:await Ui(t,`utf8`);try{return wk(JSON.parse(r),t?`Body file ${t}`:`--body`)}catch(e){throw e instanceof n?e:e instanceof SyntaxError?new n(t?`Body file ${t} contains invalid JSON.`:`--body contains invalid JSON.`,f.USAGE):e}}function Q(e,t,n){n!==void 0&&(e[t]=n)}function Ek(e,t){let r={};for(let i of e??[]){let e=i.indexOf(`=`);if(e<=0)throw new n(`${t} values must use KEY=VALUE format.`,f.USAGE);let a=i.slice(0,e).trim();if(!a)throw new n(`${t} values must include a non-empty key.`,f.USAGE);r[a]=i.slice(e+1)}return r}function Dk(e,t,n){if(Object.keys(n).length===0)return;let r=e[t];e[t]={...typeof r==`object`&&r&&!Array.isArray(r)?r:{},...n}}function Ok(e,t,r,i){if(e!==void 0&&(typeof e!=`number`||!Number.isInteger(e)||e<r||e>i))throw new n(`${t} must be an integer between ${r} and ${i}.`,f.USAGE)}function kk(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw new n(`${t} must be a positive integer.`,f.USAGE)}const Ak=/* @__PURE__ */ new Set([`envdAccessToken`,`trafficAccessToken`]),jk=/(?:token|secret|password|credential|api[_-]?key)/i;function Mk(e,t){if(Array.isArray(e))return e.map(e=>Mk(e,t));if(typeof e!=`object`||!e)return e;let n={};for(let[r,i]of Object.entries(e)){if(Ak.has(r)||jk.test(r)||t&&(r===`envVars`||r===`envConfig`)){n[r]=i==null?i:(r===`envVars`||r===`envConfig`)&&typeof i==`object`&&!Array.isArray(i)?Object.fromEntries(Object.keys(i).map(e=>[e,`[REDACTED]`])):`[REDACTED]`;continue}n[r]=Mk(i,t)}return n}function Nk(e){return Mk(e,!1)}function Pk(e){return Mk(e,!0)}function $(e){return e==null||e===``?`-`:Array.isArray(e)?e.join(`,`):typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:JSON.stringify(e)??`-`}const Fk=`sandbox_template`,Ik=w({description:{"en-US":`Upload a workspace file for Sandbox template mounts`,"zh-CN":`上传工作空间文件,供 Sandbox 模版挂载使用`},auth:`apiKey`,usageArgs:`--path <path> [--filename <name>] [--mime-type <type>]`,flags:{...gk,path:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Local file path`,"zh-CN":`本地文件路径`}},filename:{type:`string`,valueHint:`<name>`,description:{"en-US":`Remote filename override`,"zh-CN":`覆盖远端文件名`}},mimeType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Multipart file MIME type (default: application/octet-stream)`,"zh-CN":`Multipart 文件部分的 MIME 类型(默认:application/octet-stream)`}}},exampleArgs:[`--path ./config.json --output json`,`--path ./config.json --quiet`,`--path ./notes.txt --filename notes.txt --mime-type text/plain --dry-run --output json`],notes:[{"en-US":`POST /api/v1/agentstudio/files with multipart fields file and source=sandbox_template. Uses a Bailian Bearer API Key, not Console authentication or an E2B key; no agents.yaml is needed.`,"zh-CN":`向 /api/v1/agentstudio/files 发送 multipart 字段 file 和 source=sandbox_template。使用百炼 Bearer API Key,不使用 Console 鉴权或 E2B Key;无需 agents.yaml。`},{"en-US":`Base URL follows Sandbox: --base-url > DASHSCOPE_BASE_URL > login/profile base_url. Without one, --workspace-id > BAILIAN_WORKSPACE_ID > config workspace_id selects the cn-beijing origin. The upload path has no /sandbox prefix.`,"zh-CN":`Base URL 沿用 Sandbox:--base-url > DASHSCOPE_BASE_URL > 登录/Profile 的 base_url。未配置时,按 --workspace-id > BAILIAN_WORKSPACE_ID > 配置项 workspace_id 选择 cn-beijing 地址。上传路径不带 /sandbox 前缀。`},{"en-US":`Returns the upload response immediately; --quiet prints only its id. Upload does not wait for security review: status=checking is not ready to mount. Use an available file's id as mntConfig[].originFileId in template create/update --body, together with mountPath and optional originFileName, in the same workspace. This does not transfer files into a running instance.`,"zh-CN":`上传响应返回后立即输出,--quiet 仅输出 id。不会等待安全审核:status=checking 不代表已可挂载。在同一工作空间的 template create/update --body 中,将可用文件的 id 填入 mntConfig[].originFileId,同时传入 mountPath 和可选的 originFileName。此命令不向运行中的实例传文件。`},{"en-US":`--dry-run previews the endpoint, source, and local path without reading or uploading the file. The service detects the MIME type and enforces upload limits.`,"zh-CN":`--dry-run 仅预览 Endpoint、source 和本地路径,不读取或上传文件。MIME 类型检测和上传限制由服务端执行。`}],async run(e){let t=e.client.url(re(),()=>Vn(Ck(e))),r=e.flags.filename??Di(e.flags.path),i=e.flags.mimeType??`application/octet-stream`,a=T(e.settings.output);if(e.settings.dryRun){A({method:`POST`,endpoint:t,request:{source:Fk,file:{path:e.flags.path,filename:r,mimeType:i}}},a);return}let o=new Uint8Array(await Ui(e.flags.path)),s=new FormData;s.append(`source`,Fk),s.append(`file`,new Blob([o],{type:i}),r);let c=await e.client.requestJson({method:`POST`,path:t,body:s});if(!c||typeof c.id!=`string`||!c.id.trim())throw new n(`Upload response did not contain a File ID. / 上传响应未包含 File ID。`,f.GENERAL);e.settings.quiet?k(c.id):A(Nk(c),a)}}),Lk={sandboxId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Sandbox instance ID`,"zh-CN":`Sandbox 实例 ID`}}},Rk={...gk,..._k,templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Ready template ID; may alternatively be supplied as templateID in --body`,"zh-CN":`已就绪的模版 ID;也可通过 --body 中的 templateID 提供`}},...vk,allowInternetAccess:{type:`boolean`,valueHint:`<bool>`,description:{"en-US":`Allow public internet access`,"zh-CN":`允许访问公网`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Instance metadata entry; repeat for multiple values`,"zh-CN":`实例 Metadata 键值;可重复传入`}},env:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Instance environment variable; repeat for multiple values`,"zh-CN":`实例环境变量;可重复传入`}},autoPause:{type:`boolean`,valueHint:`<bool>`,description:{"en-US":`Pause the instance when its timeout expires`,"zh-CN":`实例超时后自动暂停`}},autoResume:{type:`boolean`,valueHint:`<bool>`,description:{"en-US":`Automatically resume a paused instance when connecting`,"zh-CN":`连接已暂停实例时自动恢复`}},allowOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound allow-list entry; repeat for multiple values`,"zh-CN":`出站白名单条目;可重复传入`}},denyOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound deny-list entry; repeat for multiple values`,"zh-CN":`出站黑名单条目;可重复传入`}},maskRequestHost:{type:`string`,valueHint:`<host>`,description:{"en-US":`Override the outbound request Host header`,"zh-CN":`覆盖出站请求的 Host Header`}},...yk},zk={...gk,templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by template ID`,"zh-CN":`按模版 ID 筛选`}},sandboxId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by sandbox ID`,"zh-CN":`按 Sandbox ID 筛选`}},state:{type:`string`,valueHint:`<state>`,description:{"en-US":`Filter by state, for example running or paused`,"zh-CN":`按状态筛选,例如 running 或 paused`}},limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum results (1-50)`,"zh-CN":`最大返回数量(1–50)`}}},Bk={...gk,...Lk,...yk},Vk={...gk,...Lk},Hk={...gk,...Lk,..._k,...vk,...yk};async function Uk(e){let t=await Tk(e.body);Q(t,`templateID`,e.templateId),Q(t,`timeout`,e.instanceTimeout),Q(t,`allow_internet_access`,e.allowInternetAccess),Q(t,`autoPause`,e.autoPause),Q(t,`autoResume`,e.autoResume),Dk(t,`metadata`,Ek(e.metadata,`--metadata`)),Dk(t,`envVars`,Ek(e.env,`--env`));let r={};if(Q(r,`allowOut`,e.allowOut),Q(r,`denyOut`,e.denyOut),Q(r,`maskRequestHost`,e.maskRequestHost),Dk(t,`network`,r),typeof t.templateID!=`string`||t.templateID.trim().length===0)throw new n(`Sandbox create requires --template-id or templateID in --body.`,f.USAGE);return Ok(t.timeout,`Sandbox timeout`,300,604800),t}async function Wk(e){let t=await Tk(e.body);return Q(t,`timeout`,e.instanceTimeout),Ok(t.timeout,`Sandbox timeout`,300,604800),t}function Gk(e,t){let n=t.showCredentials?e:Nk(e);if(t.quiet){k($(e.sandboxID));return}A(n,t.format)}const Kk=w({description:{"en-US":`Create a Sandbox instance`,"zh-CN":`创建 Sandbox 实例`},auth:`apiKey`,usageArgs:`(--template-id <id> | --body <json|@path>) [flags]`,flags:Rk,exampleArgs:[`--template-id tpl-xxx --instance-timeout 3600`,`--template-id tpl-xxx --base-url https://workspace.cn-beijing.maas.aliyuncs.com`,`--body @sandbox.json --dry-run --output json`,`--template-id tpl-xxx --show-credentials --output json`],notes:xk,async run(e){let t=T(e.settings.output),n=Sk(e,x.sandboxes),r=await Uk(e.flags);if(e.settings.dryRun){A({method:`POST`,endpoint:n,request:Pk(r)},t);return}Gk(await e.client.requestJson({path:n,method:`POST`,body:r}),{format:t,quiet:e.settings.quiet,showCredentials:e.flags.showCredentials})}}),qk=w({description:{"en-US":`List Sandbox instances`,"zh-CN":`列出 Sandbox 实例`},auth:`apiKey`,usageArgs:`[--template-id <id>] [--sandbox-id <id>] [--state <state>] [--limit <n>]`,flags:zk,exampleArgs:[``,`--state running --limit 20`,`--template-id tpl-xxx --output json`],notes:xk,validate(e){if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>50))return`--limit must be an integer between 1 and 50.`},async run(e){let t=new URL(Sk(e,x.sandboxList));e.flags.templateId&&t.searchParams.set(`templateID`,e.flags.templateId),e.flags.sandboxId&&t.searchParams.set(`sandboxID`,e.flags.sandboxId),e.flags.state&&t.searchParams.set(`state`,e.flags.state),e.flags.limit!==void 0&&t.searchParams.set(`limit`,String(e.flags.limit));let n=await e.client.requestJson({path:t.toString(),method:`GET`});if(e.settings.quiet){for(let e of n)k($(e.sandboxID));return}let r=T(e.settings.output);if(r===`json`){A(n,r);return}if(n.length===0){k(`No Sandbox instances found.`);return}let i=n.map(e=>[$(e.sandboxID),$(e.templateID),$(e.state),$(e.cpuCount),$(e.memoryMB),$(e.startedAt),$(e.endAt)]);for(let e of zr([`ID`,`TEMPLATE`,`STATE`,`CPU`,`MEMORY_MB`,`STARTED_AT`,`END_AT`],i))k(e)}}),Jk=w({description:{"en-US":`Get Sandbox instance details`,"zh-CN":`获取 Sandbox 实例详情`},auth:`apiKey`,usageArgs:`--sandbox-id <id> [--show-credentials]`,flags:Bk,exampleArgs:[`--sandbox-id sbx-xxx`,`--sandbox-id sbx-xxx --show-credentials --output json`],notes:xk,async run(e){let t=Sk(e,Un(e.flags.sandboxId));Gk(await e.client.requestJson({path:t,method:`GET`}),{format:T(e.settings.output),quiet:e.settings.quiet,showCredentials:e.flags.showCredentials})}});function Yk(e){let t=e===`connect`?`Connect to`:`Resume`,n=e===`connect`?`连接`:`恢复`;return w({description:{"en-US":`${t} a Sandbox instance and return connection information`,"zh-CN":`${n} Sandbox 实例并返回连接信息`},auth:`apiKey`,usageArgs:`--sandbox-id <id> [--instance-timeout <seconds>] [--show-credentials]`,flags:Hk,exampleArgs:[`--sandbox-id sbx-xxx --instance-timeout 3600`,`--sandbox-id sbx-xxx --show-credentials --output json`],notes:xk,async run(t){let n=T(t.settings.output),r=Sk(t,Hn(t.flags.sandboxId,e)),i=await Wk(t.flags);if(t.settings.dryRun){A({method:`POST`,endpoint:r,request:Pk(i)},n);return}Gk(await t.client.requestJson({path:r,method:`POST`,body:Object.keys(i).length>0?i:void 0}),{format:n,quiet:t.settings.quiet,showCredentials:t.flags.showCredentials})}})}const Xk=Yk(`connect`),Zk=Yk(`resume`),Qk=w({description:{"en-US":`Pause a Sandbox instance`,"zh-CN":`暂停 Sandbox 实例`},auth:`apiKey`,usageArgs:`--sandbox-id <id>`,flags:Vk,exampleArgs:[`--sandbox-id sbx-xxx`,`--sandbox-id sbx-xxx --dry-run --output json`],notes:xk,async run(e){let t=T(e.settings.output),n=Sk(e,Hn(e.flags.sandboxId,`pause`));if(e.settings.dryRun){A({method:`POST`,endpoint:n,request:null},t);return}await(await e.client.request({path:n,method:`POST`})).body?.cancel(),e.settings.quiet?k(e.flags.sandboxId):A({sandboxID:e.flags.sandboxId,paused:!0},t)}}),$k=w({description:{"en-US":`Release a Sandbox instance`,"zh-CN":`释放 Sandbox 实例`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently releases the Sandbox instance and cannot be undone.`,"zh-CN":`该操作会永久释放 Sandbox 实例,且无法撤销。`}},usageArgs:`--sandbox-id <id>`,flags:Vk,exampleArgs:[`--sandbox-id sbx-xxx --dry-run`,`--sandbox-id sbx-xxx --yes`],notes:xk,async run(e){let t=T(e.settings.output),n=Sk(e,Un(e.flags.sandboxId));if(e.settings.dryRun){A({method:`DELETE`,endpoint:n,request:null},t);return}await(await e.client.request({path:n,method:`DELETE`})).body?.cancel(),e.settings.quiet?k(e.flags.sandboxId):A({sandboxID:e.flags.sandboxId,deleted:!0},t)}}),eA={async:{type:`switch`,description:{"en-US":`Return the submitted templateID/buildID immediately without polling`,"zh-CN":`提交后立即返回 templateID/buildID,不轮询构建状态`}}},tA={templateId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Sandbox template ID`,"zh-CN":`Sandbox 模版 ID`}}},nA={image:{type:`string`,valueHint:`<preset>`,choices:fk,description:{"en-US":`Built-in image ID or Chinese name; fills fromImage and imageName`,"zh-CN":`内置镜像 ID 或中文名;自动填写 fromImage 和 imageName`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Template name`,"zh-CN":`模版名称`}},cpuCount:{type:`number`,valueHint:`<cores>`,description:{"en-US":`vCPU count`,"zh-CN":`vCPU 核数`}},memoryMb:{type:`number`,valueHint:`<mb>`,description:{"en-US":`Memory in MB`,"zh-CN":`内存大小(MB)`}},fromImage:{type:`string`,valueHint:`<image>`,description:{"en-US":`Base image identifier`,"zh-CN":`基础镜像标识`}},imageName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Base image display name`,"zh-CN":`基础镜像展示名称`}},env:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Template environment variable; repeat for multiple values`,"zh-CN":`模版环境变量;可重复传入`}},allowOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound allow-list entry; repeat for multiple values`,"zh-CN":`出站白名单条目;可重复传入`}},denyOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound deny-list entry; repeat for multiple values`,"zh-CN":`出站黑名单条目;可重复传入`}},autoPauseTime:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Automatically pause after 300-604800 seconds`,"zh-CN":`在 300–604800 秒后自动暂停`}},maxRunningTime:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Maximum running lifetime in seconds (300-604800)`,"zh-CN":`最大运行时间(秒,300–604800)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Template description`,"zh-CN":`模版描述`}}},rA={...gk,..._k,...nA,tag:{type:`array`,valueHint:`<tag>`,description:{"en-US":`E2B tag; repeat for multiple values`,"zh-CN":`E2B Tag;可重复传入`}},alias:{type:`string`,valueHint:`<alias>`,description:{"en-US":`E2B template alias`,"zh-CN":`E2B 模版别名`}},...eA,...bk},iA={...gk,...tA,..._k,...nA,...eA,...bk},aA={...gk,limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum results (1-100)`,"zh-CN":`最大返回数量(1–100)`}},cursor:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Server-side pagination cursor`,"zh-CN":`服务端分页 Cursor`}}},oA={...gk,...tA},sA={...gk,...tA,buildId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Template build ID`,"zh-CN":`模版构建 ID`}}};function cA(e,t){if(t.image!==void 0){let n=mk(t.image);e.fromImage=n.imageUrl,e.imageName=n.imageName}Q(e,`name`,t.name),Q(e,`cpuCount`,t.cpuCount),Q(e,`memoryMB`,t.memoryMb),Q(e,`fromImage`,t.fromImage),Q(e,`imageName`,t.imageName),Q(e,`autoPauseTime`,t.autoPauseTime),Q(e,`maxRunningTimeout`,t.maxRunningTime),Q(e,`description`,t.description),Dk(e,`envConfig`,Ek(t.env,`--env`));let n={};Q(n,`allowOut`,t.allowOut),Q(n,`denyOut`,t.denyOut),Dk(e,`networkConfig`,n)}function lA(e,t){if(t&&(typeof e.name!=`string`||e.name.trim().length===0))throw new n(`Template create requires --name or name in --body.`,f.USAGE);let r=e.cpuCount!==void 0,i=e.memoryMB!==void 0;if(t&&(!r||!i))throw new n(`Template create requires both --cpu-count and --memory-mb, or their --body fields.`,f.USAGE);if(r!==i)throw new n(`cpuCount and memoryMB must be provided together.`,f.USAGE);if(r&&kk(e.cpuCount,`cpuCount`),i&&kk(e.memoryMB,`memoryMB`),Ok(e.autoPauseTime,`autoPauseTime`,300,604800),Ok(e.maxRunningTimeout,`maxRunningTimeout`,300,604800),!t&&Object.keys(e).length===0)throw new n(`Template update requires at least one field.`,f.USAGE)}async function uA(e){let t=await Tk(e.body);return cA(t,e),Q(t,`tags`,e.tag),Q(t,`alias`,e.alias),lA(t,!0),t}async function dA(e){let t=await Tk(e.body);return cA(t,e),lA(t,!1),t}async function fA(e,t,r,i){let a=Date.now()+t.timeout*1e3,o=Ar(`Waiting for template build...`);t.quiet||o.start();try{for(;;){let s=a-Date.now();if(s<=0)break;let c=await e.requestJson({path:r,method:`GET`,timeout:s/1e3});if(t.quiet||o.update(`Build status: ${c.status??`unknown`}`),c.status===`ready`)return o.stop(`Template build ready.`),c;if(c.status===`error`){o.stop(`Template build failed.`);let e=c.reason?.message??(c.reason?.code===void 0?`Template build failed.`:`${c.reason.code}`);throw new n(e,f.GENERAL)}let l=Math.min(i*1e3,a-Date.now());l>0&&await new Promise(e=>setTimeout(e,l))}}finally{o.stop()}throw new n(`Template build polling timed out.`,f.TIMEOUT,`Increase --timeout or query the build status command with the returned IDs.`)}function pA(e){if(e.pollInterval!==void 0&&(!Number.isInteger(e.pollInterval)||e.pollInterval<=0))return`--poll-interval must be a positive integer.`}async function mA(e){let t=T(e.settings.output);if(!e.response.templateID||!e.response.buildID)throw new n(`Template mutation response is missing templateID or buildID.`,f.GENERAL);if(e.async){e.settings.quiet?k(`${e.response.templateID}\t${e.response.buildID}`):A(e.response,t);return}let r=new URL(Bn(Wn(e.response.templateID,e.response.buildID)),e.endpoint).toString(),i;try{i=await fA(e.client,e.settings,r,e.pollInterval??5)}catch(r){let i=`Submitted build / 已提交的构建: templateID=${e.response.templateID}, buildID=${e.response.buildID}.\nCheck this build with sandbox template build-status before submitting another build. / 请先通过 sandbox template build-status 查询本次构建,再决定是否重新提交。`;if(r instanceof n)throw new n(r.message,r.exitCode,[r.hint,i].filter(Boolean).join(`
2881
- `),{api:r.api,rawResponse:r.rawResponse,cause:r.cause});let a={templateID:e.response.templateID,buildID:e.response.buildID,hint:i};throw process.stderr.write(t===`json`?`${JSON.stringify(a,null,2)}\n\n`:`${i}\n`),r}e.settings.quiet?k($(e.response.templateID)):A({template:e.response,build:i},t)}const hA=w({description:{"en-US":`Create a Sandbox template`,"zh-CN":`创建 Sandbox 模版`},auth:`apiKey`,usageArgs:`(--name <name> --cpu-count <cores> --memory-mb <mb> | --body <json|@path>) [flags]`,flags:rA,exampleArgs:[`--name browser --image browser --cpu-count 1 --memory-mb 2048`,`--name python --cpu-count 1 --memory-mb 2048`,`--body @template.json --async --output json`,`--name browser --cpu-count 4 --memory-mb 8192 --dry-run --output json`],notes:[...xk,...pk,{"en-US":`--image overrides body fromImage/imageName; explicit --from-image/--image-name override the corresponding preset fields. Without --image, image behavior is unchanged.`,"zh-CN":`--image 覆盖 body 中的 fromImage/imageName;显式 --from-image/--image-name 再覆盖对应预设字段。不传 --image 时保持原有镜像行为。`},{"en-US":`For local file mounts, use sandbox file upload first; put the available file's id into --body mntConfig[].originFileId with mountPath and optional originFileName. Upload and template must use the same workspace. Other complete nested structures can also be supplied through --body.`,"zh-CN":`挂载本地文件前先调用 sandbox file upload;将可用文件的 id 填入 --body 的 mntConfig[].originFileId,并传入 mountPath 和可选的 originFileName。上传和模版须位于同一工作空间。其他完整嵌套结构也可通过 --body 提供。`},{"en-US":`By default the command waits for build status ready; --async returns the submitted build immediately.`,"zh-CN":`默认等待构建状态变为 ready;--async 会立即返回已提交的构建信息。`}],validate:pA,async run(e){let t=T(e.settings.output),n=Sk(e,x.templateCreate),r=await uA(e.flags);if(e.settings.dryRun){A({method:`POST`,endpoint:n,request:Pk(r)},t);return}await mA({response:await e.client.requestJson({path:n,method:`POST`,body:r}),endpoint:n,client:e.client,settings:e.settings,async:e.flags.async,pollInterval:e.flags.pollInterval})}}),gA=w({description:{"en-US":`List Sandbox templates`,"zh-CN":`列出 Sandbox 模版`},auth:`apiKey`,usageArgs:`[--limit <n>] [--cursor <cursor>]`,flags:aA,exampleArgs:[``,`--limit 100 --output json`],notes:[...xk,{"en-US":`The API response does not expose a next cursor, so automatic --all pagination is unavailable.`,"zh-CN":`API 响应未提供下一页 Cursor,因此不支持自动 --all 翻页。`}],validate(e){if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>100))return`--limit must be an integer between 1 and 100.`},async run(e){let t=new URL(Sk(e,x.templateList));e.flags.limit!==void 0&&t.searchParams.set(`limit`,String(e.flags.limit)),e.flags.cursor&&t.searchParams.set(`cursor`,e.flags.cursor);let n=await e.client.requestJson({path:t.toString(),method:`GET`});if(e.settings.quiet){for(let e of n)k($(e.templateID));return}let r=T(e.settings.output);if(r===`json`){A(n,r);return}if(n.length===0){k(`No Sandbox templates found.`);return}let i=n.map(e=>[$(e.templateID),$(e.templateName),$(e.cpuCount),$(e.memoryMB),$(e.spawnCount),$(e.buildCount),$(e.updatedAt)]);for(let e of zr([`ID`,`NAME`,`CPU`,`MEMORY_MB`,`INSTANCES`,`BUILDS`,`UPDATED_AT`],i))k(e)}}),_A=w({description:{"en-US":`Get Sandbox template details`,"zh-CN":`获取 Sandbox 模版详情`},auth:`apiKey`,usageArgs:`--template-id <id>`,flags:oA,exampleArgs:[`--template-id tpl-xxx`,`--template-id tpl-xxx --output json`],notes:xk,async run(e){let t=Sk(e,Gn(e.flags.templateId)),n=await e.client.requestJson({path:t,method:`GET`});e.settings.quiet?k($(n.templateID)):A(n,T(e.settings.output))}}),vA=w({description:{"en-US":`Update a Sandbox template`,"zh-CN":`更新 Sandbox 模版`},auth:`apiKey`,usageArgs:`--template-id <id> (--body <json|@path> | [fields])`,flags:iA,exampleArgs:[`--template-id tpl-xxx --image all-in-one`,`--template-id tpl-xxx --cpu-count 4 --memory-mb 8192`,`--template-id tpl-xxx --body @template-update.json --async --output json`,`--template-id tpl-xxx --description updated --dry-run --output json`],notes:[...xk,...pk,{"en-US":`--image overrides body fromImage/imageName; explicit --from-image/--image-name override the corresponding preset fields. Without --image, image behavior is unchanged.`,"zh-CN":`--image 覆盖 body 中的 fromImage/imageName;显式 --from-image/--image-name 再覆盖对应预设字段。不传 --image 时保持原有镜像行为。`},{"en-US":`Supplying envConfig or --env replaces the template's complete environment map.`,"zh-CN":`传入 envConfig 或 --env 会整体替换模版的环境变量 Map。`},{"en-US":`Use sandbox file upload for local mount files. In --body mntConfig[], set originFileId to the available file's id and supply mountPath; upload and template must use the same workspace.`,"zh-CN":`本地挂载文件先通过 sandbox file upload 上传。在 --body 的 mntConfig[] 中,将 originFileId 设为可用文件的 id 并传入 mountPath;上传和模版须位于同一工作空间。`},{"en-US":`By default the command waits for build status ready; --async returns the submitted build immediately.`,"zh-CN":`默认等待构建状态变为 ready;--async 会立即返回已提交的构建信息。`}],validate:pA,async run(e){let t=T(e.settings.output),n=Sk(e,Gn(e.flags.templateId)),r=await dA(e.flags);if(e.settings.dryRun){A({method:`PUT`,endpoint:n,request:Pk(r)},t);return}await mA({response:await e.client.requestJson({path:n,method:`PUT`,body:r}),endpoint:n,client:e.client,settings:e.settings,async:e.flags.async,pollInterval:e.flags.pollInterval})}}),yA=w({description:{"en-US":`Get Sandbox template build status`,"zh-CN":`获取 Sandbox 模版构建状态`},auth:`apiKey`,usageArgs:`--template-id <id> --build-id <id>`,flags:sA,exampleArgs:[`--template-id tpl-xxx --build-id build-xxx`,`--template-id tpl-xxx --build-id build-xxx --output json`],notes:xk,async run(e){let t=Sk(e,Wn(e.flags.templateId,e.flags.buildId)),n=await e.client.requestJson({path:t,method:`GET`});e.settings.quiet?k($(n.status)):A(n,T(e.settings.output))}}),bA=w({description:{"en-US":`Delete a Sandbox template`,"zh-CN":`删除 Sandbox 模版`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the Sandbox template and cannot be undone.`,"zh-CN":`该操作会永久删除 Sandbox 模版,且无法撤销。`}},usageArgs:`--template-id <id>`,flags:oA,exampleArgs:[`--template-id tpl-xxx --dry-run`,`--template-id tpl-xxx --yes`],notes:[...xk,{"en-US":`The server rejects deletion while running or paused instances still use the template.`,"zh-CN":`仍有运行中或已暂停实例使用该模版时,服务端会拒绝删除。`}],async run(e){let t=T(e.settings.output),n=Sk(e,Gn(e.flags.templateId));if(e.settings.dryRun){A({method:`DELETE`,endpoint:n,request:null},t);return}await(await e.client.request({path:n,method:`DELETE`})).body?.cancel(),e.settings.quiet?k(e.flags.templateId):A({templateID:e.flags.templateId,deleted:!0},t)}});var xA=w({description:{"en-US":`Declare and create a Memory Store through scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建记忆库`},auth:`apiKey`,flags:{name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Memory Store display name; generates a YAML key`,"zh-CN":`Memory Store 显示名称;自动生成 YAML key`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Store description (default: empty)`,"zh-CN":`记忆库描述(默认:空)`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},entry:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`Initial entry JSON with key and content (repeatable)`,"zh-CN":`含 key、content 的初始化条目 JSON(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}},usageArgs:`--name <name> [--description <text>] [--metadata <key=value>...] [--entry <json|@path>...] [--file <path>] [--yes]`,exampleArgs:[`--name Notes`,{"en-US":`--name Notes --entry '{"key":"notes.md","content":"Initial notes"}' --dry-run`,"zh-CN":`--name Notes --entry '{"key":"notes.md","content":"初始笔记"}' --dry-run`}],notes:[...K,...Xw,{"en-US":`Store lifecycle is managed by agents.yaml. Entries initialize new stores; existing content is preserved unless entries_mode: sync is explicitly configured.`,"zh-CN":`记忆库生命周期由 agents.yaml 管理。entries 仅初始化新库;只有显式配置 entries_mode: sync 才持续同步已有正文。`}],validate:e=>e.name.trim()?void 0:`--name must not be empty. / --name 不能为空。`,async run(e){let t=(await aT(e.flags.entry,`entry`)).map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`Each --entry must be a JSON object. / 每个 --entry 必须为 JSON 对象。`,f.USAGE);let t=e;if(typeof t.key!=`string`||!t.key.trim()||typeof t.content!=`string`)throw new n(`Each --entry requires a non-empty key and string content. / 每个 --entry 必须包含非空 key 和字符串 content。`,f.USAGE);return{key:t.key,content:t.content}}),r=await eT(e,e.flags.file??`agents.yaml`),i={name:e.flags.name.trim(),description:e.flags.description??``,provider:r.provider,metadata:iT(e.flags.metadata),...t.length?{entries:t}:{}},a=await tT({project:r,group:`memory_stores`,rawDeclaration:i});await nT({host:e,project:r,group:`memory_stores`,resourceType:`memory_store`,displayName:e.flags.name.trim(),rawDeclaration:i,resolvedDeclaration:a,existingDeclarations:r.config.memory_stores??{},effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`memory-store`,yes:e.flags.yes})}});const SA={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID; optional with a configured Base URL`,"zh-CN":`Workspace ID;已配置 Base URL 时可省略`}}},CA={...SA,storeId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote Memory Store ID`,"zh-CN":`远端记忆库 ID`}}},wA={...CA,memoryId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote Memory ID`,"zh-CN":`远端记忆条目 ID`}}},TA={...CA,versionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote Memory Version ID`,"zh-CN":`远端记忆版本 ID`}}},EA={limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size (1–100)`,"zh-CN":`单页数量(1–100)`}},page:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Opaque next_page cursor from the previous response`,"zh-CN":`上次响应中的不透明 next_page 游标`}}},DA={view:{type:`string`,valueHint:`<basic|full>`,choices:[`basic`,`full`],description:{"en-US":`Response view (basic or full)`,"zh-CN":`响应视图(basic 或 full)`}}},OA={content:{type:`string`,valueHint:`<text>`,description:{"en-US":`Memory content; an empty string is allowed`,"zh-CN":`记忆正文;允许空字符串`}},contentFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read UTF-8 content from a local file; exclusive with --content`,"zh-CN":`从本地文件读取 UTF-8 正文;与 --content 互斥`}}},kA={path:{type:`string`,valueHint:`<path>`,description:{"en-US":`Memory file path`,"zh-CN":`记忆文件路径`}}},AA={expectedContentSha256:{type:`string`,valueHint:`<sha256>`,description:{"en-US":`Expected current SHA-256; reject a concurrent content change`,"zh-CN":`预期当前 SHA-256;并发内容变化时拒绝更新`}}},jA=[{"en-US":`Calls the SDK with the CLI API Key and workspace settings; no agents.yaml or State is required for reading stores or managing their contents.`,"zh-CN":`使用 CLI API Key 和工作空间配置调用 SDK;查询记忆库和管理正文无需 agents.yaml 或 State。`},{"en-US":`Store lifecycle remains in agents.yaml. Pass the remote Store ID to these API commands and pass next_page back unchanged.`,"zh-CN":`记忆库生命周期仍由 agents.yaml 管理。这些 API 命令使用远端 Store ID;next_page 游标保持原样传回。`}],MA={level:`high`,message:{"en-US":`This changes persistent memory content. Review the dry-run request before confirming.`,"zh-CN":`该操作会修改持久化记忆正文。请先核对 dry-run 请求,再确认执行。`}};function NA(e,t=100){for(let[t,n]of Object.entries({"workspace-id":e.workspaceId,"store-id":e.storeId,"memory-id":e.memoryId,"version-id":e.versionId,page:e.page,path:e.path,"content-file":e.contentFile}))if(n!==void 0&&!n.trim())return`--${t} must not be empty. / --${t} 不能为空。`;if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>t))return`--limit must be an integer from 1 to ${t}. / --limit 必须为 1–${t} 的整数。`;if(e.depth!==void 0&&(!Number.isInteger(e.depth)||e.depth<0))return`--depth must be a non-negative integer. / --depth 必须为非负整数。`;if(e.content!==void 0&&e.contentFile!==void 0)return`--content and --content-file are mutually exclusive. / --content 与 --content-file 互斥。`;if(e.expectedContentSha256!==void 0&&!/^[a-fA-F0-9]{64}$/.test(e.expectedContentSha256))return`--expected-content-sha256 requires 64 hexadecimal characters. / --expected-content-sha256 必须为 64 位十六进制字符串。`;for(let t of[e.createdAtGte,e.createdAtLte])if(t!==void 0&&(!t.trim()||!Number.isFinite(Date.parse(t))))return`Created-at filters must be valid timestamps. / created-at 筛选条件必须为有效时间戳。`;if(e.createdAtGte&&e.createdAtLte&&Date.parse(e.createdAtGte)>Date.parse(e.createdAtLte))return`--created-at-gte must not be after --created-at-lte. / --created-at-gte 不能晚于 --created-at-lte。`}async function PA(e){return e.contentFile===void 0?e.content:Ui(e.contentFile,`utf8`)}async function FA(e,t,n,r){let i=T(e.settings.output),a=e.settings.dryRun?{operation:t,provider:`bailian`,base_url:vO(e),...n}:await J(()=>Y(()=>r(yO(e))));i===`json`?A(a,i):k(JSON.stringify(a,null,2))}const IA=w({description:{"en-US":`List Memory Stores`,"zh-CN":`列出记忆库`},auth:`apiKey`,flags:{...SA,...EA,includeArchived:{type:`switch`,description:{"en-US":`Include archived stores`,"zh-CN":`包含已归档记忆库`}}},usageArgs:`[--workspace-id <id>] [--limit <n>] [--page <cursor>] [--include-archived]`,exampleArgs:[`--workspace-id ws-example --output json`],notes:jA,validate:NA,async run(e){let t={limit:e.flags.limit,page:e.flags.page,include_archived:e.flags.includeArchived};await FA(e,`memory-store.list`,{options:t},e=>za(e.providers,`bailian`,t))}}),LA=w({description:{"en-US":`Get a Memory Store`,"zh-CN":`获取记忆库`},auth:`apiKey`,flags:CA,usageArgs:`--store-id <id> [--workspace-id <id>]`,exampleArgs:[`--workspace-id ws-example --store-id memstore_example`],notes:jA,validate:NA,async run(e){await FA(e,`memory-store.get`,{store_id:e.flags.storeId},t=>Ta(t.providers,`bailian`,e.flags.storeId))}}),RA=w({description:{"en-US":`Create a memory file`,"zh-CN":`创建记忆文件`},auth:`apiKey`,risk:MA,flags:{...CA,...OA,path:{...kA.path,required:!0}},usageArgs:`--store-id <id> --path <path> (--content <text> | --content-file <path>)`,exampleArgs:[`--store-id memstore_example --path notes.md --content-file ./notes.md --dry-run`],notes:jA,validate:e=>NA(e)??(e.content===void 0&&e.contentFile===void 0?`Pass --content or --content-file. / 请提供 --content 或 --content-file。`:void 0),async run(e){let t={path:e.flags.path,content:await PA(e.flags)};await FA(e,`memory-store.memories.create`,{store_id:e.flags.storeId,request:t},n=>sa(n.providers,`bailian`,e.flags.storeId,t))}}),zA=w({description:{"en-US":`List memory files and prefixes`,"zh-CN":`列出记忆文件和目录前缀`},auth:`apiKey`,flags:{...CA,...EA,limit:{...EA.limit,description:{"en-US":`Page size (1–20)`,"zh-CN":`单页数量(1–20)`}},...DA,pathPrefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filter by memory path prefix`,"zh-CN":`按记忆路径前缀筛选`}},depth:{type:`number`,valueHint:`<n>`,description:{"en-US":`Directory listing depth`,"zh-CN":`目录列举深度`}}},usageArgs:`--store-id <id> [--page <cursor>] [--limit <n>] [--path-prefix <prefix>] [--depth <n>] [--view <basic|full>]`,exampleArgs:[`--store-id memstore_example --path-prefix /notes/ --view full`],notes:jA,validate:e=>NA(e,20),async run(e){let t={limit:e.flags.limit,page:e.flags.page,path_prefix:e.flags.pathPrefix,depth:e.flags.depth,view:e.flags.view};await FA(e,`memory-store.memories.list`,{store_id:e.flags.storeId,options:t},n=>Ra(n.providers,`bailian`,e.flags.storeId,t))}}),BA=w({description:{"en-US":`Get a memory file`,"zh-CN":`获取记忆文件`},auth:`apiKey`,flags:wA,usageArgs:`--store-id <id> --memory-id <id>`,exampleArgs:[`--store-id memstore_example --memory-id mem_example`],notes:jA,validate:NA,async run(e){await FA(e,`memory-store.memories.get`,{store_id:e.flags.storeId,memory_id:e.flags.memoryId},t=>wa(t.providers,`bailian`,e.flags.storeId,e.flags.memoryId))}}),VA=w({description:{"en-US":`Update memory content with an optional SHA-256 precondition`,"zh-CN":`更新记忆正文,可使用 SHA-256 并发前置条件`},auth:`apiKey`,risk:MA,flags:{...wA,...OA,...AA},usageArgs:`--store-id <id> --memory-id <id> (--content <text> | --content-file <path>) [--expected-content-sha256 <sha256>]`,exampleArgs:[`--store-id memstore_example --memory-id mem_example --content-file ./notes.md --dry-run`],notes:jA,validate:e=>NA(e)??(e.content===void 0&&e.contentFile===void 0?`Pass --content or --content-file. / 请提供 --content 或 --content-file。`:void 0),async run(e){let t={content:await PA(e.flags),...e.flags.expectedContentSha256===void 0?{}:{expected_content_sha256:e.flags.expectedContentSha256}};await FA(e,`memory-store.memories.update`,{store_id:e.flags.storeId,memory_id:e.flags.memoryId,request:t},n=>So(n.providers,`bailian`,e.flags.storeId,e.flags.memoryId,t))}}),HA=w({description:{"en-US":`Delete a memory file`,"zh-CN":`删除记忆文件`},auth:`apiKey`,risk:MA,flags:wA,usageArgs:`--store-id <id> --memory-id <id>`,exampleArgs:[`--store-id memstore_example --memory-id mem_example --dry-run`],notes:jA,validate:NA,async run(e){await FA(e,`memory-store.memories.delete`,{store_id:e.flags.storeId,memory_id:e.flags.memoryId},t=>pa(t.providers,`bailian`,e.flags.storeId,e.flags.memoryId))}}),UA=w({description:{"en-US":`List Memory Store versions`,"zh-CN":`列出记忆库版本`},auth:`apiKey`,flags:{...CA,...EA,...DA,memoryId:{...wA.memoryId,required:!1},operation:{type:`string`,valueHint:`<created|modified|deleted>`,choices:[`created`,`modified`,`deleted`],description:{"en-US":`Filter by version operation`,"zh-CN":`按版本操作筛选`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Inclusive creation timestamp lower bound`,"zh-CN":`创建时间下限(含)`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Inclusive creation timestamp upper bound`,"zh-CN":`创建时间上限(含)`}}},usageArgs:`--store-id <id> [--memory-id <id>] [--operation <created|modified|deleted>] [--created-at-gte <timestamp>] [--created-at-lte <timestamp>] [--page <cursor>] [--limit <n>] [--view <basic|full>]`,exampleArgs:[`--store-id memstore_example --operation modified --view full`],notes:jA,validate:NA,async run(e){let t={limit:e.flags.limit,page:e.flags.page,view:e.flags.view,memory_id:e.flags.memoryId,operation:e.flags.operation,"created_at.gte":e.flags.createdAtGte,"created_at.lte":e.flags.createdAtLte};await FA(e,`memory-store.versions.list`,{store_id:e.flags.storeId,options:t},n=>Ba(n.providers,`bailian`,e.flags.storeId,t))}}),WA=w({description:{"en-US":`Get a memory version`,"zh-CN":`获取记忆版本`},auth:`apiKey`,flags:TA,usageArgs:`--store-id <id> --version-id <id>`,exampleArgs:[`--store-id memstore_example --version-id memver_example`],notes:jA,validate:NA,async run(e){await FA(e,`memory-store.versions.get`,{store_id:e.flags.storeId,version_id:e.flags.versionId},t=>Ea(t.providers,`bailian`,e.flags.storeId,e.flags.versionId))}}),GA=w({description:{"en-US":`Permanently redact a memory version's content`,"zh-CN":`永久擦除记忆版本正文`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently redacts the selected version's content and cannot be undone.`,"zh-CN":`该操作将永久擦除指定版本正文,无法撤销。`}},flags:TA,usageArgs:`--store-id <id> --version-id <id>`,exampleArgs:[`--store-id memstore_example --version-id memver_example --dry-run`],notes:jA,validate:NA,async run(e){await FA(e,`memory-store.versions.redact`,{store_id:e.flags.storeId,version_id:e.flags.versionId},t=>oo(t.providers,`bailian`,e.flags.storeId,e.flags.versionId))}});export{h_ as advisorRecommend,bb as alertCreate,wb as alertDelete,Db as alertDisable,Tb as alertEnable,Ab as alertHistory,vb as alertList,ab as alertMetrics,db as alertTemplateCreate,hb as alertTemplateDelete,cb as alertTemplateList,pb as alertTemplateUpdate,Sb as alertUpdate,rf as appCall,of as appList,Ss as authGenerateAccessToken,ys as authLogin,xs as authLogout,bs as authStatus,Xd as configAgent,Rc as configList,Lc as configSet,Ic as configShow,_d as configUi,zc as configUse,mh as consoleCall,Ub as datasetDelete,Hb as datasetGet,Vb as datasetList,Bb as datasetUpload,Wb as datasetValidate,Cc as decisionPredict,SS as deployAudioCreate,AS as deployCapacityCreate,IS as deployCapacityDelete,OS as deployCapacityGet,DS as deployCapacityList,PS as deployCapacityRenew,MS as deployCapacityScale,LS as deployCapacityUnsubscribe,GS as deployDelete,TS as deployGet,CS as deployImageCreate,wS as deployList,BS as deployModels,zS as deployOperationGet,iS as deployOperationWait,RS as deployOverflow,KS as deployPause,qS as deployResume,US as deployScale,xS as deployTextCreate,WS as deployUpdate,ph as fileUpload,ax as finetuneAudioCreate,px as finetuneCancel,Ox as finetuneCapability,yx as finetuneCheckpoints,Kx as finetuneCompressCancel,zx as finetuneCompressCreate,qx as finetuneCompressDelete,Vx as finetuneCompressGet,Bx as finetuneCompressList,Gx as finetuneCompressLogs,Mx as finetuneCompressTemplates,Ux as finetuneCompressWatch,mx as finetuneDelete,bx as finetuneExport,fx as finetuneGet,ox as finetuneImageCreate,lx as finetuneList,vx as finetuneLogs,jx as finetunePrice,ix as finetuneTextCreate,cx as finetuneVideoCreate,Tx as finetuneWatch,Ys as imageEdit,Ws as imageGenerate,$p as knowledgeCategoryAdd,tm as knowledgeCategoryDelete,Zp as knowledgeCategoryList,Nf as knowledgeChat,Rp as knowledgeChunkAdd,Kp as knowledgeChunkDelete,Bp as knowledgeChunkList,Up as knowledgeChunkUpdate,lm as knowledgeCollectionCreate,dm as knowledgeCollectionGet,up as knowledgeDocDelete,pm as knowledgeDocImportOss,Hf as knowledgeDocList,Gf as knowledgeDocStatus,fp as knowledgeDocTag,tp as knowledgeDocUpload,sm as knowledgeFileDelete,am as knowledgeFileGet,rm as knowledgeFileList,ip as knowledgeKbCreate,cp as knowledgeKbDelete,Bf as knowledgeKbInfo,Ff as knowledgeKbList,Yp as knowledgeKbStats,op as knowledgeKbUpdate,mf as knowledgeRetrieve,Df as knowledgeSearch,Fp as knowledgeServiceCopy,xp as knowledgeServiceCreate,Np as knowledgeServiceDelete,jp as knowledgeServiceDeploy,yp as knowledgeServiceGet,gp as knowledgeServiceList,kp as knowledgeServiceUpdate,Oy as logAuditCount,Ay as logAuditDisable,ky as logAuditEnable,Ey as logAuditGet,Ty as logAuditList,Ly as logInferenceCount,zy as logInferenceDisable,Ry as logInferenceEnable,Fy as logInferenceGet,Ny as logInferenceList,Cy as logStatus,Ky as logTraceGet,Uy as logTraceList,Jy as logTraceStats,mE as managedAgentAgentCreate,IE as managedAgentAgentGet,LE as managedAgentAgentList,RE as managedAgentAgentSearch,zE as managedAgentAgentVersions,nw as managedAgentApply,EE as managedAgentDeploymentCreate,gD as managedAgentDeploymentGet,_D as managedAgentDeploymentList,yD as managedAgentDeploymentPause,bD as managedAgentDeploymentRun,xD as managedAgentDeploymentRunsGet,SD as managedAgentDeploymentRunsList,CD as managedAgentDeploymentSearch,wD as managedAgentDeploymentUnpause,rw as managedAgentDestroy,gE as managedAgentEnvironmentCreate,WE as managedAgentEnvironmentGet,GE as managedAgentEnvironmentList,KE as managedAgentEnvironmentSearch,_O as managedAgentFileDelete,gO as managedAgentFileDownload,mO as managedAgentFileGet,pO as managedAgentFileList,hO as managedAgentFileSearch,fO as managedAgentFileUpload,kC as managedAgentInit,RA as managedAgentMemoryCreate,HA as managedAgentMemoryDelete,BA as managedAgentMemoryGet,zA as managedAgentMemoryList,xA as managedAgentMemoryStoreCreate,LA as managedAgentMemoryStoreGet,IA as managedAgentMemoryStoreList,VA as managedAgentMemoryUpdate,WA as managedAgentMemoryVersionGet,UA as managedAgentMemoryVersionList,GA as managedAgentMemoryVersionRedact,tw as managedAgentPlan,Tw as managedAgentPlayground,kw as managedAgentProjectBuild,Dw as managedAgentProjectInit,Aw as managedAgentProjectPublish,Ow as managedAgentProjectValidate,Nw as managedAgentProjectVersionDisable,Mw as managedAgentProjectVersionEnable,Iw as managedAgentProjectVersionList,Rw as managedAgentProjectVersionPreview,zw as managedAgentProjectVersionRestore,Fw as managedAgentProjectVersionStatus,jw as managedAgentProjectWorkbench,ND as managedAgentSessionArchive,vT as managedAgentSessionCreate,tO as managedAgentSessionDebug,jT as managedAgentSessionDelete,GT as managedAgentSessionEventList,GT as managedAgentSessionEvents,KT as managedAgentSessionEventSend,qT as managedAgentSessionEventStream,nO as managedAgentSessionExport,AT as managedAgentSessionGet,kT as managedAgentSessionList,NT as managedAgentSessionRun,jD as managedAgentSessionSearch,PT as managedAgentSessionSend,MD as managedAgentSessionUpdate,bE as managedAgentSkillCreate,qE as managedAgentSkillDownload,JE as managedAgentSkillGet,iE as managedAgentSkillList,YE as managedAgentSkillSearch,XE as managedAgentSkillVersions,Kw as managedAgentStateImport,Vw as managedAgentStateList,Uw as managedAgentStateRm,Hw as managedAgentStateShow,QC as managedAgentValidate,xE as managedAgentVaultCreate,SE as managedAgentVaultCredentialCreate,tD as managedAgentVaultGet,nD as managedAgentVaultList,rD as managedAgentVaultSearch,OO as managedAgentWebhookCreate,NO as managedAgentWebhookDelete,FO as managedAgentWebhookDisable,PO as managedAgentWebhookEnable,RO as managedAgentWebhookEvents,jO as managedAgentWebhookGet,kO as managedAgentWebhookList,LO as managedAgentWebhookResetSecret,IO as managedAgentWebhookTest,MO as managedAgentWebhookUpdate,Cm as mcpCall,Em as mcpConnect,km as mcpDisconnect,jm as mcpList,Mm as mcpTools,sf as memoryAdd,df as memoryDelete,lf as memoryList,ff as memoryProfileCreate,pf as memoryProfileGet,cf as memorySearch,uf as memoryUpdate,ev as modelCode,R_ as modelList,K_ as modelSearch,ey as monitorDeliveryDisable,Qv as monitorDeliveryEnable,Kv as monitorDeliveryStatus,Wv as monitorErrors,Bv as monitorMetrics,Nv as monitorModels,kv as monitorOverview,Rb as permissionGrant,Nb as permissionList,zb as permissionRevoke,Yg as pipelineRun,e_ as pipelineValidate,XO as pluginInstall,ZO as pluginLink,QO as pluginList,$O as pluginRemove,Ev as quotaCheck,pv as quotaDelete,yv as quotaHistory,dv as quotaList,fv as quotaUpdate,Xk as sandboxConnect,Kk as sandboxCreate,$k as sandboxDelete,Ik as sandboxFileUpload,Jk as sandboxGet,qk as sandboxList,hk as sandboxOfficialImages,Qk as sandboxPause,Zk as sandboxResume,yA as sandboxTemplateBuildStatus,hA as sandboxTemplateCreate,bA as sandboxTemplateDelete,_A as sandboxTemplateGet,gA as sandboxTemplateList,vA as sandboxTemplateUpdate,Pm as searchWeb,Dh as securityAlerts,wh as securityOverview,rk as skillAdd,uk as skillInit,sk as skillList,ak as skillRemove,ik as skillUpdate,Xm as speechRecognize,Wm as speechSynthesize,ah as speechVocabularyCreate,fh as speechVocabularyDelete,ch as speechVocabularyGet,oh as speechVocabularyList,uh as speechVocabularyUpdate,Fs as textChat,Hs as textOmni,yC as tokenPlanAddMember,hC as tokenPlanAssignSeats,uC as tokenPlanCreateKey,DC as tokenPlanHarnessQuota,aC as tokenPlanListSeats,nf as update,qg as usageCodingPlan,Eg as usageFree,Dg as usageFreetier,jg as usageStats,Mg as usageSummary,Bg as usageTokenPlan,rc as videoDownload,ec as videoEdit,$s as videoGenerate,tc as videoRef,nc as videoTaskGet,sc as visionDescribe,GO as workspaceInit,av as workspaceList};
2878
+ `):e.type===`error`&&process.stderr.write(`\n[error] ${e.content??`unknown error`}\n`)}}function sE(e,t,n={}){if(t)process.stdout.write(`${JSON.stringify({...n,events:zo(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)oE(t);nE(e.terminalStatus,t)}iE(e.terminalStatus,rE(e.result.events))}function cE(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):void 0}const lE={...zT,...$T,file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Agent name (auto-detected when only one agent is configured)`,"zh-CN":`Agent 名称(仅配置一个 Agent 时自动识别)`}},environment:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared environment`,"zh-CN":`覆盖 Agent 声明的环境`}},vault:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared vault`,"zh-CN":`覆盖 Agent 声明的 Vault`}},memoryStores:{type:`string`,valueHint:`<names>`,description:{"en-US":`Override memory stores with comma-separated YAML keys`,"zh-CN":`使用逗号分隔的 YAML key 覆盖 Memory Store`}},title:{type:`string`,valueHint:`<title>`,description:{"en-US":`Session title`,"zh-CN":`Session 标题`}}};var uE=w({description:{"en-US":`Create a new session for an agent`,"zh-CN":`为 Agent 创建新 Session`},auth:`apiKey`,usageArgs:`[--agent <name>] [--environment <name>] [--title <title>] [--environment_variables <KEY=VALUE>...] [--memory-stores <keys>] [--resource <json|@path>...] [--file <path>]`,flags:lE,exampleArgs:[`--agent assistant --environment_variables LOG_LEVEL=info --environment_variables FEATURE_FLAG=on`,`--agent assistant --resource '{"type":"memory_store","memory_store":"notes","access":"read_only"}'`,``,`--agent assistant`,{"en-US":`--agent assistant --title 'debug run'`,"zh-CN":`--agent assistant --title '调试运行'`}],notes:G,async validate(e){BT(e.environment_variables),await eE(e.resource)},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=BT(n.environment_variables),o=await eE(n.resource);if(t.dryRun){A({would_create_session:{agent:n.agent??`auto`,provider:`bailian`,environment:n.environment,environment_variables:VT(a),vault:n.vault,memory_stores:cE(n.memoryStores),resources:o,title:n.title},config_file:i},r);return}let{agentName:s,session:c}=await q(()=>J(async()=>{let t=await K(e,i);return pa(t,{agent:n.agent,provider:`bailian`,environment:n.environment,environmentVariables:a,vault:n.vault,memoryStores:cE(n.memoryStores),resources:o,title:n.title})}));if(r===`json`){A({agent:s,session:c},r);return}k(`Session created: ${c.id}`),k(` Agent: ${s}`),k(` Environment: ${c.environment_id}`),k(` Status: ${c.status}`),c.vault_ids.length&&k(` Vaults: ${c.vault_ids.join(`, `)}`),c.memory_store_ids.length&&k(` Memory: ${c.memory_store_ids.join(`, `)}`)}});async function dE(e,t,n){let r=await e(n),i=[...r.items],a=r.hasMore,o=r.nextPage;for(;t&&o;){let t=await e(o);i.push(...t.items),a=t.hasMore,o=t.nextPage}return{items:i,hasMore:a,nextPage:o}}const Y={file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},X={limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size (1-100)`,"zh-CN":`单页数量(1-100)`}},page:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Opaque page cursor returned by a previous request`,"zh-CN":`上一次请求返回的不透明分页 Cursor`}},all:{type:`switch`,description:{"en-US":`Fetch all pages by following opaque cursors`,"zh-CN":`跟随不透明 Cursor 获取全部分页`}}},fE={query:{type:`string`,valueHint:`<text>`,required:!0,description:{"en-US":`Case-insensitive text to find in IDs, names, and descriptions`,"zh-CN":`在 ID、名称和描述中进行不区分大小写的文本搜索`}},pageLimit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum pages to scan for client-side search (default: 10)`,"zh-CN":`客户端搜索最多扫描的页数(默认:10)`}}},pE={includeArchived:{type:`switch`,description:{"en-US":`Include archived resources`,"zh-CN":`包含已归档资源`}}};function mE(e){if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>100))return`--limit must be an integer between 1 and 100.`;if(e.pageLimit!==void 0&&(!Number.isInteger(e.pageLimit)||e.pageLimit<1||e.pageLimit>100))return`--page-limit must be an integer between 1 and 100.`}function hE(e){if(!e)return;let t=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t.length>0?t:void 0}function gE(e,...t){let n=e.trim().toLocaleLowerCase();return!n||t.some(e=>e!=null&&(typeof e==`string`?e:JSON.stringify(e)).toLocaleLowerCase().includes(n))}async function _E(e,t,n=10){let r=[],i,a=!1,o,s=0;do{let n=await e(i);s+=1,r.push(...n.items.filter(t)),a=n.hasMore,o=n.nextPage,i=n.nextPage}while(a&&i&&s<n);return{items:r,hasMore:a,nextPage:o,scannedPages:s,truncated:!!(a&&o)}}function vE(e){let{format:t,key:n,items:r,headers:i,rows:a,hasMore:o=!1,nextPage:s,truncated:c,scannedPages:l,emptyMessage:u=`No resources found.`}=e;if(t===`json`){A({[n]:r,has_more:o,next_page:s,...c===void 0?{}:{truncated:c},...l===void 0?{}:{scanned_pages:l}},t);return}if(r.length===0){k(u);return}for(let e of Hr(i,a))k(e);k(`\nTotal: ${r.length}`),c?k(`Search stopped at --page-limit; more pages remain.`):o&&k(`More results are available.${s?` Next page: ${s}`:``}`)}function Z(e,t=40){if(e==null||e===``)return`-`;let n=typeof e==`string`?e:JSON.stringify(e);return n.length>t?`${n.slice(0,t-3)}...`:n}const yE={file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by agent name`,"zh-CN":`按 Agent 名称筛选`}},all:{type:`switch`,description:{"en-US":`Fetch all pages by following the cursor`,"zh-CN":`跟随 Cursor 获取全部分页`}},limit:X.limit,page:X.page,statuses:{type:`string`,valueHint:`<statuses>`,description:{"en-US":`Comma-separated session statuses`,"zh-CN":`Session 状态,多个以逗号分隔`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this RFC 3339 timestamp`,"zh-CN":`创建时间不早于该 RFC 3339 时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this RFC 3339 timestamp`,"zh-CN":`创建时间不晚于该 RFC 3339 时间戳`}}};var bE=w({description:{"en-US":`List sessions from the provider`,"zh-CN":`列出 Provider 中的 Session`},auth:`apiKey`,usageArgs:`[--agent <name>] [--statuses <statuses>] [--limit <n>] [--page <cursor>] [--all]`,flags:yE,exampleArgs:[``,`--agent assistant`,`--all`],notes:G,validate:mE,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,{items:a,hasMore:o,nextPage:s}=await q(()=>J(async()=>{let t=await K(e,i);return dE(async e=>{let r=await no(t,{agent:n.agent,provider:`bailian`,filter:{page:e,limit:n.limit,statuses:hE(n.statuses),created_at_gte:n.createdAtGte,created_at_lte:n.createdAtLte}});return{items:r.summaries,hasMore:r.hasMore,nextPage:r.nextPage}},n.all,n.page)})),c=a.map(e=>e.session);if(r===`json`){A({sessions:c,has_more:o,next_page:s},r);return}if(c.length===0){k(`No sessions found.`);return}let l=new Map(a.filter(e=>e.agentName).map(e=>[e.session.id,e.agentName])),u=[`ID`,`TITLE`,`AGENT`,`STATUS`,`CREATED`],d=c.map(e=>[e.id,(e.title??``).slice(0,20),l.get(e.id)??e.agent_id.slice(0,12),e.status,e.created_at]);for(let e of Hr(u,d))k(e);k(`\nTotal: ${c.length}`),o&&k(`More sessions available. Use --all to fetch all.`)}}),xE=w({description:{"en-US":`Get details of a session`,"zh-CN":`获取 Session 详情`},auth:`apiKey`,usageArgs:`--session-id <id> [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID (required)`,"zh-CN":`Session ID(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--session-id sess_abc123`],notes:G,async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=await q(()=>J(async()=>{let t=await K(e,i);return La(t,n.sessionId,`bailian`)}));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}`)}}),SE=w({description:{"en-US":`Delete a session`,"zh-CN":`删除 Session`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This deletes the specified remote managed Agent Session.`,"zh-CN":`该操作会删除指定的远端托管 Agent Session。`}},usageArgs:`--session-id <id> [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID (required)`,"zh-CN":`Session ID(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}},exampleArgs:[`--session-id sess_abc123 --yes`],notes:G,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:`bailian`,config_file:i},r);return}await q(()=>J(async()=>{let t=await K(e,i);await va(t,n.sessionId,`bailian`)})),r===`json`?A({deleted:n.sessionId},r):k(`Session ${n.sessionId} deleted.`)}});const CE={...zT,...$T,prompt:{type:`string`,valueHint:`<text>`,description:{"en-US":`Prompt to send (required)`,"zh-CN":`要发送的 Prompt(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Agent name (auto-detected when only one agent is configured)`,"zh-CN":`Agent 名称(仅配置一个 Agent 时自动识别)`}},environment:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared environment`,"zh-CN":`覆盖 Agent 声明的环境`}},vault:{type:`string`,valueHint:`<name>`,description:{"en-US":`Override agent's declared vault`,"zh-CN":`覆盖 Agent 声明的 Vault`}},memoryStores:{type:`string`,valueHint:`<names>`,description:{"en-US":`Override memory stores with comma-separated YAML keys`,"zh-CN":`使用逗号分隔的 YAML key 覆盖 Memory Store`}},title:{type:`string`,valueHint:`<title>`,description:{"en-US":`Session title`,"zh-CN":`Session 标题`}},noStream:{type:`switch`,description:{"en-US":`Use polling instead of SSE streaming`,"zh-CN":`使用轮询代替 SSE 流式传输`}}};var wE=w({description:{"en-US":`Create a session, send a message, and stream the response`,"zh-CN":`创建 Session、发送消息并流式输出响应`},auth:`apiKey`,usageArgs:`--prompt <text> [--agent <name>] [--no-stream] [--environment_variables <KEY=VALUE>...] [--memory-stores <keys>] [--resource <json|@path>...] [--file <path>]`,flags:CE,exampleArgs:[{"en-US":`--agent assistant --environment_variables LOG_LEVEL=info --prompt "hello"`,"zh-CN":`--agent assistant --environment_variables LOG_LEVEL=info --prompt "你好"`},{"en-US":`--agent assistant --resource '{"type":"memory_store","memory_store":"notes","access":"read_only"}' --prompt "hello"`,"zh-CN":`--agent assistant --resource '{"type":"memory_store","memory_store":"notes","access":"read_only"}' --prompt "你好"`},{"en-US":`--prompt "hello"`,"zh-CN":`--prompt "你好"`},{"en-US":`--agent assistant --prompt "summarize this repo"`,"zh-CN":`--agent assistant --prompt "总结这个代码仓库"`}],notes:[...G,{"en-US":"--output json emits one envelope: { session_id, provider, agent, events } — read session_id to chain `session send/get/events/delete`.","zh-CN":"--output json 输出一个 Envelope:{ session_id, provider, agent, events }。读取 session_id 后可串联调用 `session send/get/events/delete`。"}],async validate(e){BT(e.environment_variables),await eE(e.resource)},async run(e){let{settings:t,flags:n}=e,r=T(t.output),i=n.file??`agents.yaml`,a=BT(n.environment_variables),o=await eE(n.resource),s=r===`json`,c={agent:n.agent,provider:`bailian`,environment:n.environment,environmentVariables:a,vault:n.vault,memoryStores:cE(n.memoryStores),resources:o,title:n.title};if(t.dryRun){A({would_run:{prompt:n.prompt,agent:n.agent??`auto`,provider:`bailian`,environment:n.environment,environment_variables:VT(a),vault:n.vault,memory_stores:c.memoryStores,resources:o,title:n.title,mode:n.noStream?`polling`:`streaming`},config_file:i},r);return}await q(()=>J(async()=>{let t=await K(e,i);if(n.noStream){let e=await xo(t,n.prompt,c);s||process.stderr.write(`Session created: ${e.session.id}\n`),sE(e,s,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}else{let e=await bo(t,n.prompt,c);s||process.stderr.write(`Session created: ${e.session.id}\n`),await aE(e.events,s,{session_id:e.session.id,provider:e.provider,agent:e.agentName})}}))}}),TE=w({description:{"en-US":`Send a message to an existing session and stream the response`,"zh-CN":`向已有 Session 发送消息并流式输出响应`},auth:`apiKey`,usageArgs:`--session-id <id> --message <text> [--no-stream] [--file <path>]`,flags:{sessionId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Session ID (required)`,"zh-CN":`Session ID(必填)`},required:!0},message:{type:`string`,valueHint:`<text>`,description:{"en-US":`Message to send (required)`,"zh-CN":`要发送的消息(必填)`},required:!0},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},noStream:{type:`switch`,description:{"en-US":`Use polling instead of SSE streaming`,"zh-CN":`使用轮询代替 SSE 流式传输`}}},exampleArgs:[{"en-US":`--session-id sess_abc123 --message "continue"`,"zh-CN":`--session-id sess_abc123 --message "继续"`}],notes:G,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:`bailian`,mode:n.noStream?`polling`:`streaming`},config_file:i},r);return}await q(()=>J(async()=>{let t=await K(e,i);n.noStream?sE(await _o(t,n.sessionId,n.message,{provider:`bailian`}),a,{session_id:n.sessionId}):await aE(await vo(t,n.sessionId,n.message,{provider:`bailian`}),a,{session_id:n.sessionId})}))}});async function EE(e){return new Uint8Array(await Ki(P(e)))}async function DE(e){let t=e.startsWith(`@`)?await Ki(P(e.slice(1)),`utf8`):e;try{return JSON.parse(t)}catch(e){let t=e instanceof Error?e.message:String(e);throw new n(`Invalid JSON input: ${t}`,f.USAGE)}}async function OE(e,t,r=!1){let i=P(e),a=ji(i);await Gi(a,{recursive:!0});let o=`${i}.${ai()}.tmp`;await Xi(o,t,{flag:`wx`});try{if(r)await qi(o,i);else{try{await Wi(o,i)}catch(e){throw e.code===`EEXIST`?new n(`Output file already exists: ${i}`,f.USAGE,`Choose another --output-file path or re-run with --force.`):e}await Yi(o)}return i}catch(e){throw await Yi(o).catch(()=>void 0),e}}function kE(e){let t=Ai(e).toLocaleLowerCase();return t.endsWith(`.json`)?`application/json`:t.endsWith(`.md`)?`text/markdown`:t.endsWith(`.txt`)?`text/plain`:t.endsWith(`.pdf`)?`application/pdf`:t.endsWith(`.png`)?`image/png`:t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)?`image/jpeg`:t.endsWith(`.zip`)?`application/zip`:`application/octet-stream`}const AE={sessionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Session ID`,"zh-CN":`Session ID`}}},jE={...Y,...AE,...X,order:{type:`string`,valueHint:`<order>`,choices:[`asc`,`desc`],description:{"en-US":`Event order: asc or desc`,"zh-CN":`事件顺序:asc 或 desc`}},types:{type:`string`,valueHint:`<types>`,description:{"en-US":`Comma-separated raw event types`,"zh-CN":`原始事件类型,多个以逗号分隔`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this timestamp`,"zh-CN":`创建时间不早于该时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this timestamp`,"zh-CN":`创建时间不晚于该时间戳`}}},ME={...Y,...AE,event:{type:`string`,valueHint:`<json|@path>`,required:!0,description:{"en-US":`Raw event object/array as JSON or @event.json`,"zh-CN":`原始事件对象/数组 JSON,或 @event.json`}}},NE={...Y,...AE,afterId:{type:`string`,valueHint:`<event-id>`,description:{"en-US":`Resume after this event ID`,"zh-CN":`从该 Event ID 之后继续`}}};function PE(e){return e.map(e=>[Z(e.id),e.raw_type,Z(e.session_thread_id),Z(e.content??e.status??e.tool_name,70)])}function FE(e){let t=Array.isArray(e)?e:[e];if(t.length===0||t.some(e=>!e||typeof e!=`object`||Array.isArray(e)))throw new n(`Event input must be a JSON object or a non-empty array of objects.`,f.USAGE);for(let[e,r]of t.entries()){let t=ra.safeParse(r);if(t.success)continue;let i=t.error.issues[0],a=i?.path.length?` at ${i.path.join(`.`)}`:``;throw new n(`Invalid event at index ${e}${a}: ${i?.message??`does not match the Session event schema`}.`,f.USAGE)}return t}const IE=w({description:{"en-US":`List events for a Managed Agent session`,"zh-CN":`列出托管 Agent Session 事件`},auth:`apiKey`,usageArgs:`--session-id <id> [--types <types>] [--order asc|desc] [--limit <n>] [--page <cursor>] [--all]`,flags:jE,exampleArgs:[`--session-id sess_abc`,`--session-id sess_abc --all --output json`],notes:[...G,{"en-US":`--types is applied client-side to each page returned by the provider.`,"zh-CN":`--types 会在客户端对 Provider 返回的每一页结果进行过滤。`}],validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await to(t,e.flags.sessionId,{provider:`bailian`,limit:e.flags.limit,page_token:n,order:e.flags.order,types:hE(e.flags.types),created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte});return{items:r.events,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`events`,items:zo(n.items),headers:[`ID`,`TYPE`,`THREAD`,`CONTENT`],rows:PE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No events found.`})}}),LE=w({description:{"en-US":`Send raw events to a Managed Agent session`,"zh-CN":`向托管 Agent Session 发送原始事件`},auth:`apiKey`,usageArgs:`--session-id <id> --event <json|@path>`,flags:ME,exampleArgs:[`--session-id sess_abc --event '{"type":"message","role":"user","content":[{"type":"text","text":"hello"}]}'`,`--session-id sess_abc --event @event.json`],notes:G,async run(e){let t=T(e.settings.output),n=FE(await DE(e.flags.event));if(e.settings.dryRun){A({would_send_events:n,session_id:e.flags.sessionId},t);return}let r=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return go(t,e.flags.sessionId,n,{provider:`bailian`})}));t===`json`?A({session_id:e.flags.sessionId,...r},t):k(`Sent ${n.length} event(s): ${r.event_ids.join(`, `)}`)}}),RE=w({description:{"en-US":`Stream events from a Managed Agent session`,"zh-CN":`流式读取托管 Agent Session 事件`},auth:`apiKey`,usageArgs:`--session-id <id> [--after-id <event-id>]`,flags:NE,exampleArgs:[`--session-id sess_abc`,`--session-id sess_abc --after-id evt_123 --output json`],notes:[...G,{"en-US":`When the provider has no native event cursor, --after-id resumes through paginated history polling and event ID de-duplication.`,"zh-CN":`当 Provider 不支持原生事件 Cursor 时,--after-id 会通过分页历史轮询和 Event ID 去重实现续传。`}],async run(e){let t=T(e.settings.output);await q(()=>J(async()=>{let n=await K(e,e.flags.file??`agents.yaml`),r=[];for await(let i of So(n,e.flags.sessionId,{provider:`bailian`,after_id:e.flags.afterId}))if(r.push(i),t!==`json`&&k(JSON.stringify(zo([i])[0])),i.type===`status`&&Ba(i.status))break;t===`json`&&A({session_id:e.flags.sessionId,events:zo(r)},t)}))}}),zE={source:{type:`string`,valueHint:`<source>`,choices:[`custom`,`official`,`all`],description:{"en-US":`Skill catalog: custom (default), official, or all`,"zh-CN":`Skill Catalog:custom(默认)、official 或 all`}}},BE={...Y,...X,...zE},VE={...Y,limit:X.limit,...fE,...zE},HE={...Y,skillId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Skill ID`,"zh-CN":`Skill ID`}}},UE={...HE,...X},WE={...HE,skillVersion:{type:`string`,valueHint:`<version>`,required:!0,description:{"en-US":`Skill version`,"zh-CN":`Skill 版本`}},outputFile:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Destination ZIP path`,"zh-CN":`目标 ZIP 路径`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing output file`,"zh-CN":`覆盖已存在的输出文件`}}};function GE(e){return e.map(e=>[e.id,Z(e.name),e.source,e.status,Z(e.latest_version),Z(e.updated_at??e.created_at)])}function KE(e){return e.map(e=>[Z(e.version),Z(e.name),Z(e.type),Z(e.status),Z(e.updated_at??e.created_at)])}function qE(e,t){return{source:e,skills:t.items,has_more:t.hasMore,next_page:t.nextPage}}async function JE(e,t,n){return dE(async r=>{let i=await Za(e,{provider:`bailian`,source:t,limit:n.limit,page:r});return{items:i.data,hasMore:i.has_more,nextPage:i.next_page}},n.all,n.page)}var YE=w({description:{"en-US":`List Managed Agent skills`,"zh-CN":`列出托管 Agent Skill`},auth:`apiKey`,usageArgs:`[--source custom|official|all] [--limit <n>] [--page <cursor>] [--all]`,flags:BE,exampleArgs:[``,`--source official`,`--source all --all --output json`],notes:[...G,{"en-US":`--source all combines one page from each catalog, or every page with --all; it does not accept --page.`,"zh-CN":`--source all 默认合并两个 Catalog 的各一页,传入 --all 时获取全部分页;该模式不接受 --page。`}],validate:e=>mE(e)??(e.source===`all`&&e.page?`--source all cannot be combined with --page.`:void 0),async run(e){let t=T(e.settings.output),n=e.flags.source??`custom`,r=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);if(n!==`all`)return JE(t,n,{limit:e.flags.limit,page:e.flags.page,all:e.flags.all});let[r,i]=await Promise.all([JE(t,`custom`,{limit:e.flags.limit,all:e.flags.all}),JE(t,`official`,{limit:e.flags.limit,all:e.flags.all})]);return{items:[...r.items,...i.items],hasMore:r.hasMore||i.hasMore,nextPage:void 0}}));if(t===`json`){A(qE(n,r),t);return}vE({format:t,key:`skills`,items:r.items,headers:[`ID`,`NAME`,`SOURCE`,`STATUS`,`VERSION`,`UPDATED`],rows:GE(r.items),hasMore:r.hasMore,nextPage:r.nextPage,emptyMessage:`No skills found.`})}});const XE={name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Agent display name; the YAML key is generated automatically`,"zh-CN":`远端 Agent 显示名称;YAML key 将自动生成`}},model:{type:`string`,valueHint:`<model>`,required:!0,description:{"en-US":`Model ID`,"zh-CN":`模型 ID`}},instructions:{type:`string`,valueHint:`<text|path>`,required:!0,description:{"en-US":`Inline instructions or a ./, ../, or absolute file path`,"zh-CN":`内联指令,或以 ./、../、/ 开头的文件路径`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Agent description`,"zh-CN":`Agent 描述`}},skill:{type:`array`,valueHint:`<id>`,description:{"en-US":`Existing remote Skill ID (repeatable)`,"zh-CN":`已存在的远端 Skill ID(可重复)`}},skillDir:{type:`array`,valueHint:`<path>`,description:{"en-US":`Local Skill directory or ZIP to declare, upload, and attach through the same scoped create (repeatable)`,"zh-CN":`通过同一次定向创建声明、上传并绑定的本地 Skill 目录或 ZIP(可重复)`}},type:{type:`string`,valueHint:`<custom|official>`,choices:[`custom`,`official`],description:{"en-US":`Type applied to every --skill value (default: custom)`,"zh-CN":`应用于所有 --skill 的类型(默认:custom)`}},tool:{type:`array`,valueHint:`<name>`,description:{"en-US":`Builtin tool name (repeatable)`,"zh-CN":`内置工具名称(可重复)`}},environment:{type:`string`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Environment key from agents.yaml, used as the default Session/Deployment environment`,"zh-CN":`agents.yaml 中已有的 Environment key,作为 Session/Deployment 的默认环境`}},vault:{type:`string`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Vault key from agents.yaml, used as the default Session/Deployment vault`,"zh-CN":`agents.yaml 中已有的 Vault key,作为 Session/Deployment 的默认 Vault`}},mcp:{type:`array`,valueHint:`<server-code>`,description:{"en-US":`MCP market server code; all of its tools are enabled (repeatable)`,"zh-CN":`MCP 市场服务 code,启用其全部工具(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}};function ZE(e){return GT({displayName:e.displayName,provider:e.provider,resourceTypes:[`agent`,`template`],declarations:e.agents,candidate:e.candidate,effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`agent`,state:e.state})}function QE(e){if(e===void 0||e===`custom`)return`custom`;if(e===`official`)return`official`;throw new n(`--type must be either custom or official.`,f.USAGE)}function $E(e,t=`custom`){let r=/* @__PURE__ */ new Set,i=[];for(let a of e??[]){let e=a.trim();if(!e)throw new n(`--skill values must not be empty.`,f.USAGE);r.has(e)||(r.add(e),i.push({type:t,skill_id:e}))}return i}function eD(e){let t=/* @__PURE__ */ new Set,r=[];for(let i of e??[]){let e=i.trim();if(!e)throw new n(`--mcp values must not be empty.`,f.USAGE);t.has(e)||(t.add(e),r.push({serverName:e,serverType:`official`,defaultEnabled:!0}))}return r}function tD(e,t,r,i){if(t!==void 0&&r?.[t]===void 0)throw new n(`${e} '${t}' is not declared in ${i}.`,f.USAGE,`Create the ${e} first with the managed-agent ${e.toLowerCase()} create command, then pass its YAML key.`)}function nD(e){let t=e=>Array.isArray(e)?e.map(t):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>[e,t(n)]));return JSON.stringify(t(e))}function rD(e){let t=new Set(e.state.listResources().filter(t=>t.address.provider===e.provider&&t.address.type===`skill`).map(e=>e.address.name)),r=Object.entries(e.declarations).filter(([t,n])=>(typeof n.name==`string`?n.name:t)===e.displayName),i=r.find(([n,r])=>t.has(n)&&nD(r)===nD(e.candidate));if(i)return{key:i[0],needsCreate:!1,reusedPending:!1,reusedTracked:!0};if(r.find(([e])=>t.has(e)))throw new n(`Skill '${e.displayName}' is already tracked with a different declaration.`,f.USAGE,"Modify its existing YAML declaration and run full `bl managed-agent apply`, or bind its remote ID with --skill.");return{...GT({displayName:e.displayName,provider:e.provider,resourceTypes:[`skill`],declarations:e.declarations,candidate:e.candidate,effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`skill`,state:e.state}),needsCreate:!0,reusedTracked:!1}}async function iD(e,t){let r={...e.config.skills??{}},i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Map;for(let o of t??[]){let t=o.trim();if(!t)throw new n(`--skill-dir values must not be empty.`,f.USAGE);let s=await q(()=>za(t,{basePath:process.cwd()})),c=await Ji(s.sourcePath);if(!(c.isDirectory()||c.isFile()&&Mi(s.sourcePath).toLowerCase()===`.zip`))throw new n(`--skill-dir requires a Skill directory or .zip file: ${t}`,f.USAGE);if(i.has(s.sourcePath))continue;let l=Ni(ji(e.configPath),s.sourcePath).split(Pi).join(`/`)||`.`,u={name:s.name,source:l,origin:`custom`,provider:e.provider},d=await qT({project:e,group:`skills`,rawDeclaration:u}),p=await e.stateBackend.read(e.stateScope,t=>rD({displayName:s.name,provider:e.provider,declarations:r,candidate:d,state:t})),m=a.get(p.key);if(m){i.set(s.sourcePath,m);continue}let h={...p,name:s.name,source:l,rawDeclaration:u,resolvedDeclaration:d};r[p.key]=d,i.set(s.sourcePath,h),a.set(p.key,h)}return[...a.values()]}var aD=w({description:{"en-US":`Declare and create one Managed Agent through an isolated YAML apply`,"zh-CN":`通过隔离的 YAML Apply 声明并创建一个托管 Agent`},auth:`apiKey`,usageArgs:`--name <name> --model <model> --instructions <text|path> [--description <text>] [--skill <id>...] [--type custom|official] [--skill-dir <path>...] [--tool <name>...] [--environment <yaml-key>] [--vault <yaml-key>] [--mcp <server-code>...] [--file <path>] [--yes]`,flags:XE,exampleArgs:[`--name assistant --model qwen3.8-max --instructions "You are helpful."`,`--name assistant --model qwen3.8-max --instructions ./prompts/assistant.md --skill skill_abc --yes`,`--name slides --model qwen3.8-max --instructions ./prompts/slides.md --skill skill_pptx --type official --yes`,`--name reviewer --model qwen3.8-max --instructions ./prompts/reviewer.md --skill-dir ./skills/code-review --yes`,`--name researcher --model qwen3.8-max --instructions ./prompts/researcher.md --environment dev --vault secrets --mcp market-cmgjmcp00074952 --yes`],notes:[...G,{"en-US":`Without --yes, previews the generated YAML key and scoped plan. --dry-run stays offline. Unrelated resources are not refreshed or drift-checked.`,"zh-CN":`不带 --yes 时预览自动生成的 YAML key 和定向计划;--dry-run 完全离线。无关资源不会刷新或检测 Drift。`},{"en-US":`--skill writes an external Skill reference directly into the Agent declaration. --type defaults to custom; use --type official for platform Skills. These Skills are not managed through the top-level skills map.`,"zh-CN":`--skill 会把外部 Skill 引用直接写入 Agent 声明。--type 默认为 custom;平台 Skill 使用 --type official。这些 Skill 不通过顶层 skills 资源管理。`},{"en-US":`--skill-dir accepts a local Skill directory or ZIP, writes it as a top-level custom Skill declaration, and writes its generated YAML key into the Agent skills list. Skill and Agent are created together in dependency order. --type applies only to --skill IDs.`,"zh-CN":`--skill-dir 接收本地 Skill 目录或 ZIP,将其写为顶层 custom Skill 声明,并把生成的 YAML key 写入 Agent 的 skills 列表;Skill 与 Agent 按依赖顺序一并创建。--type 只作用于 --skill ID。`},{"en-US":`--environment and --vault write existing YAML keys into the Agent declaration as default runtime bindings; they are not sent to the Agent API. session create|run and deployment create use them unless those commands pass their own. The referenced Environment and Vault must already be created.`,"zh-CN":`--environment 与 --vault 把已有的 YAML key 写入 Agent 声明,作为默认运行时绑定,不会发送给 Agent API;session create|run 与 deployment create 未显式传入时使用它们。引用的 Environment 与 Vault 必须已创建。`},{"en-US":`--mcp accepts MCP market server codes (see mcp list) and enables all of their tools. To toggle individual tools, edit tools.mcp in YAML and run a full apply.`,"zh-CN":`--mcp 接收 MCP 市场服务 code(见 mcp list),并启用其全部工具;如需按工具开关,修改 YAML 中的 tools.mcp 后执行全量 apply。`}],validate:e=>{if(!e.name.trim())return`--name must not be empty.`;if(!e.model.trim())return`--model must not be empty.`;if(!e.instructions.trim())return`--instructions must not be empty.`;if(e.type&&!e.skill?.length)return`--type requires at least one --skill.`;if(e.skill?.some(e=>!e.trim()))return`--skill values must not be empty.`;if(e.skillDir?.some(e=>!e.trim()))return`--skill-dir values must not be empty.`;if(e.environment!==void 0&&!e.environment.trim())return`--environment must not be empty.`;if(e.vault!==void 0&&!e.vault.trim())return`--vault must not be empty.`;if(e.mcp?.some(e=>!e.trim()))return`--mcp values must not be empty.`},async run(e){let{flags:t,settings:r}=e,i=T(r.output),a=await KT(e,t.file??`agents.yaml`),o=a.provider,s=t.environment?.trim(),c=t.vault?.trim();tD(`Environment`,s,a.config.environments,a.configPath),tD(`Vault`,c,a.config.vaults,a.configPath);let l=eD(t.mcp),u={environment:s,vault:c,mcp:l.map(e=>e.serverName)},d=$E(t.skill,QE(t.type)),p=await iD(a,t.skillDir),m=[...d,...p.map(e=>e.key)],h=ca(void 0,{name:t.name.trim(),description:t.description,model:t.model,instructions:t.instructions,environment:s,vault:c,provider:o,builtinTools:t.tool,mcp:l}).agent;h.skills=m;let g=structuredClone(a.config);g.skills={...g.skills};for(let e of p)g.skills[e.key]=e.resolvedDeclaration;g._resolved=!0;let _=await qT({project:{...a,config:g},group:`agents`,rawDeclaration:h}),v=await a.stateBackend.read(a.stateScope,e=>ZE({displayName:t.name.trim(),provider:o,agents:a.config.agents??{},candidate:_,state:e})),y=v.key;g.agents={...g.agents,[y]:_},g._resolved=!0;let b=Ri(a.source);if(b.errors.length>0)throw new n(`YAML parse error: ${b.errors.map(e=>e.message).join(`; `)}`,f.USAGE);for(let e of p)b.setIn([`skills`,e.key],e.rawDeclaration);b.setIn([`agents`,y],h);let x=b.toString(),S={type:`agent`,name:y,provider:o},ee=[...p.filter(e=>e.needsCreate).map(e=>({type:`skill`,name:e.key,provider:o})),S],te={projectName:a.projectName,config:g,configPath:a.configPath,providers:{[o]:g.providers[o]},stateBackend:a.stateBackend,stateScope:a.stateScope};if(r.dryRun||!t.yes){let e=await q(()=>J(()=>so(te,{provider:o,scope:{roots:ee},refresh:!r.dryRun,quiet:i===`json`,mode:`create-only`}))),n=!e.plan.diagnostics.some(e=>e.severity===`error`),s={agent:{key:y,name:t.name.trim(),provider:o,skills:m,...u},local_skills:p.map(e=>({key:e.key,name:e.name,source:e.source,reused_pending:e.reusedPending,reused_tracked:e.reusedTracked})),config_file:a.configPath,yaml_written:!1,reused_pending:v.reusedPending,requires_confirmation:!r.dryRun,ready_to_create:n,actions:e.plan.actions,diagnostics:e.plan.diagnostics};if(i===`json`)A(s,i);else{for(let e of p)k(`Generated Skill YAML key: ${e.key}`);k(`Generated Agent YAML key: ${y}`);for(let t of e.plan.diagnostics)k(`[${t.severity}] ${t.code}: ${t.message}`);for(let t of e.plan.actions.filter(e=>e.action!==`no-op`)){let e=t.action===`create`?`+`:t.action===`update`?`~`:`-`;k(` ${e} ${Gw(t.address)}`)}k(r.dryRun?`Dry run: YAML, State, and remote resources were not changed.`:`Preview only: re-run with --yes to write YAML and create this Agent.`)}return}await YT(a.configPath,a.source,x);let ne;try{ne=await q(()=>J(()=>Co(te,{provider:o,scope:{roots:ee},refresh:!0,quiet:i===`json`,mode:`create-only`,policy:`block`})))}catch(e){throw Uw(e,`The YAML declarations were kept. Fix the related dependency or provider error, then re-run the same create command.`,`Scoped Agent and Skill create failed.`)}let C=await a.stateBackend.read(a.stateScope,e=>({agentId:e.getResource(S)?.remote_id,skillIds:Object.fromEntries(p.map(t=>[t.key,e.getResource({type:`skill`,name:t.key,provider:o})?.remote_id]))})),re=ne.execution?.results??[],ie=re.find(e=>e.status===`failed`),ae=ie?`failed`:`completed`,oe={agent:{key:y,name:t.name.trim(),provider:o,remote_id:C.agentId,skills:m,...u},local_skills:p.map(e=>({key:e.key,name:e.name,source:e.source,remote_id:C.skillIds[e.key],reused_pending:e.reusedPending,reused_tracked:e.reusedTracked})),config_file:a.configPath,yaml_written:!0,reused_pending:v.reusedPending,status:ae,actions:ne.planned.plan.actions,diagnostics:ne.planned.plan.diagnostics,results:re,error:ie?.error};if(i===`json`?A(oe,i):(k(`Wrote ${a.configPath} with Agent key '${y}'${p.length?` and ${p.length} local Skill declaration(s)`:``}.`),k(ae===`completed`?`Created Agent '${t.name.trim()}'.`:`Scoped create ${ae}: ${ie?.error??`unknown error`}`)),ie)throw new n(ie.error??`Scoped Agent create failed.`,f.GENERAL,`The YAML declarations were kept. Fix the related dependency or provider error, then re-run the same create command.`)}});const oD={name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Environment display name; the YAML key is generated automatically`,"zh-CN":`远端 Environment 显示名称;YAML key 将自动生成`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Environment description`,"zh-CN":`Environment 描述`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},apt:cD(`APT`),pip:cD(`pip`),npm:cD(`npm`),cargo:cD(`Cargo`),gem:cD(`Ruby gem`),go:cD(`Go`),file:lD(),yes:uD()};var sD=w({description:{"en-US":`Declare and create one Managed Agent Environment through a scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建一个托管 Agent Environment`},auth:`apiKey`,usageArgs:`--name <name> [--description <text>] [--metadata <key=value>...] [--apt <package>...] [--pip <package>...] [--npm <package>...] [--cargo <package>...] [--gem <package>...] [--go <package>...] [--file <path>] [--yes]`,flags:oD,exampleArgs:[`--name Development`,`--name Development --pip pandas --npm typescript --metadata owner=platform --yes`],notes:[...G,...HT,{"en-US":`Creates a cloud Environment with unrestricted networking. Without --yes, only previews the generated YAML key and scoped plan.`,"zh-CN":`创建使用 unrestricted 网络的 cloud Environment。不带 --yes 时仅预览自动生成的 YAML key 和定向计划。`}],validate:e=>e.name.trim()?void 0:`--name must not be empty.`,async run(e){let t=await KT(e,e.flags.file??`agents.yaml`),n=Object.fromEntries([`apt`,`pip`,`npm`,`cargo`,`gem`,`go`].map(t=>[t,e.flags[t]]).filter(e=>Array.isArray(e[1])&&e[1].length>0)),r={name:e.flags.name.trim(),description:e.flags.description,provider:t.provider,config:{type:`cloud`,networking:{type:`unrestricted`},...Object.keys(n).length>0?{packages:n}:{}},metadata:XT(e.flags.metadata)},i=await qT({project:t,group:`environments`,rawDeclaration:r});await JT({host:e,project:t,group:`environments`,resourceType:`environment`,displayName:e.flags.name.trim(),rawDeclaration:r,resolvedDeclaration:i,existingDeclarations:t.config.environments??{},effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`environment`,yes:e.flags.yes})}});function cD(e){return{type:`array`,valueHint:`<package>`,description:{"en-US":`${e} package (repeatable)`,"zh-CN":`${e} 软件包(可重复)`}}}function lD(){return{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}}}function uD(){return{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}}var dD=w({description:{"en-US":`Declare and create one custom Managed Agent Skill from a local source`,"zh-CN":`从本地来源声明并创建一个自定义托管 Agent Skill`},auth:`apiKey`,usageArgs:`--source <directory|zip|SKILL.md> [--file <path>] [--yes]`,flags:{source:{type:`string`,valueHint:`<directory|zip|SKILL.md>`,required:!0,description:{"en-US":`Local Skill directory, ZIP archive, or single SKILL.md`,"zh-CN":`本地 Skill 目录、ZIP 压缩包或单个 SKILL.md`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and upload the Skill through the scoped create`,"zh-CN":`写入 YAML 并通过定向创建上传 Skill`}}},exampleArgs:[`--source ./skills/code-review`,`--source ./skill.zip --yes`],notes:[...G,...HT,{"en-US":`The YAML key is derived from SKILL.md frontmatter name. Remote URLs remain available through handwritten YAML plus full apply.`,"zh-CN":`YAML key 从 SKILL.md frontmatter 的 name 生成。远程 URL 仍可手工写入 YAML 后执行全量 Apply。`}],validate:e=>e.source.trim()?void 0:`--source must not be empty.`,async run(e){let t=await KT(e,e.flags.file??`agents.yaml`),r=await za(e.flags.source,{basePath:process.cwd()}),i=Ni(ji(t.configPath),r.sourcePath).split(Pi).join(`/`)||`.`,a=t.config.skills??{};if(await t.stateBackend.read(t.stateScope,e=>e.listResources().some(e=>{if(e.address.provider!==t.provider||e.address.type!==`skill`)return!1;let n=a[e.address.name];return(typeof n?.name==`string`?n.name:e.address.name)===r.name})))throw new n(`Skill '${r.name}' is already tracked.`,f.USAGE,"Modify its existing YAML declaration and run full `bl managed-agent apply` to create a new version.");let o={name:r.name,source:i,origin:`custom`,provider:t.provider},s=await qT({project:t,group:`skills`,rawDeclaration:o});await JT({host:e,project:t,group:`skills`,resourceType:`skill`,displayName:r.name,rawDeclaration:o,resolvedDeclaration:s,existingDeclarations:a,effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`skill`,yes:e.flags.yes})}}),fD=w({description:{"en-US":`Declare and create one empty Managed Agent Vault through a scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建一个空的托管 Agent Vault`},auth:`apiKey`,usageArgs:`--name <name> [--metadata <key=value>...] [--file <path>] [--yes]`,flags:{name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Vault display name; the YAML key is generated automatically`,"zh-CN":`远端 Vault 显示名称;YAML key 将自动生成`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}},exampleArgs:[`--name Production`,`--name Production --metadata owner=platform --yes`],notes:[...G,...HT,{"en-US":"Creates an empty Vault. Add secrets later with `vault credential create`.","zh-CN":"创建空 Vault;随后使用 `vault credential create` 添加 Secret。"}],validate:e=>e.name.trim()?void 0:`--name must not be empty.`,async run(e){let t=await KT(e,e.flags.file??`agents.yaml`),n={display_name:e.flags.name.trim(),provider:t.provider,credentials:[],metadata:XT(e.flags.metadata)},r=await qT({project:t,group:`vaults`,rawDeclaration:n});await JT({host:e,project:t,group:`vaults`,resourceType:`vault`,displayName:e.flags.name.trim(),rawDeclaration:n,resolvedDeclaration:r,existingDeclarations:t.config.vaults??{},effectiveName:(e,t)=>typeof t.display_name==`string`?t.display_name:e,fallbackKey:`vault`,yes:e.flags.yes})}}),pD=w({description:{"en-US":`Append and create one environment-variable Credential in a tracked Vault`,"zh-CN":`在已跟踪 Vault 中追加并创建一个环境变量 Credential`},auth:`apiKey`,usageArgs:`--vault <yaml-key> --name <name> --secret-name <name> --secret-env <env-name> [--metadata <key=value>...] [--file <path>] [--yes]`,flags:{vault:{type:`string`,valueHint:`<yaml-key>`,required:!0,description:{"en-US":`Existing tracked Vault key from agents.yaml`,"zh-CN":`agents.yaml 中已跟踪的 Vault key`}},name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Credential display name`,"zh-CN":`Credential 显示名称`}},secretName:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Environment variable name exposed to the Agent`,"zh-CN":`提供给 Agent 的环境变量名`}},secretEnv:{type:`string`,valueHint:`<env-name>`,required:!0,description:{"en-US":`Local environment variable containing the secret value`,"zh-CN":`保存真实 Secret 的本地环境变量名`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and create the remote Credential`,"zh-CN":`写入 YAML 并创建远端 Credential`}}},exampleArgs:[`--vault production --name api-token --secret-name API_TOKEN --secret-env PROD_API_TOKEN`,`--vault production --name api-token --secret-name API_TOKEN --secret-env PROD_API_TOKEN --yes`],notes:[...G,...HT,{"en-US":`--secret-env is an environment variable name, not the secret itself. The CLI auto-loads the nearest .env from the current directory upward; shell exports and CI secret injection also work.`,"zh-CN":`--secret-env 接收环境变量名,不接收 Secret 本身。CLI 会从当前目录向上自动加载最近的 .env,也支持 Shell export 和 CI Secret 注入。`},{"en-US":"YAML stores only ${ENV_NAME}. Never commit .env; subsequent full apply runs must provide the same environment variable.","zh-CN":"YAML 只保存 ${ENV_NAME}。不要提交 .env;后续执行全量 Apply 时仍需提供同名环境变量。"}],validate:e=>{if(!e.vault.trim())return`--vault must not be empty.`;if(!e.name.trim())return`--name must not be empty.`;if(!e.secretName.trim())return`--secret-name must not be empty.`;if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e.secretEnv))return`--secret-env must be a valid environment variable name.`},async run(e){let t=T(e.settings.output);sa();let r=process.env[e.flags.secretEnv],i=await KT(e,e.flags.file??`agents.yaml`).finally(()=>{delete process.env[e.flags.secretEnv]});if(!i.config.vaults?.[e.flags.vault])throw new n(`Vault '${e.flags.vault}' is not declared in agents.yaml.`,f.USAGE);if(e.flags.yes&&!e.settings.dryRun&&!r)throw new n(`Environment variable '${e.flags.secretEnv}' is not set or is empty.`,f.USAGE,`Set it in your shell, CI secret store, or a local .env file, then re-run with --secret-env ${e.flags.secretEnv}.`);let a=XT(e.flags.metadata),o={name:e.flags.name.trim(),type:`environment_variable`,secret_name:e.flags.secretName.trim(),secret_value:`\${${e.flags.secretEnv}}`,networking:{type:`unrestricted`},...a?{metadata:a}:{}},s={...o,secret_value:r??`__dry_run_secret__`},c=Ri(i.source);if(c.errors.length>0)throw new n(`YAML parse error: ${c.errors.map(e=>e.message).join(`; `)}`,f.USAGE);let l=c.toJS().vaults?.[e.flags.vault]?.credentials??[],u=l.filter(e=>!(!e||typeof e!=`object`||Array.isArray(e)||e.name!==o.name)),d=!1;if(u.length>0){let t=l.at(-1),r=u[0];if(u.length!==1||r!==t||!mD(r,o))throw new n(`Vault '${e.flags.vault}' already declares a different credential named '${o.name}'.`,f.USAGE,"Modify the existing YAML declaration and run full `bl managed-agent apply`; create never overwrites it.");d=!0}let p=structuredClone(i.config),m=p.vaults,h=m[e.flags.vault];d||(m[e.flags.vault]={...h,credentials:[...h.credentials??[],s]});let g=(await q(()=>mo(p,{projectName:i.projectName,basePath:ji(i.configPath)}))).config;d||c.addIn([`vaults`,e.flags.vault,`credentials`],o);let _=d?i.source:c.toString(),v={projectName:i.projectName,config:g,configPath:i.configPath,providers:{[i.provider]:g.providers[i.provider]},stateBackend:i.stateBackend,stateScope:i.stateScope};if(e.settings.dryRun||!e.flags.yes){let n=await q(()=>J(()=>co(v,e.flags.vault,e.flags.name.trim(),{provider:i.provider,refresh:!e.settings.dryRun,quiet:t===`json`,checkRemote:!e.settings.dryRun}))),r={vault:{key:e.flags.vault,remote_id:n.vaultRemoteId},credential:{name:e.flags.name.trim(),secret_name:e.flags.secretName.trim(),secret_env:e.flags.secretEnv},config_file:i.configPath,yaml_written:!1,reused_pending:d,requires_confirmation:!e.settings.dryRun,ready_to_create:!0,remote_checked:n.remoteChecked,reuse_remote:n.reuseRemote};t===`json`?A(r,t):(k(`Vault: ${e.flags.vault}`),k(`Credential: ${e.flags.name.trim()} (secret from ${e.flags.secretEnv})`),k(e.settings.dryRun?`Dry run: YAML, State, and remote resources were not changed.`:`Preview only: re-run with --yes to append YAML and create this Credential.`));return}await YT(i.configPath,i.source,_);let y;try{y=await q(()=>J(()=>ma(v,e.flags.vault,e.flags.name.trim(),{provider:i.provider,refresh:!0,quiet:t===`json`})))}catch(e){throw Uw(e,`The YAML declaration was kept. Restore the same secret environment variable and re-run this command; an already-created matching Credential will be adopted.`,`Vault Credential create failed.`)}let b={vault:{key:e.flags.vault,remote_id:y.vaultRemoteId},credential:{id:y.credentialId,name:e.flags.name.trim(),secret_name:e.flags.secretName.trim(),secret_env:e.flags.secretEnv},config_file:i.configPath,yaml_written:!0,reused_pending:d,adopted:y.adopted,status:`completed`};t===`json`?A(b,t):k(`Wrote ${i.configPath} and created Credential '${e.flags.name.trim()}'.`)}});function mD(e,t){return hD(e)===hD(t)}function hD(e){let t=e=>Array.isArray(e)?e.map(t):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>[e,t(n)]));return JSON.stringify(t(e))}const gD={...zT,name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Remote Deployment display name; the YAML key is generated automatically`,"zh-CN":`远端 Deployment 显示名称;YAML key 将自动生成`}},agent:{type:`string`,valueHint:`<yaml-key>`,required:!0,description:{"en-US":`Existing Agent key from agents.yaml`,"zh-CN":`agents.yaml 中已有的 Agent key`}},agentVersion:{type:`number`,valueHint:`<number>`,description:{"en-US":`Agent version`,"zh-CN":`Agent 版本`}},environment:{type:`string`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Environment key from agents.yaml`,"zh-CN":`agents.yaml 中已有的 Environment key`}},vault:{type:`array`,valueHint:`<yaml-key>`,description:{"en-US":`Existing Vault key from agents.yaml (repeatable)`,"zh-CN":`agents.yaml 中已有的 Vault key(可重复)`}},message:{type:`array`,valueHint:`<text>`,description:{"en-US":`Initial user message (repeatable)`,"zh-CN":`初始用户消息(可重复)`}},event:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`Initial user.message or system.message JSON (repeatable)`,"zh-CN":`初始 user.message 或 system.message JSON(可重复)`}},resource:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`File Resource JSON with source or file_id (repeatable)`,"zh-CN":`包含 source 或 file_id 的 File Resource JSON(可重复)`}},schedule:{type:`string`,valueHint:`<cron>`,description:{"en-US":`Five-field cron expression`,"zh-CN":`五段式 Cron 表达式`}},timezone:{type:`string`,valueHint:`<timezone>`,description:{"en-US":`IANA schedule timezone`,"zh-CN":`Schedule 的 IANA 时区`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Deployment description`,"zh-CN":`Deployment 描述`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}};var _D=w({description:{"en-US":`Declare and create one Managed Agent Deployment through a scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建一个托管 Agent Deployment`},auth:`apiKey`,usageArgs:`--name <name> --agent <yaml-key> (--message <text>... | --event <json|@path>...) [--agent-version <number>] [--environment <yaml-key>] [--environment_variables <KEY=VALUE>...] [--vault <yaml-key>...] [--resource <json|@path>...] [--schedule <cron> --timezone <timezone>] [--description <text>] [--metadata <key=value>...] [--file <path>] [--yes]`,flags:gD,exampleArgs:[{"en-US":`--name Daily --agent assistant --message "Generate the report" --environment_variables LOG_LEVEL=info`,"zh-CN":`--name Daily --agent assistant --message "生成报告" --environment_variables LOG_LEVEL=info`},{"en-US":`--name Daily --agent assistant --event '{"type":"system.message","content":"Be concise"}' --yes`,"zh-CN":`--name Daily --agent assistant --event '{"type":"system.message","content":"保持简洁"}' --yes`}],notes:[...G,...HT,{"en-US":"--environment_variables writes string values to the Deployment YAML declaration when --yes is used. Repeat the flag for multiple variables; empty values and values containing = are allowed. Later apply runs manage these values; removing the field or using {} clears them. YAML stores these values; the key `__proto__` is reserved.","zh-CN":"使用 --yes 时,--environment_variables 将字符串值写入 Deployment 的 YAML 声明。可重复传入,允许空值及包含 = 的值。后续 apply 会管理这些值;删除字段或设置为 {} 会清空变量。YAML 会保存这些值;不支持保留键 `__proto__`。"},{"en-US":`Initial Events must contain 1-50 user.message/system.message entries. --resource accepts only File Resources in this release.`,"zh-CN":`Initial Events 必须包含 1–50 条 user.message/system.message;本期 --resource 仅接受 File Resource。`},{"en-US":`Use either repeatable --message values or repeatable --event values; the two input forms cannot be mixed.`,"zh-CN":`重复使用 --message 或重复使用 --event;两种输入形式不能混用。`}],validate:e=>{if(vD(e.environment_variables),!e.name.trim())return`--name must not be empty.`;if(!e.agent.trim())return`--agent must not be empty.`;if(e.message?.length&&e.event?.length)return`--message and --event cannot be used together.`;if(!e.message?.length&&!e.event?.length)return`Pass at least one --message or --event.`;if(!!e.schedule!=!!e.timezone)return`--schedule and --timezone must be provided together.`;if(e.agentVersion!==void 0&&(!Number.isInteger(e.agentVersion)||e.agentVersion<1))return`--agent-version must be a positive integer.`},async run(e){let t=await KT(e,e.flags.file??`agents.yaml`),r=[...(e.flags.message??[]).map(e=>({type:`user.message`,content:e})),...yD(await ZT(e.flags.event,`event`))];if(r.length<1||r.length>50)throw new n(`Initial Events must contain 1-50 entries.`,f.USAGE);let i=bD(await ZT(e.flags.resource,`resource`));if(e.flags.schedule&&e.flags.schedule.trim().split(/\s+/).length!==5)throw new n(`--schedule must be a five-field cron expression.`,f.USAGE);e.flags.timezone&&xD(e.flags.timezone);let a={name:e.flags.name.trim(),agent:e.flags.agent,agent_version:e.flags.agentVersion,environment:e.flags.environment,environment_variables:vD(e.flags.environment_variables),vaults:e.flags.vault,resources:i,initial_events:r,schedule:e.flags.schedule&&e.flags.timezone?{expression:e.flags.schedule,timezone:e.flags.timezone}:void 0,description:e.flags.description,provider:t.provider,metadata:XT(e.flags.metadata)},o=await qT({project:t,group:`deployments`,rawDeclaration:a});await JT({host:e,project:t,group:`deployments`,resourceType:`deployment`,displayName:e.flags.name.trim(),rawDeclaration:a,resolvedDeclaration:o,existingDeclarations:t.config.deployments??{},effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`deployment`,yes:e.flags.yes})}});function vD(e){let t=BT(e);if(t&&Object.hasOwn(t,`__proto__`))throw new n(`Deployment environment_variables cannot use the reserved key __proto__. / Deployment 环境变量不能使用保留键 __proto__。`,f.USAGE);return t}function yD(e){return e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`Each --event must be a JSON object.`,f.USAGE);let t=e;if(t.type!==`user.message`&&t.type!==`system.message`)throw new n(`--event type must be user.message or system.message.`,f.USAGE);if(typeof t.content!=`string`||!t.content.trim())throw new n(`--event content must be a non-empty string.`,f.USAGE);return{type:t.type,content:t.content}})}function bD(e){return e.map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`Each --resource must be a JSON object.`,f.USAGE);let t=e;if(t.type!==`file`)throw new n(`--resource currently accepts only type=file.`,f.USAGE);let r=typeof t.source==`string`?t.source:void 0,i=typeof t.file_id==`string`?t.file_id:void 0;if(!!r==!!i)throw new n(`A File Resource must provide exactly one of source or file_id.`,f.USAGE);if(t.mount_path!==void 0&&typeof t.mount_path!=`string`)throw new n(`File Resource mount_path must be a string.`,f.USAGE);return{type:`file`,source:r,file_id:i,mount_path:t.mount_path}})}function xD(e){try{new Intl.DateTimeFormat(`en-US`,{timeZone:e}).format()}catch{throw new n(`Invalid IANA timezone: ${e}`,f.USAGE)}}const SD={...Y,...X,...pE},CD={...Y,limit:X.limit,...fE,...pE},wD={...Y,agentId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Agent ID`,"zh-CN":`Agent ID`}},agentVersion:{type:`number`,valueHint:`<n>`,description:{"en-US":`Specific agent version`,"zh-CN":`指定 Agent 版本`}}},TD={...Y,...X,agentId:wD.agentId};function ED(e){return e.map(e=>[e.id,Z(e.name),Z(e.version),Z(e.type),Z(e.updated_at)])}var DD=w({description:{"en-US":`Get a Managed Agent`,"zh-CN":`获取托管 Agent 详情`},auth:`apiKey`,usageArgs:`--agent-id <id> [--agent-version <n>] [--file <path>]`,flags:wD,exampleArgs:[`--agent-id agent_abc`,`--agent-id agent_abc --agent-version 3 --output json`],notes:G,validate:e=>e.agentVersion!==void 0&&(!Number.isInteger(e.agentVersion)||e.agentVersion<1)?`--agent-version must be a positive integer.`:void 0,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Aa(t,e.flags.agentId,{provider:`bailian`,version:e.flags.agentVersion})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${Z(n.name)}`),k(`Description: ${Z(n.description,120)}`),k(`Version: ${Z(n.version)}`),k(`Type: ${Z(n.type)}`),k(`Created: ${Z(n.created_at)}`),k(`Updated: ${Z(n.updated_at)}`)}}),OD=w({description:{"en-US":`List Managed Agents`,"zh-CN":`列出托管 Agent`},auth:`apiKey`,usageArgs:`[--limit <n>] [--page <cursor>] [--all] [--include-archived] [--file <path>]`,flags:SD,exampleArgs:[``,`--limit 50`,`--all --include-archived --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await Ga(t,{provider:`bailian`,limit:e.flags.limit,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`agents`,items:n.items,headers:[`ID`,`NAME`,`VERSION`,`TYPE`,`UPDATED`],rows:ED(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No agents found.`})}}),kD=w({description:{"en-US":`Search Managed Agents`,"zh-CN":`搜索托管 Agent`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page-limit <n>] [--include-archived]`,flags:CD,exampleArgs:[`--query assistant`,`--query code --page-limit 20 --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return _E(async n=>{let r=await Ga(t,{provider:`bailian`,limit:e.flags.limit??100,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>gE(e.flags.query,t.id,t.name,t.description),e.flags.pageLimit)}));vE({format:t,key:`agents`,items:n.items,headers:[`ID`,`NAME`,`VERSION`,`TYPE`,`UPDATED`],rows:ED(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching agents found.`})}}),AD=w({description:{"en-US":`List Managed Agent versions`,"zh-CN":`列出托管 Agent 版本`},auth:`apiKey`,usageArgs:`--agent-id <id> [--limit <n>] [--page <cursor>] [--all]`,flags:TD,exampleArgs:[`--agent-id agent_abc`,`--agent-id agent_abc --all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await Wa(t,e.flags.agentId,{provider:`bailian`,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`versions`,items:n.items,headers:[`ID`,`NAME`,`VERSION`,`TYPE`,`UPDATED`],rows:ED(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No agent versions found.`})}});const jD={...Y,...X,...pE},MD={...Y,limit:X.limit,...fE,...pE},ND={...Y,environmentId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Environment ID`,"zh-CN":`Environment ID`}}};function PD(e){return e.map(e=>[e.id,Z(e.name),Z(e.scope),Z(e.version),Z(e.updated_at)])}var FD=w({description:{"en-US":`Get a Managed Agent environment`,"zh-CN":`获取托管 Agent 环境详情`},auth:`apiKey`,usageArgs:`--environment-id <id>`,flags:ND,exampleArgs:[`--environment-id env_abc`],notes:G,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Na(t,e.flags.environmentId,{provider:`bailian`})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${Z(n.name)}`),k(`Description: ${Z(n.description,120)}`),k(`Scope: ${Z(n.scope)}`),k(`Version: ${Z(n.version)}`),k(`Updated: ${Z(n.updated_at)}`)}}),ID=w({description:{"en-US":`List Managed Agent environments`,"zh-CN":`列出托管 Agent 环境`},auth:`apiKey`,usageArgs:`[--limit <n>] [--page <cursor>] [--all] [--include-archived]`,flags:jD,exampleArgs:[``,`--all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await Ja(t,{provider:`bailian`,limit:e.flags.limit,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`environments`,items:n.items,headers:[`ID`,`NAME`,`SCOPE`,`VERSION`,`UPDATED`],rows:PD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No environments found.`})}}),LD=w({description:{"en-US":`Search Managed Agent environments`,"zh-CN":`搜索托管 Agent 环境`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page-limit <n>] [--include-archived]`,flags:MD,exampleArgs:[`--query sandbox`,`--query production --page-limit 20 --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return _E(async n=>{let r=await Ja(t,{provider:`bailian`,limit:e.flags.limit??100,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>gE(e.flags.query,t.id,t.name,t.description),e.flags.pageLimit)}));vE({format:t,key:`environments`,items:n.items,headers:[`ID`,`NAME`,`SCOPE`,`VERSION`,`UPDATED`],rows:PD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching environments found.`})}}),RD=w({description:{"en-US":`Download a Managed Agent skill version`,"zh-CN":`下载托管 Agent Skill 版本`},auth:`apiKey`,usageArgs:`--skill-id <id> --skill-version <version> --output-file <path> [--force]`,flags:WE,exampleArgs:[`--skill-id skill_abc --skill-version 3 --output-file ./skill.zip`],notes:G,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_download_skill:e.flags.skillId,version:e.flags.skillVersion,output_file:e.flags.outputFile},t);return}let n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Sa(t,e.flags.skillId,e.flags.skillVersion,{provider:`bailian`})})),r=await OE(e.flags.outputFile,n,e.flags.force);t===`json`?A({downloaded:e.flags.skillId,version:e.flags.skillVersion,output_file:r},t):k(`Skill downloaded to ${r}`)}}),zD=w({description:{"en-US":`Get a Managed Agent skill`,"zh-CN":`获取托管 Agent Skill 详情`},auth:`apiKey`,usageArgs:`--skill-id <id>`,flags:HE,exampleArgs:[`--skill-id skill_abc`],notes:G,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Pa(t,e.flags.skillId,{provider:`bailian`})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${n.name}`),k(`Description: ${Z(n.description,120)}`),k(`Source: ${n.source}`),k(`Status: ${n.status}`),k(`Version: ${Z(n.latest_version)}`)}}),BD=w({description:{"en-US":`Search Managed Agent skills`,"zh-CN":`搜索托管 Agent Skill`},auth:`apiKey`,usageArgs:`--query <text> [--source custom|official|all] [--limit <n>] [--page-limit <n>]`,flags:VE,exampleArgs:[`--query browser --source official`,`--query report --source all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=e.flags.source??`custom`,r=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`),r=n=>_E(async r=>{let i=await Za(t,{provider:`bailian`,source:n,limit:e.flags.limit??100,page:r});return{items:i.data,hasMore:i.has_more,nextPage:i.next_page}},t=>gE(e.flags.query,t.id,t.name,t.description),e.flags.pageLimit);if(n!==`all`)return r(n);let[i,a]=await Promise.all([r(`custom`),r(`official`)]);return{items:[...i.items,...a.items],hasMore:i.hasMore||a.hasMore,nextPage:void 0,scannedPages:i.scannedPages+a.scannedPages,truncated:i.truncated||a.truncated}}));vE({format:t,key:`skills`,items:r.items,headers:[`ID`,`NAME`,`SOURCE`,`STATUS`,`VERSION`,`UPDATED`],rows:GE(r.items),hasMore:r.hasMore,nextPage:r.nextPage,truncated:r.truncated,scannedPages:r.scannedPages,emptyMessage:`No matching skills found.`})}}),VD=w({description:{"en-US":`List Managed Agent skill versions`,"zh-CN":`列出托管 Agent Skill 版本`},auth:`apiKey`,usageArgs:`--skill-id <id> [--limit <n>] [--page <cursor>] [--all]`,flags:UE,exampleArgs:[`--skill-id skill_abc`,`--skill-id skill_abc --all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await Xa(t,e.flags.skillId,{provider:`bailian`,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`versions`,items:n.items,headers:[`VERSION`,`NAME`,`TYPE`,`STATUS`,`UPDATED`],rows:KE(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No skill versions found.`})}});const HD={...Y,...X,...pE},UD={...Y,limit:X.limit,...fE,...pE},WD={...Y,vaultId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Vault ID`,"zh-CN":`Vault ID`}}};function GD(e){return e.map(e=>[e.id,Z(e.display_name),Z(e.type),Z(e.created_at),Z(e.updated_at)])}var KD=w({description:{"en-US":`Get a Managed Agent vault`,"zh-CN":`获取托管 Agent Vault 详情`},auth:`apiKey`,usageArgs:`--vault-id <id>`,flags:WD,exampleArgs:[`--vault-id vault_abc`],notes:G,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Fa(t,e.flags.vaultId,{provider:`bailian`})}));if(t===`json`){A(n,t);return}k(`ID: ${n.id}`),k(`Name: ${Z(n.display_name)}`),k(`Type: ${Z(n.type)}`),k(`Created: ${Z(n.created_at)}`),k(`Updated: ${Z(n.updated_at)}`)}}),qD=w({description:{"en-US":`List Managed Agent vaults`,"zh-CN":`列出托管 Agent Vault`},auth:`apiKey`,usageArgs:`[--limit <n>] [--page <cursor>] [--all] [--include-archived]`,flags:HD,exampleArgs:[``,`--all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await Qa(t,{provider:`bailian`,limit:e.flags.limit,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`vaults`,items:n.items,headers:[`ID`,`NAME`,`TYPE`,`CREATED`,`UPDATED`],rows:GD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No vaults found.`})}}),JD=w({description:{"en-US":`Search Managed Agent vaults`,"zh-CN":`搜索托管 Agent Vault`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page-limit <n>] [--include-archived]`,flags:UD,exampleArgs:[`--query github`,`--query production --page-limit 20 --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return _E(async n=>{let r=await Qa(t,{provider:`bailian`,limit:e.flags.limit??100,page:n,include_archived:e.flags.includeArchived});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>gE(e.flags.query,t.id,t.display_name,t.metadata),e.flags.pageLimit)}));vE({format:t,key:`vaults`,items:n.items,headers:[`ID`,`NAME`,`TYPE`,`CREATED`,`UPDATED`],rows:GD(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching vaults found.`})}});const YD={deploymentId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Deployment ID`,"zh-CN":`Deployment ID`}}},XD={agentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by agent ID`,"zh-CN":`按 Agent ID 筛选`}},status:{type:`string`,valueHint:`<status>`,choices:[`active`,`paused`],description:{"en-US":`Filter by deployment status`,"zh-CN":`按 Deployment 状态筛选`}},...pE,createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this timestamp`,"zh-CN":`创建时间不早于该时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this timestamp`,"zh-CN":`创建时间不晚于该时间戳`}}},ZD={...Y,...X,...XD},QD={...Y,...YD},$D={...Y,...X,query:fE.query,...XD},eO={...Y,...YD,...X},tO={...Y,runId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Deployment run ID`,"zh-CN":`Deployment Run ID`}}},nO={...Y,deployment:{type:`string`,valueHint:`<name>`,description:{"en-US":`Logical deployment name in agents.yaml/state`,"zh-CN":`agents.yaml/State 中的逻辑 Deployment 名称`}},deploymentId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Direct deployment ID`,"zh-CN":`直接指定 Deployment ID`}}};function rO(e){if(!!e.deployment==!!e.deploymentId)return`Provide exactly one of --deployment or --deployment-id.`}function iO(e){return e.map(e=>[Z(e.id),e.status,Z(e.schedule?.expression),Z(e.paused_reason?.type)])}function aO(e){return e.map(e=>[e.id,Z(e.deployment_id),Z(e.session_id),Z(e.status),Z(e.created_at)])}async function oO(e,t){if(t.deploymentId)return t.deploymentId;let n=e.state.getResource({provider:`bailian`,type:`deployment`,name:t.deployment});if(!n?.remote_id)throw new aa(`Deployment '${t.deployment}' is not tracked in state. Use --deployment-id or run managed-agent apply/import first.`);return n.remote_id}var sO=w({description:{"en-US":`Get a Managed Agent deployment`,"zh-CN":`获取托管 Agent Deployment 详情`},auth:`apiKey`,usageArgs:`--deployment-id <id>`,flags:QD,exampleArgs:[`--deployment-id dep_abc`],notes:G,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return ja(t,e.flags.deploymentId,{provider:`bailian`})}));t===`json`?A(n,t):(k(`ID: ${Z(n.id)}`),k(`Status: ${n.status}`),k(`Schedule:${Z(n.schedule?.expression)}`),k(`Paused: ${Z(n.paused_reason)}`))}}),cO=w({description:{"en-US":`List Managed Agent deployments`,"zh-CN":`列出托管 Agent Deployment`},auth:`apiKey`,usageArgs:`[--agent-id <id>] [--status active|paused] [--limit <n>] [--page <cursor>] [--all]`,flags:ZD,exampleArgs:[``,`--status active --all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await qa(t,{provider:`bailian`,agent_id:e.flags.agentId,status:e.flags.status,include_archived:e.flags.includeArchived,created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte,limit:e.flags.limit,page:n});return{items:r.deployments,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`deployments`,items:n.items,headers:[`ID`,`STATUS`,`SCHEDULE`,`PAUSED REASON`],rows:iO(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No deployments found.`})}});function lO(e){return w({description:e?{"en-US":`Pause a Managed Agent deployment`,"zh-CN":`暂停托管 Agent Deployment`}:{"en-US":`Unpause a Managed Agent deployment`,"zh-CN":`恢复托管 Agent Deployment`},auth:`apiKey`,risk:{level:`high`,message:e?{"en-US":`This pauses the specified Managed Agent deployment and stops its scheduled executions until resumed.`,"zh-CN":`该操作会暂停指定的托管 Agent Deployment,并停止其定时执行直至恢复。`}:{"en-US":`This resumes the specified Managed Agent deployment and may restart scheduled executions and related usage.`,"zh-CN":`该操作会恢复指定的托管 Agent Deployment,可能重新开始定时执行并产生相关用量。`}},usageArgs:`(--deployment <name> | --deployment-id <id>)`,flags:nO,exampleArgs:[`--deployment daily-report --dry-run`,`--deployment-id dep_abc --yes`],notes:G,validate:rO,async run(t){let n=T(t.settings.output);if(t.settings.dryRun){A({[e?`would_pause_deployment`:`would_unpause_deployment`]:t.flags.deploymentId??t.flags.deployment,target_kind:t.flags.deploymentId?`id`:`state_name`},n);return}let r=await q(()=>J(async()=>{let n=await K(t,t.flags.file??`agents.yaml`),r=await oO(n,t.flags);return{deploymentId:r,deployment:await yo(n,r,e,{provider:`bailian`})}}));n===`json`?A({deployment_id:r.deploymentId,deployment:r.deployment},n):k(`Deployment ${r.deploymentId} ${e?`paused`:`unpaused`}.`)}})}var uO=lO(!0),dO=w({description:{"en-US":`Run a Managed Agent deployment now`,"zh-CN":`立即运行托管 Agent Deployment`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This immediately starts a run for the specified Managed Agent deployment and may incur usage or trigger configured actions.`,"zh-CN":`该操作会立即运行指定的托管 Agent Deployment,可能产生用量或触发已配置的动作。`}},usageArgs:`(--deployment <name> | --deployment-id <id>)`,flags:nO,exampleArgs:[`--deployment daily-report --dry-run`,`--deployment-id dep_abc --yes`],notes:G,validate:rO,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_run_deployment:e.flags.deploymentId??e.flags.deployment,target_kind:e.flags.deploymentId?`id`:`state_name`},t);return}let n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`),n=await oO(t,e.flags);return{deploymentId:n,run:await ho(t,n,{provider:`bailian`})}}));t===`json`?A({deployment_id:n.deploymentId,...n.run},t):k(`Deployment ${n.deploymentId} started. Run: ${n.run.run_id??`-`}`)}}),fO=w({description:{"en-US":`Get a Managed Agent deployment run`,"zh-CN":`获取托管 Agent Deployment Run 详情`},auth:`apiKey`,usageArgs:`--run-id <id>`,flags:tO,exampleArgs:[`--run-id run_abc`],notes:G,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Ma(t,e.flags.runId,{provider:`bailian`})}));t===`json`?A(n,t):(k(`ID: ${n.id}`),k(`Deployment: ${Z(n.deployment_id)}`),k(`Session: ${Z(n.session_id)}`),k(`Status: ${Z(n.status)}`),k(`Created: ${Z(n.created_at)}`),k(`Error: ${Z(n.error)}`))}}),pO=w({description:{"en-US":`List runs for a Managed Agent deployment`,"zh-CN":`列出托管 Agent Deployment Run`},auth:`apiKey`,usageArgs:`--deployment-id <id> [--limit <n>] [--page <cursor>] [--all]`,flags:eO,exampleArgs:[`--deployment-id dep_abc`,`--deployment-id dep_abc --all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await Ka(t,e.flags.deploymentId,{provider:`bailian`,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`runs`,items:n.items,headers:[`ID`,`DEPLOYMENT`,`SESSION`,`STATUS`,`CREATED`],rows:aO(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No deployment runs found.`})}}),mO=w({description:{"en-US":`Search Managed Agent deployments`,"zh-CN":`搜索托管 Agent Deployment`},auth:`apiKey`,usageArgs:`--query <text> [--limit <n>] [--page <cursor>] [--all]`,flags:$D,exampleArgs:[`--query report`,`--query nightly --all --output json`],notes:[...G,{"en-US":`Deployment search maps --query to the provider's server-side keyword parameter.`,"zh-CN":`Deployment 搜索会把 --query 映射为 Provider 服务端 keyword 参数。`}],validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await qa(t,{provider:`bailian`,keyword:e.flags.query,agent_id:e.flags.agentId,status:e.flags.status,include_archived:e.flags.includeArchived,created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte,limit:e.flags.limit,page:n});return{items:r.deployments,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`deployments`,items:n.items,headers:[`ID`,`STATUS`,`SCHEDULE`,`PAUSED REASON`],rows:iO(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No matching deployments found.`})}}),hO=lO(!1);const gO={sessionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Session ID`,"zh-CN":`Session ID`}}},_O={...Y,limit:X.limit,...fE,agent:{type:`string`,valueHint:`<name>`,description:{"en-US":`Filter by configured agent name`,"zh-CN":`按配置中的 Agent 名称筛选`}},statuses:{type:`string`,valueHint:`<statuses>`,description:{"en-US":`Comma-separated session statuses`,"zh-CN":`Session 状态,多个以逗号分隔`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or after this timestamp`,"zh-CN":`创建时间不早于该时间戳`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Created at or before this timestamp`,"zh-CN":`创建时间不晚于该时间戳`}}},vO={...Y,...gO,title:{type:`string`,valueHint:`<title>`,description:{"en-US":`New session title`,"zh-CN":`新的 Session 标题`}},metadata:{type:`string`,valueHint:`<json|@path>`,description:{"en-US":`String-valued metadata JSON or @file`,"zh-CN":`值为字符串的 Metadata JSON 或 @file`}}},yO={...Y,...gO};function bO(e){return e.map(e=>[e.id,Z(e.title),Z(e.agent_id),e.status,Z(e.updated_at)])}async function xO(e){if(!e)return;let t=await DE(e);if(!t||typeof t!=`object`||Array.isArray(t))throw new n(`--metadata must be a JSON object.`,f.USAGE);for(let[e,r]of Object.entries(t))if(typeof r!=`string`)throw new n(`Metadata value for '${e}' must be a string.`,f.USAGE);return t}const SO=w({description:{"en-US":`Search Managed Agent sessions`,"zh-CN":`搜索托管 Agent Session`},auth:`apiKey`,usageArgs:`--query <text> [--agent <name>] [--statuses <statuses>] [--limit <n>] [--page-limit <n>]`,flags:_O,exampleArgs:[`--query debug`,`--query failed --statuses failed --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return _E(async n=>{let r=await no(t,{agent:e.flags.agent,provider:`bailian`,filter:{page:n,limit:e.flags.limit??100,statuses:hE(e.flags.statuses),created_at_gte:e.flags.createdAtGte,created_at_lte:e.flags.createdAtLte}});return{items:r.summaries,hasMore:r.hasMore,nextPage:r.nextPage}},t=>gE(e.flags.query,t.session.id,t.session.title,t.session.status,t.session.agent_id,t.agentName),e.flags.pageLimit)})),r=n.items.map(e=>e.session);vE({format:t,key:`sessions`,items:r,headers:[`ID`,`TITLE`,`AGENT`,`STATUS`,`UPDATED`],rows:bO(r),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching sessions found.`})}}),CO=w({description:{"en-US":`Update a Managed Agent session`,"zh-CN":`更新托管 Agent Session`},auth:`apiKey`,usageArgs:`--session-id <id> [--title <title>] [--metadata <json|@path>]`,flags:vO,exampleArgs:[`--session-id sess_abc --title 'investigation'`,`--session-id sess_abc --metadata @metadata.json`],notes:G,validate:e=>!e.title&&!e.metadata?`Provide --title or --metadata.`:void 0,async run(e){let t=T(e.settings.output),n={title:e.flags.title,metadata:await xO(e.flags.metadata)};if(e.settings.dryRun){A({would_update_session:e.flags.sessionId,input:n},t);return}let r=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Eo(t,e.flags.sessionId,n,{provider:`bailian`})}));t===`json`?A(r,t):k(`Session ${r.id} updated.`)}}),wO=w({description:{"en-US":`Archive a Managed Agent session`,"zh-CN":`归档托管 Agent Session`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This archives the specified remote Managed Agent Session.`,"zh-CN":`该操作会归档指定的远端托管 Agent Session。`}},usageArgs:`--session-id <id>`,flags:yO,exampleArgs:[`--session-id sess_abc --dry-run`,`--session-id sess_abc --yes`],notes:G,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_archive_session:e.flags.sessionId},t);return}let n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return oa(t,e.flags.sessionId,{provider:`bailian`})}));t===`json`?A({archived:e.flags.sessionId,session:n},t):k(`Session ${e.flags.sessionId} archived.`)}}),TO={sessionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Session ID`,"zh-CN":`Session ID`}}},EO={...Y,...TO},DO={...EO,outputFile:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Destination ZIP path`,"zh-CN":`目标 ZIP 路径`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing output file`,"zh-CN":`覆盖已存在的输出文件`}}};function OO(e){return e instanceof Error?e.message:String(e)}async function kO(e,t,n){let r=await La(e,t,n),i=n??(e.providers.size===1?Array.from(e.providers.keys())[0]:`bailian`),a=[],o=[],s=[];try{o=(await dE(async r=>{let i=await to(e,t,{provider:n,limit:100,page_token:r,order:`asc`});return{items:i.events,hasMore:i.has_more,nextPage:i.next_page}},!0)).items}catch(e){a.push({component:`events`,message:OO(e)})}try{s=(await dE(async r=>{let i=await Ya(e,{provider:n,scope_id:t,limit:100,page:r});return{items:i.data,hasMore:i.has_more,nextPage:i.next_page}},!0)).items}catch(e){a.push({component:`files`,message:OO(e)})}return{session:r,events:zo(o),files:s,capabilities:Ea(i),errors:a}}const AO=String.raw`(?:api[_-]?key|access[_-]?key|private[_-]?key|secret|token|authorization|credential|password|signature|signed[_-]?url)`,jO=RegExp(`${AO}|tool[_-]?input`,`i`),MO=RegExp(`([?&][^=&#\\s]*(?:${AO})[^=&#\\s]*=)[^&#\\s"'<>),}\\]]*`,`gi`),NO=RegExp(`("[^"]*(?:${AO})[^"]*"\\s*:\\s*")[^"]*(")`,`gi`),PO=RegExp(`('[^']*(?:${AO})[^']*'\\s*:\\s*')[^']*(')`,`gi`),FO=RegExp(`(\\b[^\\s=:,;]*(?:${AO})[^\\s=:,;]*\\s*=\\s*)(?!\\[REDACTED\\])(?:"[^"]*"|'[^']*'|[^\\s,;&]+)`,`gi`),IO=/\b(authorization\s*:\s*)(?:bearer\s+)?[^\s,;]+/gi,LO=/\b(bearer\s+)[A-Za-z0-9._~+/=-]+/gi,RO=/\bsk-[A-Za-z0-9_-]{8,}\b/g;function zO(e){return e.replace(MO,`$1[REDACTED]`).replace(NO,`$1[REDACTED]$2`).replace(PO,`$1[REDACTED]$2`).replace(FO,`$1[REDACTED]`).replace(IO,`$1[REDACTED]`).replace(LO,`$1[REDACTED]`).replace(RO,`[REDACTED]`)}function BO(e){return Array.isArray(e)?e.map(BO):typeof e==`string`?zO(e):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,t])=>e===`environment_variables`&&typeof t==`object`&&t&&!Array.isArray(t)?[e,VT(t)]:[e,jO.test(e)?`[REDACTED]`:BO(t)]))}function VO(e){return new TextEncoder().encode(`${JSON.stringify(BO(e),null,2)}\n`)}function HO(e){let t=4294967295;for(let n of e){t^=n;for(let e=0;e<8;e+=1)t=t>>>1^(t&1?3988292384:0)}return(t^4294967295)>>>0}function UO(e){let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function WO(e){let t=e.reduce((e,[,t])=>e+t,0),n=new ArrayBuffer(t),r=new DataView(n),i=0;for(let[t,n]of e)n===2?r.setUint16(i,t,!0):r.setUint32(i,t,!0),i+=n;return new Uint8Array(n)}function GO(e){let t=new TextEncoder,n=[],r=[],i=0;for(let a of e){let e=t.encode(a.name),o=HO(a.content),s=UO([WO([[67324752,4],[20,2],[0,2],[0,2],[0,2],[0,2],[o,4],[a.content.length,4],[a.content.length,4],[e.length,2],[0,2]]),e,a.content]);n.push(s);let c=WO([[33639248,4],[20,2],[20,2],[0,2],[0,2],[0,2],[0,2],[o,4],[a.content.length,4],[a.content.length,4],[e.length,2],[0,2],[0,2],[0,2],[0,2],[0,4],[i,4]]);r.push(UO([c,e])),i+=s.length}let a=UO(r),o=WO([[101010256,4],[0,2],[0,2],[e.length,2],[e.length,2],[a.length,4],[i,4],[0,2]]);return UO([...n,a,o])}const KO=w({description:{"en-US":`Aggregate session diagnostics`,"zh-CN":`聚合 Session 诊断信息`},auth:`apiKey`,usageArgs:`--session-id <id>`,flags:EO,exampleArgs:[`--session-id sess_abc`,`--session-id sess_abc --output json`],notes:G,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>kO(await K(e,e.flags.file??`agents.yaml`),e.flags.sessionId,`bailian`))),r=BO(n);if(t===`json`){A(r,t);return}k(`Session: ${n.session.id} (${n.session.status})`),k(`Events: ${n.events.length}`),k(`Scoped files: ${n.files.length}`),k(`Partial errors: ${n.errors.length}`);for(let e of n.errors)k(` ${e.component}: ${e.message}`)}}),qO=w({description:{"en-US":`Export session diagnostics as a ZIP`,"zh-CN":`将 Session 诊断信息导出为 ZIP`},auth:`apiKey`,usageArgs:`--session-id <id> --output-file <path> [--force]`,flags:DO,exampleArgs:[`--session-id sess_abc --output-file ./session-debug.zip`],notes:[...G,{"en-US":`The ZIP contains metadata only; file bodies and credential-like values are excluded/redacted.`,"zh-CN":`ZIP 仅包含元数据;不会包含文件正文,凭证类字段会被移除或脱敏。`}],async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_export_session:e.flags.sessionId,output_file:e.flags.outputFile},t);return}let n=await q(()=>J(async()=>kO(await K(e,e.flags.file??`agents.yaml`),e.flags.sessionId,`bailian`))),r={schema_version:1,generated_at:(/* @__PURE__ */ new Date()).toISOString(),session_id:n.session.id,partial:n.errors.length>0,counts:{events:n.events.length,files:n.files.length,errors:n.errors.length},contents:[`session.json`,`events.json`,`files.json`,`capabilities.json`,`errors.json`],note:`File bodies are not included. Credential-like fields are redacted.`},i=GO([{name:`manifest.json`,content:VO(r)},{name:`session.json`,content:VO(n.session)},{name:`events.json`,content:VO(n.events)},{name:`files.json`,content:VO(n.files)},{name:`capabilities.json`,content:VO(n.capabilities)},{name:`errors.json`,content:VO(n.errors)}]),a=await OE(e.flags.outputFile,i,e.flags.force);t===`json`?A({exported:n.session.id,output_file:a,partial:r.partial},t):k(`Session diagnostics exported to ${a}${r.partial?` (partial)`:``}`)}}),JO={fileId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote file ID`,"zh-CN":`远端 File ID`}}},YO={scopeId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by scope ID`,"zh-CN":`按 Scope ID 筛选`}}},XO={...Y,path:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Local file path`,"zh-CN":`本地文件路径`}},filename:{type:`string`,valueHint:`<name>`,description:{"en-US":`Remote filename override`,"zh-CN":`覆盖远端文件名`}},mimeType:{type:`string`,valueHint:`<type>`,description:{"en-US":`MIME type override`,"zh-CN":`覆盖 MIME 类型`}}},ZO={...Y,...X,...YO},QO={...Y,limit:X.limit,...fE,...YO},$O={...Y,...JO},ek={...$O,outputFile:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Destination path`,"zh-CN":`目标路径`}},force:{type:`switch`,description:{"en-US":`Overwrite an existing output file`,"zh-CN":`覆盖已存在的输出文件`}}},tk={...$O};function nk(e){return e.map(e=>[e.id,Z(e.filename),Z(e.status),String(e.size_bytes),Z(e.scope?.id),Z(e.created_at)])}const rk=w({description:{"en-US":`Upload a Managed Agent file`,"zh-CN":`上传托管 Agent 文件`},auth:`apiKey`,usageArgs:`--path <path> [--filename <name>] [--mime-type <type>]`,flags:XO,exampleArgs:[`--path ./report.pdf`],notes:G,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_upload_file:e.flags.path,filename:e.flags.filename??Ai(e.flags.path),mime_type:e.flags.mimeType??kE(e.flags.path)},t);return}let n=await EE(e.flags.path),r=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Oo(t,n,e.flags.filename??Ai(e.flags.path),{provider:`bailian`,mimeType:e.flags.mimeType??kE(e.flags.path)})}));t===`json`?A(r,t):k(`File uploaded: ${r.id} (${r.filename})`)}}),ik=w({description:{"en-US":`List Managed Agent files`,"zh-CN":`列出托管 Agent 文件`},auth:`apiKey`,usageArgs:`[--scope-id <id>] [--limit <n>] [--page <cursor>] [--all]`,flags:ZO,exampleArgs:[``,`--scope-id sess_abc --all --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return dE(async n=>{let r=await Ya(t,{provider:`bailian`,scope_id:e.flags.scopeId,limit:e.flags.limit,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},e.flags.all,e.flags.page)}));vE({format:t,key:`files`,items:n.items,headers:[`ID`,`FILENAME`,`STATUS`,`BYTES`,`SCOPE`,`CREATED`],rows:nk(n.items),hasMore:n.hasMore,nextPage:n.nextPage,emptyMessage:`No files found.`})}}),ak=w({description:{"en-US":`Get Managed Agent file metadata`,"zh-CN":`获取托管 Agent 文件元数据`},auth:`apiKey`,usageArgs:`--file-id <id>`,flags:$O,exampleArgs:[`--file-id file_abc`],notes:G,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return Ta(t,e.flags.fileId,{provider:`bailian`})}));t===`json`?A(n,t):(k(`ID: ${n.id}`),k(`Filename: ${n.filename}`),k(`MIME: ${n.mime_type}`),k(`Bytes: ${n.size_bytes}`),k(`Status: ${Z(n.status)}`),k(`Scope: ${Z(n.scope?.id)}`))}}),ok=w({description:{"en-US":`Search Managed Agent files`,"zh-CN":`搜索托管 Agent 文件`},auth:`apiKey`,usageArgs:`--query <text> [--scope-id <id>] [--limit <n>] [--page-limit <n>]`,flags:QO,exampleArgs:[`--query report`,`--query pdf --scope-id sess_abc --output json`],notes:G,validate:mE,async run(e){let t=T(e.settings.output),n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return _E(async n=>{let r=await Ya(t,{provider:`bailian`,scope_id:e.flags.scopeId,limit:e.flags.limit??100,page:n});return{items:r.data,hasMore:r.has_more,nextPage:r.next_page}},t=>gE(e.flags.query,t.id,t.filename,t.mime_type),e.flags.pageLimit)}));vE({format:t,key:`files`,items:n.items,headers:[`ID`,`FILENAME`,`STATUS`,`BYTES`,`SCOPE`,`CREATED`],rows:nk(n.items),hasMore:n.hasMore,nextPage:n.nextPage,truncated:n.truncated,scannedPages:n.scannedPages,emptyMessage:`No matching files found.`})}}),sk=w({description:{"en-US":`Download Managed Agent file content`,"zh-CN":`下载托管 Agent 文件内容`},auth:`apiKey`,usageArgs:`--file-id <id> --output-file <path> [--force]`,flags:ek,exampleArgs:[`--file-id file_abc --output-file ./artifact.pdf`],notes:G,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_download_file:e.flags.fileId,output_file:e.flags.outputFile},t);return}let n=await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);return xa(t,e.flags.fileId,{provider:`bailian`})})),r=await OE(e.flags.outputFile,n,e.flags.force);t===`json`?A({downloaded:e.flags.fileId,output_file:r},t):k(`File downloaded to ${r}`)}}),ck=w({description:{"en-US":`Delete a Managed Agent file`,"zh-CN":`删除托管 Agent 文件`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the specified remote Managed Agent file.`,"zh-CN":`该操作会永久删除指定的远端托管 Agent 文件。`}},usageArgs:`--file-id <id>`,flags:tk,exampleArgs:[`--file-id file_abc --dry-run`,`--file-id file_abc --yes`],notes:G,async run(e){let t=T(e.settings.output);if(e.settings.dryRun){A({would_delete_file:e.flags.fileId},t);return}await q(()=>J(async()=>{let t=await K(e,e.flags.file??`agents.yaml`);await ha(t,e.flags.fileId,{provider:`bailian`})})),t===`json`?A({deleted:e.flags.fileId},t):k(`File ${e.flags.fileId} deleted.`)}});function lk(e){let t=e.client.url(``,()=>``)||void 0,r=e.flags.workspaceId??e.settings.workspaceId;if(!t&&!r?.trim())throw new n(`Workspace ID is required when no base URL is configured. / 未配置 Base URL 时必须提供 Workspace ID。`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID, configure workspace_id, or set --base-url. / 请传入 --workspace-id、设置 BAILIAN_WORKSPACE_ID 或 workspace_id 配置,或通过 --base-url 指定地址。`);try{return fo({baseUrl:t,workspaceId:r})}catch(e){throw e instanceof aa?new n(t?`The configured API base URL is invalid. / 配置的 API Base URL 无效。`:`Workspace ID must be a valid hostname label. / Workspace ID 必须是有效的主机名标签。`,f.USAGE,t?`Configure a valid HTTP or HTTPS API base URL. / 请配置有效的 HTTP 或 HTTPS API Base URL。`:`Use a workspace ID such as workspace-example, or set --base-url. / 请使用 workspace-example 这样的有效 Workspace ID,或设置 --base-url。`):e}}function uk(e){let t=e.client.exportApiCredential();if(!t?.token.trim())throw new n(`A Bailian API key is required. / 必须提供百炼 API Key。`,f.AUTH,`Pass --api-key, set DASHSCOPE_API_KEY, or log in with auth login --api-key <key>. / 请传入 --api-key、设置 DASHSCOPE_API_KEY,或使用 auth login --api-key <key> 登录。`);let r=lk(e);return Fw(e),la({providers:{bailian:{api_key:t.token,base_url:r,workspace_id:e.flags.workspaceId??e.settings.workspaceId}}})}const dk={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID; optional when a base URL is configured`,"zh-CN":`Workspace ID;已配置 Base URL 时可省略`}}},fk={...dk,webhookId:{type:`string`,valueHint:`<wep_id>`,description:{"en-US":`Webhook endpoint ID`,"zh-CN":`Webhook 端点 ID`},required:!0}},pk={url:{type:`string`,valueHint:`<url>`,description:{"en-US":`Public HTTP or HTTPS callback URL`,"zh-CN":`公网 HTTP 或 HTTPS 回调地址`}},event:{type:`array`,valueHint:`<type>`,description:{"en-US":`Named event subscription; repeat for multiple events, wildcards are unsupported`,"zh-CN":`具名订阅事件;可重复传入多个事件,不支持通配符`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Description, up to 256 characters; an empty string clears it on update`,"zh-CN":`描述,最多 256 个字符;更新时传空字符串可清空`}}},mk=[{"en-US":`Manages workspace-level Webhooks directly; no agents.yaml or local state is required.`,"zh-CN":`直接管理工作空间级 Webhook;无需 agents.yaml 或本地状态文件。`},{"en-US":`Auth: --api-key > DASHSCOPE_API_KEY > active profile API key. Credentials are injected into the SDK in memory only.`,"zh-CN":`鉴权:--api-key > DASHSCOPE_API_KEY > 当前 Profile 的 API Key。凭证仅在内存中注入 SDK。`},{"en-US":`Base URL: --base-url > DASHSCOPE_BASE_URL > profile base_url. Without a configured URL, use --workspace-id > BAILIAN_WORKSPACE_ID > config workspace_id for the cn-beijing endpoint.`,"zh-CN":`Base URL:--base-url > DASHSCOPE_BASE_URL > Profile 的 base_url。未配置地址时,按 --workspace-id > BAILIAN_WORKSPACE_ID > 配置项 workspace_id 选择 cn-beijing 端点。`}],hk={"en-US":`Signing Secret is returned only on create/reset. Save it from this successful response; the CLI does not persist it.`,"zh-CN":`Signing Secret 仅在创建或重置时返回。请从本次成功响应中保存;CLI 不会自动持久化。`};function gk(e){if(e.webhookId!==void 0&&!e.webhookId.trim())return`--webhook-id must not be empty. / --webhook-id 不能为空。`;if(e.workspaceId!==void 0&&!e.workspaceId.trim())return`--workspace-id must not be empty. / --workspace-id 不能为空。`;if(e.url!==void 0)try{let t=new URL(e.url);if(t.protocol!==`http:`&&t.protocol!==`https:`)return`--url must use HTTP or HTTPS. / --url 必须使用 HTTP 或 HTTPS。`}catch{return`--url must be a valid HTTP or HTTPS URL. / --url 必须是有效的 HTTP 或 HTTPS 地址。`}if(e.event!==void 0&&(e.event.length===0||e.event.some(e=>!e.trim()||e.includes(`*`))))return`--event requires non-empty named events without wildcards. / --event 必须是非空具名事件,不能使用通配符。`;if(e.description!==void 0&&Array.from(e.description).length>256)return`--description must contain at most 256 characters. / --description 最多包含 256 个字符。`;if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>100))return`--limit must be an integer between 1 and 100. / --limit 必须是 1 到 100 之间的整数。`;if(e.page!==void 0&&!e.page.trim())return`--page must be a non-empty pagination cursor. / --page 必须是非空分页游标。`}function _k(e,t){let n=T(t.settings.output);n===`json`?A(e,n):k(JSON.stringify(e,null,2))}async function vk(e,t){let r=lk(e);if(e.settings.dryRun){_k({operation:`webhook.${t.operation}`,provider:`bailian`,base_url:r,...t.webhookId===void 0?{}:{webhook_id:t.webhookId},...t.request===void 0?{}:{request:t.request},...t.limit===void 0?{}:{limit:t.limit},...t.page===void 0?{}:{page:t.page}},e);return}let i=e.settings.timeout;if(!Number.isFinite(i)||i<=0||i*1e3>2147483647)throw new n(`--timeout must be greater than 0 and at most 2147483.647 seconds. / --timeout 必须大于 0 且不超过 2147483.647 秒。`,f.USAGE);_k(await q(()=>J(async()=>{let r=uk(e),a=new AbortController,o=setTimeout(()=>a.abort(),Math.ceil(i*1e3));try{return await t.invoke(r,{provider:`bailian`,signal:a.signal})}catch(e){throw a.signal.aborted?new n(`Webhook request timed out after ${i} seconds. / Webhook 请求在 ${i} 秒后超时。`,f.TIMEOUT,`Check the endpoint state before retrying a mutation; increase --timeout if needed. / 重试变更操作前请先检查端点状态;可按需增大 --timeout。`):e}finally{clearTimeout(o)}})),e),t.returnsSecret&&process.stderr.write(`Signing Secret is shown only in this successful create/reset response; save it now. / Signing Secret 仅在本次创建或重置成功响应中返回,请立即保存。
2879
+ `)}const yk=w({description:{"en-US":`Create a Webhook endpoint`,"zh-CN":`创建 Webhook 端点`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This creates a Webhook and starts delivering subscribed events to its callback URL.`,"zh-CN":`该操作会创建 Webhook,并开始向回调地址投递订阅事件。`}},flags:{...dk,...pk,url:{...pk.url,required:!0},event:{...pk.event,required:!0}},usageArgs:`--url <url> --event <type> [--event <type>] [--description <text>] [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --url https://example.com/webhooks --event session.updated --yes`],notes:[...mk,hk],validate:gk,async run(e){let t={url:e.flags.url,events:e.flags.event,...e.flags.description===void 0?{}:{description:e.flags.description}};await vk(e,{operation:`create`,request:t,returnsSecret:!0,invoke:(e,n)=>fa(e,t,n)})}}),bk=w({description:{"en-US":`List all Webhook endpoints`,"zh-CN":`列出全部 Webhook 端点`},auth:`apiKey`,flags:dk,usageArgs:`[--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --output json`],notes:[...mk,{"en-US":`Returns every undeleted Webhook without pagination.`,"zh-CN":`返回所有未删除的 Webhook,不分页。`}],validate:gk,async run(e){await vk(e,{operation:`list`,invoke:(e,t)=>$a(e,t)})}});function xk(e){return w({description:e.description,auth:`apiKey`,risk:e.risk,flags:fk,usageArgs:`--webhook-id <wep_id> [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --webhook-id wep_example${e.risk?` --yes`:``}`],notes:[...mk,...e.notes??[]],validate:gk,async run(t){await vk(t,{operation:e.operation,webhookId:t.flags.webhookId,returnsSecret:e.returnsSecret,invoke:(n,r)=>e.invoke(n,t.flags.webhookId,r)})}})}const Sk=xk({operation:`get`,description:{"en-US":`Get a Webhook endpoint`,"zh-CN":`查询 Webhook 端点详情`},invoke:Ia}),Ck=w({description:{"en-US":`Update a Webhook endpoint`,"zh-CN":`更新 Webhook 端点`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This updates the callback URL, description, or event subscriptions of the Webhook.`,"zh-CN":`该操作会更新 Webhook 的回调地址、描述或订阅事件。`}},flags:{...fk,...pk},usageArgs:`--webhook-id <wep_id> [--url <url>] [--event <type>] [--description <text>] [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --webhook-id wep_example --description "" --yes`],notes:[...mk,{"en-US":`Omitted fields stay unchanged; --event replaces the complete subscription list.`,"zh-CN":`未传字段保持不变;--event 会替换整个订阅列表。`}],validate(e){let t=gk(e);if(t)return t;if(e.url===void 0&&e.event===void 0&&e.description===void 0)return`Provide --url, --event, or --description to update. / 更新时请至少提供 --url、--event 或 --description。`},async run(e){let t={...e.flags.url===void 0?{}:{url:e.flags.url},...e.flags.event===void 0?{}:{events:e.flags.event},...e.flags.description===void 0?{}:{description:e.flags.description}};await vk(e,{operation:`update`,webhookId:e.flags.webhookId,request:t,invoke:(n,r)=>Do(n,e.flags.webhookId,t,r)})}}),wk=xk({operation:`delete`,description:{"en-US":`Delete a Webhook endpoint`,"zh-CN":`删除 Webhook 端点`},risk:{level:`high`,message:{"en-US":`This deletes the Webhook and cancels its pending deliveries.`,"zh-CN":`该操作会删除 Webhook,并取消尚未投递的事件。`}},invoke:_a}),Tk=xk({operation:`enable`,description:{"en-US":`Enable a Webhook endpoint`,"zh-CN":`启用 Webhook 端点`},risk:{level:`high`,message:{"en-US":`This resumes new event deliveries. Events from the disabled period are not replayed.`,"zh-CN":`该操作会恢复新事件投递,不会补发禁用期间的事件。`}},invoke:Ca}),Ek=xk({operation:`disable`,description:{"en-US":`Disable a Webhook endpoint`,"zh-CN":`禁用 Webhook 端点`},risk:{level:`high`,message:{"en-US":`This stops new event deliveries and cancels pending deliveries.`,"zh-CN":`该操作会停止新事件投递,并取消尚未投递的事件。`}},invoke:ba}),Dk=xk({operation:`test`,description:{"en-US":`Send a real Webhook test event`,"zh-CN":`实际发送一次 Webhook 测试事件`},risk:{level:`high`,message:{"en-US":`This sends a real callback request; redirects or security validation failures may disable the Webhook.`,"zh-CN":`该操作会实际发送回调请求;重定向或安全校验失败可能禁用 Webhook。`}},notes:[{"en-US":`Tests are synchronous, are not retried or recorded, and do not affect consecutive failure counts.`,"zh-CN":`测试同步执行,不重试、不保存投递记录,也不影响连续失败计数。`}],invoke:wo}),Ok=xk({operation:`reset-secret`,description:{"en-US":`Reset a Webhook signing secret`,"zh-CN":`重置 Webhook 验签密钥`},risk:{level:`high`,message:{"en-US":`This immediately invalidates the previous signing secret. Save the new secret and update your receiver.`,"zh-CN":`该操作会立即使旧验签密钥失效。请保存新密钥并更新接收端。`}},notes:[hk],returnsSecret:!0,invoke:uo}),kk=w({description:{"en-US":`List recent Webhook delivery events`,"zh-CN":`查询最近的 Webhook 投递事件`},auth:`apiKey`,flags:{...fk,limit:{type:`number`,valueHint:`<count>`,description:{"en-US":`Page size, 1–100 (default: 20)`,"zh-CN":`每页数量,1–100(默认:20)`}},page:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Opaque next_page cursor from the previous response`,"zh-CN":`上一页响应中的不透明 next_page 游标`}}},usageArgs:`--webhook-id <wep_id> [--limit <count>] [--page <cursor>] [--workspace-id <id>]`,exampleArgs:[`--workspace-id workspace-example --webhook-id wep_example --limit 20 --output json`],notes:[...mk,{"en-US":`Returns one page of delivery events retained for 7 days. Continue with next_page; deleted Webhooks' retained events remain queryable.`,"zh-CN":`返回一页保留 7 天的投递事件。可用 next_page 继续查询;Webhook 删除后仍可查询保留期内的事件。`}],validate:gk,async run(e){await vk(e,{operation:`events`,webhookId:e.flags.webhookId,limit:e.flags.limit,page:e.flags.page,invoke:(t,n)=>eo(t,e.flags.webhookId,{...n,limit:e.flags.limit,page:e.flags.page})})}}),Ak={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`},jk={accessKeyId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Alibaba Cloud Access Key ID`,"zh-CN":`阿里云 Access Key ID`}},accessKeySecret:{type:`string`,valueHint:`<secret>`,description:{"en-US":`Alibaba Cloud Access Key Secret`,"zh-CN":`阿里云 Access Key Secret`}},securityToken:{type:`string`,valueHint:`<token>`,description:{"en-US":`Alibaba Cloud STS Security Token (optional)`,"zh-CN":`阿里云 STS Security Token(可选)`}}},Mk=1e3;function Nk(e){return new Promise(t=>setTimeout(t,e))}function Pk(e){return e?.data?.DataV2?.data?.data}function Fk(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 Ik=w({description:{"en-US":`Initialize Bailian workspace and activate postpaid services`,"zh-CN":`初始化百炼 Workspace 并开通后付费服务`},auth:`none`,usageArgs:`--access-key-id <id> --access-key-secret <secret> [--security-token <token>]`,flags:jk,exampleArgs:[`--access-key-id LTAIxxxxx --access-key-secret xxxxx`],async run(e){let{settings:t,flags:r}=e,i=T(t.output);if(t.dryRun){A({apis:[{step:0,api:`GenerateCLIAccessToken`,description:`Generate CLI access token from AK/SK`},{step:1,api:Ak.loginInfo,description:`Check login & workspace status`},{step:2,api:Ak.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:Ak.queryBuyResult,description:`Query postpaid order status`},{step:7,api:Ak.commodityOrderInfo,description:`Query commodity activation status`},{step:8,api:Ak.buyCommodity,description:`Activate postpaid commodities (if needed)`}]},i);return}let{accessKeyId:a,accessKeySecret:o}=r;if(!a||!o)throw new n(`workspace init requires --access-key-id and --access-key-secret.`,f.USAGE);let s=r.securityToken||void 0,c=(await it({identity:e.identity,settings:t,baseUrl:e.client.baseUrl,accessKeyId:a,accessKeySecret:o,securityToken:s})).cliAccessToken;if(!c)throw new n(`Failed to generate CLI access token from AK/SK.`,f.GENERAL);let l=E(t),u={region:l.consoleRegion,site:l.consoleSite,...l.consoleSwitchAgent==null?{}:{switchAgent:l.consoleSwitchAgent},token:c},d=t.verbose,p=async(e,r={})=>{d&&process.stderr.write(`> ${e}\n`);try{let n=await ve(u,t.timeout,{api:e,data:r},t);return d&&process.stderr.write(`< ${JSON.stringify(n)}\n`),n}catch(e){if(d){let t=e instanceof n?e.rawResponse??e.message:String(e);process.stderr.write(`< ERROR: ${t}\n`)}throw e}};k(`Checking workspace status...`);let m=Pk(await p(Ak.loginInfo));m?.spaceInited===!0?k(`Workspace already initialized.`):(k(`Initializing workspace...`),await p(Ak.initSpace),k(`Workspace initialized.`));let h=m?.aliyun?.uid;if(typeof h!=`string`||h.length===0)throw new n(`Console login info did not include aliyun.uid.`,f.GENERAL);let g={identity:e.identity,settings:t,baseUrl:e.client.baseUrl,regionId:l.consoleRegion,accessKeyId:a,accessKeySecret:o,securityToken:s};try{await we({...g,reqDTO:{outerKey:h,nickName:h,userName:h}})}catch(e){if(!(e instanceof n)||!/already exists/i.test(e.message))throw e;k(`Console user already exists, continuing.`)}k(`Resolving workspace agent...`);let _=Fk(await Lt(g));if(_==null)throw new n(`Could not resolve agentId from ListWorkspaces response.`,f.GENERAL,`Re-run with --verbose to inspect the ListWorkspaces response body.`);k(`Authorizing user permissions...`),await Pn({...g,outerKey:h,agentId:_,policyIndexList:[1]}),await Lk(p,i)}});async function Lk(e,t){k(`Checking service activation status...`);let r;for(let t=0;t<20;t++){let n=Pk(await e(Ak.queryBuyResult));if(r=typeof n==`string`?n:n?.result,r!==`buying`)break;t===0&&k(`Service activation in progress, polling...`),await Nk(Mk)}if(r===`fail`)throw new n(`Service activation failed.`,f.GENERAL);if(r===`success`){await Bk(e,t);return}await zk(e,t)}function Rk(e){let t=Pk(e);return Array.isArray(t)?t:[]}async function zk(e,t){let n=Rk(await e(Ak.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(Ak.buyCommodity),await Bk(e,t);return}let a=n.filter(e=>e.status===10);A({status:`ready`,activeServices:a.map(e=>e.commodityCode)},t)}async function Bk(e,t){k(`Waiting for services to activate...`);for(let n=0;n<20;n++){let n=Rk(await e(Ak.commodityOrderInfo));if(n.filter(e=>e.status!==10&&e.status!==11).length===0){let e=n.filter(e=>e.status===11);if(e.length>0){k(`Warning: Some services are overdue:`);for(let t of e)k(` - ${t.commodityCode}`)}let r=n.filter(e=>e.status===10);A({status:`ready`,activeServices:r.map(e=>e.commodityCode)},t);return}await Nk(Mk)}throw new n(`Timed out waiting for services to activate.`,f.TIMEOUT)}var Vk=w({description:{"en-US":`Install or upgrade an allowlisted Command Pack`,"zh-CN":`安装或升级白名单内的 Command Pack`},auth:`none`,usageArgs:`--package <name[@version]>`,flags:{package:{type:`string`,valueHint:`<name[@version]>`,description:{"en-US":`Allowlisted Command Pack package and optional version or tag`,"zh-CN":`白名单内的 Command Pack 包名,以及可选的版本或 Tag`},required:!0}},exampleArgs:[`--package @ali/bailian-plugin-agent`,`--package @ali/bailian-plugin-agent@beta`],async run(e){let t=await e.commandPacks.install(e.flags.package);A({installed:t},T(e.settings.output))}}),Hk=w({description:{"en-US":`Link an allowlisted local Command Pack for development`,"zh-CN":`链接白名单内的本地 Command Pack 用于开发`},auth:`none`,usageArgs:`--path <directory>`,flags:{path:{type:`string`,valueHint:`<directory>`,description:{"en-US":`Local Command Pack package directory`,"zh-CN":`本地 Command Pack 包目录`},required:!0}},exampleArgs:[`--path ../bailian-plugin-agent`],async run(e){let t=await e.commandPacks.link(e.flags.path);A({linked:t},T(e.settings.output))}}),Uk=w({description:{"en-US":`List installed Command Packs and their load status`,"zh-CN":`列出已安装的 Command Pack 及其加载状态`},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 Hr([`NAME`,`VERSION`,`SOURCE`,`STATUS`,`COMMANDS / ERROR`],r))k(e)}}),Wk=w({description:{"en-US":`Remove an installed Command Pack`,"zh-CN":`移除已安装的 Command Pack`},auth:`none`,usageArgs:`--name <package>`,flags:{name:{type:`string`,valueHint:`<package>`,description:{"en-US":`Allowlisted Command Pack package name`,"zh-CN":`白名单内的 Command Pack 包名`},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))}});function Gk(e){return e.map(e=>({id:e.id,skillsDir:e.skillsDir}))}function Kk(e){try{let t=Ci(e);return t.isSymbolicLink()?{exists:!0,kind:`symlink`,hasSkillMd:!1}:t.isDirectory()?{exists:!0,kind:`directory`,hasSkillMd:M(N(e,`SKILL.md`))}:{exists:!0,kind:`file`,hasSkillMd:!1}}catch{return{exists:!1,kind:`absent`,hasSkillMd:!1}}}function qk(e,t){return t.map(t=>{let n=N(t.skillsDir,e);return{agent:t.id,path:n,...Kk(n)}})}var Jk=w({description:{"en-US":`Install skills from the Bailian skill registry into local agents`,"zh-CN":`将百炼 Skill Registry 中的 Skill 安装到本地 Agent`},auth:`none`,usageArgs:`--all | --name <name,...>`,flags:{all:{type:`switch`,description:{"en-US":`Install all skills from the registry`,"zh-CN":`安装 Registry 中的全部 Skill`}},name:{type:`string`,valueHint:`<name,...>`,description:{"en-US":`Comma-separated skill names to install`,"zh-CN":`要安装的 Skill 名称,以逗号分隔`}}},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 t=e.settings.outputExplicit?e.settings.output:`json`,r=await $e(),i=Object.keys(r.skills),a=e.flags.all?`all`:_n(e.flags.name,!1),o=a===`all`?i:a,s=Be();if(e.settings.dryRun){let e=o.map(e=>{let t=r.skills[e];return t?{name:e,status:`install`,publishedAt:t.publishedAt,links:qk(e,s)}:{name:e,status:`failed`,reason:`skill not found in registry`}});A({action:`skill.add`,registry:bt(),agents:Gk(s),skills:e},t);let i=e.filter(e=>e.status===`failed`);if(i.length>0)throw new n(`${i.length}/${e.length} skill(s) failed to install`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill add`);return}let c=Dn(),l=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 Ot(e,t,s,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)}}}),u=await Hn(l,3);if(wr(c),t===`json`)A({registry:bt(),agents:s.map(e=>e.id),skills:u},t);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 Hr([`NAME`,`STATUS`,`PUBLISHED`,`AGENTS / REASON`],e))k(t)}let d=u.filter(e=>e.status===`failed`);if(d.length>0)throw new n(`${d.length}/${u.length} skill(s) failed to install`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill add`)}}),Yk=w({description:{"en-US":`Update installed skills to the latest registry versions`,"zh-CN":`将已安装的 Skill 更新到 Registry 最新版本`},auth:`none`,usageArgs:`[--all] [--name <name,...>]`,flags:{all:{type:`switch`,description:{"en-US":`Update all installed skills (default when neither --all nor --name is given)`,"zh-CN":`更新全部已安装 Skill(未指定 --all 或 --name 时的默认行为)`}},name:{type:`string`,valueHint:`<name,...>`,description:{"en-US":`Comma-separated skill names to update (must be already installed)`,"zh-CN":`要更新的 Skill 名称,以逗号分隔(必须已安装)`}}},validate(e){if(e.all&&e.name)return`Use either --all or --name, not both`},exampleArgs:[``,`--all`,`--name spark-video`],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,r=e.flags.all||!e.flags.name?`all`:_n(e.flags.name,!1),i=await $e(),a=Dn(),o=new Set(qt()),s=Be(),c=[],l=[];if(r===`all`)for(let[t,n]of Object.entries(a.skills)){let r=i.skills[t];if(!r){c.push({name:t,status:`skipped`,reason:`delisted from remote; local copy retained`});continue}if(r.contentHash===n.contentHash&&o.has(t)){if(e.settings.dryRun){c.push({name:t,status:`up-to-date`,publishedAt:n.publishedAt});continue}let r=Ke(t,s,n.links??[]);a.skills[t]={...n,links:r.links},c.push({name:t,status:`up-to-date`,publishedAt:n.publishedAt});continue}l.push(t)}else for(let e of r){if(!a.skills[e]){c.push({name:e,status:`failed`,reason:`not installed; run bl skill add --name `+e+` first`});continue}l.push(e)}if(e.settings.dryRun){let e=c.map(e=>e.status===`up-to-date`?{name:e.name,status:`up-to-date`,publishedAt:e.publishedAt,links:qk(e.name,s)}:e.status===`skipped`?{name:e.name,status:`skipped`,publishedAt:e.publishedAt,reason:e.reason}:{name:e.name,status:`failed`,publishedAt:e.publishedAt,reason:e.reason});for(let t of l){let n=i.skills[t];if(!n){e.push({name:t,status:`failed`,reason:`skill not found in registry`});continue}e.push({name:t,status:`update`,publishedAt:n.publishedAt,links:qk(t,s)})}A({action:`skill.update`,registry:bt(),agents:Gk(s),skills:e},t);let r=e.filter(e=>e.status===`failed`);if(r.length>0)throw new n(`${r.length} skill(s) failed to update`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill update`);return}let u=l.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 Ot(e,t,s,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)}}}),d=await Hn(u,3);if(c.push(...d),wr(a),t===`json`)A({registry:bt(),skills:c},t);else if(c.length===0)k(`No skills installed locally; run bl skill add first.`);else{let e=c.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,10):`-`]);for(let t of Hr([`NAME`,`STATUS`,`PUBLISHED`],e))k(t);let t=c.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 p=c.filter(e=>e.status===`failed`);if(p.length>0)throw new n(`${p.length} skill(s) failed to update`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill update`)}}),Xk=w({description:{"en-US":`Remove locally installed skills (registry is untouched)`,"zh-CN":`移除本地已安装的 Skill(不修改 Registry)`},auth:`none`,usageArgs:`--name <all|name,...>`,flags:{name:{type:`string`,valueHint:`<all|name,...>`,description:{"en-US":`Skills to remove: all or comma-separated skill names`,"zh-CN":`要移除的 Skill:all 或以逗号分隔的 Skill 名称`},required:!0}},exampleArgs:[`--name spark-video`,`--name all`],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,r=_n(e.flags.name,!1),i=Dn(),a=r===`all`?Object.keys(i.skills):r;if(a.length===0){A({skills:[]},t),t===`text`&&k(`No skills installed locally; nothing to remove.`);return}let o=new Set(qt()),s=xt();if(e.settings.dryRun){let e=a.map(e=>{let t=i.skills[e];return t?{name:e,status:`remove`,canonical:N(s,e),links:bn(e,t.links??[])}:{name:e,status:`failed`,reason:o.has(e)?`directory not managed by bl skill (untracked); remove manually if needed`:`not installed`}});A({action:`skill.remove`,skills:e},t);let r=e.filter(e=>e.status===`failed`);if(r.length>0)throw new n(`${r.length}/${e.length} skill(s) failed to remove`,f.GENERAL,`Check the reason for failed skills in the output; use bl skill list to verify local install status`);return}let 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=ur(e,t.links??[]);jn(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(wr(i),t===`json`)A({skills:c},t);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 Hr([`NAME`,`STATUS`,`DETAIL`],e))k(t)}let l=c.filter(e=>e.status===`failed`);if(l.length>0)throw new n(`${l.length}/${c.length} skill(s) failed to remove`,f.GENERAL,`Check the reason for failed skills in the output; use bl skill list to verify local install status`)}});function Zk(e){return e?e.length>60?`${e.slice(0,59)}…`:e:`-`}var Qk=w({description:{"en-US":`List registry skills and diff against local installs`,"zh-CN":`列出 Registry Skill,并与本地安装结果比较`},auth:`none`,exampleArgs:[``,`--output json`],notes:[{"en-US":`STATUS: installed | outdated | not-installed | missing (lock has it, dir deleted) | untracked (dir exists, not managed)`,"zh-CN":`STATUS:installed | outdated | not-installed | missing(Lock 中存在但目录已删除)| untracked(目录存在但未被管理)`}],async run(e){let t=e.settings.outputExplicit?e.settings.output:`json`,n=await $e(),r=Dn(),i=Ce(n,r,qt());if(t===`json`){A({registry:bt(),...n.updatedAt?{updatedAt:n.updatedAt}:{},skills:i},t);return}if(i.length===0){k(`Skill registry is empty and no skills are installed locally.`);return}let a=i.map(e=>[e.name,e.status,e.publishedAt?e.publishedAt.slice(0,19).replace(`T`,` `):`-`,Zk(e.description)]);for(let e of Hr([`NAME`,`STATUS`,`UPDATEDAT`,`DESCRIPTION`],a))k(e)}});const $k=`json`,eA={success:`success`,partial:`partial`,failed:`failed`};var tA=w({description:{"en-US":`Install all bailian-* skills (one-shot bootstrap for new environments)`,"zh-CN":`安装全部 bailian-* Skill(用于新环境的一次性初始化)`},auth:`none`,usageArgs:``,exampleArgs:[``],notes:[{"en-US":"Fetches the registry index and installs every skill whose name starts with `bailian-`.","zh-CN":"获取 Registry 索引并安装名称以 `bailian-` 开头的所有 Skill。"},{"en-US":"Equivalent to: `bl skill add --all` (filtered to `bailian-*` skills).","zh-CN":"等价于:`bl skill add --all`(筛选为 `bailian-*` Skill)。"}],async run(e){let t=e.settings.outputExplicit?e.settings.output:$k,r=await $e(),i=Object.keys(r.skills).filter(e=>e.startsWith(`bailian-`)),a=Be();if(e.settings.dryRun){A({action:`skill.init`,skills:i.map(e=>({name:e,links:qk(e,a)})),agents:Gk(a)},t);return}let o=Dn(),s=i.map(e=>async()=>{let t=r.skills[e];try{let n=await Ot(e,t,a,o.skills[e]?.links??[]);return o.skills[e]=n.lockEntry,{name:e,status:eA.success}}catch(t){return{name:e,status:eA.failed,reason:t instanceof Error?t.message:String(t)}}}),c=await Hn(s,3);wr(o);let l=c.filter(e=>e.status===eA.success),u=c.filter(e=>e.status===eA.failed),d=u.length===0?eA.success:l.length===0?eA.failed:eA.partial;if(t===$k){let e=a.map(e=>e.id),n={status:d,skills:l.map(e=>e.name)};u.length>0&&(n.failed=u.map(t=>({name:t.name,reason:t.reason,agents:e}))),A(n,t)}else if(c.length===0)k(`No bailian-* skills found in the registry.`);else if(k(d===eA.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 n(`${u.length}/${c.length} skill(s) failed to install`,f.GENERAL,`Check the reason for failed skills in the output; network failures can be retried with bl skill init`)}});const nA=[{id:`code-interpreter`,imageName:`代码解释器`,imageUrl:`fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/code-interpreter-v1:v0.0.44`,icon:`https://img.alicdn.com/imgextra/i2/O1CN01iX8RH9ckFvC093x2_!!6000000000905-2-tps-72-72.png`,description:{"en-US":`Python / Node.js runtimes with common data-processing libraries`,"zh-CN":`Python / Node.js 运行时+常用数据处理库`}},{id:`browser`,imageName:`浏览器`,imageUrl:`fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/browser:v0.0.44`,icon:`https://img.alicdn.com/imgextra/i4/O1CN01ShCbPEunrRI093x2_!!6000000000155-2-tps-72-72.png`,description:{"en-US":`Chromium and a visual desktop for clicking, filling forms, and screenshots`,"zh-CN":`Chromium +可视化桌面,支持点击/ 填表/截图`}},{id:`all-in-one`,imageName:`全能型`,imageUrl:`fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/all-in-one:v0.0.44`,icon:`https://img.alicdn.com/imgextra/i1/O1CN01smhklUahsyE093x2_!!6000000006657-2-tps-72-72.png`,description:{"en-US":`Code execution and browser capabilities together`,"zh-CN":`代码执行+浏览器双能力`}}],rA=nA.flatMap(e=>[e.id,e.imageName]),iA=nA.map(e=>({"en-US":`${e.id} (${e.imageName}): ${e.description[`en-US`]}. ${e.imageUrl}`,"zh-CN":`${e.id}(${e.imageName}):${e.description[`zh-CN`]}。${e.imageUrl}`}));function aA(e){let t=nA.find(t=>t.id===e||t.imageName===e);if(!t)throw new C(`Unknown built-in image / 未知内置镜像: ${e}. ${rA.join(`, `)}`);return t}const oA=w({description:{"en-US":`List the built-in Sandbox base images (offline)`,"zh-CN":`列出 CLI 内置的 Sandbox 基础镜像(离线)`},auth:`none`,exampleArgs:[``,`--output json`,`--quiet`],notes:[{"en-US":`Use a preset ID or Chinese name with template create/update --image. These are pinned cn-beijing images; other environments may differ. Use --from-image for a custom image.`,"zh-CN":`在 template create/update 中通过 --image 传入预设 ID 或中文名。这些是固定版本的 cn-beijing 镜像,其他环境可能不同;自定义镜像使用 --from-image。`},...iA],async run(e){if(e.settings.quiet){for(let e of nA)k(e.id);return}if(T(e.settings.output)===`json`){A(nA,`json`);return}for(let e of nA)k(`${e.id} (${e.imageName})`),k(` ${e.imageUrl}`),k(` ${e.description[`en-US`]} / ${e.description[`zh-CN`]}`)}}),sA={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID for the default Sandbox endpoint; optional with a configured base URL`,"zh-CN":`默认 Sandbox Endpoint 的 Workspace ID;已配置 Base URL 时可省略`}}},cA={body:{type:`string`,valueHint:`<json|@path>`,description:{"en-US":`JSON request body, inline or loaded from an @file path; explicit flags override it`,"zh-CN":`JSON 请求体,可内联或从 @文件路径读取;显式 Flag 优先`}}},lA={instanceTimeout:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Sandbox lifetime after this operation (300-604800 seconds)`,"zh-CN":`本次操作后的 Sandbox 存活时间(300–604800 秒)`}}},uA={showCredentials:{type:`switch`,description:{"en-US":`Print envd and traffic access tokens instead of redacting them`,"zh-CN":`输出 envd 与流量访问 Token 原值,不进行脱敏`}}},dA={pollInterval:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Template build polling interval (default: 5 seconds)`,"zh-CN":`模版构建轮询间隔(默认:5 秒)`}}},fA=[{"en-US":`Auth: uses a Bailian API Key as an Authorization Bearer token; no E2B key is sent.`,"zh-CN":`鉴权:使用百炼 API Key 作为 Authorization Bearer Token;不会发送 E2B Key。`},{"en-US":`Base URL: --base-url > DASHSCOPE_BASE_URL > login/profile base_url. The CLI uses its origin and appends /api/v1/agentstudio/sandbox; otherwise it uses the workspace-scoped cn-beijing endpoint.`,"zh-CN":`Base URL 优先级:--base-url > DASHSCOPE_BASE_URL > 登录/Profile 的 base_url。CLI 取其 origin 并追加 /api/v1/agentstudio/sandbox;未配置时使用工作空间的 cn-beijing Endpoint。`},{"en-US":`Without a configured base URL, workspace is required: --workspace-id > BAILIAN_WORKSPACE_ID > config workspace_id.`,"zh-CN":`未配置 Base URL 时必须提供 Workspace:--workspace-id > BAILIAN_WORKSPACE_ID > 配置项 workspace_id。`},{"en-US":`Sandbox is currently available in cn-beijing only and requires prior SLR authorization.`,"zh-CN":`Sandbox 当前仅支持 cn-beijing,首次使用前需完成 SLR 授权。`},{"en-US":`Global --timeout limits HTTP requests and total template-build polling; --instance-timeout maps to the Sandbox API lifetime field.`,"zh-CN":`全局 --timeout 限制 HTTP 请求和模版构建总轮询时间;--instance-timeout 映射到 Sandbox API 的实例存活时间字段。`}];function pA(e,t){return e.client.url(Un(t),()=>Wn(mA(e)))}function mA(e){let t=e.flags.workspaceId||e.settings.workspaceId;if(!t)throw new n(`Workspace ID is required when no base URL is configured. / 未配置 Base URL 时必须提供 Workspace ID。`,f.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID, configure workspace_id, or set --base-url. / 请传入 --workspace-id、设置 BAILIAN_WORKSPACE_ID 或 workspace_id 配置,或通过 --base-url 指定地址。`);return t}function hA(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw new n(`${t} must contain a JSON object.`,f.USAGE);return e}async function gA(e){if(!e)return{};let t=e.startsWith(`@`)?e.slice(1):void 0;if(t!==void 0&&t.length===0)throw new n(`--body @path must include a file path.`,f.USAGE);let r=t===void 0?e:await Ki(t,`utf8`);try{return hA(JSON.parse(r),t?`Body file ${t}`:`--body`)}catch(e){throw e instanceof n?e:e instanceof SyntaxError?new n(t?`Body file ${t} contains invalid JSON.`:`--body contains invalid JSON.`,f.USAGE):e}}function Q(e,t,n){n!==void 0&&(e[t]=n)}function _A(e,t){let r={};for(let i of e??[]){let e=i.indexOf(`=`);if(e<=0)throw new n(`${t} values must use KEY=VALUE format.`,f.USAGE);let a=i.slice(0,e).trim();if(!a)throw new n(`${t} values must include a non-empty key.`,f.USAGE);r[a]=i.slice(e+1)}return r}function vA(e,t,n){if(Object.keys(n).length===0)return;let r=e[t];e[t]={...typeof r==`object`&&r&&!Array.isArray(r)?r:{},...n}}function yA(e,t,r,i){if(e!==void 0&&(typeof e!=`number`||!Number.isInteger(e)||e<r||e>i))throw new n(`${t} must be an integer between ${r} and ${i}.`,f.USAGE)}function bA(e,t){if(typeof e!=`number`||!Number.isInteger(e)||e<=0)throw new n(`${t} must be a positive integer.`,f.USAGE)}const xA=/* @__PURE__ */ new Set([`envdAccessToken`,`trafficAccessToken`]),SA=/(?:token|secret|password|credential|api[_-]?key)/i;function CA(e,t){if(Array.isArray(e))return e.map(e=>CA(e,t));if(typeof e!=`object`||!e)return e;let n={};for(let[r,i]of Object.entries(e)){if(xA.has(r)||SA.test(r)||t&&(r===`envVars`||r===`envConfig`)){n[r]=i==null?i:(r===`envVars`||r===`envConfig`)&&typeof i==`object`&&!Array.isArray(i)?Object.fromEntries(Object.keys(i).map(e=>[e,`[REDACTED]`])):`[REDACTED]`;continue}n[r]=CA(i,t)}return n}function wA(e){return CA(e,!1)}function TA(e){return CA(e,!0)}function $(e){return e==null||e===``?`-`:Array.isArray(e)?e.join(`,`):typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:JSON.stringify(e)??`-`}const EA=`sandbox_template`,DA=w({description:{"en-US":`Upload a workspace file for Sandbox template mounts`,"zh-CN":`上传工作空间文件,供 Sandbox 模版挂载使用`},auth:`apiKey`,usageArgs:`--path <path> [--filename <name>] [--mime-type <type>]`,flags:{...sA,path:{type:`string`,valueHint:`<path>`,required:!0,description:{"en-US":`Local file path`,"zh-CN":`本地文件路径`}},filename:{type:`string`,valueHint:`<name>`,description:{"en-US":`Remote filename override`,"zh-CN":`覆盖远端文件名`}},mimeType:{type:`string`,valueHint:`<type>`,description:{"en-US":`Multipart file MIME type (default: application/octet-stream)`,"zh-CN":`Multipart 文件部分的 MIME 类型(默认:application/octet-stream)`}}},exampleArgs:[`--path ./config.json --output json`,`--path ./config.json --quiet`,`--path ./notes.txt --filename notes.txt --mime-type text/plain --dry-run --output json`],notes:[{"en-US":`POST /api/v1/agentstudio/files with multipart fields file and source=sandbox_template. Uses a Bailian Bearer API Key, not Console authentication or an E2B key; no agents.yaml is needed.`,"zh-CN":`向 /api/v1/agentstudio/files 发送 multipart 字段 file 和 source=sandbox_template。使用百炼 Bearer API Key,不使用 Console 鉴权或 E2B Key;无需 agents.yaml。`},{"en-US":`Base URL follows Sandbox: --base-url > DASHSCOPE_BASE_URL > login/profile base_url. Without one, --workspace-id > BAILIAN_WORKSPACE_ID > config workspace_id selects the cn-beijing origin. The upload path has no /sandbox prefix.`,"zh-CN":`Base URL 沿用 Sandbox:--base-url > DASHSCOPE_BASE_URL > 登录/Profile 的 base_url。未配置时,按 --workspace-id > BAILIAN_WORKSPACE_ID > 配置项 workspace_id 选择 cn-beijing 地址。上传路径不带 /sandbox 前缀。`},{"en-US":`Returns the upload response immediately; --quiet prints only its id. Upload does not wait for security review: status=checking is not ready to mount. Use an available file's id as mntConfig[].originFileId in template create/update --body, together with mountPath and optional originFileName, in the same workspace. This does not transfer files into a running instance.`,"zh-CN":`上传响应返回后立即输出,--quiet 仅输出 id。不会等待安全审核:status=checking 不代表已可挂载。在同一工作空间的 template create/update --body 中,将可用文件的 id 填入 mntConfig[].originFileId,同时传入 mountPath 和可选的 originFileName。此命令不向运行中的实例传文件。`},{"en-US":`--dry-run previews the endpoint, source, and local path without reading or uploading the file. The service detects the MIME type and enforces upload limits.`,"zh-CN":`--dry-run 仅预览 Endpoint、source 和本地路径,不读取或上传文件。MIME 类型检测和上传限制由服务端执行。`}],async run(e){let t=e.client.url(re(),()=>Wn(mA(e))),r=e.flags.filename??Ai(e.flags.path),i=e.flags.mimeType??`application/octet-stream`,a=T(e.settings.output);if(e.settings.dryRun){A({method:`POST`,endpoint:t,request:{source:EA,file:{path:e.flags.path,filename:r,mimeType:i}}},a);return}let o=new Uint8Array(await Ki(e.flags.path)),s=new FormData;s.append(`source`,EA),s.append(`file`,new Blob([o],{type:i}),r);let c=await e.client.requestJson({method:`POST`,path:t,body:s});if(!c||typeof c.id!=`string`||!c.id.trim())throw new n(`Upload response did not contain a File ID. / 上传响应未包含 File ID。`,f.GENERAL);e.settings.quiet?k(c.id):A(wA(c),a)}}),OA={sandboxId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Sandbox instance ID`,"zh-CN":`Sandbox 实例 ID`}}},kA={...sA,...cA,templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Ready template ID; may alternatively be supplied as templateID in --body`,"zh-CN":`已就绪的模版 ID;也可通过 --body 中的 templateID 提供`}},...lA,allowInternetAccess:{type:`boolean`,valueHint:`<bool>`,description:{"en-US":`Allow public internet access`,"zh-CN":`允许访问公网`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Instance metadata entry; repeat for multiple values`,"zh-CN":`实例 Metadata 键值;可重复传入`}},env:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Instance environment variable; repeat for multiple values`,"zh-CN":`实例环境变量;可重复传入`}},autoPause:{type:`boolean`,valueHint:`<bool>`,description:{"en-US":`Pause the instance when its timeout expires`,"zh-CN":`实例超时后自动暂停`}},autoResume:{type:`boolean`,valueHint:`<bool>`,description:{"en-US":`Automatically resume a paused instance when connecting`,"zh-CN":`连接已暂停实例时自动恢复`}},allowOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound allow-list entry; repeat for multiple values`,"zh-CN":`出站白名单条目;可重复传入`}},denyOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound deny-list entry; repeat for multiple values`,"zh-CN":`出站黑名单条目;可重复传入`}},maskRequestHost:{type:`string`,valueHint:`<host>`,description:{"en-US":`Override the outbound request Host header`,"zh-CN":`覆盖出站请求的 Host Header`}},...uA},AA={...sA,templateId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by template ID`,"zh-CN":`按模版 ID 筛选`}},sandboxId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Filter by sandbox ID`,"zh-CN":`按 Sandbox ID 筛选`}},state:{type:`string`,valueHint:`<state>`,description:{"en-US":`Filter by state, for example running or paused`,"zh-CN":`按状态筛选,例如 running 或 paused`}},limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum results (1-50)`,"zh-CN":`最大返回数量(1–50)`}}},jA={...sA,...OA,...uA},MA={...sA,...OA},NA={...sA,...OA,...cA,...lA,...uA};async function PA(e){let t=await gA(e.body);Q(t,`templateID`,e.templateId),Q(t,`timeout`,e.instanceTimeout),Q(t,`allow_internet_access`,e.allowInternetAccess),Q(t,`autoPause`,e.autoPause),Q(t,`autoResume`,e.autoResume),vA(t,`metadata`,_A(e.metadata,`--metadata`)),vA(t,`envVars`,_A(e.env,`--env`));let r={};if(Q(r,`allowOut`,e.allowOut),Q(r,`denyOut`,e.denyOut),Q(r,`maskRequestHost`,e.maskRequestHost),vA(t,`network`,r),typeof t.templateID!=`string`||t.templateID.trim().length===0)throw new n(`Sandbox create requires --template-id or templateID in --body.`,f.USAGE);return yA(t.timeout,`Sandbox timeout`,300,604800),t}async function FA(e){let t=await gA(e.body);return Q(t,`timeout`,e.instanceTimeout),yA(t.timeout,`Sandbox timeout`,300,604800),t}function IA(e,t){let n=t.showCredentials?e:wA(e);if(t.quiet){k($(e.sandboxID));return}A(n,t.format)}const LA=w({description:{"en-US":`Create a Sandbox instance`,"zh-CN":`创建 Sandbox 实例`},auth:`apiKey`,usageArgs:`(--template-id <id> | --body <json|@path>) [flags]`,flags:kA,exampleArgs:[`--template-id tpl-xxx --instance-timeout 3600`,`--template-id tpl-xxx --base-url https://workspace.cn-beijing.maas.aliyuncs.com`,`--body @sandbox.json --dry-run --output json`,`--template-id tpl-xxx --show-credentials --output json`],notes:fA,async run(e){let t=T(e.settings.output),n=pA(e,x.sandboxes),r=await PA(e.flags);if(e.settings.dryRun){A({method:`POST`,endpoint:n,request:TA(r)},t);return}IA(await e.client.requestJson({path:n,method:`POST`,body:r}),{format:t,quiet:e.settings.quiet,showCredentials:e.flags.showCredentials})}}),RA=w({description:{"en-US":`List Sandbox instances`,"zh-CN":`列出 Sandbox 实例`},auth:`apiKey`,usageArgs:`[--template-id <id>] [--sandbox-id <id>] [--state <state>] [--limit <n>]`,flags:AA,exampleArgs:[``,`--state running --limit 20`,`--template-id tpl-xxx --output json`],notes:fA,validate(e){if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>50))return`--limit must be an integer between 1 and 50.`},async run(e){let t=new URL(pA(e,x.sandboxList));e.flags.templateId&&t.searchParams.set(`templateID`,e.flags.templateId),e.flags.sandboxId&&t.searchParams.set(`sandboxID`,e.flags.sandboxId),e.flags.state&&t.searchParams.set(`state`,e.flags.state),e.flags.limit!==void 0&&t.searchParams.set(`limit`,String(e.flags.limit));let n=await e.client.requestJson({path:t.toString(),method:`GET`});if(e.settings.quiet){for(let e of n)k($(e.sandboxID));return}let r=T(e.settings.output);if(r===`json`){A(n,r);return}if(n.length===0){k(`No Sandbox instances found.`);return}let i=n.map(e=>[$(e.sandboxID),$(e.templateID),$(e.state),$(e.cpuCount),$(e.memoryMB),$(e.startedAt),$(e.endAt)]);for(let e of Hr([`ID`,`TEMPLATE`,`STATE`,`CPU`,`MEMORY_MB`,`STARTED_AT`,`END_AT`],i))k(e)}}),zA=w({description:{"en-US":`Get Sandbox instance details`,"zh-CN":`获取 Sandbox 实例详情`},auth:`apiKey`,usageArgs:`--sandbox-id <id> [--show-credentials]`,flags:jA,exampleArgs:[`--sandbox-id sbx-xxx`,`--sandbox-id sbx-xxx --show-credentials --output json`],notes:fA,async run(e){let t=pA(e,Kn(e.flags.sandboxId));IA(await e.client.requestJson({path:t,method:`GET`}),{format:T(e.settings.output),quiet:e.settings.quiet,showCredentials:e.flags.showCredentials})}});function BA(e){let t=e===`connect`?`Connect to`:`Resume`,n=e===`connect`?`连接`:`恢复`;return w({description:{"en-US":`${t} a Sandbox instance and return connection information`,"zh-CN":`${n} Sandbox 实例并返回连接信息`},auth:`apiKey`,usageArgs:`--sandbox-id <id> [--instance-timeout <seconds>] [--show-credentials]`,flags:NA,exampleArgs:[`--sandbox-id sbx-xxx --instance-timeout 3600`,`--sandbox-id sbx-xxx --show-credentials --output json`],notes:fA,async run(t){let n=T(t.settings.output),r=pA(t,Gn(t.flags.sandboxId,e)),i=await FA(t.flags);if(t.settings.dryRun){A({method:`POST`,endpoint:r,request:TA(i)},n);return}IA(await t.client.requestJson({path:r,method:`POST`,body:Object.keys(i).length>0?i:void 0}),{format:n,quiet:t.settings.quiet,showCredentials:t.flags.showCredentials})}})}const VA=BA(`connect`),HA=BA(`resume`),UA=w({description:{"en-US":`Pause a Sandbox instance`,"zh-CN":`暂停 Sandbox 实例`},auth:`apiKey`,usageArgs:`--sandbox-id <id>`,flags:MA,exampleArgs:[`--sandbox-id sbx-xxx`,`--sandbox-id sbx-xxx --dry-run --output json`],notes:fA,async run(e){let t=T(e.settings.output),n=pA(e,Gn(e.flags.sandboxId,`pause`));if(e.settings.dryRun){A({method:`POST`,endpoint:n,request:null},t);return}await(await e.client.request({path:n,method:`POST`})).body?.cancel(),e.settings.quiet?k(e.flags.sandboxId):A({sandboxID:e.flags.sandboxId,paused:!0},t)}}),WA=w({description:{"en-US":`Release a Sandbox instance`,"zh-CN":`释放 Sandbox 实例`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently releases the Sandbox instance and cannot be undone.`,"zh-CN":`该操作会永久释放 Sandbox 实例,且无法撤销。`}},usageArgs:`--sandbox-id <id>`,flags:MA,exampleArgs:[`--sandbox-id sbx-xxx --dry-run`,`--sandbox-id sbx-xxx --yes`],notes:fA,async run(e){let t=T(e.settings.output),n=pA(e,Kn(e.flags.sandboxId));if(e.settings.dryRun){A({method:`DELETE`,endpoint:n,request:null},t);return}await(await e.client.request({path:n,method:`DELETE`})).body?.cancel(),e.settings.quiet?k(e.flags.sandboxId):A({sandboxID:e.flags.sandboxId,deleted:!0},t)}}),GA={async:{type:`switch`,description:{"en-US":`Return the submitted templateID/buildID immediately without polling`,"zh-CN":`提交后立即返回 templateID/buildID,不轮询构建状态`}}},KA={templateId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Sandbox template ID`,"zh-CN":`Sandbox 模版 ID`}}},qA={image:{type:`string`,valueHint:`<preset>`,choices:rA,description:{"en-US":`Built-in image ID or Chinese name; fills fromImage and imageName`,"zh-CN":`内置镜像 ID 或中文名;自动填写 fromImage 和 imageName`}},name:{type:`string`,valueHint:`<name>`,description:{"en-US":`Template name`,"zh-CN":`模版名称`}},cpuCount:{type:`number`,valueHint:`<cores>`,description:{"en-US":`vCPU count`,"zh-CN":`vCPU 核数`}},memoryMb:{type:`number`,valueHint:`<mb>`,description:{"en-US":`Memory in MB`,"zh-CN":`内存大小(MB)`}},fromImage:{type:`string`,valueHint:`<image>`,description:{"en-US":`Base image identifier`,"zh-CN":`基础镜像标识`}},imageName:{type:`string`,valueHint:`<name>`,description:{"en-US":`Base image display name`,"zh-CN":`基础镜像展示名称`}},env:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Template environment variable; repeat for multiple values`,"zh-CN":`模版环境变量;可重复传入`}},allowOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound allow-list entry; repeat for multiple values`,"zh-CN":`出站白名单条目;可重复传入`}},denyOut:{type:`array`,valueHint:`<address>`,description:{"en-US":`Outbound deny-list entry; repeat for multiple values`,"zh-CN":`出站黑名单条目;可重复传入`}},autoPauseTime:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Automatically pause after 300-604800 seconds`,"zh-CN":`在 300–604800 秒后自动暂停`}},maxRunningTime:{type:`number`,valueHint:`<seconds>`,description:{"en-US":`Maximum running lifetime in seconds (300-604800)`,"zh-CN":`最大运行时间(秒,300–604800)`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Template description`,"zh-CN":`模版描述`}}},JA={...sA,...cA,...qA,tag:{type:`array`,valueHint:`<tag>`,description:{"en-US":`E2B tag; repeat for multiple values`,"zh-CN":`E2B Tag;可重复传入`}},alias:{type:`string`,valueHint:`<alias>`,description:{"en-US":`E2B template alias`,"zh-CN":`E2B 模版别名`}},...GA,...dA},YA={...sA,...KA,...cA,...qA,...GA,...dA},XA={...sA,limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Maximum results (1-100)`,"zh-CN":`最大返回数量(1–100)`}},cursor:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Server-side pagination cursor`,"zh-CN":`服务端分页 Cursor`}}},ZA={...sA,...KA},QA={...sA,...KA,buildId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Template build ID`,"zh-CN":`模版构建 ID`}}};function $A(e,t){if(t.image!==void 0){let n=aA(t.image);e.fromImage=n.imageUrl,e.imageName=n.imageName}Q(e,`name`,t.name),Q(e,`cpuCount`,t.cpuCount),Q(e,`memoryMB`,t.memoryMb),Q(e,`fromImage`,t.fromImage),Q(e,`imageName`,t.imageName),Q(e,`autoPauseTime`,t.autoPauseTime),Q(e,`maxRunningTimeout`,t.maxRunningTime),Q(e,`description`,t.description),vA(e,`envConfig`,_A(t.env,`--env`));let n={};Q(n,`allowOut`,t.allowOut),Q(n,`denyOut`,t.denyOut),vA(e,`networkConfig`,n)}function ej(e,t){if(t&&(typeof e.name!=`string`||e.name.trim().length===0))throw new n(`Template create requires --name or name in --body.`,f.USAGE);let r=e.cpuCount!==void 0,i=e.memoryMB!==void 0;if(t&&(!r||!i))throw new n(`Template create requires both --cpu-count and --memory-mb, or their --body fields.`,f.USAGE);if(r!==i)throw new n(`cpuCount and memoryMB must be provided together.`,f.USAGE);if(r&&bA(e.cpuCount,`cpuCount`),i&&bA(e.memoryMB,`memoryMB`),yA(e.autoPauseTime,`autoPauseTime`,300,604800),yA(e.maxRunningTimeout,`maxRunningTimeout`,300,604800),!t&&Object.keys(e).length===0)throw new n(`Template update requires at least one field.`,f.USAGE)}async function tj(e){let t=await gA(e.body);return $A(t,e),Q(t,`tags`,e.tag),Q(t,`alias`,e.alias),ej(t,!0),t}async function nj(e){let t=await gA(e.body);return $A(t,e),ej(t,!1),t}async function rj(e,t,r,i){let a=Date.now()+t.timeout*1e3,o=Nr(`Waiting for template build...`);t.quiet||o.start();try{for(;;){let s=a-Date.now();if(s<=0)break;let c=await e.requestJson({path:r,method:`GET`,timeout:s/1e3});if(t.quiet||o.update(`Build status: ${c.status??`unknown`}`),c.status===`ready`)return o.stop(`Template build ready.`),c;if(c.status===`error`){o.stop(`Template build failed.`);let e=c.reason?.message??(c.reason?.code===void 0?`Template build failed.`:`${c.reason.code}`);throw new n(e,f.GENERAL)}let l=Math.min(i*1e3,a-Date.now());l>0&&await new Promise(e=>setTimeout(e,l))}}finally{o.stop()}throw new n(`Template build polling timed out.`,f.TIMEOUT,`Increase --timeout or query the build status command with the returned IDs.`)}function ij(e){if(e.pollInterval!==void 0&&(!Number.isInteger(e.pollInterval)||e.pollInterval<=0))return`--poll-interval must be a positive integer.`}async function aj(e){let t=T(e.settings.output);if(!e.response.templateID||!e.response.buildID)throw new n(`Template mutation response is missing templateID or buildID.`,f.GENERAL);if(e.async){e.settings.quiet?k(`${e.response.templateID}\t${e.response.buildID}`):A(e.response,t);return}let r=new URL(Un(qn(e.response.templateID,e.response.buildID)),e.endpoint).toString(),i;try{i=await rj(e.client,e.settings,r,e.pollInterval??5)}catch(r){let i=`Submitted build / 已提交的构建: templateID=${e.response.templateID}, buildID=${e.response.buildID}.\nCheck this build with sandbox template build-status before submitting another build. / 请先通过 sandbox template build-status 查询本次构建,再决定是否重新提交。`;if(r instanceof n)throw new n(r.message,r.exitCode,[r.hint,i].filter(Boolean).join(`
2880
+ `),{api:r.api,rawResponse:r.rawResponse,cause:r.cause});let a={templateID:e.response.templateID,buildID:e.response.buildID,hint:i};throw process.stderr.write(t===`json`?`${JSON.stringify(a,null,2)}\n\n`:`${i}\n`),r}e.settings.quiet?k($(e.response.templateID)):A({template:e.response,build:i},t)}const oj=w({description:{"en-US":`Create a Sandbox template`,"zh-CN":`创建 Sandbox 模版`},auth:`apiKey`,usageArgs:`(--name <name> --cpu-count <cores> --memory-mb <mb> | --body <json|@path>) [flags]`,flags:JA,exampleArgs:[`--name browser --image browser --cpu-count 1 --memory-mb 2048`,`--name python --cpu-count 1 --memory-mb 2048`,`--body @template.json --async --output json`,`--name browser --cpu-count 4 --memory-mb 8192 --dry-run --output json`],notes:[...fA,...iA,{"en-US":`--image overrides body fromImage/imageName; explicit --from-image/--image-name override the corresponding preset fields. Without --image, image behavior is unchanged.`,"zh-CN":`--image 覆盖 body 中的 fromImage/imageName;显式 --from-image/--image-name 再覆盖对应预设字段。不传 --image 时保持原有镜像行为。`},{"en-US":`For local file mounts, use sandbox file upload first; put the available file's id into --body mntConfig[].originFileId with mountPath and optional originFileName. Upload and template must use the same workspace. Other complete nested structures can also be supplied through --body.`,"zh-CN":`挂载本地文件前先调用 sandbox file upload;将可用文件的 id 填入 --body 的 mntConfig[].originFileId,并传入 mountPath 和可选的 originFileName。上传和模版须位于同一工作空间。其他完整嵌套结构也可通过 --body 提供。`},{"en-US":`By default the command waits for build status ready; --async returns the submitted build immediately.`,"zh-CN":`默认等待构建状态变为 ready;--async 会立即返回已提交的构建信息。`}],validate:ij,async run(e){let t=T(e.settings.output),n=pA(e,x.templateCreate),r=await tj(e.flags);if(e.settings.dryRun){A({method:`POST`,endpoint:n,request:TA(r)},t);return}await aj({response:await e.client.requestJson({path:n,method:`POST`,body:r}),endpoint:n,client:e.client,settings:e.settings,async:e.flags.async,pollInterval:e.flags.pollInterval})}}),sj=w({description:{"en-US":`List Sandbox templates`,"zh-CN":`列出 Sandbox 模版`},auth:`apiKey`,usageArgs:`[--limit <n>] [--cursor <cursor>]`,flags:XA,exampleArgs:[``,`--limit 100 --output json`],notes:[...fA,{"en-US":`The API response does not expose a next cursor, so automatic --all pagination is unavailable.`,"zh-CN":`API 响应未提供下一页 Cursor,因此不支持自动 --all 翻页。`}],validate(e){if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>100))return`--limit must be an integer between 1 and 100.`},async run(e){let t=new URL(pA(e,x.templateList));e.flags.limit!==void 0&&t.searchParams.set(`limit`,String(e.flags.limit)),e.flags.cursor&&t.searchParams.set(`cursor`,e.flags.cursor);let n=await e.client.requestJson({path:t.toString(),method:`GET`});if(e.settings.quiet){for(let e of n)k($(e.templateID));return}let r=T(e.settings.output);if(r===`json`){A(n,r);return}if(n.length===0){k(`No Sandbox templates found.`);return}let i=n.map(e=>[$(e.templateID),$(e.templateName),$(e.cpuCount),$(e.memoryMB),$(e.spawnCount),$(e.buildCount),$(e.updatedAt)]);for(let e of Hr([`ID`,`NAME`,`CPU`,`MEMORY_MB`,`INSTANCES`,`BUILDS`,`UPDATED_AT`],i))k(e)}}),cj=w({description:{"en-US":`Get Sandbox template details`,"zh-CN":`获取 Sandbox 模版详情`},auth:`apiKey`,usageArgs:`--template-id <id>`,flags:ZA,exampleArgs:[`--template-id tpl-xxx`,`--template-id tpl-xxx --output json`],notes:fA,async run(e){let t=pA(e,Jn(e.flags.templateId)),n=await e.client.requestJson({path:t,method:`GET`});e.settings.quiet?k($(n.templateID)):A(n,T(e.settings.output))}}),lj=w({description:{"en-US":`Update a Sandbox template`,"zh-CN":`更新 Sandbox 模版`},auth:`apiKey`,usageArgs:`--template-id <id> (--body <json|@path> | [fields])`,flags:YA,exampleArgs:[`--template-id tpl-xxx --image all-in-one`,`--template-id tpl-xxx --cpu-count 4 --memory-mb 8192`,`--template-id tpl-xxx --body @template-update.json --async --output json`,`--template-id tpl-xxx --description updated --dry-run --output json`],notes:[...fA,...iA,{"en-US":`--image overrides body fromImage/imageName; explicit --from-image/--image-name override the corresponding preset fields. Without --image, image behavior is unchanged.`,"zh-CN":`--image 覆盖 body 中的 fromImage/imageName;显式 --from-image/--image-name 再覆盖对应预设字段。不传 --image 时保持原有镜像行为。`},{"en-US":`Supplying envConfig or --env replaces the template's complete environment map.`,"zh-CN":`传入 envConfig 或 --env 会整体替换模版的环境变量 Map。`},{"en-US":`Use sandbox file upload for local mount files. In --body mntConfig[], set originFileId to the available file's id and supply mountPath; upload and template must use the same workspace.`,"zh-CN":`本地挂载文件先通过 sandbox file upload 上传。在 --body 的 mntConfig[] 中,将 originFileId 设为可用文件的 id 并传入 mountPath;上传和模版须位于同一工作空间。`},{"en-US":`By default the command waits for build status ready; --async returns the submitted build immediately.`,"zh-CN":`默认等待构建状态变为 ready;--async 会立即返回已提交的构建信息。`}],validate:ij,async run(e){let t=T(e.settings.output),n=pA(e,Jn(e.flags.templateId)),r=await nj(e.flags);if(e.settings.dryRun){A({method:`PUT`,endpoint:n,request:TA(r)},t);return}await aj({response:await e.client.requestJson({path:n,method:`PUT`,body:r}),endpoint:n,client:e.client,settings:e.settings,async:e.flags.async,pollInterval:e.flags.pollInterval})}}),uj=w({description:{"en-US":`Get Sandbox template build status`,"zh-CN":`获取 Sandbox 模版构建状态`},auth:`apiKey`,usageArgs:`--template-id <id> --build-id <id>`,flags:QA,exampleArgs:[`--template-id tpl-xxx --build-id build-xxx`,`--template-id tpl-xxx --build-id build-xxx --output json`],notes:fA,async run(e){let t=pA(e,qn(e.flags.templateId,e.flags.buildId)),n=await e.client.requestJson({path:t,method:`GET`});e.settings.quiet?k($(n.status)):A(n,T(e.settings.output))}}),dj=w({description:{"en-US":`Delete a Sandbox template`,"zh-CN":`删除 Sandbox 模版`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently deletes the Sandbox template and cannot be undone.`,"zh-CN":`该操作会永久删除 Sandbox 模版,且无法撤销。`}},usageArgs:`--template-id <id>`,flags:ZA,exampleArgs:[`--template-id tpl-xxx --dry-run`,`--template-id tpl-xxx --yes`],notes:[...fA,{"en-US":`The server rejects deletion while running or paused instances still use the template.`,"zh-CN":`仍有运行中或已暂停实例使用该模版时,服务端会拒绝删除。`}],async run(e){let t=T(e.settings.output),n=pA(e,Jn(e.flags.templateId));if(e.settings.dryRun){A({method:`DELETE`,endpoint:n,request:null},t);return}await(await e.client.request({path:n,method:`DELETE`})).body?.cancel(),e.settings.quiet?k(e.flags.templateId):A({templateID:e.flags.templateId,deleted:!0},t)}});var fj=w({description:{"en-US":`Declare and create a Memory Store through scoped YAML apply`,"zh-CN":`通过定向 YAML Apply 声明并创建记忆库`},auth:`apiKey`,flags:{name:{type:`string`,valueHint:`<name>`,required:!0,description:{"en-US":`Memory Store display name; generates a YAML key`,"zh-CN":`Memory Store 显示名称;自动生成 YAML key`}},description:{type:`string`,valueHint:`<text>`,description:{"en-US":`Store description (default: empty)`,"zh-CN":`记忆库描述(默认:空)`}},metadata:{type:`array`,valueHint:`<key=value>`,description:{"en-US":`Metadata entry (repeatable)`,"zh-CN":`Metadata 条目(可重复)`}},entry:{type:`array`,valueHint:`<json|@path>`,description:{"en-US":`Initial entry JSON with key and content (repeatable)`,"zh-CN":`含 key、content 的初始化条目 JSON(可重复)`}},file:{type:`string`,valueHint:`<path>`,description:{"en-US":`Config file path (default: agents.yaml)`,"zh-CN":`配置文件路径(默认:agents.yaml)`}},yes:{type:`switch`,description:{"en-US":`Write YAML and run the scoped remote create`,"zh-CN":`写入 YAML 并执行定向远端创建`}}},usageArgs:`--name <name> [--description <text>] [--metadata <key=value>...] [--entry <json|@path>...] [--file <path>] [--yes]`,exampleArgs:[`--name Notes`,{"en-US":`--name Notes --entry '{"key":"notes.md","content":"Initial notes"}' --dry-run`,"zh-CN":`--name Notes --entry '{"key":"notes.md","content":"初始笔记"}' --dry-run`}],notes:[...G,...HT,{"en-US":`Store lifecycle is managed by agents.yaml. Entries initialize new stores; existing content is preserved unless entries_mode: sync is explicitly configured.`,"zh-CN":`记忆库生命周期由 agents.yaml 管理。entries 仅初始化新库;只有显式配置 entries_mode: sync 才持续同步已有正文。`}],validate:e=>e.name.trim()?void 0:`--name must not be empty. / --name 不能为空。`,async run(e){let t=(await ZT(e.flags.entry,`entry`)).map(e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`Each --entry must be a JSON object. / 每个 --entry 必须为 JSON 对象。`,f.USAGE);let t=e;if(typeof t.key!=`string`||!t.key.trim()||typeof t.content!=`string`)throw new n(`Each --entry requires a non-empty key and string content. / 每个 --entry 必须包含非空 key 和字符串 content。`,f.USAGE);return{key:t.key,content:t.content}}),r=await KT(e,e.flags.file??`agents.yaml`),i={name:e.flags.name.trim(),description:e.flags.description??``,provider:r.provider,metadata:XT(e.flags.metadata),...t.length?{entries:t}:{}},a=await qT({project:r,group:`memory_stores`,rawDeclaration:i});await JT({host:e,project:r,group:`memory_stores`,resourceType:`memory_store`,displayName:e.flags.name.trim(),rawDeclaration:i,resolvedDeclaration:a,existingDeclarations:r.config.memory_stores??{},effectiveName:(e,t)=>typeof t.name==`string`?t.name:e,fallbackKey:`memory-store`,yes:e.flags.yes})}});const pj={workspaceId:{type:`string`,valueHint:`<id>`,description:{"en-US":`Workspace ID; optional with a configured Base URL`,"zh-CN":`Workspace ID;已配置 Base URL 时可省略`}}},mj={...pj,storeId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote Memory Store ID`,"zh-CN":`远端记忆库 ID`}}},hj={...mj,memoryId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote Memory ID`,"zh-CN":`远端记忆条目 ID`}}},gj={...mj,versionId:{type:`string`,valueHint:`<id>`,required:!0,description:{"en-US":`Remote Memory Version ID`,"zh-CN":`远端记忆版本 ID`}}},_j={limit:{type:`number`,valueHint:`<n>`,description:{"en-US":`Page size (1–100)`,"zh-CN":`单页数量(1–100)`}},page:{type:`string`,valueHint:`<cursor>`,description:{"en-US":`Opaque next_page cursor from the previous response`,"zh-CN":`上次响应中的不透明 next_page 游标`}}},vj={view:{type:`string`,valueHint:`<basic|full>`,choices:[`basic`,`full`],description:{"en-US":`Response view (basic or full)`,"zh-CN":`响应视图(basic 或 full)`}}},yj={content:{type:`string`,valueHint:`<text>`,description:{"en-US":`Memory content; an empty string is allowed`,"zh-CN":`记忆正文;允许空字符串`}},contentFile:{type:`string`,valueHint:`<path>`,description:{"en-US":`Read UTF-8 content from a local file; exclusive with --content`,"zh-CN":`从本地文件读取 UTF-8 正文;与 --content 互斥`}}},bj={path:{type:`string`,valueHint:`<path>`,description:{"en-US":`Memory file path`,"zh-CN":`记忆文件路径`}}},xj={expectedContentSha256:{type:`string`,valueHint:`<sha256>`,description:{"en-US":`Expected current SHA-256; reject a concurrent content change`,"zh-CN":`预期当前 SHA-256;并发内容变化时拒绝更新`}}},Sj=[{"en-US":`Calls the SDK with the CLI API Key and workspace settings; no agents.yaml or State is required for reading stores or managing their contents.`,"zh-CN":`使用 CLI API Key 和工作空间配置调用 SDK;查询记忆库和管理正文无需 agents.yaml 或 State。`},{"en-US":`Store lifecycle remains in agents.yaml. Pass the remote Store ID to these API commands and pass next_page back unchanged.`,"zh-CN":`记忆库生命周期仍由 agents.yaml 管理。这些 API 命令使用远端 Store ID;next_page 游标保持原样传回。`}],Cj={level:`high`,message:{"en-US":`This changes persistent memory content. Review the dry-run request before confirming.`,"zh-CN":`该操作会修改持久化记忆正文。请先核对 dry-run 请求,再确认执行。`}};function wj(e,t=100){for(let[t,n]of Object.entries({"workspace-id":e.workspaceId,"store-id":e.storeId,"memory-id":e.memoryId,"version-id":e.versionId,page:e.page,path:e.path,"content-file":e.contentFile}))if(n!==void 0&&!n.trim())return`--${t} must not be empty. / --${t} 不能为空。`;if(e.limit!==void 0&&(!Number.isInteger(e.limit)||e.limit<1||e.limit>t))return`--limit must be an integer from 1 to ${t}. / --limit 必须为 1–${t} 的整数。`;if(e.depth!==void 0&&(!Number.isInteger(e.depth)||e.depth<0))return`--depth must be a non-negative integer. / --depth 必须为非负整数。`;if(e.content!==void 0&&e.contentFile!==void 0)return`--content and --content-file are mutually exclusive. / --content 与 --content-file 互斥。`;if(e.expectedContentSha256!==void 0&&!/^[a-fA-F0-9]{64}$/.test(e.expectedContentSha256))return`--expected-content-sha256 requires 64 hexadecimal characters. / --expected-content-sha256 必须为 64 位十六进制字符串。`;for(let t of[e.createdAtGte,e.createdAtLte])if(t!==void 0&&(!t.trim()||!Number.isFinite(Date.parse(t))))return`Created-at filters must be valid timestamps. / created-at 筛选条件必须为有效时间戳。`;if(e.createdAtGte&&e.createdAtLte&&Date.parse(e.createdAtGte)>Date.parse(e.createdAtLte))return`--created-at-gte must not be after --created-at-lte. / --created-at-gte 不能晚于 --created-at-lte。`}async function Tj(e){return e.contentFile===void 0?e.content:Ki(e.contentFile,`utf8`)}async function Ej(e,t,n,r){let i=T(e.settings.output),a=e.settings.dryRun?{operation:t,provider:`bailian`,base_url:lk(e),...n}:await q(()=>J(()=>r(uk(e))));i===`json`?A(a,i):k(JSON.stringify(a,null,2))}const Dj=w({description:{"en-US":`List Memory Stores`,"zh-CN":`列出记忆库`},auth:`apiKey`,flags:{...pj,..._j,includeArchived:{type:`switch`,description:{"en-US":`Include archived stores`,"zh-CN":`包含已归档记忆库`}}},usageArgs:`[--workspace-id <id>] [--limit <n>] [--page <cursor>] [--include-archived]`,exampleArgs:[`--workspace-id ws-example --output json`],notes:Sj,validate:wj,async run(e){let t={limit:e.flags.limit,page:e.flags.page,include_archived:e.flags.includeArchived};await Ej(e,`memory-store.list`,{options:t},e=>Ha(e.providers,`bailian`,t))}}),Oj=w({description:{"en-US":`Get a Memory Store`,"zh-CN":`获取记忆库`},auth:`apiKey`,flags:mj,usageArgs:`--store-id <id> [--workspace-id <id>]`,exampleArgs:[`--workspace-id ws-example --store-id memstore_example`],notes:Sj,validate:wj,async run(e){await Ej(e,`memory-store.get`,{store_id:e.flags.storeId},t=>Oa(t.providers,`bailian`,e.flags.storeId))}}),kj=w({description:{"en-US":`Create a memory file`,"zh-CN":`创建记忆文件`},auth:`apiKey`,risk:Cj,flags:{...mj,...yj,path:{...bj.path,required:!0}},usageArgs:`--store-id <id> --path <path> (--content <text> | --content-file <path>)`,exampleArgs:[`--store-id memstore_example --path notes.md --content-file ./notes.md --dry-run`],notes:Sj,validate:e=>wj(e)??(e.content===void 0&&e.contentFile===void 0?`Pass --content or --content-file. / 请提供 --content 或 --content-file。`:void 0),async run(e){let t={path:e.flags.path,content:await Tj(e.flags)};await Ej(e,`memory-store.memories.create`,{store_id:e.flags.storeId,request:t},n=>ua(n.providers,`bailian`,e.flags.storeId,t))}}),Aj=w({description:{"en-US":`List memory files and prefixes`,"zh-CN":`列出记忆文件和目录前缀`},auth:`apiKey`,flags:{...mj,..._j,limit:{..._j.limit,description:{"en-US":`Page size (1–20)`,"zh-CN":`单页数量(1–20)`}},...vj,pathPrefix:{type:`string`,valueHint:`<prefix>`,description:{"en-US":`Filter by memory path prefix`,"zh-CN":`按记忆路径前缀筛选`}},depth:{type:`number`,valueHint:`<n>`,description:{"en-US":`Directory listing depth`,"zh-CN":`目录列举深度`}}},usageArgs:`--store-id <id> [--page <cursor>] [--limit <n>] [--path-prefix <prefix>] [--depth <n>] [--view <basic|full>]`,exampleArgs:[`--store-id memstore_example --path-prefix /notes/ --view full`],notes:Sj,validate:e=>wj(e,20),async run(e){let t={limit:e.flags.limit,page:e.flags.page,path_prefix:e.flags.pathPrefix,depth:e.flags.depth,view:e.flags.view};await Ej(e,`memory-store.memories.list`,{store_id:e.flags.storeId,options:t},n=>Va(n.providers,`bailian`,e.flags.storeId,t))}}),jj=w({description:{"en-US":`Get a memory file`,"zh-CN":`获取记忆文件`},auth:`apiKey`,flags:hj,usageArgs:`--store-id <id> --memory-id <id>`,exampleArgs:[`--store-id memstore_example --memory-id mem_example`],notes:Sj,validate:wj,async run(e){await Ej(e,`memory-store.memories.get`,{store_id:e.flags.storeId,memory_id:e.flags.memoryId},t=>Da(t.providers,`bailian`,e.flags.storeId,e.flags.memoryId))}}),Mj=w({description:{"en-US":`Update memory content with an optional SHA-256 precondition`,"zh-CN":`更新记忆正文,可使用 SHA-256 并发前置条件`},auth:`apiKey`,risk:Cj,flags:{...hj,...yj,...xj},usageArgs:`--store-id <id> --memory-id <id> (--content <text> | --content-file <path>) [--expected-content-sha256 <sha256>]`,exampleArgs:[`--store-id memstore_example --memory-id mem_example --content-file ./notes.md --dry-run`],notes:Sj,validate:e=>wj(e)??(e.content===void 0&&e.contentFile===void 0?`Pass --content or --content-file. / 请提供 --content 或 --content-file。`:void 0),async run(e){let t={content:await Tj(e.flags),...e.flags.expectedContentSha256===void 0?{}:{expected_content_sha256:e.flags.expectedContentSha256}};await Ej(e,`memory-store.memories.update`,{store_id:e.flags.storeId,memory_id:e.flags.memoryId,request:t},n=>To(n.providers,`bailian`,e.flags.storeId,e.flags.memoryId,t))}}),Nj=w({description:{"en-US":`Delete a memory file`,"zh-CN":`删除记忆文件`},auth:`apiKey`,risk:Cj,flags:hj,usageArgs:`--store-id <id> --memory-id <id>`,exampleArgs:[`--store-id memstore_example --memory-id mem_example --dry-run`],notes:Sj,validate:wj,async run(e){await Ej(e,`memory-store.memories.delete`,{store_id:e.flags.storeId,memory_id:e.flags.memoryId},t=>ga(t.providers,`bailian`,e.flags.storeId,e.flags.memoryId))}}),Pj=w({description:{"en-US":`List Memory Store versions`,"zh-CN":`列出记忆库版本`},auth:`apiKey`,flags:{...mj,..._j,...vj,memoryId:{...hj.memoryId,required:!1},operation:{type:`string`,valueHint:`<created|modified|deleted>`,choices:[`created`,`modified`,`deleted`],description:{"en-US":`Filter by version operation`,"zh-CN":`按版本操作筛选`}},createdAtGte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Inclusive creation timestamp lower bound`,"zh-CN":`创建时间下限(含)`}},createdAtLte:{type:`string`,valueHint:`<timestamp>`,description:{"en-US":`Inclusive creation timestamp upper bound`,"zh-CN":`创建时间上限(含)`}}},usageArgs:`--store-id <id> [--memory-id <id>] [--operation <created|modified|deleted>] [--created-at-gte <timestamp>] [--created-at-lte <timestamp>] [--page <cursor>] [--limit <n>] [--view <basic|full>]`,exampleArgs:[`--store-id memstore_example --operation modified --view full`],notes:Sj,validate:wj,async run(e){let t={limit:e.flags.limit,page:e.flags.page,view:e.flags.view,memory_id:e.flags.memoryId,operation:e.flags.operation,"created_at.gte":e.flags.createdAtGte,"created_at.lte":e.flags.createdAtLte};await Ej(e,`memory-store.versions.list`,{store_id:e.flags.storeId,options:t},n=>Ua(n.providers,`bailian`,e.flags.storeId,t))}}),Fj=w({description:{"en-US":`Get a memory version`,"zh-CN":`获取记忆版本`},auth:`apiKey`,flags:gj,usageArgs:`--store-id <id> --version-id <id>`,exampleArgs:[`--store-id memstore_example --version-id memver_example`],notes:Sj,validate:wj,async run(e){await Ej(e,`memory-store.versions.get`,{store_id:e.flags.storeId,version_id:e.flags.versionId},t=>ka(t.providers,`bailian`,e.flags.storeId,e.flags.versionId))}}),Ij=w({description:{"en-US":`Permanently redact a memory version's content`,"zh-CN":`永久擦除记忆版本正文`},auth:`apiKey`,risk:{level:`high`,message:{"en-US":`This permanently redacts the selected version's content and cannot be undone.`,"zh-CN":`该操作将永久擦除指定版本正文,无法撤销。`}},flags:gj,usageArgs:`--store-id <id> --version-id <id>`,exampleArgs:[`--store-id memstore_example --version-id memver_example --dry-run`],notes:Sj,validate:wj,async run(e){await Ej(e,`memory-store.versions.redact`,{store_id:e.flags.storeId,version_id:e.flags.versionId},t=>lo(t.providers,`bailian`,e.flags.storeId,e.flags.versionId))}});export{sv as advisorRecommend,fx as alertCreate,gx as alertDelete,yx as alertDisable,_x as alertEnable,Sx as alertHistory,ux as alertList,Zb as alertMetrics,rx as alertTemplateCreate,sx as alertTemplateDelete,ex as alertTemplateList,ax as alertTemplateUpdate,mx as alertUpdate,sf as appCall,lf as appList,Ts as authGenerateAccessToken,Ss as authLogin,ws as authLogout,Cs as authStatus,$d as configAgent,Vc as configList,Bc as configSet,zc as configShow,bd as configUi,Hc as configUse,og as consoleCall,Fx as datasetDelete,Px as datasetGet,Nx as datasetList,Mx as datasetUpload,Ix as datasetValidate,Ec as decisionPredict,mC as deployAudioCreate,SC as deployCapacityCreate,OC as deployCapacityDelete,bC as deployCapacityGet,yC as deployCapacityList,EC as deployCapacityRenew,wC as deployCapacityScale,kC as deployCapacityUnsubscribe,LC as deployDelete,_C as deployGet,hC as deployImageCreate,gC as deployList,MC as deployModels,jC as deployOperationGet,XS as deployOperationWait,AC as deployOverflow,RC as deployPause,zC as deployResume,FC as deployScale,pC as deployTextCreate,IC as deployUpdate,ag as fileUpload,Zx as finetuneAudioCreate,aS as finetuneCancel,bS as finetuneCapability,dS as finetuneCheckpoints,RS as finetuneCompressCancel,jS as finetuneCompressCreate,zS as finetuneCompressDelete,NS as finetuneCompressGet,MS as finetuneCompressList,LS as finetuneCompressLogs,wS as finetuneCompressTemplates,FS as finetuneCompressWatch,oS as finetuneDelete,fS as finetuneExport,iS as finetuneGet,Qx as finetuneImageCreate,tS as finetuneList,uS as finetuneLogs,CS as finetunePrice,Xx as finetuneTextCreate,eS as finetuneVideoCreate,_S as finetuneWatch,Qs as imageEdit,qs as imageGenerate,Gm as knowledgeCategoryAdd,qm as knowledgeCategoryDelete,Um as knowledgeCategoryList,Tp as knowledgeChat,Am as knowledgeChunkAdd,Rm as knowledgeChunkDelete,Mm as knowledgeChunkList,Fm as knowledgeChunkUpdate,th as knowledgeCollectionCreate,rh as knowledgeCollectionGet,nm as knowledgeDocDelete,ah as knowledgeDocImportOss,Pp as knowledgeDocList,Lp as knowledgeDocStatus,im as knowledgeDocTag,qp as knowledgeDocUpload,$m as knowledgeFileDelete,Zm as knowledgeFileGet,Ym as knowledgeFileList,Xp as knowledgeKbCreate,em as knowledgeKbDelete,Mp as knowledgeKbInfo,Dp as knowledgeKbList,Vm as knowledgeKbStats,Qp as knowledgeKbUpdate,yp as knowledgeSearch,Dm as knowledgeServiceCopy,pm as knowledgeServiceCreate,Tm as knowledgeServiceDelete,Cm as knowledgeServiceDeploy,dm as knowledgeServiceGet,cm as knowledgeServiceList,xm as knowledgeServiceUpdate,bb as logAuditCount,Sb as logAuditDisable,xb as logAuditEnable,vb as logAuditGet,_b as logAuditList,kb as logInferenceCount,jb as logInferenceDisable,Ab as logInferenceEnable,Db as logInferenceGet,Tb as logInferenceList,hb as logStatus,Rb as logTraceGet,Fb as logTraceList,Bb as logTraceStats,aD as managedAgentAgentCreate,DD as managedAgentAgentGet,OD as managedAgentAgentList,kD as managedAgentAgentSearch,AD as managedAgentAgentVersions,Jw as managedAgentApply,_D as managedAgentDeploymentCreate,sO as managedAgentDeploymentGet,cO as managedAgentDeploymentList,uO as managedAgentDeploymentPause,dO as managedAgentDeploymentRun,fO as managedAgentDeploymentRunsGet,pO as managedAgentDeploymentRunsList,mO as managedAgentDeploymentSearch,hO as managedAgentDeploymentUnpause,Yw as managedAgentDestroy,sD as managedAgentEnvironmentCreate,FD as managedAgentEnvironmentGet,ID as managedAgentEnvironmentList,LD as managedAgentEnvironmentSearch,ck as managedAgentFileDelete,sk as managedAgentFileDownload,ak as managedAgentFileGet,ik as managedAgentFileList,ok as managedAgentFileSearch,rk as managedAgentFileUpload,xw as managedAgentInit,kj as managedAgentMemoryCreate,Nj as managedAgentMemoryDelete,jj as managedAgentMemoryGet,Aj as managedAgentMemoryList,fj as managedAgentMemoryStoreCreate,Oj as managedAgentMemoryStoreGet,Dj as managedAgentMemoryStoreList,Mj as managedAgentMemoryUpdate,Fj as managedAgentMemoryVersionGet,Pj as managedAgentMemoryVersionList,Ij as managedAgentMemoryVersionRedact,qw as managedAgentPlan,_T as managedAgentPlayground,xT as managedAgentProjectBuild,yT as managedAgentProjectInit,ST as managedAgentProjectPublish,bT as managedAgentProjectValidate,TT as managedAgentProjectVersionDisable,wT as managedAgentProjectVersionEnable,OT as managedAgentProjectVersionList,AT as managedAgentProjectVersionPreview,jT as managedAgentProjectVersionRestore,DT as managedAgentProjectVersionStatus,CT as managedAgentProjectWorkbench,wO as managedAgentSessionArchive,uE as managedAgentSessionCreate,KO as managedAgentSessionDebug,SE as managedAgentSessionDelete,IE as managedAgentSessionEventList,IE as managedAgentSessionEvents,LE as managedAgentSessionEventSend,RE as managedAgentSessionEventStream,qO as managedAgentSessionExport,xE as managedAgentSessionGet,bE as managedAgentSessionList,wE as managedAgentSessionRun,SO as managedAgentSessionSearch,TE as managedAgentSessionSend,CO as managedAgentSessionUpdate,dD as managedAgentSkillCreate,RD as managedAgentSkillDownload,zD as managedAgentSkillGet,YE as managedAgentSkillList,BD as managedAgentSkillSearch,VD as managedAgentSkillVersions,RT as managedAgentStateImport,NT as managedAgentStateList,FT as managedAgentStateRm,PT as managedAgentStateShow,Ww as managedAgentValidate,fD as managedAgentVaultCreate,pD as managedAgentVaultCredentialCreate,KD as managedAgentVaultGet,qD as managedAgentVaultList,JD as managedAgentVaultSearch,yk as managedAgentWebhookCreate,wk as managedAgentWebhookDelete,Ek as managedAgentWebhookDisable,Tk as managedAgentWebhookEnable,kk as managedAgentWebhookEvents,Sk as managedAgentWebhookGet,bk as managedAgentWebhookList,Ok as managedAgentWebhookResetSecret,Dk as managedAgentWebhookTest,Ck as managedAgentWebhookUpdate,hh as mcpCall,vh as mcpConnect,xh as mcpDisconnect,Ch as mcpList,wh as mcpTools,Pf as memoryAdd,Uf as memoryDelete,zf as memoryList,Gf as memoryNodeShow,Yf as memoryProfileCreate,ap as memoryProfileDelete,sp as memoryProfileGet,Zf as memoryProfileList,$f as memoryProfileShow,rp as memoryProfileUpdate,If as memorySearch,qf as memorySkillExport,Vf as memoryUpdate,Kv as modelCode,Av as modelList,Rv as modelSearch,Ky as monitorDeliveryDisable,Wy as monitorDeliveryEnable,Ry as monitorDeliveryStatus,Iy as monitorErrors,My as monitorMetrics,Ty as monitorModels,xy as monitorOverview,Ax as permissionGrant,Tx as permissionList,jx as permissionRevoke,V_ as pipelineRun,K_ as pipelineValidate,Vk as pluginInstall,Hk as pluginLink,Uk as pluginList,Wk as pluginRemove,vy as quotaCheck,ay as quotaDelete,dy as quotaHistory,ry as quotaList,iy as quotaUpdate,VA as sandboxConnect,LA as sandboxCreate,WA as sandboxDelete,DA as sandboxFileUpload,zA as sandboxGet,RA as sandboxList,oA as sandboxOfficialImages,UA as sandboxPause,HA as sandboxResume,uj as sandboxTemplateBuildStatus,oj as sandboxTemplateCreate,dj as sandboxTemplateDelete,cj as sandboxTemplateGet,sj as sandboxTemplateList,lj as sandboxTemplateUpdate,Eh as searchWeb,yg as securityAlerts,gg as securityOverview,Jk as skillAdd,tA as skillInit,Qk as skillList,Xk as skillRemove,Yk as skillUpdate,Hh as speechRecognize,Ih as speechSynthesize,Zh as speechVocabularyCreate,ig as speechVocabularyDelete,eg as speechVocabularyGet,Qh as speechVocabularyList,ng as speechVocabularyUpdate,Rs as textChat,Gs as textOmni,dw as tokenPlanAddMember,sw as tokenPlanAssignSeats,nw as tokenPlanCreateKey,yw as tokenPlanHarnessQuota,ZC as tokenPlanListSeats,of as update,z_ as usageCodingPlan,v_ as usageFree,y_ as usageFreetier,C_ as usageStats,w_ as usageSummary,M_ as usageTokenPlan,oc as videoDownload,rc as videoEdit,nc as videoGenerate,ic as videoRef,ac as videoTaskGet,uc as visionDescribe,Ik as workspaceInit,Zv as workspaceList};