@helixlife-ai/xiantao 0.1.29 → 0.1.31

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/README.md CHANGED
@@ -143,7 +143,7 @@ For agent workflows, do not use `xt tool run`. Treat `xt tool run` as the human-
143
143
 
144
144
  For Xiantao tool commands that accept `--toolProductUuid`, the CLI resolves the default from `GET /api/v1/xiantaozi/user_tool_products` and uses the first normal user product UUID. You can override it with `--toolProductUuid`, `XIANTAO_TOOL_PRODUCT_UUID`, or `~/.config/xtz/config.json` under `xiantao.toolProductUuid`. If the user product list is empty, pass an explicit tool product UUID.
145
145
 
146
- The CLI also loads a project-root `.env` file on startup. You can set `XIANTAO_BASE_URL=https://agent.helixlife.cn` there to switch the API base URL without prefixing each command manually, and `XIANTAO_LOGIN_URL=https://www.helixlife.net/` to override the login page. The same values can be stored with `xt config set base-url ...` and `xt config set login-url ...`.
146
+ The CLI also loads a project-root `.env` file on startup. You can set `XIANTAO_BASE_URL=https://agent.helixlife.cn/api/v1` there to switch the API base URL without prefixing each command manually, and `XIANTAO_LOGIN_URL=https://www.helixlife.net/` to override the login page. The same values can be stored with `xt config set base-url ...` and `xt config set login-url ...`.
147
147
 
148
148
  `xt tool search <keyword>` searches remote tool menus by tool id, title, path, and route. `xt tool inspect <tool_id>` prints resolved metadata together with the dynamic `args_main` schema, the full `args_data` payload in JSON mode, and the detected input source summary, including `XTCloud`, per-field `XTUpload`, and `XTRecord` defaults. `xt tool run <tool_id>` runs a Xiantao bioinformatics tool in the human-first path. `xt tool exec <tool_id>` is the agent-safe submit command and also supports `--download <path>` when a local artifact is needed. `xt tool resolve <tool_id>` remains available as the low-level UUID and route lookup. `xt tool menus` returns a concise catalog with each tool title, `module_id`, `path`, and `route`, which is useful when `tool search` finds nothing helpful or when you want to shortlist tools for recommendation.
149
149
 
@@ -1,3 +1,3 @@
1
- import{Flags as u}from"@oclif/core";import{XtzCommand as m}from"../../base-command.js";import{getAuthContext as p}from"../../lib/auth.js";import{fetchXiantaoHistoryRecords as l,getXiantaoHistoryRecordStatus as d}from"../../lib/history.js";import{globalFlags as f}from"../../lib/flags.js";class n extends m{static description="List Xiantao history records";static flags={...f,page:u.integer({default:1,description:"History page number",min:1}),token:u.string({description:"Bearer token for agent.helixlife.cn xiantao APIs; falls back to the stored agent token"})};async run(){const{flags:i}=await this.parse(n),r=await this.getProfile(i.profile),o=await p(r,i.token),a=await l(o,{currentPage:i.page}),s=a.records.map(t=>({fuid:t.fuid?.trim()??"",id:typeof t.id=="number"?t.id:null,module_id:t.module_id?.trim()??"",module_name:t.module_name?.trim()??"",name:t.name?.trim()??"",status:d(t),time:t.time?.trim()??"",type:t.type?.trim()??""})),e={agent:r,current_page:a.currentPage,info:a.info,last_page:a.lastPage,per_page:a.perPage,records:s,total:a.total};this.print(i,e,this.formatHistoryText(a.currentPage,a.lastPage,a.total,s,a.info),{command:"history list",profile:r})}formatHistoryText(i,r,o,a,s){const e=[`\u5386\u53F2\u8BB0\u5F55 ${o} \u6761\uFF0C\u7B2C ${i}/${r} \u9875`];if(a.length===0)return e.push(""),e.push("\u6682\u65E0\u5386\u53F2\u8BB0\u5F55"),e.join(`
1
+ import{Flags as u}from"@oclif/core";import{XtzCommand as m}from"../../base-command.js";import{getAuthContext as p}from"../../lib/auth.js";import{fetchXiantaoHistoryRecords as l,getXiantaoHistoryRecordStatus as d}from"../../lib/history.js";import{globalFlags as f}from"../../lib/flags.js";class n extends m{static description="List Xiantao history records";static flags={...f,page:u.integer({default:1,description:"History page number",min:1}),token:u.string({description:"Bearer token for agent.helixlife.cn xiantao APIs; falls back to the stored agent token"})};async run(){const{flags:i}=await this.parse(n),o=await this.getProfile(i.profile),r=await p(o,i.token),a=await l(r,{currentPage:i.page}),s=a.records.map(t=>({fuid:t.fuid?.trim()??"",id:typeof t.id=="number"?t.id:null,module_id:t.module_id?.trim()??"",module_name:t.module_name?.trim()??"",name:t.name?.trim()??"",status:d(t),time:t.time?.trim()??"",type:t.type?.trim()??""})),e={agent:o,current_page:a.currentPage,info:a.info,last_page:a.lastPage,per_page:a.perPage,records:s,total:a.total};this.print(i,e,this.formatHistoryText(a.currentPage,a.lastPage,a.total,s,a.info),{command:"history list",profile:o})}formatHistoryText(i,o,r,a,s){const e=[`\u5386\u53F2\u8BB0\u5F55 ${r} \u6761\uFF0C\u7B2C ${i}/${o} \u9875`];if(a.length===0)return e.push(""),e.push("\u6682\u65E0\u5386\u53F2\u8BB0\u5F55"),e.join(`
2
2
  `);for(const t of a)e.push(""),e.push(`${t.module_id||"-"} ${t.module_name||"-"}`),e.push(` status: ${t.status}`),e.push(` time: ${t.time||"-"}`),e.push(` type: ${t.type||"-"}`),e.push(` fuid: ${t.fuid||"-"}`),t.name&&e.push(` name: ${t.name}`);return s&&(e.push(""),e.push(s)),e.join(`
3
3
  `)}}export{n as default};
@@ -1 +1 @@
1
- import{promptForUpdate as e}from"../../lib/update.js";const r=async({argv:s,config:o,context:t})=>{s.includes("--json")||!process.stdin.isTTY||!process.stdout.isTTY||!process.stderr.isTTY||await e(o.version)==="updated"&&t.exit(0)};var i=r;export{i as default};
1
+ import{promptForUpdate as r}from"../../lib/update.js";const e=async({argv:s,config:t,context:o})=>{s.includes("--json")||!process.stdin.isTTY||!process.stdout.isTTY||!process.stderr.isTTY||await r(t.version)==="updated"&&o.exit(0)};var i=e;export{i as default};
package/dist/lib/auth.js CHANGED
@@ -1 +1 @@
1
- import{chromium as l}from"playwright";import{resolveXiantaoLoginUrl as p}from"./config.js";import{XtzError as f}from"./errors.js";import{getTokenPath as k,requireToken as m,saveToken as C}from"./storage.js";import{fetchUserToolProducts as F}from"./xiantao.js";const B=["chrome","msedge"];async function w(e){return{browserOpened:!1,linkUrl:await p(),tokenPath:k(e)}}async function y(e,n=!0){const t=await w(e);return n?await d(e,t):t}async function d(e,n,t={}){let u,a;try{u=await M(),a=await u.newContext(),await(await a.newPage()).goto(n.linkUrl,{timeout:60*1e3,waitUntil:"domcontentloaded"});const o={...n,browserOpened:!0};t.onBrowserOpened?.(o);const r=await T(a,{timeoutMs:t.timeoutMs}),g=await C(e,r),c={...o,token:r,tokenPath:g};return t.onTokenCaptured?.(c),await a.close(),c}catch(o){throw h(o)?new f("\u672A\u627E\u5230\u53EF\u7528\u6D4F\u89C8\u5668\uFF0C\u8BF7\u5B89\u88C5 Google Chrome\uFF0C\u6216\u8FD0\u884C `npx playwright install chromium` \u540E\u91CD\u8BD5\u3002"):o}finally{await a?.close().catch(()=>{}),await u?.close().catch(()=>{})}}async function D(e,n){const t=i(n?.trim()||await m(e));return{agent:e,token:t}}function v(e){const n=e?i(e):"";if(n)return n.length<=18?n:`${n.slice(0,8)}...${n.slice(-6)}`}async function x(e,n){const t=i(n??await m(e));return F({agent:e,token:t})}async function T(e,n={}){const t=n.timeoutMs??3e5,u=n.intervalMs??1500,a=Date.now()+t;for(;Date.now()<a;){const o=P(await e.cookies());if(o)return o;await new Promise(r=>setTimeout(r,u))}throw new f("\u7B49\u5F85\u7F51\u9875\u767B\u5F55\u5B8C\u6210\u8D85\u65F6\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C `xt login`\u3002")}function P(e){return e.filter(t=>t.name==="token").map(t=>s(t.value,!1)).find(Boolean)||e.filter(t=>A(t.name)).map(t=>s(t.value)).find(Boolean)||e.map(t=>s(t.value)).find(Boolean)}function A(e){const n=e.toLowerCase();return n.includes("token")&&!n.includes("csrf")&&!n.includes("xsrf")}function s(e,n=!0){const t=i(L(e).replace(/^"|"$/g,""));if(t&&E(t))return!n||U(t)?t:void 0}function i(e){return e.trim().replace(/^Bearer\s+/i,"")}function E(e){return e.length>=20&&!["deleted","false","null","true","undefined"].includes(e.toLowerCase())}function U(e){return/^\d+\|[A-Za-z0-9]{20,}$/.test(e)}function L(e){try{return decodeURIComponent(e)}catch{return e}}function h(e){return e instanceof Error?e.message.includes("Executable doesn't exist")||e.message.includes("is not found"):!1}async function M(){for(const e of B)try{return await l.launch({channel:e,headless:!1})}catch(n){if(!h(n))throw n}return await l.launch({headless:!1})}export{x as checkToken,d as completeLoginAuth,v as formatTokenPreview,D as getAuthContext,y as loginAuth,w as startLoginAuth};
1
+ import{chromium as l}from"playwright";import{resolveXiantaoLoginUrl as p}from"./config.js";import{XtzError as f}from"./errors.js";import{getTokenPath as k,requireToken as m,saveToken as C}from"./storage.js";import{fetchUserToolProducts as F}from"./xiantao.js";const B=["chrome","msedge"];async function w(e){return{browserOpened:!1,linkUrl:await p(),tokenPath:k(e)}}async function y(e,n=!0){const t=await w(e);return n?await d(e,t):t}async function d(e,n,t={}){let u,a;try{u=await M(),a=await u.newContext(),await(await a.newPage()).goto(n.linkUrl,{timeout:60*1e3,waitUntil:"domcontentloaded"});const o={...n,browserOpened:!0};t.onBrowserOpened?.(o);const r=await T(a,{timeoutMs:t.timeoutMs}),g=await C(e,r),c={...o,token:r,tokenPath:g};return t.onTokenCaptured?.(c),await a.close(),c}catch(o){throw h(o)?new f("\u672A\u627E\u5230\u53EF\u7528\u6D4F\u89C8\u5668\uFF0C\u8BF7\u5B89\u88C5 Google Chrome\uFF0C\u6216\u8FD0\u884C `npx playwright install chromium` \u540E\u91CD\u8BD5\u3002"):o}finally{await a?.close().catch(()=>{}),await u?.close().catch(()=>{})}}async function D(e,n){const t=i(n?.trim()||await m(e));return{agent:e,token:t}}function v(e){const n=e?i(e):"";if(n)return n.length<=18?n:`${n.slice(0,8)}...${n.slice(-6)}`}async function x(e,n){const t=i(n??await m(e));return F({agent:e,token:t})}async function T(e,n={}){const t=n.timeoutMs??3e5,u=n.intervalMs??1500,a=Date.now()+t;for(;Date.now()<a;){const o=P(await e.cookies());if(o)return o;await new Promise(r=>setTimeout(r,u))}throw new f("\u7B49\u5F85\u7F51\u9875\u767B\u5F55\u5B8C\u6210\u8D85\u65F6\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C `xt login`\u3002")}function P(e){return e.filter(n=>n.name==="token").map(n=>s(n.value,!1)).find(Boolean)||e.filter(n=>A(n.name)).map(n=>s(n.value)).find(Boolean)||e.map(n=>s(n.value)).find(Boolean)}function A(e){const n=e.toLowerCase();return n.includes("token")&&!n.includes("csrf")&&!n.includes("xsrf")}function s(e,n=!0){const t=i(L(e).replace(/^"|"$/g,""));if(t&&E(t))return!n||U(t)?t:void 0}function i(e){return e.trim().replace(/^Bearer\s+/i,"")}function E(e){return e.length>=20&&!["deleted","false","null","true","undefined"].includes(e.toLowerCase())}function U(e){return/^\d+\|[A-Za-z0-9]{20,}$/.test(e)}function L(e){try{return decodeURIComponent(e)}catch{return e}}function h(e){return e instanceof Error?e.message.includes("Executable doesn't exist")||e.message.includes("is not found"):!1}async function M(){for(const e of B)try{return await l.launch({channel:e,headless:!1})}catch(n){if(!h(n))throw n}return await l.launch({headless:!1})}export{x as checkToken,d as completeLoginAuth,v as formatTokenPreview,D as getAuthContext,y as loginAuth,w as startLoginAuth};
@@ -1,2 +1,2 @@
1
- import{mkdir as v,readFile as A,writeFile as m}from"node:fs/promises";import g from"node:os";import f from"node:path";import{DEFAULT_XIANTAO_BASE_URL as y,DEFAULT_XIANTAO_LOGIN_URL as d,XIANTAO_CONFIG_PATH as D}from"./constants.js";import{XtzError as n}from"./errors.js";import{isJsonObject as B}from"./json.js";const a=["base-url","login-url"];function s(){return f.join(g.homedir(),D)}async function _(t,u){const o=F(t),i=w(o,u),r=s(),c=await p(r);return c[o]=i,await v(f.dirname(r),{recursive:!0}),await m(r,`${JSON.stringify(c,null,2)}
2
- `,"utf8"),{key:o,path:r,value:i}}async function l(t){const u=F(t),o=s(),i=U(u);if(i)return{key:u,path:o,source:"environment",value:i};const r=(await p(o))[u]?.trim();return r?{key:u,path:o,source:"config",value:w(u,r)}:{key:u,path:o,source:"default",value:b(u)}}async function e(){return(await l("base-url")).value}async function C(){return(await l("login-url")).value}async function X(){return`${await e()}/api/v1/xiantaozi/bio-api`}async function L(){return`${await e()}/api/v1/xiantaozi/tool/menus`}async function N(){return`${await e()}/api/v1/xiantaozi/user_tool_products`}async function O(){return`${await e()}/api/v1/agent/upload/config?type=bio&oss_type=bio`}async function p(t){try{const u=await A(t,"utf8"),o=JSON.parse(u);if(!B(o))throw new n(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E: ${t}`);const i=o["base-url"];if(i!==void 0&&typeof i!="string")throw new n(`\u914D\u7F6E\u9879 base-url \u5FC5\u987B\u662F\u5B57\u7B26\u4E32: ${t}`);const r=o["login-url"];if(r!==void 0&&typeof r!="string")throw new n(`\u914D\u7F6E\u9879 login-url \u5FC5\u987B\u662F\u5B57\u7B26\u4E32: ${t}`);return o}catch(u){if($(u)&&u.code==="ENOENT")return{};throw u}}function F(t){const u=t.trim().toLowerCase();if(a.includes(u))return u;throw new n(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u9879 ${t}\uFF0C\u5F53\u524D\u652F\u6301: ${a.join(", ")}`)}function w(t,u){const o=u.trim();if(!o)throw new n(`\u914D\u7F6E\u9879 ${t} \u4E0D\u80FD\u4E3A\u7A7A`);return t==="base-url"?h(o):t==="login-url"?E(o):o}function U(t){if(t==="base-url"){const u=process.env.XIANTAO_BASE_URL?.trim();return u?h(u):void 0}if(t==="login-url"){const u=process.env.XIANTAO_LOGIN_URL?.trim();return u?E(u):void 0}}function b(t){if(t==="base-url")return y;if(t==="login-url")return d;throw new n(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u9879 ${t}`)}function h(t){let u;try{u=new URL(t)}catch{throw new n("base-url \u5FC5\u987B\u662F\u6709\u6548\u7684\u7EDD\u5BF9 URL\uFF0C\u4F8B\u5982 https://vip.helixlife.cn")}if(u.protocol!=="http:"&&u.protocol!=="https:")throw new n("base-url \u53EA\u652F\u6301 http \u6216 https");return t.replace(/\/+$/,"")}function E(t){let u;try{u=new URL(t)}catch{throw new n("login-url \u5FC5\u987B\u662F\u6709\u6548\u7684\u7EDD\u5BF9 URL\uFF0C\u4F8B\u5982 https://vip.helixlife.cn/")}if(u.protocol!=="http:"&&u.protocol!=="https:")throw new n("login-url \u53EA\u652F\u6301 http \u6216 https");return t}function $(t){return t instanceof Error&&"code"in t}export{a as XIANTAO_CONFIG_KEYS,s as getXiantaoConfigPath,O as resolveUploadConfigEndpoint,e as resolveXiantaoBaseUrl,X as resolveXiantaoBioApiEndpoint,l as resolveXiantaoConfigValue,C as resolveXiantaoLoginUrl,L as resolveXiantaoToolMenusEndpoint,N as resolveXiantaoUserToolProductsEndpoint,_ as setXiantaoConfigValue};
1
+ import{mkdir as m,readFile as v,writeFile as y}from"node:fs/promises";import A from"node:os";import f from"node:path";import{DEFAULT_XIANTAO_BASE_URL as g,DEFAULT_XIANTAO_LOGIN_URL as d,XIANTAO_CONFIG_PATH as D}from"./constants.js";import{encrypt as B}from"./encrypt.js";import{XtzError as r}from"./errors.js";import{isJsonObject as _}from"./json.js";const a=["base-url","login-url"];function s(){return f.join(A.homedir(),D)}async function C(u,n){const t=F(u),i=w(t,n),o=s(),l=await p(o);return l[t]=i,await m(f.dirname(o),{recursive:!0}),await y(o,`${JSON.stringify(l,null,2)}
2
+ `,"utf8"),{key:t,path:o,value:i}}async function c(u){const n=F(u),t=s(),i=O(n);if(i)return{key:n,path:t,source:"environment",value:i};const o=(await p(t))[n]?.trim();return o?{key:n,path:t,source:"config",value:w(n,o)}:{key:n,path:t,source:"default",value:$(n)}}async function e(){return(await c("base-url")).value}async function L(){return(await c("login-url")).value}async function U(){return`${await e()}/xiantaozi/bio-api`}async function X(){return`${await e()}/xiantaozi/tool/menus`}async function b(){return`${await e()}/xiantaozi/user_tool_products`}async function N(){const u=new URL(`${await e()}/public/upload/config`);return u.searchParams.set("f",B.encryption({oss_type:"bio",type:"bio"})),u.toString()}async function p(u){try{const n=await v(u,"utf8"),t=JSON.parse(n);if(!_(t))throw new r(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E: ${u}`);const i=t["base-url"];if(i!==void 0&&typeof i!="string")throw new r(`\u914D\u7F6E\u9879 base-url \u5FC5\u987B\u662F\u5B57\u7B26\u4E32: ${u}`);const o=t["login-url"];if(o!==void 0&&typeof o!="string")throw new r(`\u914D\u7F6E\u9879 login-url \u5FC5\u987B\u662F\u5B57\u7B26\u4E32: ${u}`);return t}catch(n){if(T(n)&&n.code==="ENOENT")return{};throw n}}function F(u){const n=u.trim().toLowerCase();if(a.includes(n))return n;throw new r(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u9879 ${u}\uFF0C\u5F53\u524D\u652F\u6301: ${a.join(", ")}`)}function w(u,n){const t=n.trim();if(!t)throw new r(`\u914D\u7F6E\u9879 ${u} \u4E0D\u80FD\u4E3A\u7A7A`);return u==="base-url"?h(t):u==="login-url"?E(t):t}function O(u){if(u==="base-url"){const n=process.env.XIANTAO_BASE_URL?.trim();return n?h(n):void 0}if(u==="login-url"){const n=process.env.XIANTAO_LOGIN_URL?.trim();return n?E(n):void 0}}function $(u){if(u==="base-url")return g;if(u==="login-url")return d;throw new r(`\u4E0D\u652F\u6301\u7684\u914D\u7F6E\u9879 ${u}`)}function h(u){let n;try{n=new URL(u)}catch{throw new r("base-url \u5FC5\u987B\u662F\u6709\u6548\u7684\u7EDD\u5BF9 URL\uFF0C\u4F8B\u5982 https://vip.helixlife.cn")}if(n.protocol!=="http:"&&n.protocol!=="https:")throw new r("base-url \u53EA\u652F\u6301 http \u6216 https");return u.replace(/\/+$/,"")}function E(u){let n;try{n=new URL(u)}catch{throw new r("login-url \u5FC5\u987B\u662F\u6709\u6548\u7684\u7EDD\u5BF9 URL\uFF0C\u4F8B\u5982 https://vip.helixlife.cn/")}if(n.protocol!=="http:"&&n.protocol!=="https:")throw new r("login-url \u53EA\u652F\u6301 http \u6216 https");return u}function T(u){return u instanceof Error&&"code"in u}export{a as XIANTAO_CONFIG_KEYS,s as getXiantaoConfigPath,N as resolveUploadConfigEndpoint,e as resolveXiantaoBaseUrl,U as resolveXiantaoBioApiEndpoint,c as resolveXiantaoConfigValue,L as resolveXiantaoLoginUrl,X as resolveXiantaoToolMenusEndpoint,b as resolveXiantaoUserToolProductsEndpoint,C as setXiantaoConfigValue};
@@ -1 +1 @@
1
- const i="opencode",e=".config/xtz/config.json",A=".config/xtz/update-check.json",c=".config/xiantao/config.json",t="https://api.helixlife.cn".trim(),_="https://vip.helixlife.cn".trim(),n=(t||"https://api.helixlife.cn").replace(/\/+$/,""),s=_||"https://vip.helixlife.cn",T="2d491694-8c8d-11ee-9409-00163e118c99";export{i as DEFAULT_AGENT,n as DEFAULT_XIANTAO_BASE_URL,s as DEFAULT_XIANTAO_LOGIN_URL,c as XIANTAO_CONFIG_PATH,T as XIANTAO_HISTORY_UUID,e as XTZ_CONFIG_PATH,A as XTZ_UPDATE_CHECK_PATH};
1
+ const i="opencode",e=".config/xtz/config.json",A=".config/xtz/update-check.json",c=".config/xiantao/config.json",t="https://api.helixlife.cn/api/v1".trim(),_="https://vip.helixlife.cn".trim(),a=(t||"https://api.helixlife.cn/api/v1").replace(/\/+$/,""),n=_||"https://vip.helixlife.cn",T="2d491694-8c8d-11ee-9409-00163e118c99";export{i as DEFAULT_AGENT,a as DEFAULT_XIANTAO_BASE_URL,n as DEFAULT_XIANTAO_LOGIN_URL,c as XIANTAO_CONFIG_PATH,T as XIANTAO_HISTORY_UUID,e as XTZ_CONFIG_PATH,A as XTZ_UPDATE_CHECK_PATH};
@@ -0,0 +1 @@
1
+ import{Buffer as e}from"node:buffer";const t={encryption(r){return e.from(encodeURI(JSON.stringify(r)),"utf8").toString("base64").replace(/=/g,"")}};export{t as encrypt};
@@ -1 +1 @@
1
- import{XIANTAO_HISTORY_UUID as o}from"./constants.js";import{resolveXiantaoBioApiEndpoint as u}from"./config.js";import{XtzError as y}from"./errors.js";import{requestJson as s}from"./http.js";import{buildXiantaoHeaders as d}from"./xiantao.js";async function f(i,t={}){const e=await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.fetch",args:{id:{uuid:o},current_page:t.currentPage??1}}),headers:await d(i,!0),method:"POST"},{agent:i.agent});return{currentPage:e.data.current_page??t.currentPage??1,info:e.data.info?.trim()??"",lastPage:e.data.last_page??1,perPage:e.data.per_page??10,records:e.data.data_records??[],total:e.data.total??0}}async function p(i,t){const e=await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.download-buttons",args:{id:{fuid:t.fuid,uuid:o}}}),headers:await d(i,!0),method:"POST"},{agent:i.agent});return{body:e.data.body??"",downloads:D(e.data.data??[])}}async function b(i,t){await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.rename",args:{id:{fuid:t.fuid,uuid:o},new_name:t.newName}}),headers:await d(i,!0),method:"POST"},{agent:i.agent})}async function h(i,t){await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.delete",args:{id:{fuid:t.fuid,uuid:o}}}),headers:await d(i,!0),method:"POST"},{agent:i.agent})}async function v(i,t){return(await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.modify-fetch",args:{id:{fuid:t.fuid,uuid:o}}}),headers:await d(i,!0),method:"POST"},{agent:i.agent})).data}async function P(i,t){const e=Date.now()+t.timeoutMs;for(;Date.now()<=e;){const n=await f(i),a=S(n.records,t.moduleId,t.submittedAtMs);if(a)return a;await m(t.intervalMs)}return null}async function X(i,t){const e=t.trim();if(!e)return null;let n=1,a=1;do{const r=await f(i,{currentPage:n}),c=r.records.find(g=>g.fuid?.trim()===e);if(c)return c;n+=1,a=r.lastPage}while(n<=a);return null}async function O(i,t){const e=Date.now()+t.timeoutMs;for(;Date.now()<=e;){const n=(await f(i)).records.find(r=>r.fuid?.trim()===t.fuid);if(!n){await m(t.intervalMs);continue}const a=w(n);if(N(a))return n;if(T(a))throw new y(`\u5386\u53F2\u8BB0\u5F55\u4EFB\u52A1\u6267\u884C\u5931\u8D25\uFF1A${a}`);await m(t.intervalMs)}return null}function w(i){return H(i.status??"").trim()||"\u672A\u77E5"}function S(i,t,e){const n=t.trim(),a=e-12e4;return i.filter(r=>r.module_id?.trim()===n).sort((r,c)=>l(c.time)-l(r.time)).find(r=>l(r.time)>=a)}function D(i){return i.flatMap(t=>t.tag!=="download"||!t.device||!t.endpoint||!t.fuid||!t.label?[]:[{device:t.device,endpoint:t.endpoint,fuid:t.fuid,index:t.index,info:t.info,label:t.label,pos:t.pos,sign:t.sign}])}function l(i){const t=i?.trim();if(!t)return 0;const e=Date.parse(t.replace(" ","T"));return Number.isNaN(e)?0:e}function H(i){return i.replace(/<[^>]+>/g," ").replace(/\s+/g," ")}function N(i){return i.includes("\u5B8C\u6210")}function T(i){return["\u5931\u8D25","\u5F02\u5E38","\u53D6\u6D88","\u7EC8\u6B62"].some(t=>i.includes(t))}async function m(i){await new Promise(t=>setTimeout(t,i))}export{h as deleteXiantaoHistoryRecord,p as fetchXiantaoHistoryDownloadButtons,v as fetchXiantaoHistoryModify,f as fetchXiantaoHistoryRecords,X as findXiantaoHistoryRecordByFuid,w as getXiantaoHistoryRecordStatus,b as renameXiantaoHistoryRecord,P as waitForLatestXiantaoHistoryRecord,O as waitForXiantaoHistoryRecordCompletion};
1
+ import{XIANTAO_HISTORY_UUID as o}from"./constants.js";import{resolveXiantaoBioApiEndpoint as u}from"./config.js";import{XtzError as y}from"./errors.js";import{requestJson as s}from"./http.js";import{buildXiantaoHeaders as d}from"./xiantao.js";async function f(e,t={}){const i=await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.fetch",args:{id:{uuid:o},current_page:t.currentPage??1}}),headers:await d(e,!0),method:"POST"},{agent:e.agent});return{currentPage:i.data.current_page??t.currentPage??1,info:i.data.info?.trim()??"",lastPage:i.data.last_page??1,perPage:i.data.per_page??10,records:i.data.data_records??[],total:i.data.total??0}}async function p(e,t){const i=await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.download-buttons",args:{id:{fuid:t.fuid,uuid:o}}}),headers:await d(e,!0),method:"POST"},{agent:e.agent});return{body:i.data.body??"",downloads:D(i.data.data??[])}}async function b(e,t){await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.rename",args:{id:{fuid:t.fuid,uuid:o},new_name:t.newName}}),headers:await d(e,!0),method:"POST"},{agent:e.agent})}async function h(e,t){await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.delete",args:{id:{fuid:t.fuid,uuid:o}}}),headers:await d(e,!0),method:"POST"},{agent:e.agent})}async function v(e,t){return(await s(await u(),{body:JSON.stringify({version:"v3",name:"public.records.modify-fetch",args:{id:{fuid:t.fuid,uuid:o}}}),headers:await d(e,!0),method:"POST"},{agent:e.agent})).data}async function P(e,t){const i=Date.now()+t.timeoutMs;for(;Date.now()<=i;){const n=await f(e),a=S(n.records,t.moduleId,t.submittedAtMs);if(a)return a;await m(t.intervalMs)}return null}async function X(e,t){const i=t.trim();if(!i)return null;let n=1,a=1;do{const r=await f(e,{currentPage:n}),c=r.records.find(g=>g.fuid?.trim()===i);if(c)return c;n+=1,a=r.lastPage}while(n<=a);return null}async function O(e,t){const i=Date.now()+t.timeoutMs;for(;Date.now()<=i;){const n=(await f(e)).records.find(r=>r.fuid?.trim()===t.fuid);if(!n){await m(t.intervalMs);continue}const a=w(n);if(N(a))return n;if(T(a))throw new y(`\u5386\u53F2\u8BB0\u5F55\u4EFB\u52A1\u6267\u884C\u5931\u8D25\uFF1A${a}`);await m(t.intervalMs)}return null}function w(e){return H(e.status??"").trim()||"\u672A\u77E5"}function S(e,t,i){const n=t.trim(),a=i-12e4;return e.filter(r=>r.module_id?.trim()===n).sort((r,c)=>l(c.time)-l(r.time)).find(r=>l(r.time)>=a)}function D(e){return e.flatMap(t=>t.tag!=="download"||!t.device||!t.endpoint||!t.fuid||!t.label?[]:[{device:t.device,endpoint:t.endpoint,fuid:t.fuid,index:t.index,info:t.info,label:t.label,pos:t.pos,sign:t.sign}])}function l(e){const t=e?.trim();if(!t)return 0;const i=Date.parse(t.replace(" ","T"));return Number.isNaN(i)?0:i}function H(e){return e.replace(/<[^>]+>/g," ").replace(/\s+/g," ")}function N(e){return e.includes("\u5B8C\u6210")}function T(e){return["\u5931\u8D25","\u5F02\u5E38","\u53D6\u6D88","\u7EC8\u6B62"].some(t=>e.includes(t))}async function m(e){await new Promise(t=>setTimeout(t,e))}export{h as deleteXiantaoHistoryRecord,p as fetchXiantaoHistoryDownloadButtons,v as fetchXiantaoHistoryModify,f as fetchXiantaoHistoryRecords,X as findXiantaoHistoryRecordByFuid,w as getXiantaoHistoryRecordStatus,b as renameXiantaoHistoryRecord,P as waitForLatestXiantaoHistoryRecord,O as waitForXiantaoHistoryRecordCompletion};
package/dist/lib/json.js CHANGED
@@ -1 +1 @@
1
- function t(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function u(n,...r){const o=structuredClone(n);for(const e of r)s(o,e);return o}function s(n,r){for(const[o,e]of Object.entries(r)){const c=n[o];if(t(c)&&t(e)){s(c,e);continue}n[o]=structuredClone(e)}}export{u as deepMerge,t as isJsonObject};
1
+ function t(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function u(e,...r){const n=structuredClone(e);for(const o of r)s(n,o);return n}function s(e,r){for(const[n,o]of Object.entries(r)){const c=e[n];if(t(c)&&t(o)){s(c,o);continue}e[n]=structuredClone(o)}}export{u as deepMerge,t as isJsonObject};
@@ -1 +1 @@
1
- import{completeLoginAuth as u,startLoginAuth as o}from"./auth.js";async function r(h,s=!0,t){const a=await o(h);if(!s)return t?.({auth:a,phase:"auth_started"}),{auth:a};const n=await u(h,a,{onBrowserOpened:e=>t?.({auth:e,phase:"auth_started"}),onTokenCaptured:e=>t?.({auth:e,phase:"token_saved"})});return t?.({auth:n,phase:"auth_confirmed"}),{auth:n}}export{r as loginAll};
1
+ import{completeLoginAuth as n,startLoginAuth as r}from"./auth.js";async function u(o,s=!0,t){const a=await r(o);if(!s)return t?.({auth:a,phase:"auth_started"}),{auth:a};const h=await n(o,a,{onBrowserOpened:e=>t?.({auth:e,phase:"auth_started"}),onTokenCaptured:e=>t?.({auth:e,phase:"token_saved"})});return t?.({auth:h,phase:"auth_confirmed"}),{auth:h}}export{u as loginAll};
@@ -1,18 +1,18 @@
1
- import E from"node:readline/promises";import{stdin as f,stdout as o}from"node:process";import{XtzError as s}from"./errors.js";import{isJsonObject as y}from"./json.js";import{formatSetOverrides as B}from"./plot-options.js";import{getBrowsableToolMenuChildren as g,isRunnableToolMenu as N}from"./xiantao.js";async function v(u,t){p();const e=E.createInterface({input:f,output:o}),n=structuredClone(t);try{let r=0,i=0;for(;r<u.length;){const l=u[r],a=l.form??[];if(a.length===0){r+=1,i=0;continue}for(o.write(`
2
- [${l.label?.trim()||l.key}]
1
+ import E from"node:readline/promises";import{stdin as f,stdout as o}from"node:process";import{XtzError as s}from"./errors.js";import{isJsonObject as y}from"./json.js";import{formatSetOverrides as B}from"./plot-options.js";import{getBrowsableToolMenuChildren as g,isRunnableToolMenu as N}from"./xiantao.js";async function v(u,t){p();const e=E.createInterface({input:f,output:o}),n=structuredClone(t);try{let r=0,i=0;for(;r<u.length;){const c=u[r],a=c.form??[];if(a.length===0){r+=1,i=0;continue}for(o.write(`
2
+ [${c.label?.trim()||c.key}]
3
3
  `),o.write(`\u56DE\u8F66\u4FDD\u7559\u9ED8\u8BA4\u503C\uFF0C\u8F93\u5165 < \u8FD4\u56DE\u4E0A\u4E00\u9879\uFF0C\u8F93\u5165 /skip \u8DF3\u8FC7\u672C\u7EC4\u3002
4
- `);i<a.length;){const c=a[i],F=n[l.key];if(!y(F)){i+=1;continue}const w=F[c.key];if(!y(w)){i+=1;continue}const m=await P(e,c,w.value);if(m.type==="back"){const D=K(u,r,i);if(!D){o.write(`\u5DF2\u7ECF\u662F\u7B2C\u4E00\u9879\u3002
4
+ `);i<a.length;){const l=a[i],F=n[c.key];if(!y(F)){i+=1;continue}const w=F[l.key];if(!y(w)){i+=1;continue}const m=await P(e,l,w.value);if(m.type==="back"){const D=K(u,r,i);if(!D){o.write(`\u5DF2\u7ECF\u662F\u7B2C\u4E00\u9879\u3002
5
5
  `);continue}r=D.sectionIndex,i=D.fieldIndex;break}if(m.type==="skip"){r+=1,i=0;break}w.value=m.value,i+=1}i>=a.length&&(r+=1,i=0)}}finally{e.close()}return n}async function I(u){p(),o.write(`
6
6
  \u6700\u7EC8\u53C2\u6570:
7
7
  `),o.write(`${JSON.stringify(u,null,2)}
8
8
  `),o.write(`
9
9
  \u53EF\u590D\u7528 --set:
10
10
  `);for(const e of B(u))o.write(`${e}
11
- `);const t=E.createInterface({input:f,output:o});try{const e=(await t.question("\u786E\u8BA4\u63D0\u4EA4? [y/N] ")).trim().toLowerCase();if(e!=="y"&&e!=="yes")throw new s("\u5DF2\u53D6\u6D88\u63D0\u4EA4\u3002")}finally{t.close()}}async function S(u){if(p(),u.length===0)return[];const t=E.createInterface({input:f,output:o});try{return await A(t,u)}finally{t.close()}}async function k(u){p();const t=u.filter(l=>Q(l));if(t.length===0)throw new s("\u5F53\u524D\u4EA7\u54C1\u672A\u8FD4\u56DE\u53EF\u9009\u5DE5\u5177\u76EE\u5F55\u3002");const e=E.createInterface({input:f,output:o}),n=[];let r=t,i="\u9009\u62E9\u5927\u7C7B";try{for(;;){o.write(`
11
+ `);const t=E.createInterface({input:f,output:o});try{const e=(await t.question("\u786E\u8BA4\u63D0\u4EA4? [y/N] ")).trim().toLowerCase();if(e!=="y"&&e!=="yes")throw new s("\u5DF2\u53D6\u6D88\u63D0\u4EA4\u3002")}finally{t.close()}}async function S(u){if(p(),u.length===0)return[];const t=E.createInterface({input:f,output:o});try{return await A(t,u)}finally{t.close()}}async function k(u){p();const t=u.filter(c=>Q(c));if(t.length===0)throw new s("\u5F53\u524D\u4EA7\u54C1\u672A\u8FD4\u56DE\u53EF\u9009\u5DE5\u5177\u76EE\u5F55\u3002");const e=E.createInterface({input:f,output:o}),n=[];let r=t,i="\u9009\u62E9\u5927\u7C7B";try{for(;;){o.write(`
12
12
  [${i}]
13
- `),r.forEach((a,c)=>{const F=$(a),w=g(a).length>0?" >":` (${a.code?.trim()??"-"})`;o.write(` ${c+1}. ${F}${w}
14
- `)});const l=n.length>0?"\u8F93\u5165\u7F16\u53F7\uFF0C< \u8FD4\u56DE\u4E0A\u4E00\u7EA7\uFF0C\u56DE\u8F66\u53D6\u6D88: ":"\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u53D6\u6D88: ";try{const a=(await e.question(l)).trim();if(!a)throw new s("\u5DF2\u53D6\u6D88\u5DE5\u5177\u9009\u62E9\u3002");if(a==="<"){const m=n.pop();if(!m){o.write(`\u5DF2\u7ECF\u662F\u9876\u5C42\u76EE\u5F55\u3002
15
- `);continue}r=m.menus,i=m.title;continue}const c=Number(a);if(!Number.isInteger(c)||c<1||c>r.length)throw new s(`\u65E0\u6548\u9009\u9879: ${a}`);const F=r[c-1],w=g(F);if(w.length>0){n.push({menus:r,title:i}),r=w,i=$(F);continue}if(!N(F))throw new s(`${$(F)} \u7F3A\u5C11\u53EF\u6267\u884C\u4FE1\u606F\uFF0C\u8BF7\u6539\u7528\u663E\u5F0F module_id/uuid\u3002`);return U(F)}catch(a){if(!(a instanceof s))throw a;o.write(`${a.message}
13
+ `),r.forEach((a,l)=>{const F=$(a),w=g(a).length>0?" >":` (${a.code?.trim()??"-"})`;o.write(` ${l+1}. ${F}${w}
14
+ `)});const c=n.length>0?"\u8F93\u5165\u7F16\u53F7\uFF0C< \u8FD4\u56DE\u4E0A\u4E00\u7EA7\uFF0C\u56DE\u8F66\u53D6\u6D88: ":"\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u53D6\u6D88: ";try{const a=(await e.question(c)).trim();if(!a)throw new s("\u5DF2\u53D6\u6D88\u5DE5\u5177\u9009\u62E9\u3002");if(a==="<"){const m=n.pop();if(!m){o.write(`\u5DF2\u7ECF\u662F\u9876\u5C42\u76EE\u5F55\u3002
15
+ `);continue}r=m.menus,i=m.title;continue}const l=Number(a);if(!Number.isInteger(l)||l<1||l>r.length)throw new s(`\u65E0\u6548\u9009\u9879: ${a}`);const F=r[l-1],w=g(F);if(w.length>0){n.push({menus:r,title:i}),r=w,i=$(F);continue}if(!N(F))throw new s(`${$(F)} \u7F3A\u5C11\u53EF\u6267\u884C\u4FE1\u606F\uFF0C\u8BF7\u6539\u7528\u663E\u5F0F module_id/uuid\u3002`);return U(F)}catch(a){if(!(a instanceof s))throw a;o.write(`${a.message}
16
16
  `)}}}finally{e.close()}}async function O(){p();const u=E.createInterface({input:f,output:o});try{for(;;){const t=(await u.question(`
17
17
  \u8F93\u5165\u5F85\u4E0A\u4F20\u7684 xlsx \u6587\u4EF6\u8DEF\u5F84\uFF0C\u56DE\u8F66\u53D6\u6D88: `)).trim();if(!t)throw new s("\u5DF2\u53D6\u6D88\u6587\u4EF6\u9009\u62E9\u3002");return t}}finally{u.close()}}async function J(){p();const u=E.createInterface({input:f,output:o});try{for(;;)try{o.write(`
18
18
  [\u6570\u636E\u6765\u6E90]
@@ -25,15 +25,15 @@ import E from"node:readline/promises";import{stdin as f,stdout as o}from"node:pr
25
25
  `)});const e=(await t.question("\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u53D6\u6D88: ")).trim();if(!e)throw new s("\u5DF2\u53D6\u6D88\u4E91\u7AEF\u6570\u636E\u9009\u62E9\u3002");const n=Number(e);if(!Number.isInteger(n)||n<1||n>u.length)throw new s(`\u65E0\u6548\u9009\u9879: ${e}`);return structuredClone(u[n-1])}catch(e){if(!(e instanceof s))throw e;o.write(`${e.message}
26
26
  `)}}finally{t.close()}}async function x(u){if(p(),!u.hasFile&&u.downloads.length===0)return{downloadFile:!1,downloads:[]};const t=V(u),e=E.createInterface({input:f,output:o});try{for(;;)try{o.write(`
27
27
  [\u7ED3\u679C\u5904\u7406]
28
- `),t.forEach((l,a)=>{o.write(` ${a+1}. ${l.label}
28
+ `),t.forEach((c,a)=>{o.write(` ${a+1}. ${c.label}
29
29
  `)});const n=(await e.question("\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u8DF3\u8FC7: ")).trim();if(!n)return{downloadFile:!1,downloads:[]};const r=Number(n);if(!Number.isInteger(r)||r<1||r>t.length)throw new s(`\u65E0\u6548\u9009\u9879: ${n}`);const i=t[r-1];return i.type==="skip"?{downloadFile:!1,downloads:[]}:i.type==="file"?{downloadFile:!0,downloads:[]}:i.type==="all"?{downloadFile:!0,downloads:u.downloads}:{downloadFile:!1,downloads:u.downloads.length<=1?u.downloads:await A(e,u.downloads)}}catch(n){if(!(n instanceof s))throw n;o.write(`${n.message}
30
30
  `)}}finally{e.close()}}function p(){if(!f.isTTY||!o.isTTY)throw new s("`--interactive` \u4EC5\u652F\u6301\u5728\u7EC8\u7AEF\u4E2D\u4F7F\u7528\u3002")}async function A(u,t){for(o.write(`
31
31
  [\u4E0B\u8F7D\u7ED3\u679C]
32
32
  `),t.forEach((e,n)=>{o.write(` ${n+1}. ${e.label} (${e.device})
33
33
  `)});;)try{const e=(await u.question("\u8F93\u5165\u7F16\u53F7\u4E0B\u8F7D\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C\u56DE\u8F66\u8DF3\u8FC7: ")).trim();return e?R(e,t.length).map(n=>t[n]):[]}catch(e){if(!(e instanceof s))throw e;o.write(`${e.message}
34
34
  `)}}async function P(u,t,e){for(;;)try{const n=M(t),r="\u8F93\u5165 < \u8FD4\u56DE\u4E0A\u4E00\u9879\uFF0C/skip \u8DF3\u8FC7\u672C\u7EC4";if(t.options?.length){o.write(`${n}
35
- `),H(t.options,e);const c=t.multiple?`\u8F93\u5165\u7F16\u53F7\u6216\u9009\u9879\u503C\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C${r}`:`\u8F93\u5165\u7F16\u53F7\u6216\u9009\u9879\u503C\uFF0C${r}`,F=(await u.question(`${c} [${d(e)}]: `)).trim();return F?C(F)||{type:"value",value:t.multiple?_(F,t.options):T(F,t.options)}:{type:"value",value:e}}if(t.type==="XTSwitch"){const c=(await u.question(`${n} (\u5F00/\u5173\uFF0C${r}) [${z(e)}]: `)).trim();return c?C(c)||{type:"value",value:b(c)}:{type:"value",value:e}}if(t.type==="XTColor"){Z(e);const c=(await u.question(`${n} (\u989C\u8272\u7528\u9017\u53F7\u6216\u7A7A\u683C\u5206\u9694\uFF0C${r}) [${G(e)}]: `)).trim();return c?C(c)||{type:"value",value:W(c,e)}:{type:"value",value:e}}const i=t.placeholder?.trim()||t.tips?.trim()||Y(e),l=i?`${n} (${i}\uFF0C${r}) [${d(e)}]: `:`${n} (${r}) [${d(e)}]: `,a=(await u.question(l)).trim();return a?C(a)||{type:"value",value:X(a,e)}:{type:"value",value:e}}catch(n){if(!(n instanceof s))throw n;o.write(`${n.message}
36
- `)}}function T(u,t){const e=u.trim(),n=Number(e);if(Number.isInteger(n)&&n>=1&&n<=t.length)return structuredClone(t[n-1]);const r=t.find(i=>String(i)===e);if(r===void 0)throw new s(`\u65E0\u6548\u9009\u9879: ${u}`);return structuredClone(r)}function M(u){return typeof u.label!="string"?u.key:u.label.trim()||u.key}function _(u,t){const e=u.split(/[,,]/).map(n=>n.trim()).filter(Boolean);if(e.length===0)throw new s("\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u9009\u9879\u3002");return e.map(n=>{const r=Number(n);if(Number.isInteger(r)&&r>=1&&r<=t.length)return structuredClone(t[r-1]);const i=t.find(l=>String(l)===n);if(i===void 0)throw new s(`\u65E0\u6548\u9009\u9879: ${n}`);return structuredClone(i)})}function R(u,t){const e=u.split(/[,,]/).map(r=>r.trim()).filter(Boolean);if(e.length===0)throw new s("\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u9009\u9879\u3002");const n=e.map(r=>{const i=Number(r);if(!Number.isInteger(i)||i<1||i>t)throw new s(`\u65E0\u6548\u9009\u9879: ${r}`);return i-1});return[...new Set(n)]}function X(u,t){if(typeof t=="boolean")return b(u);if(typeof t=="number"){const e=Number(u);if(Number.isNaN(e))throw new s(`\u65E0\u6548\u6570\u5B57: ${u}`);return e}if(Array.isArray(t))return L(u);if(y(t))try{const e=JSON.parse(u);if(!y(e))throw new s(`\u8BF7\u8F93\u5165 JSON \u5BF9\u8C61: ${u}`);return e}catch{throw new s(`\u8BF7\u8F93\u5165\u5408\u6CD5 JSON \u5BF9\u8C61: ${u}`)}return u}function j(u){const t=typeof u.data_id=="string"?u.data_id.trim():"",e=typeof u.label=="string"?u.label.trim():"";return e&&t?`${e} (${t})`:e||t||"\u672A\u547D\u540D\u8BB0\u5F55"}function L(u){if(u.startsWith("["))try{const t=JSON.parse(u);if(!Array.isArray(t))throw new s(`\u8BF7\u8F93\u5165 JSON \u6570\u7EC4: ${u}`);return t}catch{throw new s(`\u8BF7\u8F93\u5165\u5408\u6CD5 JSON \u6570\u7EC4: ${u}`)}return u.split(",").map(t=>t.trim()).filter(Boolean)}function b(u){const t=u.trim().toLowerCase();if(["y","yes","true","1","on","\u5F00"].includes(t))return!0;if(["n","no","false","0","off","\u5173"].includes(t))return!1;throw new s(`\u65E0\u6548\u5F00\u5173\u503C: ${u}`)}function W(u,t){if(u.startsWith("["))try{const n=JSON.parse(u);if(!Array.isArray(n)||!n.every(r=>typeof r=="string"))throw new s(`\u8BF7\u8F93\u5165\u5B57\u7B26\u4E32\u6570\u7EC4: ${u}`);return Array.isArray(t)?n.map(h):h(n[0]??"")}catch{throw new s(`\u8BF7\u8F93\u5165\u5408\u6CD5\u989C\u8272\u6570\u7EC4: ${u}`)}const e=u.split(/[\s,,]+/).map(n=>n.trim()).filter(Boolean);if(e.length===0)throw new s("\u8BF7\u81F3\u5C11\u8F93\u5165\u4E00\u4E2A\u989C\u8272\u503C\u3002");return Array.isArray(t)?e.map(h):h(e[0])}function Y(u){return typeof u=="boolean"?"\u5F00/\u5173":Array.isArray(u)?"\u8F93\u5165 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694\u503C":y(u)?"\u8F93\u5165 JSON \u5BF9\u8C61":""}function d(u){return typeof u=="string"?u:JSON.stringify(u)}function z(u){return u===!0?"\u5F00":"\u5173"}function G(u){return Array.isArray(u)?u.join(", "):d(u)}function H(u,t){const e=Array.isArray(t)?t.map(String):[String(t)];u.forEach((n,r)=>{const i=String(n),l=e.includes(i)?"*":" ";o.write(` ${l} ${r+1}. ${i}
35
+ `),H(t.options,e);const l=t.multiple?`\u8F93\u5165\u7F16\u53F7\u6216\u9009\u9879\u503C\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C${r}`:`\u8F93\u5165\u7F16\u53F7\u6216\u9009\u9879\u503C\uFF0C${r}`,F=(await u.question(`${l} [${d(e)}]: `)).trim();return F?C(F)||{type:"value",value:t.multiple?_(F,t.options):T(F,t.options)}:{type:"value",value:e}}if(t.type==="XTSwitch"){const l=(await u.question(`${n} (\u5F00/\u5173\uFF0C${r}) [${z(e)}]: `)).trim();return l?C(l)||{type:"value",value:b(l)}:{type:"value",value:e}}if(t.type==="XTColor"){Z(e);const l=(await u.question(`${n} (\u989C\u8272\u7528\u9017\u53F7\u6216\u7A7A\u683C\u5206\u9694\uFF0C${r}) [${G(e)}]: `)).trim();return l?C(l)||{type:"value",value:W(l,e)}:{type:"value",value:e}}const i=t.placeholder?.trim()||t.tips?.trim()||Y(e),c=i?`${n} (${i}\uFF0C${r}) [${d(e)}]: `:`${n} (${r}) [${d(e)}]: `,a=(await u.question(c)).trim();return a?C(a)||{type:"value",value:X(a,e)}:{type:"value",value:e}}catch(n){if(!(n instanceof s))throw n;o.write(`${n.message}
36
+ `)}}function T(u,t){const e=u.trim(),n=Number(e);if(Number.isInteger(n)&&n>=1&&n<=t.length)return structuredClone(t[n-1]);const r=t.find(i=>String(i)===e);if(r===void 0)throw new s(`\u65E0\u6548\u9009\u9879: ${u}`);return structuredClone(r)}function M(u){return typeof u.label!="string"?u.key:u.label.trim()||u.key}function _(u,t){const e=u.split(/[,,]/).map(n=>n.trim()).filter(Boolean);if(e.length===0)throw new s("\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u9009\u9879\u3002");return e.map(n=>{const r=Number(n);if(Number.isInteger(r)&&r>=1&&r<=t.length)return structuredClone(t[r-1]);const i=t.find(c=>String(c)===n);if(i===void 0)throw new s(`\u65E0\u6548\u9009\u9879: ${n}`);return structuredClone(i)})}function R(u,t){const e=u.split(/[,,]/).map(r=>r.trim()).filter(Boolean);if(e.length===0)throw new s("\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u9009\u9879\u3002");const n=e.map(r=>{const i=Number(r);if(!Number.isInteger(i)||i<1||i>t)throw new s(`\u65E0\u6548\u9009\u9879: ${r}`);return i-1});return[...new Set(n)]}function X(u,t){if(typeof t=="boolean")return b(u);if(typeof t=="number"){const e=Number(u);if(Number.isNaN(e))throw new s(`\u65E0\u6548\u6570\u5B57: ${u}`);return e}if(Array.isArray(t))return L(u);if(y(t))try{const e=JSON.parse(u);if(!y(e))throw new s(`\u8BF7\u8F93\u5165 JSON \u5BF9\u8C61: ${u}`);return e}catch{throw new s(`\u8BF7\u8F93\u5165\u5408\u6CD5 JSON \u5BF9\u8C61: ${u}`)}return u}function j(u){const t=typeof u.data_id=="string"?u.data_id.trim():"",e=typeof u.label=="string"?u.label.trim():"";return e&&t?`${e} (${t})`:e||t||"\u672A\u547D\u540D\u8BB0\u5F55"}function L(u){if(u.startsWith("["))try{const t=JSON.parse(u);if(!Array.isArray(t))throw new s(`\u8BF7\u8F93\u5165 JSON \u6570\u7EC4: ${u}`);return t}catch{throw new s(`\u8BF7\u8F93\u5165\u5408\u6CD5 JSON \u6570\u7EC4: ${u}`)}return u.split(",").map(t=>t.trim()).filter(Boolean)}function b(u){const t=u.trim().toLowerCase();if(["y","yes","true","1","on","\u5F00"].includes(t))return!0;if(["n","no","false","0","off","\u5173"].includes(t))return!1;throw new s(`\u65E0\u6548\u5F00\u5173\u503C: ${u}`)}function W(u,t){if(u.startsWith("["))try{const n=JSON.parse(u);if(!Array.isArray(n)||!n.every(r=>typeof r=="string"))throw new s(`\u8BF7\u8F93\u5165\u5B57\u7B26\u4E32\u6570\u7EC4: ${u}`);return Array.isArray(t)?n.map(h):h(n[0]??"")}catch{throw new s(`\u8BF7\u8F93\u5165\u5408\u6CD5\u989C\u8272\u6570\u7EC4: ${u}`)}const e=u.split(/[\s,,]+/).map(n=>n.trim()).filter(Boolean);if(e.length===0)throw new s("\u8BF7\u81F3\u5C11\u8F93\u5165\u4E00\u4E2A\u989C\u8272\u503C\u3002");return Array.isArray(t)?e.map(h):h(e[0])}function Y(u){return typeof u=="boolean"?"\u5F00/\u5173":Array.isArray(u)?"\u8F93\u5165 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694\u503C":y(u)?"\u8F93\u5165 JSON \u5BF9\u8C61":""}function d(u){return typeof u=="string"?u:JSON.stringify(u)}function z(u){return u===!0?"\u5F00":"\u5173"}function G(u){return Array.isArray(u)?u.join(", "):d(u)}function H(u,t){const e=Array.isArray(t)?t.map(String):[String(t)];u.forEach((n,r)=>{const i=String(n),c=e.includes(i)?"*":" ";o.write(` ${c} ${r+1}. ${i}
37
37
  `)})}function C(u){if(u==="<")return{type:"back"};if(u==="/skip")return{type:"skip"}}function K(u,t,e){if(e>0)return{fieldIndex:e-1,sectionIndex:t};for(let n=t-1;n>=0;n-=1){const r=u[n].form??[];if(r.length>0)return{fieldIndex:r.length-1,sectionIndex:n}}}function h(u){const t=u.trim();return/^[0-9a-fA-F]{3}$/.test(t)||/^[0-9a-fA-F]{6}$/.test(t)?`#${t}`:t}function Q(u){return!!(u.title?.trim()||u.code?.trim())}function $(u){return u.title?.trim()||u.code?.trim()||"\u672A\u547D\u540D"}function U(u){const t=u.code?.trim(),e=u.route?.trim(),n=u.title?.trim(),r=u.uuid?.trim();if(!t||!e||!n||!r)throw new s("\u9009\u4E2D\u7684\u5DE5\u5177\u7F3A\u5C11\u5FC5\u8981\u4FE1\u606F\uFF0C\u8BF7\u6539\u7528\u663E\u5F0F module_id/uuid\u3002");return{code:t,path:u.path?.trim()??"",route:e,title:n,uuid:r}}function V(u){const t=[];return u.hasFile&&t.push({label:"\u4E0B\u8F7D\u751F\u56FE",type:"file"}),u.downloads.length>0&&t.push({label:u.downloads.length===1?"\u4E0B\u8F7D\u5206\u6790\u7ED3\u679C":"\u9009\u62E9\u5206\u6790\u7ED3\u679C\u4E0B\u8F7D",type:"analysis"}),u.hasFile&&u.downloads.length>0&&t.push({label:"\u4E0B\u8F7D\u751F\u56FE\u548C\u5168\u90E8\u5206\u6790\u7ED3\u679C",type:"all"}),t.push({label:"\u8DF3\u8FC7",type:"skip"}),t}function Z(u){const t=(Array.isArray(u)?u:[u]).filter(e=>typeof e=="string");t.length!==0&&(o.write(`\u5F53\u524D\u989C\u8272:
38
38
  `),t.forEach(e=>{const n=h(e);o.write(` ${uu(n)} ${n}
39
- `)}))}function uu(u){const t=tu(u);return t?`\x1B[48;2;${t.r};${t.g};${t.b}m \x1B[0m`:"[?]"}function tu(u){const t=u.trim(),e=t.match(/^#([0-9a-fA-F]{3})$/);if(e){const[r,i,l]=e[1].split("").map(a=>Number.parseInt(a+a,16));return{r,g:i,b:l}}const n=t.match(/^#([0-9a-fA-F]{6})$/);if(n)return{r:Number.parseInt(n[1].slice(0,2),16),g:Number.parseInt(n[1].slice(2,4),16),b:Number.parseInt(n[1].slice(4,6),16)}}export{I as confirmPlotArgsMain,v as promptPlotArgsMain,q as promptPlotCloudRecordSelection,S as promptPlotDownloads,O as promptPlotFilePath,J as promptPlotInputSource,k as promptPlotMenuSelection,x as promptPlotResultSelection};
39
+ `)}))}function uu(u){const t=tu(u);return t?`\x1B[48;2;${t.r};${t.g};${t.b}m \x1B[0m`:"[?]"}function tu(u){const t=u.trim(),e=t.match(/^#([0-9a-fA-F]{3})$/);if(e){const[r,i,c]=e[1].split("").map(a=>Number.parseInt(a+a,16));return{r,g:i,b:c}}const n=t.match(/^#([0-9a-fA-F]{6})$/);if(n)return{r:Number.parseInt(n[1].slice(0,2),16),g:Number.parseInt(n[1].slice(2,4),16),b:Number.parseInt(n[1].slice(4,6),16)}}export{I as confirmPlotArgsMain,v as promptPlotArgsMain,q as promptPlotCloudRecordSelection,S as promptPlotDownloads,O as promptPlotFilePath,J as promptPlotInputSource,k as promptPlotMenuSelection,x as promptPlotResultSelection};
@@ -1 +1 @@
1
- import{Flags as l}from"@oclif/core";import{XtzError as c}from"./errors.js";import{isJsonObject as f}from"./json.js";const $={config:l.string({description:"Path to a JSON file with raw argsMain overrides"}),specific:l.string({description:"Override argsSpecific by key or dotted path, e.g. --specific genes=TP53 or --specific surv_list_nn.0.variable=...",multiple:!0}),set:l.string({description:"Override argsMain value by dotted path, e.g. --set title.title=My Title",multiple:!0})};function C(e){const i={};for(const r of e??[]){const t=r.indexOf("=");if(t<=0||t===r.length-1)throw new c(`--set \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);const u=r.slice(0,t).trim(),n=r.slice(t+1).trim(),s=u.split(".").filter(Boolean);if(s.length===0)throw new c(`--set \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);const o=s.at(-1)==="value"?s:[...s,"value"];m(i,o,p(n,"--set"))}return i}function E(e){return F({},e)}function F(e,i){const r=structuredClone(e);for(const t of i??[]){const u=t.indexOf("=");if(u<=0||u===t.length-1)throw new c(`--specific \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${t}`);const n=t.slice(0,u).trim(),s=t.slice(u+1).trim();if(!n)throw new c(`--specific \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${t}`);const o=n.split(".").filter(Boolean);if(o.length===0)throw new c(`--specific \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${t}`);if(o.length===1){r[o[0]]=p(s,"--specific");continue}v(r,o,p(s,"--specific"),"--specific")}return r}function O(e){const i=[];for(const[r,t]of Object.entries(e))if(f(t))for(const[u,n]of Object.entries(t)){if(!f(n)||!("value"in n))continue;const s=n.value,o=`${r}.${u}=${JSON.stringify(s)}`;i.push(`--set ${D(o)}`)}return i}function m(e,i,r){let t=e;for(const u of i.slice(0,-1)){const n=t[u];f(n)||(t[u]={}),t=t[u]}t[i.at(-1)]=r}function v(e,i,r,t){let u=e;for(let n=0;n<i.length-1;n+=1){const s=i[n],o=i[n+1],a=y(u,s,t);if(f(a)||Array.isArray(a)){u=a;continue}const h=w(o)?[]:{};d(u,s,h,t),u=h}d(u,i.at(-1),r,t)}function y(e,i,r){if(!Array.isArray(e))return e[i];const t=g(i,r);return e[t]}function d(e,i,r,t){if(!Array.isArray(e)){e[i]=r;return}const u=g(i,t);if(u>e.length)throw new c(`${t} \u6570\u7EC4\u7D22\u5F15\u8D85\u51FA\u8303\u56F4: ${i}`);e[u]=r}function g(e,i){if(!w(e))throw new c(`${i} \u6570\u7EC4\u8DEF\u5F84\u5FC5\u987B\u4F7F\u7528\u975E\u8D1F\u6574\u6570\u7D22\u5F15: ${e}`);return Number(e)}function w(e){return/^(0|[1-9]\d*)$/.test(e)}function p(e,i){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(/^-?\d+(\.\d+)?$/.test(e))return Number(e);if(e.startsWith("{")||e.startsWith("[")||e.startsWith('"'))try{return JSON.parse(e)}catch{throw new c(`${i} \u53C2\u6570\u503C\u4E0D\u662F\u5408\u6CD5 JSON: ${e}`)}return e}function D(e){return`'${e.replaceAll("'","'\\''")}'`}export{F as applySpecificOverrides,O as formatSetOverrides,C as parseSetOverrides,E as parseSpecificOverrides,$ as plotOverrideFlags};
1
+ import{Flags as l}from"@oclif/core";import{XtzError as c}from"./errors.js";import{isJsonObject as f}from"./json.js";const $={config:l.string({description:"Path to a JSON file with raw argsMain overrides"}),specific:l.string({description:"Override argsSpecific by key or dotted path, e.g. --specific genes=TP53 or --specific surv_list_nn.0.variable=...",multiple:!0}),set:l.string({description:"Override argsMain value by dotted path, e.g. --set title.title=My Title",multiple:!0})};function C(e){const r={};for(const i of e??[]){const t=i.indexOf("=");if(t<=0||t===i.length-1)throw new c(`--set \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${i}`);const n=i.slice(0,t).trim(),u=i.slice(t+1).trim(),s=n.split(".").filter(Boolean);if(s.length===0)throw new c(`--set \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${i}`);const o=s.at(-1)==="value"?s:[...s,"value"];m(r,o,p(u,"--set"))}return r}function E(e){return F({},e)}function F(e,r){const i=structuredClone(e);for(const t of r??[]){const n=t.indexOf("=");if(n<=0||n===t.length-1)throw new c(`--specific \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${t}`);const u=t.slice(0,n).trim(),s=t.slice(n+1).trim();if(!u)throw new c(`--specific \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${t}`);const o=u.split(".").filter(Boolean);if(o.length===0)throw new c(`--specific \u53C2\u6570\u683C\u5F0F\u4E0D\u6B63\u786E: ${t}`);if(o.length===1){i[o[0]]=p(s,"--specific");continue}v(i,o,p(s,"--specific"),"--specific")}return i}function O(e){const r=[];for(const[i,t]of Object.entries(e))if(f(t))for(const[n,u]of Object.entries(t)){if(!f(u)||!("value"in u))continue;const s=u.value,o=`${i}.${n}=${JSON.stringify(s)}`;r.push(`--set ${D(o)}`)}return r}function m(e,r,i){let t=e;for(const n of r.slice(0,-1)){const u=t[n];f(u)||(t[n]={}),t=t[n]}t[r.at(-1)]=i}function v(e,r,i,t){let n=e;for(let u=0;u<r.length-1;u+=1){const s=r[u],o=r[u+1],a=y(n,s,t);if(f(a)||Array.isArray(a)){n=a;continue}const h=w(o)?[]:{};d(n,s,h,t),n=h}d(n,r.at(-1),i,t)}function y(e,r,i){if(!Array.isArray(e))return e[r];const t=g(r,i);return e[t]}function d(e,r,i,t){if(!Array.isArray(e)){e[r]=i;return}const n=g(r,t);if(n>e.length)throw new c(`${t} \u6570\u7EC4\u7D22\u5F15\u8D85\u51FA\u8303\u56F4: ${r}`);e[n]=i}function g(e,r){if(!w(e))throw new c(`${r} \u6570\u7EC4\u8DEF\u5F84\u5FC5\u987B\u4F7F\u7528\u975E\u8D1F\u6574\u6570\u7D22\u5F15: ${e}`);return Number(e)}function w(e){return/^(0|[1-9]\d*)$/.test(e)}function p(e,r){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(/^-?\d+(\.\d+)?$/.test(e))return Number(e);if(e.startsWith("{")||e.startsWith("[")||e.startsWith('"'))try{return JSON.parse(e)}catch{throw new c(`${r} \u53C2\u6570\u503C\u4E0D\u662F\u5408\u6CD5 JSON: ${e}`)}return e}function D(e){return`'${e.replaceAll("'","'\\''")}'`}export{F as applySpecificOverrides,O as formatSetOverrides,C as parseSetOverrides,E as parseSpecificOverrides,$ as plotOverrideFlags};
package/dist/lib/plot.js CHANGED
@@ -1 +1 @@
1
- import{basename as S}from"node:path";import{readFile as z,stat as A}from"node:fs/promises";import{resolveUploadConfigEndpoint as _,resolveXiantaoBioApiEndpoint as h}from"./config.js";import{XtzError as c}from"./errors.js";import{requestJson as l}from"./http.js";import{debugHttpError as F,debugHttpRequest as O,debugHttpResponse as P}from"./debug.js";import{deepMerge as $}from"./json.js";import{buildArgsMainFromSchema as B}from"./plot-schema.js";async function E(e,a){const i=await l(await _(),{headers:{Authorization:`Bearer ${e.token}`}},{agent:e.agent}),t=v(i.data),s=await z(a),o=await A(a),n=S(a),d=`${t.dir}/${n}`,r=new FormData;r.set("key",d),r.set("policy",t.policy),r.set("OSSAccessKeyId",t.access_id),r.set("success_action_status","200"),r.set("signature",t.signature),r.set("file",new Blob([s]),n);const g={body:r,headers:{"x-oss-object-acl":"public-read"},method:"POST"};O(t.host,g);let u;try{u=await fetch(t.host,g)}catch(w){throw F(t.host,w),w}const b=await u.text();if(P(t.host,u,b),!u.ok)throw new c(`\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25 (${u.status})`);return{fileName:n,fileOss:`${t.host.replace(/\/$/,"")}/${d}`,fileOssPath:d,fileSize:o.size,fileSizeForXiantao:Number((o.size/(1024*1024)).toFixed(2))}}async function f(e,a,i,t){const s=y({argsMain:t,definition:a,duid:"",upload:i});delete s.args.action,s.args.id.uuid="2d491694-8c8d-11ee-9409-00163e118c99";const o=await l(await h(),{body:JSON.stringify(s),headers:{Authorization:`Bearer ${e.token}`,"Content-Type":"application/json",origin:"https://www.xiantaozi.com",referer:"https://www.xiantaozi.com/",source:"PC"},method:"POST"},{agent:e.agent}),n=o.data.id?.duid;if(!n)throw new c(o.message??"\u672A\u83B7\u53D6\u5230 duid");return{duid:n,schema:o.data.args_main??[]}}async function m(e,a,i,t){return(await f(e,a,i,t)).duid}async function p(e,a,i,t){const s=y({argsMain:t,definition:a,duid:i.duid,upload:i.upload}),o=await l(await h(),{body:JSON.stringify(s),headers:{Authorization:`Bearer ${e.token}`,"Content-Type":"application/json"},method:"POST"},{agent:e.agent});if(!o.data.file)throw new c(o.message??"\u672A\u83B7\u53D6\u5230\u56FE\u7247\u94FE\u63A5");return o.data.file}async function x(e,a,i,t){const s=await m(e,a,i,t),o=await p(e,a,{duid:s,upload:i},t);return{duid:s,file:o}}async function M(e,a,i,t){const s=await f(e,a,i,a.seedArgsMain),o=$(B(s.schema),t),n=await m(e,a,i,o),d=await p(e,a,{duid:n,upload:i},o);return{argsMain:o,duid:n,file:d,schema:s.schema}}function y(e){return{version:"v3",name:"common.module",extra_args:{name:e.duid?e.definition.submitRoute:e.definition.verifyRoute},args:{action:"submit",id:{module_id:e.definition.moduleId,uuid:"agent_call"},args_data:{duid:e.duid,info:{main:{file_oss:e.upload.fileOss,file_name:e.upload.fileName,file_size:e.upload.fileSize,type:"upload"}}},args_main:e.argsMain}}}function v(e){const a=Buffer.from(e,"base64").toString("utf8"),i=decodeURIComponent(a.replaceAll("+"," "));return JSON.parse(i)}export{x as createPlot,M as createPlotFromSchema,f as inspectPlotUpload,p as submitPlot,E as uploadFile,m as verifyPlotUpload};
1
+ import{basename as S}from"node:path";import{readFile as z,stat as A}from"node:fs/promises";import{resolveUploadConfigEndpoint as _,resolveXiantaoBioApiEndpoint as h}from"./config.js";import{XtzError as c}from"./errors.js";import{requestJson as l}from"./http.js";import{debugHttpError as F,debugHttpRequest as O,debugHttpResponse as P}from"./debug.js";import{deepMerge as $}from"./json.js";import{buildArgsMainFromSchema as B}from"./plot-schema.js";async function E(t,a){const i=await l(await _(),{headers:{Authorization:`Bearer ${t.token}`}},{agent:t.agent}),e=v(i.data),s=await z(a),o=await A(a),n=S(a),d=`${e.dir}/${n}`,r=new FormData;r.set("key",d),r.set("policy",e.policy),r.set("OSSAccessKeyId",e.access_id),r.set("success_action_status","200"),r.set("signature",e.signature),r.set("file",new Blob([s]),n);const g={body:r,headers:{"x-oss-object-acl":"public-read"},method:"POST"};O(e.host,g);let u;try{u=await fetch(e.host,g)}catch(w){throw F(e.host,w),w}const b=await u.text();if(P(e.host,u,b),!u.ok)throw new c(`\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25 (${u.status})`);return{fileName:n,fileOss:`${e.host.replace(/\/$/,"")}/${d}`,fileOssPath:d,fileSize:o.size,fileSizeForXiantao:Number((o.size/(1024*1024)).toFixed(2))}}async function f(t,a,i,e){const s=y({argsMain:e,definition:a,duid:"",upload:i});delete s.args.action,s.args.id.uuid="2d491694-8c8d-11ee-9409-00163e118c99";const o=await l(await h(),{body:JSON.stringify(s),headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json",origin:"https://www.xiantaozi.com",referer:"https://www.xiantaozi.com/",source:"PC"},method:"POST"},{agent:t.agent}),n=o.data.id?.duid;if(!n)throw new c(o.message??"\u672A\u83B7\u53D6\u5230 duid");return{duid:n,schema:o.data.args_main??[]}}async function m(t,a,i,e){return(await f(t,a,i,e)).duid}async function p(t,a,i,e){const s=y({argsMain:e,definition:a,duid:i.duid,upload:i.upload}),o=await l(await h(),{body:JSON.stringify(s),headers:{Authorization:`Bearer ${t.token}`,"Content-Type":"application/json"},method:"POST"},{agent:t.agent});if(!o.data.file)throw new c(o.message??"\u672A\u83B7\u53D6\u5230\u56FE\u7247\u94FE\u63A5");return o.data.file}async function x(t,a,i,e){const s=await m(t,a,i,e),o=await p(t,a,{duid:s,upload:i},e);return{duid:s,file:o}}async function M(t,a,i,e){const s=await f(t,a,i,a.seedArgsMain),o=$(B(s.schema),e),n=await m(t,a,i,o),d=await p(t,a,{duid:n,upload:i},o);return{argsMain:o,duid:n,file:d,schema:s.schema}}function y(t){return{version:"v3",name:"common.module",extra_args:{name:t.duid?t.definition.submitRoute:t.definition.verifyRoute},args:{action:"submit",id:{module_id:t.definition.moduleId,uuid:"agent_call"},args_data:{duid:t.duid,info:{main:{file_oss:t.upload.fileOss,file_name:t.upload.fileName,file_size:t.upload.fileSize,type:"upload"}}},args_main:t.argsMain}}}function v(t){const a=Buffer.from(t,"base64").toString("utf8"),i=decodeURIComponent(a.replaceAll("+"," "));return JSON.parse(i)}export{x as createPlot,M as createPlotFromSchema,f as inspectPlotUpload,p as submitPlot,E as uploadFile,m as verifyPlotUpload};
@@ -1,2 +1,2 @@
1
- import{mkdir as w,readFile as f,rm as F,writeFile as A}from"node:fs/promises";import p from"node:os";import E from"node:path";import{DEFAULT_AGENT as _,XTZ_CONFIG_PATH as C}from"./constants.js";import{XtzError as i}from"./errors.js";import{deepMerge as m}from"./json.js";import{isJsonObject as o}from"./json.js";import{fetchDefaultUserToolProduct as D}from"./xiantao.js";function a(r){return E.join(p.homedir(),".config","helix","token-key.txt")}async function N(r,n){const t=a(r);return await w(E.dirname(t),{recursive:!0}),await A(t,`${n.trim()}
2
- `,"utf8"),t}async function T(r){const n=a(r);try{return(await f(n,"utf8")).trim()||void 0}catch(t){if(O(t)&&t.code==="ENOENT")return;throw t}}async function l(r){const n=await T(r);if(n)return n;throw new i(`\u672A\u627E\u5230 ${r} \u7684 token\uFF0C\u8BF7\u5148\u8FD0\u884C \`xt login --profile ${r}\``)}async function v(r){const n=a(r);try{return await F(n),!0}catch(t){if(O(t)&&t.code==="ENOENT")return!1;throw t}}async function s(){const r=E.join(p.homedir(),C);try{const n=await f(r,"utf8"),t=JSON.parse(n);if(!o(t))throw new i(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);return t}catch(n){if(O(n)&&n.code==="ENOENT")return{};throw n}}async function U(r){return r?.trim()||g()||(await s()).agent?.trim()||_}async function P(r,n){if(r?.trim())return r.trim();if(process.env.XIANTAO_TOOL_PRODUCT_UUID?.trim())return process.env.XIANTAO_TOOL_PRODUCT_UUID.trim();const t=(await s()).xiantao?.toolProductUuid?.trim();if(t)return t;if(n){const u=await D(n);if(u)return u.uuid}throw new i("\u672A\u627E\u5230\u53EF\u7528\u7684 Xiantao \u5DE5\u5177\u5546\u54C1\uFF0C\u8BF7\u786E\u8BA4\u8D26\u53F7\u5DF2\u5F00\u901A\u5DE5\u5177\u5546\u54C1\uFF0C\u6216\u4F7F\u7528 `--toolProductUuid`\u3001`XIANTAO_TOOL_PRODUCT_UUID`\u3001`xiantao.toolProductUuid` \u663E\u5F0F\u6307\u5B9A\u3002")}async function R(r,n){const t=(await s()).plots?.[r],u=o(t)&&o(t.argsMain)?t.argsMain:{};if(!n)return u;const e=await S(n),c=(o(e.plots)?e.plots:void 0)?.[r];return o(c)&&o(c.argsMain)?m(u,c.argsMain):o(e.argsMain)?m(u,e.argsMain):m(u,e)}async function S(r){const n=await f(r,"utf8"),t=JSON.parse(n);if(!o(t))throw new i(`JSON \u914D\u7F6E\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);return t}function O(r){return r instanceof Error&&"code"in r}function g(){const r=process.env.AGENT_NAME?.trim();if(r)return r;if(h())return"cursor";if(d("OPENCODE"))return"opencode";if(d("OPENCLAW"))return"openclaw"}function h(){return!!(process.env.CURSOR_TRACE_ID?.trim()||process.env.CURSOR_SESSION_ID?.trim()||process.env.CURSOR_AGENT?.trim()||process.env.VSCODE_GIT_ASKPASS_NODE?.includes("Cursor")||process.env.TERM_PROGRAM?.toLowerCase()==="cursor")}function d(r){return!!(process.env[r]?.trim()||process.env[`${r}_AGENT`]?.trim()||process.env[`${r}_SESSION_ID`]?.trim()||process.env.TERM_PROGRAM?.toLowerCase()===r.toLowerCase())}export{v as deleteToken,a as getTokenPath,R as loadPlotArgsMainConfig,T as loadToken,s as readXtzConfig,l as requireToken,U as resolveAgent,P as resolveXiantaoToolProductUuid,N as saveToken};
1
+ import{mkdir as w,readFile as f,rm as F,writeFile as A}from"node:fs/promises";import p from"node:os";import E from"node:path";import{DEFAULT_AGENT as _,XTZ_CONFIG_PATH as C}from"./constants.js";import{XtzError as i}from"./errors.js";import{deepMerge as m}from"./json.js";import{isJsonObject as n}from"./json.js";import{fetchDefaultUserToolProduct as D}from"./xiantao.js";function a(r){return E.join(p.homedir(),".config","helix","token-key.txt")}async function N(r,o){const t=a(r);return await w(E.dirname(t),{recursive:!0}),await A(t,`${o.trim()}
2
+ `,"utf8"),t}async function T(r){const o=a(r);try{return(await f(o,"utf8")).trim()||void 0}catch(t){if(O(t)&&t.code==="ENOENT")return;throw t}}async function l(r){const o=await T(r);if(o)return o;throw new i(`\u672A\u627E\u5230 ${r} \u7684 token\uFF0C\u8BF7\u5148\u8FD0\u884C \`xt login --profile ${r}\``)}async function v(r){const o=a(r);try{return await F(o),!0}catch(t){if(O(t)&&t.code==="ENOENT")return!1;throw t}}async function s(){const r=E.join(p.homedir(),C);try{const o=await f(r,"utf8"),t=JSON.parse(o);if(!n(t))throw new i(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);return t}catch(o){if(O(o)&&o.code==="ENOENT")return{};throw o}}async function U(r){return r?.trim()||g()||(await s()).agent?.trim()||_}async function P(r,o){if(r?.trim())return r.trim();if(process.env.XIANTAO_TOOL_PRODUCT_UUID?.trim())return process.env.XIANTAO_TOOL_PRODUCT_UUID.trim();const t=(await s()).xiantao?.toolProductUuid?.trim();if(t)return t;if(o){const u=await D(o);if(u)return u.uuid}throw new i("\u672A\u627E\u5230\u53EF\u7528\u7684 Xiantao \u5DE5\u5177\u5546\u54C1\uFF0C\u8BF7\u786E\u8BA4\u8D26\u53F7\u5DF2\u5F00\u901A\u5DE5\u5177\u5546\u54C1\uFF0C\u6216\u4F7F\u7528 `--toolProductUuid`\u3001`XIANTAO_TOOL_PRODUCT_UUID`\u3001`xiantao.toolProductUuid` \u663E\u5F0F\u6307\u5B9A\u3002")}async function R(r,o){const t=(await s()).plots?.[r],u=n(t)&&n(t.argsMain)?t.argsMain:{};if(!o)return u;const e=await S(o),c=(n(e.plots)?e.plots:void 0)?.[r];return n(c)&&n(c.argsMain)?m(u,c.argsMain):n(e.argsMain)?m(u,e.argsMain):m(u,e)}async function S(r){const o=await f(r,"utf8"),t=JSON.parse(o);if(!n(t))throw new i(`JSON \u914D\u7F6E\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);return t}function O(r){return r instanceof Error&&"code"in r}function g(){const r=process.env.AGENT_NAME?.trim();if(r)return r;if(h())return"cursor";if(d("OPENCODE"))return"opencode";if(d("OPENCLAW"))return"openclaw"}function h(){return!!(process.env.CURSOR_TRACE_ID?.trim()||process.env.CURSOR_SESSION_ID?.trim()||process.env.CURSOR_AGENT?.trim()||process.env.VSCODE_GIT_ASKPASS_NODE?.includes("Cursor")||process.env.TERM_PROGRAM?.toLowerCase()==="cursor")}function d(r){return!!(process.env[r]?.trim()||process.env[`${r}_AGENT`]?.trim()||process.env[`${r}_SESSION_ID`]?.trim()||process.env.TERM_PROGRAM?.toLowerCase()===r.toLowerCase())}export{v as deleteToken,a as getTokenPath,R as loadPlotArgsMainConfig,T as loadToken,s as readXtzConfig,l as requireToken,U as resolveAgent,P as resolveXiantaoToolProductUuid,N as saveToken};
@@ -1 +1 @@
1
- import{resolveXiantaoBioApiEndpoint as i}from"./config.js";import{XtzError as m}from"./errors.js";import{requestJson as n}from"./http.js";import{buildXiantaoHeaders as u}from"./xiantao.js";async function p(a,e){const o=await n(await i(),{body:JSON.stringify({version:"v3",name:"public.verify.upload",args:{id:{module_id:e.moduleId,uuid:e.uuid},args_data:{duid:"",info:f(e.uploads)},args_main:e.argsMain}}),headers:await u(a,!0),method:"POST"},{agent:a.agent}),t=o.data.id?.duid;if(!t)throw new m(o.message??"\u672A\u83B7\u53D6\u5230 duid");return{duid:t,schema:o.data.args_main??[]}}async function y(a,e){const o=await n(await i(),{body:JSON.stringify({version:"v3",name:"common.module",extra_args:{name:e.route},args:{action:"submit",id:{module_id:e.moduleId,uuid:e.uuid},args_data:l(e.duid,e.input),args_main:e.argsMain,args_specific:e.argsSpecific}}),headers:await u(a,!0),method:"POST"},{agent:a.agent,allowErrorPayload:g=>c(g.message)}),t=w(o.data.data),r=typeof o.data.file=="string"&&o.data.file.trim()?o.data.file.trim():void 0,s=o.data.body??"",d=o.message??"";if(!r&&!s&&t.length===0){if(c(d))return{asyncSubmission:!0,body:s,downloads:t,file:r,message:d};throw new m(d||"\u672A\u83B7\u53D6\u5230\u53EF\u7528\u7ED3\u679C")}return{asyncSubmission:!1,body:s,downloads:t,file:r,message:d}}async function b(a,e){const o=await n(await i(),{body:JSON.stringify({version:"v3",name:e.item.endpoint,args:{tag:"download",name:e.item.endpoint,fuid:e.item.fuid,sign:e.item.sign,device:e.item.device,index:e.item.index,info:e.item.info,pos:e.item.pos,id:{uuid:e.uuid,module_id:e.moduleId}}}),headers:await u(a,!0),method:"POST"},{agent:a.agent}),t=o.data.url?.trim();if(!t)throw new m(o.message??"\u672A\u83B7\u53D6\u5230\u4E0B\u8F7D\u94FE\u63A5");return{fileName:o.data.file_name?.trim()||void 0,url:t}}function w(a){const e=[...a?.buttons??[]];for(const o of a?.tabs??[])for(const t of o.sections??[])e.push(...t.button??[]);return e.flatMap(o=>o.tag!=="download"||!o.device||!o.endpoint||!o.fuid||!o.label?[]:[{device:o.device,endpoint:o.endpoint,fuid:o.fuid,index:o.index,info:o.info,label:o.label,pos:o.pos,sign:o.sign}])}function v(a){return a.fileOssPath??a.fileOss}function _(a){return a.fileSizeForXiantao??a.fileSize}function l(a,e){return e.kind==="cloud"?{duid:a,info:{[e.cloud.key]:h(e.cloud.record)}}:e.kind==="record"?{duid:a,info:{[e.record.key]:{label:e.record.label,module_id:e.record.moduleId,module_name:e.record.moduleName,record_id:e.record.recordId,record_name:e.record.recordName,time:e.record.time,type:"record"}}}:{duid:a,info:f(e.uploads)}}function h(a){const e=structuredClone(a);return(typeof e.type!="string"||!e.type.trim())&&(e.type="cloud"),e}function f(a){return Object.fromEntries(a.map(e=>[e.key,{file_oss:v(e.upload),file_name:e.upload.fileName,file_size:_(e.upload),type:"upload"}]))}async function S(a,e){await n(await i(),{body:JSON.stringify({version:"v3",name:"public.output.save",args:{tag:"msg-box",type:"all",name:"public.output.save",fuid:e.fuid,pos:"main",id:{uuid:e.uuid,module_id:e.moduleId},value:e.name}}),headers:await u(a,!0),method:"POST"},{agent:a.agent})}function c(a){return!!a?.includes("\u4EFB\u52A1\u63D0\u4EA4\u6210\u529F")}export{l as buildSubmitArgsData,b as resolveXiantaoDownload,S as saveXiantaoOutput,y as submitXiantaoPlot,p as verifyXiantaoPlotUpload};
1
+ import{resolveXiantaoBioApiEndpoint as n}from"./config.js";import{XtzError as m}from"./errors.js";import{requestJson as t}from"./http.js";import{buildXiantaoHeaders as u}from"./xiantao.js";async function p(a,e){const o=await t(await n(),{body:JSON.stringify({version:"v3",name:"public.verify.upload",args:{id:{module_id:e.moduleId,uuid:e.uuid},args_data:{duid:"",info:f(e.uploads)},args_main:e.argsMain}}),headers:await u(a,!0),method:"POST"},{agent:a.agent}),d=o.data.id?.duid;if(!d)throw new m(o.message??"\u672A\u83B7\u53D6\u5230 duid");return{duid:d,schema:o.data.args_main??[]}}async function y(a,e){const o=await t(await n(),{body:JSON.stringify({version:"v3",name:"common.module",extra_args:{name:e.route},args:{action:"submit",id:{module_id:e.moduleId,uuid:e.uuid},args_data:l(e.duid,e.input),args_main:e.argsMain,args_specific:e.argsSpecific}}),headers:await u(a,!0),method:"POST"},{agent:a.agent,allowErrorPayload:g=>c(g.message)}),d=w(o.data.data),r=typeof o.data.file=="string"&&o.data.file.trim()?o.data.file.trim():void 0,s=o.data.body??"",i=o.message??"";if(!r&&!s&&d.length===0){if(c(i))return{asyncSubmission:!0,body:s,downloads:d,file:r,message:i};throw new m(i||"\u672A\u83B7\u53D6\u5230\u53EF\u7528\u7ED3\u679C")}return{asyncSubmission:!1,body:s,downloads:d,file:r,message:i}}async function b(a,e){const o=await t(await n(),{body:JSON.stringify({version:"v3",name:e.item.endpoint,args:{tag:"download",name:e.item.endpoint,fuid:e.item.fuid,sign:e.item.sign,device:e.item.device,index:e.item.index,info:e.item.info,pos:e.item.pos,id:{uuid:e.uuid,module_id:e.moduleId}}}),headers:await u(a,!0),method:"POST"},{agent:a.agent}),d=o.data.url?.trim();if(!d)throw new m(o.message??"\u672A\u83B7\u53D6\u5230\u4E0B\u8F7D\u94FE\u63A5");return{fileName:o.data.file_name?.trim()||void 0,url:d}}function w(a){const e=[...a?.buttons??[]];for(const o of a?.tabs??[])for(const d of o.sections??[])e.push(...d.button??[]);return e.flatMap(o=>o.tag!=="download"||!o.device||!o.endpoint||!o.fuid||!o.label?[]:[{device:o.device,endpoint:o.endpoint,fuid:o.fuid,index:o.index,info:o.info,label:o.label,pos:o.pos,sign:o.sign}])}function v(a){return a.fileOssPath??a.fileOss}function _(a){return a.fileSizeForXiantao??a.fileSize}function l(a,e){return e.kind==="cloud"?{duid:a,info:{[e.cloud.key]:h(e.cloud.record)}}:e.kind==="record"?{duid:a,info:{[e.record.key]:{label:e.record.label,module_id:e.record.moduleId,module_name:e.record.moduleName,record_id:e.record.recordId,record_name:e.record.recordName,time:e.record.time,type:"record"}}}:{duid:a,info:f(e.uploads)}}function h(a){const e=structuredClone(a);return(typeof e.type!="string"||!e.type.trim())&&(e.type="cloud"),e}function f(a){return Object.fromEntries(a.map(e=>[e.key,{file_oss:v(e.upload),file_name:e.upload.fileName,file_size:_(e.upload),type:"upload"}]))}async function S(a,e){await t(await n(),{body:JSON.stringify({version:"v3",name:"public.output.save",args:{tag:"msg-box",type:"all",name:"public.output.save",fuid:e.fuid,pos:"main",id:{uuid:e.uuid,module_id:e.moduleId},value:e.name}}),headers:await u(a,!0),method:"POST"},{agent:a.agent})}function c(a){return!!a?.includes("\u4EFB\u52A1\u63D0\u4EA4\u6210\u529F")}export{l as buildSubmitArgsData,b as resolveXiantaoDownload,S as saveXiantaoOutput,y as submitXiantaoPlot,p as verifyXiantaoPlotUpload};
@@ -1 +1 @@
1
- import{resolveXiantaoBaseUrl as A,resolveXiantaoBioApiEndpoint as p,resolveXiantaoToolMenusEndpoint as w,resolveXiantaoUserToolProductsEndpoint as B}from"./config.js";import{XtzError as c}from"./errors.js";import{requestJson as s}from"./http.js";async function y(e){return(await s(await B(),{headers:await n(e),method:"GET"},{agent:e.agent})).data.map(t=>({status:t.status?.trim()??"",title:t.tool_product?.title?.trim()??"",uuid:t.tool_product?.uuid?.trim()||t.tool_uuid?.trim()||""})).filter(t=>t.uuid)}async function v(e){const t=await y(e);return t.find(a=>a.status==="normal")??t[0]}async function F(e,t,a){const r=await w(),u=new URL(`${r}/${t}`);u.searchParams.set("f",E({tool_product_uuid:a}));try{return(await s(u.toString(),{headers:await n(e),method:"GET"},{agent:e.agent})).data}catch(i){if(!(i instanceof c)||!i.message.includes("\u5DF2\u4E0B\u67B6"))throw i;const o=_(await d(e,a),t);if(o)return o;throw i}}async function d(e,t){const a=new URL(await w());return a.searchParams.set("f",E({is_all:1,tool_product_uuid:t})),(await s(a.toString(),{headers:await n(e),method:"GET"},{agent:e.agent})).data}async function M(e,t,a){const r=a.trim(),u=m(await d(e,t),r);if(u.length===0)throw new c(`\u672A\u627E\u5230\u6A21\u5757 ${r}\uFF0C\u8BF7\u786E\u8BA4 module_id \u6216 tool_product_uuid \u662F\u5426\u6B63\u786E\u3002`);if(u.length>1)throw new c(`\u6A21\u5757 ${r} \u5339\u914D\u5230\u591A\u4E2A\u7ED3\u679C\uFF0C\u8BF7\u6539\u7528 \`--uuid\` \u663E\u5F0F\u6307\u5B9A\u3002`);return u[0]}function l(e){return m(e)}function P(e){return l(e).map(t=>({module_id:t.code,path:t.path,route:t.route,title:t.title,uuid:t.uuid}))}function S(e,t){const a=t.trim().toLowerCase();return l(e).filter(r=>[r.code,r.title,r.path,r.route].some(u=>u.toLowerCase().includes(a))).sort((r,u)=>C(u,a)-C(r,a))}async function L(e,t){return(await s(await p(),{body:JSON.stringify({args:{id:{module_id:t.moduleId,uuid:t.uuid}},name:"public.args.fetch-all",version:"v3"}),headers:await n(e,!0),method:"POST"},{agent:e.agent})).data}async function U(e,t){return(await s(await p(),{body:JSON.stringify({args:{args_data:t.argsData,args_key:t.argsKey,args_main:t.argsMain,args_specific:t.argsSpecific,id:{module_id:t.moduleId,uuid:t.uuid}},name:"public.args.update-args",version:"v3"}),headers:await n(e,!0),method:"POST"},{agent:e.agent})).data}function f(e){return(e.children??[]).filter(t=>!!(t.title?.trim()||t.code?.trim()))}function T(e){return!!(e.code?.trim()&&e.route?.trim()&&e.title?.trim()&&e.uuid?.trim())}function m(e,t){const a=[];for(const r of e){const u=r.code?.trim();if((!t||u===t)&&T(r)){const o=r.route?.trim(),h=r.title?.trim(),g=r.uuid?.trim();u&&o&&h&&g&&a.push({code:u,path:r.path?.trim()??"",route:o,title:h,uuid:g})}const i=f(r);i.length>0&&a.push(...m(i,t))}return a}function _(e,t){const a=t.trim();for(const r of e){if(r.uuid?.trim()===a||String(r.id??"").trim()===a)return r;const u=f(r);if(u.length>0){const i=_(u,a);if(i)return i}}}function C(e,t){let a=0;const r=e.code.toLowerCase(),u=e.title.toLowerCase(),i=e.path.toLowerCase(),o=e.route.toLowerCase();return r===t?a+=500:r.startsWith(t)?a+=300:r.includes(t)&&(a+=150),u===t?a+=400:u.startsWith(t)?a+=250:u.includes(t)&&(a+=120),i.includes(t)&&(a+=80),o.includes(t)&&(a+=40),a}function E(e){return encodeURIComponent(JSON.stringify(e))}async function n(e,t=!1){const a=await A(),r={Authorization:`Bearer ${e.token}`,origin:a,platform:"pc",referer:a,source:"PC"};return t&&(r["Content-Type"]="application/json"),r}export{n as buildXiantaoHeaders,L as fetchAllPlotArgs,v as fetchDefaultUserToolProduct,F as fetchToolMenu,d as fetchToolMenus,y as fetchUserToolProducts,f as getBrowsableToolMenuChildren,T as isRunnableToolMenu,l as listResolvedToolMenus,P as listToolMenuSummaries,M as resolveToolMenuByCode,S as searchResolvedToolMenus,U as updatePlotArgs};
1
+ import{resolveXiantaoBaseUrl as A,resolveXiantaoBioApiEndpoint as p,resolveXiantaoToolMenusEndpoint as w,resolveXiantaoUserToolProductsEndpoint as B}from"./config.js";import{encrypt as v}from"./encrypt.js";import{XtzError as c}from"./errors.js";import{requestJson as s}from"./http.js";async function y(e){return(await s(await B(),{headers:await n(e),method:"GET"},{agent:e.agent})).data.map(t=>({status:t.status?.trim()??"",title:t.tool_product?.title?.trim()??"",uuid:t.tool_product?.uuid?.trim()||t.tool_uuid?.trim()||""})).filter(t=>t.uuid)}async function F(e){const t=await y(e);return t.find(a=>a.status==="normal")??t[0]}async function M(e,t,a){const r=await w(),u=new URL(`${r}/${t}`);u.searchParams.set("f",C({tool_product_uuid:a}));try{return(await s(u.toString(),{headers:await n(e),method:"GET"},{agent:e.agent})).data}catch(o){if(!(o instanceof c)||!o.message.includes("\u5DF2\u4E0B\u67B6"))throw o;const i=_(await d(e,a),t);if(i)return i;throw o}}async function d(e,t){const a=new URL(await w());return a.searchParams.set("f",C({is_all:1,tool_product_uuid:t})),(await s(a.toString(),{headers:await n(e),method:"GET"},{agent:e.agent})).data}async function P(e,t,a){const r=a.trim(),u=m(await d(e,t),r);if(u.length===0)throw new c(`\u672A\u627E\u5230\u6A21\u5757 ${r}\uFF0C\u8BF7\u786E\u8BA4 module_id \u6216 tool_product_uuid \u662F\u5426\u6B63\u786E\u3002`);if(u.length>1)throw new c(`\u6A21\u5757 ${r} \u5339\u914D\u5230\u591A\u4E2A\u7ED3\u679C\uFF0C\u8BF7\u6539\u7528 \`--uuid\` \u663E\u5F0F\u6307\u5B9A\u3002`);return u[0]}function l(e){return m(e)}function S(e){return l(e).map(t=>({module_id:t.code,path:t.path,route:t.route,title:t.title,uuid:t.uuid}))}function L(e,t){const a=t.trim().toLowerCase();return l(e).filter(r=>[r.code,r.title,r.path,r.route].some(u=>u.toLowerCase().includes(a))).sort((r,u)=>E(u,a)-E(r,a))}async function b(e,t){return(await s(await p(),{body:JSON.stringify({args:{id:{module_id:t.moduleId,uuid:t.uuid}},name:"public.args.fetch-all",version:"v3"}),headers:await n(e,!0),method:"POST"},{agent:e.agent})).data}async function U(e,t){return(await s(await p(),{body:JSON.stringify({args:{args_data:t.argsData,args_key:t.argsKey,args_main:t.argsMain,args_specific:t.argsSpecific,id:{module_id:t.moduleId,uuid:t.uuid}},name:"public.args.update-args",version:"v3"}),headers:await n(e,!0),method:"POST"},{agent:e.agent})).data}function f(e){return(e.children??[]).filter(t=>!!(t.title?.trim()||t.code?.trim()))}function T(e){return!!(e.code?.trim()&&e.route?.trim()&&e.title?.trim()&&e.uuid?.trim())}function m(e,t){const a=[];for(const r of e){const u=r.code?.trim();if((!t||u===t)&&T(r)){const i=r.route?.trim(),h=r.title?.trim(),g=r.uuid?.trim();u&&i&&h&&g&&a.push({code:u,path:r.path?.trim()??"",route:i,title:h,uuid:g})}const o=f(r);o.length>0&&a.push(...m(o,t))}return a}function _(e,t){const a=t.trim();for(const r of e){if(r.uuid?.trim()===a||String(r.id??"").trim()===a)return r;const u=f(r);if(u.length>0){const o=_(u,a);if(o)return o}}}function E(e,t){let a=0;const r=e.code.toLowerCase(),u=e.title.toLowerCase(),o=e.path.toLowerCase(),i=e.route.toLowerCase();return r===t?a+=500:r.startsWith(t)?a+=300:r.includes(t)&&(a+=150),u===t?a+=400:u.startsWith(t)?a+=250:u.includes(t)&&(a+=120),o.includes(t)&&(a+=80),i.includes(t)&&(a+=40),a}function C(e){return v.encryption(e)}async function n(e,t=!1){const a=await A(),r={Authorization:`Bearer ${e.token}`,origin:a,platform:"pc",referer:a,source:"PC"};return t&&(r["Content-Type"]="application/json"),r}export{n as buildXiantaoHeaders,b as fetchAllPlotArgs,F as fetchDefaultUserToolProduct,M as fetchToolMenu,d as fetchToolMenus,y as fetchUserToolProducts,f as getBrowsableToolMenuChildren,T as isRunnableToolMenu,l as listResolvedToolMenus,S as listToolMenuSummaries,P as resolveToolMenuByCode,L as searchResolvedToolMenus,U as updatePlotArgs};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helixlife-ai/xiantao",
3
- "version": "0.1.29",
3
+ "version": "0.1.31",
4
4
  "description": "CLI for Xiantao bioinformatics tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",