@superglue/cli 1.1.66 → 1.1.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "superglue",
3
3
  "description": "Build, test, and manage superglue tools via the sg CLI. Use when working with superglue tools, systems, APIs, SDKs, or the sg command.",
4
- "version": "1.1.66",
4
+ "version": "1.1.68",
5
5
  "author": {
6
6
  "name": "superglue",
7
7
  "email": "hello@superglue.cloud"
package/dist/cli.js CHANGED
@@ -365,7 +365,7 @@ ${e.map(t=>`- ${t.path}: ${t.message}`).join(`
365
365
  `).map(a=>`${e}${a}`)].join(`
366
366
  `)}function pi(o,e){return o.includes(`
367
367
  `)?BY(o,e):JSON.stringify(o)}function QY(o){let e=["---"];if(e.push(`name: ${pi(o.id," ")}`),e.push(`title: ${pi(o.name," ")}`),e.push(`when_to_run: ${pi(o.whenToRun," ")}`),o.systemRefs.length>0){e.push("systems:");for(let a of o.systemRefs)e.push(` - id: ${pi(a.id," ")}`)}if(o.toolRefs.length>0){e.push("tools:");for(let a of o.toolRefs)e.push(` - id: ${pi(a.id," ")}`)}if(o.credentialRefs.length>0){e.push("credentials:");for(let a of o.credentialRefs)e.push(` - id: ${pi(a.id," ")}`)}if(o.fileRefs.length>0){e.push("files:");for(let a of o.fileRefs)e.push(` - ${pi(a.name," ")}`);e.push(`# read attachments at /org/playbooks/${o.id}/files/<name>.json (.raw for original bytes)`)}e.push(`completion_criteria: ${pi(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(`
368
- `);if(t.length>h2.PLAYBOOK_LIMITS.compiledRender)throw new Error(`Compiled playbook render for '${o.id}' exceeds ${h2.PLAYBOOK_LIMITS.compiledRender} chars (${t.length})`);return t}});var nb=y(Tt=>{"use strict";Object.defineProperty(Tt,"__esModule",{value:!0});Tt.RESOURCE_KINDS=Tt.RESOURCE_DEFINITIONS=void 0;Tt.isResourceKind=SY;Tt.getResourceDefinition=DY;Tt.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"}};Tt.RESOURCE_KINDS=Object.keys(Tt.RESOURCE_DEFINITIONS);function SY(o){return typeof o=="string"&&Object.prototype.hasOwnProperty.call(Tt.RESOURCE_DEFINITIONS,o)}function DY(o){return Tt.RESOURCE_DEFINITIONS[o]}});var I2=y(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.RESERVED_ROLE_NAMES=_.RESERVED_ROLE_IDS=_.PREDEFINED_ROLE_IDS=void 0;_.toResourceRef=Fc;_.toWildcardResourceRef=Lc;_.getDefaultMemberResourceGrants=RY;_.parseResourceRef=Uu;_.getWildcardResourceRef=b2;_.normalizeResourcePermissions=hi;_.permissionSatisfies=Mu;_.highestResourcePermission=_u;_.grantHasPermission=lb;_.grantMatchesResource=Tr;_.getEffectiveResourcePermissions=ub;_.hasResourcePermission=TY;_.getRoleResourceGrants=Ou;_.getAllowedResourceIds=y2;_.getAllowedResourceIdsForRoles=Fu;_.getEffectiveResourcePermissionsForRoles=Nr;_.getAllowedToolIds=k2;_.getAllowedSystemIds=A2;_.pickLongestHeldResource=UY;_.getAllowedCredentialsIds=MY;_.getEffectiveCredentialsPermissions=_Y;_.getEffectiveToolPermissions=OY;_.getEffectiveSystemPermissions=FY;_.checkResourcePermission=Lu;_.isToolAllowed=LY;_.isSystemVisible=PY;_.isPlaybookVisible=HY;_.hasAllSystems=YY;_.hasAllTools=GY;_.getResourceGrantSources=w2;_.getSharePermissionForResource=v2;_.getAccessRulePermissionForResource=x2;_.hasAdminBaseRole=db;_.resolveResourceAccessForRoles=VY;_.normalizeResourceGrantInput=z2;_.normalizeRoleResourceGrantInput=WY;_.isPredefinedRole=$Y;_.isReservedRoleId=JY;_.isReservedRoleName=KY;_.hasRole=ZY;_.getRoleIds=XY;_.getBaseRole=q2;_.getBaseRoleId=eG;_.getPersonalRole=E2;_.getPersonalRoleId=oG;var Tu=nb(),Nu="*";function Fc(o,e){if(!e||e===Nu)throw new Error("Resource id is required");return`${o}:${encodeURIComponent(e)}`}function Lc(o){return`${o}:${Nu}`}function RY(){return Tu.RESOURCE_KINDS.flatMap(o=>{let e=(0,Tu.getResourceDefinition)(o).memberDefaultPermission;return e?[{resourceRef:Lc(o),permissions:[e]}]:[]})}function Uu(o){let e=o.indexOf(":");if(e<=0)return null;let t=o.slice(0,e);if(!(0,Tu.isResourceKind)(t))return null;let a=o.slice(e+1);if(!a)return null;if(a===Nu)return{kind:t,id:Nu,isWildcard:!0};try{return{kind:t,id:decodeURIComponent(a),isWildcard:!1}}catch{return null}}function b2(o){let e=Uu(o);return e?Lc(e.kind):null}function hi(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 Mu(o,e){return o===e||o==="editor"&&e==="viewer"}function _u(o){let e=hi(o);if(e.includes("editor"))return"editor";if(e.includes("viewer"))return"viewer"}function lb(o,e){return o.revokedAt?!1:hi(o.permissions).some(t=>Mu(t,e))}function Tr(o,e){return o.revokedAt?!1:o.resourceRef===e||o.resourceRef===b2(e)}function ub(o,e){let t=new Set;for(let a of o)if(Tr(a,e))for(let i of hi(a.permissions))t.add(i);return Array.from(t)}function TY(o,e,t){return ub(o,e).some(a=>Mu(a,t))}function Ou(o){return o.flatMap(e=>e.isBaseRole&&e.id==="admin"?[]:e.resourceGrants||[])}function y2(o,e,t){let a=Lc(e),i=new Set;for(let s of o){if(!lb(s,t))continue;if(s.resourceRef===a)return;let r=Uu(s.resourceRef);r?.kind===e&&!r.isWildcard&&i.add(r.id)}return Array.from(i)}function Fu(o,e,t){if(!db(o))return y2(Ou(o),e,t)}function Nr(o,e,t){return db(o)?["editor","viewer"]:ub(Ou(o),Fc(e,t))}function NY(o){return(0,Tu.getResourceDefinition)(o).label}function k2(o,e="viewer"){return Fu(o,"tool",e)}function A2(o,e="viewer"){return Fu(o,"system",e)}var mb=Number.MAX_SAFE_INTEGER;function cb(o){if(!o)return mb;let e=new Date(o).getTime();return Number.isNaN(e)?mb:e}function UY(o,e,t){if(o.length<=1)return o[0];let a=i=>{let s=Fc(t,i.id),r=mb;for(let n of e)Tr(n,s)&&(r=Math.min(r,cb(n.createdAt)));return r};return[...o].sort((i,s)=>{let r=a(i)-a(s);return r!==0?r:cb(i.createdAt)-cb(s.createdAt)})[0]}function MY(o,e="viewer"){return Fu(o,"credential",e)}function _Y(o,e){return Nr(o,"credential",e)}function OY(o,e){return Nr(o,"tool",e)}function FY(o,e){return Nr(o,"system",e)}function Lu(o,e,t,a){return Nr(o,e,t).some(s=>Mu(s,a))?{allowed:!0}:{allowed:!1,error:`${NY(e)} '${t}' requires a '${a}' grant`}}function LY(o,e,t="viewer"){return Lu(o,"tool",e,t)}function PY(o,e,t="viewer"){return Lu(o,"system",e,t)}function HY(o,e,t="viewer"){return Lu(o,"playbook",e,t)}function YY(o,e="viewer"){return A2(o,e)===void 0}function GY(o,e="viewer"){return k2(o,e)===void 0}function w2(o,e,t="viewer"){let a=new Set;for(let i of o)Tr(i,e)&&lb(i,t)&&a.add(i.source);return Array.from(a)}function v2(o,e){let t=o.filter(a=>a.source==="share"&&Tr(a,e)).flatMap(a=>hi(a.permissions));return _u(t)}function x2(o,e){let t=o.filter(a=>a.source==="access_rule"&&Tr(a,e)).flatMap(a=>hi(a.permissions));return _u(t)}function db(o){return o.some(e=>e.isBaseRole&&e.id==="admin")}function VY({roles:o,resource:e,userId:t}){let a=Fc(e.kind,e.id),i=Ou(o),s=new Set(Nr(o,e.kind,e.id)),r=new Set(w2(i,a));e.ownerUserId&&e.ownerUserId===t&&(s.add("editor"),s.add("viewer"),r.add("ownership"));let n=hi(Array.from(s));return{permissions:n,sources:Array.from(r),sharePermission:v2(i,a),accessRulePermission:x2(i,a),maxPermission:_u(n)}}function z2(o){let e=Uu(o.resourceRef);if(!e)throw new Error(`Invalid resource ref '${o.resourceRef}'`);return{...o,resourceRef:e.isWildcard?Lc(e.kind):Fc(e.kind,e.id),permissions:hi(o.permissions||["viewer"]),source:o.source||"access_rule"}}function WY(o){let e=z2({resourceRef:o.resourceRef,permissions:o.permissions,source:"access_rule"});return{resourceRef:e.resourceRef,permissions:e.permissions,source:"access_rule"}}_.PREDEFINED_ROLE_IDS=["admin","member"];_.RESERVED_ROLE_IDS=["admin","member","__admin__"];_.RESERVED_ROLE_NAMES=["member","admin"];function $Y(o){return _.PREDEFINED_ROLE_IDS.includes(o)}function JY(o){return _.RESERVED_ROLE_IDS.includes(o)}function KY(o){return _.RESERVED_ROLE_NAMES.includes(o.toLowerCase().trim())}function ZY(o,e){return o.some(t=>t.id===e)}function XY(o){return o.map(e=>e.id)}function q2(o){let e=o.filter(t=>t.isBaseRole);return e.length===1?e[0]:null}function eG(o){let e=q2(o);return e?e.id:null}function E2(o){return o.find(e=>e.isPersonalRole)||null}function oG(o){let e=E2(o);return e?e.id:null}});var j2=y(Po=>{"use strict";Object.defineProperty(Po,"__esModule",{value:!0});Po.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=Po.CLIENT_REQUEST_SOURCES=Po.REQUEST_SOURCES=void 0;Po.isRequestSource=C2;Po.isClientRequestSource=iG;Po.parseRequestSource=sG;var fo=it();Po.REQUEST_SOURCES=[fo.RequestSource.API,fo.RequestSource.FRONTEND,fo.RequestSource.AGENT,fo.RequestSource.SCHEDULER,fo.RequestSource.MCP,fo.RequestSource.TOOL_CHAIN,fo.RequestSource.WEBHOOK,fo.RequestSource.CLI];Po.CLIENT_REQUEST_SOURCES=[fo.RequestSource.FRONTEND,fo.RequestSource.AGENT,fo.RequestSource.MCP,fo.RequestSource.CLI];Po.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=[fo.RequestSource.FRONTEND,fo.RequestSource.AGENT,fo.RequestSource.MCP];var tG=new Set(Po.REQUEST_SOURCES),aG=new Set(Po.CLIENT_REQUEST_SOURCES);function C2(o){return tG.has(o)}function iG(o){return aG.has(o)}function sG(o){let e=o.toLowerCase();return C2(e)?e:void 0}});var hb=y(fe=>{"use strict";Object.defineProperty(fe,"__esModule",{value:!0});fe.systemOptions=fe.systems=void 0;fe.getSystemTemplateAuthentication=D2;fe.mergeSystemTemplateAuthentication=R2;fe.resolveSystemAuthentication=pb;fe.getContextSourceTemplates=T2;fe.resolveContextSourceSetup=lG;fe.findTemplateForSystem=Hu;fe.uniqueKeywords=uG;fe.getOAuthConfig=dG;fe.getOAuthTokenExchangeConfig=gG;fe.getOAuthTokenUrl=pG;var gb=Uc(),Pu=Du();function rG(o){let e=o?.split(/[,\s]+/).filter(Boolean);return e?.length?e:void 0}function D2(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=rG(e.scopes);return{type:"oauth2",...e.registrationUrl?{oauthClientMode:"dynamic"}:{},...e.authUrl?{authUrl:e.authUrl}:{},...e.tokenUrl?{tokenUrl:e.tokenUrl}:{},...e.client_id?{clientId:e.client_id}:{},...e.grant_type?{grantType:e.grant_type}:{},...a?{scopes:a}:{},...Object.keys(t).length?{config:t}:{}}}function nG(o){return!o.config||Object.keys(o.config).length===0}function B2(o,e){let t={...o||{},...e||{}};return Object.keys(t).length>0?t:void 0}function Q2(o,e){if(e)return{...o,config:e};let{config:t,...a}=o;return a}function R2({authentication:o,template:e}){let t=D2(e),a=(0,gb.normalizeSystemAuthentication)(o);if(!a)return t;if(!t)return a;if(a.type==="none"&&nG(a))return t;if(a.type!==t.type)return a;if(a.type==="oauth2"&&t.type==="oauth2"){let i={...t};a.oauthClientMode==="custom"&&(delete i.clientId,delete i.clientSecret);let s={...i,...a},r=(0,gb.resolveOAuthClientMode)({authentication:a,templateClientId:t.clientId,templateRegistrationUrl:e.oauth?.registrationUrl});return r==="managed"&&t.clientId&&(s.clientId=t.clientId),e.contextSource&&r!=="custom"&&t.scopes&&(s.scopes=t.scopes),Q2(s,B2(t.config,a.config))}return Q2({...t,...a},B2(t.config,a.config))}function pb(o){let e=(0,gb.normalizeSystemAuthentication)(o.authentication)||{type:"none"};return R2({authentication:e,template:Hu(o)?.template})||e}fe.systems={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"]},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:
368
+ `);if(t.length>h2.PLAYBOOK_LIMITS.compiledRender)throw new Error(`Compiled playbook render for '${o.id}' exceeds ${h2.PLAYBOOK_LIMITS.compiledRender} chars (${t.length})`);return t}});var nb=y(Tt=>{"use strict";Object.defineProperty(Tt,"__esModule",{value:!0});Tt.RESOURCE_KINDS=Tt.RESOURCE_DEFINITIONS=void 0;Tt.isResourceKind=SY;Tt.getResourceDefinition=DY;Tt.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"}};Tt.RESOURCE_KINDS=Object.keys(Tt.RESOURCE_DEFINITIONS);function SY(o){return typeof o=="string"&&Object.prototype.hasOwnProperty.call(Tt.RESOURCE_DEFINITIONS,o)}function DY(o){return Tt.RESOURCE_DEFINITIONS[o]}});var I2=y(_=>{"use strict";Object.defineProperty(_,"__esModule",{value:!0});_.RESERVED_ROLE_NAMES=_.RESERVED_ROLE_IDS=_.PREDEFINED_ROLE_IDS=void 0;_.toResourceRef=Fc;_.toWildcardResourceRef=Lc;_.getDefaultMemberResourceGrants=RY;_.parseResourceRef=Uu;_.getWildcardResourceRef=b2;_.normalizeResourcePermissions=hi;_.permissionSatisfies=Mu;_.highestResourcePermission=_u;_.grantHasPermission=lb;_.grantMatchesResource=Tr;_.getEffectiveResourcePermissions=ub;_.hasResourcePermission=TY;_.getRoleResourceGrants=Ou;_.getAllowedResourceIds=y2;_.getAllowedResourceIdsForRoles=Fu;_.getEffectiveResourcePermissionsForRoles=Nr;_.getAllowedToolIds=k2;_.getAllowedSystemIds=A2;_.pickLongestHeldResource=UY;_.getAllowedCredentialsIds=MY;_.getEffectiveCredentialsPermissions=_Y;_.getEffectiveToolPermissions=OY;_.getEffectiveSystemPermissions=FY;_.checkResourcePermission=Lu;_.isToolAllowed=LY;_.isSystemVisible=PY;_.isPlaybookVisible=HY;_.hasAllSystems=YY;_.hasAllTools=GY;_.getResourceGrantSources=w2;_.getSharePermissionForResource=v2;_.getAccessRulePermissionForResource=x2;_.hasAdminBaseRole=db;_.resolveResourceAccessForRoles=VY;_.normalizeResourceGrantInput=z2;_.normalizeRoleResourceGrantInput=WY;_.isPredefinedRole=$Y;_.isReservedRoleId=JY;_.isReservedRoleName=KY;_.hasRole=ZY;_.getRoleIds=XY;_.getBaseRole=q2;_.getBaseRoleId=eG;_.getPersonalRole=E2;_.getPersonalRoleId=oG;var Tu=nb(),Nu="*";function Fc(o,e){if(!e||e===Nu)throw new Error("Resource id is required");return`${o}:${encodeURIComponent(e)}`}function Lc(o){return`${o}:${Nu}`}function RY(){return Tu.RESOURCE_KINDS.flatMap(o=>{let e=(0,Tu.getResourceDefinition)(o).memberDefaultPermission;return e?[{resourceRef:Lc(o),permissions:[e]}]:[]})}function Uu(o){let e=o.indexOf(":");if(e<=0)return null;let t=o.slice(0,e);if(!(0,Tu.isResourceKind)(t))return null;let a=o.slice(e+1);if(!a)return null;if(a===Nu)return{kind:t,id:Nu,isWildcard:!0};try{return{kind:t,id:decodeURIComponent(a),isWildcard:!1}}catch{return null}}function b2(o){let e=Uu(o);return e?Lc(e.kind):null}function hi(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 Mu(o,e){return o===e||o==="editor"&&e==="viewer"}function _u(o){let e=hi(o);if(e.includes("editor"))return"editor";if(e.includes("viewer"))return"viewer"}function lb(o,e){return o.revokedAt?!1:hi(o.permissions).some(t=>Mu(t,e))}function Tr(o,e){return o.revokedAt?!1:o.resourceRef===e||o.resourceRef===b2(e)}function ub(o,e){let t=new Set;for(let a of o)if(Tr(a,e))for(let i of hi(a.permissions))t.add(i);return Array.from(t)}function TY(o,e,t){return ub(o,e).some(a=>Mu(a,t))}function Ou(o){return o.flatMap(e=>e.isBaseRole&&e.id==="admin"?[]:e.resourceGrants||[])}function y2(o,e,t){let a=Lc(e),i=new Set;for(let s of o){if(!lb(s,t))continue;if(s.resourceRef===a)return;let r=Uu(s.resourceRef);r?.kind===e&&!r.isWildcard&&i.add(r.id)}return Array.from(i)}function Fu(o,e,t){if(!db(o))return y2(Ou(o),e,t)}function Nr(o,e,t){return db(o)?["editor","viewer"]:ub(Ou(o),Fc(e,t))}function NY(o){return(0,Tu.getResourceDefinition)(o).label}function k2(o,e="viewer"){return Fu(o,"tool",e)}function A2(o,e="viewer"){return Fu(o,"system",e)}var mb=Number.MAX_SAFE_INTEGER;function cb(o){if(!o)return mb;let e=new Date(o).getTime();return Number.isNaN(e)?mb:e}function UY(o,e,t){if(o.length<=1)return o[0];let a=i=>{let s=Fc(t,i.id),r=mb;for(let n of e)Tr(n,s)&&(r=Math.min(r,cb(n.createdAt)));return r};return[...o].sort((i,s)=>{let r=a(i)-a(s);return r!==0?r:cb(i.createdAt)-cb(s.createdAt)})[0]}function MY(o,e="viewer"){return Fu(o,"credential",e)}function _Y(o,e){return Nr(o,"credential",e)}function OY(o,e){return Nr(o,"tool",e)}function FY(o,e){return Nr(o,"system",e)}function Lu(o,e,t,a){return Nr(o,e,t).some(s=>Mu(s,a))?{allowed:!0}:{allowed:!1,error:`${NY(e)} '${t}' requires a '${a}' grant`}}function LY(o,e,t="viewer"){return Lu(o,"tool",e,t)}function PY(o,e,t="viewer"){return Lu(o,"system",e,t)}function HY(o,e,t="viewer"){return Lu(o,"playbook",e,t)}function YY(o,e="viewer"){return A2(o,e)===void 0}function GY(o,e="viewer"){return k2(o,e)===void 0}function w2(o,e,t="viewer"){let a=new Set;for(let i of o)Tr(i,e)&&lb(i,t)&&a.add(i.source);return Array.from(a)}function v2(o,e){let t=o.filter(a=>a.source==="share"&&Tr(a,e)).flatMap(a=>hi(a.permissions));return _u(t)}function x2(o,e){let t=o.filter(a=>a.source==="access_rule"&&Tr(a,e)).flatMap(a=>hi(a.permissions));return _u(t)}function db(o){return o.some(e=>e.isBaseRole&&e.id==="admin")}function VY({roles:o,resource:e,userId:t}){let a=Fc(e.kind,e.id),i=Ou(o),s=new Set(Nr(o,e.kind,e.id)),r=new Set(w2(i,a));e.ownerUserId&&e.ownerUserId===t&&(s.add("editor"),s.add("viewer"),r.add("ownership"));let n=hi(Array.from(s));return{permissions:n,sources:Array.from(r),sharePermission:v2(i,a),accessRulePermission:x2(i,a),maxPermission:_u(n)}}function z2(o){let e=Uu(o.resourceRef);if(!e)throw new Error(`Invalid resource ref '${o.resourceRef}'`);return{...o,resourceRef:e.isWildcard?Lc(e.kind):Fc(e.kind,e.id),permissions:hi(o.permissions||["viewer"]),source:o.source||"access_rule"}}function WY(o){let e=z2({resourceRef:o.resourceRef,permissions:o.permissions,source:"access_rule"});return{resourceRef:e.resourceRef,permissions:e.permissions,source:"access_rule"}}_.PREDEFINED_ROLE_IDS=["admin","member"];_.RESERVED_ROLE_IDS=["admin","member","__admin__"];_.RESERVED_ROLE_NAMES=["member","admin"];function $Y(o){return _.PREDEFINED_ROLE_IDS.includes(o)}function JY(o){return _.RESERVED_ROLE_IDS.includes(o)}function KY(o){return _.RESERVED_ROLE_NAMES.includes(o.toLowerCase().trim())}function ZY(o,e){return o.some(t=>t.id===e)}function XY(o){return o.map(e=>e.id)}function q2(o){let e=o.filter(t=>t.isBaseRole);return e.length===1?e[0]:null}function eG(o){let e=q2(o);return e?e.id:null}function E2(o){return o.find(e=>e.isPersonalRole)||null}function oG(o){let e=E2(o);return e?e.id:null}});var j2=y(Po=>{"use strict";Object.defineProperty(Po,"__esModule",{value:!0});Po.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=Po.CLIENT_REQUEST_SOURCES=Po.REQUEST_SOURCES=void 0;Po.isRequestSource=C2;Po.isClientRequestSource=iG;Po.parseRequestSource=sG;var fo=it();Po.REQUEST_SOURCES=[fo.RequestSource.API,fo.RequestSource.FRONTEND,fo.RequestSource.AGENT,fo.RequestSource.SCHEDULER,fo.RequestSource.MCP,fo.RequestSource.TOOL_CHAIN,fo.RequestSource.WEBHOOK,fo.RequestSource.CLI];Po.CLIENT_REQUEST_SOURCES=[fo.RequestSource.FRONTEND,fo.RequestSource.AGENT,fo.RequestSource.MCP,fo.RequestSource.CLI];Po.NOTIFICATION_EXCLUDED_REQUEST_SOURCES=[fo.RequestSource.FRONTEND,fo.RequestSource.AGENT,fo.RequestSource.MCP];var tG=new Set(Po.REQUEST_SOURCES),aG=new Set(Po.CLIENT_REQUEST_SOURCES);function C2(o){return tG.has(o)}function iG(o){return aG.has(o)}function sG(o){let e=o.toLowerCase();return C2(e)?e:void 0}});var hb=y(fe=>{"use strict";Object.defineProperty(fe,"__esModule",{value:!0});fe.systemOptions=fe.systems=void 0;fe.getSystemTemplateAuthentication=D2;fe.mergeSystemTemplateAuthentication=R2;fe.resolveSystemAuthentication=pb;fe.getContextSourceTemplates=T2;fe.resolveContextSourceSetup=lG;fe.findTemplateForSystem=Hu;fe.uniqueKeywords=uG;fe.getOAuthConfig=dG;fe.getOAuthTokenExchangeConfig=gG;fe.getOAuthTokenUrl=pG;var gb=Uc(),Pu=Du();function rG(o){let e=o?.split(/[,\s]+/).filter(Boolean);return e?.length?e:void 0}function D2(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=rG(e.scopes);return{type:"oauth2",...e.registrationUrl?{oauthClientMode:"dynamic"}:{},...e.authUrl?{authUrl:e.authUrl}:{},...e.tokenUrl?{tokenUrl:e.tokenUrl}:{},...e.client_id?{clientId:e.client_id}:{},...e.grant_type?{grantType:e.grant_type}:{},...a?{scopes:a}:{},...Object.keys(t).length?{config:t}:{}}}function nG(o){return!o.config||Object.keys(o.config).length===0}function B2(o,e){let t={...o||{},...e||{}};return Object.keys(t).length>0?t:void 0}function Q2(o,e){if(e)return{...o,config:e};let{config:t,...a}=o;return a}function R2({authentication:o,template:e}){let t=D2(e),a=(0,gb.normalizeSystemAuthentication)(o);if(!a)return t;if(!t)return a;if(a.type==="none"&&nG(a))return t;if(a.type!==t.type)return a;if(a.type==="oauth2"&&t.type==="oauth2"){let i={...t};a.oauthClientMode==="custom"&&(delete i.clientId,delete i.clientSecret);let s={...i,...a};return(0,gb.resolveOAuthClientMode)({authentication:a,templateClientId:t.clientId,templateRegistrationUrl:e.oauth?.registrationUrl})==="managed"&&t.clientId&&(s.clientId=t.clientId),Q2(s,B2(t.config,a.config))}return Q2({...t,...a},B2(t.config,a.config))}function pb(o){let e=(0,gb.normalizeSystemAuthentication)(o.authentication)||{type:"none"};return R2({authentication:e,template:Hu(o)?.template})||e}fe.systems={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"]},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:
369
369
 
370
370
  SQL Server Authentication (default): user + password in the connection URL. No additional fields needed.
371
371
 
@@ -392,7 +392,7 @@ Authentication is not sent as Authorization: Bearer. First call POST /openapi/v1
392
392
 
393
393
  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.
394
394
 
395
- 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",client_id:"7626585708593.9087382641312"},contextSource:{category:"workspace",systemId:"slack",onboardingOrder:7,onboardingDescription:"Let superglue use joined public channels. superglue will never make posts or read private channels or DMs."},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 is a brain context source (workspace). Load the workspace-apps skill before using it. Keep the API endpoint unchanged. Superglue-managed OAuth installs the superglue Slack app and returns a bot token. The context-source connection requests public-channel history, public-channel discovery, public-channel join, file read, and user read scopes. It excludes private channels, direct messages, message posting, file writes, reactions, and channel management. A bot can read only public channels it has joined. Ask for approval before joining a channel. The managed app can show an unverified-app warning or require workspace administrator approval. Never post, upload, react, modify a channel, or access private conversations through this context source."},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",client_id:"02601365-de97-4191-b12d-e03c8540b03d",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"},contextSource:{category:"email",systemId:"gmail",onboardingOrder:9,onboardingDescription:"Let superglue access your gmail inbox. superglue will never send emails on your behalf."},keywords:["messages","threads","labels","drafts","send","attachments","history","filters","settings","forwarding","inbox","profile","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",client_id:"NBYMQ3dZJDub0dL1X3MX7812Tjc91f-5fFcL5D3tXp4"},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},contextSource:{category:"meetings",systemId:"fathomMcp",onboardingOrder:4,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."},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},contextSource:{category:"meetings",systemId:"granolaMcp",onboardingOrder:2,onboardingDescription:"Let superglue use notes and transcripts. superglue will never join or record meetings."},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"]},googleDrive:{name:"googleDrive",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"},keywords:["files","folders","permissions","sharing","comments","revisions","changes","uploads","downloads","metadata","teamdrives","export","copy","move","oauth"]},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"},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"},keywords:["spreadsheets","sheets","cells","ranges","values","formulas","formatting","charts","pivot tables","named ranges","protected ranges","batch update","append","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:
395
+ 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",client_id:"7626585708593.9087382641312"},contextSource:{category:"workspace",systemId:"slack",onboardingOrder:7,onboardingDescription:"Connect joined public channels so superglue can use relevant workspace context."},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",client_id:"02601365-de97-4191-b12d-e03c8540b03d",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"},contextSource:{category:"email",systemId:"gmail",onboardingOrder:9,onboardingDescription:"Let superglue access your gmail inbox. superglue will never send emails on your behalf."},keywords:["messages","threads","labels","drafts","send","attachments","history","filters","settings","forwarding","inbox","profile","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",client_id:"NBYMQ3dZJDub0dL1X3MX7812Tjc91f-5fFcL5D3tXp4"},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},contextSource:{category:"meetings",systemId:"fathomMcp",onboardingOrder:4,onboardingDescription:"Let superglue use meeting notes and transcripts. superglue will never join or record meetings."},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},contextSource:{category:"meetings",systemId:"granolaMcp",onboardingOrder:2,onboardingDescription:"Let superglue use notes and transcripts. superglue will never join or record meetings."},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"]},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"},contextSource:{category:"workspace",systemId:"google-drive",onboardingOrder:9,onboardingDescription:"Connect accessible Drive files for relevant workspace context."},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"},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"},keywords:["spreadsheets","sheets","cells","ranges","values","formulas","formatting","charts","pivot tables","named ranges","protected ranges","batch update","append","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:
396
396
 
397
397
  OPTION 1: OAuth App (Recommended)
398
398
  If the user has or creates an OAuth app in their Google Cloud project:
@@ -421,13 +421,13 @@ REQUIRED GCP PERMISSIONS:
421
421
  - BigQuery Data Editor (roles/bigquery.dataEditor) - write access
422
422
  - BigQuery Job User (roles/bigquery.jobUser) - run queries
423
423
 
424
- HEADERS: { "Authorization": "Bearer <<token>>", "Content-Type": "application/json" }`,keywords:["datasets","tables","queries","jobs","projects","schemas","rows","streaming","partitions","clustering","views","routines","models","data warehouse","sql","oauth"]},firebase:{name:"firebase",apiUrl:"https://firestore.googleapis.com",regex:"^.*(firebase|firestore).*$",icon:"firebase",docsUrl:"https://firebase.google.com/docs/reference/firebase-management/rest",openApiUrl:"https://firestore.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/firebase https://www.googleapis.com/auth/cloud-platform"},keywords:["firestore","realtime database","authentication","cloud functions","storage","hosting","documents","collections","users","projects","apps","query","oauth"]},salesforce:{name:"salesforce",apiUrl:"https://api.salesforce.com",regex:"^.*salesforce.*$",icon:"salesforce",docsUrl:"https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_rest.htm",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.salesforce.com/services/oauth2/authorize",tokenUrl:"https://login.salesforce.com/services/oauth2/token",scopes:"full",grant_type:"authorization_code",client_id:"3MVG9rZjd7MXFdLj8gMo0sojKlWRAgOP9F7nsk3Tec.eesq86nNTvbzDJDcmCW9YRCbteTayd_dP4OCLtISIo"},keywords:["accounts","contacts","leads","opportunities","cases","campaigns","products","price books","quotes","contracts","orders","custom objects","soql","query","search","sobjects","oauth"]},facebook:{name:"facebook",apiUrl:"https://graph.facebook.com",regex:"^.*facebook.*$",icon:"facebook",docsUrl:"https://developers.facebook.com/docs/graph-api",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.facebook.com/v18.0/dialog/oauth",tokenUrl:"https://graph.facebook.com/v18.0/oauth/access_token",scopes:"email public_profile pages_show_list pages_read_engagement pages_manage_metadata pages_read_user_content pages_manage_posts pages_manage_engagement business_management ads_management ads_read catalog_management leads_retrieval"},keywords:["pages","posts","comments","insights","ads","campaigns","audiences","business","catalog","events","groups","photos","videos","live videos","oauth"]},meta_ads:{name:"meta_ads",apiUrl:"https://graph.facebook.com",regex:"^.*(meta[_ .-]?ads|facebook[_ .-]?ads|marketing[_ .-]?api|/act_).*$",icon:"meta",docsUrl:"https://developers.facebook.com/docs/marketing-api/",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.facebook.com/v23.0/dialog/oauth",tokenUrl:"https://graph.facebook.com/v23.0/oauth/access_token",scopes:"ads_read ads_management business_management"},keywords:["meta ads","facebook ads","marketing api","ad accounts","campaigns","adsets","ads","adcreatives","insights","custom audiences","pixels","leadgen forms","product catalogs","spend","reach","oauth"],systemSpecificInstructions:"Ad account IDs are prefixed with act_ in all request paths (e.g. /v23.0/act_<ACCOUNT_ID>/insights, /act_<ACCOUNT_ID>/campaigns) \u2014 the numeric ID alone fails. With Standard Access, ads_read/ads_management only work for users who hold a role on the Meta app (suitable for development); serving arbitrary users requires Advanced Access, which needs business verification and App Review. For unattended server-to-server use, Business Manager system user tokens are the standard approach instead of user OAuth tokens. Graph API versions sunset roughly two years after release \u2014 prefer the latest version in paths rather than copying versions from older examples."},instagram:{name:"instagram",apiUrl:"https://graph.facebook.com/v23.0/",regex:"^.*instagram.*$",icon:"instagram",docsUrl:"https://developers.facebook.com/docs/instagram-platform/",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.facebook.com/v23.0/dialog/oauth",tokenUrl:"https://graph.facebook.com/v23.0/oauth/access_token",scopes:"instagram_basic pages_show_list instagram_content_publish pages_read_engagement instagram_manage_comments instagram_manage_insights instagram_manage_messages business_management"},keywords:["instagram","instagram api","instagram graph api","media","posts","stories","comments","insights","hashtags","mentions","business discovery","content publishing","user media","account info","oauth"],systemSpecificInstructions:"There are two distinct Instagram APIs: this template targets the Instagram API with Facebook Login (host graph.facebook.com), which requires an Instagram professional (Business/Creator) account linked to a Facebook Page; hashtag search and business discovery are only available on this variant. The alternative Instagram API with Instagram Login uses host graph.instagram.com, needs no Facebook Page, and uses different tokens/scopes. The legacy Instagram Basic Display API was shut down in December 2024 and cannot be used."},twitter:{name:"twitter",apiUrl:"https://api.twitter.com",regex:"^https?:\\/\\/(?:[^/]+\\.)*(?:twitter\\.com|x\\.com)(?:[:/?#].*)?$",icon:"x",docsUrl:"https://docs.x.com/x-api/introduction",openApiUrl:"https://api.x.com/2/openapi.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://twitter.com/i/oauth2/authorize",tokenUrl:"https://api.twitter.com/2/oauth2/token",scopes:"tweet.read tweet.write users.read follows.read follows.write offline.access like.read like.write list.read list.write block.read block.write bookmark.read bookmark.write mute.read mute.write"},keywords:["tweets","users","followers","timeline","mentions","retweets","likes","lists","spaces","direct messages","trends","media","polls","oauth"]},linkedin:{name:"linkedin",apiUrl:"https://api.linkedin.com",regex:"^.*linkedin.*$",icon:"/logos/linkedin.svg",docsUrl:"https://learn.microsoft.com/en-us/linkedin/shared/authentication/getting-access",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.linkedin.com/oauth/v2/authorization",tokenUrl:"https://www.linkedin.com/oauth/v2/accessToken",scopes:"r_liteprofile r_emailaddress w_member_social r_fullprofile r_basicprofile rw_company_admin r_1st_connections r_ads r_ads_reporting r_organization_social rw_organization_admin w_organization_social r_events"},keywords:["profiles","connections","companies","shares","posts","articles","jobs","skills","endorsements","recommendations","groups","events","messaging","oauth"]},paypal:{name:"paypal",apiUrl:"https://api.paypal.com",regex:"^.*paypal.*$",icon:"paypal",docsUrl:"https://developer.paypal.com/api/rest",preferredAuthType:"api_key",keywords:["payments","orders","captures","refunds","payouts","invoices","subscriptions","plans","products","transactions","balances","webhooks","checkout","billing","query","search"]},square:{name:"square",apiUrl:"https://connect.squareup.com",regex:"^.*(square|squareup).*$",icon:"square",docsUrl:"https://developer.squareup.com/reference/square",openApiUrl:"https://raw.githubusercontent.com/square/connect-api-specification/refs/heads/master/api.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://connect.squareup.com/oauth2/authorize",tokenUrl:"https://connect.squareup.com/oauth2/token",scopes:"MERCHANT_PROFILE_READ PAYMENTS_READ PAYMENTS_WRITE CUSTOMERS_READ CUSTOMERS_WRITE INVENTORY_READ INVENTORY_WRITE ORDERS_READ ORDERS_WRITE ITEMS_READ ITEMS_WRITE EMPLOYEES_READ EMPLOYEES_WRITE TIMECARDS_READ TIMECARDS_WRITE"},keywords:["payments","customers","orders","catalog","inventory","locations","transactions","refunds","cards","checkout","invoices","subscriptions","terminals","employees","shifts","query","search","oauth"]},adyen:{name:"adyen",apiUrl:"https://checkout-test.adyen.com",regex:"^.*adyen.*$",icon:"adyen",docsUrl:"https://docs.adyen.com/api-explorer",openApiUrl:"https://raw.githubusercontent.com/Adyen/adyen-openapi/main/yaml/CheckoutService-v71.yaml",preferredAuthType:"api_key",keywords:["paymentMethods","sessions","payments","payments.details","cardDetails","recurringContracts","payouts","balanceTransfers","legalEntities","binLookup","storedValueCards","transferRules","terminalManagement","accountHolders","issuers"]},razorpay:{name:"razorpay",apiUrl:"https://api.razorpay.com",regex:"^.*razorpay.*$",icon:"razorpay",docsUrl:"https://razorpay.com/docs/api",preferredAuthType:"api_key",keywords:["payments","orders","customers","refunds","invoices","subscriptions","accounts","fund_accounts","payouts","virtual_accounts","mandates","disputes","settlements","payment_links","bin_lookup"]},plaid:{name:"plaid",apiUrl:"https://production.plaid.com",regex:"^.*plaid.*$",icon:"/logos/plaid.svg",docsUrl:"https://plaid.com/docs/api",openApiUrl:"https://raw.githubusercontent.com/plaid/plaid-openapi/master/2020-09-14.yml",preferredAuthType:"api_key",keywords:["items","accounts","institutions","link_tokens","access_tokens","transactions","auth","identity","assets","liabilities","income","user","processor_tokens","transfer","investments"]},zendesk:{name:"zendesk",apiUrl:"https://api.zendesk.com",regex:"^.*zendesk.*$",icon:"zendesk",docsUrl:"https://developer.zendesk.com/api-reference",openApiUrl:"https://developer.zendesk.com/zendesk/oas.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://{subdomain}.zendesk.com/oauth/authorizations/new",tokenUrl:"https://{subdomain}.zendesk.com/oauth/tokens",scopes:"read write tickets:read tickets:write users:read users:write organizations:read organizations:write hc:read hc:write chat:read chat:write"},keywords:["tickets","users","organizations","groups","agents","views","macros","triggers","automations","sla","custom fields","tags","satisfaction","help center","api key"]},freshdesk:{name:"freshdesk",apiUrl:"https://{domain}.freshdesk.com/api/v2",regex:"^.*freshdesk.*$",icon:"/logos/freshdesk.svg",docsUrl:"https://developers.freshdesk.com/api",preferredAuthType:"api_key",keywords:["tickets","contacts","agents","companies","groups","forums","solutions","categories","folders","articles","time entries","surveys","satisfaction","sla","escalations","api key"]},freshworks:{name:"freshworks",apiUrl:"https://{domain}.freshservice.com/api/v2",regex:"^.*(freshworks|freshservice).*$",icon:"/logos/freshworks.svg",docsUrl:"https://api.freshservice.com",preferredAuthType:"api_key",keywords:["tickets","requesters","agents","assets","changes","problems","releases","service catalog","service items","departments","locations","products","vendors","contracts","api key"]},servicenow:{name:"servicenow",apiUrl:"https://{instance}.service-now.com/api",regex:"^.*(servicenow|service-now).*$",icon:"servicenow",docsUrl:"https://developer.servicenow.com/dev.do#!/reference/api/latest/rest",preferredAuthType:"api_key",keywords:["incidents","problems","changes","requests","users","groups","cmdb","configuration items","service catalog","knowledge","tasks","approvals","sla","workflows","tables","api key"]},helpscout:{name:"helpscout",apiUrl:"https://api.helpscout.net",regex:"^.*helpscout.*$",icon:"helpscout",docsUrl:"https://developer.helpscout.com/mailbox-api",preferredAuthType:"api_key",keywords:["conversations","customers","mailboxes","threads","tags","teams","users","reports","satisfaction","ratings","workflows","saved replies","docs","beacon","api key"]},dropbox:{name:"dropbox",apiUrl:"https://api.dropboxapi.com",regex:"^.*dropbox.*$",icon:"dropbox",docsUrl:"https://www.dropbox.com/developers/documentation/http/documentation",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.dropbox.com/oauth2/authorize",tokenUrl:"https://api.dropboxapi.com/oauth2/token",scopes:"files.metadata.read files.metadata.write files.content.read files.content.write sharing.read sharing.write account_info.read account_info.write"},keywords:["files","folders","upload","download","sharing","links","metadata","search","sync","paper","users","teams","move","copy","delete","oauth"]},mailchimp:{name:"mailchimp",apiUrl:"https://api.mailchimp.com",regex:"^.*mailchimp.*$",icon:"mailchimp",docsUrl:"https://mailchimp.com/developer/marketing/api",openApiUrl:"https://api.mailchimp.com/schema/3.0/Swagger.json",preferredAuthType:"api_key",oauth:{authUrl:"https://login.mailchimp.com/oauth2/authorize",tokenUrl:"https://login.mailchimp.com/oauth2/token",scopes:"audiences:read audiences:write automations:read automations:write campaigns:read campaigns:write conversations:read conversations:write ecommerce:read ecommerce:write files:read files:write lists:read lists:write reports:read templates:read templates:write"},keywords:["lists","campaigns","templates","audiences","members","segments","tags","automations","reports","folders","merge fields","activities","ecommerce","batch","query","api key"]},jira:{name:"jira",apiUrl:"https://{your-domain}.atlassian.net/rest/api",regex:"^.*(jira|atlassian).*$",icon:"jira",docsUrl:"https://developer.atlassian.com/cloud/jira/platform/rest/v3",openApiUrl:"https://developer.atlassian.com/cloud/jira/platform/swagger-v3.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://auth.atlassian.com/authorize",tokenUrl:"https://auth.atlassian.com/oauth/token",scopes:"read:jira-work write:jira-work read:jira-user write:jira-user read:jira-work-management write:jira-work-management read:servicedesk-request write:servicedesk-request manage:jira-project manage:jira-configuration manage:jira-data-provider offline_access",client_id:"Az7iTb4uWYSv5N4p295PulP8oO2B3PjK"},systemSpecificInstructions:"You need a cloud id in the url to connect to the Jira instance. Fetch it from available-resources and store it in the system. The /rest/api/3/search endpoint has been deprecated - Use GET /rest/api/3/search/jql with query parameter 'jql' for searching issues. MUST specify a project in the JQL query. Example: GET /rest/api/3/search/jql?jql=project=KAN&maxResults=100. The jql parameter accepts JQL queries like 'project=KEY', 'assignee=currentUser()', 'order by created DESC'. Always URL-encode the jql parameter value.",keywords:["issues","projects","boards","sprints","epics","users","workflows","fields","components","versions","priorities","statuses","comments","attachments","jql","query","search","oauth"]},confluence:{name:"confluence",apiUrl:"https://{your-domain}.atlassian.net/wiki/api/v2",regex:"^.*(confluence|atlassian).*$",icon:"confluence",docsUrl:"https://developer.atlassian.com/cloud/confluence/rest/v2",openApiUrl:"https://dac-static.atlassian.com/cloud/confluence/openapi-v2.v3.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://auth.atlassian.com/authorize",tokenUrl:"https://auth.atlassian.com/oauth/token",scopes:"read:confluence-content.all write:confluence-content read:confluence-space.summary write:confluence-space read:confluence-props write:confluence-props read:confluence-user write:confluence-user read:confluence-groups write:confluence-groups delete:confluence-content delete:confluence-space offline_access",client_id:"Az7iTb4uWYSv5N4p295PulP8oO2B3PjK"},systemSpecificInstructions:"Use the Confluence Cloud REST API v2 under /wiki/api/v2 instead of legacy /wiki/rest/api v1 endpoints when a v2 equivalent exists. With OAuth 2.0, fetch the cloud id from GET https://api.atlassian.com/oauth/token/accessible-resources and use https://api.atlassian.com/ex/confluence/{cloudId}/wiki/api/v2 as the system base URL. V2 list endpoints use cursor-based pagination; follow the Link header or _links.next URL until no next page remains.",keywords:["spaces","pages","content","attachments","comments","labels","templates","blueprints","macros","restrictions","versions","ancestors","descendants","children","oauth"]},quickbooks:{name:"quickbooks",apiUrl:"https://quickbooks.api.intuit.com",regex:"^.*(quickbooks|intuit).*$",icon:"quickbooks",docsUrl:"https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/account",preferredAuthType:"oauth2",oauth:{authUrl:"https://appcenter.intuit.com/connect/oauth2",tokenUrl:"https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",scopes:"com.intuit.quickbooks.accounting com.intuit.quickbooks.payment com.intuit.quickbooks.payroll com.intuit.quickbooks.payroll.timetracking com.intuit.quickbooks.payroll.benefits openid profile email phone address"},keywords:["accounts","invoices","customers","vendors","bills","payments","estimates","purchase orders","sales receipts","credit memos","journal entries","items","tax rates","employees","reports","oauth"]},ramp:{name:"ramp",apiUrl:"https://api.ramp.com/developer/v1",regex:"(^|.*\\b)(ramp|ramp\\.com|api\\.ramp\\.com|demo-api\\.ramp\\.com)(\\b.*|$)",icon:"ramp",docsUrl:"https://docs.ramp.com/developer-api/v1",openApiUrl:"https://docs.ramp.com/openapi/developer-api.json",preferredAuthType:"oauth2",oauth:{tokenUrl:"https://api.ramp.com/developer/v1/token",scopes:"transactions:read cards:read users:read business:read bills:read reimbursements:read vendors:read accounting:read receipts:read departments:read locations:read limits:read spend_programs:read statements:read transfers:read bank_accounts:read",grant_type:"client_credentials",tokenAuthMethod:"basic_auth",tokenContentType:"form"},keywords:["transactions","cards","users","business","bills","reimbursements","vendors","accounting","receipts","departments","locations","limits","spend_programs","statements","transfers","bank_accounts"],systemSpecificInstructions:`Ramp has separate production and sandbox API hosts. Production calls use https://api.ramp.com/developer/v1; sandbox calls use https://demo-api.ramp.com/developer/v1. Do not use the Ramp web app hosts (app.ramp.com or demo.ramp.com) for API calls.
424
+ HEADERS: { "Authorization": "Bearer <<token>>", "Content-Type": "application/json" }`,keywords:["datasets","tables","queries","jobs","projects","schemas","rows","streaming","partitions","clustering","views","routines","models","data warehouse","sql","oauth"]},firebase:{name:"firebase",apiUrl:"https://firestore.googleapis.com",regex:"^.*(firebase|firestore).*$",icon:"firebase",docsUrl:"https://firebase.google.com/docs/reference/firebase-management/rest",openApiUrl:"https://firestore.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/firebase https://www.googleapis.com/auth/cloud-platform"},keywords:["firestore","realtime database","authentication","cloud functions","storage","hosting","documents","collections","users","projects","apps","query","oauth"]},salesforce:{name:"salesforce",apiUrl:"https://api.salesforce.com",regex:"^.*salesforce.*$",icon:"salesforce",docsUrl:"https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_rest.htm",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.salesforce.com/services/oauth2/authorize",tokenUrl:"https://login.salesforce.com/services/oauth2/token",scopes:"full",grant_type:"authorization_code",client_id:"3MVG9rZjd7MXFdLj8gMo0sojKlWRAgOP9F7nsk3Tec.eesq86nNTvbzDJDcmCW9YRCbteTayd_dP4OCLtISIo"},keywords:["accounts","contacts","leads","opportunities","cases","campaigns","products","price books","quotes","contracts","orders","custom objects","soql","query","search","sobjects","oauth"]},facebook:{name:"facebook",apiUrl:"https://graph.facebook.com",regex:"^.*facebook.*$",icon:"facebook",docsUrl:"https://developers.facebook.com/docs/graph-api",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.facebook.com/v18.0/dialog/oauth",tokenUrl:"https://graph.facebook.com/v18.0/oauth/access_token",scopes:"email public_profile pages_show_list pages_read_engagement pages_manage_metadata pages_read_user_content pages_manage_posts pages_manage_engagement business_management ads_management ads_read catalog_management leads_retrieval"},keywords:["pages","posts","comments","insights","ads","campaigns","audiences","business","catalog","events","groups","photos","videos","live videos","oauth"]},meta_ads:{name:"meta_ads",apiUrl:"https://graph.facebook.com",regex:"^.*(meta[_ .-]?ads|facebook[_ .-]?ads|marketing[_ .-]?api|/act_).*$",icon:"meta",docsUrl:"https://developers.facebook.com/docs/marketing-api/",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.facebook.com/v23.0/dialog/oauth",tokenUrl:"https://graph.facebook.com/v23.0/oauth/access_token",scopes:"ads_read ads_management business_management"},keywords:["meta ads","facebook ads","marketing api","ad accounts","campaigns","adsets","ads","adcreatives","insights","custom audiences","pixels","leadgen forms","product catalogs","spend","reach","oauth"],systemSpecificInstructions:"Ad account IDs are prefixed with act_ in all request paths (e.g. /v23.0/act_<ACCOUNT_ID>/insights, /act_<ACCOUNT_ID>/campaigns) \u2014 the numeric ID alone fails. With Standard Access, ads_read/ads_management only work for users who hold a role on the Meta app (suitable for development); serving arbitrary users requires Advanced Access, which needs business verification and App Review. For unattended server-to-server use, Business Manager system user tokens are the standard approach instead of user OAuth tokens. Graph API versions sunset roughly two years after release \u2014 prefer the latest version in paths rather than copying versions from older examples."},instagram:{name:"instagram",apiUrl:"https://graph.facebook.com/v23.0/",regex:"^.*instagram.*$",icon:"instagram",docsUrl:"https://developers.facebook.com/docs/instagram-platform/",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.facebook.com/v23.0/dialog/oauth",tokenUrl:"https://graph.facebook.com/v23.0/oauth/access_token",scopes:"instagram_basic pages_show_list instagram_content_publish pages_read_engagement instagram_manage_comments instagram_manage_insights instagram_manage_messages business_management"},keywords:["instagram","instagram api","instagram graph api","media","posts","stories","comments","insights","hashtags","mentions","business discovery","content publishing","user media","account info","oauth"],systemSpecificInstructions:"There are two distinct Instagram APIs: this template targets the Instagram API with Facebook Login (host graph.facebook.com), which requires an Instagram professional (Business/Creator) account linked to a Facebook Page; hashtag search and business discovery are only available on this variant. The alternative Instagram API with Instagram Login uses host graph.instagram.com, needs no Facebook Page, and uses different tokens/scopes. The legacy Instagram Basic Display API was shut down in December 2024 and cannot be used."},twitter:{name:"twitter",apiUrl:"https://api.twitter.com",regex:"^https?:\\/\\/(?:[^/]+\\.)*(?:twitter\\.com|x\\.com)(?:[:/?#].*)?$",icon:"x",docsUrl:"https://docs.x.com/x-api/introduction",openApiUrl:"https://api.x.com/2/openapi.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://twitter.com/i/oauth2/authorize",tokenUrl:"https://api.twitter.com/2/oauth2/token",scopes:"tweet.read tweet.write users.read follows.read follows.write offline.access like.read like.write list.read list.write block.read block.write bookmark.read bookmark.write mute.read mute.write"},keywords:["tweets","users","followers","timeline","mentions","retweets","likes","lists","spaces","direct messages","trends","media","polls","oauth"]},linkedin:{name:"linkedin",apiUrl:"https://api.linkedin.com",regex:"^.*linkedin.*$",icon:"/logos/linkedin.svg",docsUrl:"https://learn.microsoft.com/en-us/linkedin/shared/authentication/getting-access",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.linkedin.com/oauth/v2/authorization",tokenUrl:"https://www.linkedin.com/oauth/v2/accessToken",scopes:"r_liteprofile r_emailaddress w_member_social r_fullprofile r_basicprofile rw_company_admin r_1st_connections r_ads r_ads_reporting r_organization_social rw_organization_admin w_organization_social r_events"},keywords:["profiles","connections","companies","shares","posts","articles","jobs","skills","endorsements","recommendations","groups","events","messaging","oauth"]},paypal:{name:"paypal",apiUrl:"https://api.paypal.com",regex:"^.*paypal.*$",icon:"paypal",docsUrl:"https://developer.paypal.com/api/rest",preferredAuthType:"api_key",keywords:["payments","orders","captures","refunds","payouts","invoices","subscriptions","plans","products","transactions","balances","webhooks","checkout","billing","query","search"]},square:{name:"square",apiUrl:"https://connect.squareup.com",regex:"^.*(square|squareup).*$",icon:"square",docsUrl:"https://developer.squareup.com/reference/square",openApiUrl:"https://raw.githubusercontent.com/square/connect-api-specification/refs/heads/master/api.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://connect.squareup.com/oauth2/authorize",tokenUrl:"https://connect.squareup.com/oauth2/token",scopes:"MERCHANT_PROFILE_READ PAYMENTS_READ PAYMENTS_WRITE CUSTOMERS_READ CUSTOMERS_WRITE INVENTORY_READ INVENTORY_WRITE ORDERS_READ ORDERS_WRITE ITEMS_READ ITEMS_WRITE EMPLOYEES_READ EMPLOYEES_WRITE TIMECARDS_READ TIMECARDS_WRITE"},keywords:["payments","customers","orders","catalog","inventory","locations","transactions","refunds","cards","checkout","invoices","subscriptions","terminals","employees","shifts","query","search","oauth"]},adyen:{name:"adyen",apiUrl:"https://checkout-test.adyen.com",regex:"^.*adyen.*$",icon:"adyen",docsUrl:"https://docs.adyen.com/api-explorer",openApiUrl:"https://raw.githubusercontent.com/Adyen/adyen-openapi/main/yaml/CheckoutService-v71.yaml",preferredAuthType:"api_key",keywords:["paymentMethods","sessions","payments","payments.details","cardDetails","recurringContracts","payouts","balanceTransfers","legalEntities","binLookup","storedValueCards","transferRules","terminalManagement","accountHolders","issuers"]},razorpay:{name:"razorpay",apiUrl:"https://api.razorpay.com",regex:"^.*razorpay.*$",icon:"razorpay",docsUrl:"https://razorpay.com/docs/api",preferredAuthType:"api_key",keywords:["payments","orders","customers","refunds","invoices","subscriptions","accounts","fund_accounts","payouts","virtual_accounts","mandates","disputes","settlements","payment_links","bin_lookup"]},plaid:{name:"plaid",apiUrl:"https://production.plaid.com",regex:"^.*plaid.*$",icon:"/logos/plaid.svg",docsUrl:"https://plaid.com/docs/api",openApiUrl:"https://raw.githubusercontent.com/plaid/plaid-openapi/master/2020-09-14.yml",preferredAuthType:"api_key",keywords:["items","accounts","institutions","link_tokens","access_tokens","transactions","auth","identity","assets","liabilities","income","user","processor_tokens","transfer","investments"]},zendesk:{name:"zendesk",apiUrl:"https://api.zendesk.com",regex:"^.*zendesk.*$",icon:"zendesk",docsUrl:"https://developer.zendesk.com/api-reference",openApiUrl:"https://developer.zendesk.com/zendesk/oas.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://{subdomain}.zendesk.com/oauth/authorizations/new",tokenUrl:"https://{subdomain}.zendesk.com/oauth/tokens",scopes:"read write tickets:read tickets:write users:read users:write organizations:read organizations:write hc:read hc:write chat:read chat:write"},keywords:["tickets","users","organizations","groups","agents","views","macros","triggers","automations","sla","custom fields","tags","satisfaction","help center","api key"]},freshdesk:{name:"freshdesk",apiUrl:"https://{domain}.freshdesk.com/api/v2",regex:"^.*freshdesk.*$",icon:"/logos/freshdesk.svg",docsUrl:"https://developers.freshdesk.com/api",preferredAuthType:"api_key",keywords:["tickets","contacts","agents","companies","groups","forums","solutions","categories","folders","articles","time entries","surveys","satisfaction","sla","escalations","api key"]},freshworks:{name:"freshworks",apiUrl:"https://{domain}.freshservice.com/api/v2",regex:"^.*(freshworks|freshservice).*$",icon:"/logos/freshworks.svg",docsUrl:"https://api.freshservice.com",preferredAuthType:"api_key",keywords:["tickets","requesters","agents","assets","changes","problems","releases","service catalog","service items","departments","locations","products","vendors","contracts","api key"]},servicenow:{name:"servicenow",apiUrl:"https://{instance}.service-now.com/api",regex:"^.*(servicenow|service-now).*$",icon:"servicenow",docsUrl:"https://developer.servicenow.com/dev.do#!/reference/api/latest/rest",preferredAuthType:"api_key",keywords:["incidents","problems","changes","requests","users","groups","cmdb","configuration items","service catalog","knowledge","tasks","approvals","sla","workflows","tables","api key"]},helpscout:{name:"helpscout",apiUrl:"https://api.helpscout.net",regex:"^.*helpscout.*$",icon:"helpscout",docsUrl:"https://developer.helpscout.com/mailbox-api",preferredAuthType:"api_key",keywords:["conversations","customers","mailboxes","threads","tags","teams","users","reports","satisfaction","ratings","workflows","saved replies","docs","beacon","api key"]},box:{name:"box",label:"Box",apiUrl:"https://api.box.com/2.0",regex:"^https?:\\/\\/(?:[^/]+\\.)*box\\.com(?:[:/?#].*)?$",icon:"simpleicons:box",docsUrl:"https://developer.box.com/reference/",preferredAuthType:"oauth2",oauth:{authUrl:"https://account.box.com/api/oauth2/authorize",tokenUrl:"https://api.box.com/oauth2/token",scopes:"root_readwrite",client_id:"m7zi0ai4amo32eg0ao8mpr6rx0uzjell",tokenAuthMethod:"body",tokenContentType:"form"},contextSource:{category:"workspace",systemId:"box",onboardingOrder:11,onboardingDescription:"Connect accessible Box files for relevant workspace context."},systemSpecificInstructions:"superglue provides a managed Box OAuth app; users connect with their Box login and never need to create a Box app or supply a client ID or secret. File uploads go to https://upload.box.com/api/2.0, not the main API host. If authorization fails with an app-not-authorized error, the Box enterprise blocks unpublished apps; a Box admin must enable the app in Admin Console > Apps > Custom Apps Manager using the client ID. Refresh tokens rotate and expire after 60 days without use.",keywords:["files","folders","upload","download","sharing","links","metadata","search","collaborations","comments","tasks","enterprise","content","oauth"]},dropbox:{name:"dropbox",apiUrl:"https://api.dropboxapi.com",regex:"^.*dropbox.*$",icon:"dropbox",docsUrl:"https://www.dropbox.com/developers/documentation/http/documentation",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.dropbox.com/oauth2/authorize",tokenUrl:"https://api.dropboxapi.com/oauth2/token",scopes:"files.metadata.read files.metadata.write files.content.read files.content.write sharing.read sharing.write account_info.read account_info.write"},keywords:["files","folders","upload","download","sharing","links","metadata","search","sync","paper","users","teams","move","copy","delete","oauth"]},mailchimp:{name:"mailchimp",apiUrl:"https://api.mailchimp.com",regex:"^.*mailchimp.*$",icon:"mailchimp",docsUrl:"https://mailchimp.com/developer/marketing/api",openApiUrl:"https://api.mailchimp.com/schema/3.0/Swagger.json",preferredAuthType:"api_key",oauth:{authUrl:"https://login.mailchimp.com/oauth2/authorize",tokenUrl:"https://login.mailchimp.com/oauth2/token",scopes:"audiences:read audiences:write automations:read automations:write campaigns:read campaigns:write conversations:read conversations:write ecommerce:read ecommerce:write files:read files:write lists:read lists:write reports:read templates:read templates:write"},keywords:["lists","campaigns","templates","audiences","members","segments","tags","automations","reports","folders","merge fields","activities","ecommerce","batch","query","api key"]},jira:{name:"jira",apiUrl:"https://{your-domain}.atlassian.net/rest/api",regex:"^.*(jira|atlassian).*$",icon:"jira",docsUrl:"https://developer.atlassian.com/cloud/jira/platform/rest/v3",openApiUrl:"https://developer.atlassian.com/cloud/jira/platform/swagger-v3.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://auth.atlassian.com/authorize",tokenUrl:"https://auth.atlassian.com/oauth/token",scopes:"read:jira-work write:jira-work read:jira-user write:jira-user read:jira-work-management write:jira-work-management read:servicedesk-request write:servicedesk-request manage:jira-project manage:jira-configuration manage:jira-data-provider offline_access",client_id:"Az7iTb4uWYSv5N4p295PulP8oO2B3PjK"},systemSpecificInstructions:"You need a cloud id in the url to connect to the Jira instance. Fetch it from available-resources and store it in the system. The /rest/api/3/search endpoint has been deprecated - Use GET /rest/api/3/search/jql with query parameter 'jql' for searching issues. MUST specify a project in the JQL query. Example: GET /rest/api/3/search/jql?jql=project=KAN&maxResults=100. The jql parameter accepts JQL queries like 'project=KEY', 'assignee=currentUser()', 'order by created DESC'. Always URL-encode the jql parameter value.",keywords:["issues","projects","boards","sprints","epics","users","workflows","fields","components","versions","priorities","statuses","comments","attachments","jql","query","search","oauth"]},confluence:{name:"confluence",apiUrl:"https://{your-domain}.atlassian.net/wiki/api/v2",regex:"^.*(confluence|atlassian).*$",icon:"confluence",docsUrl:"https://developer.atlassian.com/cloud/confluence/rest/v2",openApiUrl:"https://dac-static.atlassian.com/cloud/confluence/openapi-v2.v3.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://auth.atlassian.com/authorize",tokenUrl:"https://auth.atlassian.com/oauth/token",scopes:"read:confluence-content.all write:confluence-content read:confluence-space.summary write:confluence-space read:confluence-props write:confluence-props read:confluence-user write:confluence-user read:confluence-groups write:confluence-groups delete:confluence-content delete:confluence-space offline_access",client_id:"Az7iTb4uWYSv5N4p295PulP8oO2B3PjK"},systemSpecificInstructions:"Use the Confluence Cloud REST API v2 under /wiki/api/v2 instead of legacy /wiki/rest/api v1 endpoints when a v2 equivalent exists. With OAuth 2.0, fetch the cloud id from GET https://api.atlassian.com/oauth/token/accessible-resources and use https://api.atlassian.com/ex/confluence/{cloudId}/wiki/api/v2 as the system base URL. V2 list endpoints use cursor-based pagination; follow the Link header or _links.next URL until no next page remains.",keywords:["spaces","pages","content","attachments","comments","labels","templates","blueprints","macros","restrictions","versions","ancestors","descendants","children","oauth"]},quickbooks:{name:"quickbooks",apiUrl:"https://quickbooks.api.intuit.com",regex:"^.*(quickbooks|intuit).*$",icon:"quickbooks",docsUrl:"https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/account",preferredAuthType:"oauth2",oauth:{authUrl:"https://appcenter.intuit.com/connect/oauth2",tokenUrl:"https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",scopes:"com.intuit.quickbooks.accounting com.intuit.quickbooks.payment com.intuit.quickbooks.payroll com.intuit.quickbooks.payroll.timetracking com.intuit.quickbooks.payroll.benefits openid profile email phone address"},keywords:["accounts","invoices","customers","vendors","bills","payments","estimates","purchase orders","sales receipts","credit memos","journal entries","items","tax rates","employees","reports","oauth"]},ramp:{name:"ramp",apiUrl:"https://api.ramp.com/developer/v1",regex:"(^|.*\\b)(ramp|ramp\\.com|api\\.ramp\\.com|demo-api\\.ramp\\.com)(\\b.*|$)",icon:"ramp",docsUrl:"https://docs.ramp.com/developer-api/v1",openApiUrl:"https://docs.ramp.com/openapi/developer-api.json",preferredAuthType:"oauth2",oauth:{tokenUrl:"https://api.ramp.com/developer/v1/token",scopes:"transactions:read cards:read users:read business:read bills:read reimbursements:read vendors:read accounting:read receipts:read departments:read locations:read limits:read spend_programs:read statements:read transfers:read bank_accounts:read",grant_type:"client_credentials",tokenAuthMethod:"basic_auth",tokenContentType:"form"},keywords:["transactions","cards","users","business","bills","reimbursements","vendors","accounting","receipts","departments","locations","limits","spend_programs","statements","transfers","bank_accounts"],systemSpecificInstructions:`Ramp has separate production and sandbox API hosts. Production calls use https://api.ramp.com/developer/v1; sandbox calls use https://demo-api.ramp.com/developer/v1. Do not use the Ramp web app hosts (app.ramp.com or demo.ramp.com) for API calls.
425
425
 
426
426
  Create the developer app from the Ramp dashboard's Developer area with an Admin or Business Owner account, enable the Client Credentials grant for internal server-to-server integrations, configure only the required scopes, and copy the client ID and client secret. Sandbox access is not self-serve; the customer must request a sandbox from Ramp, and sandbox credentials do not work in production.
427
427
 
428
428
  Token exchange is POST /developer/v1/token with form content, grant_type=client_credentials, and HTTP Basic auth using client_id:client_secret. Subsequent API calls use Authorization: Bearer <<access_token>>. Tokens are environment-bound and scope-bound; client-credentials tokens last 10 days.
429
429
 
430
- For third-party or public multi-customer apps, use Ramp's authorization-code flow instead of Client Credentials: authorization endpoint https://api.ramp.com/v1/authorize and token endpoint https://api.ramp.com/developer/v1/token. Only users with Developer API authorization permissions, typically Admin or Business Owner users, can authorize apps. Sensitive scopes such as cards:read_vault require additional security review.`},remote:{name:"remote",apiUrl:"https://gateway.remote.com",regex:"^https?:\\/\\/(?:[^/]+\\.)*remote(?:-sandbox)?\\.com(?:[:/?#].*)?$",icon:"/logos/remote.svg",docsUrl:"https://developer.remote.com/docs/getting-started-with-remote",preferredAuthType:"api_key",keywords:["companies","employments","employees","contractors","countries","legal entities","expenses","payroll","onboarding","eligibility"],systemSpecificInstructions:"Remote customer API tokens are environment-specific: ra_live_ tokens work only with https://gateway.remote.com, while ra_test_ tokens work only with https://gateway.remote-sandbox.com. Company admins and owners generate tokens in Company Settings > Integrations & APIs > Integrations > Remote API. Send the token as Authorization: Bearer <token>; API routes begin with /v1/. This template targets customer API tokens; Remote partners may instead use OAuth flows."},xero:{name:"xero",apiUrl:"https://api.xero.com",regex:"^.*xero.*$",icon:"xero",docsUrl:"https://developer.xero.com/documentation/api/api-overview",openApiUrl:"https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero_accounting.yaml",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.xero.com/identity/connect/authorize",tokenUrl:"https://identity.xero.com/connect/token",scopes:"accounting.transactions accounting.transactions.read accounting.reports.read accounting.journals.read accounting.settings accounting.settings.read accounting.contacts accounting.contacts.read accounting.attachments accounting.attachments.read payroll.employees payroll.payruns payroll.payslip payroll.timesheets payroll.settings"},keywords:["accounts","invoices","contacts","bills","credit notes","bank transactions","payments","receipts","journals","purchase orders","quotes","reports","tax rates","tracking categories","payroll","oauth"]},docusign:{name:"docusign",apiUrl:"https://api.docusign.com",regex:"^.*docusign.*$",icon:"/logos/docusign.svg",docsUrl:"https://developers.docusign.com/docs/esign-rest-api",openApiUrl:"https://raw.githubusercontent.com/docusign/OpenAPI-Specifications/refs/heads/master/esignature.rest.swagger-v2.1.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://account.docusign.com/oauth/auth",tokenUrl:"https://account.docusign.com/oauth/token",scopes:"signature extended impersonation organization_read group_read permission_read user_read user_write account_read domain_read identity_provider_read user_data_redact asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read"},keywords:["envelopes","documents","recipients","templates","signatures","tabs","brands","accounts","users","groups","powerforms","bulk send","connect","custom fields","oauth"]},deribit:{name:"deribit",apiUrl:"https://www.deribit.com/api/v2",regex:"^.*deribit.*$",icon:"deribit",docsUrl:"https://docs.deribit.com",preferredAuthType:"oauth2",oauth:{tokenUrl:"https://www.deribit.com/api/v2/public/auth",grant_type:"client_credentials",tokenContentType:"json"},keywords:["instruments","order_book","trades","orders","positions","accounts","wallet","deposits","withdrawals","market_data","options","futures","perpetuals"],systemSpecificInstructions:'Deribit uses a JSON-RPC 2.0 API over HTTPS. The token endpoint is /api/v2/public/auth \u2014 send client_id and client_secret as JSON body with grant_type: "client_credentials". Access tokens are Bearer tokens with a 900-second TTL; use /api/v2/public/auth with grant_type: "refresh_token" to renew. Deribit provides a testnet at https://test.deribit.com/api/v2 with separate credentials \u2014 register at test.deribit.com for a demo account.'},intercom:{name:"intercom",apiUrl:"https://api.intercom.io",regex:"^.*intercom.*$",icon:"intercom",docsUrl:"https://developers.intercom.com/intercom-api-reference",openApiUrl:"https://raw.githubusercontent.com/intercom/Intercom-OpenAPI/refs/heads/main/descriptions/2.9/api.intercom.io.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://app.intercom.com/oauth",tokenUrl:"https://api.intercom.io/auth/eagle/token",scopes:"inbox:read inbox:write users:read users:write companies:read companies:write contacts:read contacts:write conversations:read conversations:write help_center:read help_center:write teams:read teams:write tags:read tags:write segments:read events:write counts:read"},keywords:["contacts","conversations","messages","users","companies","events","tags","segments","articles","help center","teams","admins","inbox","notes","custom attributes","query","api key"]},asana:{name:"asana",apiUrl:"https://app.asana.com/api",regex:"^.*asana.*$",icon:"asana",docsUrl:"https://developers.asana.com/docs",openApiUrl:"https://raw.githubusercontent.com/Asana/openapi/master/defs/asana_oas.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://app.asana.com/-/oauth_authorize",tokenUrl:"https://app.asana.com/-/oauth_token",scopes:"default openid email profile",grant_type:"authorization_code",client_id:"1211466490919249"},keywords:["tasks","projects","workspaces","teams","portfolios","goals","sections","tags","custom fields","stories","attachments","followers","assignee","due dates","query","search","api key"]},trello:{name:"trello",apiUrl:"https://api.trello.com",regex:"^.*trello.*$",icon:"trello",docsUrl:"https://developer.atlassian.com/cloud/trello/rest",openApiUrl:"https://developer.atlassian.com/cloud/trello/swagger.v3.json",preferredAuthType:"api_key",keywords:["boards","lists","cards","members","labels","checklists","attachments","comments","actions","organizations","teams","power-ups","custom fields","stickers","api key"]},notion:{name:"notion",label:"Notion",apiUrl:"https://api.notion.com",regex:"^.*notion.*$",icon:"notion",docsUrl:"https://developers.notion.com",openApiUrl:"https://raw.githubusercontent.com/cameronking4/notion-openapi-chatgpt-action/refs/heads/main/public/notion-openapi.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://api.notion.com/v1/oauth/authorize?owner=user",tokenUrl:"https://api.notion.com/v1/oauth/token",scopes:"read_content read_comments read_user",client_id:"2f4d872b-594c-805e-abdd-00375c12bae0",tokenAuthMethod:"basic_auth",tokenContentType:"json",extraHeaders:{"Notion-Version":"2022-06-28"}},contextSource:{category:"workspace",systemId:"notion",onboardingOrder:8,onboardingDescription:"Let superglue use pages you select. superglue will never edit your Notion workspace."},systemSpecificInstructions:"Notion is a brain context source (workspace). Load the workspace-apps skill before using it. Keep the API endpoint unchanged. OAuth lets each user select the workspace pages available to the connection; access does not extend to unselected pages. Search narrowly, retrieve page metadata before block content, and follow pagination only when needed. Treat the context-source connection as read-only. Never create, update, archive, or comment on Notion content.",keywords:["pages","databases","blocks","users","workspaces","properties","rich text","search","comments","parent","children","query","filter","sort","api key"]},digitalocean:{name:"digitalocean",apiUrl:"https://api.digitalocean.com",regex:"^.*digitalocean.*$",icon:"digitalocean",docsUrl:"https://docs.digitalocean.com/reference/api",openApiUrl:"https://raw.githubusercontent.com/digitalocean/openapi/refs/heads/main/specification/DigitalOcean-public.v2.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://cloud.digitalocean.com/v1/oauth/authorize",tokenUrl:"https://cloud.digitalocean.com/v1/oauth/token",scopes:"read write admin"},keywords:["droplets","volumes","images","snapshots","regions","sizes","ssh_keys","domains","domain_records","certificates","firewalls","load_balancers","projects","tags","vpcs","api key"]},heroku:{name:"heroku",apiUrl:"https://api.heroku.com",regex:"^.*heroku.*$",icon:"/logos/heroku.svg",docsUrl:"https://devcenter.heroku.com/categories/platform-api",preferredAuthType:"api_key",oauth:{authUrl:"https://id.heroku.com/oauth/authorize",tokenUrl:"https://id.heroku.com/oauth/token",scopes:"global read write read-protected write-protected"},keywords:["apps","addons","builds","releases","config_vars","formations","dynos","buildpacks","domains","collaborators","keys","account","apps/~/addons","spaces","pipelines","api key"]},huggingface:{name:"huggingface",apiUrl:"https://huggingface.co",regex:"^.*huggingface.*$",icon:"huggingface",docsUrl:"https://huggingface.co/docs/hub/en/api",preferredAuthType:"api_key",keywords:["models","datasets","spaces","parameters","inference","fine-tuning","files","spaces","accounts","groups","api key"]},circleci:{name:"circleci",apiUrl:"https://circleci.com/api",regex:"^.*circleci.*$",icon:"circleci",docsUrl:"https://circleci.com/docs/api",openApiUrl:"https://circleci.com/api/v2/openapi.json",preferredAuthType:"api_key",keywords:["pipelines","workflows","jobs","projects","builds","artifacts","environment_variables","contexts","orbs","insights","schedules","checkouts","api key"]},travisci:{name:"travisci",apiUrl:"https://api.travis-ci.com",regex:"^.*(travis|travis-ci).*$",icon:"travisCI",docsUrl:"https://docs.travis-ci.com/api",preferredAuthType:"api_key",keywords:["builds","jobs","repositories","branches","requests","caches","env_vars","settings","logs","stages","beta_features","api key"]},wordpress:{name:"wordpress",apiUrl:"https://{your-site.com}/wp-json/wp/v2",regex:"^.*wordpress.*$",icon:"wordpress",docsUrl:"https://developer.wordpress.org/rest-api",openApiUrl:"https://developer.wordpress.com/docs/api/",preferredAuthType:"api_key",keywords:["posts","pages","media","users","categories","tags","comments","taxonomies","types","statuses","settings","themes","plugins","api key"]},cloudflare:{name:"cloudflare",apiUrl:"https://api.cloudflare.com",regex:"^.*cloudflare.*$",icon:"cloudflare",docsUrl:"https://developers.cloudflare.com/api",openApiUrl:"https://raw.githubusercontent.com/cloudflare/api-schemas/refs/heads/main/openapi.json",preferredAuthType:"api_key",keywords:["zones","dns_records","firewall_rules","page_rules","workers","certificates","load_balancers","rate_limits","waf","analytics","cache","ssl","api key"]},bigcommerce:{name:"bigcommerce",apiUrl:"https://api.bigcommerce.com",regex:"^.*bigcommerce.*$",icon:"bigcommerce",docsUrl:"https://developer.bigcommerce.com/docs/rest-management",preferredAuthType:"api_key",keywords:["products","categories","brands","orders","customers","carts","checkouts","coupons","price_lists","customer_groups","shipping","store_content","themes","api key"]},woocommerce:{name:"woocommerce",apiUrl:"https://{yourstore.com}/wp-json/wc/v3",regex:"^.*woocommerce.*$",icon:"woocommerce",docsUrl:"https://woocommerce.github.io/woocommerce-rest-api-docs",preferredAuthType:"api_key",keywords:["products","orders","customers","coupons","categories","shipping_classes","tax_classes","payment_gateways","shipping_zones","shipping_methods","product_variations","refunds","reports","api key"]},prestashop:{name:"prestashop",apiUrl:"https://{yourstore.com}/api",regex:"^.*prestashop.*$",icon:"prestashop",docsUrl:"https://devdocs.prestashop-project.org/8/webservice",preferredAuthType:"api_key",keywords:["products","categories","customers","addresses","carts","orders","carriers","countries","currencies","languages","manufacturers","suppliers","stocks","api key"]},squarespace:{name:"squarespace",apiUrl:"https://api.squarespace.com",regex:"^.*squarespace.*$",icon:"squarespace",docsUrl:"https://developers.squarespace.com/commerce-apis",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.squarespace.com/api/1/login/oauth/provider/authorize",tokenUrl:"https://login.squarespace.com/api/1/login/oauth/provider/tokens",scopes:"website.products.read website.products.write website.orders.read website.orders.write website.inventory.read website.transactions.read website.store_settings.read email.campaigns.read email.campaigns.send"},keywords:["products","orders","inventory","transactions","profiles","store_pages","categories","discounts","gift_cards","abandoned_carts","webhooks","oauth"]},monday:{name:"monday",apiUrl:"https://api.monday.com/v2",regex:"^.*monday.*$",icon:"/logos/monday.svg",docsUrl:"https://developer.monday.com/api-reference/docs",preferredAuthType:"api_key",oauth:{authUrl:"https://auth.monday.com/oauth2/authorize",tokenUrl:"https://auth.monday.com/oauth2/token",scopes:"me:read users:read boards:read boards:write workspaces:read workspaces:write webhooks:write updates:read updates:write assets:read assets:write tags:read teams:read"},keywords:["boards","items","groups","columns","updates","users","workspaces","tags","files","activities","teams","subitems","graphql","mutations","query","api key"]},clickup:{name:"clickup",apiUrl:"https://api.clickup.com/api/v2",regex:"^.*clickup.*$",icon:"clickup",docsUrl:"https://clickup.com/api",openApiUrl:"https://developer.clickup.com/openapi/clickup-api-v2-reference.json",preferredAuthType:"api_key",oauth:{authUrl:"https://app.clickup.com/api",tokenUrl:"https://api.clickup.com/api/v2/oauth/token",scopes:"user:read user:write task:read task:write list:read list:write folder:read folder:write space:read space:write team:read team:write webhook:read webhook:write goal:read goal:write"},keywords:["tasks","lists","folders","spaces","teams","goals","views","statuses","priorities","tags","custom fields","time tracking","comments","checklists","dependencies","api key"]},typeform:{name:"typeform",apiUrl:"https://api.typeform.com",regex:"^.*typeform.*$",icon:"typeform",docsUrl:"https://developer.typeform.com",preferredAuthType:"oauth2",oauth:{authUrl:"https://api.typeform.com/oauth/authorize",tokenUrl:"https://api.typeform.com/oauth/token",scopes:"forms:read forms:write responses:read responses:write themes:read themes:write images:read images:write workspaces:read workspaces:write webhooks:read webhooks:write accounts:read offline"},keywords:["forms","responses","questions","fields","themes","images","workspaces","logic jumps","hidden fields","variables","calculations","insights","reports","oauth"]},figma:{name:"figma",apiUrl:"https://api.figma.com",regex:"^(.*\\.)?figma\\.com(/.*)?$",icon:"figma",docsUrl:"https://www.figma.com/developers/api",openApiUrl:"https://raw.githubusercontent.com/figma/rest-api-spec/refs/heads/main/openapi/openapi.yaml",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.figma.com/oauth",tokenUrl:"https://www.figma.com/api/oauth/token",scopes:"file_read file_write file_dev_resources:read file_dev_resources:write webhooks:write"},keywords:["files","projects","teams","components","styles","nodes","frames","pages","images","comments","versions","branches","libraries","plugins","oauth"]},contentful:{name:"contentful",apiUrl:"https://api.contentful.com",regex:"^(.*\\.)?contentful\\.com(/.*)?$",icon:"contentful",docsUrl:"https://www.contentful.com/developers/docs/references/content-management-api",preferredAuthType:"api_key",keywords:["spaces","environments","content types","entries","assets","locales","tags","webhooks","roles","api keys","content model","publishing","preview","api key"]},creatio:{name:"creatio",apiUrl:"https://<<instance>>.creatio.com/0/odata",regex:"^(.*\\.)?creatio\\.com(/.*)?$",icon:"/logos/creatio.ico",docsUrl:"https://academy.creatio.com/docs/developer/integrations_and_api/data_services/odata/overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://<<instance>>.creatio.com/0/connect/authorize",tokenUrl:"https://<<instance>>.creatio.com/0/connect/token",scopes:"offline_access",grant_type:"authorization_code"},systemSpecificInstructions:`Creatio uses OIDC-compliant OAuth endpoints. The standard /ServiceModel/AuthService.svc/Authorize and /rest/oauth/token endpoints are behind IIS session auth and will NOT work for OAuth flows \u2014 you MUST use the /0/connect/* OIDC endpoints instead.
430
+ For third-party or public multi-customer apps, use Ramp's authorization-code flow instead of Client Credentials: authorization endpoint https://api.ramp.com/v1/authorize and token endpoint https://api.ramp.com/developer/v1/token. Only users with Developer API authorization permissions, typically Admin or Business Owner users, can authorize apps. Sensitive scopes such as cards:read_vault require additional security review.`},remote:{name:"remote",apiUrl:"https://gateway.remote.com",regex:"^https?:\\/\\/(?:[^/]+\\.)*remote(?:-sandbox)?\\.com(?:[:/?#].*)?$",icon:"/logos/remote.svg",docsUrl:"https://developer.remote.com/docs/getting-started-with-remote",preferredAuthType:"api_key",keywords:["companies","employments","employees","contractors","countries","legal entities","expenses","payroll","onboarding","eligibility"],systemSpecificInstructions:"Remote customer API tokens are environment-specific: ra_live_ tokens work only with https://gateway.remote.com, while ra_test_ tokens work only with https://gateway.remote-sandbox.com. Company admins and owners generate tokens in Company Settings > Integrations & APIs > Integrations > Remote API. Send the token as Authorization: Bearer <token>; API routes begin with /v1/. This template targets customer API tokens; Remote partners may instead use OAuth flows."},xero:{name:"xero",apiUrl:"https://api.xero.com",regex:"^.*xero.*$",icon:"xero",docsUrl:"https://developer.xero.com/documentation/api/api-overview",openApiUrl:"https://raw.githubusercontent.com/XeroAPI/Xero-OpenAPI/master/xero_accounting.yaml",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.xero.com/identity/connect/authorize",tokenUrl:"https://identity.xero.com/connect/token",scopes:"accounting.transactions accounting.transactions.read accounting.reports.read accounting.journals.read accounting.settings accounting.settings.read accounting.contacts accounting.contacts.read accounting.attachments accounting.attachments.read payroll.employees payroll.payruns payroll.payslip payroll.timesheets payroll.settings"},keywords:["accounts","invoices","contacts","bills","credit notes","bank transactions","payments","receipts","journals","purchase orders","quotes","reports","tax rates","tracking categories","payroll","oauth"]},docusign:{name:"docusign",apiUrl:"https://api.docusign.com",regex:"^.*docusign.*$",icon:"/logos/docusign.svg",docsUrl:"https://developers.docusign.com/docs/esign-rest-api",openApiUrl:"https://raw.githubusercontent.com/docusign/OpenAPI-Specifications/refs/heads/master/esignature.rest.swagger-v2.1.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://account.docusign.com/oauth/auth",tokenUrl:"https://account.docusign.com/oauth/token",scopes:"signature extended impersonation organization_read group_read permission_read user_read user_write account_read domain_read identity_provider_read user_data_redact asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read"},keywords:["envelopes","documents","recipients","templates","signatures","tabs","brands","accounts","users","groups","powerforms","bulk send","connect","custom fields","oauth"]},deribit:{name:"deribit",apiUrl:"https://www.deribit.com/api/v2",regex:"^.*deribit.*$",icon:"deribit",docsUrl:"https://docs.deribit.com",preferredAuthType:"oauth2",oauth:{tokenUrl:"https://www.deribit.com/api/v2/public/auth",grant_type:"client_credentials",tokenContentType:"json"},keywords:["instruments","order_book","trades","orders","positions","accounts","wallet","deposits","withdrawals","market_data","options","futures","perpetuals"],systemSpecificInstructions:'Deribit uses a JSON-RPC 2.0 API over HTTPS. The token endpoint is /api/v2/public/auth \u2014 send client_id and client_secret as JSON body with grant_type: "client_credentials". Access tokens are Bearer tokens with a 900-second TTL; use /api/v2/public/auth with grant_type: "refresh_token" to renew. Deribit provides a testnet at https://test.deribit.com/api/v2 with separate credentials \u2014 register at test.deribit.com for a demo account.'},intercom:{name:"intercom",apiUrl:"https://api.intercom.io",regex:"^.*intercom.*$",icon:"intercom",docsUrl:"https://developers.intercom.com/intercom-api-reference",openApiUrl:"https://raw.githubusercontent.com/intercom/Intercom-OpenAPI/refs/heads/main/descriptions/2.9/api.intercom.io.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://app.intercom.com/oauth",tokenUrl:"https://api.intercom.io/auth/eagle/token",scopes:"inbox:read inbox:write users:read users:write companies:read companies:write contacts:read contacts:write conversations:read conversations:write help_center:read help_center:write teams:read teams:write tags:read tags:write segments:read events:write counts:read"},keywords:["contacts","conversations","messages","users","companies","events","tags","segments","articles","help center","teams","admins","inbox","notes","custom attributes","query","api key"]},asana:{name:"asana",apiUrl:"https://app.asana.com/api",regex:"^.*asana.*$",icon:"asana",docsUrl:"https://developers.asana.com/docs",openApiUrl:"https://raw.githubusercontent.com/Asana/openapi/master/defs/asana_oas.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://app.asana.com/-/oauth_authorize",tokenUrl:"https://app.asana.com/-/oauth_token",scopes:"default openid email profile",grant_type:"authorization_code",client_id:"1211466490919249"},keywords:["tasks","projects","workspaces","teams","portfolios","goals","sections","tags","custom fields","stories","attachments","followers","assignee","due dates","query","search","api key"]},trello:{name:"trello",apiUrl:"https://api.trello.com",regex:"^.*trello.*$",icon:"trello",docsUrl:"https://developer.atlassian.com/cloud/trello/rest",openApiUrl:"https://developer.atlassian.com/cloud/trello/swagger.v3.json",preferredAuthType:"api_key",keywords:["boards","lists","cards","members","labels","checklists","attachments","comments","actions","organizations","teams","power-ups","custom fields","stickers","api key"]},notion:{name:"notion",label:"Notion",apiUrl:"https://api.notion.com",regex:"^.*notion.*$",icon:"notion",docsUrl:"https://developers.notion.com",openApiUrl:"https://raw.githubusercontent.com/cameronking4/notion-openapi-chatgpt-action/refs/heads/main/public/notion-openapi.json",preferredAuthType:"oauth2",oauth:{authUrl:"https://api.notion.com/v1/oauth/authorize?owner=user",tokenUrl:"https://api.notion.com/v1/oauth/token",scopes:"read_content read_comments read_user",client_id:"2f4d872b-594c-805e-abdd-00375c12bae0",tokenAuthMethod:"basic_auth",tokenContentType:"json",extraHeaders:{"Notion-Version":"2022-06-28"}},contextSource:{category:"workspace",systemId:"notion",onboardingOrder:8,onboardingDescription:"Connect selected Notion pages for relevant workspace context."},systemSpecificInstructions:"Notion OAuth exposes only pages selected for the connection and their accessible children.",keywords:["pages","databases","blocks","users","workspaces","properties","rich text","search","comments","parent","children","query","filter","sort","api key"]},digitalocean:{name:"digitalocean",apiUrl:"https://api.digitalocean.com",regex:"^.*digitalocean.*$",icon:"digitalocean",docsUrl:"https://docs.digitalocean.com/reference/api",openApiUrl:"https://raw.githubusercontent.com/digitalocean/openapi/refs/heads/main/specification/DigitalOcean-public.v2.yaml",preferredAuthType:"api_key",oauth:{authUrl:"https://cloud.digitalocean.com/v1/oauth/authorize",tokenUrl:"https://cloud.digitalocean.com/v1/oauth/token",scopes:"read write admin"},keywords:["droplets","volumes","images","snapshots","regions","sizes","ssh_keys","domains","domain_records","certificates","firewalls","load_balancers","projects","tags","vpcs","api key"]},heroku:{name:"heroku",apiUrl:"https://api.heroku.com",regex:"^.*heroku.*$",icon:"/logos/heroku.svg",docsUrl:"https://devcenter.heroku.com/categories/platform-api",preferredAuthType:"api_key",oauth:{authUrl:"https://id.heroku.com/oauth/authorize",tokenUrl:"https://id.heroku.com/oauth/token",scopes:"global read write read-protected write-protected"},keywords:["apps","addons","builds","releases","config_vars","formations","dynos","buildpacks","domains","collaborators","keys","account","apps/~/addons","spaces","pipelines","api key"]},huggingface:{name:"huggingface",apiUrl:"https://huggingface.co",regex:"^.*huggingface.*$",icon:"huggingface",docsUrl:"https://huggingface.co/docs/hub/en/api",preferredAuthType:"api_key",keywords:["models","datasets","spaces","parameters","inference","fine-tuning","files","spaces","accounts","groups","api key"]},circleci:{name:"circleci",apiUrl:"https://circleci.com/api",regex:"^.*circleci.*$",icon:"circleci",docsUrl:"https://circleci.com/docs/api",openApiUrl:"https://circleci.com/api/v2/openapi.json",preferredAuthType:"api_key",keywords:["pipelines","workflows","jobs","projects","builds","artifacts","environment_variables","contexts","orbs","insights","schedules","checkouts","api key"]},travisci:{name:"travisci",apiUrl:"https://api.travis-ci.com",regex:"^.*(travis|travis-ci).*$",icon:"travisCI",docsUrl:"https://docs.travis-ci.com/api",preferredAuthType:"api_key",keywords:["builds","jobs","repositories","branches","requests","caches","env_vars","settings","logs","stages","beta_features","api key"]},wordpress:{name:"wordpress",apiUrl:"https://{your-site.com}/wp-json/wp/v2",regex:"^.*wordpress.*$",icon:"wordpress",docsUrl:"https://developer.wordpress.org/rest-api",openApiUrl:"https://developer.wordpress.com/docs/api/",preferredAuthType:"api_key",keywords:["posts","pages","media","users","categories","tags","comments","taxonomies","types","statuses","settings","themes","plugins","api key"]},cloudflare:{name:"cloudflare",apiUrl:"https://api.cloudflare.com",regex:"^.*cloudflare.*$",icon:"cloudflare",docsUrl:"https://developers.cloudflare.com/api",openApiUrl:"https://raw.githubusercontent.com/cloudflare/api-schemas/refs/heads/main/openapi.json",preferredAuthType:"api_key",keywords:["zones","dns_records","firewall_rules","page_rules","workers","certificates","load_balancers","rate_limits","waf","analytics","cache","ssl","api key"]},bigcommerce:{name:"bigcommerce",apiUrl:"https://api.bigcommerce.com",regex:"^.*bigcommerce.*$",icon:"bigcommerce",docsUrl:"https://developer.bigcommerce.com/docs/rest-management",preferredAuthType:"api_key",keywords:["products","categories","brands","orders","customers","carts","checkouts","coupons","price_lists","customer_groups","shipping","store_content","themes","api key"]},woocommerce:{name:"woocommerce",apiUrl:"https://{yourstore.com}/wp-json/wc/v3",regex:"^.*woocommerce.*$",icon:"woocommerce",docsUrl:"https://woocommerce.github.io/woocommerce-rest-api-docs",preferredAuthType:"api_key",keywords:["products","orders","customers","coupons","categories","shipping_classes","tax_classes","payment_gateways","shipping_zones","shipping_methods","product_variations","refunds","reports","api key"]},prestashop:{name:"prestashop",apiUrl:"https://{yourstore.com}/api",regex:"^.*prestashop.*$",icon:"prestashop",docsUrl:"https://devdocs.prestashop-project.org/8/webservice",preferredAuthType:"api_key",keywords:["products","categories","customers","addresses","carts","orders","carriers","countries","currencies","languages","manufacturers","suppliers","stocks","api key"]},squarespace:{name:"squarespace",apiUrl:"https://api.squarespace.com",regex:"^.*squarespace.*$",icon:"squarespace",docsUrl:"https://developers.squarespace.com/commerce-apis",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.squarespace.com/api/1/login/oauth/provider/authorize",tokenUrl:"https://login.squarespace.com/api/1/login/oauth/provider/tokens",scopes:"website.products.read website.products.write website.orders.read website.orders.write website.inventory.read website.transactions.read website.store_settings.read email.campaigns.read email.campaigns.send"},keywords:["products","orders","inventory","transactions","profiles","store_pages","categories","discounts","gift_cards","abandoned_carts","webhooks","oauth"]},monday:{name:"monday",apiUrl:"https://api.monday.com/v2",regex:"^.*monday.*$",icon:"/logos/monday.svg",docsUrl:"https://developer.monday.com/api-reference/docs",preferredAuthType:"api_key",oauth:{authUrl:"https://auth.monday.com/oauth2/authorize",tokenUrl:"https://auth.monday.com/oauth2/token",scopes:"me:read users:read boards:read boards:write workspaces:read workspaces:write webhooks:write updates:read updates:write assets:read assets:write tags:read teams:read"},keywords:["boards","items","groups","columns","updates","users","workspaces","tags","files","activities","teams","subitems","graphql","mutations","query","api key"]},clickup:{name:"clickup",apiUrl:"https://api.clickup.com/api/v2",regex:"^.*clickup.*$",icon:"clickup",docsUrl:"https://clickup.com/api",openApiUrl:"https://developer.clickup.com/openapi/clickup-api-v2-reference.json",preferredAuthType:"api_key",oauth:{authUrl:"https://app.clickup.com/api",tokenUrl:"https://api.clickup.com/api/v2/oauth/token",scopes:"user:read user:write task:read task:write list:read list:write folder:read folder:write space:read space:write team:read team:write webhook:read webhook:write goal:read goal:write"},keywords:["tasks","lists","folders","spaces","teams","goals","views","statuses","priorities","tags","custom fields","time tracking","comments","checklists","dependencies","api key"]},typeform:{name:"typeform",apiUrl:"https://api.typeform.com",regex:"^.*typeform.*$",icon:"typeform",docsUrl:"https://developer.typeform.com",preferredAuthType:"oauth2",oauth:{authUrl:"https://api.typeform.com/oauth/authorize",tokenUrl:"https://api.typeform.com/oauth/token",scopes:"forms:read forms:write responses:read responses:write themes:read themes:write images:read images:write workspaces:read workspaces:write webhooks:read webhooks:write accounts:read offline"},keywords:["forms","responses","questions","fields","themes","images","workspaces","logic jumps","hidden fields","variables","calculations","insights","reports","oauth"]},figma:{name:"figma",apiUrl:"https://api.figma.com",regex:"^(.*\\.)?figma\\.com(/.*)?$",icon:"figma",docsUrl:"https://www.figma.com/developers/api",openApiUrl:"https://raw.githubusercontent.com/figma/rest-api-spec/refs/heads/main/openapi/openapi.yaml",preferredAuthType:"oauth2",oauth:{authUrl:"https://www.figma.com/oauth",tokenUrl:"https://www.figma.com/api/oauth/token",scopes:"file_read file_write file_dev_resources:read file_dev_resources:write webhooks:write"},keywords:["files","projects","teams","components","styles","nodes","frames","pages","images","comments","versions","branches","libraries","plugins","oauth"]},contentful:{name:"contentful",apiUrl:"https://api.contentful.com",regex:"^(.*\\.)?contentful\\.com(/.*)?$",icon:"contentful",docsUrl:"https://www.contentful.com/developers/docs/references/content-management-api",preferredAuthType:"api_key",keywords:["spaces","environments","content types","entries","assets","locales","tags","webhooks","roles","api keys","content model","publishing","preview","api key"]},creatio:{name:"creatio",apiUrl:"https://<<instance>>.creatio.com/0/odata",regex:"^(.*\\.)?creatio\\.com(/.*)?$",icon:"/logos/creatio.ico",docsUrl:"https://academy.creatio.com/docs/developer/integrations_and_api/data_services/odata/overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://<<instance>>.creatio.com/0/connect/authorize",tokenUrl:"https://<<instance>>.creatio.com/0/connect/token",scopes:"offline_access",grant_type:"authorization_code"},systemSpecificInstructions:`Creatio uses OIDC-compliant OAuth endpoints. The standard /ServiceModel/AuthService.svc/Authorize and /rest/oauth/token endpoints are behind IIS session auth and will NOT work for OAuth flows \u2014 you MUST use the /0/connect/* OIDC endpoints instead.
431
431
 
432
432
  To discover the correct endpoints for any Creatio instance, fetch: https://<instance>.creatio.com/0/.well-known/openid-configuration
433
433
 
@@ -514,7 +514,7 @@ References: https://docs.datahub.com/docs/features \u2014 product context; https
514
514
  - claude-3-5-sonnet-* (retired Oct 2025)
515
515
  - claude-3-opus-20240229 (retired Jan 2026)
516
516
  - claude-2.*, claude-3-sonnet-* (retired Jul 2025)
517
- `},openrouter:{name:"openrouter",apiUrl:"https://openrouter.ai/api/v1",regex:"^.*(openrouter|openrouter\\.ai).*$",icon:"openrouter",docsUrl:"https://openrouter.ai/docs",openApiUrl:"https://openrouter.ai/openapi.json",preferredAuthType:"api_key",keywords:["chat completions","completions","generation","models","embeddings","llm","ai","model routing","openai compatible"],systemSpecificInstructions:"OpenRouter is an OpenAI-compatible routing API \u2014 set baseURL/base_url to https://openrouter.ai/api/v1 when using OpenAI SDKs. Authentication is Bearer token (Authorization: Bearer <key>). Model names must include the provider prefix (e.g. openai/gpt-4o, anthropic/claude-3-5-sonnet); a bare model name silently uses the account default instead of erroring. OpenRouter also accepts optional HTTP-Referer and X-Title headers for dashboard attribution. Per-request generation metadata (cost, tokens, latency) is available after the call via GET /api/v1/generation?id=<generation_id> using the id field from the completion response."},pinecone:{name:"pinecone",apiUrl:"https://api.pinecone.io",regex:"^(.*\\.)?pinecone\\.io(/.*)?$",icon:"/logos/pinecone.svg",docsUrl:"https://docs.pinecone.io/reference",openApiUrl:"https://raw.githubusercontent.com/sigpwned/pinecone-openapi-spec/refs/heads/main/openapi.yml",preferredAuthType:"api_key",keywords:["indexes","vectors","upsert","collections","namespaces","metadata","embeddings","dimensions","pods","replicas","shards","api key"]},zoom:{name:"zoom",apiUrl:"https://api.zoom.us",regex:"^(.*\\.)?zoom\\.us(/.*)?$",icon:"zoom",docsUrl:"https://developers.zoom.us/docs/api",preferredAuthType:"oauth2",oauth:{authUrl:"https://zoom.us/oauth/authorize",tokenUrl:"https://zoom.us/oauth/token",scopes:"user:read user:write meeting:read meeting:write meeting:master recording:read recording:write webinar:read webinar:write chat_message:read chat_message:write chat_channel:read chat_channel:write contact:read report:read report:master dashboard:read"},keywords:["meetings","webinars","users","recordings","chat","channels","messages","participants","registrants","reports","dashboards","rooms","schedule","join","oauth"]},microsoftTeams:{name:"microsoftTeams",label:"Microsoft Teams",apiUrl:"https://graph.microsoft.com",regex:"^.*(microsoft.*teams|teams\\.microsoft\\.com|graph\\.microsoft\\.com.*(teams|chats|channels|chatMessage)|learn\\.microsoft\\.com.*graph.*teams).*$",icon:"/logos/microsoft_teams.svg",docsUrl:"https://learn.microsoft.com/en-us/graph/teams-concept-overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"openid profile email offline_access User.Read Team.ReadBasic.All Channel.ReadBasic.All Calendars.Read OnlineMeetings.Read",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc"},contextSource:{category:"workspace",systemId:"microsoft-teams",onboardingOrder:6,onboardingDescription:"Let superglue use channel and meeting context. superglue will never make posts or read private chats."},keywords:["microsoft teams","teams","team","channel","chat","message","conversation","microsoft graph","office 365","oauth"],systemSpecificInstructions:"Use delegated Microsoft Graph permissions so access remains limited to Teams content available to the signed-in work or school account. The context-source template starts with team and channel metadata plus calendar and meeting discovery. It intentionally excludes private chats, channel message content, transcript content, and every write scope. Load the workspace-apps skill for focused Teams context work. Request ChannelMessage.Read.All only when relevant channel content is needed. Request OnlineMeetingTranscript.Read.All only when an existing meeting transcript is needed. Both permissions normally require Microsoft Entra administrator consent, and transcript access also depends on the tenant's Teams transcript API setting. Reauthenticate incrementally with the full scope union. superglue provides a managed multi-tenant Microsoft app, so no Entra app registration is needed by default. A custom Entra Web app registration is only needed when the organization requires single-tenant access. Teams delegated APIs do not support personal Microsoft accounts. Never post messages, access private chats, join meetings, or record calls through this context source."},outlookMail:{name:"outlookMail",label:"Outlook",apiUrl:"https://graph.microsoft.com",regex:"^.*(outlook|graph\\.microsoft\\.com.*(messages|mailFolders|mailboxSettings)|learn\\.microsoft\\.com.*graph.*(mail|message)).*$",icon:"/logos/outlook.svg",docsUrl:"https://learn.microsoft.com/en-us/graph/api/resources/mail-api-overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"openid profile email offline_access User.Read Mail.ReadWrite",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc"},contextSource:{category:"email",systemId:"outlook-mail",onboardingOrder:8,onboardingDescription:"Let superglue access your outlook inbox. superglue will never send emails on your behalf."},keywords:["outlook","email","mail","mailbox","messages","inbox","drafts","send","attachments","microsoft graph","office 365","oauth"],systemSpecificInstructions:"Use delegated Microsoft Graph permissions so access remains scoped to the signed-in user. The template defaults to openid profile email offline_access User.Read Mail.ReadWrite for reading mail and creating drafts. It intentionally omits Mail.Send. superglue provides a managed multi-tenant Microsoft app, so no Entra app registration is needed by default. A custom Entra Web app registration (with the exact OAuth callback URL for the current superglue deployment; copy the client secret Value rather than its Secret ID) is only needed when the organization requires single-tenant access \u2014 then use a tenant-specific authorization and token URL instead of /common. Tenant consent policies can require administrator approval even for delegated permissions. Never send email directly. Ask for approval before creating a draft."},microsoft:{name:"microsoft",apiUrl:"https://graph.microsoft.com",regex:"^.*(microsoft|graph\\.microsoft|office|outlook|live\\.com|sharepoint).*$",icon:"default",docsUrl:"https://learn.microsoft.com/en-us/graph/api/overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"User.Read User.ReadWrite Mail.Read Mail.ReadWrite Mail.Send Calendars.Read Calendars.ReadWrite Files.Read Files.ReadWrite Sites.Read.All Sites.ReadWrite.All Team.ReadBasic.All Chat.Read Chat.ReadWrite offline_access",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc"},keywords:["users","groups","mail","calendar","contacts","onedrive","sharepoint","teams","planner","tasks","drives","sites","lists","permissions","graph","oauth"],systemSpecificInstructions:"superglue provides a managed multi-tenant Microsoft app (work/school and personal accounts), so no Azure app registration is needed \u2014 authenticate directly via OAuth. The default scopes are user-consentable in most tenants; some delegated Graph permissions (e.g. ChannelMessage.Read.All, Group.ReadWrite.All) require Microsoft Entra administrator consent in the user's tenant, so add those only when the use case needs them. Conditional Access policies can require administrator involvement for other permissions. Always keep offline_access in scopes to receive refresh tokens for long-term access. A custom Entra Web app registration is only needed when an organization requires single-tenant access or its own app governance: register it with the exact OAuth callback URL of the current superglue deployment, use tenant-specific authorization and token URLs instead of /common, and copy the client secret Value, not the Secret ID."},dynamics365_sales:{name:"dynamics365_sales",apiUrl:"https://<<api_host>>/api/data/v9.2",regex:"^.*(crm\\d*\\.dynamics\\.com|dynamicscrm).*$",icon:"dynamics365",docsUrl:"https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/query-data-web-api",preferredAuthType:"oauth2",connectionFields:[{key:"api_host",label:"Environment host",placeholder:"contoso.crm.dynamics.com",required:!0}],oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"https://<<api_host>>/user_impersonation offline_access",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc",grant_type:"authorization_code"},keywords:["accounts","contacts","leads","opportunities","quotes","salesorders","salesorderdetails","products","incidents","campaigns","invoices","competitors","teams","systemusers","businessunits","odata","dynamics","crm","dynamics 365 sales","dataverse","oauth"],systemSpecificInstructions:`Dynamics 365 Sales \u2014 Dataverse Web API v9.2
517
+ `},openrouter:{name:"openrouter",apiUrl:"https://openrouter.ai/api/v1",regex:"^.*(openrouter|openrouter\\.ai).*$",icon:"openrouter",docsUrl:"https://openrouter.ai/docs",openApiUrl:"https://openrouter.ai/openapi.json",preferredAuthType:"api_key",keywords:["chat completions","completions","generation","models","embeddings","llm","ai","model routing","openai compatible"],systemSpecificInstructions:"OpenRouter is an OpenAI-compatible routing API \u2014 set baseURL/base_url to https://openrouter.ai/api/v1 when using OpenAI SDKs. Authentication is Bearer token (Authorization: Bearer <key>). Model names must include the provider prefix (e.g. openai/gpt-4o, anthropic/claude-3-5-sonnet); a bare model name silently uses the account default instead of erroring. OpenRouter also accepts optional HTTP-Referer and X-Title headers for dashboard attribution. Per-request generation metadata (cost, tokens, latency) is available after the call via GET /api/v1/generation?id=<generation_id> using the id field from the completion response."},pinecone:{name:"pinecone",apiUrl:"https://api.pinecone.io",regex:"^(.*\\.)?pinecone\\.io(/.*)?$",icon:"/logos/pinecone.svg",docsUrl:"https://docs.pinecone.io/reference",openApiUrl:"https://raw.githubusercontent.com/sigpwned/pinecone-openapi-spec/refs/heads/main/openapi.yml",preferredAuthType:"api_key",keywords:["indexes","vectors","upsert","collections","namespaces","metadata","embeddings","dimensions","pods","replicas","shards","api key"]},zoom:{name:"zoom",apiUrl:"https://api.zoom.us",regex:"^(.*\\.)?zoom\\.us(/.*)?$",icon:"zoom",docsUrl:"https://developers.zoom.us/docs/api",preferredAuthType:"oauth2",oauth:{authUrl:"https://zoom.us/oauth/authorize",tokenUrl:"https://zoom.us/oauth/token",scopes:"user:read user:write meeting:read meeting:write meeting:master recording:read recording:write webinar:read webinar:write chat_message:read chat_message:write chat_channel:read chat_channel:write contact:read report:read report:master dashboard:read"},keywords:["meetings","webinars","users","recordings","chat","channels","messages","participants","registrants","reports","dashboards","rooms","schedule","join","oauth"]},sharepoint:{name:"sharepoint",label:"SharePoint",apiUrl:"https://graph.microsoft.com",regex:"^.*(sharepoint|graph\\.microsoft\\.com.*(sites|drives|driveItem|lists)|learn\\.microsoft\\.com.*graph.*sharepoint).*$",icon:"sharepoint",docsUrl:"https://learn.microsoft.com/en-us/graph/api/resources/sharepoint",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/organizations/oauth2/v2.0/token",scopes:"openid profile email offline_access User.Read Files.Read.All Sites.Read.All",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc",credentialTemplateId:"microsoft"},contextSource:{category:"workspace",systemId:"sharepoint",onboardingOrder:10,onboardingDescription:"Connect accessible SharePoint sites and files for workspace context."},keywords:["sharepoint","sites","document libraries","files","folders","lists","drive items","microsoft graph","office 365","oauth"],systemSpecificInstructions:"SharePoint uses Microsoft Graph with a work or school account. Tenant policy can require administrator approval."},microsoftTeams:{name:"microsoftTeams",label:"Microsoft Teams",apiUrl:"https://graph.microsoft.com",regex:"^.*(microsoft.*teams|teams\\.microsoft\\.com|graph\\.microsoft\\.com.*(teams|chats|channels|chatMessage)|learn\\.microsoft\\.com.*graph.*teams).*$",icon:"/logos/microsoft_teams.svg",docsUrl:"https://learn.microsoft.com/en-us/graph/teams-concept-overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"openid profile email offline_access User.Read Team.ReadBasic.All Channel.ReadBasic.All Calendars.Read OnlineMeetings.Read",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc"},contextSource:{category:"workspace",systemId:"microsoft-teams",onboardingOrder:6,onboardingDescription:"Connect Microsoft Teams channels and meetings for workspace context."},keywords:["microsoft teams","teams","team","channel","chat","message","conversation","microsoft graph","office 365","oauth"],systemSpecificInstructions:"Teams uses delegated Microsoft Graph access for work or school accounts. Some permissions require tenant administrator approval."},outlookMail:{name:"outlookMail",label:"Outlook",apiUrl:"https://graph.microsoft.com",regex:"^.*(outlook|graph\\.microsoft\\.com.*(messages|mailFolders|mailboxSettings)|learn\\.microsoft\\.com.*graph.*(mail|message)).*$",icon:"/logos/outlook.svg",docsUrl:"https://learn.microsoft.com/en-us/graph/api/resources/mail-api-overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"openid profile email offline_access User.Read Mail.ReadWrite",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc"},contextSource:{category:"email",systemId:"outlook-mail",onboardingOrder:8,onboardingDescription:"Let superglue access your outlook inbox. superglue will never send emails on your behalf."},keywords:["outlook","email","mail","mailbox","messages","inbox","drafts","send","attachments","microsoft graph","office 365","oauth"],systemSpecificInstructions:"Use delegated Microsoft Graph permissions so access remains scoped to the signed-in user. The template defaults to openid profile email offline_access User.Read Mail.ReadWrite for reading mail and creating drafts. It intentionally omits Mail.Send. superglue provides a managed multi-tenant Microsoft app, so no Entra app registration is needed by default. A custom Entra Web app registration (with the exact OAuth callback URL for the current superglue deployment; copy the client secret Value rather than its Secret ID) is only needed when the organization requires single-tenant access \u2014 then use a tenant-specific authorization and token URL instead of /common. Tenant consent policies can require administrator approval even for delegated permissions. Never send email directly. Ask for approval before creating a draft."},microsoft:{name:"microsoft",apiUrl:"https://graph.microsoft.com",regex:"^.*(microsoft|graph\\.microsoft|office|outlook|live\\.com|sharepoint).*$",icon:"default",docsUrl:"https://learn.microsoft.com/en-us/graph/api/overview",preferredAuthType:"oauth2",oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"User.Read User.ReadWrite Mail.Read Mail.ReadWrite Mail.Send Calendars.Read Calendars.ReadWrite Files.Read Files.ReadWrite Sites.Read.All Sites.ReadWrite.All Team.ReadBasic.All Chat.Read Chat.ReadWrite offline_access",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc"},keywords:["users","groups","mail","calendar","contacts","onedrive","sharepoint","teams","planner","tasks","drives","sites","lists","permissions","graph","oauth"],systemSpecificInstructions:"superglue provides a managed multi-tenant Microsoft app (work/school and personal accounts), so no Azure app registration is needed \u2014 authenticate directly via OAuth. The default scopes are user-consentable in most tenants; some delegated Graph permissions (e.g. ChannelMessage.Read.All, Group.ReadWrite.All) require Microsoft Entra administrator consent in the user's tenant, so add those only when the use case needs them. Conditional Access policies can require administrator involvement for other permissions. Always keep offline_access in scopes to receive refresh tokens for long-term access. A custom Entra Web app registration is only needed when an organization requires single-tenant access or its own app governance: register it with the exact OAuth callback URL of the current superglue deployment, use tenant-specific authorization and token URLs instead of /common, and copy the client secret Value, not the Secret ID."},dynamics365_sales:{name:"dynamics365_sales",apiUrl:"https://<<api_host>>/api/data/v9.2",regex:"^.*(crm\\d*\\.dynamics\\.com|dynamicscrm).*$",icon:"dynamics365",docsUrl:"https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/query-data-web-api",preferredAuthType:"oauth2",connectionFields:[{key:"api_host",label:"Environment host",placeholder:"contoso.crm.dynamics.com",required:!0}],oauth:{authUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenUrl:"https://login.microsoftonline.com/common/oauth2/v2.0/token",scopes:"https://<<api_host>>/user_impersonation offline_access",client_id:"b4bf6bc2-5b30-4eea-b3eb-ca138d2d69fc",grant_type:"authorization_code"},keywords:["accounts","contacts","leads","opportunities","quotes","salesorders","salesorderdetails","products","incidents","campaigns","invoices","competitors","teams","systemusers","businessunits","odata","dynamics","crm","dynamics 365 sales","dataverse","oauth"],systemSpecificInstructions:`Dynamics 365 Sales \u2014 Dataverse Web API v9.2
518
518
 
519
519
  CONNECTING: superglue provides a managed multi-tenant Microsoft app, so no Azure app registration is needed \u2014 authenticate directly via OAuth. The Dataverse scope is per-environment: the template scope contains an <<api_host>> placeholder and Microsoft rejects it unresolved \u2014 ALWAYS substitute the environment host (e.g. https://contoso.crm.dynamics.com/user_impersonation offline_access) in scopes when calling authenticate_oauth. Ask the user for the host if it is unknown. The user_impersonation scope does not require Entra administrator consent, but the signed-in user needs a Dynamics 365 license and a security role in the target environment. Keep offline_access in scopes to receive refresh tokens.
520
520
 
@@ -1410,7 +1410,7 @@ ${s}`;break;case"retry":q5(s)&&(t[i]=s);break;case"id":E5(s)&&(t[i]=s);break;cas
1410
1410
  `);o.stack=t?`${t}
1411
1411
  ${s}`:i.stack}Q.exports.fetch=function(e,t=void 0){return Kce(e,t).catch(a=>{throw U5?F5(a,U5):a&&typeof a=="object"&&Error.captureStackTrace(a,Q.exports.fetch),a})};Q.exports.Headers=Vs().Headers;Q.exports.Response=Om().Response;Q.exports.Request=yn().Request;Q.exports.FormData=dd().FormData;var{setGlobalOrigin:Zce,getGlobalOrigin:Xce}=vy();Q.exports.setGlobalOrigin=Zce;Q.exports.getGlobalOrigin=Xce;var{CacheStorage:eme}=x9(),{kConstruct:ome}=de();Q.exports.caches=new eme(ome);var{deleteCookie:tme,getCookies:ame,getSetCookies:ime,setCookie:sme,parseCookie:rme}=T9();Q.exports.deleteCookie=tme;Q.exports.getCookies=ame;Q.exports.getSetCookies=ime;Q.exports.setCookie=sme;Q.exports.parseCookie=rme;var{parseMIMEType:nme,serializeAMimeType:cme}=ft();Q.exports.parseMIMEType=nme;Q.exports.serializeAMimeType=cme;var{CloseEvent:mme,ErrorEvent:lme,MessageEvent:ume}=Qg(),{WebSocket:dme,ping:gme}=p5();Q.exports.WebSocket=dme;Q.exports.CloseEvent=mme;Q.exports.ErrorEvent=lme;Q.exports.MessageEvent=ume;Q.exports.ping=gme;Q.exports.WebSocketStream=v5().WebSocketStream;Q.exports.WebSocketError=Zw().WebSocketError;Q.exports.request=Zm(jn.request);Q.exports.stream=Zm(jn.stream);Q.exports.pipeline=Zm(jn.pipeline);Q.exports.connect=Zm(jn.connect);Q.exports.upgrade=Zm(jn.upgrade);Q.exports.MockClient=_ce;Q.exports.MockCallHistory=Oce;Q.exports.MockCallHistoryLog=Fce;Q.exports.MockPool=Pce;Q.exports.MockAgent=Lce;Q.exports.SnapshotAgent=Hce;Q.exports.mockErrors=Yce;var{EventSource:pme}=N5();Q.exports.EventSource=pme;function hme(){globalThis.fetch=Q.exports.fetch,globalThis.Headers=Q.exports.Headers,globalThis.Response=Q.exports.Response,globalThis.Request=Q.exports.Request,globalThis.FormData=Q.exports.FormData,globalThis.WebSocket=Q.exports.WebSocket,globalThis.CloseEvent=Q.exports.CloseEvent,globalThis.ErrorEvent=Q.exports.ErrorEvent,globalThis.MessageEvent=Q.exports.MessageEvent,globalThis.EventSource=Q.exports.EventSource}Q.exports.install=hme});var P5=y(Qn=>{"use strict";Object.defineProperty(Qn,"__esModule",{value:!0});Qn.SuperglueClient=Qn.SuperglueHttpError=void 0;var Bn=it(),Ga=Vf(),fme=yb(),bme=oI(),yme=Jt(),Va=Ir(),kme=ku(),el=14400*1e3,Xm;if(typeof globalThis.process<"u"&&globalThis.process.versions?.node)try{let{Agent:o}=L5();Xm=new o({headersTimeout:el,bodyTimeout:el})}catch{}var Yg=class extends Error{constructor(e,t,a,i){super(e),this.status=t,this.code=a,this.details=i,this.name="SuperglueHttpError"}};Qn.SuperglueHttpError=Yg;var iv=class{constructor({apiKey:e,apiEndpoint:t,onInfrastructureError:a,sseTokenProvider:i,tokenProvider:s}){if(!e&&!s)throw new Error("SuperglueClient requires either apiKey or tokenProvider");this.tokenProvider=s??(async()=>e),this.apiEndpoint=t??"https://api.superglue.cloud",this.sseManager=new fme.SSELogSubscriptionManager(this.apiEndpoint,i??this.tokenProvider),this.onInfrastructureError=a}async getApiKey(){return this.tokenProvider()}isInfrastructureError(e){return(0,yme.isAbortError)(e)?!1:!!(e instanceof TypeError&&e.message.toLowerCase().includes("fetch")||e instanceof Error&&e.name==="TimeoutError")}async restRequest(e,t,a,i,s){let n=await(await this.restResponse({method:e,path:t,body:a,extraHeaders:i,requestInit:s})).text();if(n)return JSON.parse(n)}async restResponse({method:e,path:t,body:a,extraHeaders:i,requestInit:s}){let r=`${this.apiEndpoint.replace(/\/$/,"")}${t}`,n=a!=null,c=typeof FormData<"u"&&a instanceof FormData,l={Authorization:`Bearer ${await this.getApiKey()}`,...i};n&&!c&&e!=="GET"&&(l["Content-Type"]="application/json");let u;try{u=await fetch(r,{...s,method:e,headers:l,body:n?c?a:JSON.stringify(a):void 0,signal:s?.signal??AbortSignal.timeout(el),...Xm?{dispatcher:Xm}:{}})}catch(d){throw this.isInfrastructureError(d)&&this.onInfrastructureError?.(),d}if(!u.ok)throw await this.buildHttpError(u);return u}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)})),s=(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(s.length!==a.length)throw await Promise.all(s.map(l=>this.deleteFileUpload(l.id).catch(()=>{}))),new Error("Upload response did not match the selected files");let r=await Promise.allSettled(s.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(el,l.expiresIn*1e3))});if(!g.ok)throw new Error(`Upload failed for ${d.fileName}: ${g.status} ${g.statusText}`);return l.id})),n=r.flatMap(l=>l.status==="fulfilled"?[l.value]:[]),c=new Map;if(n.length>0)try{let l=await this.restRequest("POST","/v1/files/uploads/complete",{fileIds:n});c=new Map(l.data.files.map(u=>[u.id,u]))}catch(l){c=new Map(n.map(u=>[u,{id:u,fileName:a[s.findIndex(d=>d.id===u)]?.fileName||u,contentLength:a[s.findIndex(d=>d.id===u)]?.contentLength||0,status:"failed",error:l instanceof Error?l.message:String(l)}]))}let m=s.map((l,u)=>{let d=r[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,s;try{let r=JSON.parse(t);r&&typeof r=="object"&&!Array.isArray(r)&&(s=r),typeof r?.code=="string"&&(i=r.code);let n=r.error;typeof n=="string"?a=n:n&&typeof n=="object"&&(a=n.message||JSON.stringify(n))}catch{}return new Yg(a,e.status,i,s)}async streamRequest(e,t,a){let i=e.includes("?")?"&":"?",s=`${this.apiEndpoint.replace(/\/$/,"")}${e}${i}stream=true`,n={Authorization:`Bearer ${await this.getApiKey()}`,Accept:"text/event-stream","Content-Type":"application/json"},c;try{c=await fetch(s,{method:"POST",headers:n,body:JSON.stringify(t),signal:a??AbortSignal.timeout(el),...Xm?{dispatcher:Xm}:{}})}catch(l){throw this.isInfrastructureError(l)&&this.onInfrastructureError?.(),l}if(!c.ok)throw await this.buildHttpError(c);if(!(c.headers.get("content-type")||"").includes("text/event-stream")){let l=await c.text();return l?JSON.parse(l):void 0}try{return await(0,bme.consumeEventStreamResult)(c)}catch(l){throw this.isInfrastructureError(l)&&this.onInfrastructureError?.(),l}}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(s=>({...s}))||[],...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:s,options:r,runId:n,systemIds:c,createRun:m,parentToolId:l,stepIndex:u,stepId:d,signal:g,stream:p}){let b={step:e,payload:t,files:a,previousResults:i,credentials:s,options:r,runId:n,systemIds:c,createRun:m,parentToolId:l,stepIndex:u,stepId:d};return p?this.streamRequest("/v1/tools/step/run",b,g):this.restRequest("POST","/v1/tools/step/run",b,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:s,stepResults:r,options:n,runId:c,createRun:m,parentToolId:l,stepId:u,signal:d,stream:g}){let p={outputTransform:e,outputSchema:t,inputSchema:a,payload:i,files:s,stepResults:r,options:n,runId:c,createRun:m,parentToolId:l,stepId:u};return g?this.streamRequest("/v1/tools/transform/run",p,d):this.restRequest("POST","/v1/tools/transform/run",p,void 0,d?{signal:d}:void 0)}async createRun({toolId:e,toolConfig:t,toolResult:a,stepResults:i,toolPayload:s,status:r,error:n,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:s,status:r,error:n,startedAt:(0,Va.toUTCISOString)(c,"run.startedAt"),completedAt:(0,Va.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:Bn.RunStatus.RUNNING,success:Bn.RunStatus.SUCCESS,failed:Bn.RunStatus.FAILED,aborted:Bn.RunStatus.ABORTED};return{runId:e.runId??e.id,toolId:e.toolId,tool:e.tool,systemIds:e.systemIds,status:t[e.status]??Bn.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??Bn.RunExecutionKind.FULL},fileArtifacts:e.fileArtifacts}}mapOpenAPIScheduleToToolSchedule(e){return{...e,lastRunAt:e.lastRunAt?(0,Va.requireUTCDate)(e.lastRunAt,"schedule.lastRunAt"):void 0,nextRunAt:(0,Va.requireUTCDate)(e.nextRunAt,"schedule.nextRunAt"),createdAt:(0,Va.requireUTCDate)(e.createdAt,"schedule.createdAt"),updatedAt:(0,Va.requireUTCDate)(e.updatedAt,"schedule.updatedAt")}}async listRuns(e={}){let t=(0,Ga.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,Va.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(s=>this.mapOpenAPIRunToRun(s)),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,Va.toUTCISOString)(e.from,"activity.from"):e.from),e?.to&&t.set("to",e.to instanceof Date?(0,Va.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,Ga.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,Ga.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,Ga.createListQueryParams)(e),a=t.size>0?`?${t.toString()}`:"",i=e.toolId?`/v1/tools/${encodeURIComponent(e.toolId)}/schedules${a}`:`/v1/schedules${a}`,s=await this.restRequest("GET",i);return{...s,data:s.data.map(r=>this.mapOpenAPIScheduleToToolSchedule(r))}}async listAllSchedules(e={}){return(0,Ga.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,kme.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,Ga.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,Ga.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,Ga.createListQueryParams)(e),a=t.size>0?`?${t.toString()}`:"";return this.restRequest("GET",`/v1/systems${a}`)}async listAllSystems(e={}){return(0,Ga.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}),s=i.flatMap(r=>r.status==="uploaded"?[r.id]:[]);if(s.length>0)try{await this.restRequest("POST",`/v1/systems/${encodeURIComponent(e)}/documentation/files`,{fileIds:s,link:a?.link!==!1})}catch(r){throw await Promise.all(s.map(n=>this.deleteFileUpload(n).catch(()=>{}))),r}if(!a?.settle){let r=i.filter(n=>n.status==="failed");if(r.length>0)throw new Error(r.map(n=>n.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}}}};Qn.SuperglueClient=iv});var Y5=y(Ce=>{"use strict";Object.defineProperty(Ce,"__esModule",{value:!0});Ce.UnquotedKeyStrategy=Ce.TripleQuoteStrategy=Ce.TrailingCommaStrategy=Ce.SingleQuoteStrategy=Ce.PythonLiteralStrategy=Ce.CommentStrategy=Ce.ResilientJsonParser=Ce.RepairStrategy=void 0;Ce.parseJsonResilient=Ame;Ce.parseJSON=wme;Ce.isValidJson=vme;Ce.prettyPrintJson=xme;Ce.minifyJson=zme;var Pt=class{validate(e){try{return JSON.parse(e),!0}catch{return!1}}};Ce.RepairStrategy=Pt;var Gg=class extends Pt{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 r=JSON.parse(i);return JSON.stringify(r)}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")}"`})}};Ce.TripleQuoteStrategy=Gg;var Vg=class extends Pt{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")}};Ce.PythonLiteralStrategy=Vg;var Wg=class extends Pt{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")}};Ce.TrailingCommaStrategy=Wg;var $g=class extends Pt{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}};Ce.SingleQuoteStrategy=$g;var Jg=class extends Pt{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')}};Ce.UnquotedKeyStrategy=Jg;var Kg=class extends Pt{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}};Ce.CommentStrategy=Kg;var sv=class extends Pt{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 s=0;s<e.length;s++){let r=e[s],n=s>0?e[s-1]:"";if(i){t+=r,i=!1;continue}if(r==="\\"&&a){t+=r,i=!0;continue}if(r==='"'&&n!=="\\"){a=!a,t+=r;continue}if(a)switch(r){case`
1412
1412
  `: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=r.charCodeAt(0);c<32?t+="\\u"+("0000"+c.toString(16)).slice(-4):t+=r}else t+=r}return t}},rv=class extends Pt{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,s=!1,r=!1;for(let n=0;n<t.length;n++){let c=t[n];if(s)r?r=!1:c==="\\"?r=!0:c==='"'&&(s=!1);else if(c==='"')s=!0;else if(c==="{")a++;else if(c==="}"){if(a--,a===0&&i===0&&n>0&&n<t.length-1)return!0}else if(c==="[")i++;else if(c==="]"&&(i--,i===0&&a===0&&n>0&&n<t.length-1))return!0}return!1}apply(e){let t=e.trim(),a=0,i=0,s=!1,r=!1,n=-1;for(let c=0;c<t.length;c++){let m=t[c];if(s)r?r=!1:m==="\\"?r=!0:m==='"'&&(s=!1);else if(m==='"')s=!0;else if(m==="{")a++;else if(m==="}"){if(a--,a===0&&i===0&&c>0){n=c;break}}else if(m==="[")i++;else if(m==="]"&&(i--,i===0&&a===0&&c>0)){n=c;break}}return n>0&&n<t.length-1?t.substring(0,n+1):e}},Sn=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 Gg,new $g,new sv,new rv,new Vg,new Wg,new Jg,new Kg]}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(r){if(!this.options.attemptRepair)return{success:!1,error:`JSON parse error: ${r}`,metadata:{parseTime:Date.now()-t}}}let i=a,s=[];for(let r of this.strategies)if(r.canApply(i)){let n=i;if(i=r.apply(i),n!==i){s.push(r.name),this.repairLog.push(r.description),this.options.logRepairs&&console.log(`Applied ${r.name}: ${r.description}`);try{return{success:!0,data:JSON.parse(i),repairs:this.repairLog,metadata:{parseTime:Date.now()-t,strategiesApplied:s}}}catch{}}}try{return{success:!0,data:JSON.parse(i),repairs:this.repairLog,metadata:{parseTime:Date.now()-t,strategiesApplied:s}}}catch(r){let n=this.aggressiveFallback(i);return n.success?{...n,repairs:[...this.repairLog,"Applied aggressive fallback"],metadata:{parseTime:Date.now()-t,strategiesApplied:[...s,"AggressiveFallback"]}}:{success:!1,error:`Failed to parse JSON after applying ${s.length} strategies: ${r}`,repairs:this.repairLog,metadata:{parseTime:Date.now()-t,strategiesApplied:s}}}}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),s=e.substring(i);for(let n of this.strategies)n.canApply(s)&&(s=n.apply(s));return{success:!0,data:JSON.parse(s)}}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)}};Ce.ResilientJsonParser=Sn;var H5=new Sn;function Ame(o,e){return(e?new Sn(e):H5).parse(o)}function wme(o){let e=H5.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 vme(o){try{return JSON.parse(o),!0}catch{return!1}}function xme(o,e=2){return JSON.stringify(o,null,e)}function zme(o){let t=new Sn().parse(o);if(t.success)return JSON.stringify(t.data);throw new Error("Cannot minify invalid JSON")}});var ot=y(L=>{"use strict";var qme=L&&L.__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]})),Z=L&&L.__exportStar||function(o,e){for(var t in o)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&qme(e,o,t)};Object.defineProperty(L,"__esModule",{value:!0});L.SSELogSubscriptionManager=L.SuperglueHttpError=L.SuperglueClient=void 0;Z(tE(),L);Z(dE(),L);Z(gE(),L);Z(yE(),L);Z(vE(),L);Z(Uc(),L);Z(ME(),L);Z(_E(),L);Z(OE(),L);Z(FE(),L);Z(Vf(),L);Z(PE(),L);Z(HE(),L);Z(YE(),L);Z(VE(),L);Z(WE(),L);Z(JE(),L);Z(yl(),L);Z(ZE(),L);Z(XE(),L);Z(o2(),L);Z(i2(),L);Z(r2(),L);Z(d2(),L);Z(p2(),L);Z(f2(),L);Z(I2(),L);Z(j2(),L);Z(nb(),L);Z(L2(),L);Z(hb(),L);Z(G2(),L);Z(J2(),L);Z(Z2(),L);Z(it(),L);Z(Jt(),L);Z(X2(),L);Z(eI(),L);Z(Du(),L);Z(Ir(),L);Z(ku(),L);var G5=P5();Object.defineProperty(L,"SuperglueClient",{enumerable:!0,get:function(){return G5.SuperglueClient}});Object.defineProperty(L,"SuperglueHttpError",{enumerable:!0,get:function(){return G5.SuperglueHttpError}});var Eme=yb();Object.defineProperty(L,"SSELogSubscriptionManager",{enumerable:!0,get:function(){return Eme.SSELogSubscriptionManager}});Z(Y5(),L)});var Qp=require("commander");var Do=$(require("fs")),$5=$(require("os")),Wa=$(require("path")),ol=$(ot()),V5=new Set(["runner","builder","admin"]),W5={output:{mode:"stdout",directory:".superglue/output"},preset:"admin"};function $a(o){let e=Wa.join(process.cwd(),".superglue"),t=$5.homedir();if(!t)return e;let a=Wa.join(t,".superglue");return o===!0?e:o===!1?a:Do.existsSync(Wa.join(e,"config.json"))?e:a}function nv(o){return Wa.join($a(o),"config.json")}function Zg(o){let e=nv(o);if(!Do.existsSync(e))return{};try{return JSON.parse(Do.readFileSync(e,"utf-8"))}catch{return{}}}function Dn(o){let e=Zg(),t=o.apiKey||(0,ol.readProcessEnvironmentValue)("SUPERGLUE_API_KEY")||e.apiKey||"",a=o.endpoint||(0,ol.readProcessEnvironmentValue)("SUPERGLUE_API_ENDPOINT")||e.endpoint||"https://api.superglue.cloud",i=(0,ol.readProcessEnvironmentValue)("SUPERGLUE_WEB_ENDPOINT")||e.webEndpoint||a.replace(/:3002\b/,":3001").replace(/api\.superglue/,"app.superglue"),s=(0,ol.readProcessEnvironmentValue)("SUPERGLUE_CLI_PRESET"),r=s&&V5.has(s)?s:e.preset&&V5.has(e.preset)?e.preset:"admin";return{...W5,...e,apiKey:t,endpoint:a,webEndpoint:i,preset:r,output:{...W5.output,...e.output}}}function Xg(o,e){let t=$a(e);Do.existsSync(t)||Do.mkdirSync(t,{recursive:!0}),Do.writeFileSync(Wa.join(t,"config.json"),JSON.stringify(o,null,2)+`
1413
- `,{mode:384})}function ep(o,e){let t=Wa.join($a(e),"drafts");if(Do.existsSync(t)||Do.mkdirSync(t,{recursive:!0}),o.output.mode==="stdout+file"){let a=Wa.resolve(o.output.directory);Do.existsSync(a)||Do.mkdirSync(a,{recursive:!0})}}var pv=$(ot());var cv=$(require("readline"));var Z5=require("child_process"),X5=require("util");var J5={name:"@superglue/cli",version:"1.1.66",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 Cme=(0,X5.promisify)(Z5.exec),wo=J5.version;function K5(o){let e=o.match(/^(\d+)(?:-(.+))?$/);return e?{numeric:parseInt(e[1],10),prerelease:e[2]||null}:{numeric:0,prerelease:o}}function tp(o,e){let t=o.split("."),a=e.split("."),i=Math.max(t.length,a.length);for(let s=0;s<i;s++){let r=K5(t[s]||"0"),n=K5(a[s]||"0");if(r.numeric<n.numeric)return-1;if(r.numeric>n.numeric||r.prerelease===null&&n.prerelease!==null)return 1;if(r.prerelease!==null&&n.prerelease===null)return-1;if(r.prerelease!==null&&n.prerelease!==null){if(r.prerelease<n.prerelease)return-1;if(r.prerelease>n.prerelease)return 1}}return 0}async function ap(){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 op=null;function e6(){Y()&&(op=ap())}async function o6(){if(!(!Y()||!op)){try{let o=new Promise(t=>{setTimeout(()=>t(null),2e3).unref()}),e=await Promise.race([op,o]);e&&tp(wo,e)<0&&(console.error(""),console.error(`${h.cyan}${h.bold} Update available: ${wo} \u2192 ${e}${h.reset}`),console.error(`${h.cyan} Run ${h.bold}sg update${h.reset}${h.cyan} to upgrade${h.reset}`),console.error(""))}catch{}op=null}}async function t6(){let o=await ap();if(!o)return{success:!1,message:"Could not fetch latest version from npm"};if(tp(wo,o)>=0)return{success:!0,message:`Already on latest version (${wo})`};try{return await Cme("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${wo} to ${o}`}}catch(e){return{success:!1,message:`Update failed: ${e.message}. Try manually: npm install -g @superglue/cli@latest`}}}var Y=()=>process.argv.includes("--table")&&process.stdout.isTTY,qt=()=>process.argv.includes("--full"),h={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 a6(o,e){let t=e||o;return`\x1B]8;;${o}\x07${h.underline}${h.cyan}${t}${h.reset}\x1B]8;;\x07`}function i6(){if(!Y())return;let o=h.reset,e=h.dim,t="\x1B[47;30m",a=[" #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@- "," =@@@- @@@@ "," @@@ @@% "," -@@ @@@@= @@@ @@@ @@@@@#@ @@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@@@@* %@@ "," @@ @@@ *@ @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @% @@@ @@@ @@@ @@* @@# "," #@@ @@@# @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @@@ @@@ @@@ @@* @@ "," @@- @@@@= @@@ @@@ @@@@@@@ @@@@@@ @@@@@@@ @@@ @@% @@@ @@@ @@@ @@@@@. @@."," #@% .@@@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* @@ "," @@ @ @@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* *@@ "," -@@ @@@@= @@@@@@ @@@ @@@@@@@ @@@ -@@ @@@@@@ @@@@@@% @@@@@@. @@@@@@* #@@ "," :@@* @@@ "," %@@@ =@@@. "," :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% "];console.log(""),a.forEach(i=>{let s=i.search(/\S/),r=i.length-[...i].reverse().join("").search(/\S/)-1;if(s===-1)return console.log(" "+i);let n=i.slice(0,s),c=i.slice(s,r+1).split("").map(l=>l===" "?" ":"\u2588").join(""),m=i.slice(r+1);console.log(` ${n}${t}${c}${o}${m}`)}),console.log(` ${e} CLI v${wo}${o}`),console.log("")}function Ee(o){if(!Y())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"),s=()=>{process.stdout.write(`\r ${h.cyan}${e[t++%e.length]}${h.reset} ${a}`)},r=setInterval(s,80);return{update:n=>{a=n},log:n=>{i(),console.log(` ${h.dim}\u2502${h.reset} ${n}`),s()},stop:n=>{clearInterval(r),i(),n&&console.log(` ${n}`)}}}function U(o){Y()?ip(o):console.log(JSON.stringify(o,null,2))}function se(o,e){Y()?(console.log(` ${h.green}\u2713${h.reset} ${o}`),e&&ip(e,4)):console.log(JSON.stringify({success:!0,message:o,...e&&typeof e=="object"?e:{data:e}}))}function z(o,e){Y()?(console.error(` ${h.red}\u2717${h.reset} ${o}`),e&&ip(e,4)):console.error(JSON.stringify({success:!1,error:o,details:e}))}function s6(o){Y()&&console.log(` ${h.yellow}\u26A0${h.reset} ${o}`)}function lo(o){Y()&&console.log(` ${h.dim}${o}${h.reset}`)}function Ja(o){Y()&&(console.log(`
1413
+ `,{mode:384})}function ep(o,e){let t=Wa.join($a(e),"drafts");if(Do.existsSync(t)||Do.mkdirSync(t,{recursive:!0}),o.output.mode==="stdout+file"){let a=Wa.resolve(o.output.directory);Do.existsSync(a)||Do.mkdirSync(a,{recursive:!0})}}var pv=$(ot());var cv=$(require("readline"));var Z5=require("child_process"),X5=require("util");var J5={name:"@superglue/cli",version:"1.1.68",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 Cme=(0,X5.promisify)(Z5.exec),wo=J5.version;function K5(o){let e=o.match(/^(\d+)(?:-(.+))?$/);return e?{numeric:parseInt(e[1],10),prerelease:e[2]||null}:{numeric:0,prerelease:o}}function tp(o,e){let t=o.split("."),a=e.split("."),i=Math.max(t.length,a.length);for(let s=0;s<i;s++){let r=K5(t[s]||"0"),n=K5(a[s]||"0");if(r.numeric<n.numeric)return-1;if(r.numeric>n.numeric||r.prerelease===null&&n.prerelease!==null)return 1;if(r.prerelease!==null&&n.prerelease===null)return-1;if(r.prerelease!==null&&n.prerelease!==null){if(r.prerelease<n.prerelease)return-1;if(r.prerelease>n.prerelease)return 1}}return 0}async function ap(){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 op=null;function e6(){Y()&&(op=ap())}async function o6(){if(!(!Y()||!op)){try{let o=new Promise(t=>{setTimeout(()=>t(null),2e3).unref()}),e=await Promise.race([op,o]);e&&tp(wo,e)<0&&(console.error(""),console.error(`${h.cyan}${h.bold} Update available: ${wo} \u2192 ${e}${h.reset}`),console.error(`${h.cyan} Run ${h.bold}sg update${h.reset}${h.cyan} to upgrade${h.reset}`),console.error(""))}catch{}op=null}}async function t6(){let o=await ap();if(!o)return{success:!1,message:"Could not fetch latest version from npm"};if(tp(wo,o)>=0)return{success:!0,message:`Already on latest version (${wo})`};try{return await Cme("npm install -g @superglue/cli@latest"),{success:!0,message:`Updated from ${wo} to ${o}`}}catch(e){return{success:!1,message:`Update failed: ${e.message}. Try manually: npm install -g @superglue/cli@latest`}}}var Y=()=>process.argv.includes("--table")&&process.stdout.isTTY,qt=()=>process.argv.includes("--full"),h={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 a6(o,e){let t=e||o;return`\x1B]8;;${o}\x07${h.underline}${h.cyan}${t}${h.reset}\x1B]8;;\x07`}function i6(){if(!Y())return;let o=h.reset,e=h.dim,t="\x1B[47;30m",a=[" #@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@- "," =@@@- @@@@ "," @@@ @@% "," -@@ @@@@= @@@ @@@ @@@@@#@ @@@@@@@ @@@@@@@ @@@@@@ @@@ @@@ @@@ @@@@@@* %@@ "," @@ @@@ *@ @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @% @@@ @@@ @@@ @@* @@# "," #@@ @@@# @@@ @@@ @@@ :@@ @@@ @@@ -@@ @@@ @@@ @@@ @@@ @@* @@ "," @@- @@@@= @@@ @@@ @@@@@@@ @@@@@@ @@@@@@@ @@@ @@% @@@ @@@ @@@ @@@@@. @@."," #@% .@@@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* @@ "," @@ @ @@@ @@@ @@@ @@@ @@@ @@@ -@@ @@@ @@% @@@ @@@ @@@ @@* *@@ "," -@@ @@@@= @@@@@@ @@@ @@@@@@@ @@@ -@@ @@@@@@ @@@@@@% @@@@@@. @@@@@@* #@@ "," :@@* @@@ "," %@@@ =@@@. "," :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% "];console.log(""),a.forEach(i=>{let s=i.search(/\S/),r=i.length-[...i].reverse().join("").search(/\S/)-1;if(s===-1)return console.log(" "+i);let n=i.slice(0,s),c=i.slice(s,r+1).split("").map(l=>l===" "?" ":"\u2588").join(""),m=i.slice(r+1);console.log(` ${n}${t}${c}${o}${m}`)}),console.log(` ${e} CLI v${wo}${o}`),console.log("")}function Ee(o){if(!Y())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"),s=()=>{process.stdout.write(`\r ${h.cyan}${e[t++%e.length]}${h.reset} ${a}`)},r=setInterval(s,80);return{update:n=>{a=n},log:n=>{i(),console.log(` ${h.dim}\u2502${h.reset} ${n}`),s()},stop:n=>{clearInterval(r),i(),n&&console.log(` ${n}`)}}}function U(o){Y()?ip(o):console.log(JSON.stringify(o,null,2))}function se(o,e){Y()?(console.log(` ${h.green}\u2713${h.reset} ${o}`),e&&ip(e,4)):console.log(JSON.stringify({success:!0,message:o,...e&&typeof e=="object"?e:{data:e}}))}function z(o,e){Y()?(console.error(` ${h.red}\u2717${h.reset} ${o}`),e&&ip(e,4)):console.error(JSON.stringify({success:!1,error:o,details:e}))}function s6(o){Y()&&console.log(` ${h.yellow}\u26A0${h.reset} ${o}`)}function lo(o){Y()&&console.log(` ${h.dim}${o}${h.reset}`)}function Ja(o){Y()&&(console.log(`
1414
1414
  ${h.bold}${h.cyan}${o}${h.reset}`),console.log(` ${h.dim}${"\u2500".repeat(o.length)}${h.reset}`))}function ga(o,e,t){if(!Y()){console.log(JSON.stringify({success:!0,total:t?.total??o.length,items:o}));return}if(o.length===0){console.log(`
1415
1415
  ${h.dim}0 results${h.reset}
1416
1416
  `);return}let a=e||Object.keys(o[0]),i=qt()?1/0:60,s=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 r=a.map((l,u)=>`${h.bold}${h.cyan}${l.toUpperCase().padEnd(s[u])}${h.reset}`).join(" ");console.log(` ${r}`);let n=s.map(l=>`${h.dim}${"\u2500".repeat(l)}${h.reset}`).join(`${h.dim}\u2500\u2500${h.reset}`);console.log(` ${n}`);for(let l of o){let u=a.map((d,g)=>{let p=String(l[d]??"").replace(/[\n\r]+/g," ").trim();if(p.length>i){let w=`\u2026 (${p.length})`;p=p.slice(0,Math.max(0,i-w.length))+`${h.dim}${w}${h.reset}`}return d==="status"?`${{success:h.green,running:h.yellow,failed:h.red,aborted:h.red,error:h.red,pending:h.dim}[p.toLowerCase()]||""}${p.padEnd(s[g])}${h.reset}`:p.padEnd(s[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(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superglue/cli",
3
- "version": "1.1.66",
3
+ "version": "1.1.68",
4
4
  "bin": {
5
5
  "sg": "./dist/cli.js"
6
6
  },