@superglue/cli 1.1.24 → 1.1.25

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "superglue",
3
3
  "description": "Build, test, and manage superglue tools via the sg CLI. Use when working with superglue tools, systems, APIs, SDKs, or the sg command.",
4
- "version": "1.1.24",
4
+ "version": "1.1.25",
5
5
  "author": {
6
6
  "name": "superglue",
7
7
  "email": "hello@superglue.cloud"
package/dist/cli.js CHANGED
@@ -1303,7 +1303,7 @@ ${h}`;break;case"retry":g(h)&&(b[A]=h);break;case"id":n(h)&&(b[A]=h);break;case"
1303
1303
  `).slice(1).join(`
1304
1304
  `);Me.stack=ke?`${ke}
1305
1305
  ${no}`:io.stack}l.exports.fetch=function(Me,Se=void 0){return V(Me,Se).catch(ke=>{throw $?ne(ke,$):ke&&typeof ke=="object"&&Error.captureStackTrace(ke,l.exports.fetch),ke})},l.exports.Headers=Nt().Headers,l.exports.Response=Xi().Response,l.exports.Request=ui().Request,l.exports.FormData=os().FormData;var{setGlobalOrigin:Z,getGlobalOrigin:J}=am();l.exports.setGlobalOrigin=Z,l.exports.getGlobalOrigin=J;var{CacheStorage:ie}=Od(),{kConstruct:ye}=Fo();l.exports.caches=new ie(ye);var{deleteCookie:we,getCookies:De,getSetCookies:Te,setCookie:Ye,parseCookie:Ge}=Vd();l.exports.deleteCookie=we,l.exports.getCookies=De,l.exports.getSetCookies=Te,l.exports.setCookie=Ye,l.exports.parseCookie=Ge;var{parseMIMEType:Be,serializeAMimeType:Qe}=qa();l.exports.parseMIMEType=Be,l.exports.serializeAMimeType=Qe;var{CloseEvent:Ce,ErrorEvent:We,MessageEvent:Ze}=rs(),{WebSocket:He,ping:co}=Pd();l.exports.WebSocket=He,l.exports.CloseEvent=Ce,l.exports.ErrorEvent=We,l.exports.MessageEvent=Ze,l.exports.ping=co,l.exports.WebSocketStream=Jd().WebSocketStream,l.exports.WebSocketError=Am().WebSocketError,l.exports.request=G(a.request),l.exports.stream=G(a.stream),l.exports.pipeline=G(a.pipeline),l.exports.connect=G(a.connect),l.exports.upgrade=G(a.upgrade),l.exports.MockClient=k,l.exports.MockCallHistory=d,l.exports.MockCallHistoryLog=j,l.exports.MockPool=w,l.exports.MockAgent=D,l.exports.SnapshotAgent=x,l.exports.mockErrors=E;var{EventSource:ue}=Zd();l.exports.EventSource=ue;function Ue(){globalThis.fetch=l.exports.fetch,globalThis.Headers=l.exports.Headers,globalThis.Response=l.exports.Response,globalThis.Request=l.exports.Request,globalThis.FormData=l.exports.FormData,globalThis.WebSocket=l.exports.WebSocket,globalThis.CloseEvent=l.exports.CloseEvent,globalThis.ErrorEvent=l.exports.ErrorEvent,globalThis.MessageEvent=l.exports.MessageEvent,globalThis.EventSource=l.exports.EventSource}l.exports.install=Ue}),Kd=he(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuperglueClient=void 0;var l=ct(),i=Zn(),g=$n(),n=14400*1e3,t;if(typeof globalThis.process<"u"&&globalThis.process.versions?.node)try{let{Agent:r}=Xd();t=new r({headersTimeout:n,bodyTimeout:n})}catch{}var o=class{constructor({apiKey:r,apiEndpoint:m,onInfrastructureError:p,sseTokenProvider:c,tokenProvider:y}){if(!r&&!y)throw new Error("SuperglueClient requires either apiKey or tokenProvider");this.tokenProvider=y??(async()=>r),this.apiEndpoint=m??"https://api.superglue.cloud",this.sseManager=new i.SSELogSubscriptionManager(this.apiEndpoint,c??this.tokenProvider),this.onInfrastructureError=p}async getApiKey(){return this.tokenProvider()}isInfrastructureError(r){return(0,g.isAbortError)(r)?!1:!!(r instanceof TypeError&&r.message.toLowerCase().includes("fetch")||r instanceof Error&&r.name==="TimeoutError")}async restRequest(r,m,p,c,y){let b=`${this.apiEndpoint.replace(/\/$/,"")}${m}`,f={Authorization:`Bearer ${await this.getApiKey()}`,...c};p&&r!=="GET"&&(f["Content-Type"]="application/json");let A;try{A=await fetch(b,{method:r,headers:f,body:p?JSON.stringify(p):void 0,signal:y?.signal??AbortSignal.timeout(n),...t?{dispatcher:t}:{}})}catch(a){throw this.isInfrastructureError(a)&&this.onInfrastructureError?.(),a}if(!A.ok){A.status>=500&&this.onInfrastructureError?.();let a=await A.text(),s=`HTTP ${A.status}: ${a}`;try{let k=JSON.parse(a).error;typeof k=="string"?s=k:k&&typeof k=="object"&&(s=k.message||JSON.stringify(k))}catch{}throw new Error(s)}let h=await A.text();if(h)return JSON.parse(h)}async subscribeToLogsSSE(r={}){return this.sseManager.subscribeToLogs(r)}async disconnect(){await this.sseManager.disconnect()}async runTool(r){let m=await this.restRequest("POST",`/v1/tools/${encodeURIComponent(r.toolId)}/run`,{inputs:r.payload,files:r.files,credentials:r.credentials,options:r.options,runId:r.runId});return{success:m.status==="success",data:m.data,error:m.error,tool:m.tool,stepResults:m.stepResults?.map(p=>({...p}))||[],...m.fileArtifacts&&m.fileArtifacts.length>0?{fileArtifacts:m.fileArtifacts}:{}}}async runToolConfig(r){let m=r.createRun?"/v1/tools/run?createRun=true":"/v1/tools/run",p=await this.restRequest("POST",m,{tool:r.tool,payload:r.payload,files:r.files,credentials:r.credentials,options:r.options,runId:r.runId},r.traceId?{"X-Trace-Id":r.traceId}:void 0);return{success:p.status?p.status==="success":p.success??!1,data:p.data,error:p.error,tool:p.tool||r.tool,stepResults:p.stepResults?.map(c=>({...c}))||[]}}async abortToolExecution(r){return{success:!0,runId:(await this.restRequest("POST",`/v1/runs/${encodeURIComponent(r)}/cancel`)).runId}}async executeStep({step:r,payload:m,files:p,previousResults:c,credentials:y,options:b,runId:f,mode:A,systemIds:h}){return this.restRequest("POST","/v1/tools/step/run",{step:r,payload:m,files:p,previousResults:c,credentials:y,options:b,runId:f,mode:A,systemIds:h})}async abortStep(r){return this.restRequest("POST","/v1/tools/step/abort",{runId:r})}async executeTransformOnly({outputTransform:r,outputSchema:m,inputSchema:p,payload:c,files:y,stepResults:b,responseFilters:f,options:A,runId:h}){return this.restRequest("POST","/v1/tools/transform/run",{outputTransform:r,outputSchema:m,inputSchema:p,payload:c,files:y,stepResults:b,responseFilters:f,options:A,runId:h})}async createRun({toolId:r,toolConfig:m,toolResult:p,stepResults:c,toolPayload:y,status:b,error:f,startedAt:A,completedAt:h}){return this.restRequest("POST","/v1/runs",{toolId:r,toolConfig:m,toolResult:p,stepResults:c,toolPayload:y,status:b,error:f,startedAt:A.toISOString(),completedAt:h.toISOString()})}async extract({file:r,envelope:m}){if(!r)throw new Error("File must be provided for extract.");let p=new FormData;p.append("file",r);let c=new URL(`${this.apiEndpoint.replace(/\/$/,"")}/v1/extract`);m&&c.searchParams.set("envelope","true");let y=c.toString(),b=await this.getApiKey(),f=await fetch(y,{method:"POST",headers:{Authorization:`Bearer ${b}`},body:p});if(!f.ok){let A=await f.text(),h=`HTTP ${f.status}: ${A}`;try{let a=JSON.parse(A);a.error&&(h=a.error)}catch{}throw new Error(h)}return f.json()}mapOpenAPIRunToRun(r){let m={running:l.RunStatus.RUNNING,success:l.RunStatus.SUCCESS,failed:l.RunStatus.FAILED,aborted:l.RunStatus.ABORTED};return{runId:r.runId??r.id,toolId:r.toolId,tool:r.tool,status:m[r.status]??l.RunStatus.FAILED,toolPayload:r.toolPayload,data:r.data,toolResult:r.data,error:r.error,stepResults:r.stepResults,options:r.options,requestSource:r.requestSource,traceId:r.traceId,resultStorageUri:r.resultStorageUri,userId:r.userId,userEmail:r.userEmail,userName:r.userName,metadata:r.metadata,fileArtifacts:r.fileArtifacts}}async listRuns(r){let{limit:m=100,page:p=1,toolId:c,search:y,searchUserIds:b,includeTotal:f=!0,startedAfter:A,status:h,requestSources:a,userId:s,systemId:k,signal:d}=r??{},j=new URLSearchParams({limit:String(m),page:String(p)});c&&j.set("toolId",c),y?.trim()&&j.set("search",y.trim()),b&&b.length>0&&j.set("searchUserIds",b.join(",")),f||j.set("includeTotal","false"),A&&j.set("startedAfter",A instanceof Date?A.toISOString():A),h&&j.set("status",h),a&&a.length>0&&j.set("requestSources",a.join(",")),s&&j.set("userId",s),k&&j.set("systemId",k);let D=await this.restRequest("GET",`/v1/runs?${j.toString()}`,void 0,void 0,{signal:d});return{items:D.data.map(w=>this.mapOpenAPIRunToRun(w)),total:D.total,page:D.page,limit:D.limit,hasMore:D.hasMore}}async getRun(r){try{let m=await this.restRequest("GET",`/v1/runs/${encodeURIComponent(r)}`);return this.mapOpenAPIRunToRun(m)}catch(m){if(m.message?.includes("404")||m.message?.includes("not found"))return null;throw m}}async getWorkflow(r){try{return await this.restRequest("GET",`/v1/tools/${encodeURIComponent(r)}`)}catch(m){if(m.message?.includes("404")||m.message?.includes("not found")||m.message?.includes("403")||m.message?.includes("not allowed"))return null;throw m}}async archiveWorkflow(r,m=!0){return this.upsertWorkflow(r,{archived:m})}async listWorkflows(r=10,m=0,p=!1){let c=Math.floor(m/r)+1,y=p?"&includeArchived=true":"",b=await this.restRequest("GET",`/v1/tools?limit=${r}&page=${c}${y}`);return{items:b.data,total:b.total}}async createWorkflow(r,m){return this.restRequest("POST","/v1/tools",{...m,id:r})}async updateWorkflow(r,m){return this.restRequest("PUT",`/v1/tools/${encodeURIComponent(r)}`,m)}async upsertWorkflow(r,m){return await this.getWorkflow(r)?this.updateWorkflow(r,m):this.createWorkflow(r,m)}async deleteWorkflow(r){try{return await this.restRequest("DELETE",`/v1/tools/${encodeURIComponent(r)}`),!0}catch(m){if(m.message?.includes("404"))return!1;throw m}}async renameWorkflow(r,m){return this.restRequest("POST",`/v1/tools/${encodeURIComponent(r)}/rename`,{newId:m})}async listSystems(r=10,m=1,p){let c=new URLSearchParams({limit:String(r),page:String(m)});p?.mode&&c.set("mode",p.mode);let y=await this.restRequest("GET",`/v1/systems?${c.toString()}`);return{items:y.data,total:y.total}}async getSystem(r,m){let p=m?.environment?`?env=${m.environment}`:"";return(await this.restRequest("GET",`/v1/systems/${encodeURIComponent(r)}${p}`)).data}async createSystem(r){return(await this.restRequest("POST","/v1/systems",r)).data}async updateSystem(r,m,p){let c=p?.environment?`?env=${p.environment}`:"";return(await this.restRequest("PATCH",`/v1/systems/${encodeURIComponent(r)}${c}`,m)).data}async deleteSystem(r,m){let p=m?.environment?`?env=${m.environment}`:"";return await this.restRequest("DELETE",`/v1/systems/${encodeURIComponent(r)}${p}`),!0}async switchSystemEnvironment(r,m){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(r)}/switch-env?env=${m}`)).data}async cacheOAuthSecret(r){return await this.restRequest("POST","/v1/oauth/secrets",r),!0}async getOAuthSecret(r){return(await this.restRequest("GET",`/v1/oauth/secrets/${encodeURIComponent(r)}`)).data}async getTemplateOAuthCredentials(r){return(await this.restRequest("GET",`/v1/oauth/templates/${encodeURIComponent(r)}/credentials`)).data}async searchSystemDocumentation(r,m){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(r)}/documentation/search`,{keywords:m})).data}async cacheOauthClientCredentials(r){return this.restRequest("POST","/v1/oauth/secrets",{uid:r.clientCredentialsUid,clientId:r.clientId,clientSecret:r.clientSecret})}async getOAuthClientCredentials(r){if(r.clientCredentialsUid)return(await this.restRequest("GET",`/v1/oauth/secrets/${encodeURIComponent(r.clientCredentialsUid)}`)).data;if(!r.templateId)throw new Error("No valid credentials source provided");return(await this.restRequest("GET",`/v1/oauth/templates/${encodeURIComponent(r.templateId)}/credentials`)).data}async getCliOAuthSecret(){return(await this.restRequest("GET","/v1/oauth/cli-secret")).data}async triggerSystemDocumentationScrapeJob(r,m){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(r)}/documentation/scrape`,m)).data}async fetchOpenApiSpec(r,m){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(r)}/documentation/openapi`,{url:m})).data}async createSystemFileUploadUrls(r,m){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(r)}/file-references`,{files:m.map(p=>({fileName:p.fileName,metadata:{contentType:p.contentType,contentLength:p.contentLength}}))})).data.files}async uploadSystemFileReferences(r,m){let p=await this.createSystemFileUploadUrls(r,m.map(c=>({fileName:c.fileName,contentType:c.contentType,contentLength:c.contentLength})));return await Promise.all(p.map(async(c,y)=>{let b=await fetch(c.uploadUrl,{method:"PUT",body:m[y].content,headers:m[y].contentType?{"Content-Type":m[y].contentType}:void 0});if(!b.ok)throw new Error(`Upload failed for ${m[y].fileName}: ${b.status} ${b.statusText}`);this.processFileReference(c.id).catch(()=>{})})),p.map((c,y)=>({id:c.id,fileName:m[y].fileName}))}async processFileReference(r){return this.restRequest("POST",`/v1/file-references/${encodeURIComponent(r)}/process`)}async listSystemFileReferences(r){return(await this.restRequest("GET",`/v1/systems/${encodeURIComponent(r)}/file-references`)).data}async deleteSystemFileReference(r,m){await this.restRequest("DELETE",`/v1/systems/${encodeURIComponent(r)}/file-references/${encodeURIComponent(m)}`)}async getFileReferenceContent(r){return(await this.restRequest("GET",`/v1/file-references/${encodeURIComponent(r)}?includeContent=true`)).data.content??null}async getTenantInfo(){return this.restRequest("GET","/v1/tenant-info")}async setTenantInfo(r){return this.restRequest("PUT","/v1/tenant-info",r)}async generatePortalLink(){try{return{success:!0,portalUrl:(await this.restRequest("POST","/v1/authenticate",{})).data.portalUrl}}catch(r){return{success:!1,error:r.message}}}};e.SuperglueClient=o}),ep=Vo&&Vo.__createBinding||(Object.create?(function(e,l,i,g){g===void 0&&(g=i);var n=Object.getOwnPropertyDescriptor(l,i);(!n||("get"in n?!l.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return l[i]}}),Object.defineProperty(e,g,n)}):(function(e,l,i,g){g===void 0&&(g=i),e[g]=l[i]})),ya=Vo&&Vo.__exportStar||function(e,l){for(var i in e)i!=="default"&&!Object.prototype.hasOwnProperty.call(l,i)&&ep(l,e,i)};Object.defineProperty(Vo,"__esModule",{value:!0});Vo.SSELogSubscriptionManager=Vo.SuperglueClient=void 0;ya(Gu(),Vo);ya(pn(),Vo);ya(Wu(),Vo);ya($u(),Vo);ya(Zu(),Vo);ya(Xu(),Vo);ya(Ku(),Vo);ya(ct(),Vo);ya($n(),Vo);ya(Zg(),Vo);ya(Xg(),Vo);ya(hn(),Vo);var op=Kd();Object.defineProperty(Vo,"SuperglueClient",{enumerable:!0,get:function(){return op.SuperglueClient}});var ap=Zn();Object.defineProperty(Vo,"SSELogSubscriptionManager",{enumerable:!0,get:function(){return ap.SSELogSubscriptionManager}});});var dr=require("commander");var ga=vo(require("fs")),ec=vo(require("os")),Ra=vo(require("path")),Xs=new Set(["runner","builder","admin"]),Ks={output:{mode:"stdout",directory:".superglue/output"},preset:"admin"};function it(e){let l=Ra.join(process.cwd(),".superglue"),i=ec.homedir();if(!i)return l;let g=Ra.join(i,".superglue");return e===!0?l:e===!1?g:ga.existsSync(Ra.join(l,"config.json"))?l:g}function Ru(e){return Ra.join(it(e),"config.json")}function Uu(){let e=Ru();if(!ga.existsSync(e))return{};try{return JSON.parse(ga.readFileSync(e,"utf-8"))}catch{return{}}}function qr(e){let l=Uu(),i=e.apiKey||process.env.SUPERGLUE_API_KEY||l.apiKey||"",g=e.endpoint||process.env.SUPERGLUE_API_ENDPOINT||l.endpoint||"https://api.superglue.cloud",n=process.env.SUPERGLUE_WEB_ENDPOINT||l.webEndpoint||g.replace(/:3002\b/,":3001").replace(/api\.superglue/,"app.superglue"),t=process.env.SUPERGLUE_CLI_PRESET,o=t&&Xs.has(t)?t:l.preset&&Xs.has(l.preset)?l.preset:"admin";return{...Ks,...l,apiKey:i,endpoint:g,webEndpoint:n,preset:o,output:{...Ks.output,...l.output}}}function oc(e,l){let i=it(l);ga.existsSync(i)||ga.mkdirSync(i,{recursive:!0}),ga.writeFileSync(Ra.join(i,"config.json"),JSON.stringify(e,null,2)+`
1306
- `,{mode:384})}function ac(e,l){let i=Ra.join(it(l),"drafts");if(ga.existsSync(i)||ga.mkdirSync(i,{recursive:!0}),e.output.mode==="stdout+file"){let g=Ra.resolve(e.output.directory);ga.existsSync(g)||ga.mkdirSync(g,{recursive:!0})}}var Um=vo(Da());var cs=vo(require("readline"));var qm=require("child_process"),jm=require("util");var xm={name:"@superglue/cli",version:"1.1.24",bin:{sg:"./dist/cli.js"},files:[".claude-plugin/","dist/","skills/","LICENSE"],dependencies:{commander:"15.0.0-0","fast-json-patch":"3.1.1"},devDependencies:{"@superglue/shared":"file:./_shared","@types/node":"25.5.0",tsup:"8.5.1",typescript:"5.8.3"},scripts:{build:"tsup && (cp -r skills dist/ 2>/dev/null || true)",dev:"tsup --watch","type-check":"tsc --noEmit",prepublishOnly:"npm run build"},publishConfig:{access:"public"}};var ip=(0,jm.promisify)(qm.exec),ca=xm.version;function zm(e){let l=e.match(/^(\d+)(?:-(.+))?$/);return l?{numeric:parseInt(l[1],10),prerelease:l[2]||null}:{numeric:0,prerelease:e}}function di(e,l){let i=e.split("."),g=l.split("."),n=Math.max(i.length,g.length);for(let t=0;t<n;t++){let o=zm(i[t]||"0"),r=zm(g[t]||"0");if(o.numeric<r.numeric)return-1;if(o.numeric>r.numeric||o.prerelease===null&&r.prerelease!==null)return 1;if(o.prerelease!==null&&r.prerelease===null)return-1;if(o.prerelease!==null&&r.prerelease!==null){if(o.prerelease<r.prerelease)return-1;if(o.prerelease>r.prerelease)return 1}}return 0}async function Em(e){try{let l=`${e.replace(/\/$/,"")}/v1/health`,i=await fetch(l,{signal:AbortSignal.timeout(3e3)});if(!i.ok)return;let g=await i.json();if(!g.minCliVersion)return;di(ca,g.minCliVersion)<0&&(console.error(""),console.error(`${X.yellow}${X.bold}\u26A0 CLI version ${ca} is outdated.${X.reset}`),console.error(`${X.yellow} Server requires at least v${g.minCliVersion}. Run: ${X.bold}sg update${X.reset}`),console.error(""))}catch{}}async function or(){try{let e=await fetch("https://registry.npmjs.org/@superglue/cli/latest",{signal:AbortSignal.timeout(5e3)});return e.ok&&(await e.json()).version||null}catch{return null}}var er=null;function Im(){er=or()}async function Cm(){if(er){try{let e=new Promise(i=>{setTimeout(()=>i(null),2e3).unref()}),l=await Promise.race([er,e]);l&&di(ca,l)<0&&(console.error(""),console.error(`${X.cyan}${X.bold} Update available: ${ca} \u2192 ${l}${X.reset}`),console.error(`${X.cyan} Run ${X.bold}sg update${X.reset}${X.cyan} to upgrade${X.reset}`),console.error(""))}catch{}er=null}}async function Qm(){let e=await or();if(!e)return{success:!1,message:"Could not fetch latest version from npm"};if(di(ca,e)>=0)return{success:!0,message:`Already on latest version (${ca})`};try{return await ip("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${ca} to ${e}`}}catch(l){return{success:!1,message:`Update failed: ${l.message}. Try manually: npm install -g @superglue/cli@latest`}}}var Qo=()=>process.argv.includes("--table")&&process.stdout.isTTY,Sa=()=>process.argv.includes("--full"),X={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m"};function Bm(e,l){let i=l||e;return`\x1B]8;;${e}\x07${X.underline}${X.cyan}${i}${X.reset}\x1B]8;;\x07`}function Dm(){if(!Qo())return;let e=X.reset,l=X.dim,i="\x1B[47;30m",g=[" #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@- "," =@@@- @@@@ "," @@@ @@% "," -@@ @@@@= @@@ @@@ @@@@@#@ @@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@@@@* %@@ "," @@ @@@ *@ @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @% @@@ @@@ @@@ @@* @@# "," #@@ @@@# @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @@@ @@@ @@@ @@* @@ "," @@- @@@@= @@@ @@@ @@@@@@@ @@@@@@ @@@@@@@ @@@ @@% @@@ @@@ @@@ @@@@@. @@."," #@% .@@@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* @@ "," @@ @ @@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* *@@ "," -@@ @@@@= @@@@@@ @@@ @@@@@@@ @@@ -@@ @@@@@@ @@@@@@% @@@@@@. @@@@@@* #@@ "," :@@* @@@ "," %@@@ =@@@. "," :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% "];console.log(""),g.forEach(n=>{let t=n.search(/\S/),o=n.length-[...n].reverse().join("").search(/\S/)-1;if(t===-1)return console.log(" "+n);let r=n.slice(0,t),m=n.slice(t,o+1).split("").map(c=>c===" "?" ":"\u2588").join(""),p=n.slice(o+1);console.log(` ${r}${i}${m}${e}${p}`)}),console.log(` ${l} CLI v${ca}${e}`),console.log("")}function Zo(e){if(!Qo())return{stop:()=>{},update:()=>{},log:()=>{}};let l=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],i=0,g=e,n=()=>process.stdout.write("\r\x1B[2K"),t=()=>{process.stdout.write(`\r ${X.cyan}${l[i++%l.length]}${X.reset} ${g}`)},o=setInterval(t,80);return{update:r=>{g=r},log:r=>{n(),console.log(` ${X.dim}\u2502${X.reset} ${r}`),t()},stop:r=>{clearInterval(o),n(),r&&console.log(` ${r}`)}}}function Io(e){Qo()?ar(e):console.log(JSON.stringify(e,null,2))}function Go(e,l){Qo()?(console.log(` ${X.green}\u2713${X.reset} ${e}`),l&&ar(l,4)):console.log(JSON.stringify({success:!0,message:e,...l&&typeof l=="object"?l:{data:l}}))}function Le(e,l){Qo()?(console.error(` ${X.red}\u2717${X.reset} ${e}`),l&&ar(l,4)):console.error(JSON.stringify({success:!1,error:e,details:l}))}function Sm(e){Qo()&&console.log(` ${X.yellow}\u26A0${X.reset} ${e}`)}function da(e){Qo()&&console.log(` ${X.dim}${e}${X.reset}`)}function Fa(e){Qo()&&(console.log(`
1306
+ `,{mode:384})}function ac(e,l){let i=Ra.join(it(l),"drafts");if(ga.existsSync(i)||ga.mkdirSync(i,{recursive:!0}),e.output.mode==="stdout+file"){let g=Ra.resolve(e.output.directory);ga.existsSync(g)||ga.mkdirSync(g,{recursive:!0})}}var Um=vo(Da());var cs=vo(require("readline"));var qm=require("child_process"),jm=require("util");var xm={name:"@superglue/cli",version:"1.1.25",bin:{sg:"./dist/cli.js"},files:[".claude-plugin/","dist/","skills/","LICENSE"],dependencies:{commander:"15.0.0-0","fast-json-patch":"3.1.1"},devDependencies:{"@superglue/shared":"file:./_shared","@types/node":"25.5.0",tsup:"8.5.1",typescript:"5.8.3"},scripts:{build:"tsup && (cp -r skills dist/ 2>/dev/null || true)",dev:"tsup --watch","type-check":"tsc --noEmit",prepublishOnly:"npm run build"},publishConfig:{access:"public"}};var ip=(0,jm.promisify)(qm.exec),ca=xm.version;function zm(e){let l=e.match(/^(\d+)(?:-(.+))?$/);return l?{numeric:parseInt(l[1],10),prerelease:l[2]||null}:{numeric:0,prerelease:e}}function di(e,l){let i=e.split("."),g=l.split("."),n=Math.max(i.length,g.length);for(let t=0;t<n;t++){let o=zm(i[t]||"0"),r=zm(g[t]||"0");if(o.numeric<r.numeric)return-1;if(o.numeric>r.numeric||o.prerelease===null&&r.prerelease!==null)return 1;if(o.prerelease!==null&&r.prerelease===null)return-1;if(o.prerelease!==null&&r.prerelease!==null){if(o.prerelease<r.prerelease)return-1;if(o.prerelease>r.prerelease)return 1}}return 0}async function Em(e){try{let l=`${e.replace(/\/$/,"")}/v1/health`,i=await fetch(l,{signal:AbortSignal.timeout(3e3)});if(!i.ok)return;let g=await i.json();if(!g.minCliVersion)return;di(ca,g.minCliVersion)<0&&(console.error(""),console.error(`${X.yellow}${X.bold}\u26A0 CLI version ${ca} is outdated.${X.reset}`),console.error(`${X.yellow} Server requires at least v${g.minCliVersion}. Run: ${X.bold}sg update${X.reset}`),console.error(""))}catch{}}async function or(){try{let e=await fetch("https://registry.npmjs.org/@superglue/cli/latest",{signal:AbortSignal.timeout(5e3)});return e.ok&&(await e.json()).version||null}catch{return null}}var er=null;function Im(){er=or()}async function Cm(){if(er){try{let e=new Promise(i=>{setTimeout(()=>i(null),2e3).unref()}),l=await Promise.race([er,e]);l&&di(ca,l)<0&&(console.error(""),console.error(`${X.cyan}${X.bold} Update available: ${ca} \u2192 ${l}${X.reset}`),console.error(`${X.cyan} Run ${X.bold}sg update${X.reset}${X.cyan} to upgrade${X.reset}`),console.error(""))}catch{}er=null}}async function Qm(){let e=await or();if(!e)return{success:!1,message:"Could not fetch latest version from npm"};if(di(ca,e)>=0)return{success:!0,message:`Already on latest version (${ca})`};try{return await ip("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${ca} to ${e}`}}catch(l){return{success:!1,message:`Update failed: ${l.message}. Try manually: npm install -g @superglue/cli@latest`}}}var Qo=()=>process.argv.includes("--table")&&process.stdout.isTTY,Sa=()=>process.argv.includes("--full"),X={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m"};function Bm(e,l){let i=l||e;return`\x1B]8;;${e}\x07${X.underline}${X.cyan}${i}${X.reset}\x1B]8;;\x07`}function Dm(){if(!Qo())return;let e=X.reset,l=X.dim,i="\x1B[47;30m",g=[" #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@- "," =@@@- @@@@ "," @@@ @@% "," -@@ @@@@= @@@ @@@ @@@@@#@ @@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@@@@* %@@ "," @@ @@@ *@ @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @% @@@ @@@ @@@ @@* @@# "," #@@ @@@# @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @@@ @@@ @@@ @@* @@ "," @@- @@@@= @@@ @@@ @@@@@@@ @@@@@@ @@@@@@@ @@@ @@% @@@ @@@ @@@ @@@@@. @@."," #@% .@@@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* @@ "," @@ @ @@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* *@@ "," -@@ @@@@= @@@@@@ @@@ @@@@@@@ @@@ -@@ @@@@@@ @@@@@@% @@@@@@. @@@@@@* #@@ "," :@@* @@@ "," %@@@ =@@@. "," :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% "];console.log(""),g.forEach(n=>{let t=n.search(/\S/),o=n.length-[...n].reverse().join("").search(/\S/)-1;if(t===-1)return console.log(" "+n);let r=n.slice(0,t),m=n.slice(t,o+1).split("").map(c=>c===" "?" ":"\u2588").join(""),p=n.slice(o+1);console.log(` ${r}${i}${m}${e}${p}`)}),console.log(` ${l} CLI v${ca}${e}`),console.log("")}function Zo(e){if(!Qo())return{stop:()=>{},update:()=>{},log:()=>{}};let l=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],i=0,g=e,n=()=>process.stdout.write("\r\x1B[2K"),t=()=>{process.stdout.write(`\r ${X.cyan}${l[i++%l.length]}${X.reset} ${g}`)},o=setInterval(t,80);return{update:r=>{g=r},log:r=>{n(),console.log(` ${X.dim}\u2502${X.reset} ${r}`),t()},stop:r=>{clearInterval(o),n(),r&&console.log(` ${r}`)}}}function Io(e){Qo()?ar(e):console.log(JSON.stringify(e,null,2))}function Go(e,l){Qo()?(console.log(` ${X.green}\u2713${X.reset} ${e}`),l&&ar(l,4)):console.log(JSON.stringify({success:!0,message:e,...l&&typeof l=="object"?l:{data:l}}))}function Le(e,l){Qo()?(console.error(` ${X.red}\u2717${X.reset} ${e}`),l&&ar(l,4)):console.error(JSON.stringify({success:!1,error:e,details:l}))}function Sm(e){Qo()&&console.log(` ${X.yellow}\u26A0${X.reset} ${e}`)}function da(e){Qo()&&console.log(` ${X.dim}${e}${X.reset}`)}function Fa(e){Qo()&&(console.log(`
1307
1307
  ${X.bold}${X.cyan}${e}${X.reset}`),console.log(` ${X.dim}${"\u2500".repeat(e.length)}${X.reset}`))}function Ut(e,l,i){if(!Qo()){console.log(JSON.stringify({success:!0,total:i?.total??e.length,items:e}));return}if(e.length===0){console.log(`
1308
1308
  ${X.dim}0 results${X.reset}
1309
1309
  `);return}let g=l||Object.keys(e[0]),n=Sa()?1/0:60,t=g.map(c=>Math.min(n,Math.max(c.length,...e.map(y=>String(y[c]??"").replace(/[\n\r]+/g," ").trim().length))));console.log("");let o=g.map((c,y)=>`${X.bold}${X.cyan}${c.toUpperCase().padEnd(t[y])}${X.reset}`).join(" ");console.log(` ${o}`);let r=t.map(c=>`${X.dim}${"\u2500".repeat(c)}${X.reset}`).join(`${X.dim}\u2500\u2500${X.reset}`);console.log(` ${r}`);for(let c of e){let y=g.map((b,f)=>{let A=String(c[b]??"").replace(/[\n\r]+/g," ").trim();if(A.length>n){let a=`\u2026 (${A.length})`;A=A.slice(0,Math.max(0,n-a.length))+`${X.dim}${a}${X.reset}`}return b==="status"?`${{success:X.green,running:X.yellow,failed:X.red,aborted:X.red,error:X.red,pending:X.dim}[A.toLowerCase()]||""}${A.padEnd(t[f])}${X.reset}`:A.padEnd(t[f])}).join(" ");console.log(` ${y}`)}let m=i?.total??e.length,p=m===e.length?`${e.length} result${e.length===1?"":"s"}`:`${e.length} of ${m} result${m===1?"":"s"}`;console.log(`
@@ -1400,7 +1400,7 @@ ${X.bold}Examples:${X.reset}
1400
1400
 
1401
1401
  ${X.bold}Supported Protocols:${X.reset}
1402
1402
  HTTP/HTTPS, PostgreSQL, MSSQL/SQL Server, Redis, SFTP/FTP/FTPS, SMB
1403
- `).action(async i=>{i.url||(Le("Missing required option --url. Run 'sg skill <protocol>' (e.g. 'sg skill odbc') for URL formats and usage."),process.exit(1));let{client:g}=l(),n=i.method||"GET",t=await Ft(i.file,g),o=i.body;if(o&&Object.keys(t).length>0)try{let p=JSON.parse(o),c=y=>{if(typeof y=="string"&&y.startsWith("file::")){let b=y.slice(6);if(b in t)return t[b];Le(`Unresolved file reference: file::${b}. Available: ${Object.keys(t).join(", ")||"(none)"}`),process.exit(1)}if(Array.isArray(y))return y.map(c);if(y&&typeof y=="object"){let b={};for(let[f,A]of Object.entries(y))b[f]=c(A);return b}return y};p=c(p),o=JSON.stringify(p)}catch(p){if(p.message?.startsWith("Unresolved file reference"))throw p}let r;if(i.headers)try{r=JSON.parse(i.headers)}catch(p){Le(`Invalid --headers JSON: ${p.message}`),process.exit(1)}let m={id:`call_system_${Date.now()}`,failureBehavior:"continue",config:{url:i.url,method:n,headers:r,body:o,systemId:i.systemId}};try{let p=i.env==="dev"||i.env==="prod"?i.env:void 0,c=await g.executeStep({step:m,payload:{},mode:p}),y=c.data?.data!==void 0?c.data.data:c.data;Io({success:c.success,protocol:(0,nl.inferProtocolFromUrl)(i.url),data:y,...c.error?{error:c.error}:{}}),c.success||process.exit(1)}catch(p){Le(p.message),process.exit(1)}})}function ll(e,l){e.command("search-docs").description("Search system documentation by keywords").requiredOption("--system-id <id>","System ID").requiredOption("-k, --keywords <keywords>","Search keywords").action(async i=>{let{client:g}=l();try{let n=await g.searchSystemDocumentation(i.systemId,i.keywords);if(!n||n.trim().length===0)Qo()?da("No documentation found for this system"):Io({success:!1,message:"No documentation found for this system"});else if(n.startsWith("No relevant sections found"))Qo()?da(n):Io({success:!0,total:0,message:n,keywords:i.keywords});else if(Qo()){Fa(`Documentation: ${i.systemId}`),console.log(` ${X.dim}Keywords: ${i.keywords}${X.reset}
1403
+ `).action(async i=>{i.url||(Le("Missing required option --url. Run 'sg skill <protocol>' (e.g. 'sg skill odbc') for URL formats and usage."),process.exit(1));let{client:g}=l(),n=i.method||"GET",t=await Ft(i.file,g),o=i.body;if(o&&Object.keys(t).length>0)try{let p=JSON.parse(o),c=y=>{if(typeof y=="string"&&y.startsWith("file::")){let b=y.slice(6);if(b in t)return t[b];Le(`Unresolved file reference: file::${b}. Available: ${Object.keys(t).join(", ")||"(none)"}`),process.exit(1)}if(Array.isArray(y))return y.map(c);if(y&&typeof y=="object"){let b={};for(let[f,A]of Object.entries(y))b[f]=c(A);return b}return y};p=c(p),o=JSON.stringify(p)}catch(p){if(p.message?.startsWith("Unresolved file reference"))throw p}let r;if(i.headers)try{r=JSON.parse(i.headers)}catch(p){Le(`Invalid --headers JSON: ${p.message}`),process.exit(1)}let m={id:`call_system_${Date.now()}`,failureBehavior:"continue",config:{url:i.url,method:n,headers:r,body:o,systemId:i.systemId}};try{let p=i.env==="dev"||i.env==="prod"?i.env:void 0,c=await g.executeStep({step:m,payload:{},mode:p}),y=c.data;Io({success:c.success,protocol:(0,nl.inferProtocolFromUrl)(i.url),data:y,...c.error?{error:c.error}:{}}),c.success||process.exit(1)}catch(p){Le(p.message),process.exit(1)}})}function ll(e,l){e.command("search-docs").description("Search system documentation by keywords").requiredOption("--system-id <id>","System ID").requiredOption("-k, --keywords <keywords>","Search keywords").action(async i=>{let{client:g}=l();try{let n=await g.searchSystemDocumentation(i.systemId,i.keywords);if(!n||n.trim().length===0)Qo()?da("No documentation found for this system"):Io({success:!1,message:"No documentation found for this system"});else if(n.startsWith("No relevant sections found"))Qo()?da(n):Io({success:!0,total:0,message:n,keywords:i.keywords});else if(Qo()){Fa(`Documentation: ${i.systemId}`),console.log(` ${X.dim}Keywords: ${i.keywords}${X.reset}
1404
1404
  `);let t=n.split(`
1405
1405
  `);for(let o of t)o.startsWith("# ")||o.startsWith("## ")||o.startsWith("### ")?console.log(` ${X.bold}${X.cyan}${o}${X.reset}`):o.startsWith("```")?console.log(` ${X.dim}${o}${X.reset}`):o.startsWith("- ")||o.startsWith("* ")?console.log(` ${X.yellow}\u2022${X.reset} ${o.slice(2)}`):console.log(` ${o}`);console.log("")}else Io({success:!0,content:n,keywords:i.keywords})}catch(n){Le(n.message),process.exit(1)}})}var ul=require("child_process"),gl=vo(require("crypto")),ja=vo(Da());function np(e){let l=process.platform;(0,ul.spawn)(l==="darwin"?"open":l==="win32"?"cmd":"xdg-open",l==="win32"?["/c","start","",e]:[e],{detached:!0,stdio:"ignore"}).unref()}async function mp(e,l,i,g=3e5,n=2e3){let t=Date.now();for(;Date.now()-t<g;){await new Promise(o=>setTimeout(o,n));try{let r=(await e.getSystem(l))?.credentials?.access_token;if(r&&r!==i)return!0}catch{}}return!1}function dl(e,l){e.command("oauth").description("Authenticate a system via OAuth").requiredOption("--system-id <id>","System ID").requiredOption("--scopes <scopes>","Space-separated OAuth scopes").option("--auth-url <url>","OAuth authorization URL").option("--token-url <url>","OAuth token URL").option("--grant-type <type>","Grant type","authorization_code").action(async i=>{let{config:g,client:n}=l(),t;try{t=await n.getSystem(i.systemId),t||(Le(`System not found: ${i.systemId}`),process.exit(1))}catch(N){Le(N.message),process.exit(1)}let o=(0,ja.findTemplateForSystem)(t),r=o?.template?.oauth,m=t.credentials?.client_id??r?.client_id,p=i.authUrl??t.credentials?.auth_url??r?.authUrl,c=i.tokenUrl??t.credentials?.token_url??r?.tokenUrl,y=i.grantType??t.credentials?.grant_type??"authorization_code";if(m||(Le(`Missing client_id. Add it to the system credentials:
1406
1406
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superglue/cli",
3
- "version": "1.1.24",
3
+ "version": "1.1.25",
4
4
  "bin": {
5
5
  "sg": "./dist/cli.js"
6
6
  },