bailian-cli-core 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -805,7 +805,7 @@ interface AuthStore {
805
805
  resolveBaseUrl(fallback?: string): string;
806
806
  /** 登录落盘:合并写入,undefined 键忽略;显式 --config 成功后同时激活目标 Profile。 */
807
807
  login(patch: AuthPersistPatch): Promise<void>;
808
- /** 清凭证:console/openapi 只删对应域;all 清全部登录凭证。返回是否有变更。 */
808
+ /** 清凭证:console/openapi 只删对应域;all 清全部登录凭证和 model baseUrl。返回是否有变更。 */
809
809
  logout(scope: "console" | "openapi" | "all"): Promise<boolean>;
810
810
  /** 实际写入的 config.json 路径(不受命名配置影响,一直是同一个文件)。 */
811
811
  path: string;
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import{createRequire as e}from"node:module";import{appendFileSync as t,createReadStream as n,createWriteStream as r,existsSync as i,mkdirSync as a,readFileSync as o,renameSync as s,rmSync as c,statSync as l,unlinkSync as u,writeFileSync as d}from"fs";import{homedir as f,tmpdir as p}from"os";import{basename as m,extname as h,join as g}from"path";import{stringify as _}from"yaml";import{createHash as v,createHmac as ee,randomBytes as te,randomUUID as ne}from"crypto";import{Readable as re}from"stream";import{createInterface as y}from"readline";import{pipeline as ie}from"stream/promises";import*as ae from"yauzl";import{cpSync as b,existsSync as x,mkdirSync as S,readFileSync as C,readdirSync as oe,writeFileSync as se}from"node:fs";import{dirname as w,join as T}from"node:path";import{fileURLToPath as ce}from"node:url";var le=Object.create,ue=Object.defineProperty,de=Object.getOwnPropertyDescriptor,fe=Object.getOwnPropertyNames,E=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty,me=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),D=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=fe(t),a=0,o=i.length,s;a<o;a++)s=i[a],!pe.call(e,s)&&s!==n&&ue(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=de(t,s))||r.enumerable});return e},O=(e,t,n)=>(n=e==null?{}:le(E(e)),D(t||!e||!e.__esModule?ue(n,`default`,{value:e,enumerable:!0}):n,e)),he=e(import.meta.url);const k={SUCCESS:0,GENERAL:1,USAGE:2,AUTH:3,QUOTA:4,TIMEOUT:5,NETWORK:6,CONTENT_FILTER:10};var A=class extends Error{exitCode;hint;api;rawResponse;constructor(e,t=k.GENERAL,n,r){super(e,r?.cause===void 0?void 0:{cause:r.cause}),this.name=`BailianError`,this.exitCode=t,this.hint=n,this.api=r?.api,this.rawResponse=r?.rawResponse}toJSON(){let e=_e(this.cause);return{error:{code:this.exitCode,message:this.message,...this.hint?{hint:this.hint}:{},...this.api?.httpStatus===void 0?{}:{http_status:this.api.httpStatus},...this.api?.apiCode?{api_code:this.api.apiCode}:{},...this.api?.requestId?{request_id:this.api.requestId}:{},...e?{cause:e}:{}}}}},ge=class extends A{constructor(e,t){super(e,k.USAGE,t),this.name=`UsageError`}};function _e(e){if(e!=null){if(e instanceof Error){let t={message:e.message},n=e.code;return n&&(t.code=n),t}if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return{message:String(e)};try{return{message:JSON.stringify(e)}}catch{return}}}function ve(e,t,n){let r=t.error?.message||t.message||`HTTP ${e}`,i=t.error?.type??t.code,a=typeof i==`string`?i:typeof i==`number`?String(i):void 0;return new A(r,k.GENERAL,void 0,{api:{httpStatus:e,apiCode:a,requestId:t.request_id}})}const ye=[`/compatible-mode/v1`,`/apps/anthropic`];function j(e){let t=e.trim(),n;try{n=new URL(t)}catch{throw be(e)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw be(e);n.search=``,n.hash=``;let r=n.pathname.replace(/\/+$/,``),i=ye.find(e=>r===e||r.endsWith(e));return i&&(r=r.slice(0,-i.length).replace(/\/+$/,``)),n.pathname=r||`/`,n.toString().replace(/\/$/,``)}function be(e){return new A(`Invalid model base URL "${e}".`,k.USAGE,`Use an absolute http(s) URL.`)}const xe={cn:`https://dashscope.aliyuncs.com`,us:`https://dashscope-us.aliyuncs.com`,intl:`https://dashscope-intl.aliyuncs.com`},Se={cn:`https://help.aliyun.com/zh/model-studio`,us:`https://help.aliyun.com/zh/model-studio`,intl:`https://help.aliyun.com/zh/model-studio`},Ce=`https://bailian.cn-beijing.aliyuncs.com`,we=[`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`,`base_url`,`output`,`output_dir`,`timeout`,`default_text_model`,`default_video_model`,`default_image_model`,`default_speech_model`,`default_omni_model`,`workspace_id`,`console_site`,`console_region`,`console_switch_agent`,`telemetry`],Te=new Set([`text`,`json`]),Ee=new Set([`domestic`,`international`]);function De(e){try{return j(e)}catch{return}}function M(e){if(!e||typeof e!=`object`||Array.isArray(e))return{};let t=e,n={};if(typeof t.api_key==`string`&&(n.api_key=t.api_key),typeof t.access_token==`string`&&t.access_token.length>0?n.access_token=t.access_token:typeof t.accessToken==`string`&&t.accessToken.length>0&&(n.access_token=t.accessToken),typeof t.access_key_id==`string`&&t.access_key_id.length>0?n.access_key_id=t.access_key_id:typeof t.openapi_access_key_id==`string`&&t.openapi_access_key_id.length>0&&(n.access_key_id=t.openapi_access_key_id),typeof t.access_key_secret==`string`&&t.access_key_secret.length>0?n.access_key_secret=t.access_key_secret:typeof t.openapi_access_key_secret==`string`&&t.openapi_access_key_secret.length>0&&(n.access_key_secret=t.openapi_access_key_secret),typeof t.security_token==`string`&&t.security_token.length>0&&(n.security_token=t.security_token),typeof t.base_url==`string`){let e=De(t.base_url);e&&(n.base_url=e)}return typeof t.output==`string`&&Te.has(t.output)&&(n.output=t.output),typeof t.output_dir==`string`&&t.output_dir.length>0&&(n.output_dir=t.output_dir),typeof t.timeout==`number`&&t.timeout>0&&(n.timeout=t.timeout),typeof t.default_text_model==`string`&&t.default_text_model.length>0&&(n.default_text_model=t.default_text_model),typeof t.default_video_model==`string`&&t.default_video_model.length>0&&(n.default_video_model=t.default_video_model),typeof t.default_image_model==`string`&&t.default_image_model.length>0&&(n.default_image_model=t.default_image_model),typeof t.default_speech_model==`string`&&t.default_speech_model.length>0&&(n.default_speech_model=t.default_speech_model),typeof t.default_omni_model==`string`&&t.default_omni_model.length>0&&(n.default_omni_model=t.default_omni_model),typeof t.workspace_id==`string`&&t.workspace_id.length>0&&(n.workspace_id=t.workspace_id),typeof t.console_site==`string`&&Ee.has(t.console_site)&&(n.console_site=t.console_site),typeof t.console_region==`string`&&t.console_region.length>0&&(n.console_region=t.console_region),typeof t.console_switch_agent==`number`&&t.console_switch_agent>0&&(n.console_switch_agent=t.console_switch_agent),typeof t.telemetry==`boolean`&&(n.telemetry=t.telemetry),n}function Oe(e,t=xe.cn){return j(e.flags.baseUrl||e.env.DASHSCOPE_BASE_URL||e.file.base_url||t)}function ke(e){let t=Oe(e);if(e.flags.apiKey)return{token:e.flags.apiKey,baseUrl:t,source:`flag`};let n=e.env.DASHSCOPE_API_KEY?.trim();if(n)return{token:n,baseUrl:t,source:`env`};if(e.file.api_key)return{token:e.file.api_key,baseUrl:t,source:`config`};throw new A(`No API key found.`,k.AUTH,"Set DASHSCOPE_API_KEY, pass --api-key, or run `bl auth login`.")}function Ae(e){let t=e.file.access_token?.trim();if(!t)throw new A(`No console access token found.`,k.AUTH,"Run `bl auth login --console`.");return{token:t,region:e.flags.consoleRegion||e.file.console_region||`cn-beijing`,site:e.flags.consoleSite||e.file.console_site||`domestic`,switchAgent:e.flags.consoleSwitchAgent||e.file.console_switch_agent||void 0,source:`config`}}function je(e){let t=Me(`flag`,e.flags.accessKeyId,e.flags.accessKeySecret,e.flags.accessKeyId!==void 0||e.flags.accessKeySecret!==void 0,e.flags.securityToken);if(t)return t;let n=Me(`env`,e.env.ALIBABA_CLOUD_ACCESS_KEY_ID,e.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,!!(N(e.env.ALIBABA_CLOUD_ACCESS_KEY_ID)||N(e.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET)),e.env.ALIBABA_CLOUD_SECURITY_TOKEN);if(n)return n;let r=Me(`config`,e.file.access_key_id,e.file.access_key_secret,!!(e.file.access_key_id||e.file.access_key_secret),e.file.security_token);if(r)return r;throw new A(`No OpenAPI AK/SK credentials found.`,k.AUTH,"Set ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET, pass --access-key-id and --access-key-secret, or run `bl auth login --open-api`.")}function Me(e,t,n,r,i){if(!r)return;let a=N(t),o=N(n);if(!a||!o)throw new A(`Incomplete OpenAPI AK/SK credentials found.`,k.AUTH,Ne(e));return{accessKeyId:a,accessKeySecret:o,securityToken:N(i),source:e}}function N(e){return e?.trim()||void 0}function Ne(e){return e===`flag`?`Pass both --access-key-id and --access-key-secret, or remove the partial flags to use env/config credentials.`:e===`env`?`Set both ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET, or unset the partial env vars to use config credentials.`:"Run `bl auth login --open-api --access-key-id <id> --access-key-secret <secret>` again to save a complete pair."}function Pe(e){let t={};try{t.apiKey=ke(e)}catch{}try{t.console=Ae(e)}catch{}try{t.openapi=je(e)}catch{}return t}function P(){return process.env.BAILIAN_CONFIG_DIR?process.env.BAILIAN_CONFIG_DIR:g(f(),`.bailian`)}function F(){return g(P(),`config.json`)}function Fe(){return g(P(),`credentials.json`)}async function Ie(){let e=P(),t=await import(`fs/promises`);await t.mkdir(e,{recursive:!0,mode:448});try{await t.chmod(e,448)}catch{}}function Le(e){return _(e).replace(/\n$/,``)}function Re(e){return JSON.stringify(e,null,2)}function ze(e,t,n){return JSON.stringify({error:{code:e,message:t,...n?{hint:n}:{}}},null,2)}function Be(e){return e===`json`||e===`text`?e:`text`}function Ve(e,t){switch(t){case`json`:return Re(e);case`text`:return Le(e)}}const He=/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/,I=`active_config`;function L(e){return!!(e&&typeof e==`object`&&!Array.isArray(e))}function R(e){if(!(e===void 0||e===``||e===`default`)){if(typeof e!=`string`||!He.test(e))throw new A(`Invalid config name "${typeof e==`string`?e:JSON.stringify(e)}".`,k.USAGE,`Use letters, numbers, '-' or '_', starting with a letter or number.`);if(we.includes(e)||e===I)throw new A(`Invalid config name "${e}". It conflicts with a config key.`,k.USAGE);return e}}function z(){let e=F();if(!i(e))return{};try{let t=JSON.parse(o(e,`utf-8`));return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch(e){let t=e;return(t instanceof SyntaxError||t.message.includes(`JSON`))&&console.warn(`Warning: config file is corrupted; using defaults.`),{}}}function Ue(e,t){let n=R(e[I]);if(n&&t&&!L(e[n]))throw new A(`Active config "${n}" does not exist.`,k.USAGE,`Use --config default to select the default config, then activate an existing profile.`);return n}function We(e,t){if(!t)return e;let n=e[t];return L(n)?n:{}}function B(e){return M(We(z(),e))}async function V(e,t,n={}){let r=z();if(t)r[t]=e;else{for(let e of Object.keys(r))we.includes(e)&&delete r[e];Object.assign(r,e)}n.activate&&(r[I]=t??`default`),await Ge(r)}async function Ge(e){await Ie();let t=F(),n=t+`.tmp`;d(n,JSON.stringify(e,null,2)+`
2
- `,{mode:384}),s(n,t)}function Ke(){let e=z(),t={};for(let[n,r]of Object.entries(e))we.includes(n)||n===I||L(r)&&(t[n]=M(r));return{default:M(e),named:t,active:Ue(e,!0)??`default`}}function qe(e,t){let n=R(t);if(n&&!L(e[n]))throw new A(`Config "${n}" does not exist.`,k.USAGE,`Create or log in to the profile before activating it.`);return n??`default`}function Je(e){return qe(z(),e)}async function Ye(e){let t=z(),n=qe(t,e);return t[I]=n,await Ge(t),n}async function Xe(e){let t=R(e);if(!t)throw new A(`Cannot delete the default profile.`,k.USAGE);let n=z();return L(n[t])?(delete n[t],Ue(n,!1)===t&&(n[I]=`default`),await Ge(n),!0):!1}function Ze(e){let t=z(),n=e.config!==void 0,r=Ue(t,!n),i=n?R(e.config):r;return{flags:e,file:M(We(t,i)),env:process.env,configName:i,configPath:F()}}function Qe(e){let{flags:t,file:n,env:r}=e,i=r.DASHSCOPE_TIMEOUT?Number(r.DASHSCOPE_TIMEOUT):void 0,a=i!==void 0&&Number.isFinite(i)&&i>0?i:void 0,o=t.timeout??a??n.timeout??300;if(!Number.isFinite(o)||o<=0)throw new A(`Timeout must be a positive finite number.`,k.USAGE);return{configPath:e.configPath??F(),configName:e.configName,output:Be(t.output||r.DASHSCOPE_OUTPUT||n.output),outputExplicit:!!(t.output||r.DASHSCOPE_OUTPUT||n.output),outputDir:n.output_dir||void 0,timeout:o,defaultTextModel:n.default_text_model,defaultVideoModel:n.default_video_model,defaultImageModel:n.default_image_model,defaultSpeechModel:n.default_speech_model,defaultOmniModel:n.default_omni_model,workspaceId:t.workspaceId||r.BAILIAN_WORKSPACE_ID||n.workspace_id||void 0,consoleRegion:t.consoleRegion||n.console_region||void 0,consoleSite:t.consoleSite||n.console_site||void 0,consoleSwitchAgent:t.consoleSwitchAgent||n.console_switch_agent||void 0,verbose:t.verbose||r.DASHSCOPE_VERBOSE===`1`,quiet:t.quiet||!1,dryRun:t.dryRun||!1,telemetry:r.DO_NOT_TRACK===`1`?!1:n.telemetry??!0}}const $e={console:[`access_token`],openapi:[`access_key_id`,`access_key_secret`,`security_token`],all:[`api_key`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]};function et(e){let t=e.configName,n=e.flags.config!==void 0;return{describe:()=>Pe(e),stored(){let e=B(t);return{apiKey:!!e.api_key,console:!!e.access_token,openapi:!!(e.access_key_id||e.access_key_secret||e.security_token),baseUrl:e.base_url}},resolveBaseUrl:t=>Oe(e,t),async login(e){let r=B(t);for(let[t,n]of Object.entries(e))n!==void 0&&(r[t]=t===`base_url`?j(String(n)):n);await V(r,t,{activate:n})},async logout(e){let n=B(t),r=$e[e];if(!r.some(e=>n[e]!==void 0))return!1;for(let e of r)delete n[e];return await V(n,t),!0},get path(){return e.configPath??F()}}}function tt(e){return e.length>8?`${e.slice(0,4)}...${e.slice(-4)}`:`***`}const nt=`bailian-cli`,rt={t1:`public`,t2:``},it=JSON.stringify({channel:nt,tags:rt});function H(){return{"x-dashscope-source-config":it}}function at(e){return typeof e!=`object`||!e||e instanceof FormData?!1:JSON.stringify(e).includes(`oss://`)}async function ot(e,t){let n=typeof FormData<`u`&&t.body instanceof FormData,r={"User-Agent":`${e.identity.clientName}/${e.identity.version}`,...H(),...t.headers};if(!n&&!r[`Content-Type`]&&(r[`Content-Type`]=`application/json`),t.async&&(r[`X-DashScope-Async`]=`enable`),at(t.body)&&(r[`X-DashScope-OssResourceResolve`]=`enable`),e.settings.verbose){console.error(`> ${t.method??`GET`} ${t.url}`);let e=r.Authorization;e&&console.error(`> Auth: ${tt(e.replace(/^Bearer /,``))}`),console.error(`> x-dashscope-source-config: ${it}`)}let i=st((t.timeout??e.settings.timeout)*1e3,t.signal),a=await fetch(t.url,{method:t.method??`GET`,headers:r,body:t.body?n?t.body:JSON.stringify(t.body):void 0,signal:i.signal}).finally(i.cleanup);if(e.settings.verbose){console.error(`< ${a.status} ${a.statusText}`);let e=a.headers.get(`x-request-id`);e&&console.error(`request_id: ${e}`)}if(!a.ok){let e={};try{e=await a.json()}catch{}throw ve(a.status,e,t.url)}return a}function st(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),e),i=()=>n.abort(t?.reason),a=()=>{clearTimeout(r),t?.removeEventListener(`abort`,i)};return t?.aborted?i():t?.addEventListener(`abort`,i,{once:!0}),n.signal.addEventListener(`abort`,a,{once:!0}),{signal:n.signal,cleanup:a}}async function ct(e,t){let n=await ot(e,t),r;try{r=await n.json()}catch{throw new A(`API returned non-JSON response (${n.headers.get(`content-type`)||`unknown type`}). Server may be experiencing issues.`,k.GENERAL)}if(r.code&&typeof r.code==`string`&&r.code!==`200`&&r.code!==`Success`)throw ve(200,{error:{message:r.message,type:r.code}},t.url);return r}function lt(e){let t=[];for(let[n,r]of Object.entries(e))if(!(r===void 0||r===``))if(Array.isArray(r))for(let e=0;e<r.length;e++){let i=r[e];i!==``&&t.push([`${n}.${e+1}`,i])}else t.push([n,r]);return t.sort(([e],[t])=>e<t?-1:+(e>t)),t.map(([e,t])=>`${dt(e)}=${dt(String(t))}`).join(`&`)}function ut(e){let t=e.method??`POST`,n=new Date().toISOString().replace(/\.\d{3}Z$/,`Z`),r=ne(),i=ft(e.body),a={host:e.host,"x-acs-action":e.action,"x-acs-version":e.version,"x-acs-date":n,"x-acs-signature-nonce":r,"x-acs-content-sha256":i,"content-type":`application/json`};e.securityToken&&(a[`x-acs-security-token`]=e.securityToken);let o=Object.keys(a).filter(e=>e===`host`||e===`content-type`||e.startsWith(`x-acs-`)).sort(),s=o.map(e=>`${e}:${a[e]}`).join(`
2
+ `,{mode:384}),s(n,t)}function Ke(){let e=z(),t={};for(let[n,r]of Object.entries(e))we.includes(n)||n===I||L(r)&&(t[n]=M(r));return{default:M(e),named:t,active:Ue(e,!0)??`default`}}function qe(e,t){let n=R(t);if(n&&!L(e[n]))throw new A(`Config "${n}" does not exist.`,k.USAGE,`Create or log in to the profile before activating it.`);return n??`default`}function Je(e){return qe(z(),e)}async function Ye(e){let t=z(),n=qe(t,e);return t[I]=n,await Ge(t),n}async function Xe(e){let t=R(e);if(!t)throw new A(`Cannot delete the default profile.`,k.USAGE);let n=z();return L(n[t])?(delete n[t],Ue(n,!1)===t&&(n[I]=`default`),await Ge(n),!0):!1}function Ze(e){let t=z(),n=e.config!==void 0,r=Ue(t,!n),i=n?R(e.config):r;return{flags:e,file:M(We(t,i)),env:process.env,configName:i,configPath:F()}}function Qe(e){let{flags:t,file:n,env:r}=e,i=r.DASHSCOPE_TIMEOUT?Number(r.DASHSCOPE_TIMEOUT):void 0,a=i!==void 0&&Number.isFinite(i)&&i>0?i:void 0,o=t.timeout??a??n.timeout??300;if(!Number.isFinite(o)||o<=0)throw new A(`Timeout must be a positive finite number.`,k.USAGE);return{configPath:e.configPath??F(),configName:e.configName,output:Be(t.output||r.DASHSCOPE_OUTPUT||n.output),outputExplicit:!!(t.output||r.DASHSCOPE_OUTPUT||n.output),outputDir:n.output_dir||void 0,timeout:o,defaultTextModel:n.default_text_model,defaultVideoModel:n.default_video_model,defaultImageModel:n.default_image_model,defaultSpeechModel:n.default_speech_model,defaultOmniModel:n.default_omni_model,workspaceId:t.workspaceId||r.BAILIAN_WORKSPACE_ID||n.workspace_id||void 0,consoleRegion:t.consoleRegion||n.console_region||void 0,consoleSite:t.consoleSite||n.console_site||void 0,consoleSwitchAgent:t.consoleSwitchAgent||n.console_switch_agent||void 0,verbose:t.verbose||r.DASHSCOPE_VERBOSE===`1`,quiet:t.quiet||!1,dryRun:t.dryRun||!1,telemetry:r.DO_NOT_TRACK===`1`?!1:n.telemetry??!0}}const $e={console:[`access_token`],openapi:[`access_key_id`,`access_key_secret`,`security_token`],all:[`api_key`,`base_url`,`access_token`,`access_key_id`,`access_key_secret`,`security_token`]};function et(e){let t=e.configName,n=e.flags.config!==void 0;return{describe:()=>Pe(e),stored(){let e=B(t);return{apiKey:!!e.api_key,console:!!e.access_token,openapi:!!(e.access_key_id||e.access_key_secret||e.security_token),baseUrl:e.base_url}},resolveBaseUrl:t=>Oe(e,t),async login(e){let r=B(t);for(let[t,n]of Object.entries(e))n!==void 0&&(r[t]=t===`base_url`?j(String(n)):n);await V(r,t,{activate:n})},async logout(e){let n=B(t),r=$e[e];if(!r.some(e=>n[e]!==void 0))return!1;for(let e of r)delete n[e];return await V(n,t),!0},get path(){return e.configPath??F()}}}function tt(e){return e.length>8?`${e.slice(0,4)}...${e.slice(-4)}`:`***`}const nt=`bailian-cli`,rt={t1:`public`,t2:``},it=JSON.stringify({channel:nt,tags:rt});function H(){return{"x-dashscope-source-config":it}}function at(e){return typeof e!=`object`||!e||e instanceof FormData?!1:JSON.stringify(e).includes(`oss://`)}async function ot(e,t){let n=typeof FormData<`u`&&t.body instanceof FormData,r={"User-Agent":`${e.identity.clientName}/${e.identity.version}`,...H(),...t.headers};if(!n&&!r[`Content-Type`]&&(r[`Content-Type`]=`application/json`),t.async&&(r[`X-DashScope-Async`]=`enable`),at(t.body)&&(r[`X-DashScope-OssResourceResolve`]=`enable`),e.settings.verbose){console.error(`> ${t.method??`GET`} ${t.url}`);let e=r.Authorization;e&&console.error(`> Auth: ${tt(e.replace(/^Bearer /,``))}`),console.error(`> x-dashscope-source-config: ${it}`)}let i=st((t.timeout??e.settings.timeout)*1e3,t.signal),a=await fetch(t.url,{method:t.method??`GET`,headers:r,body:t.body?n?t.body:JSON.stringify(t.body):void 0,signal:i.signal}).finally(i.cleanup);if(e.settings.verbose){console.error(`< ${a.status} ${a.statusText}`);let e=a.headers.get(`x-request-id`);e&&console.error(`request_id: ${e}`)}if(!a.ok){let e={};try{e=await a.json()}catch{}throw ve(a.status,e,t.url)}return a}function st(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),e),i=()=>n.abort(t?.reason),a=()=>{clearTimeout(r),t?.removeEventListener(`abort`,i)};return t?.aborted?i():t?.addEventListener(`abort`,i,{once:!0}),n.signal.addEventListener(`abort`,a,{once:!0}),{signal:n.signal,cleanup:a}}async function ct(e,t){let n=await ot(e,t),r;try{r=await n.json()}catch{throw new A(`API returned non-JSON response (${n.headers.get(`content-type`)||`unknown type`}). Server may be experiencing issues.`,k.GENERAL)}if(r.code&&typeof r.code==`string`&&r.code!==`200`&&r.code!==`Success`)throw ve(200,{error:{message:r.message,type:r.code}},t.url);return r}function lt(e){let t=[];for(let[n,r]of Object.entries(e))if(!(r===void 0||r===``))if(Array.isArray(r))for(let e=0;e<r.length;e++){let i=r[e];i!==``&&t.push([`${n}.${e+1}`,i])}else t.push([n,r]);return t.sort(([e],[t])=>e<t?-1:+(e>t)),t.map(([e,t])=>`${dt(e)}=${dt(String(t))}`).join(`&`)}function ut(e){let t=e.method??`POST`,n=new Date().toISOString().replace(/\.\d{3}Z$/,`Z`),r=ne(),i=ft(e.body),a={host:e.host,"x-acs-action":e.action,"x-acs-version":e.version,"x-acs-date":n,"x-acs-signature-nonce":r,"x-acs-content-sha256":i,"content-type":`application/json`};e.securityToken&&(a[`x-acs-security-token`]=e.securityToken);let o=Object.keys(a).filter(e=>e===`host`||e===`content-type`||e.startsWith(`x-acs-`)).sort(),s=o.map(e=>`${e}:${a[e]}`).join(`
3
3
  `)+`
4
4
  `,c=o.join(`;`),l=e.queryString??``,u=[t,e.pathname,l,s,c,i].join(`
5
5
  `),d=`ACS3-HMAC-SHA256`,f=`${d}\n${ft(u)}`,p=pt(e.accessKeySecret,f);return a.authorization=`${d} Credential=${e.accessKeyId},SignedHeaders=${c},Signature=${p}`,a}function dt(e){return encodeURIComponent(e).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function ft(e){return v(`sha256`).update(e,`utf8`).digest(`hex`)}function pt(e,t){return ee(`sha256`,e).update(t,`utf8`).digest(`hex`)}const mt=`${xe.cn}/api/v1/uploads`;async function ht(e,t,n){let r=`${mt}?action=getPolicy&model=${encodeURIComponent(t)}`,i=bt(15e3,n),a=await fetch(r,{headers:{Authorization:`Bearer ${e}`,"Content-Type":`application/json`,...H()},signal:i.signal}).finally(i.cleanup);if(!a.ok){let e=await a.text().catch(()=>``);throw new A(`Failed to get upload policy (HTTP ${a.status}): ${e}`,k.GENERAL)}return(await a.json()).data}async function gt(e,t,n){let r=m(t),i=`${e.upload_dir}/${r}`,a=o(t),s=new FormData;s.append(`OSSAccessKeyId`,e.oss_access_key_id),s.append(`Signature`,e.signature),s.append(`policy`,e.policy),s.append(`x-oss-object-acl`,e.x_oss_object_acl),s.append(`x-oss-forbid-overwrite`,e.x_oss_forbid_overwrite),s.append(`key`,i),s.append(`success_action_status`,`200`),s.append(`file`,new Blob([a]),r);let c=bt(12e4,n),l=await fetch(e.upload_host,{method:`POST`,headers:{...H()},body:s,signal:c.signal}).finally(c.cleanup);if(!l.ok){let e=await l.text().catch(()=>``);throw new A(`Failed to upload file to OSS (HTTP ${l.status}): ${e}`,k.GENERAL)}return`oss://${i}`}async function _t(e){let{apiKey:t,model:n,filePath:r,signal:a}=e;if(!i(r))throw new A(`File not found: ${r}`,k.USAGE);if(!l(r).isFile())throw new A(`Not a file: ${r}`,k.USAGE);return gt(await ht(t,n,a),r,a)}function vt(e){return e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`oss://`)||e.startsWith(`data:`)?!1:i(e)}async function yt(e,t,n,r={}){return vt(e)?_t({apiKey:t,model:n,filePath:e,signal:r.signal}):e}function bt(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),e),i=()=>n.abort(t?.reason),a=()=>{clearTimeout(r),t?.removeEventListener(`abort`,i)};return t?.aborted?i():t?.addEventListener(`abort`,i,{once:!0}),n.signal.addEventListener(`abort`,a,{once:!0}),{signal:n.signal,cleanup:a}}function xt(e){return`/api/v1/mcps/${e}/mcp`}var St=class{url;sessionId;nextId=1;deps;authToken;constructor(e,t,n){this.deps=e,this.url=t,this.authToken=n}async initialize(){if(!this.authToken)throw new A(`This command needs a model-domain API key.`,k.AUTH);let e=await this.rpc(`initialize`,{protocolVersion:`2025-03-26`,capabilities:{},clientInfo:{name:this.deps.identity.clientName,version:this.deps.identity.version}});this.deps.settings.verbose&&(console.error(`[MCP] Session initialized: ${this.sessionId??`no session`}`),console.error(`[MCP] Server: ${JSON.stringify(e)}`)),await this.notify(`notifications/initialized`)}async listTools(){return(await this.rpc(`tools/list`)).tools||[]}async callTool(e,t){return await this.rpc(`tools/call`,{name:e,arguments:t})}async rpc(e,t){let n={jsonrpc:`2.0`,id:this.nextId++,method:e,...t?{params:t}:{}},r=await(await this.send(n)).json();if(r.error)throw new A(`MCP error (${r.error.code}): ${r.error.message}`,k.GENERAL);return r.result}async notify(e,t){let n={jsonrpc:`2.0`,method:e,...t?{params:t}:{}};await this.send(n)}async send(e){let t={"Content-Type":`application/json`,Accept:`application/json, text/event-stream`,"User-Agent":`${this.deps.identity.clientName}/${this.deps.identity.version}`,...H()};this.authToken&&(t.Authorization=`Bearer ${this.authToken}`),this.sessionId&&(t[`Mcp-Session-Id`]=this.sessionId),this.deps.settings.verbose&&(console.error(`> POST ${this.url}`),console.error(`> Method: ${e.method}`));let n=this.deps.settings.timeout*1e3,r=await fetch(this.url,{method:`POST`,headers:t,body:JSON.stringify(e),signal:AbortSignal.timeout(n)});this.deps.settings.verbose&&console.error(`< ${r.status} ${r.statusText}`);let i=r.headers.get(`Mcp-Session-Id`)||r.headers.get(`mcp-session-id`);if(i&&(this.sessionId=i),!r.ok){let e=`MCP request failed: ${r.status} ${r.statusText}`;try{let t=await r.text();t&&(e+=` - ${t.slice(0,500)}`)}catch{}throw new A(e,k.GENERAL)}return r}};const Ct={"cn-beijing":{domestic:{csGateway:`bailian-cs.console.aliyun.com`,action:`BroadScopeAspnGateway`},international:{csGateway:`bailian-cs.console.alibabacloud.com`,action:`BroadScopeAspnGateway`}},"ap-southeast-1":{domestic:{csGateway:`modelstudio-cs.console.aliyun.com`,action:`IntlBroadScopeAspnGateway`},international:{csGateway:`bailian-singapore-cs.alibabacloud.com`,action:`IntlBroadScopeAspnGateway`}}};function wt(e,t){return Ct[e]?.[t]??Ct[`cn-beijing`][t]}function Tt(e){let t=e.consoleRegion??`cn-beijing`,n=e.consoleSite??`domestic`,r=e.consoleSwitchAgent;return r==null?{consoleRegion:t,consoleSite:n}:{consoleRegion:t,consoleSite:n,consoleSwitchAgent:r}}function Et(e,t,n){return JSON.stringify({Api:e,V:`1.0`,Data:{...t,cornerstoneParam:{protocol:`V2`,console:`ONE_CONSOLE`,productCode:`p_efm`,switchUserType:3,consoleSite:`BAILIAN_ALIYUN`,...n==null?{}:{switchAgent:n},...typeof t.cornerstoneParam==`object`&&t.cornerstoneParam!==null?t.cornerstoneParam:{}}}})}async function U(e,t,{api:n,data:r},i){let a=wt(e.region,e.site),o=`https://${a.csGateway}`,s=a.action,c=Et(n,r,e.switchAgent),l=new URLSearchParams({params:c,region:e.region}),u=t*1e3,d={Accept:`*/*`,"Content-Type":`application/x-www-form-urlencoded`};e.token&&(d.Authorization=`Bearer ${e.token}`);let f=`${o}/cli/api.json?action=${s}&product=sfm_bailian&api=${encodeURIComponent(n)}`;i?.verbose&&(process.stderr.write(`> POST ${f}\n`),process.stderr.write(`> payload ${JSON.stringify({params:JSON.parse(c),region:e.region},null,2)}\n`));let p=await fetch(f,{method:`POST`,headers:d,body:l.toString(),signal:AbortSignal.timeout(u)});if(i?.verbose&&process.stderr.write(`< ${p.status} ${p.statusText}\n`),!p.ok){let e=await p.text().catch(()=>``);throw new A(`Console CLI gateway failed: HTTP ${p.status} ${p.statusText}`,k.GENERAL,e.slice(0,500))}let m=await p.json(),h=m.data;if(h?.success===!1&&h.errorCode){let e=JSON.stringify(m),t=h.errorCode,n=typeof t==`string`?t:JSON.stringify(t),r=n.includes(`NotLogined`);throw new A(r?`Console session is not logged in or has expired.`:`Console gateway error: ${n}`,r?k.AUTH:k.GENERAL,r?"Run `bl auth login --console` to sign in or refresh your console session.":void 0,{rawResponse:e})}return m}var Dt=class{constructor(e){this.deps=e}get http(){return{identity:this.deps.identity,settings:this.deps.settings}}requireApi(){if(!this.deps.apiCred)throw new A(`This command needs a model-domain API key.`,k.AUTH);return this.deps.apiCred}requireOpenApi(){if(!this.deps.openApiCred)throw new A(`This command needs Alibaba Cloud OpenAPI AK/SK credentials.`,k.AUTH);return this.deps.openApiCred}get baseUrl(){return this.deps.apiCred?.baseUrl??this.deps.baseUrl}url(e){return this.baseUrl+e}toOpts({path:e,...t}){let n=this.requireApi();return{...t,url:/^https?:\/\//.test(e)?e:n.baseUrl+e,headers:{...t.headers,Authorization:`Bearer ${n.token}`}}}request(e){return ot(this.http,this.toOpts(e))}requestJson(e){return ct(this.http,this.toOpts(e))}uploadFile(e,t,n={}){return vt(e)?yt(e,this.requireApi().token,t,n):Promise.resolve(e)}mcp(e){let t=/^https?:\/\//.test(e)?e:this.requireApi().baseUrl+e;return new St(this.http,t,this.deps.apiCred?.token)}async console(e,t){if(!this.deps.consoleCred)throw new A(`This command needs a console access token.`,k.AUTH);let n={api:e,data:t},{timeout:r}=this.deps.settings;try{return await U(this.deps.consoleCred,r,n,this.deps.settings)}catch(e){if(!(e instanceof A)||e.exitCode!==k.AUTH||!e.message.includes(`not logged in`))throw e;let t=await Mt({identity:this.deps.identity,settings:this.deps.settings,baseUrl:this.deps.baseUrl});if(!t)throw e;return await U({...this.deps.consoleCred,token:t},r,n,this.deps.settings)}}openApiQueryJson(e){return this.openApiJson(e)}async openApiJson(e){let t=this.requireOpenApi(),n=e.body===void 0?``:JSON.stringify(e.body),r=e.queryParams?lt(e.queryParams):``,i=`https://${e.host}${e.path}${r?`?${r}`:``}`,a=ut({accessKeyId:t.accessKeyId,accessKeySecret:t.accessKeySecret,securityToken:t.securityToken,action:e.action,version:e.version,body:n,host:e.host,pathname:e.path,method:e.method,queryString:r});this.deps.settings.verbose&&(process.stderr.write(`> ${e.method} ${i}\n`),process.stderr.write(`> x-acs-action: ${e.action} (version ${e.version})\n`),process.stderr.write(`> AK: ${tt(t.accessKeyId)}\n`),t.securityToken&&process.stderr.write(`> STS token: ${tt(t.securityToken)}\n`),r&&process.stderr.write(`> query: ${r}\n`),n&&process.stderr.write(`> body: ${n}\n`));let o=this.deps.settings.timeout*1e3,s=await fetch(i,{method:e.method,headers:{...a,...H()},body:n||void 0,signal:AbortSignal.timeout(o)}),c=await s.text();this.deps.settings.verbose&&(process.stderr.write(`< ${s.status} ${s.statusText}\n`),process.stderr.write(`< ${c}\n`));let l;try{l=JSON.parse(c)}catch{throw new A(`${s.status} ${s.statusText} - ${c.slice(0,500)}`,k.GENERAL)}if(!s.ok||l.Success===!1)throw new A(`${l.Code||s.status} - ${l.Message||s.statusText}`,k.GENERAL);return l}};const Ot={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function kt(e){for(let[t,n]of Object.entries(xe))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function At(e){return Ot[kt(e)]??Ot.cn}async function jt(e){let{identity:t,settings:n,baseUrl:r,accessKeyId:i,accessKeySecret:a,securityToken:o}=e,s=new Dt({identity:t,settings:n,baseUrl:r,openApiCred:{accessKeyId:i,accessKeySecret:a,securityToken:o,source:`flag`}}),c=At(r);return s.openApiQueryJson({host:c,path:`/modelstudio/cli/generateAccessToken`,action:`GenerateCLIAccessToken`,version:`2026-02-10`,method:`POST`,queryParams:{}})}async function Mt(e){let t=e.settings.configName,n=B(t),r=n.access_key_id,i=n.access_key_secret;if(!r||!i)return null;e.settings.verbose&&process.stderr.write(`Refreshing access token...
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bailian-cli-core",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "description": "Core SDK for bailian-cli. See https://www.npmjs.com/package/bailian-cli for usage.",
5
5
  "homepage": "https://bailian.console.aliyun.com/cli",
6
6
  "bugs": {