@helixlife-ai/xiantao 0.1.40 → 0.1.41
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/commands/plot/run.js +10 -8
- package/dist/commands/tool/exec.js +1 -1
- package/dist/commands/tool/inspect.js +3 -3
- package/dist/commands/tool/prepare.js +1 -1
- package/dist/lib/auth.js +1 -1
- package/dist/lib/download.js +1 -1
- package/dist/lib/flags.js +1 -1
- package/dist/lib/http.js +1 -1
- package/dist/lib/plot-interactive.js +25 -21
- package/dist/lib/plot.js +1 -1
- package/dist/lib/storage.js +1 -1
- package/dist/lib/throttle.js +1 -0
- package/dist/lib/tool-inputs.js +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import{readFile as
|
|
1
|
+
import{readFile as U}from"node:fs/promises";import{Args as x,Flags as h}from"@oclif/core";import{XtzCommand as E}from"../../base-command.js";import{getAuthContext as M}from"../../lib/auth.js";import{XIANTAO_HISTORY_UUID as j}from"../../lib/constants.js";import{downloadToPath as g}from"../../lib/download.js";import{XtzChoiceRequiredError as T,XtzError as a}from"../../lib/errors.js";import{globalFlags as q,toolCloudFlags as V,toolRecordFlags as Q}from"../../lib/flags.js";import{fetchXiantaoHistoryDownloadButtons as G,getXiantaoHistoryRecordStatus as Y,waitForLatestXiantaoHistoryRecord as W,waitForXiantaoHistoryRecordCompletion as Z}from"../../lib/history.js";import{deepMerge as v,isJsonObject as H}from"../../lib/json.js";import{confirmPlotArgsMain as ee,promptPlotArgsMain as oe,promptPlotCloudRecordSelection as te,promptPlotFilePath as z,promptPlotInputSource as de,promptPlotMenuSelection as ie,promptPlotRecordSelection as re,promptPlotResultSelection as ne}from"../../lib/plot-interactive.js";import{uploadFile as le}from"../../lib/plot.js";import{applySpecificOverrides as K,parseSetOverrides as ae,plotOverrideFlags as ue}from"../../lib/plot-options.js";import{buildArgsMainFromSchema as S,buildArgsSpecificFromSchema as N}from"../../lib/plot-schema.js";import{loadPlotArgsMainConfig as se,resolveXiantaoToolProductUuid as ce}from"../../lib/storage.js";import{findDefaultXiantaoCloudInput as C,findDefaultXiantaoRecord as X,findXiantaoArgsDataType as A,findXiantaoRecordFieldByKey as me,listXiantaoUploadFields as k}from"../../lib/tool-inputs.js";import{fetchXiantaoCloudData as J}from"../../lib/xiantao-cloud.js";import{buildSubmitArgsData as he,resolveXiantaoDownload as L,submitXiantaoPlot as fe,verifyXiantaoPlotUpload as we}from"../../lib/xiantao-plot.js";import{fetchAllPlotArgs as ye,fetchToolMenu as pe,fetchToolMenus as _e,resolveToolMenuByCode as Ie,updatePlotArgs as Re}from"../../lib/xiantao.js";class be extends E{resolveToolFileInputs(e,o){if(e&&o&&o.length>0)throw new a("FILE \u4E0E `--file` \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");return e?[e]:o??[]}async prepareToolRun(e,o,t){this.validateInputSourceFlags(o,t);const d=await this.getProfile(t.profile),i=await M(d,t.token),r=await this.resolveModule(e,t,i),{moduleId:l,route:n,toolProductUuid:u,uuid:s}=r,c=await ye(i,{moduleId:l,uuid:s}),f=t.recordKey?.trim()||"",w=t.cloudKey?.trim()||"",R=!!(w&&A(c.args_data??[],w)==="XTRecord"),B=!!(f||t.recordId?.trim()||t.recordJson||t.recordFile),p=await this.resolveInputMode(c,{cloudRequested:!!(t.cloudDataId?.trim()||t.cloudFilter?.trim()||typeof t.cloudIndex=="number"||w&&!R||t.cloudRecordFile&&!R||t.cloudRecordJson&&!R),recordRequested:B||R,demo:t.demo,fileInputs:o,interactive:t.interactive}),O=await se(l,t.config),$=v(O,ae(t.set));let y=c.args_main??[],_=c.args_specific??[],I=v(S(y),$),P=K(N(_),t.specific),m=p.mode==="cloud"?await this.resolveCloudInput(c,t,l,i,s):p.mode==="demo"?this.resolveDemoInput(c,l):p.mode==="record"?await this.resolveRecordInput(c,t,l):p.mode==="none"?this.resolveNoInput(c):await this.uploadAndVerify(d,p.fileInputs??[],{argsMain:I,argsData:c.args_data??[],moduleId:l,uuid:s},i);if(m.schema.length&&(y=m.schema,I=v(S(y),$)),m.input.kind==="cloud"){const D=await Re(i,{argsData:he(m.duid,m.input),argsKey:m.input.cloud.key,argsMain:I,argsSpecific:P,moduleId:l,uuid:s}),b=C(D.args_data??[]);b&&(m={...m,input:{kind:"cloud",cloud:{key:b.key,label:b.label,record:this.normalizeCloudRecord(b.record)}}}),y=D.args_main??y,_=D.args_specific??_,I=v(S(y),$),P=K(N(_),t.specific)}return{agent:d,argsMain:I,argsSpecific:P,argsSpecificSchema:_,auth:i,duid:m.duid,input:m.input,inputMode:p.mode,inputSummary:this.summarizePreparedInput(m.input),moduleId:l,notice:c.notice??"",route:n,schema:y,toolProductUuid:u,uuid:s}}async executeToolRun(e,o,t){this.validateDownloadFlags(t);const d=await this.prepareToolRun(e,o,t);let i=d.argsMain;const r=d.argsSpecific;t.interactive&&(i=await oe(d.schema??[],i),await ee(i));const l=Date.now(),n=await fe(d.auth,{argsMain:i,argsSpecific:r,duid:d.duid,input:d.input,moduleId:d.moduleId,route:d.route,uuid:d.uuid});if(n.asyncSubmission)return this.resolveAsyncToolRun(d,i,r,t,l,n.message);const u=t.download?await this.downloadResult(d.auth,{downloadPath:t.download,downloadItem:t.downloadItem,downloadLabel:t.downloadLabel,downloads:n.downloads,file:n.file,moduleId:d.moduleId,uuid:d.uuid}):await this.downloadInteractiveResults(d.auth,{choice:t.interactive?await ne({downloads:n.downloads,hasFile:!!n.file}):{downloadFile:!1,downloads:[]},file:n.file,moduleId:d.moduleId,uuid:d.uuid}),s=u[0];return{data:{agent:d.agent,args_main:i,args_specific:r,body:n.body,download_path:s,download_paths:u,downloads:n.downloads,duid:d.duid,file:n.file??null,history:null,history_hint:null,...d.inputSummary,mode:d.inputMode,module_id:d.moduleId,notice:d.notice,result_source:"direct",route:d.route,submission_message:n.message,tool_product_uuid:d.toolProductUuid,uuid:d.uuid},text:this.formatResultText(n,u,t.interactive&&!t.download)}}async resolveAsyncToolRun(e,o,t,d,i,r){const l=await W(e.auth,{intervalMs:3e3,moduleId:e.moduleId,submittedAtMs:i,timeoutMs:d.download?6e4:12e3}),n=l?this.toHistorySummary(l,e.moduleId):null;if(!d.download)return{data:{agent:e.agent,args_main:o,args_specific:t,body:"",download_path:void 0,download_paths:[],downloads:[],duid:e.duid,file:null,history:n,history_hint:this.buildHistoryHint(n),...e.inputSummary,mode:e.inputMode,module_id:e.moduleId,notice:e.notice,result_source:"history",route:e.route,submission_message:r,tool_product_uuid:e.toolProductUuid,uuid:e.uuid},text:this.formatAsyncHistoryText(n,r)};if(!l?.fuid?.trim())return{data:{agent:e.agent,args_main:o,args_specific:t,body:"",download_path:void 0,download_paths:[],downloads:[],duid:e.duid,file:null,history:n,history_hint:this.buildHistoryHint(n),...e.inputSummary,mode:e.inputMode,module_id:e.moduleId,notice:e.notice,result_source:"history",route:e.route,submission_message:r,tool_product_uuid:e.toolProductUuid,uuid:e.uuid},text:this.formatAsyncHistoryText(n,`${r}\uFF0C\u4F46\u6682\u672A\u5B9A\u4F4D\u5230\u5386\u53F2\u8BB0\u5F55\u3002`)};const u=await Z(e.auth,{fuid:l.fuid.trim(),intervalMs:3e3,timeoutMs:6e4}),s=u?this.toHistorySummary(u,e.moduleId):n;if(!u?.fuid?.trim())return{data:{agent:e.agent,args_main:o,args_specific:t,body:"",download_path:void 0,download_paths:[],downloads:[],duid:e.duid,file:null,history:s,history_hint:this.buildHistoryHint(s),...e.inputSummary,mode:e.inputMode,module_id:e.moduleId,notice:e.notice,result_source:"history",route:e.route,submission_message:`${r}\uFF0C\u4F46\u7B49\u5F85\u5386\u53F2\u8BB0\u5F55\u5B8C\u6210\u8D85\u65F6\u3002`,tool_product_uuid:e.toolProductUuid,uuid:e.uuid},text:this.formatAsyncHistoryText(s,`${r}\uFF0C\u4F46\u7B49\u5F85\u5386\u53F2\u8BB0\u5F55\u5B8C\u6210\u8D85\u65F6\u3002`)};const{body:c,downloads:f,paths:w}=await this.downloadAsyncHistoryResult(e.auth,{downloadPath:d.download,downloadItem:d.downloadItem,downloadLabel:d.downloadLabel,fuid:u.fuid.trim(),moduleId:e.moduleId});return{data:{agent:e.agent,args_main:o,args_specific:t,body:c,download_path:w[0],download_paths:w,downloads:f,duid:e.duid,file:null,history:s,history_hint:this.buildHistoryHint(s),...e.inputSummary,mode:e.inputMode,module_id:e.moduleId,notice:e.notice,result_source:"history",route:e.route,submission_message:r,tool_product_uuid:e.toolProductUuid,uuid:e.uuid},text:this.formatAsyncHistoryDownloadText(s,w)}}async downloadAsyncHistoryResult(e,o){let t;for(let d=0;d<4;d+=1){const i=await G(e,{fuid:o.fuid});try{const r=await this.downloadResult(e,{downloadPath:o.downloadPath,downloadItem:o.downloadItem,downloadLabel:o.downloadLabel,downloads:i.downloads,moduleId:o.moduleId,uuid:j});return{body:i.body,downloads:i.downloads,paths:r}}catch(r){if(!(r instanceof a)||!this.isRetryableAsyncDownloadError(r)||d===3)throw r;t=r,await this.sleep(3e3)}}throw t??new a("\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")}formatResultText(e,o,t){const d=[];if(e.file&&d.push(e.file),!e.file&&(e.downloads.length>0||e.body)&&d.push("\u5206\u6790\u5B8C\u6210"),!e.file&&!e.body&&e.downloads.length===0)return"\u63D0\u4EA4\u5B8C\u6210";if(e.downloads.length>0&&!t)for(const i of e.downloads)d.push(`${i.label} (${i.device})`);for(const i of o)d.push(i);return d.join(`
|
|
2
2
|
`)}formatAsyncHistoryText(e,o){const t=[o];return e&&t.push(`\u5386\u53F2\u8BB0\u5F55: ${e.fuid} (${e.status})`),t.push(this.buildHistoryHint(e)),t.join(`
|
|
3
|
-
`)}formatAsyncHistoryDownloadText(e,o){const t=[];e&&t.push(`\u5386\u53F2\u8BB0\u5F55: ${e.fuid} (${e.status})`);for(const
|
|
4
|
-
`)}async downloadResult(e,o){if(o.downloads.length>0){const t=this.pickDownloadItem(o.downloads,{item:o.downloadItem,label:o.downloadLabel,outputPath:o.downloadPath});if(!t)throw new a(this.buildMultipleDownloadsMessage(o.downloads));const
|
|
5
|
-
${this.buildMultipleDownloadsMessage(e)}`)}const
|
|
6
|
-
${this.buildMultipleDownloadsMessage(e)}`);return e[o-1]}pickDownloadItemByLabel(e,o){const t=o.trim().toLowerCase();if(!t)return;const
|
|
7
|
-
${this.buildMultipleDownloadsMessage(e)}`)}inferDownloadDevice(e){if(!e)return;const o=e.trim().split(".").pop()?.toLowerCase();if(o)return this.normalizeDevice(o)}normalizeDevice(e){const o=e.trim().toLowerCase();return o==="tif"?"tiff":o==="jpg"?"jpeg":o}buildMultipleDownloadsMessage(e){const o=["\u5F53\u524D\u6A21\u5757\u8FD4\u56DE\u591A\u4E2A\u53EF\u4E0B\u8F7D\u6587\u4EF6\uFF0C\u8BF7\u4F7F\u7528 `--downloadItem`\u3001`--downloadLabel` \u6216\u5E26\u76EE\u6807\u6269\u5C55\u540D\u7684 `--download` \u8DEF\u5F84\u660E\u786E\u9009\u62E9\u3002","\u53EF\u9009\u4E0B\u8F7D\u9879\uFF1A"];return e.forEach((t,
|
|
8
|
-
`)}validateDownloadFlags(e){if(e.downloadItem!==void 0&&e.downloadLabel)throw new a("`--downloadItem` \u4E0E `--downloadLabel` \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");if((e.downloadItem!==void 0||e.downloadLabel)&&!e.download)throw new a("`--downloadItem` \u548C `--downloadLabel` \u4EC5\u53EF\u4E0E `--download` \u4E00\u8D77\u4F7F\u7528\u3002")}toHistorySummary(e,o){const t=e.fuid?.trim();return t?{fuid:t,id:typeof e.id=="number"?e.id:null,module_id:e.module_id?.trim()||o,module_name:e.module_name?.trim()||"",name:e.name?.trim()||"",status:
|
|
9
|
-
|
|
3
|
+
`)}formatAsyncHistoryDownloadText(e,o){const t=[];e&&t.push(`\u5386\u53F2\u8BB0\u5F55: ${e.fuid} (${e.status})`);for(const d of o)t.push(d);return t.join(`
|
|
4
|
+
`)}async downloadResult(e,o){if(o.downloads.length>0){const t=this.pickDownloadItem(o.downloads,{item:o.downloadItem,label:o.downloadLabel,outputPath:o.downloadPath});if(!t)throw new a(this.buildMultipleDownloadsMessage(o.downloads));const d=await L(e,{item:t,moduleId:o.moduleId,uuid:o.uuid});return[await g(d.url,o.downloadPath)]}if(o.file)return[await g(o.file,o.downloadPath)];throw new a("\u5F53\u524D\u6A21\u5757\u672A\u8FD4\u56DE\u53EF\u4E0B\u8F7D\u6587\u4EF6\u3002")}pickDownloadItem(e,o){if(o.item!==void 0)return this.pickDownloadItemByIndex(e,o.item);if(o.label)return this.pickDownloadItemByLabel(e,o.label);const t=this.inferDownloadDevice(o.outputPath);if(t){const i=e.filter(r=>this.normalizeDevice(r.device)===t);if(i.length===1)return i[0];if(i.length>1)throw new a(`\u4E0B\u8F7D\u683C\u5F0F ${t} \u5339\u914D\u5230\u591A\u4E2A\u7ED3\u679C\uFF0C\u8BF7\u6539\u7528 \`--downloadItem\` \u6216 \`--downloadLabel\` \u7CBE\u786E\u9009\u62E9\u3002
|
|
5
|
+
${this.buildMultipleDownloadsMessage(e)}`)}const d=e.filter(i=>i.endpoint==="public.output.download-result");if(d.length===1)return d[0];if(e.length===1)return e[0]}pickDownloadItemByIndex(e,o){if(!Number.isInteger(o)||o<1||o>e.length)throw new a(`\u4E0B\u8F7D\u9879\u5E8F\u53F7 ${o} \u65E0\u6548\uFF0C\u53EF\u9009\u8303\u56F4\u4E3A 1-${e.length}\u3002
|
|
6
|
+
${this.buildMultipleDownloadsMessage(e)}`);return e[o-1]}pickDownloadItemByLabel(e,o){const t=o.trim().toLowerCase();if(!t)return;const d=e.filter(i=>i.label.trim().toLowerCase()===t);if(d.length===1)return d[0];if(d.length>1)throw new a(`\u4E0B\u8F7D\u9879\u540D\u79F0 ${o} \u5339\u914D\u5230\u591A\u4E2A\u7ED3\u679C\uFF0C\u8BF7\u6539\u7528 \`--downloadItem\` \u7CBE\u786E\u9009\u62E9\u3002
|
|
7
|
+
${this.buildMultipleDownloadsMessage(e)}`)}inferDownloadDevice(e){if(!e)return;const o=e.trim().split(".").pop()?.toLowerCase();if(o)return this.normalizeDevice(o)}normalizeDevice(e){const o=e.trim().toLowerCase();return o==="tif"?"tiff":o==="jpg"?"jpeg":o}buildMultipleDownloadsMessage(e){const o=["\u5F53\u524D\u6A21\u5757\u8FD4\u56DE\u591A\u4E2A\u53EF\u4E0B\u8F7D\u6587\u4EF6\uFF0C\u8BF7\u4F7F\u7528 `--downloadItem`\u3001`--downloadLabel` \u6216\u5E26\u76EE\u6807\u6269\u5C55\u540D\u7684 `--download` \u8DEF\u5F84\u660E\u786E\u9009\u62E9\u3002","\u53EF\u9009\u4E0B\u8F7D\u9879\uFF1A"];return e.forEach((t,d)=>{o.push(`${d+1}. ${t.label} (device=${t.device}, endpoint=${t.endpoint})`)}),o.join(`
|
|
8
|
+
`)}validateDownloadFlags(e){if(e.downloadItem!==void 0&&e.downloadLabel)throw new a("`--downloadItem` \u4E0E `--downloadLabel` \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");if((e.downloadItem!==void 0||e.downloadLabel)&&!e.download)throw new a("`--downloadItem` \u548C `--downloadLabel` \u4EC5\u53EF\u4E0E `--download` \u4E00\u8D77\u4F7F\u7528\u3002")}toHistorySummary(e,o){const t=e.fuid?.trim();return t?{fuid:t,id:typeof e.id=="number"?e.id:null,module_id:e.module_id?.trim()||o,module_name:e.module_name?.trim()||"",name:e.name?.trim()||"",status:Y(e),time:e.time?.trim()||"",type:e.type?.trim()||""}:null}buildHistoryHint(e){return e?`\u53EF\u4F7F\u7528 \`xt history download ${e.fuid} --device pdf\` \u6216 \`xt history list\` \u67E5\u770B\u7ED3\u679C`:"\u53EF\u4F7F\u7528 `xt history list` \u67E5\u770B\u4EFB\u52A1\u8FDB\u5EA6"}async downloadSelectedResults(e,o){const t=[];for(const d of o.downloads){const i=await L(e,{item:d,moduleId:o.moduleId,uuid:o.uuid});t.push(await g(i.url,i.fileName))}return t}async downloadInteractiveResults(e,o){const t=[];return o.choice.downloadFile&&o.file&&t.push(await g(o.file)),o.choice.downloads.length>0&&t.push(...await this.downloadSelectedResults(e,{downloads:o.choice.downloads,moduleId:o.moduleId,uuid:o.uuid})),t}isRetryableAsyncDownloadError(e){return e.message.includes("\u4E0B\u8F7D\u5931\u8D25")||e.message.includes("\u672A\u83B7\u53D6\u5230\u4E0B\u8F7D\u94FE\u63A5")}async sleep(e){await new Promise(o=>setTimeout(o,e))}async resolveInputMode(e,o){if(o.demo)return this.hasDemoInput(e)?{mode:"demo"}:this.hasRecordInput(e)?{mode:"record"}:this.hasCloudInput(e)?{mode:"cloud"}:{mode:"demo"};if(o.fileInputs.length>0)return{fileInputs:o.fileInputs,mode:"upload"};if(o.recordRequested)return{mode:"record"};if(o.cloudRequested)return{mode:"cloud"};if(this.hasRecordInput(e))return{mode:"record"};if(this.hasCloudInput(e))return{mode:"cloud"};if(!o.interactive)return this.hasUploadInput(e)?{mode:"upload"}:{mode:"none"};if(!this.hasDemoInput(e))return this.hasUploadInput(e)?{fileInputs:[await z()],mode:"upload"}:{mode:"none"};const t=await de();return t==="demo"?{mode:t}:{fileInputs:[await z()],mode:t}}resolveNoInput(e){return{duid:e.id?.duid?.trim()??"",input:{kind:"none"},schema:[]}}resolveDemoInput(e,o){const t=e.id?.duid?.trim();if(!t)throw new a(`\u6A21\u5757 ${o} \u672A\u8FD4\u56DE demo duid\uFF0C\u65E0\u6CD5\u4F7F\u7528 \`--demo\`\u3002`);const d=k(e.args_data??[]);if(!d.length||d.some(i=>!i.defaultUpload))throw new a(`\u6A21\u5757 ${o} \u672A\u8FD4\u56DE\u53EF\u7528\u7684 demo \u6587\u4EF6\u4FE1\u606F\uFF0C\u65E0\u6CD5\u4F7F\u7528 \`--demo\`\u3002`);return{duid:t,input:{kind:"upload",uploads:d.map(i=>({key:i.key,label:i.label,upload:{fileName:i.defaultUpload.fileName,fileOss:i.defaultUpload.fileOss,fileSize:i.defaultUpload.fileSize}}))},schema:[]}}hasDemoInput(e){if(!e.id?.duid?.trim())return!1;const t=k(e.args_data??[]);return t.length>0&&t.every(d=>!!d.defaultUpload)}async resolveCloudInput(e,o,t,d,i){const r=C(e.args_data??[]),l=o.cloudKey?.trim()||r?.key||"";if(!l)throw new a(`\u6A21\u5757 ${t} \u672A\u8FD4\u56DE\u53EF\u7528\u7684\u4E91\u7AEF\u6570\u636E\u53C2\u6570\uFF0C\u8BF7\u663E\u5F0F\u4F20\u5165 \`--cloudKey\`.`);const n=await this.resolveCloudRecord(d,o,{argsKey:l,defaultRecord:r?.record,moduleId:t,uuid:i});if(!n)throw new a(`\u6A21\u5757 ${t} \u672A\u8FD4\u56DE\u9ED8\u8BA4\u4E91\u7AEF\u6570\u636E\uFF0C\u8BF7\u4F20\u5165 \`--cloudRecordJson\` \u6216 \`--cloudRecordFile\`.`);return{duid:e.id?.duid?.trim()||"cloud",input:{kind:"cloud",cloud:{key:l,label:r?.label??"",record:this.normalizeCloudRecord(n)}},schema:[]}}async resolveRecordInput(e,o,t){const d=e.id?.duid?.trim();if(!d)throw new a(`\u6A21\u5757 ${t} \u672A\u8FD4\u56DE record duid\uFF0C\u65E0\u6CD5\u4F7F\u7528\u5386\u53F2\u8BB0\u5F55\u8F93\u5165\u3002`);const i=e.args_data??[],r=o.recordKey?.trim(),l=o.cloudKey?.trim()&&A(i,o.cloudKey.trim())==="XTRecord"?o.cloudKey.trim():"",n=X(i),u=r||l||n?.key||"";if(!u)throw new a(`\u6A21\u5757 ${t} \u672A\u8BC6\u522B\u5230 XTRecord \u5B57\u6BB5\uFF0C\u8BF7\u663E\u5F0F\u4F20\u5165 \`--recordKey\` \u6216\u6539\u7528\u5176\u4ED6\u8F93\u5165\u65B9\u5F0F\u3002`);const s=me(i,u);if(!s)throw new a(`\u6A21\u5757 ${t} \u672A\u627E\u5230 XTRecord \u5B57\u6BB5 ${u}\u3002`);const c=s.label||(n?.key===u?n.label:""),f=await this.pickXiantaoRecordOption(s.options,o,{defaultRecord:n?.key===u?n:null,moduleId:t,recordKey:u});return{duid:d,input:{kind:"record",record:{key:u,label:c,moduleId:f.moduleId,moduleName:f.moduleName,recordId:f.recordId,recordName:f.recordName,time:f.time}},schema:[]}}async pickXiantaoRecordOption(e,o,t){const d=o.recordJson||o.cloudRecordJson,i=o.recordFile||o.cloudRecordFile;if(d)return this.toRecordSelection(this.parseCloudRecord(d,o.recordJson?"--recordJson":"--cloudRecordJson"));if(i)return this.toRecordSelection(this.parseCloudRecord(await U(i,"utf8"),o.recordFile?"--recordFile":"--cloudRecordFile"));const r=o.recordId?.trim();if(r){const l=e.find(n=>typeof n.record_id=="string"&&n.record_id.trim()===r);if(!l)throw new a(`\u6A21\u5757 ${t.moduleId} \u672A\u627E\u5230 record_id=${r} \u7684\u5386\u53F2\u8BB0\u5F55\u3002${this.buildRecordSelectionHint(e)}`);return this.toRecordSelection(l)}if(e.length>1){if(o.interactive)return this.toRecordSelection(await re(e));throw new T(`\u6A21\u5757 ${t.moduleId} \u5B58\u5728\u591A\u4E2A\u5386\u53F2\u8BB0\u5F55\uFF0C\u8BF7\u4F7F\u7528 \`--recordId\` \u6216 \`--recordJson\` \u6307\u5B9A\u3002
|
|
9
|
+
${this.buildRecordSelectionHint(e)}`,this.buildRecordSelectionData(e))}if(e.length===1)return this.toRecordSelection(e[0]);if(t.defaultRecord)return{moduleId:t.defaultRecord.moduleId,moduleName:t.defaultRecord.moduleName,recordId:t.defaultRecord.recordId,recordName:t.defaultRecord.recordName,time:t.defaultRecord.time};throw new a(`\u6A21\u5757 ${t.moduleId} \u7684 XTRecord \u5B57\u6BB5 ${t.recordKey} \u6CA1\u6709\u53EF\u7528\u8BB0\u5F55\uFF0C\u8BF7\u4F20\u5165 \`--recordJson\`.`)}toRecordSelection(e){const o=typeof e.record_id=="string"?e.record_id.trim():"";if(!o)throw new a("\u5386\u53F2\u8BB0\u5F55\u7F3A\u5C11 record_id\uFF0C\u8BF7\u68C0\u67E5\u4F20\u5165\u7684 JSON\u3002");return{moduleId:typeof e.module_id=="string"?e.module_id.trim():"",moduleName:typeof e.module_name=="string"?e.module_name.trim():"",recordId:o,recordName:typeof e.record_name=="string"?e.record_name.trim():"",time:typeof e.time=="string"?e.time.trim():""}}buildRecordSelectionHint(e){if(e.length===0)return"";const o=["\u53EF\u9009\u5386\u53F2\u8BB0\u5F55\uFF1A"];return e.forEach((t,d)=>{const i=typeof t.record_id=="string"?t.record_id.trim():"",r=typeof t.record_name=="string"?t.record_name.trim():"",l=typeof t.time=="string"?t.time.trim():"",n=[r,l].filter(Boolean).join(" ");o.push(` [${d}] ${i}${n?` (${n})`:""}`)}),o.join(`
|
|
10
|
+
`)}buildRecordSelectionData(e){return{choices:e.map((o,t)=>({index:t,module_id:typeof o.module_id=="string"?o.module_id.trim():"",module_name:typeof o.module_name=="string"?o.module_name.trim():"",record_id:typeof o.record_id=="string"?o.record_id.trim():"",record_name:typeof o.record_name=="string"?o.record_name.trim():"",time:typeof o.time=="string"?o.time.trim():""})),selection_type:"history_record"}}hasRecordInput(e){return!!(e.id?.duid?.trim()&&X(e.args_data??[]))}hasCloudInput(e){return!!C(e.args_data??[])}hasUploadInput(e){return k(e.args_data??[]).length>0}async uploadAndVerify(e,o,t,d){const i=await this.uploadFiles(e,o,t.argsData??[],t.moduleId),r=await we(d,{argsMain:t.argsMain,moduleId:t.moduleId,uploads:i,uuid:t.uuid});return{duid:r.duid,input:{kind:"upload",uploads:i},schema:r.schema}}summarizePreparedInput(e){if(e.kind==="cloud")return{file_name:null,file_oss:null,file_size:null,input_cloud:this.summarizeCloudInput(e.cloud),input_record:null,input_uploads:null};if(e.kind==="none")return{file_name:null,file_oss:null,file_size:null,input_cloud:null,input_record:null,input_uploads:null};if(e.kind==="record")return{file_name:null,file_oss:null,file_size:null,input_cloud:null,input_record:{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},input_uploads:null};const o=e.uploads.map(d=>({file_name:d.upload.fileName,file_oss:d.upload.fileOss,file_size:d.upload.fileSize,key:d.key,label:d.label})),t=o.length===1?o[0]:null;return{file_name:t?.file_name??null,file_oss:t?.file_oss??null,file_size:t?.file_size??null,input_cloud:null,input_record:null,input_uploads:o}}summarizeCloudInput(e){return{data_filter:this.readCloudOptionValue(e.record.data_filter),data_id:typeof e.record.data_id=="string"?e.record.data_id.trim():"",data_process:this.readCloudOptionValue(e.record.data_process),key:e.key,label:e.label,record:structuredClone(e.record),record_label:typeof e.record.label=="string"?e.record.label.trim():""}}readCloudOptionValue(e){return H(e)&&(typeof e.value=="string"?e.value.trim():"")||null}async resolveCloudRecord(e,o,t){return o.cloudRecordJson?this.parseCloudRecord(o.cloudRecordJson,"--cloudRecordJson"):o.cloudRecordFile?this.parseCloudRecord(await U(o.cloudRecordFile,"utf8"),"--cloudRecordFile"):o.cloudFilter?.trim()||o.cloudDataId?.trim()||typeof o.cloudIndex=="number"?this.resolveCloudRecordByQuery(e,o,t):t.defaultRecord}parseCloudRecord(e,o){let t;try{t=JSON.parse(e)}catch{throw new a(`${o} \u4E0D\u662F\u5408\u6CD5 JSON\u3002`)}if(!H(t))throw new a(`${o} \u5FC5\u987B\u662F JSON \u5BF9\u8C61\u3002`);return t}normalizeCloudRecord(e){const o={};for(const[t,d]of Object.entries(e))d!==void 0&&(o[t]=structuredClone(d));return(typeof o.type!="string"||!o.type.trim())&&(o.type="cloud"),o}validateInputSourceFlags(e,o){const t=!!(o.cloudRecordJson||o.cloudRecordFile),d=!!(o.cloudDataId?.trim()||o.cloudFilter?.trim()||typeof o.cloudIndex=="number"),i=t||d,r=!!(o.recordJson||o.recordFile),l=r||!!o.recordKey?.trim()||!!o.recordId?.trim();if(o.cloudRecordJson&&o.cloudRecordFile)throw new a("`--cloudRecordJson` \u4E0E `--cloudRecordFile` \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");if(o.recordJson&&o.recordFile)throw new a("`--recordJson` \u4E0E `--recordFile` \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");if(t&&d)throw new a("\u663E\u5F0F\u4E91\u7AEF\u8BB0\u5F55\u53C2\u6570\u4E0D\u80FD\u4E0E `--cloudFilter` / `--cloudDataId` / `--cloudIndex` \u540C\u65F6\u4F7F\u7528\u3002");if(l&&d)throw new a("\u5386\u53F2\u8BB0\u5F55\u53C2\u6570\u4E0D\u80FD\u4E0E `--cloudFilter` / `--cloudDataId` / `--cloudIndex` \u540C\u65F6\u4F7F\u7528\u3002");if(r&&t)throw new a("`--recordJson` / `--recordFile` \u4E0D\u80FD\u4E0E `--cloudRecordJson` / `--cloudRecordFile` \u540C\u65F6\u4F7F\u7528\u3002");if(o.demo&&(i||l))throw new a("`--demo` \u4E0D\u80FD\u4E0E\u4E91\u7AEF\u6570\u636E/\u5386\u53F2\u8BB0\u5F55\u53C2\u6570\u540C\u65F6\u4F7F\u7528\u3002");if(e.length>0&&(i||l))throw new a("`--file` \u4E0D\u80FD\u4E0E\u4E91\u7AEF\u6570\u636E/\u5386\u53F2\u8BB0\u5F55\u53C2\u6570\u540C\u65F6\u4F7F\u7528\u3002")}async resolveCloudRecordByQuery(e,o,t){const d=await this.fetchCloudRecords(e,{argsKey:t.argsKey,filter:o.cloudFilter?.trim(),moduleId:t.moduleId,selectedRecord:t.defaultRecord,uuid:t.uuid});if(d.length===0){const r=o.cloudFilter?.trim();throw r?new a(`\u672A\u627E\u5230\u5339\u914D\u4E91\u7AEF\u6570\u636E: ${r}`):new a("\u5F53\u524D\u6A21\u5757\u6CA1\u6709\u53EF\u9009\u7684\u4E91\u7AEF\u6570\u636E\u8BB0\u5F55\u3002")}const i=o.cloudDataId?.trim();if(i){const r=d.find(l=>(typeof l.data_id=="string"?l.data_id.trim():"")===i);if(!r)throw new a(`\u672A\u627E\u5230 data_id=${i} \u5BF9\u5E94\u7684\u4E91\u7AEF\u6570\u636E\u3002`);return r}if(typeof o.cloudIndex=="number"){const r=d[o.cloudIndex];if(!r)throw new a(`\u4E91\u7AEF\u6570\u636E\u7D22\u5F15\u8D85\u51FA\u8303\u56F4: ${o.cloudIndex}\uFF0C\u5F53\u524D\u5171\u6709 ${d.length} \u6761\u3002`);return r}if(d.length===1)return d[0];if(o.interactive)return this.normalizeCloudRecord(await te(d));throw new T(this.buildCloudSelectionHint(d,o.cloudFilter?.trim()),this.buildCloudSelectionData(d,o.cloudFilter?.trim()))}async fetchCloudRecords(e,o){const t=await J(e,{argsKey:o.argsKey,currentPage:1,filter:o.filter,moduleId:o.moduleId,selectedRecord:o.selectedRecord,uuid:o.uuid}),d=t.records.map(i=>this.normalizeCloudRecord(i));for(let i=t.currentPage+1;i<=t.lastPage;i+=1){const r=await J(e,{argsKey:o.argsKey,currentPage:i,filter:o.filter,moduleId:o.moduleId,selectedRecord:o.selectedRecord,uuid:o.uuid});d.push(...r.records.map(l=>this.normalizeCloudRecord(l)))}return d}buildCloudSelectionHint(e,o){const t=[o?`\u5339\u914D\u5230\u591A\u4E2A\u4E91\u7AEF\u6570\u636E: ${o}`:"\u5339\u914D\u5230\u591A\u4E2A\u4E91\u7AEF\u6570\u636E","\u8BF7\u4F7F\u7528 `--cloudIndex` \u6216 `--cloudDataId` \u6307\u5B9A\u5176\u4E2D\u4E00\u6761\uFF1A"];return e.forEach((d,i)=>{const r=typeof d.data_id=="string"?d.data_id.trim():"",l=typeof d.label=="string"?d.label.trim():"";t.push(` [${i}] ${l||r}`)}),t.join(`
|
|
11
|
+
`)}buildCloudSelectionData(e,o){return{choices:e.map((t,d)=>{const i=typeof t.data_id=="string"?t.data_id.trim():"",r=typeof t.label=="string"?t.label.trim():"";return{data_id:i,index:d,label:r||i}}),filter:o??"",selection_type:"cloud_record"}}async uploadFiles(e,o,t,d){const i=k(t??[]),r=this.resolveUploadInputs(o,i,d),l=await M(e),n=[];for(const u of r){const s=await le(l,u.filePath);n.push({key:u.key,label:u.label,upload:s})}return n}resolveUploadInputs(e,o,t){if(!o.length)throw new a(`\u6A21\u5757 ${t} \u672A\u68C0\u6D4B\u5230\u53EF\u4E0A\u4F20\u8F93\u5165\uFF0C\u4E0D\u80FD\u4F7F\u7528 \`--file\`\u3002`);if(!e.length)throw o.length===1?new a("\u901A\u7528\u6A21\u5F0F\u8BF7\u4F20\u5165 FILE / `--file <xlsx>`\uFF0C\u6216\u6539\u7528 `--demo`\u3002"):new a(`\u6A21\u5757 ${t} \u9700\u8981\u591A\u4E2A\u4E0A\u4F20\u5B57\u6BB5\uFF0C\u8BF7\u4F7F\u7528 \`--file key=path\`\u3002\u53EF\u7528\u5B57\u6BB5: ${o.map(n=>n.key).join(", ")}`);const[d]=o;if(o.length===1&&e.length===1){const n=this.parseUploadFileInput(e[0]);if(n.key&&n.key!==d.key)throw new a(`\u6A21\u5757 ${t} \u4EC5\u652F\u6301\u4E0A\u4F20\u5B57\u6BB5 ${d.key}\uFF0C\u6536\u5230 ${n.key}\u3002`);return[{filePath:n.path,key:d.key,label:d.label}]}const i=new Map(o.map(n=>[n.key,n])),r=new Map;for(const n of e){const u=this.parseUploadFileInput(n);if(!u.key){if(o.length===1){if(r.has(d.key))throw new a(`\u6A21\u5757 ${t} \u4EC5\u9700\u8981 1 \u4E2A\u4E0A\u4F20\u6587\u4EF6\uFF0C\u6536\u5230\u91CD\u590D\u8F93\u5165\u3002`);r.set(d.key,u.path);continue}throw new a(`\u6A21\u5757 ${t} \u9700\u8981\u591A\u4E2A\u4E0A\u4F20\u5B57\u6BB5\uFF0C\u8BF7\u4F7F\u7528 \`--file key=path\`\u3002\u53EF\u7528\u5B57\u6BB5: ${o.map(c=>c.key).join(", ")}`)}const s=i.get(u.key);if(!s)throw new a(`\u6A21\u5757 ${t} \u4E0D\u5B58\u5728\u4E0A\u4F20\u5B57\u6BB5 ${u.key}\u3002\u53EF\u7528\u5B57\u6BB5: ${o.map(c=>c.key).join(", ")}`);if(r.has(s.key))throw new a(`\u4E0A\u4F20\u5B57\u6BB5 ${s.key} \u91CD\u590D\u4F20\u5165\u3002`);r.set(s.key,u.path)}const l=o.filter(n=>n.required&&!r.has(n.key));if(l.length>0)throw new a(`\u6A21\u5757 ${t} \u7F3A\u5C11\u5FC5\u586B\u4E0A\u4F20\u5B57\u6BB5: ${l.map(n=>n.key).join(", ")}`);return o.flatMap(n=>{const u=r.get(n.key);return u?[{filePath:u,key:n.key,label:n.label}]:[]})}parseUploadFileInput(e){const o=e.trim();if(!o)throw new a("`--file` \u4E0D\u80FD\u4E3A\u7A7A\u3002");const t=o.indexOf("=");if(t<=0)return{path:o};const d=o.slice(0,t).trim(),i=o.slice(t+1).trim();if(!d||!i)throw new a("\u591A\u4E0A\u4F20\u6A21\u5757\u8BF7\u4F7F\u7528 `--file key=path`\u3002");return{key:d,path:i}}async resolveModule(e,o,t){const d=e?.trim(),i=o.route?.trim(),r=o.uuid?.trim(),l=await ce(o.toolProductUuid);if(!d){if(!o.interactive)throw new a("\u8BF7\u4F20\u5165 `module_id`\uFF0C\u6216\u4F7F\u7528 `--interactive --file <xlsx>` \u5148\u4ECE\u83DC\u5355\u9009\u62E9\u5DE5\u5177\u3002");const u=await ie(this.sortTopLevelMenus(await _e(t,l)));return{moduleId:u.code,route:i??u.route,toolProductUuid:l,uuid:r??u.uuid}}if(i&&r)return{moduleId:d,route:i,toolProductUuid:l,uuid:r};const n=o.menuUuid?.trim();if(n&&l){const u=await pe(t,n,l),s=i??this.requireMenuRoute(u),c=u.code?.trim();if(c&&c!==d)throw new a(`\u83DC\u5355\u6A21\u5757 code \u4E3A ${c}\uFF0C\u4E0E\u4F20\u5165\u7684 module_id ${d} \u4E0D\u4E00\u81F4\u3002`);return{moduleId:d,route:s,toolProductUuid:l,uuid:r??n}}if(l){const u=await Ie(t,l,d);return{moduleId:d,route:i??u.route,toolProductUuid:l,uuid:r??u.uuid}}if(!r)throw new a("\u901A\u7528\u6A21\u5F0F\u9700\u8981\u4F20\u5165 `--uuid`\uFF0C\u6216\u4F7F\u7528\u9ED8\u8BA4/\u663E\u5F0F `toolProductUuid` \u81EA\u52A8\u89E3\u6790\u3002");if(!i)throw new a("\u901A\u7528\u6A21\u5F0F\u9700\u8981\u4F20\u5165 `--route`\uFF0C\u6216\u4F7F\u7528\u9ED8\u8BA4/\u663E\u5F0F `toolProductUuid` \u81EA\u52A8\u89E3\u6790\u3002");return{moduleId:d,route:i,toolProductUuid:l,uuid:r}}sortTopLevelMenus(e){const o=["\u57FA\u7840\u7ED8\u56FE","\u8868\u8FBE\u5DEE\u5F02","\u529F\u80FD\u805A\u7C7B","\u4EA4\u4E92\u7F51\u7EDC","\u4E34\u5E8A\u610F\u4E49","\u5176\u4ED6"],t=new Map(o.map((d,i)=>[d,i]));return[...e].sort((d,i)=>{const r=t.get(d.title?.trim()??"")??Number.MAX_SAFE_INTEGER,l=t.get(i.title?.trim()??"")??Number.MAX_SAFE_INTEGER;return r-l})}requireMenuRoute(e){const o=e.route;if(typeof o!="string"||!o.trim())throw new a("\u83DC\u5355\u672A\u8FD4\u56DE\u53EF\u7528 route\uFF0C\u8BF7\u6539\u7528 `--route` \u663E\u5F0F\u6307\u5B9A\u3002");return o.trim()}}class F extends be{static description="Run a Xiantao bioinformatics tool";static args={tool:x.string({description:"Tool id; optional with --interactive to choose from menus"}),file:x.string({description:"Path to the local xlsx file; optional with --demo or --interactive"})};static flags={...q,...V,...Q,...ue,demo:h.boolean({default:!1,description:"Prefer the module default remote input returned by fetch-all instead of uploading a local file"}),file:h.string({description:"Path to the local xlsx file; repeat or use KEY=PATH for named upload fields",multiple:!0}),download:h.string({description:"Download the generated file or preferred analysis result to this local path after submission"}),downloadItem:h.integer({description:"Select a download item by its 1-based index when --download matches multiple results"}),downloadLabel:h.string({description:"Select a download item by its label when --download matches multiple results"}),interactive:h.boolean({default:!1,description:"Prompt for dynamic args before submitting the module"}),menuUuid:h.string({description:"Tool menu UUID from /products/apply/:toolProductUuid/analyse/:uuid"}),route:h.string({description:"Tool route like app1.violin_flat in generic mode"}),token:h.string({description:"Bearer token for agent.helixlife.cn xiantao APIs; falls back to the stored agent token"}),toolProductUuid:h.string({description:"tool_product_uuid used to auto-resolve module UUID and route in generic mode; defaults to the main Xiantao product UUID"}),uuid:h.string({description:"Tool UUID used in generic mode for fetch-all and verify-upload; optional when --toolProductUuid is provided"})};async run(){this.warnIfLegacyPlotCommand();const{args:e,flags:o}=await this.parse(F);if(o.interactive&&o.json)throw new a("`--interactive` \u4E0D\u80FD\u4E0E `--json` \u540C\u65F6\u4F7F\u7528\u3002");const t=this.resolveToolFileInputs(e.file,o.file),d=await this.executeToolRun(e.tool,t,o);this.print(o,d.data,d.text,{profile:d.data.agent})}}export{be as ToolRunCommandBase,F as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Args as a,Flags as o}from"@oclif/core";import{createErrorEnvelope as d,createSuccessEnvelope as u}from"../../lib/envelope.js";import{XtzError as i}from"../../lib/errors.js";import{globalFlags as c,toolCloudFlags as f}from"../../lib/flags.js";import{plotOverrideFlags as
|
|
1
|
+
import{Args as a,Flags as o}from"@oclif/core";import{createErrorEnvelope as d,createSuccessEnvelope as u}from"../../lib/envelope.js";import{XtzError as i}from"../../lib/errors.js";import{globalFlags as c,toolCloudFlags as f,toolRecordFlags as g}from"../../lib/flags.js";import{plotOverrideFlags as p}from"../../lib/plot-options.js";import{ToolRunCommandBase as m}from"../plot/run.js";class l extends m{static description="Execute a Xiantao bioinformatics tool in agent mode";static usage="tool exec <tool> [--file <value> ... | --demo] --json [--download <path> [--downloadItem <n> | --downloadLabel <value>]]";static args={tool:a.string({description:"Tool id, e.g. violin_flat",required:!0}),file:a.string({hidden:!0})};static flags={...c,...f,...g,...p,demo:o.boolean({default:!1,description:"Prefer the module default remote input returned by fetch-all instead of uploading a local file"}),download:o.string({description:"Download the generated file or preferred analysis result to this local path after submission"}),downloadItem:o.integer({description:"Select a download item by its 1-based index when --download matches multiple results"}),downloadLabel:o.string({description:"Select a download item by its label when --download matches multiple results"}),file:o.string({description:"Path to the local xlsx file; repeat or use KEY=PATH for named upload fields",multiple:!0}),interactive:o.boolean({default:!1,hidden:!0}),menuUuid:o.string({description:"Tool menu UUID from /products/apply/:toolProductUuid/analyse/:uuid"}),route:o.string({description:"Tool route like app1.violin_flat in generic mode"}),token:o.string({description:"Bearer token for agent.helixlife.cn xiantao APIs; falls back to the stored agent token"}),toolProductUuid:o.string({description:"tool_product_uuid used to auto-resolve module UUID and route in generic mode; defaults to the main Xiantao product UUID"}),uuid:o.string({description:"Tool UUID used in generic mode for fetch-all and verify-upload; optional when --toolProductUuid is provided"})};async catch(t){const e=await this.getProfile(this.readProfileFlag());this.log(JSON.stringify(d(e,"tool exec",this.normalizeError(t)),null,2)),this.exit(1)}async run(){const{args:t,flags:e}=await this.parse(l);if(!e.json)throw new i("`xt tool exec` \u4EC5\u652F\u6301 `--json` \u8F93\u51FA\u3002");const r=this.resolveToolFileInputs(t.file,e.file);if(e.demo&&r.length>0)throw new i("`--demo` \u4E0E `--file` \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");const n=await this.executeToolRun(t.tool,r,{...e,interactive:!1}),s=await this.getProfile(e.profile);this.log(JSON.stringify(u(s,"tool exec",n.data),null,2))}readProfileFlag(){for(let t=0;t<this.argv.length;t+=1){const e=this.argv[t];if((e==="--profile"||e==="--agent")&&this.argv[t+1])return this.argv[t+1];if(e.startsWith("--profile="))return e.slice(10);if(e.startsWith("--agent="))return e.slice(8)}}normalizeError(t){return t.message.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,"").includes("required arg")?new i("`xt tool exec` \u9700\u8981\u4F20\u5165 TOOL\u3002"):t}}export{l as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{Args as y,Flags as
|
|
2
|
-
`);t.push(`args_main: ${
|
|
3
|
-
`)}summarizeInputs(e,
|
|
1
|
+
import{Args as y,Flags as $}from"@oclif/core";import{XtzCommand as k}from"../../base-command.js";import{getAuthContext as q}from"../../lib/auth.js";import{globalFlags as B}from"../../lib/flags.js";import{isJsonObject as b}from"../../lib/json.js";import{buildArgsMainFromSchema as x,buildArgsSpecificFromSchema as F}from"../../lib/plot-schema.js";import{resolveXiantaoToolProductUuid as A}from"../../lib/storage.js";import{findDefaultXiantaoCloudInput as C,findDefaultXiantaoRecord as I,findXiantaoRecordFieldByKey as v,listXiantaoUploadFields as S}from"../../lib/tool-inputs.js";import{fetchAllPlotArgs as U,resolveToolMenuByCode as j}from"../../lib/xiantao.js";class h extends k{static description="Inspect a Xiantao tool and its dynamic inputs";static args={tool:y.string({description:"Tool id, e.g. violin_flat",required:!0})};static flags={...B,token:$.string({description:"Bearer token for agent.helixlife.cn xiantao APIs; falls back to the stored agent token"}),toolProductUuid:$.string({description:"tool_product_uuid used in the menu filter payload; defaults to the main Xiantao product UUID"})};async run(){const{args:e,flags:i}=await this.parse(h),a=await this.getProfile(i.profile),l=await q(a,i.token),d=await A(i.toolProductUuid),u=await j(l,d,e.tool),r=await U(l,{moduleId:e.tool,uuid:u.uuid}),s=r.args_main??[],f=this.summarizeInputs(r.args_data??[],r.id?.duid??""),c=this.summarizeSchema(s),t={agent:a,args_data:r.args_data??[],args_main:s,args_main_defaults:x(s),args_specific:r.args_specific??[],args_specific_defaults:F(r.args_specific),duid:r.id?.duid??"",inputs:f,module_id:e.tool,notice:r.notice??"",path:u.path,route:u.route,summary:c,title:u.title,tool_product_uuid:d,uuid:u.uuid};this.print(i,t,this.formatInspectText(t.module_id,t.title,t.path,t.route,t.uuid,t.notice,f,c,r.args_specific??[],s),{profile:a})}formatInspectText(e,i,a,l,d,u,r,s,f,c){const t=[`${e} ${i}`,`path: ${a||"-"}`,`route: ${l}`,`uuid: ${d}`];u&&t.push(`notice: ${u}`),t.push("input:"),t.push(` cloud: ${r.cloud_available?this.formatCloudSummary(r.cloud_default):"unavailable"}`),t.push(` upload: ${r.upload_available?`${r.upload_fields.length} fields`:"not detected"}`);for(const o of r.upload_fields){const m=[o.label&&o.label!==o.key?o.label:void 0,o.required?"required":void 0,o.demo_upload?this.formatDemoSummary(o.demo_upload):"no demo default"].filter(Boolean);t.push(` - ${o.key}${m.length>0?` - ${m.join(", ")}`:""}`)}if(t.push(` demo: ${r.demo_available?"available":"unavailable"}`),t.push(` record: ${r.record_available?this.formatRecordSummary(r.record_default):"unavailable"}`),r.record_options.length>1){t.push(` (\u5171 ${r.record_options.length} \u6761\u5386\u53F2\u8BB0\u5F55\uFF0C\u4F7F\u7528 \`--recordId\` \u6307\u5B9A)`);for(const o of r.record_options)t.push(` - ${o.record_id}${o.record_name?` ${o.record_name}`:""}${o.time?` (${o.time})`:""}`)}if(f.length>0){t.push(`args_specific: ${f.length} fields`);for(const o of f){const m=this.formatLabel(o.label),p=[m&&m!==o.key?m:void 0,o.type?.trim(),o.required?"required":void 0,o.multiple?"multiple":void 0,this.formatDefaultValue(o.default_value)].filter(Boolean);t.push(` ${o.key}${p.length>0?` - ${p.join(", ")}`:""}`)}}else t.push("args_specific: none");if(c.length===0)return t.push("args_main: none"),t.join(`
|
|
2
|
+
`);t.push(`args_main: ${s.section_count} sections, ${s.field_count} fields, ${s.required_field_count} required`);for(const o of c){const m=o.form??[],p=m.filter(n=>n.required).length;t.push(`- ${this.formatLabel(o.label)||o.key} (${o.key}) - ${m.length} fields, ${p} required`);for(const n of o.form??[]){const _=this.formatLabel(n.label),g=[_&&_!==n.key?_:void 0,n.type?.trim(),n.required?"required":void 0,n.multiple?"multiple":void 0,n.options?.length?`options:${n.options.length}`:void 0,this.formatDefaultValue(n.default_value)].filter(Boolean);t.push(` ${n.key}${g.length>0?` - ${g.join(", ")}`:""}`)}}return t.join(`
|
|
3
|
+
`)}summarizeInputs(e,i){const a=S(e),l=I(e),d=C(e),u=!!(i.trim()&&a.length>0&&a.every(t=>!!t.defaultUpload)),r=!!(i.trim()&&l),s=r&&l?{key:l.key,label:l.label,module_id:l.moduleId,module_name:l.moduleName,record_id:l.recordId,record_name:l.recordName,time:l.time}:null,f=l?v(e,l.key):null,c=f?f.options.map(t=>({key:l?.key??"",label:f.label,module_id:typeof t.module_id=="string"?t.module_id.trim():"",module_name:typeof t.module_name=="string"?t.module_name.trim():"",record_id:typeof t.record_id=="string"?t.record_id.trim():"",record_name:typeof t.record_name=="string"?t.record_name.trim():"",time:typeof t.time=="string"?t.time.trim():""})):[];return{cloud_available:!!d,cloud_default:d?this.toCloudSummary(d.key,d.label,d.record):null,demo_available:u,record_available:r,record_default:s,record_options:c,upload_available:a.length>0,upload_fields:a.map(t=>({demo_upload:t.defaultUpload?{file_name:t.defaultUpload.fileName,file_oss:t.defaultUpload.fileOss,file_size:t.defaultUpload.fileSize,key:t.key,label:t.label}:null,key:t.key,label:t.label,required:t.required}))}}summarizeSchema(e){const i=e.flatMap(a=>a.form??[]);return{field_count:i.length,required_field_count:i.filter(a=>a.required).length,section_count:e.length}}formatDemoSummary(e){return`${e.file_name} (${this.formatFileSize(e.file_size)})`}formatRecordSummary(e){return e?`${e.module_id||"-"} ${e.record_id}${e.time?` (${e.time})`:""}`:"available"}formatCloudSummary(e){if(!e)return"available";const i=[e.record_label||e.data_id,e.data_filter?`filter:${e.data_filter}`:void 0,e.data_process?`process:${e.data_process}`:void 0].filter(Boolean);return`${e.key}${i.length>0?` (${i.join(", ")})`:""}`}formatLabel(e){return typeof e=="string"?e.trim():b(e)?Object.values(e).filter(i=>typeof i=="string"&&!!i.trim()).map(i=>i.trim()).join(" / "):""}toCloudSummary(e,i,a){const l=this.readCloudOptionValue(a.data_filter),d=this.readCloudOptionValue(a.data_process);return{data_filter:l,data_id:typeof a.data_id=="string"?a.data_id.trim():"",data_process:d,key:e,label:i,record_label:typeof a.label=="string"?a.label.trim():""}}readCloudOptionValue(e){return b(e)&&(typeof e.value=="string"?e.value.trim():"")||null}formatFileSize(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}formatDefaultValue(e){if(!(e==null||e===""))return typeof e=="string"?`default:${e}`:typeof e=="number"||typeof e=="boolean"?`default:${String(e)}`:Array.isArray(e)?e.length>0?`default:${e.length} items`:void 0:"default:object"}}export{h as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Args as n,Flags as o}from"@oclif/core";import{createErrorEnvelope as u,createSuccessEnvelope as d}from"../../lib/envelope.js";import{XtzError as r}from"../../lib/errors.js";import{globalFlags as p,toolCloudFlags as c}from"../../lib/flags.js";import{plotOverrideFlags as
|
|
1
|
+
import{Args as n,Flags as o}from"@oclif/core";import{createErrorEnvelope as u,createSuccessEnvelope as d}from"../../lib/envelope.js";import{XtzError as r}from"../../lib/errors.js";import{globalFlags as p,toolCloudFlags as c,toolRecordFlags as f}from"../../lib/flags.js";import{plotOverrideFlags as m}from"../../lib/plot-options.js";import{buildArgsMainFromSchema as g,buildArgsSpecificFromSchema as h}from"../../lib/plot-schema.js";import{ToolRunCommandBase as _}from"../plot/run.js";class a extends _{static description="Prepare a Xiantao bioinformatics tool in agent mode and return the final dynamic schema";static usage="tool prepare <tool> [--file <value> ... | --demo] --json";static args={tool:n.string({description:"Tool id, e.g. violin_flat",required:!0}),file:n.string({hidden:!0})};static flags={...p,...c,...f,...m,demo:o.boolean({default:!1,description:"Prefer the module default remote input returned by fetch-all instead of uploading a local file"}),file:o.string({description:"Path to the local xlsx file; repeat or use KEY=PATH for named upload fields",multiple:!0}),interactive:o.boolean({default:!1,hidden:!0}),menuUuid:o.string({description:"Tool menu UUID from /products/apply/:toolProductUuid/analyse/:uuid"}),route:o.string({description:"Tool route like app1.violin_flat in generic mode"}),token:o.string({description:"Bearer token for agent.helixlife.cn xiantao APIs; falls back to the stored agent token"}),toolProductUuid:o.string({description:"tool_product_uuid used to auto-resolve module UUID and route in generic mode; defaults to the main Xiantao product UUID"}),uuid:o.string({description:"Tool UUID used in generic mode for fetch-all and verify-upload; optional when --toolProductUuid is provided"})};async catch(t){const i=await this.getProfile(this.readProfileFlag());this.log(JSON.stringify(u(i,"tool prepare",this.normalizeError(t)),null,2)),this.exit(1)}async run(){const{args:t,flags:i}=await this.parse(a);if(!i.json)throw new r("`xt tool prepare` \u4EC5\u652F\u6301 `--json` \u8F93\u51FA\u3002");const l=this.resolveToolFileInputs(t.file,i.file);if(i.demo&&l.length>0)throw new r("`--demo` \u4E0E `--file` \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");const e=await this.prepareToolRun(t.tool,l,{...i,interactive:!1}),s=await this.getProfile(i.profile);this.log(JSON.stringify(d(s,"tool prepare",{agent:e.agent,args_main:e.schema??[],args_main_defaults:g(e.schema),args_main_prepared:e.argsMain,args_specific:e.argsSpecificSchema,args_specific_defaults:h(e.argsSpecificSchema),args_specific_prepared:e.argsSpecific,duid:e.duid,file_name:e.inputSummary.file_name,file_oss:e.inputSummary.file_oss,file_size:e.inputSummary.file_size,input_cloud:e.inputSummary.input_cloud,input_record:e.inputSummary.input_record,input_uploads:e.inputSummary.input_uploads,mode:e.inputMode,module_id:e.moduleId,notice:e.notice,route:e.route,tool_product_uuid:e.toolProductUuid,uuid:e.uuid}),null,2))}readProfileFlag(){for(let t=0;t<this.argv.length;t+=1){const i=this.argv[t];if((i==="--profile"||i==="--agent")&&this.argv[t+1])return this.argv[t+1];if(i.startsWith("--profile="))return i.slice(10);if(i.startsWith("--agent="))return i.slice(8)}}normalizeError(t){return t.message.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,"").includes("required arg")?new r("`xt tool prepare` \u9700\u8981\u4F20\u5165 TOOL\u3002"):t}}export{a as default};
|
package/dist/lib/auth.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{debugHttpError as k,debugHttpRequest as
|
|
1
|
+
import{debugHttpError as k,debugHttpRequest as d,debugHttpResponse as f}from"./debug.js";import{resolveAuthUrlEndpoint as h,resolveCheckTokenEndpoint as l,resolveTicketExchangeEndpoint as g}from"./config.js";import{XtzError as i,raiseApiError as y}from"./errors.js";import{openUrl as T}from"./open-url.js";import{requestJson as c}from"./http.js";import{loadToken as x,requireToken as w,saveToken as S}from"./storage.js";import{DEFAULT_NETWORK_THROTTLE_MS as p,markNetworkComplete as A,waitForNetworkSlot as E}from"./throttle.js";async function b(t){const o=await x(t),e=await c(await h(),{headers:a(o)},{agent:t}),r=new URL(e.data.link_url);return r.searchParams.set("source",t),{linkUrl:r.toString(),tokenKey:e.data.token_key}}async function C(t,o=!0){const{linkUrl:e,tokenKey:r}=await b(t),s=await S(t,r);return{browserOpened:o?await T(e):!1,linkUrl:e,token:r,tokenPath:s}}async function H(t,o){const e=o?.trim()||await w(t);return{agent:t,token:e}}async function N(t,o){const e=o??await w(t),r=new URL(await l());return r.searchParams.set("token_key",e),await c(r.toString(),{headers:a(e)},{agent:t})}async function q(t,o){const e=await c(await g(),{body:JSON.stringify({code:o.trim()}),headers:a(t.token,!0),method:"POST"},{agent:t.agent});return e.success===!1&&await y(e,{agent:t.agent}),e.data}async function z(t,o={}){const e=o.timeoutMs??12e4,r=o.intervalMs??1500,s=Date.now()+e;let n="";for(;Date.now()<s;){const u=await U(t);if(u.success)return;n=u.message?.trim()||n,await new Promise(m=>setTimeout(m,r))}throw new i(n?`\u7B49\u5F85\u6388\u6743\u5B8C\u6210\u8D85\u65F6: ${n}`:"\u7B49\u5F85\u6388\u6743\u5B8C\u6210\u8D85\u65F6\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C `xt login`\u3002")}async function U(t){const o=new URL(await l());o.searchParams.set("token_key",t);const e={headers:a(t)};let r;d(o.toString(),e),await E(p);try{r=await fetch(o.toString(),e)}catch(n){throw k(o.toString(),n),new i("\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}finally{A(p)}const s=await r.text();f(o.toString(),r,s);try{const n=JSON.parse(s);return{message:n.message,success:r.ok&&n.success!==!1}}catch{throw new i("\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6CD5\u89E3\u6790\u7684\u54CD\u5E94\u3002")}}function a(t,o=!1){const e={platform:"pc",source:"PC"};return t?.trim()&&(e.Authorization=`Bearer ${t.trim()}`),o&&(e["Content-Type"]="application/json"),e}export{N as checkToken,q as exchangeTicket,b as fetchAuthLink,H as getAuthContext,C as loginAuth,z as waitForAuthorizedToken};
|
package/dist/lib/download.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import n from"node:os";import a from"node:path";import{writeFile as f}from"node:fs/promises";import{XtzError as i}from"./errors.js";import{DEFAULT_NETWORK_THROTTLE_MS as m,markNetworkComplete as s,waitForNetworkSlot as c}from"./throttle.js";async function y(t,r){let o;await c(m);try{o=await fetch(t)}catch{throw new i("\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002")}finally{s(m)}if(!o.ok)throw new i(`\u4E0B\u8F7D\u5931\u8D25 (${o.status})`);const e=r?a.resolve(r):d(t),w=Buffer.from(await o.arrayBuffer());return await f(e,w),e}function d(t){try{const r=new URL(t).pathname,o=decodeURIComponent(a.basename(r));return a.join(n.homedir(),"Downloads",o||"download.bin")}catch{return a.join(n.homedir(),"Downloads","download.bin")}}export{y as downloadToPath};
|
package/dist/lib/flags.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Flags as e}from"@oclif/core";const t={profile:e.string({aliases:["agent"],description:"Profile name used for token lookup"}),json:e.boolean({default:!1,description:"Output JSON"})},
|
|
1
|
+
import{Flags as e}from"@oclif/core";const t={profile:e.string({aliases:["agent"],description:"Profile name used for token lookup"}),json:e.boolean({default:!1,description:"Output JSON"})},r={cloudDataId:e.string({description:"Select a cloud record by data_id, such as tcga-brca-2"}),cloudKey:e.string({description:"Cloud data key such as surv; defaults to the detected cloud input key"}),cloudFilter:e.string({description:"Filter cloud records by disease or keyword, such as \u4E73\u817A\u6D78\u6DA6\u764C"}),cloudIndex:e.integer({description:"0-based index into the matched cloud records",min:0}),cloudRecordFile:e.string({description:"Path to a JSON file containing the selected cloud record"}),cloudRecordJson:e.string({description:"JSON string containing the selected cloud record"})},d={recordKey:e.string({description:"XTRecord field key such as main; defaults to the detected record input key"}),recordId:e.string({description:"Pick a history record by record_id when multiple history records exist for the module"}),recordJson:e.string({description:"JSON string containing the selected history record (must include record_id)"}),recordFile:e.string({description:"Path to a JSON file containing the selected history record"})};export{t as globalFlags,r as toolCloudFlags,d as toolRecordFlags};
|
package/dist/lib/http.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{XtzError as
|
|
1
|
+
import{XtzError as i,raiseApiError as l}from"./errors.js";import{debugHttpError as m,debugHttpRequest as p,debugHttpResponse as u}from"./debug.js";import{DEFAULT_NETWORK_THROTTLE_MS as f,markNetworkComplete as w,waitForNetworkSlot as d}from"./throttle.js";async function H(r,t={},o={}){let e;const n=o.throttleMs??f;p(r,t),await d(n);try{e=await fetch(r,t)}catch(c){throw m(r,c),new i("\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}finally{w(n)}const s=await e.text();u(r,e,s);const a=h(e,s);return o.allowErrorPayload?.(a,e)||e.ok||await l(a,o),a}function h(r,t){try{return JSON.parse(t)}catch{const o=[`HTTP ${r.status}`,r.headers.get("content-type")?.trim()].filter(Boolean).join(", "),e=y(t);throw new i(e?`\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6CD5\u89E3\u6790\u7684\u54CD\u5E94\uFF08${o}\uFF09\uFF1A${e}`:`\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6CD5\u89E3\u6790\u7684\u54CD\u5E94\uFF08${o}\uFF09\u3002`)}}function y(r){const t=r.trim().replace(/\s+/g," ");return t?t.length>160?`${t.slice(0,160)}...`:t:""}export{H as requestJson};
|
|
@@ -1,39 +1,43 @@
|
|
|
1
|
-
import
|
|
1
|
+
import d from"node:readline/promises";import{stdin as p,stdout as s}from"node:process";import{XtzError as a}from"./errors.js";import{isJsonObject as y}from"./json.js";import{formatSetOverrides as x}from"./plot-options.js";import{getBrowsableToolMenuChildren as A,isRunnableToolMenu as C}from"./xiantao.js";async function tt(t,e){h();const n=d.createInterface({input:p,output:s}),r=structuredClone(e);try{let i=0,o=0;for(;i<t.length;){const u=t[i],c=u.form??[];if(c.length===0){i+=1,o=0;continue}for(s.write(`
|
|
2
2
|
[${u.label?.trim()||u.key}]
|
|
3
3
|
`),s.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
|
-
`);o<
|
|
5
|
-
`);continue}i=N.sectionIndex,o=N.fieldIndex;break}if(
|
|
4
|
+
`);o<c.length;){const w=c[o],l=r[u.key];if(!y(l)){o+=1;continue}const f=l[w.key];if(!y(f)){o+=1;continue}const m=await k(n,w,f.value);if(m.type==="back"){const N=L(t,i,o);if(!N){s.write(`\u5DF2\u7ECF\u662F\u7B2C\u4E00\u9879\u3002
|
|
5
|
+
`);continue}i=N.sectionIndex,o=N.fieldIndex;break}if(m.type==="skip"){i+=1,o=0;break}f.value=m.value,o+=1}o>=c.length&&(i+=1,o=0)}}finally{n.close()}return r}async function et(t){h(),s.write(`
|
|
6
6
|
\u6700\u7EC8\u53C2\u6570:
|
|
7
7
|
`),s.write(`${JSON.stringify(t,null,2)}
|
|
8
8
|
`),s.write(`
|
|
9
9
|
\u53EF\u590D\u7528 --set:
|
|
10
10
|
`);for(const n of x(t))s.write(`${n}
|
|
11
|
-
`);const e=
|
|
11
|
+
`);const e=d.createInterface({input:p,output:s});try{const n=(await e.question("\u786E\u8BA4\u63D0\u4EA4? [y/N] ")).trim().toLowerCase();if(n!=="y"&&n!=="yes")throw new a("\u5DF2\u53D6\u6D88\u63D0\u4EA4\u3002")}finally{e.close()}}async function nt(t){if(h(),t.length===0)return[];const e=d.createInterface({input:p,output:s});try{return await I(e,t)}finally{e.close()}}async function rt(t){h();const e=t.filter(u=>H(u));if(e.length===0)throw new a("\u5F53\u524D\u4EA7\u54C1\u672A\u8FD4\u56DE\u53EF\u9009\u5DE5\u5177\u76EE\u5F55\u3002");const n=d.createInterface({input:p,output:s}),r=[];let i=e,o="\u9009\u62E9\u5927\u7C7B";try{for(;;){s.write(`
|
|
12
12
|
[${o}]
|
|
13
|
-
`),i.forEach((
|
|
14
|
-
`)});const u=r.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
|
|
15
|
-
`);continue}i=
|
|
16
|
-
`)}}}finally{n.close()}}async function
|
|
17
|
-
\u8F93\u5165\u5F85\u4E0A\u4F20\u7684 xlsx \u6587\u4EF6\u8DEF\u5F84\uFF0C\u56DE\u8F66\u53D6\u6D88: `)).trim();if(!e)throw new a("\u5DF2\u53D6\u6D88\u6587\u4EF6\u9009\u62E9\u3002");return e}}finally{t.close()}}async function
|
|
13
|
+
`),i.forEach((c,w)=>{const l=S(c),f=A(c).length>0?" >":` (${c.code?.trim()??"-"})`;s.write(` ${w+1}. ${l}${f}
|
|
14
|
+
`)});const u=r.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 c=(await n.question(u)).trim();if(!c)throw new a("\u5DF2\u53D6\u6D88\u5DE5\u5177\u9009\u62E9\u3002");if(c==="<"){const m=r.pop();if(!m){s.write(`\u5DF2\u7ECF\u662F\u9876\u5C42\u76EE\u5F55\u3002
|
|
15
|
+
`);continue}i=m.menus,o=m.title;continue}const w=Number(c);if(!Number.isInteger(w)||w<1||w>i.length)throw new a(`\u65E0\u6548\u9009\u9879: ${c}`);const l=i[w-1],f=A(l);if(f.length>0){r.push({menus:i,title:o}),i=f,o=S(l);continue}if(!C(l))throw new a(`${S(l)} \u7F3A\u5C11\u53EF\u6267\u884C\u4FE1\u606F\uFF0C\u8BF7\u6539\u7528\u663E\u5F0F module_id/uuid\u3002`);return j(l)}catch(c){if(!(c instanceof a))throw c;s.write(`${c.message}
|
|
16
|
+
`)}}}finally{n.close()}}async function it(){h();const t=d.createInterface({input:p,output:s});try{for(;;){const e=(await t.question(`
|
|
17
|
+
\u8F93\u5165\u5F85\u4E0A\u4F20\u7684 xlsx \u6587\u4EF6\u8DEF\u5F84\uFF0C\u56DE\u8F66\u53D6\u6D88: `)).trim();if(!e)throw new a("\u5DF2\u53D6\u6D88\u6587\u4EF6\u9009\u62E9\u3002");return e}}finally{t.close()}}async function ot(){h();const t=d.createInterface({input:p,output:s});try{for(;;)try{s.write(`
|
|
18
18
|
[\u6570\u636E\u6765\u6E90]
|
|
19
19
|
`),s.write(` 1. \u4E0A\u4F20\u672C\u5730\u6587\u4EF6
|
|
20
20
|
`),s.write(` 2. \u4F7F\u7528 demo \u6570\u636E
|
|
21
21
|
`);const e=(await t.question("\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u53D6\u6D88: ")).trim();if(!e)throw new a("\u5DF2\u53D6\u6D88\u6570\u636E\u6765\u6E90\u9009\u62E9\u3002");if(e==="1")return"upload";if(e==="2")return"demo";throw new a(`\u65E0\u6548\u9009\u9879: ${e}`)}catch(e){if(!(e instanceof a))throw e;s.write(`${e.message}
|
|
22
|
-
`)}}finally{t.close()}}async function
|
|
22
|
+
`)}}finally{t.close()}}async function st(t){if(h(),t.length===0)throw new a("\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u7684\u4E91\u7AEF\u6570\u636E\u8BB0\u5F55\u3002");const e=d.createInterface({input:p,output:s});try{for(;;)try{s.write(`
|
|
23
23
|
[\u4E91\u7AEF\u6570\u636E]
|
|
24
|
-
`),t.forEach((i,o)=>{s.write(` ${o+1}. ${
|
|
24
|
+
`),t.forEach((i,o)=>{s.write(` ${o+1}. ${M(i)}
|
|
25
25
|
`)});const n=(await e.question("\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u53D6\u6D88: ")).trim();if(!n)throw new a("\u5DF2\u53D6\u6D88\u4E91\u7AEF\u6570\u636E\u9009\u62E9\u3002");const r=Number(n);if(!Number.isInteger(r)||r<1||r>t.length)throw new a(`\u65E0\u6548\u9009\u9879: ${n}`);return structuredClone(t[r-1])}catch(n){if(!(n instanceof a))throw n;s.write(`${n.message}
|
|
26
|
-
`)}}finally{e.close()}}async function
|
|
26
|
+
`)}}finally{e.close()}}async function at(t){if(h(),t.length===0)throw new a("\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u7684\u5386\u53F2\u8BB0\u5F55\u3002");const e=d.createInterface({input:p,output:s});try{for(;;)try{s.write(`
|
|
27
|
+
[\u5386\u53F2\u8BB0\u5F55]
|
|
28
|
+
`),t.forEach((i,o)=>{s.write(` ${o+1}. ${P(i)}
|
|
29
|
+
`)});const n=(await e.question("\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u53D6\u6D88: ")).trim();if(!n)throw new a("\u5DF2\u53D6\u6D88\u5386\u53F2\u8BB0\u5F55\u9009\u62E9\u3002");const r=Number(n);if(!Number.isInteger(r)||r<1||r>t.length)throw new a(`\u65E0\u6548\u9009\u9879: ${n}`);return structuredClone(t[r-1])}catch(n){if(!(n instanceof a))throw n;s.write(`${n.message}
|
|
30
|
+
`)}}finally{e.close()}}async function ct(t){if(h(),!t.hasFile&&t.downloads.length===0)return{downloadFile:!1,downloads:[]};const e=D(t),n=d.createInterface({input:p,output:s});try{for(;;)try{s.write(`
|
|
27
31
|
[\u7ED3\u679C\u5904\u7406]
|
|
28
|
-
`),e.forEach((u,
|
|
29
|
-
`)});const r=(await n.question("\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u8DF3\u8FC7: ")).trim();if(!r)return{downloadFile:!1,downloads:[]};const i=Number(r);if(!Number.isInteger(i)||i<1||i>e.length)throw new a(`\u65E0\u6548\u9009\u9879: ${r}`);const o=e[i-1];return o.type==="skip"?{downloadFile:!1,downloads:[]}:o.type==="file"?{downloadFile:!0,downloads:[]}:o.type==="all"?{downloadFile:!0,downloads:t.downloads}:{downloadFile:!1,downloads:t.downloads.length<=1?t.downloads:await
|
|
30
|
-
`)}}finally{n.close()}}function h(){if(!
|
|
32
|
+
`),e.forEach((u,c)=>{s.write(` ${c+1}. ${u.label}
|
|
33
|
+
`)});const r=(await n.question("\u8F93\u5165\u7F16\u53F7\uFF0C\u56DE\u8F66\u8DF3\u8FC7: ")).trim();if(!r)return{downloadFile:!1,downloads:[]};const i=Number(r);if(!Number.isInteger(i)||i<1||i>e.length)throw new a(`\u65E0\u6548\u9009\u9879: ${r}`);const o=e[i-1];return o.type==="skip"?{downloadFile:!1,downloads:[]}:o.type==="file"?{downloadFile:!0,downloads:[]}:o.type==="all"?{downloadFile:!0,downloads:t.downloads}:{downloadFile:!1,downloads:t.downloads.length<=1?t.downloads:await I(n,t.downloads)}}catch(r){if(!(r instanceof a))throw r;s.write(`${r.message}
|
|
34
|
+
`)}}finally{n.close()}}function h(){if(!p.isTTY||!s.isTTY)throw new a("`--interactive` \u4EC5\u652F\u6301\u5728\u7EC8\u7AEF\u4E2D\u4F7F\u7528\u3002")}async function I(t,e){for(s.write(`
|
|
31
35
|
[\u4E0B\u8F7D\u7ED3\u679C]
|
|
32
36
|
`),e.forEach((n,r)=>{s.write(` ${r+1}. ${n.label} (${n.device})
|
|
33
|
-
`)});;)try{const n=(await t.question("\u8F93\u5165\u7F16\u53F7\u4E0B\u8F7D\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C\u56DE\u8F66\u8DF3\u8FC7: ")).trim();return n?
|
|
37
|
+
`)});;)try{const n=(await t.question("\u8F93\u5165\u7F16\u53F7\u4E0B\u8F7D\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C\u56DE\u8F66\u8DF3\u8FC7: ")).trim();return n?q(n,e.length).map(i=>e[i]):[]}catch(n){if(!(n instanceof a))throw n;s.write(`${n.message}
|
|
34
38
|
`)}}async function k(t,e,n){for(;;)try{const r=e.label?.trim()||e.key,i="\u8F93\u5165 < \u8FD4\u56DE\u4E0A\u4E00\u9879\uFF0C/skip \u8DF3\u8FC7\u672C\u7EC4";if(e.options?.length){s.write(`${r}
|
|
35
|
-
`),
|
|
36
|
-
`)}}function F(t,e){const n=t.trim(),r=Number(n);if(Number.isInteger(r)&&r>=1&&r<=e.length)return structuredClone(e[r-1]);const i=e.find(o=>String(o)===n);if(i===void 0)throw new a(`\u65E0\u6548\u9009\u9879: ${t}`);return structuredClone(i)}function O(t,e){const n=t.split(/[,,]/).map(r=>r.trim()).filter(Boolean);if(n.length===0)throw new a("\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u9009\u9879\u3002");return n.map(r=>{const i=Number(r);if(Number.isInteger(i)&&i>=1&&i<=e.length)return structuredClone(e[i-1]);const o=e.find(u=>String(u)===r);if(o===void 0)throw new a(`\u65E0\u6548\u9009\u9879: ${r}`);return structuredClone(o)})}function
|
|
37
|
-
`)})}function b(t){if(t==="<")return{type:"back"};if(t==="/skip")return{type:"skip"}}function
|
|
38
|
-
`),n.forEach(r=>{const i=$(r);s.write(` ${
|
|
39
|
-
`)}))}function
|
|
39
|
+
`),R(e.options,n);const l=e.multiple?`\u8F93\u5165\u7F16\u53F7\u6216\u9009\u9879\u503C\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C${i}`:`\u8F93\u5165\u7F16\u53F7\u6216\u9009\u9879\u503C\uFF0C${i}`,f=(await t.question(`${l} [${g(n)}]: `)).trim();if(!f)return{type:"value",value:n};const m=b(f);return m||{type:"value",value:e.multiple?O(f,e.options):F(f,e.options)}}if(e.type==="XTSwitch"){const l=(await t.question(`${r} (\u5F00/\u5173\uFF0C${i}) [${z(n)}]: `)).trim();if(!l)return{type:"value",value:n};const f=b(l);return f||{type:"value",value:v(l)}}if(e.type==="XTColor"){X(n);const l=(await t.question(`${r} (\u989C\u8272\u7528\u9017\u53F7\u6216\u7A7A\u683C\u5206\u9694\uFF0C${i}) [${B(n)}]: `)).trim();if(!l)return{type:"value",value:n};const f=b(l);return f||{type:"value",value:E(l,n)}}const o=e.placeholder?.trim()||e.tips?.trim()||_(n),u=o?`${r} (${o}\uFF0C${i}) [${g(n)}]: `:`${r} (${i}) [${g(n)}]: `,c=(await t.question(u)).trim();if(!c)return{type:"value",value:n};const w=b(c);return w||{type:"value",value:J(c,n)}}catch(r){if(!(r instanceof a))throw r;s.write(`${r.message}
|
|
40
|
+
`)}}function F(t,e){const n=t.trim(),r=Number(n);if(Number.isInteger(r)&&r>=1&&r<=e.length)return structuredClone(e[r-1]);const i=e.find(o=>String(o)===n);if(i===void 0)throw new a(`\u65E0\u6548\u9009\u9879: ${t}`);return structuredClone(i)}function O(t,e){const n=t.split(/[,,]/).map(r=>r.trim()).filter(Boolean);if(n.length===0)throw new a("\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u9009\u9879\u3002");return n.map(r=>{const i=Number(r);if(Number.isInteger(i)&&i>=1&&i<=e.length)return structuredClone(e[i-1]);const o=e.find(u=>String(u)===r);if(o===void 0)throw new a(`\u65E0\u6548\u9009\u9879: ${r}`);return structuredClone(o)})}function q(t,e){const n=t.split(/[,,]/).map(i=>i.trim()).filter(Boolean);if(n.length===0)throw new a("\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A\u9009\u9879\u3002");const r=n.map(i=>{const o=Number(i);if(!Number.isInteger(o)||o<1||o>e)throw new a(`\u65E0\u6548\u9009\u9879: ${i}`);return o-1});return[...new Set(r)]}function J(t,e){if(typeof e=="boolean")return v(t);if(typeof e=="number"){const n=Number(t);if(Number.isNaN(n))throw new a(`\u65E0\u6548\u6570\u5B57: ${t}`);return n}if(Array.isArray(e))return T(t);if(y(e))try{const n=JSON.parse(t);if(!y(n))throw new a(`\u8BF7\u8F93\u5165 JSON \u5BF9\u8C61: ${t}`);return n}catch{throw new a(`\u8BF7\u8F93\u5165\u5408\u6CD5 JSON \u5BF9\u8C61: ${t}`)}return t}function P(t){const e=typeof t.record_id=="string"?t.record_id.trim():"",n=typeof t.record_name=="string"?t.record_name.trim():"",r=typeof t.time=="string"?t.time.trim():"",i=[n,r].filter(Boolean).join(" ");return e&&i?`${e} (${i})`:e||i||"\u672A\u547D\u540D\u5386\u53F2\u8BB0\u5F55"}function M(t){const e=typeof t.data_id=="string"?t.data_id.trim():"",n=typeof t.label=="string"?t.label.trim():"";return n&&e?`${n} (${e})`:n||e||"\u672A\u547D\u540D\u8BB0\u5F55"}function T(t){if(t.startsWith("["))try{const e=JSON.parse(t);if(!Array.isArray(e))throw new a(`\u8BF7\u8F93\u5165 JSON \u6570\u7EC4: ${t}`);return e}catch{throw new a(`\u8BF7\u8F93\u5165\u5408\u6CD5 JSON \u6570\u7EC4: ${t}`)}return t.split(",").map(e=>e.trim()).filter(Boolean)}function v(t){const e=t.trim().toLowerCase();if(["y","yes","true","1","on","\u5F00"].includes(e))return!0;if(["n","no","false","0","off","\u5173"].includes(e))return!1;throw new a(`\u65E0\u6548\u5F00\u5173\u503C: ${t}`)}function E(t,e){if(t.startsWith("["))try{const r=JSON.parse(t);if(!Array.isArray(r)||!r.every(i=>typeof i=="string"))throw new a(`\u8BF7\u8F93\u5165\u5B57\u7B26\u4E32\u6570\u7EC4: ${t}`);return Array.isArray(e)?r.map($):$(r[0]??"")}catch{throw new a(`\u8BF7\u8F93\u5165\u5408\u6CD5\u989C\u8272\u6570\u7EC4: ${t}`)}const n=t.split(/[\s,,]+/).map(r=>r.trim()).filter(Boolean);if(n.length===0)throw new a("\u8BF7\u81F3\u5C11\u8F93\u5165\u4E00\u4E2A\u989C\u8272\u503C\u3002");return Array.isArray(e)?n.map($):$(n[0])}function _(t){return typeof t=="boolean"?"\u5F00/\u5173":Array.isArray(t)?"\u8F93\u5165 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694\u503C":y(t)?"\u8F93\u5165 JSON \u5BF9\u8C61":""}function g(t){return typeof t=="string"?t:JSON.stringify(t)}function z(t){return t===!0?"\u5F00":"\u5173"}function B(t){return Array.isArray(t)?t.join(", "):g(t)}function R(t,e){const n=Array.isArray(e)?e.map(String):[String(e)];t.forEach((r,i)=>{const o=String(r),u=n.includes(o)?"*":" ";s.write(` ${u} ${i+1}. ${o}
|
|
41
|
+
`)})}function b(t){if(t==="<")return{type:"back"};if(t==="/skip")return{type:"skip"}}function L(t,e,n){if(n>0)return{fieldIndex:n-1,sectionIndex:e};for(let r=e-1;r>=0;r-=1){const i=t[r].form??[];if(i.length>0)return{fieldIndex:i.length-1,sectionIndex:r}}}function $(t){const e=t.trim();return/^[0-9a-fA-F]{3}$/.test(e)||/^[0-9a-fA-F]{6}$/.test(e)?`#${e}`:e}function H(t){return!!(t.title?.trim()||t.code?.trim())}function S(t){return t.title?.trim()||t.code?.trim()||"\u672A\u547D\u540D"}function j(t){const e=t.code?.trim(),n=t.route?.trim(),r=t.title?.trim(),i=t.uuid?.trim();if(!e||!n||!r||!i)throw new a("\u9009\u4E2D\u7684\u5DE5\u5177\u7F3A\u5C11\u5FC5\u8981\u4FE1\u606F\uFF0C\u8BF7\u6539\u7528\u663E\u5F0F module_id/uuid\u3002");return{code:e,path:t.path?.trim()??"",route:n,title:r,uuid:i}}function D(t){const e=[];return t.hasFile&&e.push({label:"\u4E0B\u8F7D\u751F\u56FE",type:"file"}),t.downloads.length>0&&e.push({label:t.downloads.length===1?"\u4E0B\u8F7D\u5206\u6790\u7ED3\u679C":"\u9009\u62E9\u5206\u6790\u7ED3\u679C\u4E0B\u8F7D",type:"analysis"}),t.hasFile&&t.downloads.length>0&&e.push({label:"\u4E0B\u8F7D\u751F\u56FE\u548C\u5168\u90E8\u5206\u6790\u7ED3\u679C",type:"all"}),e.push({label:"\u8DF3\u8FC7",type:"skip"}),e}function X(t){const n=(Array.isArray(t)?t:[t]).filter(r=>typeof r=="string");n.length!==0&&(s.write(`\u5F53\u524D\u989C\u8272:
|
|
42
|
+
`),n.forEach(r=>{const i=$(r);s.write(` ${W(i)} ${i}
|
|
43
|
+
`)}))}function W(t){const e=Y(t);return e?`\x1B[48;2;${e.r};${e.g};${e.b}m \x1B[0m`:"[?]"}function Y(t){const e=t.trim(),n=e.match(/^#([0-9a-fA-F]{3})$/);if(n){const[i,o,u]=n[1].split("").map(c=>Number.parseInt(c+c,16));return{r:i,g:o,b:u}}const r=e.match(/^#([0-9a-fA-F]{6})$/);if(r)return{r:Number.parseInt(r[1].slice(0,2),16),g:Number.parseInt(r[1].slice(2,4),16),b:Number.parseInt(r[1].slice(4,6),16)}}export{et as confirmPlotArgsMain,tt as promptPlotArgsMain,st as promptPlotCloudRecordSelection,nt as promptPlotDownloads,it as promptPlotFilePath,ot as promptPlotInputSource,rt as promptPlotMenuSelection,at as promptPlotRecordSelection,ct as promptPlotResultSelection};
|
package/dist/lib/plot.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{basename as
|
|
1
|
+
import{basename as _}from"node:path";import{readFile as x,stat as z}from"node:fs/promises";import{debugHttpError as O,debugHttpRequest as R,debugHttpResponse as T}from"./debug.js";import{resolveUploadConfigEndpoint as A,resolveXiantaoBioApiEndpoint as p}from"./config.js";import{XtzError as l}from"./errors.js";import{requestJson as u}from"./http.js";import{deepMerge as C}from"./json.js";import{buildArgsMainFromSchema as F}from"./plot-schema.js";import{DEFAULT_NETWORK_THROTTLE_MS as w,markNetworkComplete as N,waitForNetworkSlot as P}from"./throttle.js";async function j(e,o){const a=await u(await A(),{headers:{Authorization:`Bearer ${e.token}`}},{agent:e.agent}),t=$(a.data),s=await x(o),i=await z(o),r=_(o),d=`${t.dir}/${r}`,n=new FormData;n.set("key",d),n.set("policy",t.policy),n.set("OSSAccessKeyId",t.access_id),n.set("success_action_status","200"),n.set("signature",t.signature),n.set("file",new Blob([s]),r);const m={body:n,headers:{"x-oss-object-acl":"public-read"},method:"POST"};R(t.host,m);let c;await P(w);try{c=await fetch(t.host,m)}catch(f){throw O(t.host,f),f}finally{N(w)}const S=await c.text();if(T(t.host,c,S),!c.ok)throw new l(`\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25 (${c.status})`);return{fileName:r,fileOss:`${t.host.replace(/\/$/,"")}/${d}`,fileOssPath:d,fileSize:i.size,fileSizeForXiantao:Number((i.size/(1024*1024)).toFixed(2))}}async function g(e,o,a,t){const s=b({argsMain:t,definition:o,duid:"",upload:a});delete s.args.action,s.args.id.uuid="2d491694-8c8d-11ee-9409-00163e118c99";const i=await u(await p(),{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}),r=i.data.id?.duid;if(!r)throw new l(i.message??"\u672A\u83B7\u53D6\u5230 duid");return{duid:r,schema:i.data.args_main??[]}}async function y(e,o,a,t){return(await g(e,o,a,t)).duid}async function h(e,o,a,t){const s=b({argsMain:t,definition:o,duid:a.duid,upload:a.upload}),i=await u(await p(),{body:JSON.stringify(s),headers:{Authorization:`Bearer ${e.token}`,"Content-Type":"application/json"},method:"POST"},{agent:e.agent});if(!i.data.file)throw new l(i.message??"\u672A\u83B7\u53D6\u5230\u56FE\u7247\u94FE\u63A5");return i.data.file}async function q(e,o,a,t){const s=await y(e,o,a,t),i=await h(e,o,{duid:s,upload:a},t);return{duid:s,file:i}}async function I(e,o,a,t){const s=await g(e,o,a,o.seedArgsMain),i=C(F(s.schema),t),r=await y(e,o,a,i),d=await h(e,o,{duid:r,upload:a},i);return{argsMain:i,duid:r,file:d,schema:s.schema}}function b(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 $(e){const o=Buffer.from(e,"base64").toString("utf8"),a=decodeURIComponent(o.replaceAll("+"," "));return JSON.parse(a)}export{q as createPlot,I as createPlotFromSchema,g as inspectPlotUpload,h as submitPlot,j as uploadFile,y as verifyPlotUpload};
|
package/dist/lib/storage.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{mkdir as _,readFile as a,rm as g,writeFile as A}from"node:fs/promises";import T from"node:os";import u from"node:path";import{DEFAULT_AGENT as l,DEFAULT_XIANTAO_TOOL_PRODUCT_UUID as w,XTZ_CONFIG_PATH as N}from"./constants.js";import{XtzError as f}from"./errors.js";import{deepMerge as p}from"./json.js";import{isJsonObject as e}from"./json.js";function m(r){return u.join(T.homedir(),".config","helixlife","user-access-token.txt")}async function y(r,t){const n=m(r);return await _(u.dirname(n),{recursive:!0}),await A(n,`${t.trim()}
|
|
2
|
-
`,"utf8"),n}async function v(r){const t=m(r);try{return(await a(t,"utf8")).trim()||void 0}catch(n){if(O(n)&&n.code==="ENOENT")return;throw n}}async function L(r){const t=await v(r);if(t)return t;throw new f(`\u672A\u627E\u5230 ${r} \u7684 token\uFF0C\u8BF7\u5148\u8FD0\u884C \`xt login --profile ${r}\``)}async function G(r){const t=m(r);try{return await g(t),!0}catch(n){if(O(n)&&n.code==="ENOENT")return!1;throw n}}async function d(){const r=u.join(T.homedir(),N);try{const t=await a(r,"utf8")
|
|
2
|
+
`,"utf8"),n}async function v(r){const t=m(r);try{return(await a(t,"utf8")).trim()||void 0}catch(n){if(O(n)&&n.code==="ENOENT")return;throw n}}async function L(r){const t=await v(r);if(t)return t;throw new f(`\u672A\u627E\u5230 ${r} \u7684 token\uFF0C\u8BF7\u5148\u8FD0\u884C \`xt login --profile ${r}\``)}async function G(r){const t=m(r);try{return await g(t),!0}catch(n){if(O(n)&&n.code==="ENOENT")return!1;throw n}}async function d(){const r=u.join(T.homedir(),N);try{const t=await a(r,"utf8");if(!t.trim())return{};const n=JSON.parse(t);if(!e(n))throw new f(`\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);return n}catch(t){if(O(t)&&t.code==="ENOENT")return{};throw t}}async function X(r){const t=r?.trim();if(t)return t;const n=h();return n||(await d()).agent?.trim()||l}async function $(r){if(r?.trim())return r.trim();if(process.env.XIANTAO_TOOL_PRODUCT_UUID?.trim())return process.env.XIANTAO_TOOL_PRODUCT_UUID.trim();const n=(await d()).xiantao?.toolProductUuid?.trim();return n||w}async function F(r,t){const i=(await d()).plots?.[r],s=e(i)&&e(i.argsMain)?i.argsMain:{};if(!t)return s;const o=await C(t),c=(e(o.plots)?o.plots:void 0)?.[r];return e(c)&&e(c.argsMain)?p(s,c.argsMain):e(o.argsMain)?p(s,o.argsMain):p(s,o)}async function C(r){const t=await a(r,"utf8"),n=JSON.parse(t);if(!e(n))throw new f(`JSON \u914D\u7F6E\u683C\u5F0F\u4E0D\u6B63\u786E: ${r}`);return n}function O(r){return r instanceof Error&&"code"in r}function h(){const r=process.env.AGENT_NAME?.trim();if(r)return r;if(R())return"cursor";if(E("OPENCODE"))return"opencode";if(E("OPENCLAW"))return"openclaw"}function R(){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 E(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{G as deleteToken,m as getTokenPath,F as loadPlotArgsMainConfig,v as loadToken,d as readXtzConfig,L as requireToken,X as resolveAgent,$ as resolveXiantaoToolProductUuid,y as saveToken};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const i=1100;let o=0;async function s(n=1100){const t=Math.max(0,n);if(t===0)return;const e=Date.now(),a=Math.max(e,o);o=a+t;const r=a-e;r>0&&await new Promise(T=>setTimeout(T,r))}function c(n=1100){const t=Math.max(0,n);if(t===0)return;const e=Date.now()+t;e>o&&(o=e)}export{i as DEFAULT_NETWORK_THROTTLE_MS,c as markNetworkComplete,s as waitForNetworkSlot};
|
package/dist/lib/tool-inputs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isJsonObject as i}from"./json.js";function
|
|
1
|
+
import{isJsonObject as i}from"./json.js";function s(n){return n.flatMap(e=>{if(!i(e)||e.type!=="XTUpload")return[];const r=typeof e.key=="string"?e.key.trim():"";if(!r)return[];const t=i(e.default_value)?e.default_value:void 0,o=typeof t?.file_name=="string"?t.file_name.trim():"",f=typeof t?.file_oss=="string"?t.file_oss.trim():"",u=typeof t?.file_size=="number"?t.file_size:void 0;return[{defaultUpload:o&&f&&typeof u=="number"?{fileName:o,fileOss:f,fileSize:u}:null,key:r,label:typeof e.label=="string"?e.label.trim():"",required:e.required===!0}]})}function c(n){for(const e of n){if(!i(e)||e.type!=="XTRecord")continue;const r=typeof e.key=="string"?e.key.trim():"",t=i(e.default_value)?e.default_value:void 0,o=typeof t?.record_id=="string"?t.record_id.trim():"";if(!(!r||!o))return{key:r,label:typeof e.label=="string"?e.label.trim():"",moduleId:typeof t?.module_id=="string"?t.module_id.trim():"",moduleName:typeof t?.module_name=="string"?t.module_name.trim():"",recordId:o,recordName:typeof t?.record_name=="string"?t.record_name.trim():"",time:typeof t?.time=="string"?t.time.trim():""}}return null}function p(n,e){const r=e.trim();if(!r)return null;for(const t of n)if(!(!i(t)||t.type!=="XTRecord")&&!(typeof t.key!="string"||t.key.trim()!==r))return{label:typeof t.label=="string"?t.label.trim():"",options:d(t)};return null}function y(n,e){const r=e.trim();if(!r)return null;for(const t of n)if(i(t)&&!(typeof t.key!="string"||t.key.trim()!==r))return typeof t.type=="string"?t.type.trim():"";return null}function d(n){const e=[],r=Array.isArray(n.options)?n.options:[];for(const o of r)i(o)&&typeof o.record_id=="string"&&o.record_id.trim()&&e.push(structuredClone(o));if(e.length>0)return e;const t=i(n.default_value)?n.default_value:void 0;return t&&typeof t.record_id=="string"&&t.record_id.trim()&&e.push(structuredClone(t)),e}function m(n){for(const e of n){if(!i(e))continue;const r=typeof e.key=="string"?e.key.trim():"";if(!r)continue;const t=l(e);if(t)return{key:r,label:typeof e.label=="string"?e.label.trim():"",record:t}}return null}function l(n,e=0){if(!i(n)||e>3)return null;if(typeof n.data_id=="string"?n.data_id.trim():"")return structuredClone(n);for(const t of Object.values(n)){if(!i(t))continue;const o=l(t,e+1);if(o)return o}return null}export{m as findDefaultXiantaoCloudInput,c as findDefaultXiantaoRecord,y as findXiantaoArgsDataType,p as findXiantaoRecordFieldByKey,s as listXiantaoUploadFields};
|