@superglue/cli 1.1.155 → 1.1.156

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.155",
4
+ "version": "1.1.156",
5
5
  "author": {
6
6
  "name": "superglue",
7
7
  "email": "hello@superglue.cloud"
package/dist/cli.js CHANGED
@@ -1744,7 +1744,7 @@ ${o}`;break;case"retry":wz(o)&&(r[i]=o);break;case"id":Qz(o)&&(r[i]=o);break;cas
1744
1744
  `);t.stack=r?`${r}
1745
1745
  ${o}`:i.stack}Y.exports.fetch=function(e,r=void 0){return eTe(e,r).catch(n=>{throw xz?$z(n,xz):n&&typeof n=="object"&&Error.captureStackTrace(n,Y.exports.fetch),n})};Y.exports.Headers=ec().Headers;Y.exports.Response=SA().Response;Y.exports.Request=Nu().Request;Y.exports.FormData=kg().FormData;var{setGlobalOrigin:tTe,getGlobalOrigin:rTe}=OS();Y.exports.setGlobalOrigin=tTe;Y.exports.getGlobalOrigin=rTe;var{CacheStorage:nTe}=SH(),{kConstruct:iTe}=$e();Y.exports.caches=new nTe(iTe);var{deleteCookie:oTe,getCookies:sTe,getSetCookies:aTe,setCookie:cTe,parseCookie:uTe}=UH();Y.exports.deleteCookie=oTe;Y.exports.getCookies=sTe;Y.exports.getSetCookies=aTe;Y.exports.setCookie=cTe;Y.exports.parseCookie=uTe;var{parseMIMEType:lTe,serializeAMimeType:dTe}=pn();Y.exports.parseMIMEType=lTe;Y.exports.serializeAMimeType=dTe;var{CloseEvent:ATe,ErrorEvent:pTe,MessageEvent:fTe}=Km(),{WebSocket:hTe,ping:gTe}=fz();Y.exports.WebSocket=hTe;Y.exports.CloseEvent=ATe;Y.exports.ErrorEvent=pTe;Y.exports.MessageEvent=fTe;Y.exports.ping=gTe;Y.exports.WebSocketStream=bz().WebSocketStream;Y.exports.WebSocketError=lv().WebSocketError;Y.exports.request=UA(qu.request);Y.exports.stream=UA(qu.stream);Y.exports.pipeline=UA(qu.pipeline);Y.exports.connect=UA(qu.connect);Y.exports.upgrade=UA(qu.upgrade);Y.exports.MockClient=jDe;Y.exports.MockCallHistory=qDe;Y.exports.MockCallHistoryLog=HDe;Y.exports.MockPool=GDe;Y.exports.MockAgent=zDe;Y.exports.SnapshotAgent=YDe;Y.exports.mockErrors=VDe;var{EventSource:mTe}=Mz();Y.exports.EventSource=mTe;function yTe(){globalThis.fetch=Y.exports.fetch,globalThis.Headers=Y.exports.Headers,globalThis.Response=Y.exports.Response,globalThis.Request=Y.exports.Request,globalThis.FormData=Y.exports.FormData,globalThis.WebSocket=Y.exports.WebSocket,globalThis.CloseEvent=Y.exports.CloseEvent,globalThis.ErrorEvent=Y.exports.ErrorEvent,globalThis.MessageEvent=Y.exports.MessageEvent,globalThis.EventSource=Y.exports.EventSource}Y.exports.install=yTe});var Hz=g(zu=>{"use strict";Object.defineProperty(zu,"__esModule",{value:!0});zu.SuperglueClient=zu.SuperglueHttpError=void 0;var Hu=Br(),Yo=tb(),ETe=Tb(),ITe=tL(),CTe=Jn(),Vo=kc(),bTe=Gl(),xA=14400*1e3,MA;if(typeof globalThis.process<"u"&&globalThis.process.versions?.node)try{let{Agent:t}=jz();MA=new t({headersTimeout:xA,bodyTimeout:xA})}catch{}function qz(t){if(t?.aborted)throw t.reason??new DOMException("Aborted","AbortError")}var Ay=class extends Error{constructor(e,r,n,i){super(e),this.status=r,this.code=n,this.details=i,this.name="SuperglueHttpError"}};zu.SuperglueHttpError=Ay;var gv=class{constructor({apiKey:e,apiEndpoint:r,onInfrastructureError:n,refreshToken:i,sseTokenProvider:o,tokenProvider:s}){if(!e&&!s)throw new Error("SuperglueClient requires either apiKey or tokenProvider");this.tokenProvider=s??(async()=>e),this.apiEndpoint=r??"https://api.superglue.cloud",this.sseManager=new ETe.SSELogSubscriptionManager(this.apiEndpoint,o??this.tokenProvider,i),this.onInfrastructureError=n,this.refreshToken=i}async getApiKey(){return this.tokenProvider()}async fetchWithAuthRetry(e,r){let n=await this.getApiKey(),i=await e(n);if(i.status!==401||!this.refreshToken)return i;qz(r);let o=await this.refreshToken();return qz(r),!o||o===n?i:(i.body?.cancel(),e(o))}isInfrastructureError(e){return(0,CTe.isAbortError)(e)?!1:!!(e instanceof TypeError&&e.message.toLowerCase().includes("fetch")||e instanceof Error&&e.name==="TimeoutError")}async restRequest(e,r,n,i,o){let a=await(await this.restResponse({method:e,path:r,body:n,extraHeaders:i,requestInit:o})).text();if(a)return JSON.parse(a)}async restResponse({method:e,path:r,body:n,extraHeaders:i,requestInit:o}){let s=`${this.apiEndpoint.replace(/\/$/,"")}${r}`,a=n!=null,c=typeof FormData<"u"&&n instanceof FormData,u=d=>{let A={Authorization:`Bearer ${d}`,...i};return a&&!c&&e!=="GET"&&(A["Content-Type"]="application/json"),fetch(s,{...o,method:e,headers:A,body:a?c?n:JSON.stringify(n):void 0,signal:o?.signal??AbortSignal.timeout(xA),...MA?{dispatcher:MA}:{}})},l;try{l=await this.fetchWithAuthRetry(u,o?.signal)}catch(d){throw this.isInfrastructureError(d)&&this.onInfrastructureError?.(),d}if(!l.ok)throw await this.buildHttpError(l);return l}async uploadFiles(e,r){if(typeof r?.process!="boolean")throw new Error("process must be a boolean");if(e.length===0)return[];let n=e.map(l=>({...l,contentLength:l.contentLength??this.getUploadContentLength(l.content)})),o=(await this.restRequest("POST","/v1/files/uploads",{process:r.process,files:n.map(({fileName:l,contentType:d,contentLength:A})=>({fileName:l,contentLength:A,...d?{contentType:d}:{}}))})).data.files;if(o.length!==n.length)throw await Promise.all(o.map(l=>this.deleteFileUpload(l.id).catch(()=>{}))),new Error("Upload response did not match the selected files");let s=await Promise.allSettled(o.map(async(l,d)=>{let A=n[d],p=await fetch(l.uploadUrl,{method:"PUT",body:A.content,headers:A.contentType?{"Content-Type":A.contentType}:void 0,signal:AbortSignal.timeout(Math.min(xA,l.expiresIn*1e3))});if(!p.ok)throw new Error(`Upload failed for ${A.fileName}: ${p.status} ${p.statusText}`);return l.id})),a=s.flatMap(l=>l.status==="fulfilled"?[l.value]:[]),c=new Map;if(a.length>0)try{let l=await this.restRequest("POST","/v1/files/uploads/complete",{fileIds:a});c=new Map(l.data.files.map(d=>[d.id,d]))}catch(l){c=new Map(a.map(d=>[d,{id:d,fileName:n[o.findIndex(A=>A.id===d)]?.fileName||d,contentLength:n[o.findIndex(A=>A.id===d)]?.contentLength||0,status:"failed",error:l instanceof Error?l.message:String(l)}]))}let u=o.map((l,d)=>{let A=s[d],p=n[d];return A.status==="rejected"?{id:l.id,fileName:p.fileName,contentLength:p.contentLength,status:"failed",error:A.reason instanceof Error?A.reason.message:String(A.reason)}:c.get(l.id)||{id:l.id,fileName:p.fileName,contentLength:p.contentLength,status:"failed",error:"Upload completion returned no result"}});return await Promise.all(u.filter(l=>l.status==="failed").map(l=>this.deleteFileUpload(l.id).catch(()=>{}))),u}async deleteFileUpload(e){await this.restRequest("DELETE",`/v1/files/uploads/${encodeURIComponent(e)}`)}getUploadContentLength(e){return typeof e=="string"?new TextEncoder().encode(e).byteLength:e instanceof Uint8Array?e.byteLength:e.size}async buildHttpError(e){e.status>=500&&this.onInfrastructureError?.();let r=await e.text(),n=`HTTP ${e.status}: ${r}`,i,o;try{let s=JSON.parse(r);s&&typeof s=="object"&&!Array.isArray(s)&&(o=s),typeof s?.code=="string"&&(i=s.code);let a=s.error;typeof a=="string"?n=a:a&&typeof a=="object"&&(n=a.message||JSON.stringify(a))}catch{}return new Ay(n,e.status,i,o)}async streamRequest(e,r,n){let i=e.includes("?")?"&":"?",o=`${this.apiEndpoint.replace(/\/$/,"")}${e}${i}stream=true`,s=u=>fetch(o,{method:"POST",headers:{Authorization:`Bearer ${u}`,Accept:"text/event-stream","Content-Type":"application/json"},body:JSON.stringify(r),signal:n??AbortSignal.timeout(xA),...MA?{dispatcher:MA}:{}}),a;try{a=await this.fetchWithAuthRetry(s,n)}catch(u){throw this.isInfrastructureError(u)&&this.onInfrastructureError?.(),u}if(!a.ok)throw await this.buildHttpError(a);if(!(a.headers.get("content-type")||"").includes("text/event-stream")){let u=await a.text();return u?JSON.parse(u):void 0}try{return await(0,ITe.consumeEventStreamResult)(a)}catch(u){throw this.isInfrastructureError(u)&&this.onInfrastructureError?.(),u}}async subscribeToLogsSSE(e={}){return this.sseManager.subscribeToLogs(e)}async disconnect(){await this.sseManager.disconnect()}async listMemoryNotes(e={}){let r=new URLSearchParams;e.scope&&r.set("scope",e.scope),e.query&&r.set("query",e.query);let n=r.toString();return(await this.restRequest("GET",`/v1/memory-notes${n?`?${n}`:""}`)).data}async createMemoryNote(e){return(await this.restRequest("POST","/v1/memory-notes",e)).data}async updateMemoryNote(e,r){return(await this.restRequest("PATCH",`/v1/memory-notes/${encodeURIComponent(e)}`,r)).data}async deleteMemoryNote(e){await this.restRequest("DELETE",`/v1/memory-notes/${encodeURIComponent(e)}`)}async clearMemoryNotes(e){return(await this.restRequest("DELETE",`/v1/memory-notes?scope=${e}`)).data.deleted}async getMe(){return this.restRequest("GET","/v1/me")}async completeOnboarding(){return this.restRequest("POST","/v1/me/onboarding/complete")}async runTool(e){let r=await this.restRequest("POST",`/v1/tools/${encodeURIComponent(e.toolId)}/run`,{inputs:e.payload,files:e.files,credentials:e.credentials,includeStepResultData:e.includeStepResultData,options:e.options,runId:e.runId,stateFixture:e.stateFixture},void 0,e.signal?{signal:e.signal}:void 0);return{success:r.status==="success",data:r.data,error:r.error,tool:r.tool,stepResults:r.stepResults?.map(n=>({...n}))||[],...r.fileArtifacts&&r.fileArtifacts.length>0?{fileArtifacts:r.fileArtifacts}:{},...r.metadata?.warnings?.length?{warnings:r.metadata.warnings}:{}}}async runToolConfig(e){let r=e.createRun?"/v1/tools/run?createRun=true":"/v1/tools/run",n=await this.restRequest("POST",r,{tool:e.tool,payload:e.payload,files:e.files,credentials:e.credentials,includeStepResultData:e.includeStepResultData,options:e.options,runId:e.runId,stateFixture:e.stateFixture,executionKind:e.executionKind,parentToolId:e.parentToolId,draftId:e.draftId},e.traceId?{"X-Trace-Id":e.traceId}:void 0,e.signal?{signal:e.signal}:void 0);return{success:n.status?n.status==="success":n.success??!1,data:n.data,error:n.error,tool:n.tool||e.tool,stepResults:n.stepResults?.map(o=>({...o}))||[],...n.fileArtifacts&&n.fileArtifacts.length>0?{fileArtifacts:n.fileArtifacts}:{},...n.metadata?.warnings?.length?{warnings:n.metadata.warnings}:{}}}async abortToolExecution(e){return{success:!0,runId:(await this.restRequest("POST",`/v1/runs/${encodeURIComponent(e)}/cancel`)).runId}}async executeStep({step:e,payload:r,files:n,previousResults:i,credentials:o,options:s,runId:a,systemIds:c,createRun:u,parentToolId:l,stepIndex:d,stepId:A,signal:p,stream:h}){let I={step:e,payload:r,files:n,previousResults:i,credentials:o,options:s,runId:a,systemIds:c,createRun:u,parentToolId:l,stepIndex:d,stepId:A};return h?this.streamRequest("/v1/tools/step/run",I,p):this.restRequest("POST","/v1/tools/step/run",I,void 0,p?{signal:p}:void 0)}async abortStep(e){return this.restRequest("POST","/v1/tools/step/abort",{runId:e})}async executeTransformOnly({outputTransform:e,outputSchema:r,inputSchema:n,payload:i,files:o,stepResults:s,options:a,runId:c,createRun:u,parentToolId:l,stepId:d,signal:A,stream:p}){let h={outputTransform:e,outputSchema:r,inputSchema:n,payload:i,files:o,stepResults:s,options:a,runId:c,createRun:u,parentToolId:l,stepId:d};return p?this.streamRequest("/v1/tools/transform/run",h,A):this.restRequest("POST","/v1/tools/transform/run",h,void 0,A?{signal:A}:void 0)}async createRun({toolId:e,toolConfig:r,toolResult:n,stepResults:i,toolPayload:o,status:s,error:a,startedAt:c,completedAt:u,executionKind:l,parentToolId:d,draftId:A}){return this.restRequest("POST","/v1/runs",{toolId:e,toolConfig:r,toolResult:n,stepResults:i,toolPayload:o,status:s,error:a,startedAt:(0,Vo.toUTCISOString)(c,"run.startedAt"),completedAt:(0,Vo.toUTCISOString)(u,"run.completedAt"),executionKind:l,parentToolId:d,draftId:A})}async checkRunLimit(){return(await this.restRequest("POST","/v1/runs/check-limit")).data}async extract({file:e,envelope:r}){if(!e)throw new Error("File must be provided for extract.");let n=new FormData;n.append("file",e);let i=r?"/v1/extract?envelope=true":"/v1/extract";return this.restRequest("POST",i,n)}mapOpenAPIRunToRun(e){let r={running:Hu.RunStatus.RUNNING,success:Hu.RunStatus.SUCCESS,failed:Hu.RunStatus.FAILED,aborted:Hu.RunStatus.ABORTED};return{runId:e.runId??e.id,toolId:e.toolId,tool:e.tool,systemIds:e.systemIds,status:r[e.status]??Hu.RunStatus.FAILED,toolPayload:e.toolPayload,data:e.data,toolResult:e.data,error:e.error,stepResults:e.stepResults,options:e.options,requestSource:e.requestSource,traceId:e.traceId,resultStorageUri:e.resultStorageUri,userId:e.userId,userEmail:e.userEmail,userName:e.userName,metadata:{...e.metadata,executionKind:e.metadata?.executionKind??Hu.RunExecutionKind.FULL},fileArtifacts:e.fileArtifacts}}mapOpenAPIScheduleToToolSchedule(e){return{...e,lastRunAt:e.lastRunAt?(0,Vo.requireUTCDate)(e.lastRunAt,"schedule.lastRunAt"):void 0,nextRunAt:(0,Vo.requireUTCDate)(e.nextRunAt,"schedule.nextRunAt"),createdAt:(0,Vo.requireUTCDate)(e.createdAt,"schedule.createdAt"),updatedAt:(0,Vo.requireUTCDate)(e.updatedAt,"schedule.updatedAt")}}async listRuns(e={}){let r=(0,Yo.createSearchListQueryParams)(e);e.toolId!==void 0&&r.set("toolId",e.toolId),e.searchUserIds?.length&&r.set("searchUserIds",e.searchUserIds.join(",")),e.includeTotal!==void 0&&r.set("includeTotal",String(e.includeTotal)),e.startedAfter!==void 0&&r.set("startedAfter",e.startedAfter instanceof Date?(0,Vo.toUTCISOString)(e.startedAfter,"run.startedAfter"):e.startedAfter),e.statuses!==void 0?r.set("status",e.statuses.join(",")):e.status!==void 0&&r.set("status",e.status),e.requestSources!==void 0&&r.set("requestSources",e.requestSources.join(",")),e.executionKinds!==void 0&&r.set("executionKinds",e.executionKinds.join(",")),e.userId!==void 0&&r.set("userId",e.userId),e.systemId!==void 0&&r.set("systemId",e.systemId),e.systemIds!==void 0&&r.set("systemIds",e.systemIds.join(","));let n=r.size>0?`?${r.toString()}`:"",i=await this.restRequest("GET",`/v1/runs${n}`,void 0,void 0,{signal:e.signal});return{data:i.data.map(o=>this.mapOpenAPIRunToRun(o)),total:i.total,page:i.page,limit:i.limit,hasMore:i.hasMore}}async getActivityCounts(e){let r=new URLSearchParams;e?.from&&r.set("from",e.from instanceof Date?(0,Vo.toUTCISOString)(e.from,"activity.from"):e.from),e?.to&&r.set("to",e.to instanceof Date?(0,Vo.toUTCISOString)(e.to,"activity.to"):e.to);let n=r.toString();return(await this.restRequest("GET",`/v1/activity/counts${n?`?${n}`:""}`,void 0,void 0,{signal:e?.signal})).counts}async getRun(e){try{let r=await this.restRequest("GET",`/v1/runs/${encodeURIComponent(e)}`);return this.mapOpenAPIRunToRun(r)}catch(r){if(r.message?.includes("404")||r.message?.includes("not found"))return null;throw r}}async getTool(e){try{return await this.restRequest("GET",`/v1/tools/${encodeURIComponent(e)}`)}catch(r){if(r.message?.includes("404")||r.message?.includes("not found")||r.message?.includes("403")||r.message?.includes("not allowed"))return null;throw r}}async getToolState(e){return(await this.restRequest("GET",`/v1/tools/${encodeURIComponent(e)}/state`)).state}async setToolState(e,r){await this.restRequest("PUT",`/v1/tools/${encodeURIComponent(e)}/state`,{state:r})}async deleteToolState(e){return(await this.restRequest("DELETE",`/v1/tools/${encodeURIComponent(e)}/state`)).deletedKeys}async archiveTool(e,r=!0){return this.updateTool(e,{archived:r})}async bulkArchiveTools(e,r=!0){return this.restRequest("POST","/v1/tools/bulk/archive",{ids:e,archived:r})}async bulkDeleteTools(e){return this.restRequest("POST","/v1/tools/bulk/delete",{ids:e})}async listTools(e={}){let r=(0,Yo.createListQueryParams)(e);e.includeArchived!==void 0&&r.set("includeArchived",String(e.includeArchived));let n=r.size>0?`?${r.toString()}`:"";return this.restRequest("GET",`/v1/tools${n}`)}async listAllTools(e={}){return(0,Yo.listAllPages)((r,n)=>this.listTools({...e,page:r,limit:n}))}async createTool(e,r){return this.restRequest("POST","/v1/tools",{...r,id:e})}async updateTool(e,r){return this.restRequest("PUT",`/v1/tools/${encodeURIComponent(e)}`,r)}async deleteTool(e){try{return await this.restRequest("DELETE",`/v1/tools/${encodeURIComponent(e)}`),!0}catch(r){if(r.message?.includes("404"))return!1;throw r}}async renameTool(e,r){return this.restRequest("POST",`/v1/tools/${encodeURIComponent(e)}/rename`,{newId:r})}async getWorkflow(e){return this.getTool(e)}async archiveWorkflow(e,r=!0){return this.upsertWorkflow(e,{archived:r})}async createWorkflow(e,r){return this.createTool(e,r)}async updateWorkflow(e,r){return this.updateTool(e,r)}async upsertWorkflow(e,r){return await this.getTool(e)?this.updateTool(e,r):this.createTool(e,r)}async deleteWorkflow(e){return this.deleteTool(e)}async renameWorkflow(e,r){return this.renameTool(e,r)}async listSchedules(e={}){let r=(0,Yo.createListQueryParams)(e),n=r.size>0?`?${r.toString()}`:"",i=e.toolId?`/v1/tools/${encodeURIComponent(e.toolId)}/schedules${n}`:`/v1/schedules${n}`,o=await this.restRequest("GET",i);return{...o,data:o.data.map(s=>this.mapOpenAPIScheduleToToolSchedule(s))}}async listAllSchedules(e={}){return(0,Yo.listAllPages)((r,n)=>this.listSchedules({...e,page:r,limit:n}))}async getToolSchedule(e,r){try{let n=await this.restRequest("GET",`/v1/tools/${encodeURIComponent(e)}/schedules/${encodeURIComponent(r)}`);return this.mapOpenAPIScheduleToToolSchedule(n)}catch(n){if(n.message?.includes("404")||n.message?.includes("not found"))return null;throw n}}async createToolSchedule(e,r){let n=await this.restRequest("POST",`/v1/tools/${encodeURIComponent(e)}/schedules`,{...r,timezone:r.timezone||(0,bTe.getRuntimeTimezone)()});return this.mapOpenAPIScheduleToToolSchedule(n)}async updateToolSchedule(e,r,n){let i=await this.restRequest("PUT",`/v1/tools/${encodeURIComponent(e)}/schedules/${encodeURIComponent(r)}`,n);return this.mapOpenAPIScheduleToToolSchedule(i)}async deleteToolSchedule(e,r){return await this.restRequest("DELETE",`/v1/tools/${encodeURIComponent(e)}/schedules/${encodeURIComponent(r)}`),!0}async bulkSetSchedulesEnabled(e,r){return this.restRequest("POST","/v1/schedules/bulk/enable",{ids:e,enabled:r})}async bulkDeleteSchedules(e){return this.restRequest("POST","/v1/schedules/bulk/delete",{ids:e})}async listCredentials(e={}){let r=(0,Yo.createListQueryParams)(e);e.systemId!==void 0&&r.set("systemId",e.systemId);let n=r.size>0?`?${r.toString()}`:"";return this.restRequest("GET",`/v1/credentials${n}`)}async listAllCredentials(e={}){return(0,Yo.listAllPages)((r,n)=>this.listCredentials({...e,page:r,limit:n}))}async createCredentials(e){return(await this.restRequest("POST","/v1/credentials",e)).data}async replaceCredentials(e,r){return(await this.restRequest("PUT",`/v1/credentials/${encodeURIComponent(e)}`,{credentials:r})).data}async updateCredentials(e,r){return(await this.restRequest("PATCH",`/v1/credentials/${encodeURIComponent(e)}`,r)).data}async deleteCredentials(e){await this.restRequest("DELETE",`/v1/credentials/${encodeURIComponent(e)}`)}async setDefaultCredentials(e){await this.restRequest("POST",`/v1/credentials/${encodeURIComponent(e)}/default`)}async listSystems(e={}){let r=(0,Yo.createListQueryParams)(e),n=r.size>0?`?${r.toString()}`:"";return this.restRequest("GET",`/v1/systems${n}`)}async listAllSystems(e={}){return(0,Yo.listAllPages)((r,n)=>this.listSystems({...e,page:r,limit:n}))}async getSystem(e){return(await this.restRequest("GET",`/v1/systems/${encodeURIComponent(e)}`)).data}async createSystem(e){return(await this.restRequest("POST","/v1/systems",e)).data}async updateSystem(e,r){return(await this.restRequest("PATCH",`/v1/systems/${encodeURIComponent(e)}`,r)).data}async deleteSystem(e){return await this.restRequest("DELETE",`/v1/systems/${encodeURIComponent(e)}`),!0}async bulkDeleteSystems(e){return this.restRequest("POST","/v1/systems/bulk/delete",{ids:e})}async createOAuthExchange(e){return(await this.restRequest("POST","/v1/oauth/exchanges",e)).data}async completeOAuthExchange(e,r){return(await this.restRequest("POST",`/v1/oauth/exchanges/${encodeURIComponent(e)}/complete`,r)).data}async searchSystemDocumentation(e,r){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/search`,{keywords:r})).data}async triggerSystemDocumentationScrapeJob(e,r){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/scrape`,r)).data}async fetchOpenApiSpec(e,r,n){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/openapi`,{url:r,link:n?.link})).data}async uploadSystemDocumentationFiles(e,r,n){let i=await this.uploadFiles(r,{process:!0}),o=i.flatMap(s=>s.status==="uploaded"?[s.id]:[]);if(o.length>0)try{await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/files`,{fileIds:o,link:n?.link!==!1})}catch(s){throw await Promise.all(o.map(a=>this.deleteFileUpload(a).catch(()=>{}))),s}if(!n?.settle){let s=i.filter(a=>a.status==="failed");if(s.length>0)throw new Error(s.map(a=>a.error).join("; "))}return i}async listSystemDocumentationFiles(e,r){let n=new URLSearchParams;r?.length&&n.set("fileIds",r.join(","));let i=n.size>0?`?${n.toString()}`:"";return(await this.restRequest("GET",`/v1/systems/${encodeURIComponent(e)}/documentation/files${i}`)).data}async getSystemDocumentationFileContent(e,r,n){return(await this.restRequest("GET",`/v1/systems/${encodeURIComponent(e)}/documentation/files/${encodeURIComponent(r)}/content?processed=${n.processed}`)).data}async deleteSystemDocumentationFile(e,r){await this.restRequest("DELETE",`/v1/systems/${encodeURIComponent(e)}/documentation/files/${encodeURIComponent(r)}`)}async generateCredentialsLink(e){try{return{success:!0,credentialsUrl:(await this.restRequest("POST","/v1/authenticate",e||{})).data.credentialsUrl}}catch(r){return{success:!1,error:r.message}}}};zu.SuperglueClient=gv});var Gz=g(it=>{"use strict";Object.defineProperty(it,"__esModule",{value:!0});it.UnquotedKeyStrategy=it.TripleQuoteStrategy=it.TrailingCommaStrategy=it.SingleQuoteStrategy=it.PythonLiteralStrategy=it.CommentStrategy=it.ResilientJsonParser=it.RepairStrategy=void 0;it.parseJsonResilient=STe;it.parseJSON=BTe;it.isValidJson=wTe;it.prettyPrintJson=QTe;it.minifyJson=vTe;var jn=class{validate(e){try{return JSON.parse(e),!0}catch{return!1}}};it.RepairStrategy=jn;var py=class extends jn{constructor(){super(...arguments),this.name="TripleQuoteRepair",this.description="Converts triple-quoted strings to proper JSON, parsing nested JSON content"}canApply(e){return/"""/.test(e)}apply(e){return e.replace(/"""([\s\S]*?)"""/g,(r,n)=>{let i=n.trim();if(i.startsWith("{")&&i.endsWith("}")||i.startsWith("[")&&i.endsWith("]"))try{let s=JSON.parse(i);return JSON.stringify(s)}catch{return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}"`}return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}"`})}};it.TripleQuoteStrategy=py;var fy=class extends jn{constructor(){super(...arguments),this.name="PythonLiteralRepair",this.description="Converts Python literals to JavaScript equivalents"}canApply(e){return/\b(None|True|False)\b/.test(e)}apply(e){return e.replace(/\bNone\b/g,"null").replace(/\bTrue\b/g,"true").replace(/\bFalse\b/g,"false")}};it.PythonLiteralStrategy=fy;var hy=class extends jn{constructor(){super(...arguments),this.name="TrailingCommaRepair",this.description="Removes trailing commas from objects and arrays"}canApply(e){return/,\s*[}\]]/.test(e)}apply(e){return e.replace(/,(\s*[}\]])/g,"$1")}};it.TrailingCommaStrategy=hy;var gy=class extends jn{constructor(){super(...arguments),this.name="SingleQuoteRepair",this.description="Converts single quotes to double quotes"}canApply(e){return/[{,]\s*'[^']*'\s*:/.test(e)||/:\s*'[^']*'/.test(e)}apply(e){let r=e.replace(/([{,]\s*)'([^']+)'(\s*:)/g,'$1"$2"$3');return r=r.replace(/(:\s*)'([^']+)'(\s*[,}])/g,'$1"$2"$3'),r}};it.SingleQuoteStrategy=gy;var my=class extends jn{constructor(){super(...arguments),this.name="UnquotedKeyRepair",this.description="Adds quotes to unquoted object keys"}canApply(e){return/[{,]\s*[a-zA-Z_$][a-zA-Z0-9_$]*\s*:/.test(e)}apply(e){return e.replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)(\s*:)/g,'$1"$2"$3')}};it.UnquotedKeyStrategy=my;var yy=class extends jn{constructor(){super(...arguments),this.name="CommentRemoval",this.description="Removes JavaScript-style comments"}canApply(e){return/\/\/.*$|\/\*[\s\S]*?\*\//m.test(e)}apply(e){let r=e.replace(/\/\/.*$/gm,"");return r=r.replace(/\/\*[\s\S]*?\*\//g,""),r}};it.CommentStrategy=yy;var mv=class extends jn{constructor(){super(...arguments),this.name="UnescapedControlCharactersRepair",this.description="Escapes unescaped control characters (newlines, tabs, etc.) in JSON strings"}canApply(e){try{return JSON.parse(e),!1}catch(r){let n=r.message||"";return n.includes("control character")||n.includes("Bad control")||n.includes("Unexpected token")&&/[\n\r\t]/.test(e)}}apply(e){let r="",n=!1,i=!1;for(let o=0;o<e.length;o++){let s=e[o],a=o>0?e[o-1]:"";if(i){r+=s,i=!1;continue}if(s==="\\"&&n){r+=s,i=!0;continue}if(s==='"'&&a!=="\\"){n=!n,r+=s;continue}if(n)switch(s){case`
1746
1746
  `:r+="\\n";break;case"\r":r+="\\r";break;case" ":r+="\\t";break;case"\b":r+="\\b";break;case"\f":r+="\\f";break;default:let c=s.charCodeAt(0);c<32?r+="\\u"+("0000"+c.toString(16)).slice(-4):r+=s}else r+=s}return r}},yv=class extends jn{constructor(){super(...arguments),this.name="TrailingCharactersRepair",this.description="Removes trailing characters after valid JSON structure"}canApply(e){let r=e.trim();if(!r.startsWith("{")&&!r.startsWith("["))return!1;let n=0,i=0,o=!1,s=!1;for(let a=0;a<r.length;a++){let c=r[a];if(o)s?s=!1:c==="\\"?s=!0:c==='"'&&(o=!1);else if(c==='"')o=!0;else if(c==="{")n++;else if(c==="}"){if(n--,n===0&&i===0&&a>0&&a<r.length-1)return!0}else if(c==="[")i++;else if(c==="]"&&(i--,i===0&&n===0&&a>0&&a<r.length-1))return!0}return!1}apply(e){let r=e.trim(),n=0,i=0,o=!1,s=!1,a=-1;for(let c=0;c<r.length;c++){let u=r[c];if(o)s?s=!1:u==="\\"?s=!0:u==='"'&&(o=!1);else if(u==='"')o=!0;else if(u==="{")n++;else if(u==="}"){if(n--,n===0&&i===0&&c>0){a=c;break}}else if(u==="[")i++;else if(u==="]"&&(i--,i===0&&n===0&&c>0)){a=c;break}}return a>0&&a<r.length-1?r.substring(0,a+1):e}},Gu=class{constructor(e={}){this.strategies=[],this.repairLog=[],this.options={attemptRepair:!0,maxDepth:10,preserveStringsOnFailure:!1,logRepairs:!1,...e},this.initializeDefaultStrategies(),e.customStrategies&&this.strategies.push(...e.customStrategies)}initializeDefaultStrategies(){this.strategies=[new py,new gy,new mv,new yv,new fy,new hy,new my,new yy]}parse(e){let r=Date.now();this.repairLog=[];let n=e instanceof Buffer?e.toString("utf8"):String(e);try{return{success:!0,data:JSON.parse(n),metadata:{parseTime:Date.now()-r,strategiesApplied:[]}}}catch(s){if(!this.options.attemptRepair)return{success:!1,error:`JSON parse error: ${s}`,metadata:{parseTime:Date.now()-r}}}let i=n,o=[];for(let s of this.strategies)if(s.canApply(i)){let a=i;if(i=s.apply(i),a!==i){o.push(s.name),this.repairLog.push(s.description),this.options.logRepairs&&console.log(`Applied ${s.name}: ${s.description}`);try{return{success:!0,data:JSON.parse(i),repairs:this.repairLog,metadata:{parseTime:Date.now()-r,strategiesApplied:o}}}catch{}}}try{return{success:!0,data:JSON.parse(i),repairs:this.repairLog,metadata:{parseTime:Date.now()-r,strategiesApplied:o}}}catch(s){let a=this.aggressiveFallback(i);return a.success?{...a,repairs:[...this.repairLog,"Applied aggressive fallback"],metadata:{parseTime:Date.now()-r,strategiesApplied:[...o,"AggressiveFallback"]}}:{success:!1,error:`Failed to parse JSON after applying ${o.length} strategies: ${s}`,repairs:this.repairLog,metadata:{parseTime:Date.now()-r,strategiesApplied:o}}}}aggressiveFallback(e){try{let r=e.indexOf("{"),n=e.indexOf("[");if(r===-1&&n===-1)return{success:!1,error:"No JSON-like structure found"};let i=r===-1?n:n===-1?r:Math.min(r,n),o=e.substring(i);for(let a of this.strategies)a.canApply(o)&&(o=a.apply(o));return{success:!0,data:JSON.parse(o)}}catch(r){return{success:!1,error:`Aggressive fallback failed: ${r}`}}}addStrategy(e){this.strategies.push(e)}removeStrategy(e){this.strategies=this.strategies.filter(r=>r.name!==e)}getStrategies(){return this.strategies.map(e=>e.name)}};it.ResilientJsonParser=Gu;var zz=new Gu;function STe(t,e){return(e?new Gu(e):zz).parse(t)}function BTe(t){let e=zz.parse(t);if(e.success)return e.repairs&&e.repairs.length>0&&console.log("JSON parsed with repairs:",e.repairs),e.data;throw new Error(`Failed to parse JSON: ${e.error}`)}function wTe(t){try{return JSON.parse(t),!0}catch{return!1}}function QTe(t,e=2){return JSON.stringify(t,null,e)}function vTe(t){let r=new Gu().parse(t);if(r.success)return JSON.stringify(r.data);throw new Error("Cannot minify invalid JSON")}});var Gr=g(K=>{"use strict";var _Te=K&&K.__createBinding||(Object.create?(function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}):(function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]})),Ae=K&&K.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&_Te(e,t,r)};Object.defineProperty(K,"__esModule",{value:!0});K.SSELogSubscriptionManager=K.SuperglueHttpError=K.SuperglueClient=void 0;Ae(AN(),K);Ae(RU(),K);Ae(qU(),K);Ae(zU(),K);Ae(WU(),K);Ae(ZU(),K);Ae(XU(),K);Ae(hd(),K);Ae(kM(),K);Ae(OM(),K);Ae(UM(),K);Ae(MM(),K);Ae(tb(),K);Ae(LM(),K);Ae($M(),K);Ae(jM(),K);Ae(qM(),K);Ae(nb(),K);Ae(zM(),K);Ae(YM(),K);Ae(VM(),K);Ae(WM(),K);Ae(tp(),K);Ae(KM(),K);Ae(XM(),K);Ae(tx(),K);Ae(rx(),K);Ae(ox(),K);Ae(sx(),K);Ae(Ax(),K);Ae(fx(),K);Ae(gx(),K);Ae(FC(),K);Ae(Qx(),K);Ae(_x(),K);Ae(xh(),K);Ae(jx(),K);Ae(vb(),K);Ae(Gx(),K);Ae(Wx(),K);Ae(Kx(),K);Ae(Br(),K);Ae(Jn(),K);Ae(Xx(),K);Ae(eL(),K);Ae(Kh(),K);Ae(kc(),K);Ae(Gl(),K);var Yz=Hz();Object.defineProperty(K,"SuperglueClient",{enumerable:!0,get:function(){return Yz.SuperglueClient}});Object.defineProperty(K,"SuperglueHttpError",{enumerable:!0,get:function(){return Yz.SuperglueHttpError}});var DTe=Tb();Object.defineProperty(K,"SSELogSubscriptionManager",{enumerable:!0,get:function(){return DTe.SSELogSubscriptionManager}});Ae(Gz(),K)});var Xy=require("commander");var br=ge(require("fs")),Wz=ge(require("os")),Jo=ge(require("path")),LA=ge(Gr()),Vz=new Set(["runner","builder","admin"]),Jz={output:{mode:"stdout",directory:".superglue/output"},preset:"admin"};function Wo(t){let e=Jo.join(process.cwd(),".superglue"),r=Wz.homedir();if(!r)return e;let n=Jo.join(r,".superglue");return t===!0?e:t===!1?n:br.existsSync(Jo.join(e,"config.json"))?e:n}function Ev(t){return Jo.join(Wo(t),"config.json")}function Ey(t){let e=Ev(t);if(!br.existsSync(e))return{};try{return JSON.parse(br.readFileSync(e,"utf-8"))}catch{return{}}}function Yu(t){let e=Ey(),r=t.apiKey||(0,LA.readProcessEnvironmentValue)("SUPERGLUE_API_KEY")||e.apiKey||"",n=t.endpoint||(0,LA.readProcessEnvironmentValue)("SUPERGLUE_API_ENDPOINT")||e.endpoint||"https://api.superglue.cloud",i=(0,LA.readProcessEnvironmentValue)("SUPERGLUE_WEB_ENDPOINT")||e.webEndpoint||n.replace(/:3002\b/,":3001").replace(/api\.superglue/,"app.superglue"),o=(0,LA.readProcessEnvironmentValue)("SUPERGLUE_CLI_PRESET"),s=o&&Vz.has(o)?o:e.preset&&Vz.has(e.preset)?e.preset:"admin";return{...Jz,...e,apiKey:r,endpoint:n,webEndpoint:i,preset:s,output:{...Jz.output,...e.output}}}function Iy(t,e){let r=Wo(e);br.existsSync(r)||br.mkdirSync(r,{recursive:!0}),br.writeFileSync(Jo.join(r,"config.json"),JSON.stringify(t,null,2)+`
1747
- `,{mode:384})}function Cy(t,e){let r=Jo.join(Wo(e),"drafts");if(br.existsSync(r)||br.mkdirSync(r,{recursive:!0}),t.output.mode==="stdout+file"){let n=Jo.resolve(t.output.directory);br.existsSync(n)||br.mkdirSync(n,{recursive:!0})}}var Qv=ge(Gr());var Iv=ge(require("readline"));var Xz=require("child_process"),eG=require("util");var Zz={name:"@superglue/cli",version:"1.1.155",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 RTe=(0,eG.promisify)(Xz.exec),sr=Zz.version;function Kz(t){let e=t.match(/^(\d+)(?:-(.+))?$/);return e?{numeric:parseInt(e[1],10),prerelease:e[2]||null}:{numeric:0,prerelease:t}}function Sy(t,e){let r=t.split("."),n=e.split("."),i=Math.max(r.length,n.length);for(let o=0;o<i;o++){let s=Kz(r[o]||"0"),a=Kz(n[o]||"0");if(s.numeric<a.numeric)return-1;if(s.numeric>a.numeric||s.prerelease===null&&a.prerelease!==null)return 1;if(s.prerelease!==null&&a.prerelease===null)return-1;if(s.prerelease!==null&&a.prerelease!==null){if(s.prerelease<a.prerelease)return-1;if(s.prerelease>a.prerelease)return 1}}return 0}async function By(){try{let t=await fetch("https://registry.npmjs.org/@superglue/cli/latest",{signal:AbortSignal.timeout(5e3)});return t.ok&&(await t.json()).version||null}catch{return null}}var by=null;function tG(){le()&&(by=By())}async function rG(){if(!(!le()||!by)){try{let t=new Promise(r=>{setTimeout(()=>r(null),2e3).unref()}),e=await Promise.race([by,t]);e&&Sy(sr,e)<0&&(console.error(""),console.error(`${m.cyan}${m.bold} Update available: ${sr} \u2192 ${e}${m.reset}`),console.error(`${m.cyan} Run ${m.bold}sg update${m.reset}${m.cyan} to upgrade${m.reset}`),console.error(""))}catch{}by=null}}async function nG(){let t=await By();if(!t)return{success:!1,message:"Could not fetch latest version from npm"};if(Sy(sr,t)>=0)return{success:!0,message:`Already on latest version (${sr})`};try{return await RTe("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${sr} to ${t}`}}catch(e){return{success:!1,message:`Update failed: ${e.message}. Try manually: npm install -g @superglue/cli@latest`}}}var le=()=>process.argv.includes("--table")&&process.stdout.isTTY,bn=()=>process.argv.includes("--full"),m={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 iG(t,e){let r=e||t;return`\x1B]8;;${t}\x07${m.underline}${m.cyan}${r}${m.reset}\x1B]8;;\x07`}function oG(){if(!le())return;let t=m.reset,e=m.dim,r="\x1B[47;30m",n=[" #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@- "," =@@@- @@@@ "," @@@ @@% "," -@@ @@@@= @@@ @@@ @@@@@#@ @@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@@@@* %@@ "," @@ @@@ *@ @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @% @@@ @@@ @@@ @@* @@# "," #@@ @@@# @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @@@ @@@ @@@ @@* @@ "," @@- @@@@= @@@ @@@ @@@@@@@ @@@@@@ @@@@@@@ @@@ @@% @@@ @@@ @@@ @@@@@. @@."," #@% .@@@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* @@ "," @@ @ @@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* *@@ "," -@@ @@@@= @@@@@@ @@@ @@@@@@@ @@@ -@@ @@@@@@ @@@@@@% @@@@@@. @@@@@@* #@@ "," :@@* @@@ "," %@@@ =@@@. "," :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% "];console.log(""),n.forEach(i=>{let o=i.search(/\S/),s=i.length-[...i].reverse().join("").search(/\S/)-1;if(o===-1)return console.log(" "+i);let a=i.slice(0,o),c=i.slice(o,s+1).split("").map(l=>l===" "?" ":"\u2588").join(""),u=i.slice(s+1);console.log(` ${a}${r}${c}${t}${u}`)}),console.log(` ${e} CLI v${sr}${t}`),console.log("")}function tt(t){if(!le())return{stop:()=>{},update:()=>{},log:()=>{}};let e=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=0,n=t,i=()=>process.stdout.write("\r\x1B[2K"),o=()=>{process.stdout.write(`\r ${m.cyan}${e[r++%e.length]}${m.reset} ${n}`)},s=setInterval(o,80);return{update:a=>{n=a},log:a=>{i(),console.log(` ${m.dim}\u2502${m.reset} ${a}`),o()},stop:a=>{clearInterval(s),i(),a&&console.log(` ${a}`)}}}function ie(t){le()?wy(t):console.log(JSON.stringify(t,null,2))}function Qe(t,e){le()?(console.log(` ${m.green}\u2713${m.reset} ${t}`),e&&wy(e,4)):console.log(JSON.stringify({success:!0,message:t,...e&&typeof e=="object"?e:{data:e}}))}function _(t,e){le()?(console.error(` ${m.red}\u2717${m.reset} ${t}`),e&&wy(e,4)):console.error(JSON.stringify({success:!1,error:t,details:e}))}function sG(t){le()&&console.log(` ${m.yellow}\u26A0${m.reset} ${t}`)}function Wt(t){le()&&console.log(` ${m.dim}${t}${m.reset}`)}function Zo(t){le()&&(console.log(`
1747
+ `,{mode:384})}function Cy(t,e){let r=Jo.join(Wo(e),"drafts");if(br.existsSync(r)||br.mkdirSync(r,{recursive:!0}),t.output.mode==="stdout+file"){let n=Jo.resolve(t.output.directory);br.existsSync(n)||br.mkdirSync(n,{recursive:!0})}}var Qv=ge(Gr());var Iv=ge(require("readline"));var Xz=require("child_process"),eG=require("util");var Zz={name:"@superglue/cli",version:"1.1.156",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 RTe=(0,eG.promisify)(Xz.exec),sr=Zz.version;function Kz(t){let e=t.match(/^(\d+)(?:-(.+))?$/);return e?{numeric:parseInt(e[1],10),prerelease:e[2]||null}:{numeric:0,prerelease:t}}function Sy(t,e){let r=t.split("."),n=e.split("."),i=Math.max(r.length,n.length);for(let o=0;o<i;o++){let s=Kz(r[o]||"0"),a=Kz(n[o]||"0");if(s.numeric<a.numeric)return-1;if(s.numeric>a.numeric||s.prerelease===null&&a.prerelease!==null)return 1;if(s.prerelease!==null&&a.prerelease===null)return-1;if(s.prerelease!==null&&a.prerelease!==null){if(s.prerelease<a.prerelease)return-1;if(s.prerelease>a.prerelease)return 1}}return 0}async function By(){try{let t=await fetch("https://registry.npmjs.org/@superglue/cli/latest",{signal:AbortSignal.timeout(5e3)});return t.ok&&(await t.json()).version||null}catch{return null}}var by=null;function tG(){le()&&(by=By())}async function rG(){if(!(!le()||!by)){try{let t=new Promise(r=>{setTimeout(()=>r(null),2e3).unref()}),e=await Promise.race([by,t]);e&&Sy(sr,e)<0&&(console.error(""),console.error(`${m.cyan}${m.bold} Update available: ${sr} \u2192 ${e}${m.reset}`),console.error(`${m.cyan} Run ${m.bold}sg update${m.reset}${m.cyan} to upgrade${m.reset}`),console.error(""))}catch{}by=null}}async function nG(){let t=await By();if(!t)return{success:!1,message:"Could not fetch latest version from npm"};if(Sy(sr,t)>=0)return{success:!0,message:`Already on latest version (${sr})`};try{return await RTe("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${sr} to ${t}`}}catch(e){return{success:!1,message:`Update failed: ${e.message}. Try manually: npm install -g @superglue/cli@latest`}}}var le=()=>process.argv.includes("--table")&&process.stdout.isTTY,bn=()=>process.argv.includes("--full"),m={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 iG(t,e){let r=e||t;return`\x1B]8;;${t}\x07${m.underline}${m.cyan}${r}${m.reset}\x1B]8;;\x07`}function oG(){if(!le())return;let t=m.reset,e=m.dim,r="\x1B[47;30m",n=[" #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@- "," =@@@- @@@@ "," @@@ @@% "," -@@ @@@@= @@@ @@@ @@@@@#@ @@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@@@@* %@@ "," @@ @@@ *@ @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @% @@@ @@@ @@@ @@* @@# "," #@@ @@@# @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @@@ @@@ @@@ @@* @@ "," @@- @@@@= @@@ @@@ @@@@@@@ @@@@@@ @@@@@@@ @@@ @@% @@@ @@@ @@@ @@@@@. @@."," #@% .@@@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* @@ "," @@ @ @@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* *@@ "," -@@ @@@@= @@@@@@ @@@ @@@@@@@ @@@ -@@ @@@@@@ @@@@@@% @@@@@@. @@@@@@* #@@ "," :@@* @@@ "," %@@@ =@@@. "," :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% "];console.log(""),n.forEach(i=>{let o=i.search(/\S/),s=i.length-[...i].reverse().join("").search(/\S/)-1;if(o===-1)return console.log(" "+i);let a=i.slice(0,o),c=i.slice(o,s+1).split("").map(l=>l===" "?" ":"\u2588").join(""),u=i.slice(s+1);console.log(` ${a}${r}${c}${t}${u}`)}),console.log(` ${e} CLI v${sr}${t}`),console.log("")}function tt(t){if(!le())return{stop:()=>{},update:()=>{},log:()=>{}};let e=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=0,n=t,i=()=>process.stdout.write("\r\x1B[2K"),o=()=>{process.stdout.write(`\r ${m.cyan}${e[r++%e.length]}${m.reset} ${n}`)},s=setInterval(o,80);return{update:a=>{n=a},log:a=>{i(),console.log(` ${m.dim}\u2502${m.reset} ${a}`),o()},stop:a=>{clearInterval(s),i(),a&&console.log(` ${a}`)}}}function ie(t){le()?wy(t):console.log(JSON.stringify(t,null,2))}function Qe(t,e){le()?(console.log(` ${m.green}\u2713${m.reset} ${t}`),e&&wy(e,4)):console.log(JSON.stringify({success:!0,message:t,...e&&typeof e=="object"?e:{data:e}}))}function _(t,e){le()?(console.error(` ${m.red}\u2717${m.reset} ${t}`),e&&wy(e,4)):console.error(JSON.stringify({success:!1,error:t,details:e}))}function sG(t){le()&&console.log(` ${m.yellow}\u26A0${m.reset} ${t}`)}function Wt(t){le()&&console.log(` ${m.dim}${t}${m.reset}`)}function Zo(t){le()&&(console.log(`
1748
1748
  ${m.bold}${m.cyan}${t}${m.reset}`),console.log(` ${m.dim}${"\u2500".repeat(t.length)}${m.reset}`))}function Ao(t,e,r){if(!le()){console.log(JSON.stringify({success:!0,total:r?.total??t.length,items:t}));return}if(t.length===0){console.log(`
1749
1749
  ${m.dim}0 results${m.reset}
1750
1750
  `);return}let n=e||Object.keys(t[0]),i=bn()?1/0:60,o=n.map(l=>Math.min(i,Math.max(l.length,...t.map(d=>String(d[l]??"").replace(/[\n\r]+/g," ").trim().length))));console.log("");let s=n.map((l,d)=>`${m.bold}${m.cyan}${l.toUpperCase().padEnd(o[d])}${m.reset}`).join(" ");console.log(` ${s}`);let a=o.map(l=>`${m.dim}${"\u2500".repeat(l)}${m.reset}`).join(`${m.dim}\u2500\u2500${m.reset}`);console.log(` ${a}`);for(let l of t){let d=n.map((A,p)=>{let h=String(l[A]??"").replace(/[\n\r]+/g," ").trim();if(h.length>i){let b=`\u2026 (${h.length})`;h=h.slice(0,Math.max(0,i-b.length))+`${m.dim}${b}${m.reset}`}return A==="status"?`${{success:m.green,running:m.yellow,failed:m.red,aborted:m.red,error:m.red,pending:m.dim}[h.toLowerCase()]||""}${h.padEnd(o[p])}${m.reset}`:h.padEnd(o[p])}).join(" ");console.log(` ${d}`)}let c=r?.total??t.length,u=c===t.length?`${t.length} result${t.length===1?"":"s"}`:`${t.length} of ${c} result${c===1?"":"s"}`;console.log(`
@@ -78,7 +78,7 @@ Brain contains context-source setup, playbooks, artifacts, and files. Capabiliti
78
78
 
79
79
  The persistent left sidebar contains these top-level items:
80
80
 
81
- - The project switcher and session list — always visible at the top. The project switcher selects one project or **All projects**. The selection sets which sessions the list shows, whether the right panel shows a project plan, and which project new sessions start in. With a project selected, the list shows only that project's sessions. With **All projects**, the list shows all sessions, each labeled with its project, and new sessions start at the organization level without a project. Choosing an item in the switcher starts a new session there. The switcher footer has **New project**, which starts agent-assisted project planning; with a project selected, it also opens the project page, pins or unpins the project, and archives it. **New session** starts a session in the selected project. When a project is selected and the user opens a session from another project, the selection changes to that project. `/` opens a new session in the selected project; saved sessions open `/agents/{sessionId}`. Archived projects and their sessions are hidden. A briefing run appears here after the user opens it from the briefing email or **Last briefing**.
81
+ - The project switcher and session list — always visible at the top. The project switcher selects one project or **All projects**. The selection sets which sessions the list shows, whether the right panel shows a project plan, and which project new sessions start in. With a project selected, the list shows only that project's sessions. With **All projects**, the list shows all sessions, each labeled with its project, and new sessions start at the organization level without a project. Choosing an item in the switcher starts a new session there. The switcher footer has **New project**, which starts agent-assisted project planning; with a project selected, it also opens the project page, pins or unpins the project, and archives it. **New session** starts a session in the selected project. When a project is selected and the user opens a session from another project, the selection changes to that project. `/` opens a new session in the selected project; saved sessions open `/agents/{sessionId}`. Archived projects and their sessions are hidden. A briefing run appears here after the user opens it from the briefing email or **View last briefing**.
82
82
  - **Brain** — expandable group for context and focused work:
83
83
  - **Setup** (`/brain`) — context-source connections that use only the current user's personal credentials.
84
84
  - **Playbooks** (`/playbooks`, detail at `/playbooks/{playbookId}`) — reusable guidance for recurring work. Built-in and custom playbooks share one grid; built-ins are labeled and can be duplicated.
@@ -92,15 +92,15 @@ The persistent left sidebar contains these top-level items:
92
92
  - **Schedules** (`/schedules`) — scheduled and recurring tool runs.
93
93
  - **Control Panel** (`/admin`) — expandable group for organization and account administration:
94
94
  - **Runs** (`/runs`, detail at `/runs/{runId}`) — execution history for full, draft, and single-step tool runs.
95
- - **Activity** (`/admin`) — organization activity summary for resource creation, shares, and tool runs.
96
- - **Access Rules** (`/admin/access`) — role and access-rule configuration; visible to admins on paid tiers. Use the access-rules reference for RBAC behavior, base roles, and personal roles.
97
- - **Organization** (`/organization`) — visible on paid tiers as a standalone page without tabs. It shows members, invitations, role assignment, and member-management actions; management actions are admin-gated.
95
+ - **Activity** (`/admin`) — organization activity summary for resource creation, shares, and tool runs; admin-only and requires Team or Enterprise.
96
+ - **Access Rules** (`/admin/access`) — role and access-rule configuration; admin-only and requires Enterprise. Use the access-rules reference for RBAC behavior, base roles, and personal roles.
97
+ - **Organization** (`/organization`) — a standalone page without tabs that requires Team or Enterprise. It shows members, invitations, role assignment, and member-management actions; management actions are admin-gated.
98
98
  - **API Keys** (`/api-keys`) — API key management.
99
- - **Settings** (`/settings`) — organization settings; admin-only.
99
+ - **Settings** (`/settings`) — appearance and agent memory notes for every user; organization settings for admins.
100
100
 
101
101
  The right panel's **Project plan** tab shows the selected project's tasks; with a project selected, `/projects` opens it. **New project** in the project switcher starts agent-assisted project planning; projects are created only through the agent. Project detail pages (`/projects/{projectId}`) have **Tasks**, **Resources**, and **Sessions** tabs. Projects support sharing, archive, and deletion; resource permissions remain separate.
102
102
 
103
- Below the navigation, the sidebar shows the current organization menu. Opening it shows the signed-in user and menu items for **Switch organization** and **Sign Out**.
103
+ Below the navigation, the sidebar shows the current organization menu. Opening it shows the signed-in user's name and email, lists the user's organizations and pending invitations, and contains **Sign Out**. Selecting an organization switches to it.
104
104
 
105
105
  After onboarding, while no context source is connected, a banner at the top of every page except Brain offers to connect email. **Set up** opens **Brain > Setup** (`/brain`), and the close button hides the banner for 7 days in that browser.
106
106
 
@@ -108,11 +108,13 @@ When cloud billing is enabled, Trial organizations see **Upgrade Plan** in the s
108
108
 
109
109
  **API Keys** (`/api-keys`) is a standalone page with a simple own-key editor for superglue API keys used by API, SDK, CLI headless/API-key auth, webhook, and non-OAuth MCP clients. Org users can create, copy, delete, and re-scope their own keys.
110
110
 
111
- **Settings** (`/settings`) is an admin-only standalone page with distinct sections:
111
+ **Settings** (`/settings`) is a standalone page with distinct sections. Every user sees **Appearance** and **Agent memory**; the other sections are admin-only:
112
112
 
113
+ - **Appearance** — light, dark, or system theme.
113
114
  - **Organization** — organization name, logo, and the brand guidelines agents follow when creating artifacts.
114
- - **Run Settings** — run preferences: draft/single-step run visibility, run result storage, member run visibility, and delete-all-runs.
115
+ - **Run settings** — run preferences: draft/single-step run visibility, run result storage, member run visibility, and delete-all-runs.
115
116
  - **Notifications** — run-alert channels for Slack and email (on failure, success, completion, or daily/weekly summaries). Slack setup opens `/settings/notifications/slack`; email setup opens `/settings/notifications/email`.
117
+ - **Agent memory** (`/settings#settings-memory`) — every user adds, edits, and deletes their personal and organization memory notes; admins also turn agent memory on or off.
116
118
  - **Timeouts** — Enterprise only: organization-level execution, protocol, and connection timeouts.
117
119
 
118
120
  ## Internals
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superglue/cli",
3
- "version": "1.1.155",
3
+ "version": "1.1.156",
4
4
  "bin": {
5
5
  "sg": "./dist/cli.js"
6
6
  },
@@ -78,7 +78,7 @@ Brain contains context-source setup, playbooks, artifacts, and files. Capabiliti
78
78
 
79
79
  The persistent left sidebar contains these top-level items:
80
80
 
81
- - The project switcher and session list — always visible at the top. The project switcher selects one project or **All projects**. The selection sets which sessions the list shows, whether the right panel shows a project plan, and which project new sessions start in. With a project selected, the list shows only that project's sessions. With **All projects**, the list shows all sessions, each labeled with its project, and new sessions start at the organization level without a project. Choosing an item in the switcher starts a new session there. The switcher footer has **New project**, which starts agent-assisted project planning; with a project selected, it also opens the project page, pins or unpins the project, and archives it. **New session** starts a session in the selected project. When a project is selected and the user opens a session from another project, the selection changes to that project. `/` opens a new session in the selected project; saved sessions open `/agents/{sessionId}`. Archived projects and their sessions are hidden. A briefing run appears here after the user opens it from the briefing email or **Last briefing**.
81
+ - The project switcher and session list — always visible at the top. The project switcher selects one project or **All projects**. The selection sets which sessions the list shows, whether the right panel shows a project plan, and which project new sessions start in. With a project selected, the list shows only that project's sessions. With **All projects**, the list shows all sessions, each labeled with its project, and new sessions start at the organization level without a project. Choosing an item in the switcher starts a new session there. The switcher footer has **New project**, which starts agent-assisted project planning; with a project selected, it also opens the project page, pins or unpins the project, and archives it. **New session** starts a session in the selected project. When a project is selected and the user opens a session from another project, the selection changes to that project. `/` opens a new session in the selected project; saved sessions open `/agents/{sessionId}`. Archived projects and their sessions are hidden. A briefing run appears here after the user opens it from the briefing email or **View last briefing**.
82
82
  - **Brain** — expandable group for context and focused work:
83
83
  - **Setup** (`/brain`) — context-source connections that use only the current user's personal credentials.
84
84
  - **Playbooks** (`/playbooks`, detail at `/playbooks/{playbookId}`) — reusable guidance for recurring work. Built-in and custom playbooks share one grid; built-ins are labeled and can be duplicated.
@@ -92,15 +92,15 @@ The persistent left sidebar contains these top-level items:
92
92
  - **Schedules** (`/schedules`) — scheduled and recurring tool runs.
93
93
  - **Control Panel** (`/admin`) — expandable group for organization and account administration:
94
94
  - **Runs** (`/runs`, detail at `/runs/{runId}`) — execution history for full, draft, and single-step tool runs.
95
- - **Activity** (`/admin`) — organization activity summary for resource creation, shares, and tool runs.
96
- - **Access Rules** (`/admin/access`) — role and access-rule configuration; visible to admins on paid tiers. Use the access-rules reference for RBAC behavior, base roles, and personal roles.
97
- - **Organization** (`/organization`) — visible on paid tiers as a standalone page without tabs. It shows members, invitations, role assignment, and member-management actions; management actions are admin-gated.
95
+ - **Activity** (`/admin`) — organization activity summary for resource creation, shares, and tool runs; admin-only and requires Team or Enterprise.
96
+ - **Access Rules** (`/admin/access`) — role and access-rule configuration; admin-only and requires Enterprise. Use the access-rules reference for RBAC behavior, base roles, and personal roles.
97
+ - **Organization** (`/organization`) — a standalone page without tabs that requires Team or Enterprise. It shows members, invitations, role assignment, and member-management actions; management actions are admin-gated.
98
98
  - **API Keys** (`/api-keys`) — API key management.
99
- - **Settings** (`/settings`) — organization settings; admin-only.
99
+ - **Settings** (`/settings`) — appearance and agent memory notes for every user; organization settings for admins.
100
100
 
101
101
  The right panel's **Project plan** tab shows the selected project's tasks; with a project selected, `/projects` opens it. **New project** in the project switcher starts agent-assisted project planning; projects are created only through the agent. Project detail pages (`/projects/{projectId}`) have **Tasks**, **Resources**, and **Sessions** tabs. Projects support sharing, archive, and deletion; resource permissions remain separate.
102
102
 
103
- Below the navigation, the sidebar shows the current organization menu. Opening it shows the signed-in user and menu items for **Switch organization** and **Sign Out**.
103
+ Below the navigation, the sidebar shows the current organization menu. Opening it shows the signed-in user's name and email, lists the user's organizations and pending invitations, and contains **Sign Out**. Selecting an organization switches to it.
104
104
 
105
105
  After onboarding, while no context source is connected, a banner at the top of every page except Brain offers to connect email. **Set up** opens **Brain > Setup** (`/brain`), and the close button hides the banner for 7 days in that browser.
106
106
 
@@ -108,11 +108,13 @@ When cloud billing is enabled, Trial organizations see **Upgrade Plan** in the s
108
108
 
109
109
  **API Keys** (`/api-keys`) is a standalone page with a simple own-key editor for superglue API keys used by API, SDK, CLI headless/API-key auth, webhook, and non-OAuth MCP clients. Org users can create, copy, delete, and re-scope their own keys.
110
110
 
111
- **Settings** (`/settings`) is an admin-only standalone page with distinct sections:
111
+ **Settings** (`/settings`) is a standalone page with distinct sections. Every user sees **Appearance** and **Agent memory**; the other sections are admin-only:
112
112
 
113
+ - **Appearance** — light, dark, or system theme.
113
114
  - **Organization** — organization name, logo, and the brand guidelines agents follow when creating artifacts.
114
- - **Run Settings** — run preferences: draft/single-step run visibility, run result storage, member run visibility, and delete-all-runs.
115
+ - **Run settings** — run preferences: draft/single-step run visibility, run result storage, member run visibility, and delete-all-runs.
115
116
  - **Notifications** — run-alert channels for Slack and email (on failure, success, completion, or daily/weekly summaries). Slack setup opens `/settings/notifications/slack`; email setup opens `/settings/notifications/email`.
117
+ - **Agent memory** (`/settings#settings-memory`) — every user adds, edits, and deletes their personal and organization memory notes; admins also turn agent memory on or off.
116
118
  - **Timeouts** — Enterprise only: organization-level execution, protocol, and connection timeouts.
117
119
 
118
120
  ## Internals