@tangle-network/agent-integrations 0.50.0 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog.js +5 -4
- package/dist/{chunk-IA5GCKM6.js → chunk-BS6LGM3V.js} +84 -38
- package/dist/chunk-BS6LGM3V.js.map +1 -0
- package/dist/{chunk-AJ67SDTL.js → chunk-DRBW2FXU.js} +11 -3
- package/dist/{chunk-AJ67SDTL.js.map → chunk-DRBW2FXU.js.map} +1 -1
- package/dist/chunk-P4FFI752.js +1 -0
- package/dist/chunk-PUXYDSXI.js +109 -0
- package/dist/chunk-PUXYDSXI.js.map +1 -0
- package/dist/{chunk-RM6JJK4Q.js → chunk-XEJKVCXB.js} +181 -19
- package/dist/{chunk-RM6JJK4Q.js.map → chunk-XEJKVCXB.js.map} +1 -1
- package/dist/connectors/adapters/index.js +1 -1
- package/dist/connectors/index.d.ts +39 -2
- package/dist/connectors/index.js +18 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +20 -4
- package/dist/mcp.js +5 -4
- package/dist/mcp.js.map +1 -1
- package/dist/registry.js +5 -4
- package/dist/runtime.js +5 -4
- package/dist/specs.d.ts +13 -2
- package/dist/specs.js +5 -1
- package/package.json +1 -1
- package/dist/chunk-376UBTNB.js +0 -1
- package/dist/chunk-IA5GCKM6.js.map +0 -1
- /package/dist/{chunk-376UBTNB.js.map → chunk-P4FFI752.js.map} +0 -0
package/dist/catalog.js
CHANGED
|
@@ -7,15 +7,16 @@ import {
|
|
|
7
7
|
parseIntegrationToolName,
|
|
8
8
|
searchIntegrationTools,
|
|
9
9
|
toMcpTools
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-DRBW2FXU.js";
|
|
11
11
|
import "./chunk-S2BUASSV.js";
|
|
12
12
|
import "./chunk-LA76XB7M.js";
|
|
13
13
|
import "./chunk-H4XYLS7T.js";
|
|
14
14
|
import "./chunk-VLVSP7SP.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-BS6LGM3V.js";
|
|
16
16
|
import "./chunk-7P2LN4VT.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-P4FFI752.js";
|
|
18
|
+
import "./chunk-PUXYDSXI.js";
|
|
19
|
+
import "./chunk-XEJKVCXB.js";
|
|
19
20
|
import "./chunk-XC54EOUQ.js";
|
|
20
21
|
import "./chunk-UWF33ESC.js";
|
|
21
22
|
import "./chunk-PZ5AY32C.js";
|
|
@@ -2,6 +2,12 @@ import {
|
|
|
2
2
|
buildIntegrationCoverageConnectors,
|
|
3
3
|
listIntegrationCoverageSpecs
|
|
4
4
|
} from "./chunk-7P2LN4VT.js";
|
|
5
|
+
import {
|
|
6
|
+
bundledApiKeyHint,
|
|
7
|
+
bundledAuthMode,
|
|
8
|
+
bundledOAuth2Auth,
|
|
9
|
+
getBundledAdapterManifest
|
|
10
|
+
} from "./chunk-PUXYDSXI.js";
|
|
5
11
|
|
|
6
12
|
// src/specs/types.ts
|
|
7
13
|
function specAuthToConnectorAuth(auth) {
|
|
@@ -355,26 +361,9 @@ function getIntegrationOverride(kind) {
|
|
|
355
361
|
}
|
|
356
362
|
|
|
357
363
|
// src/specs/registry.ts
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
"outlook-calendar",
|
|
362
|
-
"microsoft-calendar",
|
|
363
|
-
"slack",
|
|
364
|
-
"hubspot",
|
|
365
|
-
"notion",
|
|
366
|
-
"salesforce",
|
|
367
|
-
"github",
|
|
368
|
-
"gitlab",
|
|
369
|
-
"airtable",
|
|
370
|
-
"asana",
|
|
371
|
-
"stripe",
|
|
372
|
-
"stripe-pack",
|
|
373
|
-
"twilio",
|
|
374
|
-
"twilio-sms",
|
|
375
|
-
"phony",
|
|
376
|
-
"webhook"
|
|
377
|
-
]);
|
|
364
|
+
function bundledManifestFor(kind, coverageId) {
|
|
365
|
+
return getBundledAdapterManifest(kind) ?? getBundledAdapterManifest(coverageId);
|
|
366
|
+
}
|
|
378
367
|
var KIND_ALIASES = {
|
|
379
368
|
"outlook-calendar": "microsoft-calendar",
|
|
380
369
|
"notion-database": "notion",
|
|
@@ -445,9 +434,11 @@ function specFromCoverage(coverage, connector) {
|
|
|
445
434
|
const kind = KIND_ALIASES[coverage.id] ?? coverage.id;
|
|
446
435
|
const family = familyFor(coverage);
|
|
447
436
|
const familySpec = getIntegrationFamily(family);
|
|
448
|
-
const
|
|
449
|
-
const
|
|
450
|
-
const
|
|
437
|
+
const manifest = bundledManifestFor(kind, coverage.id);
|
|
438
|
+
const actions = manifest ? actionsFromManifest(manifest, dataClassFor(connector.actions)) : connector.actions;
|
|
439
|
+
const permissions = permissionsFor(coverage, actions);
|
|
440
|
+
const auth = authFor(coverage, family, permissions, kind);
|
|
441
|
+
const status = statusFor(kind, coverage.id);
|
|
451
442
|
const override = getIntegrationOverride(kind) ?? getIntegrationOverride(coverage.id);
|
|
452
443
|
const knownQuirks = override?.knownQuirks ? [...familySpec.knownQuirks ?? [], ...override.knownQuirks] : familySpec.knownQuirks;
|
|
453
444
|
return {
|
|
@@ -458,7 +449,7 @@ function specFromCoverage(coverage, connector) {
|
|
|
458
449
|
family,
|
|
459
450
|
auth,
|
|
460
451
|
permissions,
|
|
461
|
-
actions
|
|
452
|
+
actions,
|
|
462
453
|
triggers: connector.triggers,
|
|
463
454
|
setup: {
|
|
464
455
|
consoleUrl: override?.consoleUrl ?? familySpec.consoleUrl,
|
|
@@ -470,7 +461,7 @@ function specFromCoverage(coverage, connector) {
|
|
|
470
461
|
healthcheck: override?.healthcheck ?? healthcheckFor(kind, status, auth)
|
|
471
462
|
},
|
|
472
463
|
lifecycle: familySpec.lifecycle,
|
|
473
|
-
plannerHints: plannerHintsFor(coverage,
|
|
464
|
+
plannerHints: plannerHintsFor(coverage, actions),
|
|
474
465
|
metadata: { priority: coverage.priority, domains: coverage.domains }
|
|
475
466
|
};
|
|
476
467
|
}
|
|
@@ -489,13 +480,32 @@ function familyFor(spec) {
|
|
|
489
480
|
}
|
|
490
481
|
var apiKeyKinds = /* @__PURE__ */ new Set(["github", "gitlab", "airtable", "asana", "stripe", "twilio", "sendgrid", "postmark", "phony"]);
|
|
491
482
|
var hmacKinds = /* @__PURE__ */ new Set(["webhook"]);
|
|
492
|
-
function authFor(spec, family, permissions) {
|
|
483
|
+
function authFor(spec, family, permissions, kind) {
|
|
493
484
|
const f = INTEGRATION_FAMILIES[family];
|
|
494
|
-
|
|
495
|
-
|
|
485
|
+
const manifest = bundledManifestFor(kind, spec.id);
|
|
486
|
+
const realMode = manifest ? bundledAuthMode(manifest) : void 0;
|
|
487
|
+
if (realMode === "none") return { mode: "none" };
|
|
488
|
+
if (realMode === "hmac") {
|
|
489
|
+
return {
|
|
490
|
+
mode: "hmac",
|
|
491
|
+
credential: INTEGRATION_FAMILIES.hmac.credentialFields[0],
|
|
492
|
+
signatureHeader: `${spec.id}-signature`
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
if (realMode === "api_key") {
|
|
496
|
+
const hint = manifest ? bundledApiKeyHint(manifest) : void 0;
|
|
497
|
+
const credential = apiKeyFieldFor(spec.id);
|
|
498
|
+
return {
|
|
499
|
+
mode: "api_key",
|
|
500
|
+
credential: hint ? { ...credential, description: hint } : credential,
|
|
501
|
+
placement: apiKeyPlacementFor(spec.id)
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
if (family === "none" && !realMode) return { mode: "none" };
|
|
505
|
+
if (family === "hmac" && !realMode) {
|
|
496
506
|
return { mode: "hmac", credential: f.credentialFields[0], signatureHeader: `${spec.id}-signature` };
|
|
497
507
|
}
|
|
498
|
-
if (family === "api-key") {
|
|
508
|
+
if (family === "api-key" && !realMode) {
|
|
499
509
|
return { mode: "api_key", credential: apiKeyFieldFor(spec.id), placement: apiKeyPlacementFor(spec.id) };
|
|
500
510
|
}
|
|
501
511
|
const scopes = permissions.flatMap(
|
|
@@ -508,18 +518,54 @@ function authFor(spec, family, permissions) {
|
|
|
508
518
|
dataClass: permission.dataClass
|
|
509
519
|
}))
|
|
510
520
|
);
|
|
521
|
+
const real = manifest ? bundledOAuth2Auth(manifest) : void 0;
|
|
511
522
|
return {
|
|
512
523
|
mode: "oauth2",
|
|
513
|
-
authorizationUrl:
|
|
514
|
-
tokenUrl:
|
|
515
|
-
clientIdEnv: f.credentialFields.find((field) => !field.secret)?.env,
|
|
516
|
-
clientSecretEnv: f.credentialFields.find((field) => field.secret)?.env,
|
|
517
|
-
scopes,
|
|
518
|
-
extraAuthParams: extraAuthParamsFor(family),
|
|
524
|
+
authorizationUrl: real?.authorizationUrl ?? f.authorizationUrl,
|
|
525
|
+
tokenUrl: real?.tokenUrl ?? f.tokenUrl,
|
|
526
|
+
clientIdEnv: real?.clientIdEnv ?? f.credentialFields.find((field) => !field.secret)?.env,
|
|
527
|
+
clientSecretEnv: real?.clientSecretEnv ?? f.credentialFields.find((field) => field.secret)?.env,
|
|
528
|
+
scopes: real ? scopesFromManifest(real.scopes, permissions) : scopes,
|
|
529
|
+
extraAuthParams: real?.extraAuthParams ?? extraAuthParamsFor(family),
|
|
519
530
|
redirectUriTemplate: (f.redirectUriTemplate ?? "https://{host}/api/integrations/oauth/{kind}/callback").replace("{kind}", spec.id),
|
|
520
531
|
pkce: family === "google" || family === "microsoft-graph" ? "supported" : "unsupported"
|
|
521
532
|
};
|
|
522
533
|
}
|
|
534
|
+
function actionsFromManifest(manifest, fallbackDataClass) {
|
|
535
|
+
return manifest.capabilities.map((capability) => {
|
|
536
|
+
const mutation = capability.class === "mutation";
|
|
537
|
+
return {
|
|
538
|
+
id: capability.name,
|
|
539
|
+
title: capability.name,
|
|
540
|
+
risk: mutation ? "write" : "read",
|
|
541
|
+
requiredScopes: capability.requiredScopes ? [...capability.requiredScopes] : [],
|
|
542
|
+
dataClass: fallbackDataClass,
|
|
543
|
+
description: capability.description,
|
|
544
|
+
// A mutation reaching resources outside the caller needs confirmation
|
|
545
|
+
// before it runs; the adapter is what knows which those are.
|
|
546
|
+
approvalRequired: mutation ? capability.externalEffect : void 0,
|
|
547
|
+
inputSchema: capability.parameters
|
|
548
|
+
};
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
function scopesFromManifest(providerScopes, permissions) {
|
|
552
|
+
const writePermission = permissions.find((permission) => permission.risk === "write");
|
|
553
|
+
const readPermission = permissions.find((permission) => permission.risk === "read") ?? permissions[0];
|
|
554
|
+
return providerScopes.map((providerScope) => {
|
|
555
|
+
const mutating = /(?:^|[.\/_:-])(?:write|manage|create|modify|edit|update|delete|full|admin|readwrite)(?:$|[.\/_:-])/i.test(
|
|
556
|
+
providerScope
|
|
557
|
+
);
|
|
558
|
+
const base = (mutating ? writePermission : readPermission) ?? readPermission;
|
|
559
|
+
return {
|
|
560
|
+
normalized: base?.normalized ?? "unknown.read",
|
|
561
|
+
providerScope,
|
|
562
|
+
title: base?.title ?? providerScope,
|
|
563
|
+
reason: base?.reason ?? "Requested by the connector.",
|
|
564
|
+
risk: mutating ? "write" : "read",
|
|
565
|
+
dataClass: base?.dataClass ?? "private"
|
|
566
|
+
};
|
|
567
|
+
});
|
|
568
|
+
}
|
|
523
569
|
function credentialFieldsFor(auth) {
|
|
524
570
|
if (auth.mode === "api_key" || auth.mode === "hmac") return [auth.credential];
|
|
525
571
|
if (auth.mode === "oauth2") {
|
|
@@ -606,8 +652,8 @@ function healthcheckFor(kind, status, auth) {
|
|
|
606
652
|
}
|
|
607
653
|
return { id: `${kind}.static`, level: "static", description: "No credentials are required." };
|
|
608
654
|
}
|
|
609
|
-
function statusFor(kind) {
|
|
610
|
-
return
|
|
655
|
+
function statusFor(kind, coverageId) {
|
|
656
|
+
return bundledManifestFor(kind, coverageId) ? "executable" : "catalog";
|
|
611
657
|
}
|
|
612
658
|
function dataClassFor(actions) {
|
|
613
659
|
if (actions.some((a) => a.dataClass === "secret")) return "secret";
|
|
@@ -762,4 +808,4 @@ export {
|
|
|
762
808
|
validateCredentialFormat,
|
|
763
809
|
validateCredentialSet
|
|
764
810
|
};
|
|
765
|
-
//# sourceMappingURL=chunk-
|
|
811
|
+
//# sourceMappingURL=chunk-BS6LGM3V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/specs/types.ts","../src/specs/families.ts","../src/specs/overrides.ts","../src/specs/registry.ts","../src/specs/renderers.ts","../src/specs/validation.ts"],"sourcesContent":["import type {\n IntegrationActionRisk,\n IntegrationConnector,\n IntegrationConnectorAction,\n IntegrationConnectorCategory,\n IntegrationConnectorTrigger,\n IntegrationDataClass,\n} from '../index.js'\n\nexport type IntegrationAuthMode = 'oauth2' | 'api_key' | 'hmac' | 'none' | 'custom'\n\nexport type IntegrationSpecStatus = 'catalog' | 'executable' | 'deprecated'\n\nexport type IntegrationFamilyId =\n | 'google'\n | 'microsoft-graph'\n | 'atlassian'\n | 'salesforce'\n | 'hubspot'\n | 'slack'\n | 'notion'\n | 'standard-oauth2'\n | 'api-key'\n | 'hmac'\n | 'none'\n\nexport type NormalizedPermission =\n | `${string}.read`\n | `${string}.write`\n | `${string}.delete`\n | `${string}.admin`\n\nexport interface IntegrationSpec {\n kind: string\n title: string\n category: IntegrationConnectorCategory\n status: IntegrationSpecStatus\n family: IntegrationFamilyId\n auth: IntegrationAuthSpec\n permissions: PermissionDescriptor[]\n actions: IntegrationConnectorAction[]\n triggers?: IntegrationConnectorTrigger[]\n setup: IntegrationSetupSpec\n lifecycle?: IntegrationLifecycleSpec\n plannerHints?: IntegrationPlannerHints\n metadata?: Record<string, unknown>\n}\n\nexport type IntegrationAuthSpec =\n | OAuth2AuthSpec\n | ApiKeyAuthSpec\n | HmacAuthSpec\n | NoneAuthSpec\n | CustomAuthSpec\n\nexport interface OAuth2AuthSpec {\n mode: 'oauth2'\n /** Authorization endpoint the connect flow sends the user to.\n *\n * UNDEFINED when no shipped adapter and no family default supplies one —\n * i.e. the catalog knows the integration exists but nothing can currently\n * authenticate it. Callers must treat undefined as \"not connectable\" and\n * say so; this field was previously filled with\n * `https://example.invalid/<kind>/authorize`, a reserved TLD that can\n * never resolve, which made unconnectable integrations indistinguishable\n * from working ones. */\n authorizationUrl?: string\n /** Token endpoint. Undefined under the same condition as\n * {@link authorizationUrl}. */\n tokenUrl?: string\n clientIdEnv?: string\n clientSecretEnv?: string\n scopes: ScopeDescriptor[]\n extraAuthParams?: Record<string, string>\n redirectUriTemplate: string\n pkce?: 'required' | 'supported' | 'unsupported'\n}\n\nexport interface ApiKeyAuthSpec {\n mode: 'api_key'\n credential: CredentialFieldSpec\n placement?: 'bearer' | 'header' | 'query' | 'basic'\n}\n\nexport interface HmacAuthSpec {\n mode: 'hmac'\n credential: CredentialFieldSpec\n signatureHeader?: string\n}\n\nexport interface NoneAuthSpec {\n mode: 'none'\n}\n\nexport interface CustomAuthSpec {\n mode: 'custom'\n description: string\n}\n\nexport interface ScopeDescriptor {\n normalized: NormalizedPermission\n providerScope: string\n title: string\n reason: string\n risk: IntegrationActionRisk\n dataClass: IntegrationDataClass\n}\n\nexport interface PermissionDescriptor {\n normalized: NormalizedPermission\n providerScopes: string[]\n title: string\n risk: IntegrationActionRisk\n dataClass: IntegrationDataClass\n reason: string\n}\n\nexport interface CredentialFieldSpec {\n label: string\n description: string\n env?: string\n example?: string\n regex?: string\n secret: boolean\n}\n\nexport interface ConsoleStep {\n id: string\n title: string\n detail: string\n copyValue?: string\n}\n\nexport interface Quirk {\n id: string\n severity: 'info' | 'warning' | 'critical'\n message: string\n}\n\nexport interface PostSetupCheck {\n id: string\n title: string\n detail: string\n}\n\nexport interface HealthcheckSpec {\n id: string\n level: 'client_config' | 'connection' | 'webhook' | 'static'\n method?: 'GET' | 'POST'\n url?: string\n expectedStatus?: number[]\n description: string\n}\n\nexport interface IntegrationSetupSpec {\n consoleUrl?: string\n consoleSteps: ConsoleStep[]\n credentialFields: CredentialFieldSpec[]\n redirectUriTemplate?: string\n knownQuirks?: Quirk[]\n postSetup?: PostSetupCheck[]\n healthcheck?: HealthcheckSpec\n}\n\nexport interface IntegrationLifecycleSpec {\n supportsRefresh: boolean\n supportsRevoke: boolean\n supportsIncrementalAuth: boolean\n recommendedHealthcheckIntervalHours?: number\n freshnessSloMinutes?: number\n}\n\nexport interface IntegrationPlannerHints {\n useFor: string[]\n avoidFor?: string[]\n dataFreshness: 'realtime' | 'near_realtime' | 'eventual' | 'manual'\n writeRisk: 'low' | 'medium' | 'high'\n}\n\nexport interface IntegrationFamilySpec {\n id: IntegrationFamilyId\n title: string\n authMode: IntegrationAuthMode\n consoleUrl?: string\n authorizationUrl?: string\n tokenUrl?: string\n redirectUriTemplate?: string\n credentialFields: CredentialFieldSpec[]\n consoleSteps: ConsoleStep[]\n knownQuirks?: Quirk[]\n lifecycle: IntegrationLifecycleSpec\n}\n\nexport interface IntegrationSpecValidationIssue {\n path: string\n message: string\n}\n\nexport interface IntegrationSpecValidationResult {\n ok: boolean\n issues: IntegrationSpecValidationIssue[]\n}\n\nexport interface RenderSpecOptions {\n host: string\n callbackPath?: string\n}\n\nexport interface RenderedConsoleStep extends ConsoleStep {\n detail: string\n copyValue?: string\n}\n\nexport interface CredentialValidationInput {\n field: CredentialFieldSpec\n value: string\n}\n\nexport interface CredentialValidationResult {\n ok: boolean\n field: string\n message?: string\n}\n\nexport interface HealthcheckPlan {\n kind: string\n healthcheck: HealthcheckSpec\n requires: Array<'client_id' | 'client_secret' | 'api_key' | 'hmac_secret' | 'connection_credentials'>\n message: string\n}\n\nexport function specAuthToConnectorAuth(auth: IntegrationAuthSpec): IntegrationConnector['auth'] {\n if (auth.mode === 'api_key') return 'api_key'\n if (auth.mode === 'oauth2') return 'oauth2'\n if (auth.mode === 'none') return 'none'\n return 'custom'\n}\n","import type { IntegrationFamilyId, IntegrationFamilySpec } from './types.js'\n\nexport const INTEGRATION_FAMILIES: Record<IntegrationFamilyId, IntegrationFamilySpec> = {\n google: {\n id: 'google',\n title: 'Google OAuth',\n authMode: 'oauth2',\n consoleUrl: 'https://console.cloud.google.com/apis/credentials',\n authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/google/callback',\n credentialFields: [\n { label: 'Client ID', env: 'GOOGLE_OAUTH_CLIENT_ID', description: 'Google OAuth client ID.', example: '1234567890-abc.apps.googleusercontent.com', regex: '^[0-9]+-[a-zA-Z0-9_-]+\\\\.apps\\\\.googleusercontent\\\\.com$', secret: false },\n { label: 'Client Secret', env: 'GOOGLE_OAUTH_CLIENT_SECRET', description: 'Google OAuth client secret.', example: 'GOCSPX-...', secret: true },\n ],\n consoleSteps: [\n { id: 'project', title: 'Select project', detail: 'Open Google Cloud Console and select the project that owns the OAuth client.' },\n { id: 'consent', title: 'Configure consent screen', detail: 'Configure OAuth consent, app name, support email, and publishing status appropriate for the deployment.' },\n { id: 'client', title: 'Create web client', detail: 'Create an OAuth client of type Web application.' },\n { id: 'redirect', title: 'Add redirect URI', detail: 'Add {redirectUri} as an authorized redirect URI.', copyValue: '{redirectUri}' },\n { id: 'scopes', title: 'Add scopes', detail: 'Add the provider scopes listed in this spec.' },\n ],\n knownQuirks: [\n { id: 'offline-access', severity: 'warning', message: 'Use access_type=offline and prompt=consent when refresh tokens are required.' },\n { id: 'verification', severity: 'warning', message: 'Sensitive or restricted scopes may require Google verification before broad external use.' },\n ],\n lifecycle: { supportsRefresh: true, supportsRevoke: true, supportsIncrementalAuth: true, recommendedHealthcheckIntervalHours: 24 },\n },\n 'microsoft-graph': {\n id: 'microsoft-graph',\n title: 'Microsoft Graph OAuth',\n authMode: 'oauth2',\n consoleUrl: 'https://entra.microsoft.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade',\n authorizationUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',\n tokenUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/microsoft/callback',\n credentialFields: [\n { label: 'Client ID', env: 'MS_OAUTH_CLIENT_ID', description: 'Microsoft Entra application client ID.', example: '00000000-0000-0000-0000-000000000000', regex: '^[0-9a-fA-F-]{36}$', secret: false },\n { label: 'Client Secret', env: 'MS_OAUTH_CLIENT_SECRET', description: 'Microsoft Entra client secret value.', secret: true },\n ],\n consoleSteps: [\n { id: 'app', title: 'Register app', detail: 'Create or open an app registration in Microsoft Entra.' },\n { id: 'redirect', title: 'Add redirect URI', detail: 'Add {redirectUri} as a Web redirect URI.', copyValue: '{redirectUri}' },\n { id: 'secret', title: 'Create secret', detail: 'Create a client secret and store the secret value, not the secret ID.' },\n { id: 'permissions', title: 'Add Graph permissions', detail: 'Add the delegated Graph scopes listed in this spec and grant admin consent where required.' },\n ],\n knownQuirks: [\n { id: 'tenant-common', severity: 'info', message: 'The common tenant supports multi-tenant OAuth; single-tenant deployments should override the tenant segment.' },\n { id: 'admin-consent', severity: 'warning', message: 'Some Graph scopes require tenant admin consent.' },\n ],\n lifecycle: { supportsRefresh: true, supportsRevoke: true, supportsIncrementalAuth: true, recommendedHealthcheckIntervalHours: 24 },\n },\n atlassian: {\n id: 'atlassian',\n title: 'Atlassian OAuth',\n authMode: 'oauth2',\n consoleUrl: 'https://developer.atlassian.com/console/myapps/',\n authorizationUrl: 'https://auth.atlassian.com/authorize',\n tokenUrl: 'https://auth.atlassian.com/oauth/token',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/atlassian/callback',\n credentialFields: [\n { label: 'Client ID', description: 'Atlassian OAuth client ID.', secret: false },\n { label: 'Client Secret', description: 'Atlassian OAuth client secret.', secret: true },\n ],\n consoleSteps: [\n { id: 'app', title: 'Create OAuth app', detail: 'Create an OAuth 2.0 app in the Atlassian developer console.' },\n { id: 'redirect', title: 'Add callback URL', detail: 'Add {redirectUri} as the callback URL.', copyValue: '{redirectUri}' },\n { id: 'apis', title: 'Enable APIs', detail: 'Enable the Jira or Confluence APIs required by this connector.' },\n ],\n lifecycle: { supportsRefresh: true, supportsRevoke: false, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n salesforce: {\n id: 'salesforce',\n title: 'Salesforce OAuth',\n authMode: 'oauth2',\n consoleUrl: 'https://login.salesforce.com',\n authorizationUrl: 'https://login.salesforce.com/services/oauth2/authorize',\n tokenUrl: 'https://login.salesforce.com/services/oauth2/token',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/salesforce/callback',\n credentialFields: [\n { label: 'Client ID', env: 'SALESFORCE_OAUTH_CLIENT_ID', description: 'Salesforce connected app consumer key.', secret: false },\n { label: 'Client Secret', env: 'SALESFORCE_OAUTH_CLIENT_SECRET', description: 'Salesforce connected app consumer secret.', secret: true },\n ],\n consoleSteps: [\n { id: 'connected-app', title: 'Create connected app', detail: 'Create a Salesforce connected app with OAuth enabled.' },\n { id: 'callback', title: 'Add callback URL', detail: 'Add {redirectUri} as the callback URL.', copyValue: '{redirectUri}' },\n { id: 'scopes', title: 'Select scopes', detail: 'Add api and refresh_token/offline_access, plus any connector-specific scopes.' },\n ],\n knownQuirks: [\n { id: 'instance-url', severity: 'critical', message: 'Runtime calls must use the instance_url returned by the token response.' },\n ],\n lifecycle: { supportsRefresh: true, supportsRevoke: true, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n hubspot: {\n id: 'hubspot',\n title: 'HubSpot OAuth',\n authMode: 'oauth2',\n consoleUrl: 'https://developers.hubspot.com/',\n authorizationUrl: 'https://app.hubspot.com/oauth/authorize',\n tokenUrl: 'https://api.hubapi.com/oauth/v1/token',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/hubspot/callback',\n credentialFields: [\n { label: 'Client ID', env: 'HUBSPOT_OAUTH_CLIENT_ID', description: 'HubSpot app client ID.', secret: false },\n { label: 'Client Secret', env: 'HUBSPOT_OAUTH_CLIENT_SECRET', description: 'HubSpot app client secret.', secret: true },\n ],\n consoleSteps: [\n { id: 'app', title: 'Create private/public app', detail: 'Create a HubSpot app and configure OAuth.' },\n { id: 'redirect', title: 'Add redirect URL', detail: 'Add {redirectUri} to the app redirect URLs.', copyValue: '{redirectUri}' },\n { id: 'scopes', title: 'Add CRM scopes', detail: 'Add the CRM object scopes listed in this spec.' },\n ],\n lifecycle: { supportsRefresh: true, supportsRevoke: true, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n slack: {\n id: 'slack',\n title: 'Slack OAuth',\n authMode: 'oauth2',\n consoleUrl: 'https://api.slack.com/apps',\n authorizationUrl: 'https://slack.com/oauth/v2/authorize',\n tokenUrl: 'https://slack.com/api/oauth.v2.access',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/slack/callback',\n credentialFields: [\n { label: 'Client ID', env: 'SLACK_OAUTH_CLIENT_ID', description: 'Slack app client ID.', secret: false },\n { label: 'Client Secret', env: 'SLACK_OAUTH_CLIENT_SECRET', description: 'Slack app client secret.', secret: true },\n ],\n consoleSteps: [\n { id: 'app', title: 'Create Slack app', detail: 'Create or open a Slack app.' },\n { id: 'redirect', title: 'Add redirect URL', detail: 'Add {redirectUri} under OAuth & Permissions.', copyValue: '{redirectUri}' },\n { id: 'scopes', title: 'Add bot scopes', detail: 'Add the bot token scopes listed in this spec and reinstall the app.' },\n ],\n knownQuirks: [\n { id: 'bot-token', severity: 'info', message: 'Slack usually returns a bot access token; refresh tokens require token rotation.' },\n ],\n lifecycle: { supportsRefresh: false, supportsRevoke: true, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n notion: {\n id: 'notion',\n title: 'Notion OAuth',\n authMode: 'oauth2',\n consoleUrl: 'https://www.notion.so/my-integrations',\n authorizationUrl: 'https://api.notion.com/v1/oauth/authorize',\n tokenUrl: 'https://api.notion.com/v1/oauth/token',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/notion/callback',\n credentialFields: [\n { label: 'Client ID', env: 'NOTION_OAUTH_CLIENT_ID', description: 'Notion integration OAuth client ID.', secret: false },\n { label: 'Client Secret', env: 'NOTION_OAUTH_CLIENT_SECRET', description: 'Notion integration OAuth client secret.', secret: true },\n ],\n consoleSteps: [\n { id: 'integration', title: 'Create integration', detail: 'Create a Notion public integration.' },\n { id: 'redirect', title: 'Add redirect URI', detail: 'Add {redirectUri} as the redirect URI.', copyValue: '{redirectUri}' },\n { id: 'capabilities', title: 'Select capabilities', detail: 'Enable read/update/insert capabilities matching this connector.' },\n ],\n lifecycle: { supportsRefresh: true, supportsRevoke: true, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n 'standard-oauth2': {\n id: 'standard-oauth2',\n title: 'Standard OAuth 2.0',\n authMode: 'oauth2',\n redirectUriTemplate: 'https://{host}/api/integrations/oauth/{kind}/callback',\n credentialFields: [\n { label: 'Client ID', description: 'OAuth client ID.', secret: false },\n { label: 'Client Secret', description: 'OAuth client secret.', secret: true },\n ],\n consoleSteps: [\n { id: 'app', title: 'Create OAuth app', detail: 'Create an OAuth app in the provider console.' },\n { id: 'redirect', title: 'Add redirect URI', detail: 'Add {redirectUri} as an allowed redirect URI.', copyValue: '{redirectUri}' },\n { id: 'scopes', title: 'Add scopes', detail: 'Add the scopes listed in this spec.' },\n ],\n lifecycle: { supportsRefresh: true, supportsRevoke: false, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n 'api-key': {\n id: 'api-key',\n title: 'API key',\n authMode: 'api_key',\n credentialFields: [\n { label: 'API Key', description: 'Provider API key or token.', example: 'sk_...', secret: true },\n ],\n consoleSteps: [\n { id: 'token', title: 'Create token', detail: 'Create an API key/token in the provider console with the minimum required permissions.' },\n ],\n lifecycle: { supportsRefresh: false, supportsRevoke: true, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n hmac: {\n id: 'hmac',\n title: 'HMAC secret',\n authMode: 'hmac',\n credentialFields: [\n { label: 'Signing Secret', description: 'Webhook signing secret.', secret: true },\n ],\n consoleSteps: [\n { id: 'secret', title: 'Configure signing secret', detail: 'Configure the shared signing secret in the sender and receiver.' },\n ],\n lifecycle: { supportsRefresh: false, supportsRevoke: true, supportsIncrementalAuth: false, recommendedHealthcheckIntervalHours: 24 },\n },\n none: {\n id: 'none',\n title: 'No authentication',\n authMode: 'none',\n credentialFields: [],\n consoleSteps: [\n { id: 'configure', title: 'Configure endpoint', detail: 'No provider credentials are required.' },\n ],\n lifecycle: { supportsRefresh: false, supportsRevoke: false, supportsIncrementalAuth: false },\n },\n}\n\nexport function getIntegrationFamily(id: IntegrationFamilyId): IntegrationFamilySpec {\n return INTEGRATION_FAMILIES[id]\n}\n","/**\n * Per-kind overrides on top of family defaults.\n *\n * The family layer (`families.ts`) carries the auth-shape defaults — generic\n * \"API Key\" or \"Client ID + Client Secret\" credential fields, generic console\n * steps. Most kinds are happy with that. But some have provider-specific\n * shape that the family can't capture: Twilio's auth is two-part (Account\n * SID + Auth Token); Stripe's preferred path is restricted keys with specific\n * granted permissions; SendGrid demands a verified sender domain in the\n * console before keys work.\n *\n * `INTEGRATION_OVERRIDES` is the seam for that. The registry merges the\n * override on top of the family defaults at spec-build time. Override\n * fields are purely additive — set what you want to customize, leave the\n * rest absent and the family defaults apply.\n *\n * Adding a new override:\n * 1. Author the override entry below.\n * 2. The next spec build picks it up automatically; no other registry\n * change needed. Coverage catalog stays compact.\n *\n * Why a separate map and not inline on `IntegrationCoverageSpec`: the\n * coverage catalog is a flat tuple list optimized for fast iteration over\n * 142 specs. Bloating the tuple with optional override fields hurts\n * readability of the catalog AND scatters provider knowledge across two\n * data shapes. Keeping overrides in their own keyed map means contributors\n * looking for \"how does Stripe credential setup work\" find it in one place.\n */\n\nimport type {\n ConsoleStep,\n CredentialFieldSpec,\n HealthcheckSpec,\n PostSetupCheck,\n Quirk,\n} from './types.js'\n\nexport interface IntegrationOverride {\n /** Replaces `setup.consoleUrl` from the family default. */\n consoleUrl?: string\n /** Replaces `setup.consoleSteps`. Specify the full list — overrides do\n * not deep-merge step arrays because step ordering is meaningful. */\n consoleSteps?: ConsoleStep[]\n /** Replaces `setup.credentialFields`. Use to add a second field (e.g.\n * Twilio Account SID + Auth Token), tighten validation regex, or\n * enrich field descriptions with provider-specific guidance. */\n credentialFields?: CredentialFieldSpec[]\n /** Appended to `setup.knownQuirks`. */\n knownQuirks?: Quirk[]\n /** Replaces `setup.postSetup`. */\n postSetup?: PostSetupCheck[]\n /** Replaces the healthcheck the registry would otherwise infer. */\n healthcheck?: HealthcheckSpec\n}\n\nexport const INTEGRATION_OVERRIDES: Record<string, IntegrationOverride> = {\n // ── Stripe pack ────────────────────────────────────────────────────\n // Stripe issues two key types: secret keys (sk_*) and restricted keys\n // (rk_*). For voice-agent workloads, restricted keys are the right call\n // — least-privilege scoped to the specific resources the agent can\n // touch. The hint nudges operators toward that path.\n 'stripe-pack': {\n consoleUrl: 'https://dashboard.stripe.com/apikeys',\n credentialFields: [\n {\n label: 'Stripe secret key',\n description:\n 'Restricted key recommended. Dashboard → Developers → API keys → Create restricted key. ' +\n 'Grant write access on Customers, Invoices, and Checkout Sessions.',\n example: 'sk_live_… or rk_live_… (use sk_test_… / rk_test_… for staging)',\n regex: '^(sk|rk)_(live|test)_[A-Za-z0-9]+$',\n secret: true,\n },\n ],\n consoleSteps: [\n {\n id: 'open-keys',\n title: 'Open Stripe API keys',\n detail: 'Visit https://dashboard.stripe.com/apikeys',\n copyValue: 'https://dashboard.stripe.com/apikeys',\n },\n {\n id: 'create-restricted',\n title: 'Create a restricted key',\n detail:\n 'Click \"Create restricted key\". Name it something descriptive ' +\n '(e.g. \"ph0ny voice agent — prod\"). Grant WRITE on Customers, ' +\n 'Invoices, and Checkout Sessions. Leave everything else NONE.',\n },\n {\n id: 'paste',\n title: 'Paste the key',\n detail:\n 'Copy the key Stripe shows once (rk_live_… or sk_live_…). ' +\n 'Paste it into ph0ny. The key is sealed before persistence.',\n },\n ],\n },\n\n // ── Twilio SMS ─────────────────────────────────────────────────────\n // Twilio's REST API uses Basic auth with two parts: Account SID\n // (public-ish, AC…) + Auth Token (secret). The default api-key family\n // only exposes one field, which doesn't fit. Providing both fields\n // explicitly lets the consumer's UI render two inputs.\n 'twilio-sms': {\n consoleUrl: 'https://console.twilio.com/',\n credentialFields: [\n {\n label: 'Account SID',\n description: 'Your Twilio Account SID. Console → Account → API keys & tokens.',\n example: 'AC… (34 hex chars)',\n regex: '^AC[a-f0-9]{32}$',\n secret: false,\n },\n {\n label: 'Auth Token',\n description:\n 'Your Twilio Auth Token (or Standard API Key secret). ' +\n 'Use a non-primary auth token in production so rotating it ' +\n \"won't break other Twilio integrations.\",\n secret: true,\n },\n ],\n consoleSteps: [\n {\n id: 'open',\n title: 'Open Twilio console',\n detail: 'Visit https://console.twilio.com/',\n copyValue: 'https://console.twilio.com/',\n },\n {\n id: 'find',\n title: 'Find your Account SID + Auth Token',\n detail:\n 'Account info is on the dashboard home. For better security, ' +\n 'create a Standard API Key (Account → API keys & tokens → Create ' +\n 'API Key) and use the SID + Secret pair instead of the primary ' +\n 'auth token.',\n },\n {\n id: 'paste',\n title: 'Paste both values',\n detail: 'Account SID is non-secret; Auth Token is sealed before persistence.',\n },\n ],\n knownQuirks: [\n {\n id: 'subaccount-tokens',\n severity: 'info',\n message:\n 'If you use Twilio subaccounts, paste the SID/Token of the ' +\n 'subaccount that owns the phone numbers your agent calls — not ' +\n 'the master account.',\n },\n ],\n },\n\n // ── ph0ny ──────────────────────────────────────────────────────────\n // ph0ny issues a single Bearer API key per developer. The key is a\n // `plabs_` prefix followed by 32 url-safe nanoid chars. It is shown once\n // at creation (POST /v1/keys in the developer portal); only its hash is\n // stored server-side, so it cannot be retrieved later — rotate to replace.\n phony: {\n consoleUrl: 'https://api.ph0ny.com',\n credentialFields: [\n {\n label: 'ph0ny API key',\n description:\n 'Bearer key issued by ph0ny. Create one in the developer portal ' +\n '(POST /v1/keys). Sent as `Authorization: Bearer <key>`.',\n example: 'plabs_V1StGXR8Z5jdHi6BmyTAbCdEfGhIjKlm',\n regex: '^plabs_[A-Za-z0-9_-]{32}$',\n secret: true,\n },\n ],\n consoleSteps: [\n {\n id: 'open-portal',\n title: 'Open the ph0ny developer portal',\n detail: 'Visit https://api.ph0ny.com and sign in to the developer portal.',\n copyValue: 'https://api.ph0ny.com',\n },\n {\n id: 'create-key',\n title: 'Create an API key',\n detail:\n 'In the portal, create a new API key (POST /v1/keys). Give it a ' +\n 'descriptive name (e.g. \"tangle agent — prod\"). ph0ny returns the ' +\n 'full key exactly once.',\n },\n {\n id: 'paste',\n title: 'Paste the key',\n detail:\n 'Copy the plabs_… key ph0ny shows and paste it here. The key is ' +\n 'sealed before persistence.',\n },\n ],\n knownQuirks: [\n {\n id: 'key-shown-once',\n severity: 'warning',\n message:\n 'ph0ny stores only a hash of the key — the full plabs_… value is ' +\n 'shown exactly once at creation and cannot be retrieved later. Save ' +\n 'it immediately; if lost, rotate to issue a replacement.',\n },\n {\n id: 'rotate-endpoint',\n severity: 'info',\n message:\n 'Rotate a key with POST /v1/keys/:id/rotate. The old key is revoked ' +\n 'and a new plabs_… key is returned once — update this connection ' +\n 'with the new value.',\n },\n ],\n },\n}\n\n/** Public read — undefined when no override exists for the kind. */\nexport function getIntegrationOverride(kind: string): IntegrationOverride | undefined {\n return INTEGRATION_OVERRIDES[kind]\n}\n","import {\n buildIntegrationCoverageConnectors,\n listIntegrationCoverageSpecs,\n type IntegrationCoverageSpec,\n} from '../coverage-catalog.js'\nimport type {\n IntegrationConnector,\n IntegrationConnectorAction,\n IntegrationConnectorTrigger,\n IntegrationDataClass,\n} from '../index.js'\nimport {\n bundledApiKeyHint,\n bundledAuthMode,\n bundledOAuth2Auth,\n getBundledAdapterManifest,\n} from '../connectors/bundled-manifests.js'\nimport type { ConnectorManifest } from '../connectors/types.js'\nimport { INTEGRATION_FAMILIES, getIntegrationFamily } from './families.js'\nimport { getIntegrationOverride } from './overrides.js'\nimport type {\n ApiKeyAuthSpec,\n HealthcheckSpec,\n HmacAuthSpec,\n IntegrationAuthSpec,\n IntegrationFamilyId,\n IntegrationPlannerHints,\n IntegrationSpec,\n IntegrationSpecStatus,\n NoneAuthSpec,\n NormalizedPermission,\n OAuth2AuthSpec,\n PermissionDescriptor,\n ScopeDescriptor,\n} from './types.js'\n\n/**\n * Executability and OAuth endpoints are DERIVED from the bundled adapter\n * registry, never restated here.\n *\n * This used to be a hand-maintained `EXECUTABLE_KINDS` set of 18 names. The\n * package ships 530 adapters, so the set was wrong by two orders of magnitude\n * and every new adapter silently landed as `status: 'catalog'`. Worse, the\n * oauth2 branch of `authFor` fabricated `https://example.invalid/<kind>/...`\n * whenever the family table had no endpoint — 104 of 131 oauth2 entries — so\n * a Connect button could be wired to a reserved TLD that can never resolve.\n * A catalog that describes connectors must read the connectors.\n */\nfunction bundledManifestFor(kind: string, coverageId: string) {\n return getBundledAdapterManifest(kind) ?? getBundledAdapterManifest(coverageId)\n}\n\nconst KIND_ALIASES: Record<string, string> = {\n 'outlook-calendar': 'microsoft-calendar',\n 'notion-database': 'notion',\n stripe: 'stripe-pack',\n twilio: 'twilio-sms',\n}\n\nexport function listIntegrationSpecs(): IntegrationSpec[] {\n const connectors = new Map(buildIntegrationCoverageConnectors({ providerId: 'spec' }).map((c) => [c.id, c]))\n return listIntegrationCoverageSpecs().map((coverage) => {\n const connector = connectors.get(coverage.id)\n if (!connector) throw new Error(`missing coverage connector for ${coverage.id}`)\n return specFromCoverage(coverage, connector)\n })\n}\n\nexport function getIntegrationSpec(kind: string): IntegrationSpec | undefined {\n const canonical = KIND_ALIASES[kind] ?? kind\n return listIntegrationSpecs().find((spec) => spec.kind === canonical || KIND_ALIASES[spec.kind] === canonical)\n}\n\n/** Auth-driving descriptor the hub uses to start a connect flow per provider\n * instead of hard-coding scopes/auth kind. Derived from the spec catalog\n * ({@link getIntegrationSpec}); undefined when the kind is not in the\n * catalog. */\nexport interface ConnectorAuthSpec {\n kind: string\n authKind: 'oauth2' | 'api_key' | 'none' | 'custom'\n /** Provider scopes to request in the authorization grant. Empty for\n * api_key / none / custom. */\n requestedScopes: string[]\n /** OAuth-only: authorization + token endpoints and PKCE posture. Present\n * only when authKind === 'oauth2'. */\n authorizationUrl?: string\n tokenUrl?: string\n pkce?: 'required' | 'supported' | 'unsupported'\n redirectUriTemplate?: string\n clientIdEnv?: string\n clientSecretEnv?: string\n extraAuthParams?: Record<string, string>\n}\n\nexport function resolveConnectorAuthSpec(kind: string): ConnectorAuthSpec | undefined {\n const spec = getIntegrationSpec(kind)\n if (!spec) return undefined\n const auth = spec.auth\n if (auth.mode === 'oauth2') {\n return {\n kind: spec.kind,\n authKind: 'oauth2',\n requestedScopes: auth.scopes.map((scope) => scope.providerScope).filter(Boolean),\n authorizationUrl: auth.authorizationUrl,\n tokenUrl: auth.tokenUrl,\n pkce: auth.pkce,\n redirectUriTemplate: auth.redirectUriTemplate,\n clientIdEnv: auth.clientIdEnv,\n clientSecretEnv: auth.clientSecretEnv,\n extraAuthParams: auth.extraAuthParams,\n }\n }\n if (auth.mode === 'api_key') {\n return { kind: spec.kind, authKind: 'api_key', requestedScopes: [] }\n }\n if (auth.mode === 'none') {\n return { kind: spec.kind, authKind: 'none', requestedScopes: [] }\n }\n return { kind: spec.kind, authKind: 'custom', requestedScopes: [] }\n}\n\nexport function listExecutableIntegrationSpecs(): IntegrationSpec[] {\n return listIntegrationSpecs().filter((spec) => spec.status === 'executable')\n}\n\nexport function integrationSpecToConnector(spec: IntegrationSpec, providerId = 'spec'): IntegrationConnector {\n return {\n id: spec.kind,\n providerId,\n title: spec.title,\n category: spec.category,\n auth: spec.auth.mode === 'api_key' ? 'api_key' : spec.auth.mode === 'oauth2' ? 'oauth2' : spec.auth.mode === 'none' ? 'none' : 'custom',\n scopes: spec.permissions.flatMap((permission) => permission.providerScopes),\n actions: spec.actions,\n triggers: spec.triggers,\n metadata: {\n ...(spec.metadata ?? {}),\n source: 'integration-spec',\n status: spec.status,\n family: spec.family,\n plannerHints: spec.plannerHints,\n },\n }\n}\n\nfunction specFromCoverage(coverage: IntegrationCoverageSpec, connector: IntegrationConnector): IntegrationSpec {\n const kind = KIND_ALIASES[coverage.id] ?? coverage.id\n const family = familyFor(coverage)\n const familySpec = getIntegrationFamily(family)\n const manifest = bundledManifestFor(kind, coverage.id)\n const actions = manifest\n ? actionsFromManifest(manifest, dataClassFor(connector.actions))\n : connector.actions\n const permissions = permissionsFor(coverage, actions)\n const auth = authFor(coverage, family, permissions, kind)\n const status = statusFor(kind, coverage.id)\n // Per-kind overrides layer in here — see specs/overrides.ts. The override\n // is consulted under the canonical kind AND the original coverage id so\n // alias-collapsed kinds (e.g. notion-database → notion) can carry an\n // override under either name.\n const override =\n getIntegrationOverride(kind) ?? getIntegrationOverride(coverage.id)\n // Family quirks + override quirks are concatenated; everything else is\n // a replace (override fields take precedence when present).\n const knownQuirks = override?.knownQuirks\n ? [...(familySpec.knownQuirks ?? []), ...override.knownQuirks]\n : familySpec.knownQuirks\n return {\n kind,\n title: connector.title,\n category: connector.category,\n status,\n family,\n auth,\n permissions,\n actions,\n triggers: connector.triggers,\n setup: {\n consoleUrl: override?.consoleUrl ?? familySpec.consoleUrl,\n consoleSteps: override?.consoleSteps ?? familySpec.consoleSteps,\n credentialFields: override?.credentialFields ?? credentialFieldsFor(auth),\n redirectUriTemplate: auth.mode === 'oauth2' ? auth.redirectUriTemplate : familySpec.redirectUriTemplate,\n knownQuirks,\n postSetup: override?.postSetup,\n healthcheck: override?.healthcheck ?? healthcheckFor(kind, status, auth),\n },\n lifecycle: familySpec.lifecycle,\n plannerHints: plannerHintsFor(coverage, actions),\n metadata: { priority: coverage.priority, domains: coverage.domains },\n }\n}\n\nfunction familyFor(spec: IntegrationCoverageSpec): IntegrationFamilyId {\n if (hmacKinds.has(spec.id)) return 'hmac'\n if (spec.auth === 'none') return 'none'\n if (spec.id.startsWith('google-') || spec.domains.includes('google')) return 'google'\n if (spec.id.startsWith('microsoft-') || ['outlook-mail', 'outlook-calendar', 'onedrive', 'sharepoint'].includes(spec.id)) return 'microsoft-graph'\n if (['jira', 'confluence', 'trello', 'bitbucket'].includes(spec.id)) return 'atlassian'\n if (spec.id === 'salesforce') return 'salesforce'\n if (spec.id === 'hubspot') return 'hubspot'\n if (spec.id === 'slack') return 'slack'\n if (spec.id === 'notion') return 'notion'\n if (apiKeyKinds.has(spec.id)) return 'api-key'\n return 'standard-oauth2'\n}\n\nconst apiKeyKinds = new Set(['github', 'gitlab', 'airtable', 'asana', 'stripe', 'twilio', 'sendgrid', 'postmark', 'phony'])\nconst hmacKinds = new Set(['webhook'])\n\nfunction authFor(\n spec: IntegrationCoverageSpec,\n family: IntegrationFamilyId,\n permissions: PermissionDescriptor[],\n kind: string,\n): IntegrationAuthSpec {\n const f = INTEGRATION_FAMILIES[family]\n // The shipped adapter decides HOW a connector authenticates. The coverage\n // table only guesses: it defaults every unlisted entry to the\n // `standard-oauth2` family, which is how Coda — an api-key connector —\n // came to advertise an OAuth flow it does not have.\n const manifest = bundledManifestFor(kind, spec.id)\n const realMode = manifest ? bundledAuthMode(manifest) : undefined\n if (realMode === 'none') return { mode: 'none' } satisfies NoneAuthSpec\n if (realMode === 'hmac') {\n return {\n mode: 'hmac',\n credential: INTEGRATION_FAMILIES.hmac.credentialFields[0]!,\n signatureHeader: `${spec.id}-signature`,\n } satisfies HmacAuthSpec\n }\n if (realMode === 'api_key') {\n const hint = manifest ? bundledApiKeyHint(manifest) : undefined\n const credential = apiKeyFieldFor(spec.id)\n return {\n mode: 'api_key',\n credential: hint ? { ...credential, description: hint } : credential,\n placement: apiKeyPlacementFor(spec.id),\n } satisfies ApiKeyAuthSpec\n }\n if (family === 'none' && !realMode) return { mode: 'none' } satisfies NoneAuthSpec\n if (family === 'hmac' && !realMode) {\n return { mode: 'hmac', credential: f.credentialFields[0]!, signatureHeader: `${spec.id}-signature` } satisfies HmacAuthSpec\n }\n if (family === 'api-key' && !realMode) {\n return { mode: 'api_key', credential: apiKeyFieldFor(spec.id), placement: apiKeyPlacementFor(spec.id) } satisfies ApiKeyAuthSpec\n }\n const scopes = permissions.flatMap((permission) =>\n permission.providerScopes.map((providerScope): ScopeDescriptor => ({\n normalized: permission.normalized,\n providerScope,\n title: permission.title,\n reason: permission.reason,\n risk: permission.risk,\n dataClass: permission.dataClass,\n })),\n )\n // A shipped adapter is the authority on how its provider authenticates:\n // it holds the endpoints the connect flow actually posts to and the exact\n // scope set the grant must request. Prefer it over the family defaults,\n // and never substitute a placeholder when neither knows — an absent URL is\n // a fact the caller can check, whereas `https://example.invalid/...` is a\n // dead link that reads as configuration.\n const real = manifest ? bundledOAuth2Auth(manifest) : undefined\n return {\n mode: 'oauth2',\n authorizationUrl: real?.authorizationUrl ?? f.authorizationUrl,\n tokenUrl: real?.tokenUrl ?? f.tokenUrl,\n clientIdEnv: real?.clientIdEnv ?? f.credentialFields.find((field) => !field.secret)?.env,\n clientSecretEnv: real?.clientSecretEnv ?? f.credentialFields.find((field) => field.secret)?.env,\n scopes: real ? scopesFromManifest(real.scopes, permissions) : scopes,\n extraAuthParams: real?.extraAuthParams ?? extraAuthParamsFor(family),\n redirectUriTemplate: (f.redirectUriTemplate ?? 'https://{host}/api/integrations/oauth/{kind}/callback').replace('{kind}', spec.id),\n pkce: family === 'google' || family === 'microsoft-graph' ? 'supported' : 'unsupported',\n } satisfies OAuth2AuthSpec\n}\n\n/**\n * The action list an agent is shown, taken from the adapter's own capability\n * catalog.\n *\n * The coverage table synthesizes actions from 19 generic \"action packs\", so\n * every finance-pack connector advertised the same four names —\n * `transactions.search`, `accounts.read`, `invoices.create`, `records.sync`.\n * For QuickBooks and Xero, one of those four exists. The other three are tool\n * calls that can only fail, while the capabilities that DO exist (`reports.get`,\n * `entities.query`, `tenants.list`) went unmentioned. Naming a tool that does\n * not exist is worse than naming none: the model spends the turn on it.\n */\nfunction actionsFromManifest(\n manifest: ConnectorManifest,\n fallbackDataClass: IntegrationDataClass,\n): IntegrationConnectorAction[] {\n return manifest.capabilities.map((capability): IntegrationConnectorAction => {\n const mutation = capability.class === 'mutation'\n return {\n id: capability.name,\n title: capability.name,\n risk: mutation ? 'write' : 'read',\n requiredScopes: capability.requiredScopes ? [...capability.requiredScopes] : [],\n dataClass: fallbackDataClass,\n description: capability.description,\n // A mutation reaching resources outside the caller needs confirmation\n // before it runs; the adapter is what knows which those are.\n approvalRequired: mutation ? capability.externalEffect : undefined,\n inputSchema: capability.parameters,\n }\n })\n}\n\n/** Pair the adapter's REAL provider scopes with the closest permission\n * descriptor for UI copy. The scope SET is taken verbatim from the manifest\n * because it is what the authorization grant actually requests — only the\n * surrounding title/risk labelling is matched heuristically, by whether the\n * scope names a mutating capability. */\nfunction scopesFromManifest(\n providerScopes: string[],\n permissions: PermissionDescriptor[],\n): ScopeDescriptor[] {\n const writePermission = permissions.find((permission) => permission.risk === 'write')\n const readPermission = permissions.find((permission) => permission.risk === 'read') ?? permissions[0]\n return providerScopes.map((providerScope): ScopeDescriptor => {\n const mutating = /(?:^|[.\\/_:-])(?:write|manage|create|modify|edit|update|delete|full|admin|readwrite)(?:$|[.\\/_:-])/i.test(\n providerScope,\n )\n const base = (mutating ? writePermission : readPermission) ?? readPermission\n return {\n normalized: base?.normalized ?? 'unknown.read',\n providerScope,\n title: base?.title ?? providerScope,\n reason: base?.reason ?? 'Requested by the connector.',\n risk: mutating ? 'write' : 'read',\n dataClass: base?.dataClass ?? 'private',\n }\n })\n}\n\nfunction credentialFieldsFor(auth: IntegrationAuthSpec) {\n if (auth.mode === 'api_key' || auth.mode === 'hmac') return [auth.credential]\n if (auth.mode === 'oauth2') {\n return [\n { label: 'Client ID', env: auth.clientIdEnv, description: 'OAuth client ID.', secret: false },\n { label: 'Client Secret', env: auth.clientSecretEnv, description: 'OAuth client secret.', secret: true },\n ]\n }\n return []\n}\n\nfunction permissionsFor(spec: IntegrationCoverageSpec, actions: IntegrationConnectorAction[]): PermissionDescriptor[] {\n const dataClass = dataClassFor(actions)\n const readScope = providerScopeFor(spec, 'read')\n const writeScope = providerScopeFor(spec, 'write')\n const permissions: PermissionDescriptor[] = [\n {\n normalized: `${spec.actionPack}.read` as NormalizedPermission,\n providerScopes: readScope ? [readScope] : [],\n title: `${spec.title} read`,\n risk: 'read',\n dataClass,\n reason: `Read ${spec.title} data for user-authorized agent workflows.`,\n },\n ]\n if (actions.some((a) => a.risk !== 'read')) {\n permissions.push({\n normalized: `${spec.actionPack}.write` as NormalizedPermission,\n providerScopes: writeScope ? [writeScope] : [],\n title: `${spec.title} write`,\n risk: 'write',\n dataClass,\n reason: `Create or update ${spec.title} resources after policy approval.`,\n })\n }\n return permissions\n}\n\nfunction providerScopeFor(spec: IntegrationCoverageSpec, mode: 'read' | 'write'): string {\n const explicit = explicitScopes[spec.id]?.[mode]\n if (explicit) return explicit\n if (spec.auth === 'none') return ''\n return `${spec.id}.${mode}`\n}\n\nconst explicitScopes: Record<string, Partial<Record<'read' | 'write', string>>> = {\n gmail: { read: 'https://www.googleapis.com/auth/gmail.readonly', write: 'https://www.googleapis.com/auth/gmail.modify' },\n 'google-calendar': { read: 'https://www.googleapis.com/auth/calendar.readonly', write: 'https://www.googleapis.com/auth/calendar' },\n 'google-sheets': { read: 'https://www.googleapis.com/auth/spreadsheets.readonly', write: 'https://www.googleapis.com/auth/spreadsheets' },\n 'google-drive': { read: 'https://www.googleapis.com/auth/drive.readonly', write: 'https://www.googleapis.com/auth/drive.file' },\n 'google-docs': { read: 'https://www.googleapis.com/auth/documents.readonly', write: 'https://www.googleapis.com/auth/documents' },\n 'outlook-mail': { read: 'Mail.Read', write: 'Mail.Send' },\n 'outlook-calendar': { read: 'Calendars.Read', write: 'Calendars.ReadWrite' },\n 'microsoft-teams': { read: 'ChannelMessage.Read.All', write: 'ChannelMessage.Send' },\n onedrive: { read: 'Files.Read', write: 'Files.ReadWrite' },\n sharepoint: { read: 'Sites.Read.All', write: 'Sites.ReadWrite.All' },\n slack: { read: 'channels:read', write: 'chat:write' },\n hubspot: { read: 'crm.objects.contacts.read', write: 'crm.objects.contacts.write' },\n salesforce: { read: 'api', write: 'api' },\n notion: { read: '', write: '' },\n github: { read: 'repo:read', write: 'repo' },\n gitlab: { read: 'read_api', write: 'api' },\n airtable: { read: 'data.records:read', write: 'data.records:write' },\n asana: { read: 'default', write: 'default' },\n stripe: { read: 'read_only', write: 'standard' },\n twilio: { read: 'api_key', write: 'api_key' },\n}\n\nfunction plannerHintsFor(spec: IntegrationCoverageSpec, actions: IntegrationConnectorAction[]): IntegrationPlannerHints {\n return {\n useFor: spec.domains.map((domain) => domain.replace(/-/g, ' ')),\n dataFreshness: ['calendar', 'chat', 'commerce', 'finance', 'support'].includes(spec.actionPack) ? 'near_realtime' : 'eventual',\n writeRisk: actions.some((a) => a.risk === 'destructive') ? 'high' : actions.some((a) => a.risk === 'write') ? 'medium' : 'low',\n }\n}\n\nfunction healthcheckFor(kind: string, status: IntegrationSpecStatus, auth: IntegrationAuthSpec): HealthcheckSpec {\n if (status !== 'executable') {\n return { id: `${kind}.static`, level: 'static', description: 'Catalog-only integration; no executable connector healthcheck is available yet.' }\n }\n if (auth.mode === 'oauth2') {\n return { id: `${kind}.connection`, level: 'connection', description: 'Validate a user connection by calling the connector test endpoint.' }\n }\n if (auth.mode === 'api_key') {\n return { id: `${kind}.connection`, level: 'connection', description: 'Validate API credentials by calling the connector test endpoint.' }\n }\n if (auth.mode === 'hmac') {\n return { id: `${kind}.webhook`, level: 'webhook', description: 'Validate webhook signing configuration with a signed test payload.' }\n }\n return { id: `${kind}.static`, level: 'static', description: 'No credentials are required.' }\n}\n\nfunction statusFor(kind: string, coverageId: string): IntegrationSpecStatus {\n return bundledManifestFor(kind, coverageId) ? 'executable' : 'catalog'\n}\n\nfunction dataClassFor(actions: IntegrationConnectorAction[]): IntegrationDataClass {\n if (actions.some((a) => a.dataClass === 'secret')) return 'secret'\n if (actions.some((a) => a.dataClass === 'sensitive')) return 'sensitive'\n if (actions.some((a) => a.dataClass === 'private')) return 'private'\n if (actions.some((a) => a.dataClass === 'internal')) return 'internal'\n return 'public'\n}\n\nfunction apiKeyFieldFor(kind: string) {\n return {\n label: `${kind} API key`,\n description: `API key or token for ${kind}.`,\n example: kind === 'stripe' ? 'sk_live_...' : undefined,\n secret: true,\n }\n}\n\nfunction apiKeyPlacementFor(kind: string): ApiKeyAuthSpec['placement'] {\n if (kind === 'gitlab') return 'header'\n return 'bearer'\n}\n\nfunction extraAuthParamsFor(family: IntegrationFamilyId): Record<string, string> | undefined {\n if (family === 'google') return { access_type: 'offline', prompt: 'consent', include_granted_scopes: 'true' }\n if (family === 'notion') return { owner: 'user' }\n return undefined\n}\n","import type {\n ConsoleStep,\n HealthcheckPlan,\n IntegrationSpec,\n RenderSpecOptions,\n RenderedConsoleStep,\n} from './types.js'\n\nexport function renderConsoleSteps(spec: IntegrationSpec, options: RenderSpecOptions): RenderedConsoleStep[] {\n const redirectUri = renderRedirectUri(spec, options)\n return spec.setup.consoleSteps.map((step) => ({\n ...step,\n detail: renderTemplate(step.detail, spec, options, redirectUri),\n copyValue: step.copyValue ? renderTemplate(step.copyValue, spec, options, redirectUri) : undefined,\n }))\n}\n\nexport function renderRunbookMarkdown(spec: IntegrationSpec, options: RenderSpecOptions): string {\n const steps = renderConsoleSteps(spec, options)\n const lines = [\n `# ${spec.title} Integration Setup`,\n '',\n `- Kind: \\`${spec.kind}\\``,\n `- Status: \\`${spec.status}\\``,\n `- Auth: \\`${spec.auth.mode}\\``,\n `- Family: \\`${spec.family}\\``,\n ]\n if (spec.setup.consoleUrl) lines.push(`- Console: ${spec.setup.consoleUrl}`)\n if (spec.setup.redirectUriTemplate) lines.push(`- Redirect URI: \\`${renderRedirectUri(spec, options)}\\``)\n lines.push('', '## Credentials', '')\n for (const field of spec.setup.credentialFields) {\n lines.push(`- ${field.secret ? '[secret] ' : ''}${field.label}${field.env ? ` (\\`${field.env}\\`)` : ''}: ${field.description}`)\n }\n lines.push('', '## Permissions', '')\n for (const permission of spec.permissions) {\n lines.push(`- \\`${permission.normalized}\\`: ${permission.providerScopes.length ? permission.providerScopes.map((scope) => `\\`${scope}\\``).join(', ') : 'no provider scope'} - ${permission.reason}`)\n }\n lines.push('', '## Console Steps', '')\n for (const [i, step] of steps.entries()) {\n lines.push(`${i + 1}. ${step.title}: ${step.detail}`)\n }\n if (spec.setup.knownQuirks?.length) {\n lines.push('', '## Known Quirks', '')\n for (const quirk of spec.setup.knownQuirks) lines.push(`- ${quirk.severity}: ${quirk.message}`)\n }\n return `${lines.join('\\n')}\\n`\n}\n\nexport function renderAgentToolDescription(spec: IntegrationSpec): string {\n const hints = spec.plannerHints\n const useFor = hints?.useFor?.length ? `Use for ${hints.useFor.join(', ')}.` : `Use for ${spec.title} workflows.`\n const risk = hints ? `Freshness: ${hints.dataFreshness}. Write risk: ${hints.writeRisk}.` : ''\n return `${spec.title} (${spec.kind}). ${useFor} ${risk}`.trim()\n}\n\nexport function buildHealthcheckPlan(spec: IntegrationSpec): HealthcheckPlan {\n const healthcheck = spec.setup.healthcheck ?? { id: `${spec.kind}.static`, level: 'static', description: 'No healthcheck defined.' as const }\n const requires: HealthcheckPlan['requires'] = []\n if (healthcheck.level === 'connection') requires.push('connection_credentials')\n if (healthcheck.level === 'client_config' && spec.auth.mode === 'oauth2') requires.push('client_id', 'client_secret')\n if (spec.auth.mode === 'api_key') requires.push('api_key')\n if (spec.auth.mode === 'hmac') requires.push('hmac_secret')\n return {\n kind: spec.kind,\n healthcheck,\n requires,\n message: healthcheck.description,\n }\n}\n\nfunction renderTemplate(template: string, spec: IntegrationSpec, options: RenderSpecOptions, redirectUri?: string): string {\n return template\n .replaceAll('{host}', options.host)\n .replaceAll('{kind}', spec.kind)\n .replaceAll('{redirectUri}', redirectUri ?? renderRedirectUri(spec, options))\n}\n\nfunction renderRedirectUri(spec: IntegrationSpec, options: RenderSpecOptions): string {\n return (options.callbackPath ?? spec.setup.redirectUriTemplate ?? '')\n .replaceAll('{host}', options.host)\n .replaceAll('{kind}', spec.kind)\n}\n\nexport function consoleStepsToText(steps: ConsoleStep[]): string {\n return steps.map((step, index) => `${index + 1}. ${step.title}: ${step.detail}`).join('\\n')\n}\n","import type {\n CredentialFieldSpec,\n CredentialValidationResult,\n IntegrationSpec,\n IntegrationSpecValidationIssue,\n IntegrationSpecValidationResult,\n} from './types.js'\n\nexport function validateIntegrationSpec(spec: IntegrationSpec): IntegrationSpecValidationResult {\n const issues: IntegrationSpecValidationIssue[] = []\n if (!spec.kind.trim()) issues.push({ path: 'kind', message: 'kind is required' })\n if (!spec.title.trim()) issues.push({ path: 'title', message: 'title is required' })\n if (!spec.actions.length) issues.push({ path: 'actions', message: 'at least one action is required' })\n if (!spec.permissions.length) issues.push({ path: 'permissions', message: 'at least one permission is required' })\n if (spec.auth.mode === 'oauth2') {\n if (!spec.auth.authorizationUrl) issues.push({ path: 'auth.authorizationUrl', message: 'authorizationUrl is required' })\n if (!spec.auth.tokenUrl) issues.push({ path: 'auth.tokenUrl', message: 'tokenUrl is required' })\n if (!spec.auth.redirectUriTemplate) issues.push({ path: 'auth.redirectUriTemplate', message: 'redirectUriTemplate is required' })\n }\n const actionIds = new Set<string>()\n for (const [index, action] of spec.actions.entries()) {\n if (actionIds.has(action.id)) issues.push({ path: `actions[${index}].id`, message: `duplicate action id ${action.id}` })\n actionIds.add(action.id)\n }\n return { ok: issues.length === 0, issues }\n}\n\nexport function assertValidIntegrationSpec(spec: IntegrationSpec): void {\n const result = validateIntegrationSpec(spec)\n if (!result.ok) {\n throw new Error(`Invalid integration spec ${spec.kind}: ${result.issues.map((i) => `${i.path}: ${i.message}`).join('; ')}`)\n }\n}\n\nexport function validateCredentialFormat(field: CredentialFieldSpec, value: string): CredentialValidationResult {\n if (!value.trim()) return { ok: false, field: field.label, message: `${field.label} is required` }\n if (field.regex && !new RegExp(field.regex).test(value)) {\n return { ok: false, field: field.label, message: `${field.label} does not match expected format` }\n }\n return { ok: true, field: field.label }\n}\n\nexport function validateCredentialSet(spec: IntegrationSpec, values: Record<string, string>): CredentialValidationResult[] {\n return spec.setup.credentialFields.map((field) => {\n const key = field.env ?? field.label\n return validateCredentialFormat(field, values[key] ?? '')\n })\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
integrationSpecToConnector,
|
|
7
7
|
listIntegrationSpecs
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BS6LGM3V.js";
|
|
9
9
|
import {
|
|
10
10
|
CONNECTOR_ADAPTER_FACTORIES,
|
|
11
11
|
adapters_exports
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-XEJKVCXB.js";
|
|
13
13
|
|
|
14
14
|
// src/activepieces-catalog.ts
|
|
15
15
|
import { readFileSync } from "fs";
|
|
@@ -4167,9 +4167,17 @@ function toMcpTools(tools) {
|
|
|
4167
4167
|
function scoreTool(tool, terms) {
|
|
4168
4168
|
if (terms.length === 0) return { tool, score: 1, matched: [] };
|
|
4169
4169
|
const haystack = new Set(tool.tags);
|
|
4170
|
+
const identity = new Set(
|
|
4171
|
+
[tool.connectorId, tool.connectorTitle, tool.providerId].flatMap(tokenize)
|
|
4172
|
+
);
|
|
4170
4173
|
const matched = [];
|
|
4171
4174
|
let score = 0;
|
|
4172
4175
|
for (const term of terms) {
|
|
4176
|
+
if (identity.has(term)) {
|
|
4177
|
+
matched.push(term);
|
|
4178
|
+
score += 6;
|
|
4179
|
+
continue;
|
|
4180
|
+
}
|
|
4173
4181
|
if (haystack.has(term)) {
|
|
4174
4182
|
matched.push(term);
|
|
4175
4183
|
score += 4;
|
|
@@ -4339,4 +4347,4 @@ export {
|
|
|
4339
4347
|
signCapability,
|
|
4340
4348
|
verifyCapabilityToken
|
|
4341
4349
|
};
|
|
4342
|
-
//# sourceMappingURL=chunk-
|
|
4350
|
+
//# sourceMappingURL=chunk-DRBW2FXU.js.map
|