@superglue/cli 1.1.112 → 1.1.113
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/dist/cli.js +3 -3
- package/package.json +1 -1
|
@@ -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.
|
|
4
|
+
"version": "1.1.113",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "superglue",
|
|
7
7
|
"email": "hello@superglue.cloud"
|
package/dist/cli.js
CHANGED
|
@@ -601,7 +601,7 @@ ${e.map(t=>`- ${t.path}: ${t.message}`).join(`
|
|
|
601
601
|
`).map(a=>`${e}${a}`)].join(`
|
|
602
602
|
`)}function dn(o,e){return o.includes(`
|
|
603
603
|
`)?sde(o,e):JSON.stringify(o)}function cde(o){let e=["---"];if(e.push(`name: ${dn(o.id," ")}`),e.push(`title: ${dn(o.name," ")}`),e.push(`when_to_run: ${dn(o.whenToRun," ")}`),o.systemRefs.length>0){e.push("systems:");for(let a of o.systemRefs)e.push(` - id: ${dn(a.id," ")}`)}if(o.toolRefs.length>0){e.push("tools:");for(let a of o.toolRefs)e.push(` - id: ${dn(a.id," ")}`)}if(o.credentialRefs.length>0){e.push("credentials:");for(let a of o.credentialRefs)e.push(` - id: ${dn(a.id," ")}`)}if(o.fileRefs.length>0){e.push("files:");for(let a of o.fileRefs)e.push(` - ${dn(a.name," ")}`);e.push(`# read attachments at /org/playbooks/${o.id}/files/<name>.json (.raw for original bytes)`)}e.push(`completion_criteria: ${dn(o.completionCriteria," ")}`),e.push("---"),e.push(""),o.inputs.trim()&&(e.push("## Required inputs"),e.push(""),e.push(o.inputs.trim()),e.push("")),e.push("## Instructions"),e.push(""),e.push(o.instructions.trim()),e.push("");let t=e.join(`
|
|
604
|
-
`);if(t.length>bQ.PLAYBOOK_LIMITS.compiledRender)throw new Error(`Compiled playbook render for '${o.id}' exceeds ${bQ.PLAYBOOK_LIMITS.compiledRender} chars (${t.length})`);return t}});var kQ=f(xr=>{"use strict";Object.defineProperty(xr,"__esModule",{value:!0});xr.PROJECT_LIMITS=xr.PROJECT_TASK_STATUSES=xr.PROJECT_RESOURCE_TYPES=void 0;xr.projectResourceKey=mde;xr.PROJECT_RESOURCE_TYPES=["system","playbook","artifact","file","tool"];xr.PROJECT_TASK_STATUSES=["not_started","in_progress","waiting","done"];xr.PROJECT_LIMITS={name:80,description:500,taskName:120,taskDescription:5e3,taskResources:100};function mde(o){return`${o.type}:${o.id}`}});var Fv=f(ja=>{"use strict";Object.defineProperty(ja,"__esModule",{value:!0});ja.RESOURCE_KINDS=ja.RESOURCE_DEFINITIONS=void 0;ja.isResourceKind=lde;ja.getResourceDefinition=ude;ja.RESOURCE_DEFINITIONS={tool:{label:"Tool",pluralLabel:"Tools",collectionKey:"tools",memberDefaultPermission:"editor",pickerDefaultPermission:"editor"},system:{label:"System",pluralLabel:"Systems",collectionKey:"systems",memberDefaultPermission:"editor",pickerDefaultPermission:"editor"},credential:{label:"Credential",pluralLabel:"Credentials",collectionKey:"credentials",pickerDefaultPermission:"viewer"},playbook:{label:"Playbook",pluralLabel:"Playbooks",collectionKey:"playbooks",pickerDefaultPermission:"editor"},artifact:{label:"Artifact",pluralLabel:"Artifacts",collectionKey:"artifacts",pickerDefaultPermission:"editor"},file:{label:"File",pluralLabel:"Files",collectionKey:"files",pickerDefaultPermission:"viewer"},project:{label:"Project",pluralLabel:"Projects",collectionKey:"projects",pickerDefaultPermission:"viewer"}};ja.RESOURCE_KINDS=Object.keys(ja.RESOURCE_DEFINITIONS);function lde(o){return typeof o=="string"&&Object.prototype.hasOwnProperty.call(ja.RESOURCE_DEFINITIONS,o)}function ude(o){return ja.RESOURCE_DEFINITIONS[o]}});var SQ=f(ae=>{"use strict";Object.defineProperty(ae,"__esModule",{value:!0});ae.RESERVED_ROLE_NAMES=ae.RESERVED_ROLE_IDS=ae.PREDEFINED_ROLE_IDS=void 0;ae.toResourceRef=su;ae.toWildcardResourceRef=cu;ae.getDefaultMemberResourceGrants=dde;ae.parseResourceRef=Qh;ae.getWildcardResourceRef=AQ;ae.normalizeResourcePermissions=gn;ae.permissionSatisfies=_h;ae.highestResourcePermission=Dh;ae.grantHasPermission=Gv;ae.grantMatchesResource=Pc;ae.getEffectiveResourcePermissions=Vv;ae.hasResourcePermission=gde;ae.getRoleResourceGrants=Th;ae.getAllowedResourceIds=vQ;ae.getAllowedResourceIdsForRoles=Rh;ae.getEffectiveResourcePermissionsForRoles=Fc;ae.getAllowedToolIds=wQ;ae.getAllowedSystemIds=xQ;ae.pickLongestHeldResource=hde;ae.getAllowedCredentialsIds=fde;ae.getEffectiveCredentialsPermissions=bde;ae.getEffectiveToolPermissions=yde;ae.getEffectiveSystemPermissions=kde;ae.checkResourcePermission=Nh;ae.isToolAllowed=Ade;ae.isSystemVisible=vde;ae.isPlaybookVisible=wde;ae.hasAllSystems=xde;ae.hasAllTools=zde;ae.getResourceGrantSources=zQ;ae.getSharePermissionForResource=qQ;ae.getAccessRulePermissionForResource=EQ;ae.hasAdminBaseRole=Yv;ae.resolveResourceAccessForRoles=qde;ae.normalizeResourceGrantInput=IQ;ae.normalizeRoleResourceGrantInput=Ede;ae.isPredefinedRole=Ide;ae.isReservedRoleId=jde;ae.isReservedRoleName=Cde;ae.hasRole=Sde;ae.getRoleIds=Bde;ae.getBaseRole=jQ;ae.getBaseRoleId=Qde;ae.getPersonalRole=CQ;ae.getPersonalRoleId=_de;var Sh=Fv(),Bh="*";function su(o,e){if(!e||e===Bh)throw new Error("Resource id is required");return`${o}:${encodeURIComponent(e)}`}function cu(o){return`${o}:${Bh}`}function dde(){return Sh.RESOURCE_KINDS.flatMap(o=>{let e=(0,Sh.getResourceDefinition)(o).memberDefaultPermission;return e?[{resourceRef:cu(o),permissions:[e]}]:[]})}function Qh(o){let e=o.indexOf(":");if(e<=0)return null;let t=o.slice(0,e);if(!(0,Sh.isResourceKind)(t))return null;let a=o.slice(e+1);if(!a)return null;if(a===Bh)return{kind:t,id:Bh,isWildcard:!0};try{return{kind:t,id:decodeURIComponent(a),isWildcard:!1}}catch{return null}}function AQ(o){let e=Qh(o);return e?cu(e.kind):null}function gn(o){let e=new Set;for(let t of o||[])(t==="viewer"||t==="editor")&&e.add(t);return e.has("editor")&&e.add("viewer"),Array.from(e)}function _h(o,e){return o===e||o==="editor"&&e==="viewer"}function Dh(o){let e=gn(o);if(e.includes("editor"))return"editor";if(e.includes("viewer"))return"viewer"}function Gv(o,e){return o.revokedAt?!1:gn(o.permissions).some(t=>_h(t,e))}function Pc(o,e){return o.revokedAt?!1:o.resourceRef===e||o.resourceRef===AQ(e)}function Vv(o,e){let t=new Set;for(let a of o)if(Pc(a,e))for(let i of gn(a.permissions))t.add(i);return Array.from(t)}function gde(o,e,t){return Vv(o,e).some(a=>_h(a,t))}function Th(o){return o.flatMap(e=>e.isBaseRole&&e.id==="admin"?[]:e.resourceGrants||[])}function vQ(o,e,t){let a=cu(e),i=new Set;for(let r of o){if(!Gv(r,t))continue;if(r.resourceRef===a)return;let n=Qh(r.resourceRef);n?.kind===e&&!n.isWildcard&&i.add(n.id)}return Array.from(i)}function Rh(o,e,t){if(!Yv(o))return vQ(Th(o),e,t)}function Fc(o,e,t){return Yv(o)?["editor","viewer"]:Vv(Th(o),su(e,t))}function pde(o){return(0,Sh.getResourceDefinition)(o).label}function wQ(o,e="viewer"){return Rh(o,"tool",e)}function xQ(o,e="viewer"){return Rh(o,"system",e)}var Hv=Number.MAX_SAFE_INTEGER;function $v(o){if(!o)return Hv;let e=new Date(o).getTime();return Number.isNaN(e)?Hv:e}function hde(o,e,t){if(o.length<=1)return o[0];let a=i=>{let r=su(t,i.id),n=Hv;for(let s of e)Pc(s,r)&&(n=Math.min(n,$v(s.createdAt)));return n};return[...o].sort((i,r)=>{let n=a(i)-a(r);return n!==0?n:$v(i.createdAt)-$v(r.createdAt)})[0]}function fde(o,e="viewer"){return Rh(o,"credential",e)}function bde(o,e){return Fc(o,"credential",e)}function yde(o,e){return Fc(o,"tool",e)}function kde(o,e){return Fc(o,"system",e)}function Nh(o,e,t,a){return Fc(o,e,t).some(r=>_h(r,a))?{allowed:!0}:{allowed:!1,error:`${pde(e)} '${t}' requires a '${a}' grant`}}function Ade(o,e,t="viewer"){return Nh(o,"tool",e,t)}function vde(o,e,t="viewer"){return Nh(o,"system",e,t)}function wde(o,e,t="viewer"){return Nh(o,"playbook",e,t)}function xde(o,e="viewer"){return xQ(o,e)===void 0}function zde(o,e="viewer"){return wQ(o,e)===void 0}function zQ(o,e,t="viewer"){let a=new Set;for(let i of o)Pc(i,e)&&Gv(i,t)&&a.add(i.source);return Array.from(a)}function qQ(o,e){let t=o.filter(a=>a.source==="share"&&Pc(a,e)).flatMap(a=>gn(a.permissions));return Dh(t)}function EQ(o,e){let t=o.filter(a=>a.source==="access_rule"&&Pc(a,e)).flatMap(a=>gn(a.permissions));return Dh(t)}function Yv(o){return o.some(e=>e.isBaseRole&&e.id==="admin")}function qde({roles:o,resource:e,userId:t}){let a=su(e.kind,e.id),i=Th(o),r=new Set(Fc(o,e.kind,e.id)),n=new Set(zQ(i,a));e.ownerUserId&&e.ownerUserId===t&&(r.add("editor"),r.add("viewer"),n.add("ownership"));let s=gn(Array.from(r));return{permissions:s,sources:Array.from(n),sharePermission:qQ(i,a),accessRulePermission:EQ(i,a),maxPermission:Dh(s)}}function IQ(o){let e=Qh(o.resourceRef);if(!e)throw new Error(`Invalid resource ref '${o.resourceRef}'`);return{...o,resourceRef:e.isWildcard?cu(e.kind):su(e.kind,e.id),permissions:gn(o.permissions||["viewer"]),source:o.source||"access_rule"}}function Ede(o){let e=IQ({resourceRef:o.resourceRef,permissions:o.permissions,source:"access_rule"});return{resourceRef:e.resourceRef,permissions:e.permissions,source:"access_rule"}}ae.PREDEFINED_ROLE_IDS=["admin","member","service_account"];ae.RESERVED_ROLE_IDS=["admin","member","service_account"];ae.RESERVED_ROLE_NAMES=["member","admin","service account"];function Ide(o){return ae.PREDEFINED_ROLE_IDS.includes(o)}function jde(o){return ae.RESERVED_ROLE_IDS.includes(o)}function Cde(o){return ae.RESERVED_ROLE_NAMES.includes(o.toLowerCase().trim())}function Sde(o,e){return o.some(t=>t.id===e)}function Bde(o){return o.map(e=>e.id)}function jQ(o){let e=o.filter(t=>t.isBaseRole);return e.length===1?e[0]:null}function Qde(o){let e=jQ(o);return e?e.id:null}function CQ(o){return o.find(e=>e.isPersonalRole)||null}function _de(o){let e=CQ(o);return e?e.id:null}});var QQ=f(St=>{"use strict";Object.defineProperty(St,"__esModule",{value:!0});St.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=St.CLIENT_REQUEST_SOURCES=St.REQUEST_SOURCES=void 0;St.isRequestSource=BQ;St.isClientRequestSource=Rde;St.parseRequestSource=Nde;var et=Ht();St.REQUEST_SOURCES=[et.RequestSource.API,et.RequestSource.FRONTEND,et.RequestSource.AGENT,et.RequestSource.SCHEDULER,et.RequestSource.MCP,et.RequestSource.TOOL_CHAIN,et.RequestSource.WEBHOOK,et.RequestSource.CLI];St.CLIENT_REQUEST_SOURCES=[et.RequestSource.FRONTEND,et.RequestSource.AGENT,et.RequestSource.MCP,et.RequestSource.CLI];St.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=[et.RequestSource.FRONTEND,et.RequestSource.AGENT,et.RequestSource.MCP];var Dde=new Set(St.REQUEST_SOURCES),Tde=new Set(St.CLIENT_REQUEST_SOURCES);function BQ(o){return Dde.has(o)}function Rde(o){return Tde.has(o)}function Nde(o){let e=o.toLowerCase();return BQ(e)?e:void 0}});var _Q=f(Oh=>{"use strict";Object.defineProperty(Oh,"__esModule",{value:!0});Oh.contextSourceTemplates=void 0;var Ode={slack:{category:"workspace",systemId:"slack",onboardingOrder:7,onboardingDescription:"Connect joined public channels so superglue can use relevant workspace context."},gmail:{category:"email",systemId:"gmail",onboardingOrder:9,onboardingDescription:"Let superglue access your gmail inbox. superglue will never send emails on your behalf."},fathomMcp:{category:"meetings",systemId:"fathomMcp",onboardingOrder:4,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."},granolaMcp:{category:"meetings",systemId:"granolaMcp",onboardingOrder:2,onboardingDescription:"Let superglue use notes and transcripts. superglue will never join or record meetings."},readAiMcp:{category:"meetings",systemId:"read-ai",onboardingOrder:6,onboardingDescription:"Let superglue use meeting summaries and transcripts. superglue will never join or record meetings."},otterMcp:{category:"meetings",systemId:"otter",onboardingOrder:7,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."},googleDrive:{category:"workspace",systemId:"google-drive",onboardingOrder:9,onboardingDescription:"Connect accessible Drive files for relevant workspace context."},box:{category:"workspace",systemId:"box",onboardingOrder:11,onboardingDescription:"Connect accessible Box files for relevant workspace context."},dropbox:{category:"workspace",systemId:"dropbox",onboardingOrder:12,onboardingDescription:"Connect accessible Dropbox files for relevant workspace context."},jira:{category:"workspace",systemId:"jira",onboardingOrder:13,onboardingDescription:"Connect Jira projects, issues, and comments for relevant workspace context."},notion:{category:"workspace",systemId:"notion",onboardingOrder:8,onboardingDescription:"Connect selected Notion pages for relevant workspace context."},sharepoint:{category:"workspace",systemId:"sharepoint",onboardingOrder:10,onboardingDescription:"Connect accessible SharePoint sites and files for workspace context."},microsoftTeams:{category:"workspace",systemId:"microsoft-teams",onboardingOrder:6,onboardingDescription:"Connect Microsoft Teams channels and meetings for workspace context."},outlookMail:{category:"email",systemId:"outlook-mail",onboardingOrder:8,onboardingDescription:"Let superglue access your outlook inbox. superglue will never send emails on your behalf."},circleback:{category:"meetings",systemId:"circleback",onboardingOrder:1,onboardingDescription:"Let superglue use notes and transcripts. superglue will never join or record meetings.",endpointAliases:["https://app.circleback.ai/api/mcp"]},fireflies:{category:"meetings",systemId:"fireflies",onboardingOrder:3,onboardingDescription:"Let superglue use transcripts and summaries. superglue will never join or record meetings."},fellowMcp:{category:"meetings",systemId:"fellow",onboardingOrder:5,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."}};Oh.contextSourceTemplates=Ode});var Wv=f(Oe=>{"use strict";Object.defineProperty(Oe,"__esModule",{value:!0});Oe.systemOptions=Oe.systems=void 0;Oe.getSystemTemplateOAuthClientMode=Mde;Oe.getSystemTemplateAuthentication=RQ;Oe.mergeSystemTemplateAuthentication=NQ;Oe.resolveSystemAuthentication=Jv;Oe.getContextSourceTemplates=OQ;Oe.resolveContextSourceSetup=Yde;Oe.findTemplateForSystem=Mh;Oe.uniqueKeywords=Jde;Oe.getOAuthConfig=Wde;Oe.getOAuthTokenExchangeConfig=Zde;Oe.getOAuthTokenUrl=Kde;var TQ=iu(),Ude=_Q(),Uh=jh();function Mde(o){let e=o?.oauth;if(e)return e.registrationUrl?"dynamic":e.managed?"managed":"custom"}function Lde(o){let e=o?.split(/[,\s]+/).filter(Boolean);return e?.length?e:void 0}function RQ(o){if(!o?.preferredAuthType)return;if(o.preferredAuthType!=="oauth2")return{type:o.preferredAuthType};let e=o.oauth;if(!e)return{type:"oauth2"};let t={};e.tokenAuthMethod&&(t.tokenAuthMethod=e.tokenAuthMethod),e.tokenContentType&&(t.tokenContentType=e.tokenContentType),e.extraHeaders&&(t.extraHeaders=e.extraHeaders),e.extraBodyParams&&(t.extraBodyParams=e.extraBodyParams),e.usePKCE!==void 0&&(t.usePKCE=e.usePKCE),e.resource&&(t.resource=e.resource);let a=Lde(e.scopes);return{type:"oauth2",...e.registrationUrl?{oauthClientMode:"dynamic"}:{},...e.authUrl?{authUrl:e.authUrl}:{},...e.tokenUrl?{tokenUrl:e.tokenUrl}:{},...e.grant_type?{grantType:e.grant_type}:{},...a?{scopes:a}:{},...Object.keys(t).length?{config:t}:{}}}function Pde(o){return!o.config||Object.keys(o.config).length===0}function Fde(o,e){let t={...o||{},...e||{}};return Object.keys(t).length>0?t:void 0}function $de(o,e){if(e)return{...o,config:e};let{config:t,...a}=o;return a}function NQ({authentication:o,template:e}){let t=RQ(e),a=(0,TQ.normalizeSystemAuthentication)(o);return a?t?a.type==="none"&&Pde(a)?t:a.type!==t.type?a:$de({...t,...a},Fde(t.config,a.config)):a:t}function Jv(o){let e=(0,TQ.normalizeSystemAuthentication)(o.authentication)||{type:"none"};return NQ({authentication:e,template:Mh(o)?.template})||e}var Hde={postgres:{name:"postgres",apiUrl:"postgres://<<username>>:<<password>>@<<host>>:<<port>>/<<database>>",regex:"^.*(postgres|postgresql).*$",icon:"postgresql",docsUrl:"",preferredAuthType:"connection_string",connectionFields:[{key:"host",label:"Host",placeholder:"db.example.com",required:!0},{key:"port",label:"Port",type:"number",defaultValue:"5432",placeholder:"5432"},{key:"database",label:"Database",placeholder:"mydb",required:!0},{key:"username",label:"Username",placeholder:"postgres",required:!0},{key:"password",label:"Password",type:"password",required:!0}],keywords:["database","sql","postgres","postgresql","api key","tables"]},mssql:{name:"mssql",apiUrl:"mssql://<<username>>:<<password>>@<<host>>:<<port>>/<<database>>",regex:"^.*\\b(mssql|sql[\\s._-]?server).*$",icon:"lucide:database",docsUrl:"https://learn.microsoft.com/en-us/sql/sql-server/connect-to-database-engine",preferredAuthType:"connection_string",connectionFields:[{key:"host",label:"Host",placeholder:"sql.example.com",required:!0},{key:"port",label:"Port",type:"number",defaultValue:"1433",placeholder:"1433"},{key:"database",label:"Database",placeholder:"mydb",required:!0},{key:"username",label:"Username",required:!0},{key:"password",label:"Password",type:"password",required:!0}],systemSpecificInstructions:`TCP/IP must be enabled on SQL Server. SQL Server logins require mixed-mode authentication.
|
|
604
|
+
`);if(t.length>bQ.PLAYBOOK_LIMITS.compiledRender)throw new Error(`Compiled playbook render for '${o.id}' exceeds ${bQ.PLAYBOOK_LIMITS.compiledRender} chars (${t.length})`);return t}});var kQ=f(xr=>{"use strict";Object.defineProperty(xr,"__esModule",{value:!0});xr.PROJECT_LIMITS=xr.PROJECT_TASK_STATUSES=xr.PROJECT_RESOURCE_TYPES=void 0;xr.projectResourceKey=mde;xr.PROJECT_RESOURCE_TYPES=["system","playbook","artifact","file","tool"];xr.PROJECT_TASK_STATUSES=["not_started","in_progress","waiting","done"];xr.PROJECT_LIMITS={name:80,description:500,taskName:120,taskDescription:5e3,taskResources:100};function mde(o){return`${o.type}:${o.id}`}});var Fv=f(ja=>{"use strict";Object.defineProperty(ja,"__esModule",{value:!0});ja.RESOURCE_KINDS=ja.RESOURCE_DEFINITIONS=void 0;ja.isResourceKind=lde;ja.getResourceDefinition=ude;ja.RESOURCE_DEFINITIONS={tool:{label:"Tool",pluralLabel:"Tools",collectionKey:"tools",memberDefaultPermission:"editor",pickerDefaultPermission:"editor"},system:{label:"System",pluralLabel:"Systems",collectionKey:"systems",memberDefaultPermission:"editor",pickerDefaultPermission:"editor"},credential:{label:"Credential",pluralLabel:"Credentials",collectionKey:"credentials",pickerDefaultPermission:"viewer"},playbook:{label:"Playbook",pluralLabel:"Playbooks",collectionKey:"playbooks",pickerDefaultPermission:"editor"},artifact:{label:"Artifact",pluralLabel:"Artifacts",collectionKey:"artifacts",pickerDefaultPermission:"editor"},file:{label:"File",pluralLabel:"Files",collectionKey:"files",pickerDefaultPermission:"viewer"},project:{label:"Project",pluralLabel:"Projects",collectionKey:"projects",pickerDefaultPermission:"viewer"}};ja.RESOURCE_KINDS=Object.keys(ja.RESOURCE_DEFINITIONS);function lde(o){return typeof o=="string"&&Object.prototype.hasOwnProperty.call(ja.RESOURCE_DEFINITIONS,o)}function ude(o){return ja.RESOURCE_DEFINITIONS[o]}});var SQ=f(ae=>{"use strict";Object.defineProperty(ae,"__esModule",{value:!0});ae.RESERVED_ROLE_NAMES=ae.RESERVED_ROLE_IDS=ae.PREDEFINED_ROLE_IDS=void 0;ae.toResourceRef=su;ae.toWildcardResourceRef=cu;ae.getDefaultMemberResourceGrants=dde;ae.parseResourceRef=Qh;ae.getWildcardResourceRef=AQ;ae.normalizeResourcePermissions=gn;ae.permissionSatisfies=_h;ae.highestResourcePermission=Dh;ae.grantHasPermission=Gv;ae.grantMatchesResource=Pc;ae.getEffectiveResourcePermissions=Vv;ae.hasResourcePermission=gde;ae.getRoleResourceGrants=Th;ae.getAllowedResourceIds=vQ;ae.getAllowedResourceIdsForRoles=Rh;ae.getEffectiveResourcePermissionsForRoles=Fc;ae.getAllowedToolIds=wQ;ae.getAllowedSystemIds=xQ;ae.pickLongestHeldResource=hde;ae.getAllowedCredentialsIds=fde;ae.getEffectiveCredentialsPermissions=bde;ae.getEffectiveToolPermissions=yde;ae.getEffectiveSystemPermissions=kde;ae.checkResourcePermission=Nh;ae.isToolAllowed=Ade;ae.isSystemVisible=vde;ae.isPlaybookVisible=wde;ae.hasAllSystems=xde;ae.hasAllTools=zde;ae.getResourceGrantSources=zQ;ae.getSharePermissionForResource=qQ;ae.getAccessRulePermissionForResource=EQ;ae.hasAdminBaseRole=Yv;ae.resolveResourceAccessForRoles=qde;ae.normalizeResourceGrantInput=IQ;ae.normalizeRoleResourceGrantInput=Ede;ae.isPredefinedRole=Ide;ae.isReservedRoleId=jde;ae.isReservedRoleName=Cde;ae.hasRole=Sde;ae.getRoleIds=Bde;ae.getBaseRole=jQ;ae.getBaseRoleId=Qde;ae.getPersonalRole=CQ;ae.getPersonalRoleId=_de;var Sh=Fv(),Bh="*";function su(o,e){if(!e||e===Bh)throw new Error("Resource id is required");return`${o}:${encodeURIComponent(e)}`}function cu(o){return`${o}:${Bh}`}function dde(){return Sh.RESOURCE_KINDS.flatMap(o=>{let e=(0,Sh.getResourceDefinition)(o).memberDefaultPermission;return e?[{resourceRef:cu(o),permissions:[e]}]:[]})}function Qh(o){let e=o.indexOf(":");if(e<=0)return null;let t=o.slice(0,e);if(!(0,Sh.isResourceKind)(t))return null;let a=o.slice(e+1);if(!a)return null;if(a===Bh)return{kind:t,id:Bh,isWildcard:!0};try{return{kind:t,id:decodeURIComponent(a),isWildcard:!1}}catch{return null}}function AQ(o){let e=Qh(o);return e?cu(e.kind):null}function gn(o){let e=new Set;for(let t of o||[])(t==="viewer"||t==="editor")&&e.add(t);return e.has("editor")&&e.add("viewer"),Array.from(e)}function _h(o,e){return o===e||o==="editor"&&e==="viewer"}function Dh(o){let e=gn(o);if(e.includes("editor"))return"editor";if(e.includes("viewer"))return"viewer"}function Gv(o,e){return o.revokedAt?!1:gn(o.permissions).some(t=>_h(t,e))}function Pc(o,e){return o.revokedAt?!1:o.resourceRef===e||o.resourceRef===AQ(e)}function Vv(o,e){let t=new Set;for(let a of o)if(Pc(a,e))for(let i of gn(a.permissions))t.add(i);return Array.from(t)}function gde(o,e,t){return Vv(o,e).some(a=>_h(a,t))}function Th(o){return o.flatMap(e=>e.isBaseRole&&e.id==="admin"?[]:e.resourceGrants||[])}function vQ(o,e,t){let a=cu(e),i=new Set;for(let r of o){if(!Gv(r,t))continue;if(r.resourceRef===a)return;let n=Qh(r.resourceRef);n?.kind===e&&!n.isWildcard&&i.add(n.id)}return Array.from(i)}function Rh(o,e,t){if(!Yv(o))return vQ(Th(o),e,t)}function Fc(o,e,t){return Yv(o)?["editor","viewer"]:Vv(Th(o),su(e,t))}function pde(o){return(0,Sh.getResourceDefinition)(o).label}function wQ(o,e="viewer"){return Rh(o,"tool",e)}function xQ(o,e="viewer"){return Rh(o,"system",e)}var Hv=Number.MAX_SAFE_INTEGER;function $v(o){if(!o)return Hv;let e=new Date(o).getTime();return Number.isNaN(e)?Hv:e}function hde(o,e,t){if(o.length<=1)return o[0];let a=i=>{let r=su(t,i.id),n=Hv;for(let s of e)Pc(s,r)&&(n=Math.min(n,$v(s.createdAt)));return n};return[...o].sort((i,r)=>{let n=a(i)-a(r);return n!==0?n:$v(i.createdAt)-$v(r.createdAt)})[0]}function fde(o,e="viewer"){return Rh(o,"credential",e)}function bde(o,e){return Fc(o,"credential",e)}function yde(o,e){return Fc(o,"tool",e)}function kde(o,e){return Fc(o,"system",e)}function Nh(o,e,t,a){return Fc(o,e,t).some(r=>_h(r,a))?{allowed:!0}:{allowed:!1,error:`${pde(e)} '${t}' requires a '${a}' grant`}}function Ade(o,e,t="viewer"){return Nh(o,"tool",e,t)}function vde(o,e,t="viewer"){return Nh(o,"system",e,t)}function wde(o,e,t="viewer"){return Nh(o,"playbook",e,t)}function xde(o,e="viewer"){return xQ(o,e)===void 0}function zde(o,e="viewer"){return wQ(o,e)===void 0}function zQ(o,e,t="viewer"){let a=new Set;for(let i of o)Pc(i,e)&&Gv(i,t)&&a.add(i.source);return Array.from(a)}function qQ(o,e){let t=o.filter(a=>a.source==="share"&&Pc(a,e)).flatMap(a=>gn(a.permissions));return Dh(t)}function EQ(o,e){let t=o.filter(a=>a.source==="access_rule"&&Pc(a,e)).flatMap(a=>gn(a.permissions));return Dh(t)}function Yv(o){return o.some(e=>e.isBaseRole&&e.id==="admin")}function qde({roles:o,resource:e,userId:t}){let a=su(e.kind,e.id),i=Th(o),r=new Set(Fc(o,e.kind,e.id)),n=new Set(zQ(i,a));e.ownerUserId&&e.ownerUserId===t&&(r.add("editor"),r.add("viewer"),n.add("ownership"));let s=gn(Array.from(r));return{permissions:s,sources:Array.from(n),sharePermission:qQ(i,a),accessRulePermission:EQ(i,a),maxPermission:Dh(s)}}function IQ(o){let e=Qh(o.resourceRef);if(!e)throw new Error(`Invalid resource ref '${o.resourceRef}'`);return{...o,resourceRef:e.isWildcard?cu(e.kind):su(e.kind,e.id),permissions:gn(o.permissions||["viewer"]),source:o.source||"access_rule"}}function Ede(o){let e=IQ({resourceRef:o.resourceRef,permissions:o.permissions,source:"access_rule"});return{resourceRef:e.resourceRef,permissions:e.permissions,source:"access_rule"}}ae.PREDEFINED_ROLE_IDS=["admin","member","service_account"];ae.RESERVED_ROLE_IDS=["admin","member","service_account"];ae.RESERVED_ROLE_NAMES=["member","admin","service account"];function Ide(o){return ae.PREDEFINED_ROLE_IDS.includes(o)}function jde(o){return ae.RESERVED_ROLE_IDS.includes(o)}function Cde(o){return ae.RESERVED_ROLE_NAMES.includes(o.toLowerCase().trim())}function Sde(o,e){return o.some(t=>t.id===e)}function Bde(o){return o.map(e=>e.id)}function jQ(o){let e=o.filter(t=>t.isBaseRole);return e.length===1?e[0]:null}function Qde(o){let e=jQ(o);return e?e.id:null}function CQ(o){return o.find(e=>e.isPersonalRole)||null}function _de(o){let e=CQ(o);return e?e.id:null}});var QQ=f(St=>{"use strict";Object.defineProperty(St,"__esModule",{value:!0});St.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=St.CLIENT_REQUEST_SOURCES=St.REQUEST_SOURCES=void 0;St.isRequestSource=BQ;St.isClientRequestSource=Rde;St.parseRequestSource=Nde;var et=Ht();St.REQUEST_SOURCES=[et.RequestSource.API,et.RequestSource.FRONTEND,et.RequestSource.AGENT,et.RequestSource.SCHEDULER,et.RequestSource.MCP,et.RequestSource.TOOL_CHAIN,et.RequestSource.WEBHOOK,et.RequestSource.CLI];St.CLIENT_REQUEST_SOURCES=[et.RequestSource.FRONTEND,et.RequestSource.AGENT,et.RequestSource.MCP,et.RequestSource.CLI];St.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=[et.RequestSource.FRONTEND,et.RequestSource.AGENT,et.RequestSource.MCP];var Dde=new Set(St.REQUEST_SOURCES),Tde=new Set(St.CLIENT_REQUEST_SOURCES);function BQ(o){return Dde.has(o)}function Rde(o){return Tde.has(o)}function Nde(o){let e=o.toLowerCase();return BQ(e)?e:void 0}});var _Q=f(Oh=>{"use strict";Object.defineProperty(Oh,"__esModule",{value:!0});Oh.contextSourceTemplates=void 0;var Ode={slack:{category:"workspace",systemId:"slack",onboardingOrder:7,onboardingDescription:"Connect joined public channels so superglue can use relevant workspace context."},gmail:{category:"email",systemId:"gmail",onboardingOrder:9,onboardingDescription:"Let superglue access your gmail inbox. superglue will never send emails on your behalf."},fathomMcp:{category:"meetings",systemId:"fathomMcp",onboardingOrder:4,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."},granolaMcp:{category:"meetings",systemId:"granolaMcp",onboardingOrder:2,onboardingDescription:"Let superglue use notes and transcripts. superglue will never join or record meetings."},readAiMcp:{category:"meetings",systemId:"read-ai",onboardingOrder:6,onboardingDescription:"Let superglue use meeting summaries and transcripts. superglue will never join or record meetings."},otterMcp:{category:"meetings",systemId:"otter",onboardingOrder:7,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."},googleDrive:{category:"workspace",systemId:"google-drive",onboardingOrder:9,onboardingDescription:"Connect accessible Drive files for relevant workspace context."},box:{category:"workspace",systemId:"box",onboardingOrder:11,onboardingDescription:"Connect accessible Box files for relevant workspace context."},dropbox:{category:"workspace",systemId:"dropbox",onboardingOrder:12,onboardingDescription:"Connect accessible Dropbox files for relevant workspace context."},jira:{category:"workspace",systemId:"jira",onboardingOrder:13,onboardingDescription:"Connect Jira projects, issues, and comments for relevant workspace context."},rocketlaneMcp:{category:"workspace",systemId:"rocketlane",onboardingOrder:14,onboardingDescription:"Connect Rocketlane projects, tasks, and status for relevant workspace context."},notion:{category:"workspace",systemId:"notion",onboardingOrder:8,onboardingDescription:"Connect selected Notion pages for relevant workspace context."},sharepoint:{category:"workspace",systemId:"sharepoint",onboardingOrder:10,onboardingDescription:"Connect accessible SharePoint sites and files for workspace context."},microsoftTeams:{category:"workspace",systemId:"microsoft-teams",onboardingOrder:6,onboardingDescription:"Connect Microsoft Teams channels and meetings for workspace context."},outlookMail:{category:"email",systemId:"outlook-mail",onboardingOrder:8,onboardingDescription:"Let superglue access your outlook inbox. superglue will never send emails on your behalf."},circleback:{category:"meetings",systemId:"circleback",onboardingOrder:1,onboardingDescription:"Let superglue use notes and transcripts. superglue will never join or record meetings.",endpointAliases:["https://app.circleback.ai/api/mcp"]},fireflies:{category:"meetings",systemId:"fireflies",onboardingOrder:3,onboardingDescription:"Let superglue use transcripts and summaries. superglue will never join or record meetings."},fellowMcp:{category:"meetings",systemId:"fellow",onboardingOrder:5,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."}};Oh.contextSourceTemplates=Ode});var Wv=f(Oe=>{"use strict";Object.defineProperty(Oe,"__esModule",{value:!0});Oe.systemOptions=Oe.systems=void 0;Oe.getSystemTemplateOAuthClientMode=Mde;Oe.getSystemTemplateAuthentication=RQ;Oe.mergeSystemTemplateAuthentication=NQ;Oe.resolveSystemAuthentication=Jv;Oe.getContextSourceTemplates=OQ;Oe.resolveContextSourceSetup=Yde;Oe.findTemplateForSystem=Mh;Oe.uniqueKeywords=Jde;Oe.getOAuthConfig=Wde;Oe.getOAuthTokenExchangeConfig=Zde;Oe.getOAuthTokenUrl=Kde;var TQ=iu(),Ude=_Q(),Uh=jh();function Mde(o){let e=o?.oauth;if(e)return e.registrationUrl?"dynamic":e.managed?"managed":"custom"}function Lde(o){let e=o?.split(/[,\s]+/).filter(Boolean);return e?.length?e:void 0}function RQ(o){if(!o?.preferredAuthType)return;if(o.preferredAuthType!=="oauth2")return{type:o.preferredAuthType};let e=o.oauth;if(!e)return{type:"oauth2"};let t={};e.tokenAuthMethod&&(t.tokenAuthMethod=e.tokenAuthMethod),e.tokenContentType&&(t.tokenContentType=e.tokenContentType),e.extraHeaders&&(t.extraHeaders=e.extraHeaders),e.extraBodyParams&&(t.extraBodyParams=e.extraBodyParams),e.usePKCE!==void 0&&(t.usePKCE=e.usePKCE),e.resource&&(t.resource=e.resource);let a=Lde(e.scopes);return{type:"oauth2",...e.registrationUrl?{oauthClientMode:"dynamic"}:{},...e.authUrl?{authUrl:e.authUrl}:{},...e.tokenUrl?{tokenUrl:e.tokenUrl}:{},...e.grant_type?{grantType:e.grant_type}:{},...a?{scopes:a}:{},...Object.keys(t).length?{config:t}:{}}}function Pde(o){return!o.config||Object.keys(o.config).length===0}function Fde(o,e){let t={...o||{},...e||{}};return Object.keys(t).length>0?t:void 0}function $de(o,e){if(e)return{...o,config:e};let{config:t,...a}=o;return a}function NQ({authentication:o,template:e}){let t=RQ(e),a=(0,TQ.normalizeSystemAuthentication)(o);return a?t?a.type==="none"&&Pde(a)?t:a.type!==t.type?a:$de({...t,...a},Fde(t.config,a.config)):a:t}function Jv(o){let e=(0,TQ.normalizeSystemAuthentication)(o.authentication)||{type:"none"};return NQ({authentication:e,template:Mh(o)?.template})||e}var Hde={postgres:{name:"postgres",apiUrl:"postgres://<<username>>:<<password>>@<<host>>:<<port>>/<<database>>",regex:"^.*(postgres|postgresql).*$",icon:"postgresql",docsUrl:"",preferredAuthType:"connection_string",connectionFields:[{key:"host",label:"Host",placeholder:"db.example.com",required:!0},{key:"port",label:"Port",type:"number",defaultValue:"5432",placeholder:"5432"},{key:"database",label:"Database",placeholder:"mydb",required:!0},{key:"username",label:"Username",placeholder:"postgres",required:!0},{key:"password",label:"Password",type:"password",required:!0}],keywords:["database","sql","postgres","postgresql","api key","tables"]},mssql:{name:"mssql",apiUrl:"mssql://<<username>>:<<password>>@<<host>>:<<port>>/<<database>>",regex:"^.*\\b(mssql|sql[\\s._-]?server).*$",icon:"lucide:database",docsUrl:"https://learn.microsoft.com/en-us/sql/sql-server/connect-to-database-engine",preferredAuthType:"connection_string",connectionFields:[{key:"host",label:"Host",placeholder:"sql.example.com",required:!0},{key:"port",label:"Port",type:"number",defaultValue:"1433",placeholder:"1433"},{key:"database",label:"Database",placeholder:"mydb",required:!0},{key:"username",label:"Username",required:!0},{key:"password",label:"Password",type:"password",required:!0}],systemSpecificInstructions:`TCP/IP must be enabled on SQL Server. SQL Server logins require mixed-mode authentication.
|
|
605
605
|
|
|
606
606
|
Default instances typically use TCP port 1433. Named instances can use dynamic ports and SQL Server Browser on UDP 1434; request the instance's actual TCP port when direct connections fail.`,keywords:["database","sql","sql server","mssql","transact-sql","t-sql","table","schema","view","stored procedure"]},redis_direct:{name:"redis_direct",apiUrl:"redis://<<username>>:<<password>>@<<host>>:<<port>>/<<database>>",regex:"^.*(rediss?://).*$",icon:"redis",docsUrl:"https://redis.io/docs/latest/commands/",preferredAuthType:"connection_string",connectionFields:[{key:"host",label:"Host",placeholder:"redis.example.com",required:!0},{key:"port",label:"Port",type:"number",defaultValue:"6379",placeholder:"6379"},{key:"database",label:"Database Index",placeholder:"0"},{key:"username",label:"Username",placeholder:"default"},{key:"password",label:"Password",type:"password",required:!0}],keywords:["database","cache","redis","key-value","nosql"]},mongodb_direct:{name:"mongodb_direct",apiUrl:"mongodb://<<username>>:<<password>>@<<host>>:<<port>>/<<database>>?authSource=admin",regex:"^.*(mongodb(\\+srv)?://).*$",icon:"mongodb",docsUrl:"https://www.mongodb.com/docs/manual/reference/method/",preferredAuthType:"connection_string",connectionFields:[{key:"host",label:"Host",placeholder:"cluster.example.com",required:!0},{key:"port",label:"Port",type:"number",defaultValue:"27017",placeholder:"27017"},{key:"database",label:"Database",placeholder:"mydb",required:!0},{key:"username",label:"Username",placeholder:"admin"},{key:"password",label:"Password",type:"password"}],keywords:["database","mongodb","mongo","nosql","document","collection","atlas"]},azure_sql:{name:"azure_sql",apiUrl:"mssql://<<user>>:<<password>>@<<host>>:1433/<<database>>",regex:"^.*(azure.*sql|sql.*azure|database\\.windows\\.net).*$",icon:"/logos/azure_sql.svg",docsUrl:"https://learn.microsoft.com/en-us/azure/azure-sql/",preferredAuthType:"connection_string",connectionFields:[{key:"host",label:"Host",placeholder:"myserver.database.windows.net",required:!0},{key:"database",label:"Database",placeholder:"mydb",required:!0},{key:"user",label:"Username",placeholder:"user@domain.com",required:!0},{key:"password",label:"Password",type:"password",required:!0},{key:"authType",label:"Auth Type",placeholder:"azure-active-directory-password"},{key:"clientId",label:"Client ID",placeholder:"App Registration client ID"},{key:"clientSecret",label:"Client Secret",type:"password",placeholder:"Service principal secret"},{key:"tenantId",label:"Tenant ID",placeholder:"Azure AD directory ID"}],systemSpecificInstructions:`Azure SQL supports two authentication modes:
|
|
607
607
|
|
|
@@ -634,7 +634,7 @@ Authentication is not sent as Authorization: Bearer. First call POST /openapi/v1
|
|
|
634
634
|
|
|
635
635
|
API keys are generated by a Jisr Admin in Settings > Webhook & API Keys > API Keys. Enabled API and lookup permissions control which endpoints and fields are accessible, the secret can only be copied once, and employee financial fields require the "Get Employee Financial Info" permission.
|
|
636
636
|
|
|
637
|
-
Most list endpoints paginate with page plus rpp or limit, capped at 100 records per page. Payroll and accrual endpoints often require specific type values, paygroup filters, and pay period dates set to the first day of a confirmed month. Some payroll endpoints, including employee monthly payables and payroll transaction deletion, are available only for whitelisted organizations.`},attio:{name:"attio",apiUrl:"https://api.attio.com/v2/",regex:"^.*attio.*$",icon:"/logos/attio.svg",docsUrl:"https://docs.attio.com/rest-api/overview",openApiUrl:"https://api.attio.com/openapi/api",preferredAuthType:"api_key",keywords:["people","objects","records","lists","entries","workspace_members","notes","tasks","threads","comments","sorts","api_slug","attribute_type","record_id","workspace_id","object_id"]},twilio:{name:"twilio",apiUrl:"https://api.twilio.com",regex:"^.*twilio.*$",icon:"/logos/twilio.svg",docsUrl:"https://www.twilio.com/docs/api",openApiUrl:"https://raw.githubusercontent.com/twilio/twilio-oai/refs/heads/main/spec/json/twilio_api_v2010.json",preferredAuthType:"api_key",keywords:["Messages","Media","MessageFeedback","Calls","Accounts","APIKeys","Addresses","UsageRecords","CallFeedback","CredentialsList","TaskRouter_Workspaces","TaskRouter_Tasks","TaskRouter_Workers","TaskRouter_Activities","MessagingServices"]},sendgrid:{name:"sendgrid",apiUrl:"https://api.sendgrid.com",regex:"^.*sendgrid.*$",icon:"/logos/sendgrid.svg",docsUrl:"https://www.twilio.com/docs/sendgrid/api-reference",openApiUrl:"https://raw.githubusercontent.com/sendgrid/sendgrid-oai/main/oai.json",preferredAuthType:"api_key",keywords:["mail_send","templates","campaigns","marketing_contacts","marketing_lists","suppression_groups","global_suppressions","asm_suppressions","subusers","stats","categories","whitelabel","ips","access_settings"]},github:{name:"github",apiUrl:"https://api.github.com",regex:"^.*github.*$",icon:"github",docsUrl:"https://docs.github.com/en/rest",openApiUrl:"https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json",preferredAuthType:"api_key",oauth:{authUrl:"https://github.com/login/oauth/authorize",tokenUrl:"https://github.com/login/oauth/access_token",scopes:"repo user admin:org workflow gist notifications delete_repo write:packages read:packages"},keywords:["repositories","issues","pull_requests","commits","branches","tags","releases","deployments","check_runs","actions_artifacts","organizations","packages","collaborators","gists","milestones"]},gitlab:{name:"gitlab",apiUrl:"https://api.gitlab.com",regex:"^.*gitlab.*$",icon:"gitlab",docsUrl:"https://docs.gitlab.com/api/rest/",openApiUrl:"https://gitlab.com/gitlab-org/gitlab/-/raw/master/doc/api/openapi/openapi.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://gitlab.com/oauth/authorize",tokenUrl:"https://gitlab.com/oauth/token",scopes:"api"},keywords:["projects","repositories","issues","pull_requests","commits","branches","tags","releases","deployments","check_runs","actions_artifacts","organizations","packages","collaborators","gists","milestones"]},bitbucket:{name:"bitbucket",apiUrl:"https://api.bitbucket.org",regex:"^.*bitbucket.*$",icon:"bitbucket",docsUrl:"https://developer.atlassian.com/cloud/bitbucket/rest",openApiUrl:"https://api.bitbucket.org/swagger.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://bitbucket.org/site/oauth2/authorize",tokenUrl:"https://bitbucket.org/site/oauth2/access_token",scopes:"repository:admin account:write team:write webhook"},keywords:["repositories","projects","commits","branches","pullrequests","downloads","issues","pipelines","branchRestrictions","components","milestones","refs","hooks","forks","user"]},slack:{name:"slack",label:"Slack",apiUrl:"https://slack.com/api",regex:"^.*slack.*$",icon:"slack",docsUrl:"https://docs.slack.dev/apis/web-api/",openApiUrl:"https://raw.githubusercontent.com/slackapi/slack-api-specs/master/web-api/slack_web_openapi_v2.json",preferredAuthType:"oauth2",oauth:{grant_type:"authorization_code",authUrl:"https://slack.com/oauth/v2/authorize",tokenUrl:"https://slack.com/api/oauth.v2.access",scopes:"channels:history channels:join channels:read files:read users:read users:read.email",managed:!0},keywords:["channel","conversation","user","file","event","message","workflow_step","workflow_published","workflow_step_execute","usergroup","im","mpim","group","check_run","apps_permissions_resource"],systemSpecificInstructions:"Slack OAuth returns a bot token. Bot access depends on its granted scopes and channel membership."},airtable:{name:"airtable",apiUrl:"https://api.airtable.com",regex:"^.*airtable.*$",icon:"airtable",docsUrl:"https://airtable.com/developers/web/api",preferredAuthType:"oauth2",oauth:{authUrl:"https://airtable.com/oauth2/v1/authorize",tokenUrl:"https://airtable.com/oauth2/v1/token",scopes:"data.recordComments:read data.recordComments:write data.records:read data.records:write schema.bases:read schema.bases:write user.email:read enterprise.groups:read data.records:manage enterprise.account:read enterprise.account:write enterprise.auditLogs:read enterprise.changeEvents:read enterprise.exports:manage enterprise.groups:manage enterprise.scim.usersAndGroups:manage enterprise.user:read enterprise.user:write webhook:manage",managed:!0,usePKCE:!0,tokenAuthMethod:"basic_auth",tokenContentType:"form"},keywords:["bases","tables","records","fields","views","formulas","attachments","comments","collaborators","metadata","schemas","api key","key"]},gmail:{name:"gmail",label:"Gmail",apiUrl:"https://gmail.googleapis.com/gmail/v1",regex:"^.*(gmail\\.googleapis|developers\\.google\\.com/gmail|mail\\.google).*$",icon:"gmail",docsUrl:"https://developers.google.com/gmail/api/reference/rest",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/gmail.readonly"},keywords:["messages","threads","labels","drafts","send","attachments","history","filters","settings","forwarding","inbox","profile","oauth"]},googleWorkspace:{name:"googleWorkspace",label:"Google Workspace",apiUrl:"https://www.googleapis.com",regex:"^.*(workspace\\.google\\.com|developers\\.google\\.com/workspace(?!/tasks)).*$",icon:"/logos/google.svg",docsUrl:"https://developers.google.com/workspace",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["openid","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/userinfo.profile","https://www.googleapis.com/auth/calendar","https://www.googleapis.com/auth/calendar.settings.readonly","https://www.googleapis.com/auth/documents","https://www.googleapis.com/auth/spreadsheets","https://www.googleapis.com/auth/presentations","https://www.googleapis.com/auth/forms.body","https://www.googleapis.com/auth/forms.responses.readonly","https://www.googleapis.com/auth/gmail.send","https://www.googleapis.com/auth/contacts","https://www.googleapis.com/auth/contacts.other.readonly","https://www.googleapis.com/auth/directory.readonly","https://www.googleapis.com/auth/tasks","https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive.appdata"].join(" "),managed:!0},systemSpecificInstructions:"superglue provides a managed Google Workspace OAuth app; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. The System URL is the shared Google API host; address each product by its own path prefix or host: Calendar /calendar/v3, Docs https://docs.googleapis.com/v1, Sheets https://sheets.googleapis.com/v4, Slides https://slides.googleapis.com/v1, Forms https://forms.googleapis.com/v1, Gmail https://gmail.googleapis.com/gmail/v1 (send only, via POST /users/me/messages/send with a base64url RFC 5322 message; use it only when the user explicitly asks to send), People https://people.googleapis.com/v1 (contacts, otherContacts, and people:searchDirectoryPeople for the Workspace directory; directory search requires a Google Workspace account), Tasks https://tasks.googleapis.com/tasks/v1, Drive https://www.googleapis.com/drive/v3 (drive.file scope: only files created or opened through this app). Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days.",keywords:["workspace","calendar","events","docs","documents","sheets","spreadsheets","slides","presentations","forms","responses","gmail","send email","contacts","people","directory","tasks","oauth"]},granola:{name:"granola",label:"Granola API",apiUrl:"https://public-api.granola.ai",regex:"^.*granola.*$",icon:"/logos/granola.svg",docsUrl:"https://docs.granola.ai",preferredAuthType:"api_key",keywords:["meeting","notes","transcript","summary","ai","recording"]},fathom:{name:"fathom",apiUrl:"https://api.fathom.ai/external/v1",regex:"^.*(fathom\\.ai|fathom\\.video).*$",icon:"/logos/fathom.png",docsUrl:"https://developers.fathom.ai",openApiUrl:"https://developers.fathom.ai/api-reference/openapi.yaml",preferredAuthType:"oauth2",oauth:{grant_type:"authorization_code",authUrl:"https://fathom.video/external/v1/oauth2/authorize",tokenUrl:"https://api.fathom.ai/external/v1/oauth2/token",scopes:"public_api",managed:!0},keywords:["meeting","meetings","notetaker","transcript","transcription","recording","summary","action items","webhook","oauth"],systemSpecificInstructions:"Fathom is an AI meeting notetaker. superglue provides a managed Fathom OAuth app, so no app registration is needed \u2014 authenticate directly via OAuth (authorization code with refresh tokens; the only scope is public_api). Alternatively, an API key created in Fathom settings works via an X-Api-Key header. Send OAuth tokens as Authorization: Bearer <<access_token>>. Webhooks must set at least one of include_transcript, include_summary, include_action_items, or include_crm_matches. Rate limits: 60 requests per 60 seconds overall, 30 per 60 seconds for transcript, summary, and content-heavy meeting requests (5 per 60 seconds under high load)."},fathomMcp:{name:"fathomMcp",label:"Fathom",apiUrl:"https://api.fathom.ai/mcp",regex:"^https://api\\.fathom\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/fathom.png",docsUrl:"https://developers.fathom.ai/mcp-docs",preferredAuthType:"oauth2",oauth:{authUrl:"https://fathom.video/mcp/oauth/authorize",tokenUrl:"https://api.fathom.ai/mcp/oauth/token",registrationUrl:"https://api.fathom.ai/mcp/oauth/register",scopes:"mcp",resource:"https://api.fathom.ai/mcp",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Fathom is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Discover the current read tools before use, search narrowly, and retrieve transcript content only when relevant. Never join, record, edit, or otherwise mutate meetings through this integration. Use the separate Fathom API template only when deterministic REST access is required.",keywords:["meetings","notes","transcripts","summaries","action_items","attendees","recordings","decisions"]},granolaMcp:{name:"granolaMcp",label:"Granola",apiUrl:"https://mcp.granola.ai/mcp",regex:"^https://mcp\\.granola\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/granola.svg",docsUrl:"https://docs.granola.ai/help-center/sharing/integrations/mcp",preferredAuthType:"oauth2",oauth:{authUrl:"https://mcp-auth.granola.ai/oauth2/authorize",tokenUrl:"https://mcp-auth.granola.ai/oauth2/token",registrationUrl:"https://mcp-auth.granola.ai/oauth2/register",scopes:"mcp",resource:"https://mcp.granola.ai/mcp",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Granola is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Search narrowly and retrieve transcript content only when relevant. Never edit meeting data through this integration.",keywords:["meetings","notes","transcripts","summaries","action_items","attendees","folders","decisions"]},readAiMcp:{name:"readAiMcp",label:"Read AI",apiUrl:"https://api.read.ai/mcp",regex:"^https://api\\.read\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/read-ai.png",docsUrl:"https://support.read.ai/hc/en-us/articles/49381158409491-MCP-Server",preferredAuthType:"oauth2",oauth:{authUrl:"https://authn.read.ai/oauth2/auth",tokenUrl:"https://authn.read.ai/oauth2/token",registrationUrl:"https://api.read.ai/oauth/register",scopes:"mcp:execute meeting:read offline_access",resource:"https://api.read.ai/mcp",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Read AI is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Request read-only scopes only. Discover the current tools before use, search narrowly, and retrieve transcript content only when relevant. Never join, record, edit, or otherwise mutate meetings through this integration.",keywords:["meetings","transcripts","summaries","action_items","topics","participants","metrics"]},otterMcp:{name:"otterMcp",label:"Otter",apiUrl:"https://mcp.otter.ai/mcp",regex:"^https://mcp\\.otter\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/otter.png",docsUrl:"https://help.otter.ai/hc/en-us/articles/35287607569687-Otter-MCP-Server",preferredAuthType:"oauth2",oauth:{authUrl:"https://otter.ai/oauth2/authorize",tokenUrl:"https://otter.ai/oauth/token",registrationUrl:"https://otter.ai/oauth/register",scopes:"profile:read conversations:read",resource:"https://mcp.otter.ai/",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Otter is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Request read-only scopes only. Discover the current tools before use, search narrowly, and retrieve transcript content only when relevant. Never join, record, edit, or otherwise mutate meetings through this integration.",keywords:["meetings","conversations","transcripts"]},googleDrive:{name:"googleDrive",label:"Google Drive",apiUrl:"https://www.googleapis.com/drive/v3",regex:"^.*(googleapis\\.com/drive|developers\\.google\\.com/drive|drive\\.google).*$",icon:"googledrive",docsUrl:"https://developers.google.com/drive/api/v3/reference",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/drive/v3/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/drive.readonly"},keywords:["files","folders","permissions","sharing","comments","revisions","changes","uploads","downloads","metadata","teamdrives","export","copy","move","oauth"],systemSpecificInstructions:"Use Drive API v3. Export Google Workspace files and use media download for stored files."},googleCalendar:{name:"googleCalendar",apiUrl:"https://www.googleapis.com/calendar/v3",regex:"^.*(googleapis\\.com/calendar|developers\\.google\\.com/calendar|calendar\\.google).*$",icon:"googlecalendar",docsUrl:"https://developers.google.com/calendar/api/v3/reference",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.settings.readonly",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Calendar; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days.",keywords:["events","calendars","attendees","reminders","recurring","availability","free busy","settings","acl","colors","notifications","timezone","quick add","oauth"]},googleSheets:{name:"googleSheets",apiUrl:"https://sheets.googleapis.com/v4",regex:"^.*(sheets\\.googleapis|developers\\.google\\.com/sheets|sheets\\.google).*$",icon:"googlesheets",docsUrl:"https://developers.google.com/sheets/api/reference/rest",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/sheets/v4/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Sheets; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. The drive.file scope only lists files created or opened through this app; open any existing spreadsheet directly by its ID with the spreadsheets scope.",keywords:["spreadsheets","sheets","cells","ranges","values","formulas","formatting","charts","pivot tables","named ranges","protected ranges","batch update","append","oauth"]},googleDocs:{name:"googleDocs",label:"Google Docs",apiUrl:"https://docs.googleapis.com/v1",regex:"^.*(docs\\.googleapis|developers\\.google\\.com/docs|docs\\.google\\.com/document).*$",icon:"googledocs",docsUrl:"https://developers.google.com/docs/api/reference/rest",openApiUrl:"https://docs.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/documents https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Docs; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Create a document with POST /documents and edit it with POST /documents/{documentId}:batchUpdate.",keywords:["documents","docs","text","paragraphs","headings","tables","images","batch update","insert text","replace text","named ranges","oauth"]},googleSlides:{name:"googleSlides",label:"Google Slides",apiUrl:"https://slides.googleapis.com/v1",regex:"^.*(slides\\.googleapis|developers\\.google\\.com/slides|docs\\.google\\.com/presentation).*$",icon:"googleslides",docsUrl:"https://developers.google.com/slides/api/reference/rest",openApiUrl:"https://slides.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Slides; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Create a presentation with POST /presentations and edit it with POST /presentations/{presentationId}:batchUpdate.",keywords:["presentations","slides","decks","shapes","text boxes","images","layouts","batch update","thumbnails","oauth"]},googleForms:{name:"googleForms",label:"Google Forms",apiUrl:"https://forms.googleapis.com/v1",regex:"^.*(forms\\.googleapis|developers\\.google\\.com/forms|docs\\.google\\.com/forms).*$",icon:"googleforms",docsUrl:"https://developers.google.com/forms/api/reference/rest",openApiUrl:"https://forms.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/forms.body https://www.googleapis.com/auth/forms.responses.readonly https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Forms; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Create a form with POST /forms (title only), add questions with POST /forms/{formId}:batchUpdate, and read submissions with GET /forms/{formId}/responses.",keywords:["forms","questions","responses","submissions","surveys","quizzes","batch update","items","oauth"]},googleContacts:{name:"googleContacts",label:"Google Contacts",apiUrl:"https://people.googleapis.com/v1",regex:"^.*(people\\.googleapis|developers\\.google\\.com/people|contacts\\.google\\.com).*$",icon:"/logos/google.svg",docsUrl:"https://developers.google.com/people/api/rest",openApiUrl:"https://people.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/contacts https://www.googleapis.com/auth/contacts.other.readonly https://www.googleapis.com/auth/directory.readonly",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Contacts; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Use /people/me/connections and /people:createContact for saved contacts, /otherContacts for automatically saved contacts, and /people:searchDirectoryPeople for the Google Workspace directory (requires a Workspace account). Every request needs personFields or readMask.",keywords:["contacts","people","directory","other contacts","connections","emails","phone numbers","organizations","search","oauth"]},googleTasks:{name:"googleTasks",label:"Google Tasks",apiUrl:"https://tasks.googleapis.com/tasks/v1",regex:"^.*(tasks\\.googleapis|developers\\.google\\.com/(workspace/)?tasks|tasks\\.google\\.com).*$",icon:"googletasks",docsUrl:"https://developers.google.com/tasks/reference/rest",openApiUrl:"https://tasks.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/tasks",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Tasks; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. List task lists with GET /users/@me/lists and create tasks with POST /lists/{tasklist}/tasks.",keywords:["tasks","task lists","to-do","due dates","completed","subtasks","oauth"]},googleAnalytics:{name:"googleAnalytics",apiUrl:"https://analytics.google.com",regex:"^.*(analytics|analyticsdata).*$",icon:"googleAnalytics",docsUrl:"https://developers.google.com/analytics/devguides/reporting/data/v1",openApiUrl:"https://analyticsdata.googleapis.com/$discovery/rest?version=v1beta",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/analytics.edit"},keywords:["properties","dimensions","metrics","reports","audiences","conversions","events","goals","segments","real time","user activity","attribution","funnels","cohorts","oauth"]},youtube:{name:"youtube",apiUrl:"https://youtube.googleapis.com",regex:"^.*youtube.*$",icon:"youtube",docsUrl:"https://developers.google.com/youtube/v3/docs",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/youtube"},keywords:["videos","channels","playlists","comments","captions","live streams","analytics","thumbnails","subscriptions","activities","ratings","uploads","members","oauth"]},AWS:{name:"AWS",apiUrl:"https://amazonaws.com",regex:"^.*(aws|amazonaws).*$",icon:"/logos/aws.svg",docsUrl:"https://docs.aws.amazon.com/index.html",preferredAuthType:"api_key",keywords:["ec2","s3","lambda","rds","dynamodb","sqs","sns","cloudformation","iam","cloudwatch","vpc","instances","buckets","functions","api key"]},amazon_sp_api:{name:"amazon_sp_api",apiUrl:"https://sellingpartnerapi-na.amazon.com",regex:"^.*(sellingpartnerapi[-\\w]*\\.amazon\\.com).*$",icon:"/logos/amazon.svg",docsUrl:"https://developer-docs.amazon.com/sp-api/docs",preferredAuthType:"oauth2",oauth:{authUrl:"https://sellercentral.amazon.com/apps/authorize/consent",tokenUrl:"https://api.amazon.com/auth/o2/token",grant_type:"authorization_code",tokenAuthMethod:"body",tokenContentType:"form"},keywords:["orders","catalog items","listings","feeds","reports","fba inbound","fulfillment","inventory","pricing","seller central","marketplace"],systemSpecificInstructions:`Base host is region-specific: sellingpartnerapi-na.amazon.com (US/CA/MX/BR), sellingpartnerapi-eu.amazon.com (EU/UK/IN/ME/AF), sellingpartnerapi-fe.amazon.com (Singapore/AU/JP) \u2014 swap the region segment to match the seller's marketplace; sandbox testing uses sandbox.sellingpartnerapi-<region>.amazon.com. Requires registering an app in Seller Central > Develop Apps first. Third-party apps redirect sellers to https://sellercentral.amazon.com/apps/authorize/consent?application_id=<APP_ID>&state=<STATE> (add &version=beta only while the app is in Draft state, remove once Published); private/single-account developers can skip this by generating a refresh token directly via Seller Central > Develop Apps > "Authorize new developer" (self-authorization). Access tokens require header x-amz-access-token in addition to Authorization; some operations (e.g. FBA/notifications) use a separate grantless client_credentials flow instead of the refresh-token flow.`},googleCloud:{name:"googleCloud",apiUrl:"https://cloud.google.com",regex:"^.*(cloud\\.google|gcp|googlecloud).*$",icon:"googleCloud",docsUrl:"https://cloud.google.com/apis/docs/overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/cloud-platform"},keywords:["compute","storage","pubsub","cloud run","kubernetes","iam","vpc","cloud sql","bigtable","dataflow","logging","monitoring","oauth"]},bigquery:{name:"bigquery",apiUrl:"https://bigquery.googleapis.com/bigquery/v2",regex:"^.*(bigquery|bq\\.googleapis).*$",icon:"googleCloud",docsUrl:"https://cloud.google.com/bigquery/docs/reference/rest",openApiUrl:"https://bigquery.googleapis.com/$discovery/rest?version=v2",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/bigquery"},systemSpecificInstructions:`BigQuery REST API - Authentication Options:
|
|
637
|
+
Most list endpoints paginate with page plus rpp or limit, capped at 100 records per page. Payroll and accrual endpoints often require specific type values, paygroup filters, and pay period dates set to the first day of a confirmed month. Some payroll endpoints, including employee monthly payables and payroll transaction deletion, are available only for whitelisted organizations.`},attio:{name:"attio",apiUrl:"https://api.attio.com/v2/",regex:"^.*attio.*$",icon:"/logos/attio.svg",docsUrl:"https://docs.attio.com/rest-api/overview",openApiUrl:"https://api.attio.com/openapi/api",preferredAuthType:"api_key",keywords:["people","objects","records","lists","entries","workspace_members","notes","tasks","threads","comments","sorts","api_slug","attribute_type","record_id","workspace_id","object_id"]},twilio:{name:"twilio",apiUrl:"https://api.twilio.com",regex:"^.*twilio.*$",icon:"/logos/twilio.svg",docsUrl:"https://www.twilio.com/docs/api",openApiUrl:"https://raw.githubusercontent.com/twilio/twilio-oai/refs/heads/main/spec/json/twilio_api_v2010.json",preferredAuthType:"api_key",keywords:["Messages","Media","MessageFeedback","Calls","Accounts","APIKeys","Addresses","UsageRecords","CallFeedback","CredentialsList","TaskRouter_Workspaces","TaskRouter_Tasks","TaskRouter_Workers","TaskRouter_Activities","MessagingServices"]},sendgrid:{name:"sendgrid",apiUrl:"https://api.sendgrid.com",regex:"^.*sendgrid.*$",icon:"/logos/sendgrid.svg",docsUrl:"https://www.twilio.com/docs/sendgrid/api-reference",openApiUrl:"https://raw.githubusercontent.com/sendgrid/sendgrid-oai/main/oai.json",preferredAuthType:"api_key",keywords:["mail_send","templates","campaigns","marketing_contacts","marketing_lists","suppression_groups","global_suppressions","asm_suppressions","subusers","stats","categories","whitelabel","ips","access_settings"]},github:{name:"github",apiUrl:"https://api.github.com",regex:"^.*github.*$",icon:"github",docsUrl:"https://docs.github.com/en/rest",openApiUrl:"https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json",preferredAuthType:"api_key",oauth:{authUrl:"https://github.com/login/oauth/authorize",tokenUrl:"https://github.com/login/oauth/access_token",scopes:"repo user admin:org workflow gist notifications delete_repo write:packages read:packages"},keywords:["repositories","issues","pull_requests","commits","branches","tags","releases","deployments","check_runs","actions_artifacts","organizations","packages","collaborators","gists","milestones"]},gitlab:{name:"gitlab",apiUrl:"https://api.gitlab.com",regex:"^.*gitlab.*$",icon:"gitlab",docsUrl:"https://docs.gitlab.com/api/rest/",openApiUrl:"https://gitlab.com/gitlab-org/gitlab/-/raw/master/doc/api/openapi/openapi.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://gitlab.com/oauth/authorize",tokenUrl:"https://gitlab.com/oauth/token",scopes:"api"},keywords:["projects","repositories","issues","pull_requests","commits","branches","tags","releases","deployments","check_runs","actions_artifacts","organizations","packages","collaborators","gists","milestones"]},bitbucket:{name:"bitbucket",apiUrl:"https://api.bitbucket.org",regex:"^.*bitbucket.*$",icon:"bitbucket",docsUrl:"https://developer.atlassian.com/cloud/bitbucket/rest",openApiUrl:"https://api.bitbucket.org/swagger.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://bitbucket.org/site/oauth2/authorize",tokenUrl:"https://bitbucket.org/site/oauth2/access_token",scopes:"repository:admin account:write team:write webhook"},keywords:["repositories","projects","commits","branches","pullrequests","downloads","issues","pipelines","branchRestrictions","components","milestones","refs","hooks","forks","user"]},slack:{name:"slack",label:"Slack",apiUrl:"https://slack.com/api",regex:"^.*slack.*$",icon:"slack",docsUrl:"https://docs.slack.dev/apis/web-api/",openApiUrl:"https://raw.githubusercontent.com/slackapi/slack-api-specs/master/web-api/slack_web_openapi_v2.json",preferredAuthType:"oauth2",oauth:{grant_type:"authorization_code",authUrl:"https://slack.com/oauth/v2/authorize",tokenUrl:"https://slack.com/api/oauth.v2.access",scopes:"channels:history channels:join channels:read files:read users:read users:read.email",managed:!0},keywords:["channel","conversation","user","file","event","message","workflow_step","workflow_published","workflow_step_execute","usergroup","im","mpim","group","check_run","apps_permissions_resource"],systemSpecificInstructions:"Slack OAuth returns a bot token. Bot access depends on its granted scopes and channel membership."},airtable:{name:"airtable",apiUrl:"https://api.airtable.com",regex:"^.*airtable.*$",icon:"airtable",docsUrl:"https://airtable.com/developers/web/api",preferredAuthType:"oauth2",oauth:{authUrl:"https://airtable.com/oauth2/v1/authorize",tokenUrl:"https://airtable.com/oauth2/v1/token",scopes:"data.recordComments:read data.recordComments:write data.records:read data.records:write schema.bases:read schema.bases:write user.email:read enterprise.groups:read data.records:manage enterprise.account:read enterprise.account:write enterprise.auditLogs:read enterprise.changeEvents:read enterprise.exports:manage enterprise.groups:manage enterprise.scim.usersAndGroups:manage enterprise.user:read enterprise.user:write webhook:manage",managed:!0,usePKCE:!0,tokenAuthMethod:"basic_auth",tokenContentType:"form"},keywords:["bases","tables","records","fields","views","formulas","attachments","comments","collaborators","metadata","schemas","api key","key"]},gmail:{name:"gmail",label:"Gmail",apiUrl:"https://gmail.googleapis.com/gmail/v1",regex:"^.*(gmail\\.googleapis|developers\\.google\\.com/gmail|mail\\.google).*$",icon:"gmail",docsUrl:"https://developers.google.com/gmail/api/reference/rest",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/gmail.readonly"},keywords:["messages","threads","labels","drafts","send","attachments","history","filters","settings","forwarding","inbox","profile","oauth"]},googleWorkspace:{name:"googleWorkspace",label:"Google Workspace",apiUrl:"https://www.googleapis.com",regex:"^.*(workspace\\.google\\.com|developers\\.google\\.com/workspace(?!/tasks)).*$",icon:"/logos/google.svg",docsUrl:"https://developers.google.com/workspace",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:["openid","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/userinfo.profile","https://www.googleapis.com/auth/calendar","https://www.googleapis.com/auth/calendar.settings.readonly","https://www.googleapis.com/auth/documents","https://www.googleapis.com/auth/spreadsheets","https://www.googleapis.com/auth/presentations","https://www.googleapis.com/auth/forms.body","https://www.googleapis.com/auth/forms.responses.readonly","https://www.googleapis.com/auth/gmail.send","https://www.googleapis.com/auth/contacts","https://www.googleapis.com/auth/contacts.other.readonly","https://www.googleapis.com/auth/directory.readonly","https://www.googleapis.com/auth/tasks","https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive.appdata"].join(" "),managed:!0},systemSpecificInstructions:"superglue provides a managed Google Workspace OAuth app; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. The System URL is the shared Google API host; address each product by its own path prefix or host: Calendar /calendar/v3, Docs https://docs.googleapis.com/v1, Sheets https://sheets.googleapis.com/v4, Slides https://slides.googleapis.com/v1, Forms https://forms.googleapis.com/v1, Gmail https://gmail.googleapis.com/gmail/v1 (send only, via POST /users/me/messages/send with a base64url RFC 5322 message; use it only when the user explicitly asks to send), People https://people.googleapis.com/v1 (contacts, otherContacts, and people:searchDirectoryPeople for the Workspace directory; directory search requires a Google Workspace account), Tasks https://tasks.googleapis.com/tasks/v1, Drive https://www.googleapis.com/drive/v3 (drive.file scope: only files created or opened through this app). Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days.",keywords:["workspace","calendar","events","docs","documents","sheets","spreadsheets","slides","presentations","forms","responses","gmail","send email","contacts","people","directory","tasks","oauth"]},granola:{name:"granola",label:"Granola API",apiUrl:"https://public-api.granola.ai",regex:"^.*granola.*$",icon:"/logos/granola.svg",docsUrl:"https://docs.granola.ai",preferredAuthType:"api_key",keywords:["meeting","notes","transcript","summary","ai","recording"]},fathom:{name:"fathom",apiUrl:"https://api.fathom.ai/external/v1",regex:"^.*(fathom\\.ai|fathom\\.video).*$",icon:"/logos/fathom.png",docsUrl:"https://developers.fathom.ai",openApiUrl:"https://developers.fathom.ai/api-reference/openapi.yaml",preferredAuthType:"oauth2",oauth:{grant_type:"authorization_code",authUrl:"https://fathom.video/external/v1/oauth2/authorize",tokenUrl:"https://api.fathom.ai/external/v1/oauth2/token",scopes:"public_api",managed:!0},keywords:["meeting","meetings","notetaker","transcript","transcription","recording","summary","action items","webhook","oauth"],systemSpecificInstructions:"Fathom is an AI meeting notetaker. superglue provides a managed Fathom OAuth app, so no app registration is needed \u2014 authenticate directly via OAuth (authorization code with refresh tokens; the only scope is public_api). Alternatively, an API key created in Fathom settings works via an X-Api-Key header. Send OAuth tokens as Authorization: Bearer <<access_token>>. Webhooks must set at least one of include_transcript, include_summary, include_action_items, or include_crm_matches. Rate limits: 60 requests per 60 seconds overall, 30 per 60 seconds for transcript, summary, and content-heavy meeting requests (5 per 60 seconds under high load)."},fathomMcp:{name:"fathomMcp",label:"Fathom",apiUrl:"https://api.fathom.ai/mcp",regex:"^https://api\\.fathom\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/fathom.png",docsUrl:"https://developers.fathom.ai/mcp-docs",preferredAuthType:"oauth2",oauth:{authUrl:"https://fathom.video/mcp/oauth/authorize",tokenUrl:"https://api.fathom.ai/mcp/oauth/token",registrationUrl:"https://api.fathom.ai/mcp/oauth/register",scopes:"mcp",resource:"https://api.fathom.ai/mcp",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Fathom is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Discover the current read tools before use, search narrowly, and retrieve transcript content only when relevant. Never join, record, edit, or otherwise mutate meetings through this integration. Use the separate Fathom API template only when deterministic REST access is required.",keywords:["meetings","notes","transcripts","summaries","action_items","attendees","recordings","decisions"]},granolaMcp:{name:"granolaMcp",label:"Granola",apiUrl:"https://mcp.granola.ai/mcp",regex:"^https://mcp\\.granola\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/granola.svg",docsUrl:"https://docs.granola.ai/help-center/sharing/integrations/mcp",preferredAuthType:"oauth2",oauth:{authUrl:"https://mcp-auth.granola.ai/oauth2/authorize",tokenUrl:"https://mcp-auth.granola.ai/oauth2/token",registrationUrl:"https://mcp-auth.granola.ai/oauth2/register",scopes:"mcp",resource:"https://mcp.granola.ai/mcp",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Granola is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Search narrowly and retrieve transcript content only when relevant. Never edit meeting data through this integration.",keywords:["meetings","notes","transcripts","summaries","action_items","attendees","folders","decisions"]},readAiMcp:{name:"readAiMcp",label:"Read AI",apiUrl:"https://api.read.ai/mcp",regex:"^https://api\\.read\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/read-ai.png",docsUrl:"https://support.read.ai/hc/en-us/articles/49381158409491-MCP-Server",preferredAuthType:"oauth2",oauth:{authUrl:"https://authn.read.ai/oauth2/auth",tokenUrl:"https://authn.read.ai/oauth2/token",registrationUrl:"https://api.read.ai/oauth/register",scopes:"mcp:execute meeting:read offline_access",resource:"https://api.read.ai/mcp",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Read AI is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Request read-only scopes only. Discover the current tools before use, search narrowly, and retrieve transcript content only when relevant. Never join, record, edit, or otherwise mutate meetings through this integration.",keywords:["meetings","transcripts","summaries","action_items","topics","participants","metrics"]},otterMcp:{name:"otterMcp",label:"Otter",apiUrl:"https://mcp.otter.ai/mcp",regex:"^https://mcp\\.otter\\.ai/mcp/?(?:\\?.*)?$",icon:"/logos/otter.png",docsUrl:"https://help.otter.ai/hc/en-us/articles/35287607569687-Otter-MCP-Server",preferredAuthType:"oauth2",oauth:{authUrl:"https://otter.ai/oauth2/authorize",tokenUrl:"https://otter.ai/oauth/token",registrationUrl:"https://otter.ai/oauth/register",scopes:"profile:read conversations:read",resource:"https://mcp.otter.ai/",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Otter is a brain context source (meetings) backed by remote MCP. Load the meetings skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Request read-only scopes only. Discover the current tools before use, search narrowly, and retrieve transcript content only when relevant. Never join, record, edit, or otherwise mutate meetings through this integration.",keywords:["meetings","conversations","transcripts"]},rocketlaneMcp:{name:"rocketlaneMcp",label:"Rocketlane",apiUrl:"https://mcp.rocketlane.com/mcp",regex:"^https://mcp\\.rocketlane\\.com/mcp/?(?:\\?.*)?$",icon:"/logos/rocketlane.svg",docsUrl:"https://help.rocketlane.com/support/solutions/articles/67000754219-connect-rocketlane-mcp-to-claude-code",preferredAuthType:"oauth2",oauth:{authUrl:"https://rocketlane.scalekit.com/resources/res_121247790507492638/oauth/authorize",tokenUrl:"https://rocketlane.scalekit.com/resources/res_121247790507492638/oauth/token",registrationUrl:"https://rocketlane.scalekit.com/api/v1/resources/res_121247790507492638/clients:register",scopes:"openid email profile",resource:"https://mcp.rocketlane.com/mcp",tokenAuthMethod:"body",usePKCE:!0},systemSpecificInstructions:"Rocketlane is a brain context source (workspace) backed by remote MCP. Load the workspace-apps skill before using it. Keep the MCP endpoint unchanged. Authentication uses OAuth dynamic client registration with PKCE. Store the registered client configuration on the shared System and tokens in the current user's credential. Discover the current tools before use, search narrowly, and retrieve project detail only when relevant.",keywords:["projects","tasks","phases","time_entries","customers","status"]},googleDrive:{name:"googleDrive",label:"Google Drive",apiUrl:"https://www.googleapis.com/drive/v3",regex:"^.*(googleapis\\.com/drive|developers\\.google\\.com/drive|drive\\.google).*$",icon:"googledrive",docsUrl:"https://developers.google.com/drive/api/v3/reference",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/drive/v3/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/drive.readonly"},keywords:["files","folders","permissions","sharing","comments","revisions","changes","uploads","downloads","metadata","teamdrives","export","copy","move","oauth"],systemSpecificInstructions:"Use Drive API v3. Export Google Workspace files and use media download for stored files."},googleCalendar:{name:"googleCalendar",apiUrl:"https://www.googleapis.com/calendar/v3",regex:"^.*(googleapis\\.com/calendar|developers\\.google\\.com/calendar|calendar\\.google).*$",icon:"googlecalendar",docsUrl:"https://developers.google.com/calendar/api/v3/reference",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.settings.readonly",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Calendar; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days.",keywords:["events","calendars","attendees","reminders","recurring","availability","free busy","settings","acl","colors","notifications","timezone","quick add","oauth"]},googleSheets:{name:"googleSheets",apiUrl:"https://sheets.googleapis.com/v4",regex:"^.*(sheets\\.googleapis|developers\\.google\\.com/sheets|sheets\\.google).*$",icon:"googlesheets",docsUrl:"https://developers.google.com/sheets/api/reference/rest",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/sheets/v4/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Sheets; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. The drive.file scope only lists files created or opened through this app; open any existing spreadsheet directly by its ID with the spreadsheets scope.",keywords:["spreadsheets","sheets","cells","ranges","values","formulas","formatting","charts","pivot tables","named ranges","protected ranges","batch update","append","oauth"]},googleDocs:{name:"googleDocs",label:"Google Docs",apiUrl:"https://docs.googleapis.com/v1",regex:"^.*(docs\\.googleapis|developers\\.google\\.com/docs|docs\\.google\\.com/document).*$",icon:"googledocs",docsUrl:"https://developers.google.com/docs/api/reference/rest",openApiUrl:"https://docs.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/documents https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Docs; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Create a document with POST /documents and edit it with POST /documents/{documentId}:batchUpdate.",keywords:["documents","docs","text","paragraphs","headings","tables","images","batch update","insert text","replace text","named ranges","oauth"]},googleSlides:{name:"googleSlides",label:"Google Slides",apiUrl:"https://slides.googleapis.com/v1",regex:"^.*(slides\\.googleapis|developers\\.google\\.com/slides|docs\\.google\\.com/presentation).*$",icon:"googleslides",docsUrl:"https://developers.google.com/slides/api/reference/rest",openApiUrl:"https://slides.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Slides; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Create a presentation with POST /presentations and edit it with POST /presentations/{presentationId}:batchUpdate.",keywords:["presentations","slides","decks","shapes","text boxes","images","layouts","batch update","thumbnails","oauth"]},googleForms:{name:"googleForms",label:"Google Forms",apiUrl:"https://forms.googleapis.com/v1",regex:"^.*(forms\\.googleapis|developers\\.google\\.com/forms|docs\\.google\\.com/forms).*$",icon:"googleforms",docsUrl:"https://developers.google.com/forms/api/reference/rest",openApiUrl:"https://forms.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/forms.body https://www.googleapis.com/auth/forms.responses.readonly https://www.googleapis.com/auth/drive.file",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Forms; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Create a form with POST /forms (title only), add questions with POST /forms/{formId}:batchUpdate, and read submissions with GET /forms/{formId}/responses.",keywords:["forms","questions","responses","submissions","surveys","quizzes","batch update","items","oauth"]},googleContacts:{name:"googleContacts",label:"Google Contacts",apiUrl:"https://people.googleapis.com/v1",regex:"^.*(people\\.googleapis|developers\\.google\\.com/people|contacts\\.google\\.com).*$",icon:"/logos/google.svg",docsUrl:"https://developers.google.com/people/api/rest",openApiUrl:"https://people.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/contacts https://www.googleapis.com/auth/contacts.other.readonly https://www.googleapis.com/auth/directory.readonly",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Contacts; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. Use /people/me/connections and /people:createContact for saved contacts, /otherContacts for automatically saved contacts, and /people:searchDirectoryPeople for the Google Workspace directory (requires a Workspace account). Every request needs personFields or readMask.",keywords:["contacts","people","directory","other contacts","connections","emails","phone numbers","organizations","search","oauth"]},googleTasks:{name:"googleTasks",label:"Google Tasks",apiUrl:"https://tasks.googleapis.com/tasks/v1",regex:"^.*(tasks\\.googleapis|developers\\.google\\.com/(workspace/)?tasks|tasks\\.google\\.com).*$",icon:"googletasks",docsUrl:"https://developers.google.com/tasks/reference/rest",openApiUrl:"https://tasks.googleapis.com/$discovery/rest?version=v1",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/tasks",managed:!0},systemSpecificInstructions:"superglue provides a managed Google OAuth app for Google Tasks; users connect with their Google login and never need to create a Google Cloud project or supply a client ID or secret. Send OAuth tokens as Authorization: Bearer <<access_token>>. While the app is in Testing, only listed test users can connect and refresh tokens expire after seven days. List task lists with GET /users/@me/lists and create tasks with POST /lists/{tasklist}/tasks.",keywords:["tasks","task lists","to-do","due dates","completed","subtasks","oauth"]},googleAnalytics:{name:"googleAnalytics",apiUrl:"https://analytics.google.com",regex:"^.*(analytics|analyticsdata).*$",icon:"googleAnalytics",docsUrl:"https://developers.google.com/analytics/devguides/reporting/data/v1",openApiUrl:"https://analyticsdata.googleapis.com/$discovery/rest?version=v1beta",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/analytics.edit"},keywords:["properties","dimensions","metrics","reports","audiences","conversions","events","goals","segments","real time","user activity","attribution","funnels","cohorts","oauth"]},youtube:{name:"youtube",apiUrl:"https://youtube.googleapis.com",regex:"^.*youtube.*$",icon:"youtube",docsUrl:"https://developers.google.com/youtube/v3/docs",openApiUrl:"https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/youtube"},keywords:["videos","channels","playlists","comments","captions","live streams","analytics","thumbnails","subscriptions","activities","ratings","uploads","members","oauth"]},AWS:{name:"AWS",apiUrl:"https://amazonaws.com",regex:"^.*(aws|amazonaws).*$",icon:"/logos/aws.svg",docsUrl:"https://docs.aws.amazon.com/index.html",preferredAuthType:"api_key",keywords:["ec2","s3","lambda","rds","dynamodb","sqs","sns","cloudformation","iam","cloudwatch","vpc","instances","buckets","functions","api key"]},amazon_sp_api:{name:"amazon_sp_api",apiUrl:"https://sellingpartnerapi-na.amazon.com",regex:"^.*(sellingpartnerapi[-\\w]*\\.amazon\\.com).*$",icon:"/logos/amazon.svg",docsUrl:"https://developer-docs.amazon.com/sp-api/docs",preferredAuthType:"oauth2",oauth:{authUrl:"https://sellercentral.amazon.com/apps/authorize/consent",tokenUrl:"https://api.amazon.com/auth/o2/token",grant_type:"authorization_code",tokenAuthMethod:"body",tokenContentType:"form"},keywords:["orders","catalog items","listings","feeds","reports","fba inbound","fulfillment","inventory","pricing","seller central","marketplace"],systemSpecificInstructions:`Base host is region-specific: sellingpartnerapi-na.amazon.com (US/CA/MX/BR), sellingpartnerapi-eu.amazon.com (EU/UK/IN/ME/AF), sellingpartnerapi-fe.amazon.com (Singapore/AU/JP) \u2014 swap the region segment to match the seller's marketplace; sandbox testing uses sandbox.sellingpartnerapi-<region>.amazon.com. Requires registering an app in Seller Central > Develop Apps first. Third-party apps redirect sellers to https://sellercentral.amazon.com/apps/authorize/consent?application_id=<APP_ID>&state=<STATE> (add &version=beta only while the app is in Draft state, remove once Published); private/single-account developers can skip this by generating a refresh token directly via Seller Central > Develop Apps > "Authorize new developer" (self-authorization). Access tokens require header x-amz-access-token in addition to Authorization; some operations (e.g. FBA/notifications) use a separate grantless client_credentials flow instead of the refresh-token flow.`},googleCloud:{name:"googleCloud",apiUrl:"https://cloud.google.com",regex:"^.*(cloud\\.google|gcp|googlecloud).*$",icon:"googleCloud",docsUrl:"https://cloud.google.com/apis/docs/overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/cloud-platform"},keywords:["compute","storage","pubsub","cloud run","kubernetes","iam","vpc","cloud sql","bigtable","dataflow","logging","monitoring","oauth"]},bigquery:{name:"bigquery",apiUrl:"https://bigquery.googleapis.com/bigquery/v2",regex:"^.*(bigquery|bq\\.googleapis).*$",icon:"googleCloud",docsUrl:"https://cloud.google.com/bigquery/docs/reference/rest",openApiUrl:"https://bigquery.googleapis.com/$discovery/rest?version=v2",preferredAuthType:"oauth2",oauth:{authUrl:"https://accounts.google.com/o/oauth2/v2/auth",tokenUrl:"https://oauth2.googleapis.com/token",scopes:"https://www.googleapis.com/auth/bigquery"},systemSpecificInstructions:`BigQuery REST API - Authentication Options:
|
|
638
638
|
|
|
639
639
|
OPTION 1: OAuth App (Recommended)
|
|
640
640
|
If the user has or creates an OAuth app in their Google Cloud project:
|
|
@@ -1667,7 +1667,7 @@ ${r}`;break;case"retry":IN(r)&&(t[i]=r);break;case"id":jN(r)&&(t[i]=r);break;cas
|
|
|
1667
1667
|
`);o.stack=t?`${t}
|
|
1668
1668
|
${r}`:i.stack}G.exports.fetch=function(e,t=void 0){return RIe(e,t).catch(a=>{throw UN?FN(a,UN):a&&typeof a=="object"&&Error.captureStackTrace(a,G.exports.fetch),a})};G.exports.Headers=Hs().Headers;G.exports.Response=cd().Response;G.exports.Request=xm().Request;G.exports.FormData=mf().FormData;var{setGlobalOrigin:NIe,getGlobalOrigin:OIe}=ax();G.exports.setGlobalOrigin=NIe;G.exports.getGlobalOrigin=OIe;var{CacheStorage:UIe}=qR(),{kConstruct:MIe}=Ue();G.exports.caches=new UIe(MIe);var{deleteCookie:LIe,getCookies:PIe,getSetCookies:FIe,setCookie:$Ie,parseCookie:HIe}=NR();G.exports.deleteCookie=LIe;G.exports.getCookies=PIe;G.exports.getSetCookies=FIe;G.exports.setCookie=$Ie;G.exports.parseCookie=HIe;var{parseMIMEType:GIe,serializeAMimeType:VIe}=ma();G.exports.parseMIMEType=GIe;G.exports.serializeAMimeType=VIe;var{CloseEvent:YIe,ErrorEvent:JIe,MessageEvent:WIe}=jb(),{WebSocket:ZIe,ping:KIe}=fN();G.exports.WebSocket=ZIe;G.exports.CloseEvent=YIe;G.exports.ErrorEvent=JIe;G.exports.MessageEvent=WIe;G.exports.ping=KIe;G.exports.WebSocketStream=zN().WebSocketStream;G.exports.WebSocketError=_q().WebSocketError;G.exports.request=Ad(Dm.request);G.exports.stream=Ad(Dm.stream);G.exports.pipeline=Ad(Dm.pipeline);G.exports.connect=Ad(Dm.connect);G.exports.upgrade=Ad(Dm.upgrade);G.exports.MockClient=zIe;G.exports.MockCallHistory=qIe;G.exports.MockCallHistoryLog=EIe;G.exports.MockPool=jIe;G.exports.MockAgent=IIe;G.exports.SnapshotAgent=CIe;G.exports.mockErrors=SIe;var{EventSource:XIe}=ON();G.exports.EventSource=XIe;function e2e(){globalThis.fetch=G.exports.fetch,globalThis.Headers=G.exports.Headers,globalThis.Response=G.exports.Response,globalThis.Request=G.exports.Request,globalThis.FormData=G.exports.FormData,globalThis.WebSocket=G.exports.WebSocket,globalThis.CloseEvent=G.exports.CloseEvent,globalThis.ErrorEvent=G.exports.ErrorEvent,globalThis.MessageEvent=G.exports.MessageEvent,globalThis.EventSource=G.exports.EventSource}G.exports.install=e2e});var GN=f(Rm=>{"use strict";Object.defineProperty(Rm,"__esModule",{value:!0});Rm.SuperglueClient=Rm.SuperglueHttpError=void 0;var Tm=Ht(),Mr=xv(),o2e=Xv(),t2e=a3(),a2e=Fa(),Lr=zc(),i2e=Lg(),wd=14400*1e3,vd;if(typeof globalThis.process<"u"&&globalThis.process.versions?.node)try{let{Agent:o}=$N();vd=new o({headersTimeout:wd,bodyTimeout:wd})}catch{}function HN(o){if(o?.aborted)throw o.reason??new DOMException("Aborted","AbortError")}var Pb=class extends Error{constructor(e,t,a,i){super(e),this.status=t,this.code=a,this.details=i,this.name="SuperglueHttpError"}};Rm.SuperglueHttpError=Pb;var Uq=class{constructor({apiKey:e,apiEndpoint:t,onInfrastructureError:a,refreshToken:i,sseTokenProvider:r,tokenProvider:n}){if(!e&&!n)throw new Error("SuperglueClient requires either apiKey or tokenProvider");this.tokenProvider=n??(async()=>e),this.apiEndpoint=t??"https://api.superglue.cloud",this.sseManager=new o2e.SSELogSubscriptionManager(this.apiEndpoint,r??this.tokenProvider,i),this.onInfrastructureError=a,this.refreshToken=i}async getApiKey(){return this.tokenProvider()}async fetchWithAuthRetry(e,t){let a=await this.getApiKey(),i=await e(a);if(i.status!==401||!this.refreshToken)return i;HN(t);let r=await this.refreshToken();return HN(t),!r||r===a?i:(i.body?.cancel(),e(r))}isInfrastructureError(e){return(0,a2e.isAbortError)(e)?!1:!!(e instanceof TypeError&&e.message.toLowerCase().includes("fetch")||e instanceof Error&&e.name==="TimeoutError")}async restRequest(e,t,a,i,r){let s=await(await this.restResponse({method:e,path:t,body:a,extraHeaders:i,requestInit:r})).text();if(s)return JSON.parse(s)}async restResponse({method:e,path:t,body:a,extraHeaders:i,requestInit:r}){let n=`${this.apiEndpoint.replace(/\/$/,"")}${t}`,s=a!=null,c=typeof FormData<"u"&&a instanceof FormData,m=u=>{let d={Authorization:`Bearer ${u}`,...i};return s&&!c&&e!=="GET"&&(d["Content-Type"]="application/json"),fetch(n,{...r,method:e,headers:d,body:s?c?a:JSON.stringify(a):void 0,signal:r?.signal??AbortSignal.timeout(wd),...vd?{dispatcher:vd}:{}})},l;try{l=await this.fetchWithAuthRetry(m,r?.signal)}catch(u){throw this.isInfrastructureError(u)&&this.onInfrastructureError?.(),u}if(!l.ok)throw await this.buildHttpError(l);return l}async uploadFiles(e,t){if(typeof t?.process!="boolean")throw new Error("process must be a boolean");if(e.length===0)return[];let a=e.map(l=>({...l,contentLength:l.contentLength??this.getUploadContentLength(l.content)})),r=(await this.restRequest("POST","/v1/files/uploads",{process:t.process,files:a.map(({fileName:l,contentType:u,contentLength:d})=>({fileName:l,contentLength:d,...u?{contentType:u}:{}}))})).data.files;if(r.length!==a.length)throw await Promise.all(r.map(l=>this.deleteFileUpload(l.id).catch(()=>{}))),new Error("Upload response did not match the selected files");let n=await Promise.allSettled(r.map(async(l,u)=>{let d=a[u],g=await fetch(l.uploadUrl,{method:"PUT",body:d.content,headers:d.contentType?{"Content-Type":d.contentType}:void 0,signal:AbortSignal.timeout(Math.min(wd,l.expiresIn*1e3))});if(!g.ok)throw new Error(`Upload failed for ${d.fileName}: ${g.status} ${g.statusText}`);return l.id})),s=n.flatMap(l=>l.status==="fulfilled"?[l.value]:[]),c=new Map;if(s.length>0)try{let l=await this.restRequest("POST","/v1/files/uploads/complete",{fileIds:s});c=new Map(l.data.files.map(u=>[u.id,u]))}catch(l){c=new Map(s.map(u=>[u,{id:u,fileName:a[r.findIndex(d=>d.id===u)]?.fileName||u,contentLength:a[r.findIndex(d=>d.id===u)]?.contentLength||0,status:"failed",error:l instanceof Error?l.message:String(l)}]))}let m=r.map((l,u)=>{let d=n[u],g=a[u];return d.status==="rejected"?{id:l.id,fileName:g.fileName,contentLength:g.contentLength,status:"failed",error:d.reason instanceof Error?d.reason.message:String(d.reason)}:c.get(l.id)||{id:l.id,fileName:g.fileName,contentLength:g.contentLength,status:"failed",error:"Upload completion returned no result"}});return await Promise.all(m.filter(l=>l.status==="failed").map(l=>this.deleteFileUpload(l.id).catch(()=>{}))),m}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 t=await e.text(),a=`HTTP ${e.status}: ${t}`,i,r;try{let n=JSON.parse(t);n&&typeof n=="object"&&!Array.isArray(n)&&(r=n),typeof n?.code=="string"&&(i=n.code);let s=n.error;typeof s=="string"?a=s:s&&typeof s=="object"&&(a=s.message||JSON.stringify(s))}catch{}return new Pb(a,e.status,i,r)}async streamRequest(e,t,a){let i=e.includes("?")?"&":"?",r=`${this.apiEndpoint.replace(/\/$/,"")}${e}${i}stream=true`,n=m=>fetch(r,{method:"POST",headers:{Authorization:`Bearer ${m}`,Accept:"text/event-stream","Content-Type":"application/json"},body:JSON.stringify(t),signal:a??AbortSignal.timeout(wd),...vd?{dispatcher:vd}:{}}),s;try{s=await this.fetchWithAuthRetry(n,a)}catch(m){throw this.isInfrastructureError(m)&&this.onInfrastructureError?.(),m}if(!s.ok)throw await this.buildHttpError(s);if(!(s.headers.get("content-type")||"").includes("text/event-stream")){let m=await s.text();return m?JSON.parse(m):void 0}try{return await(0,t2e.consumeEventStreamResult)(s)}catch(m){throw this.isInfrastructureError(m)&&this.onInfrastructureError?.(),m}}async subscribeToLogsSSE(e={}){return this.sseManager.subscribeToLogs(e)}async disconnect(){await this.sseManager.disconnect()}async getMe(){return this.restRequest("GET","/v1/me")}async completeOnboarding(){return this.restRequest("POST","/v1/me/onboarding/complete")}async runTool(e){let t=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:t.status==="success",data:t.data,error:t.error,tool:t.tool,stepResults:t.stepResults?.map(a=>({...a}))||[],...t.fileArtifacts&&t.fileArtifacts.length>0?{fileArtifacts:t.fileArtifacts}:{},...t.metadata?.warnings?.length?{warnings:t.metadata.warnings}:{}}}async runToolConfig(e){let t=e.createRun?"/v1/tools/run?createRun=true":"/v1/tools/run",a=await this.restRequest("POST",t,{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:a.status?a.status==="success":a.success??!1,data:a.data,error:a.error,tool:a.tool||e.tool,stepResults:a.stepResults?.map(r=>({...r}))||[],...a.fileArtifacts&&a.fileArtifacts.length>0?{fileArtifacts:a.fileArtifacts}:{},...a.metadata?.warnings?.length?{warnings:a.metadata.warnings}:{}}}async abortToolExecution(e){return{success:!0,runId:(await this.restRequest("POST",`/v1/runs/${encodeURIComponent(e)}/cancel`)).runId}}async executeStep({step:e,payload:t,files:a,previousResults:i,credentials:r,options:n,runId:s,systemIds:c,createRun:m,parentToolId:l,stepIndex:u,stepId:d,signal:g,stream:h}){let k={step:e,payload:t,files:a,previousResults:i,credentials:r,options:n,runId:s,systemIds:c,createRun:m,parentToolId:l,stepIndex:u,stepId:d};return h?this.streamRequest("/v1/tools/step/run",k,g):this.restRequest("POST","/v1/tools/step/run",k,void 0,g?{signal:g}:void 0)}async abortStep(e){return this.restRequest("POST","/v1/tools/step/abort",{runId:e})}async executeTransformOnly({outputTransform:e,outputSchema:t,inputSchema:a,payload:i,files:r,stepResults:n,options:s,runId:c,createRun:m,parentToolId:l,stepId:u,signal:d,stream:g}){let h={outputTransform:e,outputSchema:t,inputSchema:a,payload:i,files:r,stepResults:n,options:s,runId:c,createRun:m,parentToolId:l,stepId:u};return g?this.streamRequest("/v1/tools/transform/run",h,d):this.restRequest("POST","/v1/tools/transform/run",h,void 0,d?{signal:d}:void 0)}async createRun({toolId:e,toolConfig:t,toolResult:a,stepResults:i,toolPayload:r,status:n,error:s,startedAt:c,completedAt:m,executionKind:l,parentToolId:u,draftId:d}){return this.restRequest("POST","/v1/runs",{toolId:e,toolConfig:t,toolResult:a,stepResults:i,toolPayload:r,status:n,error:s,startedAt:(0,Lr.toUTCISOString)(c,"run.startedAt"),completedAt:(0,Lr.toUTCISOString)(m,"run.completedAt"),executionKind:l,parentToolId:u,draftId:d})}async checkRunLimit(){return(await this.restRequest("POST","/v1/runs/check-limit")).data}async extract({file:e,envelope:t}){if(!e)throw new Error("File must be provided for extract.");let a=new FormData;a.append("file",e);let i=t?"/v1/extract?envelope=true":"/v1/extract";return this.restRequest("POST",i,a)}mapOpenAPIRunToRun(e){let t={running:Tm.RunStatus.RUNNING,success:Tm.RunStatus.SUCCESS,failed:Tm.RunStatus.FAILED,aborted:Tm.RunStatus.ABORTED};return{runId:e.runId??e.id,toolId:e.toolId,tool:e.tool,systemIds:e.systemIds,status:t[e.status]??Tm.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??Tm.RunExecutionKind.FULL},fileArtifacts:e.fileArtifacts}}mapOpenAPIScheduleToToolSchedule(e){return{...e,lastRunAt:e.lastRunAt?(0,Lr.requireUTCDate)(e.lastRunAt,"schedule.lastRunAt"):void 0,nextRunAt:(0,Lr.requireUTCDate)(e.nextRunAt,"schedule.nextRunAt"),createdAt:(0,Lr.requireUTCDate)(e.createdAt,"schedule.createdAt"),updatedAt:(0,Lr.requireUTCDate)(e.updatedAt,"schedule.updatedAt")}}async listRuns(e={}){let t=(0,Mr.createSearchListQueryParams)(e);e.toolId!==void 0&&t.set("toolId",e.toolId),e.searchUserIds?.length&&t.set("searchUserIds",e.searchUserIds.join(",")),e.includeTotal!==void 0&&t.set("includeTotal",String(e.includeTotal)),e.startedAfter!==void 0&&t.set("startedAfter",e.startedAfter instanceof Date?(0,Lr.toUTCISOString)(e.startedAfter,"run.startedAfter"):e.startedAfter),e.statuses!==void 0?t.set("status",e.statuses.join(",")):e.status!==void 0&&t.set("status",e.status),e.requestSources!==void 0&&t.set("requestSources",e.requestSources.join(",")),e.executionKinds!==void 0&&t.set("executionKinds",e.executionKinds.join(",")),e.userId!==void 0&&t.set("userId",e.userId),e.systemId!==void 0&&t.set("systemId",e.systemId),e.systemIds!==void 0&&t.set("systemIds",e.systemIds.join(","));let a=t.size>0?`?${t.toString()}`:"",i=await this.restRequest("GET",`/v1/runs${a}`,void 0,void 0,{signal:e.signal});return{data:i.data.map(r=>this.mapOpenAPIRunToRun(r)),total:i.total,page:i.page,limit:i.limit,hasMore:i.hasMore}}async getActivityCounts(e){let t=new URLSearchParams;e?.from&&t.set("from",e.from instanceof Date?(0,Lr.toUTCISOString)(e.from,"activity.from"):e.from),e?.to&&t.set("to",e.to instanceof Date?(0,Lr.toUTCISOString)(e.to,"activity.to"):e.to);let a=t.toString();return(await this.restRequest("GET",`/v1/activity/counts${a?`?${a}`:""}`,void 0,void 0,{signal:e?.signal})).counts}async getRun(e){try{let t=await this.restRequest("GET",`/v1/runs/${encodeURIComponent(e)}`);return this.mapOpenAPIRunToRun(t)}catch(t){if(t.message?.includes("404")||t.message?.includes("not found"))return null;throw t}}async getTool(e){try{return await this.restRequest("GET",`/v1/tools/${encodeURIComponent(e)}`)}catch(t){if(t.message?.includes("404")||t.message?.includes("not found")||t.message?.includes("403")||t.message?.includes("not allowed"))return null;throw t}}async getToolState(e){return(await this.restRequest("GET",`/v1/tools/${encodeURIComponent(e)}/state`)).state}async setToolState(e,t){await this.restRequest("PUT",`/v1/tools/${encodeURIComponent(e)}/state`,{state:t})}async deleteToolState(e){return(await this.restRequest("DELETE",`/v1/tools/${encodeURIComponent(e)}/state`)).deletedKeys}async archiveTool(e,t=!0){return this.updateTool(e,{archived:t})}async bulkArchiveTools(e,t=!0){return this.restRequest("POST","/v1/tools/bulk/archive",{ids:e,archived:t})}async bulkDeleteTools(e){return this.restRequest("POST","/v1/tools/bulk/delete",{ids:e})}async listTools(e={}){let t=(0,Mr.createListQueryParams)(e);e.includeArchived!==void 0&&t.set("includeArchived",String(e.includeArchived));let a=t.size>0?`?${t.toString()}`:"";return this.restRequest("GET",`/v1/tools${a}`)}async listAllTools(e={}){return(0,Mr.listAllPages)((t,a)=>this.listTools({...e,page:t,limit:a}))}async createTool(e,t){return this.restRequest("POST","/v1/tools",{...t,id:e})}async updateTool(e,t){return this.restRequest("PUT",`/v1/tools/${encodeURIComponent(e)}`,t)}async deleteTool(e){try{return await this.restRequest("DELETE",`/v1/tools/${encodeURIComponent(e)}`),!0}catch(t){if(t.message?.includes("404"))return!1;throw t}}async renameTool(e,t){return this.restRequest("POST",`/v1/tools/${encodeURIComponent(e)}/rename`,{newId:t})}async getWorkflow(e){return this.getTool(e)}async archiveWorkflow(e,t=!0){return this.upsertWorkflow(e,{archived:t})}async createWorkflow(e,t){return this.createTool(e,t)}async updateWorkflow(e,t){return this.updateTool(e,t)}async upsertWorkflow(e,t){return await this.getTool(e)?this.updateTool(e,t):this.createTool(e,t)}async deleteWorkflow(e){return this.deleteTool(e)}async renameWorkflow(e,t){return this.renameTool(e,t)}async listSchedules(e={}){let t=(0,Mr.createListQueryParams)(e),a=t.size>0?`?${t.toString()}`:"",i=e.toolId?`/v1/tools/${encodeURIComponent(e.toolId)}/schedules${a}`:`/v1/schedules${a}`,r=await this.restRequest("GET",i);return{...r,data:r.data.map(n=>this.mapOpenAPIScheduleToToolSchedule(n))}}async listAllSchedules(e={}){return(0,Mr.listAllPages)((t,a)=>this.listSchedules({...e,page:t,limit:a}))}async getToolSchedule(e,t){try{let a=await this.restRequest("GET",`/v1/tools/${encodeURIComponent(e)}/schedules/${encodeURIComponent(t)}`);return this.mapOpenAPIScheduleToToolSchedule(a)}catch(a){if(a.message?.includes("404")||a.message?.includes("not found"))return null;throw a}}async createToolSchedule(e,t){let a=await this.restRequest("POST",`/v1/tools/${encodeURIComponent(e)}/schedules`,{...t,timezone:t.timezone||(0,i2e.getRuntimeTimezone)()});return this.mapOpenAPIScheduleToToolSchedule(a)}async updateToolSchedule(e,t,a){let i=await this.restRequest("PUT",`/v1/tools/${encodeURIComponent(e)}/schedules/${encodeURIComponent(t)}`,a);return this.mapOpenAPIScheduleToToolSchedule(i)}async deleteToolSchedule(e,t){return await this.restRequest("DELETE",`/v1/tools/${encodeURIComponent(e)}/schedules/${encodeURIComponent(t)}`),!0}async bulkSetSchedulesEnabled(e,t){return this.restRequest("POST","/v1/schedules/bulk/enable",{ids:e,enabled:t})}async bulkDeleteSchedules(e){return this.restRequest("POST","/v1/schedules/bulk/delete",{ids:e})}async listCredentials(e={}){let t=(0,Mr.createListQueryParams)(e);e.systemId!==void 0&&t.set("systemId",e.systemId);let a=t.size>0?`?${t.toString()}`:"";return this.restRequest("GET",`/v1/credentials${a}`)}async listAllCredentials(e={}){return(0,Mr.listAllPages)((t,a)=>this.listCredentials({...e,page:t,limit:a}))}async createCredentials(e){return(await this.restRequest("POST","/v1/credentials",e)).data}async replaceCredentials(e,t){return(await this.restRequest("PUT",`/v1/credentials/${encodeURIComponent(e)}`,{credentials:t})).data}async updateCredentials(e,t){return(await this.restRequest("PATCH",`/v1/credentials/${encodeURIComponent(e)}`,t)).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 t=(0,Mr.createListQueryParams)(e),a=t.size>0?`?${t.toString()}`:"";return this.restRequest("GET",`/v1/systems${a}`)}async listAllSystems(e={}){return(0,Mr.listAllPages)((t,a)=>this.listSystems({...e,page:t,limit:a}))}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,t){return(await this.restRequest("PATCH",`/v1/systems/${encodeURIComponent(e)}`,t)).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,t){return(await this.restRequest("POST",`/v1/oauth/exchanges/${encodeURIComponent(e)}/complete`,t)).data}async searchSystemDocumentation(e,t){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/search`,{keywords:t})).data}async triggerSystemDocumentationScrapeJob(e,t){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/scrape`,t)).data}async fetchOpenApiSpec(e,t,a){return(await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/openapi`,{url:t,link:a?.link})).data}async uploadSystemDocumentationFiles(e,t,a){let i=await this.uploadFiles(t,{process:!0}),r=i.flatMap(n=>n.status==="uploaded"?[n.id]:[]);if(r.length>0)try{await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/files`,{fileIds:r,link:a?.link!==!1})}catch(n){throw await Promise.all(r.map(s=>this.deleteFileUpload(s).catch(()=>{}))),n}if(!a?.settle){let n=i.filter(s=>s.status==="failed");if(n.length>0)throw new Error(n.map(s=>s.error).join("; "))}return i}async listSystemDocumentationFiles(e,t){let a=new URLSearchParams;t?.length&&a.set("fileIds",t.join(","));let i=a.size>0?`?${a.toString()}`:"";return(await this.restRequest("GET",`/v1/systems/${encodeURIComponent(e)}/documentation/files${i}`)).data}async getSystemDocumentationFileContent(e,t,a){return(await this.restRequest("GET",`/v1/systems/${encodeURIComponent(e)}/documentation/files/${encodeURIComponent(t)}/content?processed=${a.processed}`)).data}async deleteSystemDocumentationFile(e,t){await this.restRequest("DELETE",`/v1/systems/${encodeURIComponent(e)}/documentation/files/${encodeURIComponent(t)}`)}async generateCredentialsLink(e){try{return{success:!0,credentialsUrl:(await this.restRequest("POST","/v1/authenticate",e||{})).data.credentialsUrl}}catch(t){return{success:!1,error:t.message}}}};Rm.SuperglueClient=Uq});var YN=f(ao=>{"use strict";Object.defineProperty(ao,"__esModule",{value:!0});ao.UnquotedKeyStrategy=ao.TripleQuoteStrategy=ao.TrailingCommaStrategy=ao.SingleQuoteStrategy=ao.PythonLiteralStrategy=ao.CommentStrategy=ao.ResilientJsonParser=ao.RepairStrategy=void 0;ao.parseJsonResilient=r2e;ao.parseJSON=n2e;ao.isValidJson=s2e;ao.prettyPrintJson=c2e;ao.minifyJson=m2e;var Ra=class{validate(e){try{return JSON.parse(e),!0}catch{return!1}}};ao.RepairStrategy=Ra;var Fb=class extends Ra{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,(t,a)=>{let i=a.trim();if(i.startsWith("{")&&i.endsWith("}")||i.startsWith("[")&&i.endsWith("]"))try{let n=JSON.parse(i);return JSON.stringify(n)}catch{return`"${a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}"`}return`"${a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}"`})}};ao.TripleQuoteStrategy=Fb;var $b=class extends Ra{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")}};ao.PythonLiteralStrategy=$b;var Hb=class extends Ra{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")}};ao.TrailingCommaStrategy=Hb;var Gb=class extends Ra{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 t=e.replace(/([{,]\s*)'([^']+)'(\s*:)/g,'$1"$2"$3');return t=t.replace(/(:\s*)'([^']+)'(\s*[,}])/g,'$1"$2"$3'),t}};ao.SingleQuoteStrategy=Gb;var Vb=class extends Ra{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')}};ao.UnquotedKeyStrategy=Vb;var Yb=class extends Ra{constructor(){super(...arguments),this.name="CommentRemoval",this.description="Removes JavaScript-style comments"}canApply(e){return/\/\/.*$|\/\*[\s\S]*?\*\//m.test(e)}apply(e){let t=e.replace(/\/\/.*$/gm,"");return t=t.replace(/\/\*[\s\S]*?\*\//g,""),t}};ao.CommentStrategy=Yb;var Mq=class extends Ra{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(t){let a=t.message||"";return a.includes("control character")||a.includes("Bad control")||a.includes("Unexpected token")&&/[\n\r\t]/.test(e)}}apply(e){let t="",a=!1,i=!1;for(let r=0;r<e.length;r++){let n=e[r],s=r>0?e[r-1]:"";if(i){t+=n,i=!1;continue}if(n==="\\"&&a){t+=n,i=!0;continue}if(n==='"'&&s!=="\\"){a=!a,t+=n;continue}if(a)switch(n){case`
|
|
1669
1669
|
`:t+="\\n";break;case"\r":t+="\\r";break;case" ":t+="\\t";break;case"\b":t+="\\b";break;case"\f":t+="\\f";break;default:let c=n.charCodeAt(0);c<32?t+="\\u"+("0000"+c.toString(16)).slice(-4):t+=n}else t+=n}return t}},Lq=class extends Ra{constructor(){super(...arguments),this.name="TrailingCharactersRepair",this.description="Removes trailing characters after valid JSON structure"}canApply(e){let t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return!1;let a=0,i=0,r=!1,n=!1;for(let s=0;s<t.length;s++){let c=t[s];if(r)n?n=!1:c==="\\"?n=!0:c==='"'&&(r=!1);else if(c==='"')r=!0;else if(c==="{")a++;else if(c==="}"){if(a--,a===0&&i===0&&s>0&&s<t.length-1)return!0}else if(c==="[")i++;else if(c==="]"&&(i--,i===0&&a===0&&s>0&&s<t.length-1))return!0}return!1}apply(e){let t=e.trim(),a=0,i=0,r=!1,n=!1,s=-1;for(let c=0;c<t.length;c++){let m=t[c];if(r)n?n=!1:m==="\\"?n=!0:m==='"'&&(r=!1);else if(m==='"')r=!0;else if(m==="{")a++;else if(m==="}"){if(a--,a===0&&i===0&&c>0){s=c;break}}else if(m==="[")i++;else if(m==="]"&&(i--,i===0&&a===0&&c>0)){s=c;break}}return s>0&&s<t.length-1?t.substring(0,s+1):e}},Nm=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 Fb,new Gb,new Mq,new Lq,new $b,new Hb,new Vb,new Yb]}parse(e){let t=Date.now();this.repairLog=[];let a=e instanceof Buffer?e.toString("utf8"):String(e);try{return{success:!0,data:JSON.parse(a),metadata:{parseTime:Date.now()-t,strategiesApplied:[]}}}catch(n){if(!this.options.attemptRepair)return{success:!1,error:`JSON parse error: ${n}`,metadata:{parseTime:Date.now()-t}}}let i=a,r=[];for(let n of this.strategies)if(n.canApply(i)){let s=i;if(i=n.apply(i),s!==i){r.push(n.name),this.repairLog.push(n.description),this.options.logRepairs&&console.log(`Applied ${n.name}: ${n.description}`);try{return{success:!0,data:JSON.parse(i),repairs:this.repairLog,metadata:{parseTime:Date.now()-t,strategiesApplied:r}}}catch{}}}try{return{success:!0,data:JSON.parse(i),repairs:this.repairLog,metadata:{parseTime:Date.now()-t,strategiesApplied:r}}}catch(n){let s=this.aggressiveFallback(i);return s.success?{...s,repairs:[...this.repairLog,"Applied aggressive fallback"],metadata:{parseTime:Date.now()-t,strategiesApplied:[...r,"AggressiveFallback"]}}:{success:!1,error:`Failed to parse JSON after applying ${r.length} strategies: ${n}`,repairs:this.repairLog,metadata:{parseTime:Date.now()-t,strategiesApplied:r}}}}aggressiveFallback(e){try{let t=e.indexOf("{"),a=e.indexOf("[");if(t===-1&&a===-1)return{success:!1,error:"No JSON-like structure found"};let i=t===-1?a:a===-1?t:Math.min(t,a),r=e.substring(i);for(let s of this.strategies)s.canApply(r)&&(r=s.apply(r));return{success:!0,data:JSON.parse(r)}}catch(t){return{success:!1,error:`Aggressive fallback failed: ${t}`}}}addStrategy(e){this.strategies.push(e)}removeStrategy(e){this.strategies=this.strategies.filter(t=>t.name!==e)}getStrategies(){return this.strategies.map(e=>e.name)}};ao.ResilientJsonParser=Nm;var VN=new Nm;function r2e(o,e){return(e?new Nm(e):VN).parse(o)}function n2e(o){let e=VN.parse(o);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 s2e(o){try{return JSON.parse(o),!0}catch{return!1}}function c2e(o,e=2){return JSON.stringify(o,null,e)}function m2e(o){let t=new Nm().parse(o);if(t.success)return JSON.stringify(t.data);throw new Error("Cannot minify invalid JSON")}});var Pt=f(oe=>{"use strict";var l2e=oe&&oe.__createBinding||(Object.create?(function(o,e,t,a){a===void 0&&(a=t);var i=Object.getOwnPropertyDescriptor(e,t);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(o,a,i)}):(function(o,e,t,a){a===void 0&&(a=t),o[a]=e[t]})),he=oe&&oe.__exportStar||function(o,e){for(var t in o)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&l2e(e,o,t)};Object.defineProperty(oe,"__esModule",{value:!0});oe.SSELogSubscriptionManager=oe.SuperglueHttpError=oe.SuperglueClient=void 0;he(RC(),oe);he(GC(),oe);he(l8(),oe);he(h8(),oe);he(k8(),oe);he(iu(),oe);he(U8(),oe);he(M8(),oe);he(L8(),oe);he(P8(),oe);he(xv(),oe);he($8(),oe);he(H8(),oe);he(G8(),oe);he(Ev(),oe);he(J8(),oe);he(Z8(),oe);he(K8(),oe);he(eQ(),oe);he(Md(),oe);he(tQ(),oe);he(aQ(),oe);he(rQ(),oe);he(cQ(),oe);he(Cv(),oe);he(pQ(),oe);he(fQ(),oe);he(yQ(),oe);he(kQ(),oe);he(SQ(),oe);he(QQ(),oe);he(Fv(),oe);he($Q(),oe);he(Wv(),oe);he(YQ(),oe);he(KQ(),oe);he(e3(),oe);he(Ht(),oe);he(Fa(),oe);he(o3(),oe);he(t3(),oe);he(jh(),oe);he(zc(),oe);he(Lg(),oe);var JN=GN();Object.defineProperty(oe,"SuperglueClient",{enumerable:!0,get:function(){return JN.SuperglueClient}});Object.defineProperty(oe,"SuperglueHttpError",{enumerable:!0,get:function(){return JN.SuperglueHttpError}});var u2e=Xv();Object.defineProperty(oe,"SSELogSubscriptionManager",{enumerable:!0,get:function(){return u2e.SSELogSubscriptionManager}});he(YN(),oe)});var Cy=require("commander");var kt=pe(require("fs")),KN=pe(require("os")),Pr=pe(require("path")),xd=pe(Pt()),WN=new Set(["runner","builder","admin"]),ZN={output:{mode:"stdout",directory:".superglue/output"},preset:"admin"};function Fr(o){let e=Pr.join(process.cwd(),".superglue"),t=KN.homedir();if(!t)return e;let a=Pr.join(t,".superglue");return o===!0?e:o===!1?a:kt.existsSync(Pr.join(e,"config.json"))?e:a}function Pq(o){return Pr.join(Fr(o),"config.json")}function Jb(o){let e=Pq(o);if(!kt.existsSync(e))return{};try{return JSON.parse(kt.readFileSync(e,"utf-8"))}catch{return{}}}function Om(o){let e=Jb(),t=o.apiKey||(0,xd.readProcessEnvironmentValue)("SUPERGLUE_API_KEY")||e.apiKey||"",a=o.endpoint||(0,xd.readProcessEnvironmentValue)("SUPERGLUE_API_ENDPOINT")||e.endpoint||"https://api.superglue.cloud",i=(0,xd.readProcessEnvironmentValue)("SUPERGLUE_WEB_ENDPOINT")||e.webEndpoint||a.replace(/:3002\b/,":3001").replace(/api\.superglue/,"app.superglue"),r=(0,xd.readProcessEnvironmentValue)("SUPERGLUE_CLI_PRESET"),n=r&&WN.has(r)?r:e.preset&&WN.has(e.preset)?e.preset:"admin";return{...ZN,...e,apiKey:t,endpoint:a,webEndpoint:i,preset:n,output:{...ZN.output,...e.output}}}function Wb(o,e){let t=Fr(e);kt.existsSync(t)||kt.mkdirSync(t,{recursive:!0}),kt.writeFileSync(Pr.join(t,"config.json"),JSON.stringify(o,null,2)+`
|
|
1670
|
-
`,{mode:384})}function Zb(o,e){let t=Pr.join(Fr(e),"drafts");if(kt.existsSync(t)||kt.mkdirSync(t,{recursive:!0}),o.output.mode==="stdout+file"){let a=Pr.resolve(o.output.directory);kt.existsSync(a)||kt.mkdirSync(a,{recursive:!0})}}var Jq=pe(Pt());var Fq=pe(require("readline"));var oO=require("child_process"),tO=require("util");var XN={name:"@superglue/cli",version:"1.1.
|
|
1670
|
+
`,{mode:384})}function Zb(o,e){let t=Pr.join(Fr(e),"drafts");if(kt.existsSync(t)||kt.mkdirSync(t,{recursive:!0}),o.output.mode==="stdout+file"){let a=Pr.resolve(o.output.directory);kt.existsSync(a)||kt.mkdirSync(a,{recursive:!0})}}var Jq=pe(Pt());var Fq=pe(require("readline"));var oO=require("child_process"),tO=require("util");var XN={name:"@superglue/cli",version:"1.1.113",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 g2e=(0,tO.promisify)(oO.exec),rt=XN.version;function eO(o){let e=o.match(/^(\d+)(?:-(.+))?$/);return e?{numeric:parseInt(e[1],10),prerelease:e[2]||null}:{numeric:0,prerelease:o}}function Xb(o,e){let t=o.split("."),a=e.split("."),i=Math.max(t.length,a.length);for(let r=0;r<i;r++){let n=eO(t[r]||"0"),s=eO(a[r]||"0");if(n.numeric<s.numeric)return-1;if(n.numeric>s.numeric||n.prerelease===null&&s.prerelease!==null)return 1;if(n.prerelease!==null&&s.prerelease===null)return-1;if(n.prerelease!==null&&s.prerelease!==null){if(n.prerelease<s.prerelease)return-1;if(n.prerelease>s.prerelease)return 1}}return 0}async function ey(){try{let o=await fetch("https://registry.npmjs.org/@superglue/cli/latest",{signal:AbortSignal.timeout(5e3)});return o.ok&&(await o.json()).version||null}catch{return null}}var Kb=null;function aO(){me()&&(Kb=ey())}async function iO(){if(!(!me()||!Kb)){try{let o=new Promise(t=>{setTimeout(()=>t(null),2e3).unref()}),e=await Promise.race([Kb,o]);e&&Xb(rt,e)<0&&(console.error(""),console.error(`${b.cyan}${b.bold} Update available: ${rt} \u2192 ${e}${b.reset}`),console.error(`${b.cyan} Run ${b.bold}sg update${b.reset}${b.cyan} to upgrade${b.reset}`),console.error(""))}catch{}Kb=null}}async function rO(){let o=await ey();if(!o)return{success:!1,message:"Could not fetch latest version from npm"};if(Xb(rt,o)>=0)return{success:!0,message:`Already on latest version (${rt})`};try{return await g2e("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${rt} to ${o}`}}catch(e){return{success:!1,message:`Update failed: ${e.message}. Try manually: npm install -g @superglue/cli@latest`}}}var me=()=>process.argv.includes("--table")&&process.stdout.isTTY,ya=()=>process.argv.includes("--full"),b={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 nO(o,e){let t=e||o;return`\x1B]8;;${o}\x07${b.underline}${b.cyan}${t}${b.reset}\x1B]8;;\x07`}function sO(){if(!me())return;let o=b.reset,e=b.dim,t="\x1B[47;30m",a=[" #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@- "," =@@@- @@@@ "," @@@ @@% "," -@@ @@@@= @@@ @@@ @@@@@#@ @@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@@@@* %@@ "," @@ @@@ *@ @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @% @@@ @@@ @@@ @@* @@# "," #@@ @@@# @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @@@ @@@ @@@ @@* @@ "," @@- @@@@= @@@ @@@ @@@@@@@ @@@@@@ @@@@@@@ @@@ @@% @@@ @@@ @@@ @@@@@. @@."," #@% .@@@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* @@ "," @@ @ @@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* *@@ "," -@@ @@@@= @@@@@@ @@@ @@@@@@@ @@@ -@@ @@@@@@ @@@@@@% @@@@@@. @@@@@@* #@@ "," :@@* @@@ "," %@@@ =@@@. "," :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% "];console.log(""),a.forEach(i=>{let r=i.search(/\S/),n=i.length-[...i].reverse().join("").search(/\S/)-1;if(r===-1)return console.log(" "+i);let s=i.slice(0,r),c=i.slice(r,n+1).split("").map(l=>l===" "?" ":"\u2588").join(""),m=i.slice(n+1);console.log(` ${s}${t}${c}${o}${m}`)}),console.log(` ${e} CLI v${rt}${o}`),console.log("")}function eo(o){if(!me())return{stop:()=>{},update:()=>{},log:()=>{}};let e=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],t=0,a=o,i=()=>process.stdout.write("\r\x1B[2K"),r=()=>{process.stdout.write(`\r ${b.cyan}${e[t++%e.length]}${b.reset} ${a}`)},n=setInterval(r,80);return{update:s=>{a=s},log:s=>{i(),console.log(` ${b.dim}\u2502${b.reset} ${s}`),r()},stop:s=>{clearInterval(n),i(),s&&console.log(` ${s}`)}}}function te(o){me()?oy(o):console.log(JSON.stringify(o,null,2))}function qe(o,e){me()?(console.log(` ${b.green}\u2713${b.reset} ${o}`),e&&oy(e,4)):console.log(JSON.stringify({success:!0,message:o,...e&&typeof e=="object"?e:{data:e}}))}function I(o,e){me()?(console.error(` ${b.red}\u2717${b.reset} ${o}`),e&&oy(e,4)):console.error(JSON.stringify({success:!1,error:o,details:e}))}function cO(o){me()&&console.log(` ${b.yellow}\u26A0${b.reset} ${o}`)}function Yo(o){me()&&console.log(` ${b.dim}${o}${b.reset}`)}function $r(o){me()&&(console.log(`
|
|
1671
1671
|
${b.bold}${b.cyan}${o}${b.reset}`),console.log(` ${b.dim}${"\u2500".repeat(o.length)}${b.reset}`))}function ir(o,e,t){if(!me()){console.log(JSON.stringify({success:!0,total:t?.total??o.length,items:o}));return}if(o.length===0){console.log(`
|
|
1672
1672
|
${b.dim}0 results${b.reset}
|
|
1673
1673
|
`);return}let a=e||Object.keys(o[0]),i=ya()?1/0:60,r=a.map(l=>Math.min(i,Math.max(l.length,...o.map(u=>String(u[l]??"").replace(/[\n\r]+/g," ").trim().length))));console.log("");let n=a.map((l,u)=>`${b.bold}${b.cyan}${l.toUpperCase().padEnd(r[u])}${b.reset}`).join(" ");console.log(` ${n}`);let s=r.map(l=>`${b.dim}${"\u2500".repeat(l)}${b.reset}`).join(`${b.dim}\u2500\u2500${b.reset}`);console.log(` ${s}`);for(let l of o){let u=a.map((d,g)=>{let h=String(l[d]??"").replace(/[\n\r]+/g," ").trim();if(h.length>i){let w=`\u2026 (${h.length})`;h=h.slice(0,Math.max(0,i-w.length))+`${b.dim}${w}${b.reset}`}return d==="status"?`${{success:b.green,running:b.yellow,failed:b.red,aborted:b.red,error:b.red,pending:b.dim}[h.toLowerCase()]||""}${h.padEnd(r[g])}${b.reset}`:h.padEnd(r[g])}).join(" ");console.log(` ${u}`)}let c=t?.total??o.length,m=c===o.length?`${o.length} result${o.length===1?"":"s"}`:`${o.length} of ${c} result${c===1?"":"s"}`;console.log(`
|