@superglue/cli 1.1.223 → 1.1.224

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.223",
4
+ "version": "1.1.224",
5
5
  "author": {
6
6
  "name": "superglue",
7
7
  "email": "hello@superglue.cloud"
package/dist/cli.js CHANGED
@@ -1124,7 +1124,7 @@ EXAMPLE WORKFLOWS:
1124
1124
 
1125
1125
  Authentication: the client application must be registered inside the ERP in mask bv280 ("App Registrierungen"), which issues an app key and app secret and requires granting each endpoint and procedure individually in the app's permission tabs. Login is a POST with JSON body containing logname, password, usergroup, company, factory, lang, and app_key, returning a JWT access_token (24 h) plus refresh_token (30 d) \u2014 send Authorization: Bearer on every call, reuse tokens instead of re-logging-in per request, and renew via the refreshToken endpoint. Company (Firma) and factory (Werk) in the login body scope all subsequent data for the session \u2014 double-check these values, since the API will not warn when they select a different plant than intended (use getUserCompanies/getUserFactories to pick them). SageID and O365 OAuth login variants exist; getUserGroups, getUserCompanies, getLanguages, and getDefinition work unauthenticated for discovery.
1126
1126
 
1127
- Request semantics: responses default to XML \u2014 always send Accept: application/json. The entire surface is German: endpoint tags (kunde, lieferant, artikel, auftrag, angebot, fertigungsauftrag, stueckliste, lagerbestand, wareneingang), field names, and mask IDs. Typed API objects support full CRUD with URL patterns {base}/{objekt}, {base}/{objekt}/{id} (ids are UUIDs), and {base}/{objekt}/count; an empty payload template is available via /empty on cdbi tables (for typed objects the docs are inconsistent between /empty and /$empty \u2014 verify on the instance's Swagger UI). Generic table access via {base}/cdbi/{tabelle} is READ-ONLY since release 2025.02 \u2014 writes must go through the typed objects. Two different filter syntaxes exist: typed objects take a JSON array filter=[{"verknuepfung":"AND","fldname":...,"operator":...,"value":...}], while cdbi and count queries use Django-style field postfixes (feld__eq=1, __like, __null). Default pageSize is 500. Custom server-side procedures are invoked via {base}/proc/{proc_name} and need their own permission grants. Get explicit user approval before any write. The API surface can shift between b7 releases (support windows are roughly 8 months under continuous delivery), so verify endpoint availability against the instance's own Swagger UI rather than assuming version parity.`},sage300:{name:"sage300",label:"Sage 300",apiUrl:"https://<<host>>/Sage300WebApi/v1.0/-/<<company>>",regex:"^.*(sage.?300|accpac|sage300webapi).*$",icon:"sage",docsUrl:"https://github.com/SageNADev/Sage300-SDK",preferredAuthType:"basic_auth",connectionFields:[{key:"host",label:"Web API Server Host",placeholder:"sage300.example.com",required:!0},{key:"company",label:"Company Database ID",placeholder:"SAMLTD",required:!0}],keywords:["erp","accounting","accpac","general ledger","accounts receivable","accounts payable","order entry","purchase orders","inventory","ar invoices","ap vendors","on-premises"],systemSpecificInstructions:`Sage 300 is an on-premises Windows ERP; the Web API is an ASP.NET application on the customer's own IIS server (installed only when Web Screens were selected during Sage 300 installation), so the base URL is customer-specific and often LAN/VPN-only. URL anatomy: {protocol}://{host}/Sage300WebApi/v1.0/-/{company}/{module}/{resource} \u2014 all documented endpoints use v1.0 (Sage's endpoint reference has listed v2.0 as a possible value but no v2.0 endpoints were ever published), the dash segment is literal, {company} is the Sage 300 company database ID (e.g. SAMLTD; company selection happens only in the URL, never via headers), and {module} is a code like GL, AP, AR, OE, PO, IC, CS, BK, TX. A Swagger UI and per-company, per-module $metadata ({company}/{module}/$metadata) provide discovery; there is no global metadata document.
1127
+ Request semantics: responses default to XML \u2014 always send Accept: application/json. The entire surface is German: endpoint tags (kunde, lieferant, artikel, auftrag, angebot, fertigungsauftrag, stueckliste, lagerbestand, wareneingang), field names, and mask IDs. Typed API objects support full CRUD with URL patterns {base}/{objekt}, {base}/{objekt}/{id} (ids are UUIDs), and {base}/{objekt}/count; an empty payload template is available via /empty on cdbi tables (for typed objects the docs are inconsistent between /empty and /$empty \u2014 verify on the instance's Swagger UI). Generic table access via {base}/cdbi/{tabelle} is READ-ONLY since release 2025.02 \u2014 writes must go through the typed objects. Two different filter syntaxes exist: typed objects take a JSON array filter=[{"verknuepfung":"AND","fldname":...,"operator":...,"value":...}], while cdbi and count queries use Django-style field postfixes (feld__eq=1, __like, __null). Default pageSize is 500. Custom server-side procedures are invoked via {base}/proc/{proc_name} and need their own permission grants. Get explicit user approval before any write. The API surface can shift between b7 releases (support windows are roughly 8 months under continuous delivery), so verify endpoint availability against the instance's own Swagger UI rather than assuming version parity.`},sage300:{name:"sage300",label:"Sage 300",apiUrl:"https://<<host>>/Sage300WebApi/v1.0/-/<<company>>",regex:"^(?!.*(sage.?300.?cre|timberline)).*(sage.?300|accpac|sage300webapi).*$",icon:"sage",docsUrl:"https://github.com/SageNADev/Sage300-SDK",preferredAuthType:"basic_auth",connectionFields:[{key:"host",label:"Web API Server Host",placeholder:"sage300.example.com",required:!0},{key:"company",label:"Company Database ID",placeholder:"SAMLTD",required:!0}],keywords:["erp","accounting","accpac","general ledger","accounts receivable","accounts payable","order entry","purchase orders","inventory","ar invoices","ap vendors","on-premises"],systemSpecificInstructions:`Sage 300 (formerly Accpac) is distinct from Sage 300 Construction and Real Estate (Sage 300 CRE, formerly Timberline), which has its own template. Sage 300 is an on-premises Windows ERP; the Web API is an ASP.NET application on the customer's own IIS server (installed only when Web Screens were selected during Sage 300 installation), so the base URL is customer-specific and often LAN/VPN-only. URL anatomy: {protocol}://{host}/Sage300WebApi/v1.0/-/{company}/{module}/{resource} \u2014 all documented endpoints use v1.0 (Sage's endpoint reference has listed v2.0 as a possible value but no v2.0 endpoints were ever published), the dash segment is literal, {company} is the Sage 300 company database ID (e.g. SAMLTD; company selection happens only in the URL, never via headers), and {module} is a code like GL, AP, AR, OE, PO, IC, CS, BK, TX. A Swagger UI and per-company, per-module $metadata ({company}/{module}/$metadata) provide discovery; there is no global metadata document.
1128
1128
 
1129
1129
  The API follows OData conventions but supports only $skip, $top, $count, and $filter \u2014 do not assume $orderby, $select, or $expand work. $filter supports eq, ne, gt, lt, le, and, or plus substringof/startswith/endswith/length (no ge); datetime literals use the prefixed form datetime'2015-12-31T12:00' while responses return ISO 8601 timestamps with no timezone. GET responses are capped by the server-side PageSize setting (default 100 records); a client cannot exceed it with $top, so page with $skip/$top.
1130
1130
 
@@ -1132,7 +1132,19 @@ Authentication is HTTP basic with a Sage 300 application user (not a Windows use
1132
1132
 
1133
1133
  Write semantics are unusual: POST/PUT/DELETE handle exactly one record per request (no batch endpoint); PUT supports partial payloads for top-level fields (Sage recommends partial payloads for performance) but acts as replacement for detail collections \u2014 any detail lines (including optional-field collections) omitted from the payload are purged, so when updating a record with details, fetch it first and include every detail line to keep; JSON property order matters because fields apply to the underlying Views in payload order. Process operations (posting invoices, generating GL batches) use POST {resource}($process), with POST {resource}($template) returning a starting payload; process endpoints do not support GET. Get explicit user approval before any write or process call.
1134
1134
 
1135
- Operational cautions: API sessions consume LanPak concurrent-user licenses; on releases before the June 2021/2022/2023 updates a known defect made leaked sessions accumulate until "maximum lanpaks exceeded" errors, and keeping concurrency low with short connections remains good practice on any version; the server returns TooManyRequests when flooded; the first request after idle is slow because IIS terminates the app pool after about 20 minutes idle by default (Sage recommends changing the idle action to Suspend and raising the timeout); DBLinkError or SessionError responses indicate a broken server-side installation, not a client mistake.`},sage_x3:{name:"sage_x3",label:"Sage X3",apiUrl:"https://<<host>>/api1/x3/erp/<<endpoint>>",regex:"^.*(sage.?x3|syracuse|adonix|safe.?x3).*$",icon:"sage",docsUrl:"https://online-help.sagex3.com/erp/12/en-us/Content/V7DEV/integration-guide_ws-overview.html",preferredAuthType:"basic_auth",connectionFields:[{key:"host",label:"Syracuse Server Host",placeholder:"x3server.example.com:8124",required:!0},{key:"endpoint",label:"X3 Endpoint (Folder)",placeholder:"PROD",required:!0}],keywords:["erp","manufacturing","distribution","finance","syracuse","sales orders","purchase orders","inventory","bom","production","general ledger","multi-company","multi-legislation"],systemSpecificInstructions:`Sage X3 is a customer-hosted ERP; all APIs are served from the customer's own Syracuse web server (default port often 8124), never a fixed Sage cloud hostname. Three API surfaces exist:
1135
+ Operational cautions: API sessions consume LanPak concurrent-user licenses; on releases before the June 2021/2022/2023 updates a known defect made leaked sessions accumulate until "maximum lanpaks exceeded" errors, and keeping concurrency low with short connections remains good practice on any version; the server returns TooManyRequests when flooded; the first request after idle is slow because IIS terminates the app pool after about 20 minutes idle by default (Sage recommends changing the idle action to Suspend and raising the timeout); DBLinkError or SessionError responses indicate a broken server-side installation, not a client mistake.`},sage_300_cre:{name:"sage_300_cre",label:"Sage 300 Construction and Real Estate",apiUrl:"script://runner/vbs32",regex:"^.*(sage.?300.?cre|timberline).*$",icon:"sage",docsUrl:"https://cdn.na.sage.com/docs/en/customer/300cre/26/open/UserGuide_26.pdf",preferredAuthType:"none",keywords:["construction","real estate","timberline","sage 300 cre","job cost","accounts payable","accounts receivable","general ledger","payroll","odbc","actian zen","pervasive","on-premises"],systemSpecificInstructions:`Sage 300 Construction and Real Estate (Sage 300 CRE, formerly Timberline Office) is distinct from Sage 300 (Accpac) and Sage 100 Contractor. It is an on-premises Windows product. Its data is stored in Actian Zen (Pervasive) files in one data folder per company, usually C:\\ProgramData\\Sage\\Timberline Office\\Data\\<Company> on the Sage server, shared as \\\\<server>\\Timberline Office\\Data\\<Company>.
1136
+
1137
+ superglue reaches it through the Secure Gateway. The gateway must run on a Windows machine where Sage 300 CRE is installed (the Sage server, a terminal server, or a workstation), because the "Timberline Data" ODBC driver and the Actian Zen client come only with the Sage 300 CRE installation. Enable the script runner (setup_gateway with os windows and enableScriptRunner true), keep the URL script://runner/vbs32, and attach the tunnel. The odbc:// protocol cannot reach this driver. To check a machine, the user runs Get-OdbcDriver -Name "*Timberline*" in PowerShell; when it returns nothing, Sage 300 CRE is not installed there and the gateway must move to a machine that runs Sage.
1138
+
1139
+ Steps use the script protocol: the body is VBScript that opens an ADODB.Connection, runs a query, prints the rows with WScript.Echo, and closes the connection. Use a DSN-less connection string, so no DSN setup is needed: Driver={Timberline Data};DBQ=<data folder>;StandardMode=1;UID=<user>;PWD=<password>. Collect data_folder (the company data folder: a local path when the gateway runs on the Sage server, otherwise its UNC path, never a mapped drive letter), sage_user and sage_password through the secure credential form. Always pass UID and PWD; without them the driver opens a login dialog that hangs the headless script until the step timeout. The general-purpose driver is 32-bit, so always use vbs32; Sage tests its 64-bit driver only with Crystal Reports. One connection string covers one company. The gateway service runs as LocalSystem, so the computer account needs read access to the share and the data folder. Recommend a dedicated Sage user (Security Administration, User Setup) with access to the company and ODBC read access to the needed tables, and a password with letters and digits only. File security blocks ODBC access, and record security filters rows.
1140
+
1141
+ Schema: StandardMode=1 gives standard names in the form <module code><M|T>_<FILE>__<RECORD> with a double underscore, for example JCM_MASTER__JOB, JCM_MASTER__COST_CODE, JCT_CURRENT__TRANSACTION, APM_MASTER__VENDOR, ARM_MASTER__CUSTOMER and PRM_MASTER__EMPLOYEE. Columns use readable names with underscores (Job, Description, Address_1). Never guess names: list tables with conn.OpenSchema(20) and the columns of one table with conn.OpenSchema(4, Array(Empty, Empty, "<table>")) before building queries. Listing the columns of every table is very slow. Purchasing, Inventory and Service Management data is not available through the Timberline Data driver; it needs the Pervasive ODBC drivers.
1142
+
1143
+ SQL: the driver is a Simba SQL engine, not T-SQL. SELECT, WHERE, implicit joins (FROM a, b WHERE a.Job = b.Job) and lower() work. Test TOP, ORDER BY, GROUP BY, explicit JOIN syntax, parameters and date literals with a small query before relying on them. Queries are slow: select only the needed columns, filter on key fields such as Job or Vendor, and never SELECT * on wide tables. Large extracts can lock files while users work. Build one JSON document in VBScript, escape quotes, backslashes and control characters, handle Null values, and echo it once.
1144
+
1145
+ Writes: the driver can change many fields and create or delete some records, but it writes without an audit trail and does not update dependent fields. Never write through ODBC without explicit user approval after stating these risks.
1146
+
1147
+ Errors: "[Sage][SQLEngine] (31830) Username and password is required" means UID or PWD is missing. "Could not open data folder" means a wrong path or no access to it. "Data source name not found" means the driver is not installed or the script ran as 64-bit. Actian Zen status codes in messages: 12 file or path not found; 20 or 3014 Zen engine not running or not found; 3012 local engine not accessible (turn off Use Local Engine in the Zen client settings when only a server engine exists); 46 or 94 access denied (check the share and folder rights of the computer account); 84 or 85 record or file locked by another user (report it, do not retry in a loop); 161 Actian license limit reached or license expired.`},sage_x3:{name:"sage_x3",label:"Sage X3",apiUrl:"https://<<host>>/api1/x3/erp/<<endpoint>>",regex:"^.*(sage.?x3|syracuse|adonix|safe.?x3).*$",icon:"sage",docsUrl:"https://online-help.sagex3.com/erp/12/en-us/Content/V7DEV/integration-guide_ws-overview.html",preferredAuthType:"basic_auth",connectionFields:[{key:"host",label:"Syracuse Server Host",placeholder:"x3server.example.com:8124",required:!0},{key:"endpoint",label:"X3 Endpoint (Folder)",placeholder:"PROD",required:!0}],keywords:["erp","manufacturing","distribution","finance","syracuse","sales orders","purchase orders","inventory","bom","production","general ledger","multi-company","multi-legislation"],systemSpecificInstructions:`Sage X3 is a customer-hosted ERP; all APIs are served from the customer's own Syracuse web server (default port often 8124), never a fixed Sage cloud hostname. Three API surfaces exist:
1136
1148
  - REST Web API under /api1/: URL shape is {protocol}://{server}:{port}/api1/x3/erp/{endpoint}/{entity}[('key')]?representation={REPRESENTATION}.$facet. The {endpoint} path segment selects the X3 endpoint, which maps to a folder/dataset (SEED is the demo folder). The representation parameter is mandatory: use $query for lists, $details for a single record, $edit for create/update payload shapes. Only fields exposed by the representation with the right facet flags are returned. Pagination follows SData 2.0 conventions: count= plus $next-style links; filter with where= and orderBy=. Old /sdata/x3/erp/... URLs are the legacy SData shape; use /api1/ for all new work (Sage's current Web API docs are api1-based). The REST Web API reads all modules but can only write entities on the upgraded framework; classic-only modules require SOAP for writes.
1137
1149
  - Classic SOAP web services: generic service at {server}:{port}/soap-generic/syracuse/collaboration/syracuse/CAdxWebServiceXmlCC (WSDL under /soap-wsdl/...). Every SOAP call carries a callContext referencing a pool alias; pools are configured in Syracuse Administration > Web Services and bind one endpoint/folder, a dedicated X3 user, and locale. A running pool consumes a license badge for its configured user \u2014 never bind pools to ADMIN (burns a rare, expensive ERPDEV badge); use a dedicated web-services user, and ensure the Syracuse host has at least one web service child process configured. SOAP publications (GESAWE) must be validated/published before use and request values must match the published names' exact casing; the pool must be running or calls fail.
1138
1150
  - GraphQL (Sage X3 2021 R2+): served at {server}:{port}/xtrem/api, POST only (even for queries), with the GraphiQL explorer at /xtrem/explorer/ (always written with the trailing slash in Sage's docs; some setups redirect without it). Requires the separately installed Sage X3 Services (xtrem) component; a missing service config yields "ETNA or XTreeM service URL must be configured". Production auth uses a Connected Application (client ID + secret signing a JWT whose audience is typically the GraphQL endpoint URL \u2014 match the Audience value configured in the Connected Application); verify on the instance whether Syracuse basic auth is accepted before relying on it. Clients select the target folder with the x-xtrem-endpoint header.
@@ -1894,7 +1906,7 @@ ${s}`;return}if(oE(e,i,dOe)){AOe(e,o)&&(r.retry=e.toString("utf8",o));return}if(
1894
1906
  `);t.stack=r?`${r}
1895
1907
  ${o}`:i.stack}K.exports.fetch=function(e,r=void 0){return qOe(e,r).catch(n=>{throw YY?ZY(n,YY):n&&typeof n=="object"&&Error.captureStackTrace(n,K.exports.fetch),n})};K.exports.Headers=wc().Headers;K.exports.Response=tp().Response;K.exports.Request=ol().Request;K.exports.FormData=vm().FormData;var{setGlobalOrigin:GOe,getGlobalOrigin:YOe}=Zw();K.exports.setGlobalOrigin=GOe;K.exports.getGlobalOrigin=YOe;var{CacheStorage:VOe}=UG(),{kConstruct:JOe}=Je();K.exports.caches=new VOe(JOe);var{deleteCookie:WOe,getCookies:ZOe,getSetCookies:KOe,setCookie:XOe,parseCookie:eUe}=YG();K.exports.deleteCookie=WOe;K.exports.getCookies=ZOe;K.exports.getSetCookies=KOe;K.exports.setCookie=XOe;K.exports.parseCookie=eUe;var{parseMIMEType:tUe,serializeAMimeType:rUe}=Mn();K.exports.parseMIMEType=tUe;K.exports.serializeAMimeType=rUe;var{CloseEvent:nUe,ErrorEvent:iUe,MessageEvent:oUe}=Yy(),{WebSocket:sUe,ping:aUe}=_Y();K.exports.WebSocket=sUe;K.exports.CloseEvent=nUe;K.exports.ErrorEvent=iUe;K.exports.MessageEvent=oUe;K.exports.ping=aUe;K.exports.WebSocketStream=OY().WebSocketStream;K.exports.WebSocketError=Rv().WebSocketError;K.exports.request=pp(ml.request);K.exports.stream=pp(ml.stream);K.exports.pipeline=pp(ml.pipeline);K.exports.connect=pp(ml.connect);K.exports.upgrade=pp(ml.upgrade);K.exports.MockClient=kOe;K.exports.MockCallHistory=OOe;K.exports.MockCallHistoryLog=UOe;K.exports.MockPool=xOe;K.exports.MockAgent=MOe;K.exports.SnapshotAgent=LOe;K.exports.mockErrors=POe;var{EventSource:cUe}=GY();K.exports.EventSource=cUe;function uUe(){globalThis.fetch=K.exports.fetch,globalThis.Headers=K.exports.Headers,globalThis.Response=K.exports.Response,globalThis.Request=K.exports.Request,globalThis.FormData=K.exports.FormData,globalThis.WebSocket=K.exports.WebSocket,globalThis.CloseEvent=K.exports.CloseEvent,globalThis.ErrorEvent=K.exports.ErrorEvent,globalThis.MessageEvent=K.exports.MessageEvent,globalThis.EventSource=K.exports.EventSource}K.exports.install=uUe});var eV=m(El=>{"use strict";Object.defineProperty(El,"__esModule",{value:!0});El.SuperglueClient=El.SuperglueHttpError=void 0;var yl=Lr(),Ur=iS(),lUe=YS(),dUe=d$(),AUe=Tn(),As=pu(),pUe=Pd(),hp=14400*1e3,fp;if(typeof globalThis.process<"u"&&globalThis.process.versions?.node)try{let{Agent:t}=KY();fp=new t({headersTimeout:hp,bodyTimeout:hp})}catch{}function XY(t){if(t?.aborted)throw t.reason??new DOMException("Aborted","AbortError")}var cE=class extends Error{constructor(e,r,n,i){super(e),this.status=r,this.code=n,this.details=i,this.name="SuperglueHttpError"}};El.SuperglueHttpError=cE;var xv=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 lUe.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;XY(r);let o=await this.refreshToken();return XY(r),!o||o===n?i:(i.body?.cancel(),e(o))}isInfrastructureError(e){return(0,AUe.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 restData(...e){return(await this.restRequest(...e)).data}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=l=>{let d={Authorization:`Bearer ${l}`,...i};return a&&!c&&e!=="GET"&&(d["Content-Type"]="application/json"),fetch(s,{...o,method:e,headers:d,body:a?c?n:JSON.stringify(n):void 0,signal:o?.signal??AbortSignal.timeout(hp),...fp?{dispatcher:fp}:{}})};return this.sendAuthorized(u,o?.signal)}async sendAuthorized(e,r){let n;try{n=await this.fetchWithAuthRetry(e,r)}catch(i){throw this.isInfrastructureError(i)&&this.onInfrastructureError?.(),i}if(!n.ok)throw await this.buildHttpError(n);return n}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,...r.allowUnprocessed?{allowUnprocessed:!0}:{},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:{...l.uploadHeaders,...A.contentType?{"Content-Type":A.contentType}:{}},signal:AbortSignal.timeout(Math.min(hp,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 cE(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(hp),...fp?{dispatcher:fp}:{}}),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,dUe.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 this.restData("GET",`/v1/memory-notes${n?`?${n}`:""}`)}async createMemoryNote(e){return this.restData("POST","/v1/memory-notes",e)}async updateMemoryNote(e,r){return this.restData("PATCH",`/v1/memory-notes/${encodeURIComponent(e)}`,r)}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,credentialsList:s,options:a,runId:c,systemIds:u,credentialId:l,systemAuth:d,createRun:A,parentToolId:p,stepIndex:h,stepId:g,signal:w,stream:B}){let _={step:e,payload:r,files:n,previousResults:i,credentials:o,credentialsList:s,options:a,runId:c,systemIds:u,credentialId:l,systemAuth:d,createRun:A,parentToolId:p,stepIndex:h,stepId:g};return B?this.streamRequest("/v1/tools/step/run",_,w):this.restRequest("POST","/v1/tools/step/run",_,void 0,w?{signal:w}: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,As.toUTCISOString)(c,"run.startedAt"),completedAt:(0,As.toUTCISOString)(u,"run.completedAt"),executionKind:l,parentToolId:d,draftId:A})}async checkRunLimit(){return this.restData("POST","/v1/runs/check-limit")}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:yl.RunStatus.RUNNING,success:yl.RunStatus.SUCCESS,failed:yl.RunStatus.FAILED,aborted:yl.RunStatus.ABORTED};return{runId:e.runId??e.id,toolId:e.toolId,tool:e.tool,systemIds:e.systemIds,status:r[e.status]??yl.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??yl.RunExecutionKind.FULL},fileArtifacts:e.fileArtifacts}}mapOpenAPIScheduleToToolSchedule(e){return{...e,lastRunAt:e.lastRunAt?(0,As.requireUTCDate)(e.lastRunAt,"schedule.lastRunAt"):void 0,nextRunAt:(0,As.requireUTCDate)(e.nextRunAt,"schedule.nextRunAt"),createdAt:(0,As.requireUTCDate)(e.createdAt,"schedule.createdAt"),updatedAt:(0,As.requireUTCDate)(e.updatedAt,"schedule.updatedAt")}}async listRuns(e={}){let r=(0,Ur.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,As.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,As.toUTCISOString)(e.from,"activity.from"):e.from),e?.to&&r.set("to",e.to instanceof Date?(0,As.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,Ur.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,Ur.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 listProjectSummaries(e={}){let r=(0,Ur.createSearchListQueryParams)(e);return r.set("includeResources","false"),e.includeArchived!==void 0&&r.set("includeArchived",String(e.includeArchived)),this.restRequest("GET",`/v1/projects?${r.toString()}`)}async listAllProjectSummaries({includeArchived:e}={}){return(0,Ur.listAllPages)((r,n)=>this.listProjectSummaries({page:r,limit:n,...e!==void 0?{includeArchived:e}:{}}))}async listAllProjectTasks(e){return(0,Ur.listAllPages)((r,n)=>this.restRequest("GET",`/v1/projects/${encodeURIComponent(e)}/tasks?page=${r}&limit=${n}`))}async saveProjectTask({projectId:e,taskId:r,input:n}){let i=`/v1/projects/${encodeURIComponent(e)}/tasks${r?`/${encodeURIComponent(r)}`:""}`;return this.restData(r?"PATCH":"POST",i,n)}async listAllProjectLabels(e){return(0,Ur.listAllPages)((r,n)=>this.restRequest("GET",`/v1/projects/${encodeURIComponent(e)}/labels?page=${r}&limit=${n}`))}async saveProjectLabel({projectId:e,labelId:r,input:n}){let i=`/v1/projects/${encodeURIComponent(e)}/labels${r?`/${encodeURIComponent(r)}`:""}`;return this.restData(r?"PATCH":"POST",i,n)}async deleteProjectLabel({projectId:e,labelId:r}){await this.restRequest("DELETE",`/v1/projects/${encodeURIComponent(e)}/labels/${encodeURIComponent(r)}`)}async listSchedules(e={}){let r=(0,Ur.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,Ur.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,pUe.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 listConnections(e={}){let r=(0,Ur.createListQueryParams)(e);e.systemId!==void 0&&r.set("systemId",e.systemId);let n=r.size>0?`?${r.toString()}`:"";return this.restRequest("GET",`/v1/connections${n}`)}async listAllConnections(e={}){return(0,Ur.listAllPages)((r,n)=>this.listConnections({...e,page:r,limit:n}))}async updateOAuthApp(e,r){return this.restData("PUT",`/v1/oauth-apps/${encodeURIComponent(e)}`,r)}async deleteOAuthApp(e){await this.restRequest("DELETE",`/v1/oauth-apps/${encodeURIComponent(e)}`)}async listOAuthApps({systemId:e}={}){return(0,Ur.listAllPages)(async(r,n)=>{let i=new URLSearchParams({page:String(r),limit:String(n),...e?{systemId:e}:{}});return this.restRequest("GET",`/v1/oauth-apps?${i}`)})}async getConnectionSetup(e){return this.restData("GET",`/v1/connections/setup/${encodeURIComponent(e)}`)}async createConnection(e){return this.restData("POST","/v1/connections",e)}async replaceConnection(e,r){return this.restData("PUT",`/v1/connections/${encodeURIComponent(e)}`,{credentials:r})}async updateConnection(e,r){return this.restData("PATCH",`/v1/connections/${encodeURIComponent(e)}`,r)}async deleteConnection(e){await this.restRequest("DELETE",`/v1/connections/${encodeURIComponent(e)}`)}async setDefaultConnection(e){await this.restRequest("POST",`/v1/connections/${encodeURIComponent(e)}/default`)}async listSystems(e={}){let r=(0,Ur.createListQueryParams)(e),n=r.size>0?`?${r.toString()}`:"";return this.restRequest("GET",`/v1/systems${n}`)}async listAllSystems(e={}){return(0,Ur.listAllPages)((r,n)=>this.listSystems({...e,page:r,limit:n}))}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 describeOAuthProviderPage(e){return(await this.restRequest("POST",`/v1/oauth/exchanges/${encodeURIComponent(e)}/provider-page`)).data}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}}}};El.SuperglueClient=xv});var rV=m(ft=>{"use strict";Object.defineProperty(ft,"__esModule",{value:!0});ft.UnquotedKeyStrategy=ft.TripleQuoteStrategy=ft.TrailingCommaStrategy=ft.SingleQuoteStrategy=ft.PythonLiteralStrategy=ft.CommentStrategy=ft.ResilientJsonParser=ft.RepairStrategy=void 0;ft.parseJsonResilient=fUe;ft.parseJSON=hUe;ft.isValidJson=gUe;ft.prettyPrintJson=mUe;ft.minifyJson=yUe;var ui=class{validate(e){try{return JSON.parse(e),!0}catch{return!1}}};ft.RepairStrategy=ui;var uE=class extends ui{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")}"`})}};ft.TripleQuoteStrategy=uE;var lE=class extends ui{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")}};ft.PythonLiteralStrategy=lE;var dE=class extends ui{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")}};ft.TrailingCommaStrategy=dE;var AE=class extends ui{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}};ft.SingleQuoteStrategy=AE;var pE=class extends ui{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')}};ft.UnquotedKeyStrategy=pE;var fE=class extends ui{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}};ft.CommentStrategy=fE;var Lv=class extends ui{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`
1896
1908
  `: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}},Pv=class extends ui{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}},Il=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 uE,new AE,new Lv,new Pv,new lE,new dE,new pE,new fE]}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)}};ft.ResilientJsonParser=Il;var tV=new Il;function fUe(t,e){return(e?new Il(e):tV).parse(t)}function hUe(t){let e=tV.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 gUe(t){try{return JSON.parse(t),!0}catch{return!1}}function mUe(t,e=2){return JSON.stringify(t,null,e)}function yUe(t){let r=new Il().parse(t);if(r.success)return JSON.stringify(r.data);throw new Error("Cannot minify invalid JSON")}});var nV=m(Er=>{"use strict";Object.defineProperty(Er,"__esModule",{value:!0});Er.MANAGED_OAUTH_APP_PREFIX=void 0;Er.projectOAuthAppAuthentication=CUe;Er.isDynamicOAuthConfiguration=bUe;Er.isReusableOAuthAppForTemplate=SUe;Er.getManagedOAuthTemplateId=wUe;Er.getOAuthAppSharedConfiguration=BUe;Er.copyOAuthAppConfiguration=_Ue;Er.encryptConnectionAuthentication=QUe;Er.decryptConnectionAuthentication=vUe;Er.isManagedOAuthEndpointAllowed=DUe;var EUe=HS(),IUe=Tn();function CUe(t){let{clientSecret:e,config:r,...n}=t,{extraHeaders:i,extraBodyParams:o,...s}=r??{};return{...n,...r?{config:s}:{}}}Er.MANAGED_OAUTH_APP_PREFIX="managed:";function bUe({authentication:t,template:e}){return t.oauthClientMode==="dynamic"||!!e?.oauth?.registrationUrl&&!t.clientSecret}function SUe({app:t,template:e}){return!e?.oauth?.registrationUrl||!!t.clientSecretHash}function wUe(t){if(t?.type==="oauth2")return t.oauthAppId?.startsWith(Er.MANAGED_OAUTH_APP_PREFIX)?t.oauthAppId.slice(Er.MANAGED_OAUTH_APP_PREFIX.length):void 0}function BUe(t){let{grantType:e,scopes:r,oauthAppId:n,...i}=t;return i}function _Ue({appAuthentication:t,authentication:e}){if(e?.type!=="oauth2")return{...t};let r=Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0));return{...t,...r,config:{...t.config,...e.config}}}function QUe({authentication:t,encrypt:e}){if(t.type!=="oauth2")return t;let r={...t,config:{...t.config}};t.clientSecret!==void 0&&(r.clientSecret=e({value:t.clientSecret}).value);for(let n of["extraHeaders","extraBodyParams"]){let i=t.config?.[n];i!==void 0&&(r.config[n]=e({value:(0,IUe.safeStringify)(i)}).value)}return r}function vUe({authentication:t,decrypt:e}){if(t.type!=="oauth2")return t;let r={...t,config:{...t.config}};t.clientSecret!==void 0&&(r.clientSecret=e({value:t.clientSecret}).value);for(let n of["extraHeaders","extraBodyParams"]){let i=t.config?.[n];typeof i=="string"&&(r.config[n]=JSON.parse(e({value:i}).value))}return r}function DUe({templateId:t,endpoint:e,url:r}){let n=EUe.systems[t]?.oauth,i=n?.[e];if(!n?.managed||!i)return!1;try{let o=new URL(r),s=new URL(i);return o.protocol!=="https:"||o.port||o.username||o.password||o.hash||o.pathname!==s.pathname?!1:o.hostname===s.hostname||(n.managedEndpointHosts??[]).some(a=>a.startsWith("*.")?o.hostname.endsWith(a.slice(1)):o.hostname===a)}catch{return!1}}});var oV=m(iV=>{"use strict";Object.defineProperty(iV,"__esModule",{value:!0})});var Ir=m(Z=>{"use strict";var TUe=Z&&Z.__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]})),ne=Z&&Z.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&TUe(e,t,r)};Object.defineProperty(Z,"__esModule",{value:!0});Z.SSELogSubscriptionManager=Z.SuperglueHttpError=Z.SuperglueClient=void 0;ne(Ix(),Z);ne(_x(),Z);ne(Lx(),Z);ne($x(),Z);ne(qx(),Z);ne(Gx(),Z);ne(Vx(),Z);ne(Sg(),Z);ne(BL(),Z);ne(Wf(),Z);ne(DL(),Z);ne(TL(),Z);ne(RL(),Z);ne(NL(),Z);ne(kL(),Z);ne(iS(),Z);ne(UL(),Z);ne(LL(),Z);ne(Mg(),Z);ne(PL(),Z);ne(aS(),Z);ne(dS(),Z);ne(FL(),Z);ne(jL(),Z);ne(HL(),Z);ne(uh(),Z);ne(GL(),Z);ne(YL(),Z);ne(JL(),Z);ne(WL(),Z);ne(XL(),Z);ne(hP(),Z);ne(bS(),Z);ne(Jd(),Z);ne(CS(),Z);ne(IP(),Z);ne(bP(),Z);ne(BP(),Z);ne(Eg(),Z);ne(OP(),Z);ne(MP(),Z);ne(Ig(),Z);ne(mS(),Z);ne(jP(),Z);ne(zP(),Z);ne(HS(),Z);ne(e$(),Z);ne(t$(),Z);ne(r$(),Z);ne(s$(),Z);ne(c$(),Z);ne(Lr(),Z);ne(Tn(),Z);ne(u$(),Z);ne(l$(),Z);ne(jg(),Z);ne(pu(),Z);ne(Pd(),Z);var sV=eV();Object.defineProperty(Z,"SuperglueClient",{enumerable:!0,get:function(){return sV.SuperglueClient}});Object.defineProperty(Z,"SuperglueHttpError",{enumerable:!0,get:function(){return sV.SuperglueHttpError}});var RUe=YS();Object.defineProperty(Z,"SSELogSubscriptionManager",{enumerable:!0,get:function(){return RUe.SSELogSubscriptionManager}});ne(rV(),Z);ne(nV(),Z);ne(oV(),Z)});var KE=require("commander");var Mr=ye(require("fs")),uV=ye(require("os")),ps=ye(require("path")),gp=ye(Ir()),aV=new Set(["runner","builder","admin"]),cV={output:{mode:"stdout",directory:".superglue/output"},preset:"admin"};function fs(t){let e=ps.join(process.cwd(),".superglue"),r=uV.homedir();if(!r)return e;let n=ps.join(r,".superglue");return t===!0?e:t===!1?n:Mr.existsSync(ps.join(e,"config.json"))?e:n}function $v(t){return ps.join(fs(t),"config.json")}function hE(t){let e=$v(t);if(!Mr.existsSync(e))return{};try{return JSON.parse(Mr.readFileSync(e,"utf-8"))}catch{return{}}}function Cl(t){let e=hE(),r=t.apiKey||(0,gp.readProcessEnvironmentValue)("SUPERGLUE_API_KEY")||e.apiKey||"",n=t.endpoint||(0,gp.readProcessEnvironmentValue)("SUPERGLUE_API_ENDPOINT")||e.endpoint||"https://api.superglue.cloud",i=(0,gp.readProcessEnvironmentValue)("SUPERGLUE_WEB_ENDPOINT")||e.webEndpoint||n.replace(/:3002\b/,":3001").replace(/api\.superglue/,"app.superglue"),o=(0,gp.readProcessEnvironmentValue)("SUPERGLUE_CLI_PRESET"),s=o&&aV.has(o)?o:e.preset&&aV.has(e.preset)?e.preset:"admin";return{...cV,...e,apiKey:r,endpoint:n,webEndpoint:i,preset:s,output:{...cV.output,...e.output}}}function gE(t,e){let r=fs(e);Mr.existsSync(r)||Mr.mkdirSync(r,{recursive:!0}),Mr.writeFileSync(ps.join(r,"config.json"),JSON.stringify(t,null,2)+`
1897
- `,{mode:384})}function mE(t,e){let r=ps.join(fs(e),"drafts");if(Mr.existsSync(r)||Mr.mkdirSync(r,{recursive:!0}),t.output.mode==="stdout+file"){let n=ps.resolve(t.output.directory);Mr.existsSync(n)||Mr.mkdirSync(n,{recursive:!0})}}var Yv=ye(Ir());var Fv=ye(require("readline"));var AV=require("child_process"),pV=require("util");var lV={name:"@superglue/cli",version:"1.1.223",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 kUe=(0,pV.promisify)(AV.exec),Cr=lV.version;function dV(t){let e=t.match(/^(\d+)(?:-(.+))?$/);return e?{numeric:parseInt(e[1],10),prerelease:e[2]||null}:{numeric:0,prerelease:t}}function EE(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=dV(r[o]||"0"),a=dV(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 IE(){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 yE=null;function fV(){le()&&(yE=IE())}async function hV(){if(!(!le()||!yE)){try{let t=new Promise(r=>{setTimeout(()=>r(null),2e3).unref()}),e=await Promise.race([yE,t]);e&&EE(Cr,e)<0&&(console.error(""),console.error(`${I.cyan}${I.bold} Update available: ${Cr} \u2192 ${e}${I.reset}`),console.error(`${I.cyan} Run ${I.bold}sg update${I.reset}${I.cyan} to upgrade${I.reset}`),console.error(""))}catch{}yE=null}}async function gV(){let t=await IE();if(!t)return{success:!1,message:"Could not fetch latest version from npm"};if(EE(Cr,t)>=0)return{success:!0,message:`Already on latest version (${Cr})`};try{return await kUe("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${Cr} 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,qn=()=>process.argv.includes("--full"),I={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 mV(t,e){let r=e||t;return`\x1B]8;;${t}\x07${I.underline}${I.cyan}${r}${I.reset}\x1B]8;;\x07`}function yV(){if(!le())return;let t=I.reset,e=I.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${Cr}${t}`),console.log("")}function Ot(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 ${I.cyan}${e[r++%e.length]}${I.reset} ${n}`)},s=setInterval(o,80);return{update:a=>{n=a},log:a=>{i(),console.log(` ${I.dim}\u2502${I.reset} ${a}`),o()},stop:a=>{clearInterval(s),i(),a&&console.log(` ${a}`)}}}function te(t){le()?CE(t):console.log(JSON.stringify(t,null,2))}function De(t,e){le()?(console.log(` ${I.green}\u2713${I.reset} ${t}`),e&&CE(e,4)):console.log(JSON.stringify({success:!0,message:t,...e&&typeof e=="object"?e:{data:e}}))}function v(t,e){le()?(console.error(` ${I.red}\u2717${I.reset} ${t}`),e&&CE(e,4)):console.error(JSON.stringify({success:!1,error:t,details:e}))}function ln(t){le()&&console.log(` ${I.dim}${t}${I.reset}`)}function kc(t){le()&&(console.log(`
1909
+ `,{mode:384})}function mE(t,e){let r=ps.join(fs(e),"drafts");if(Mr.existsSync(r)||Mr.mkdirSync(r,{recursive:!0}),t.output.mode==="stdout+file"){let n=ps.resolve(t.output.directory);Mr.existsSync(n)||Mr.mkdirSync(n,{recursive:!0})}}var Yv=ye(Ir());var Fv=ye(require("readline"));var AV=require("child_process"),pV=require("util");var lV={name:"@superglue/cli",version:"1.1.224",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 kUe=(0,pV.promisify)(AV.exec),Cr=lV.version;function dV(t){let e=t.match(/^(\d+)(?:-(.+))?$/);return e?{numeric:parseInt(e[1],10),prerelease:e[2]||null}:{numeric:0,prerelease:t}}function EE(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=dV(r[o]||"0"),a=dV(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 IE(){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 yE=null;function fV(){le()&&(yE=IE())}async function hV(){if(!(!le()||!yE)){try{let t=new Promise(r=>{setTimeout(()=>r(null),2e3).unref()}),e=await Promise.race([yE,t]);e&&EE(Cr,e)<0&&(console.error(""),console.error(`${I.cyan}${I.bold} Update available: ${Cr} \u2192 ${e}${I.reset}`),console.error(`${I.cyan} Run ${I.bold}sg update${I.reset}${I.cyan} to upgrade${I.reset}`),console.error(""))}catch{}yE=null}}async function gV(){let t=await IE();if(!t)return{success:!1,message:"Could not fetch latest version from npm"};if(EE(Cr,t)>=0)return{success:!0,message:`Already on latest version (${Cr})`};try{return await kUe("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${Cr} 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,qn=()=>process.argv.includes("--full"),I={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 mV(t,e){let r=e||t;return`\x1B]8;;${t}\x07${I.underline}${I.cyan}${r}${I.reset}\x1B]8;;\x07`}function yV(){if(!le())return;let t=I.reset,e=I.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${Cr}${t}`),console.log("")}function Ot(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 ${I.cyan}${e[r++%e.length]}${I.reset} ${n}`)},s=setInterval(o,80);return{update:a=>{n=a},log:a=>{i(),console.log(` ${I.dim}\u2502${I.reset} ${a}`),o()},stop:a=>{clearInterval(s),i(),a&&console.log(` ${a}`)}}}function te(t){le()?CE(t):console.log(JSON.stringify(t,null,2))}function De(t,e){le()?(console.log(` ${I.green}\u2713${I.reset} ${t}`),e&&CE(e,4)):console.log(JSON.stringify({success:!0,message:t,...e&&typeof e=="object"?e:{data:e}}))}function v(t,e){le()?(console.error(` ${I.red}\u2717${I.reset} ${t}`),e&&CE(e,4)):console.error(JSON.stringify({success:!1,error:t,details:e}))}function ln(t){le()&&console.log(` ${I.dim}${t}${I.reset}`)}function kc(t){le()&&(console.log(`
1898
1910
  ${I.bold}${I.cyan}${t}${I.reset}`),console.log(` ${I.dim}${"\u2500".repeat(t.length)}${I.reset}`))}function $t(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(`
1899
1911
  ${I.dim}0 results${I.reset}
1900
1912
  `);return}let n=e||Object.keys(t[0]),i=qn()?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)=>`${I.bold}${I.cyan}${l.toUpperCase().padEnd(o[d])}${I.reset}`).join(" ");console.log(` ${s}`);let a=o.map(l=>`${I.dim}${"\u2500".repeat(l)}${I.reset}`).join(`${I.dim}\u2500\u2500${I.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 w=`\u2026 (${h.length})`;h=h.slice(0,Math.max(0,i-w.length))+`${I.dim}${w}${I.reset}`}return A==="status"?`${{success:I.green,running:I.yellow,failed:I.red,aborted:I.red,error:I.red,pending:I.dim}[h.toLowerCase()]||""}${h.padEnd(o[p])}${I.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(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superglue/cli",
3
- "version": "1.1.223",
3
+ "version": "1.1.224",
4
4
  "bin": {
5
5
  "sg": "./dist/cli.js"
6
6
  },