@agent-native/core 0.49.24 → 0.49.25
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/provider-api/index.d.ts +6 -0
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +27 -10
- package/dist/provider-api/index.js.map +1 -1
- package/dist/templates/default/.agents/skills/actions/SKILL.md +22 -6
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +7 -1
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +22 -6
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +7 -1
- package/package.json +1 -1
- package/src/templates/default/.agents/skills/actions/SKILL.md +22 -6
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +7 -1
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +22 -6
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +7 -1
|
@@ -137,6 +137,12 @@ export interface ProviderApiRuntimeOptions {
|
|
|
137
137
|
localCredentialSource?: string;
|
|
138
138
|
getCredentialContext?: () => CredentialContext | null;
|
|
139
139
|
resolveCredential?: ProviderApiCredentialResolver;
|
|
140
|
+
/**
|
|
141
|
+
* Template-specific OAuth token provider overrides for built-in provider API
|
|
142
|
+
* configs. Use when an app stores a provider's OAuth grant under a narrower
|
|
143
|
+
* local provider id, e.g. Google Drive scoped to a "google-docs" connection.
|
|
144
|
+
*/
|
|
145
|
+
oauthProviderOverrides?: Record<string, string>;
|
|
140
146
|
/**
|
|
141
147
|
* Optional loader for custom providers registered at runtime. When provided,
|
|
142
148
|
* custom providers are merged with the static built-in registry for catalog,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider-api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider-api/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { resolveCredential, } from "../credentials/index.js";
|
|
3
3
|
import { createSsrfSafeDispatcher, isBlockedExtensionUrlWithDns, } from "../extensions/url-safety.js";
|
|
4
|
-
import { listOAuthAccountsByOwner, saveOAuthTokens, } from "../oauth-tokens/index.js";
|
|
4
|
+
import { deleteOAuthTokens, listOAuthAccountsByOwner, saveOAuthTokens, } from "../oauth-tokens/index.js";
|
|
5
5
|
import { getCredentialContext } from "../server/request-context.js";
|
|
6
6
|
import { resolveWorkspaceConnectionCredentialForApp } from "../workspace-connections/credentials.js";
|
|
7
7
|
export { upsertCustomProvider, deleteCustomProvider, listCustomProviders, getCustomProvider, validateCustomBaseUrl, } from "./custom-registry.js";
|
|
@@ -32,6 +32,11 @@ export const PROVIDER_API_IDS = [
|
|
|
32
32
|
"stripe",
|
|
33
33
|
"twitter",
|
|
34
34
|
];
|
|
35
|
+
const PERMANENT_GOOGLE_OAUTH_REFRESH_ERRORS = new Set([
|
|
36
|
+
"invalid_grant",
|
|
37
|
+
"unauthorized_client",
|
|
38
|
+
"invalid_client",
|
|
39
|
+
]);
|
|
35
40
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
36
41
|
const MAX_TIMEOUT_MS = 120_000;
|
|
37
42
|
const DEFAULT_MAX_BYTES = 1024 * 1024;
|
|
@@ -94,7 +99,7 @@ const PROVIDER_CONFIGS = {
|
|
|
94
99
|
},
|
|
95
100
|
credentialKeys: ["APOLLO_API_KEY"],
|
|
96
101
|
docsUrls: ["https://docs.apollo.io/reference/api-reference"],
|
|
97
|
-
templateUses: ["analytics"],
|
|
102
|
+
templateUses: ["analytics", "calendar"],
|
|
98
103
|
examples: [
|
|
99
104
|
{
|
|
100
105
|
label: "Search people",
|
|
@@ -270,7 +275,7 @@ const PROVIDER_CONFIGS = {
|
|
|
270
275
|
Accept: "application/vnd.github+json",
|
|
271
276
|
"X-GitHub-Api-Version": "2022-11-28",
|
|
272
277
|
},
|
|
273
|
-
templateUses: ["analytics", "brain", "dispatch"],
|
|
278
|
+
templateUses: ["analytics", "brain", "design", "dispatch"],
|
|
274
279
|
examples: [
|
|
275
280
|
{ label: "Authenticated user", method: "GET", path: "/user" },
|
|
276
281
|
{ label: "Search issues", method: "GET", path: "/search/issues" },
|
|
@@ -319,7 +324,7 @@ const PROVIDER_CONFIGS = {
|
|
|
319
324
|
},
|
|
320
325
|
credentialKeys: ["GONG_ACCESS_KEY", "GONG_ACCESS_SECRET", "GONG_API_BASE"],
|
|
321
326
|
docsUrls: ["https://gong.app.gong.io/settings/api/documentation"],
|
|
322
|
-
templateUses: ["analytics"],
|
|
327
|
+
templateUses: ["analytics", "calendar"],
|
|
323
328
|
examples: [
|
|
324
329
|
{ label: "List calls", method: "GET", path: "/calls" },
|
|
325
330
|
{
|
|
@@ -343,7 +348,7 @@ const PROVIDER_CONFIGS = {
|
|
|
343
348
|
docsUrls: ["https://developers.google.com/calendar/api/v3/reference"],
|
|
344
349
|
specUrls: ["https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest"],
|
|
345
350
|
allowedHostSuffixes: ["googleapis.com"],
|
|
346
|
-
templateUses: ["brain", "calendar", "dispatch"],
|
|
351
|
+
templateUses: ["brain", "calendar", "dispatch", "mail"],
|
|
347
352
|
examples: [
|
|
348
353
|
{
|
|
349
354
|
label: "List calendars",
|
|
@@ -426,7 +431,7 @@ const PROVIDER_CONFIGS = {
|
|
|
426
431
|
},
|
|
427
432
|
credentialKeys: ["HUBSPOT_PRIVATE_APP_TOKEN", "HUBSPOT_ACCESS_TOKEN"],
|
|
428
433
|
docsUrls: ["https://developers.hubspot.com/docs/api/overview"],
|
|
429
|
-
templateUses: ["analytics", "brain", "mail", "dispatch"],
|
|
434
|
+
templateUses: ["analytics", "brain", "calendar", "mail", "dispatch"],
|
|
430
435
|
examples: [
|
|
431
436
|
{
|
|
432
437
|
label: "Search deals with any HubSpot CRM filter",
|
|
@@ -585,7 +590,7 @@ const PROVIDER_CONFIGS = {
|
|
|
585
590
|
},
|
|
586
591
|
credentialKeys: ["PYLON_API_KEY"],
|
|
587
592
|
docsUrls: ["https://docs.usepylon.com/pylon-docs/developer/api-reference"],
|
|
588
|
-
templateUses: ["analytics"],
|
|
593
|
+
templateUses: ["analytics", "calendar"],
|
|
589
594
|
examples: [{ label: "List issues", method: "GET", path: "/issues" }],
|
|
590
595
|
},
|
|
591
596
|
sentry: {
|
|
@@ -1394,7 +1399,7 @@ function buildProviderUrl(options) {
|
|
|
1394
1399
|
const rawPath = options.rawPath.trim();
|
|
1395
1400
|
const url = /^https?:\/\//i.test(rawPath)
|
|
1396
1401
|
? new URL(rawPath)
|
|
1397
|
-
: new URL(
|
|
1402
|
+
: new URL(joinProviderUrlPath(base, rawPath), base.origin);
|
|
1398
1403
|
if (!isAllowedProviderUrl(url, base, options.config)) {
|
|
1399
1404
|
throw new Error(`${options.config.label} API requests must stay on the configured provider host or registered provider host suffix.`);
|
|
1400
1405
|
}
|
|
@@ -1403,6 +1408,13 @@ function buildProviderUrl(options) {
|
|
|
1403
1408
|
}
|
|
1404
1409
|
return url;
|
|
1405
1410
|
}
|
|
1411
|
+
function joinProviderUrlPath(base, rawPath) {
|
|
1412
|
+
const basePath = base.pathname.replace(/\/+$/, "");
|
|
1413
|
+
const providerPath = rawPath.replace(/^\/+/, "");
|
|
1414
|
+
if (!providerPath)
|
|
1415
|
+
return basePath || "/";
|
|
1416
|
+
return `${basePath}/${providerPath}`;
|
|
1417
|
+
}
|
|
1406
1418
|
function isAllowedProviderUrl(url, base, config) {
|
|
1407
1419
|
if (url.protocol !== "https:" && url.protocol !== "http:")
|
|
1408
1420
|
return false;
|
|
@@ -1533,8 +1545,9 @@ async function resolveAuth(config, runtime, ctx, args) {
|
|
|
1533
1545
|
};
|
|
1534
1546
|
}
|
|
1535
1547
|
if (auth.type === "oauth-bearer") {
|
|
1548
|
+
const oauthProvider = runtime.oauthProviderOverrides?.[config.id] ?? auth.oauthProvider;
|
|
1536
1549
|
const credential = await resolveOAuthBearerToken({
|
|
1537
|
-
auth,
|
|
1550
|
+
auth: { ...auth, oauthProvider },
|
|
1538
1551
|
ctx,
|
|
1539
1552
|
accountId: args.accountId,
|
|
1540
1553
|
});
|
|
@@ -1733,7 +1746,8 @@ async function getValidOAuthAccessToken(options) {
|
|
|
1733
1746
|
const refreshToken = options.tokens.refresh_token ?? options.tokens.refreshToken;
|
|
1734
1747
|
if (!refreshToken)
|
|
1735
1748
|
return accessToken;
|
|
1736
|
-
if (options.oauthProvider === "google"
|
|
1749
|
+
if (options.oauthProvider === "google" ||
|
|
1750
|
+
options.oauthProvider === "google-docs") {
|
|
1737
1751
|
return refreshGoogleOAuthToken(options, refreshToken);
|
|
1738
1752
|
}
|
|
1739
1753
|
throw new Error(`${options.oauthProvider} OAuth token is expired and automatic refresh is not configured for provider-api.`);
|
|
@@ -1756,6 +1770,9 @@ async function refreshGoogleOAuthToken(options, refreshToken) {
|
|
|
1756
1770
|
});
|
|
1757
1771
|
const data = (await res.json());
|
|
1758
1772
|
if (!res.ok || !data.access_token) {
|
|
1773
|
+
if (data.error && PERMANENT_GOOGLE_OAUTH_REFRESH_ERRORS.has(data.error)) {
|
|
1774
|
+
await deleteOAuthTokens(options.oauthProvider, options.accountId);
|
|
1775
|
+
}
|
|
1759
1776
|
const detail = data.error_description ?? data.error ?? res.statusText;
|
|
1760
1777
|
throw new Error(`Google OAuth refresh failed: ${detail}`);
|
|
1761
1778
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider-api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n resolveCredential,\n type CredentialContext,\n} from \"../credentials/index.js\";\nimport {\n createSsrfSafeDispatcher,\n isBlockedExtensionUrlWithDns,\n} from \"../extensions/url-safety.js\";\nimport {\n listOAuthAccountsByOwner,\n saveOAuthTokens,\n} from \"../oauth-tokens/index.js\";\nimport { getCredentialContext } from \"../server/request-context.js\";\nimport { resolveWorkspaceConnectionCredentialForApp } from \"../workspace-connections/credentials.js\";\nimport type { WorkspaceConnectionTemplateUse } from \"../connections/catalog.js\";\nimport type {\n CustomProviderConfig,\n CustomProviderAuthKind,\n} from \"./custom-registry.js\";\n\nexport type {\n CustomProviderConfig,\n CustomProviderScope,\n CustomProviderAuthKind,\n UpsertCustomProviderArgs,\n} from \"./custom-registry.js\";\nexport {\n upsertCustomProvider,\n deleteCustomProvider,\n listCustomProviders,\n getCustomProvider,\n validateCustomBaseUrl,\n} from \"./custom-registry.js\";\n\nexport const PROVIDER_API_IDS = [\n \"amplitude\",\n \"apollo\",\n \"bigquery\",\n \"commonroom\",\n \"dataforseo\",\n \"ga4\",\n \"gcloud\",\n \"github\",\n \"gmail\",\n \"gong\",\n \"google_calendar\",\n \"google_drive\",\n \"granola\",\n \"grafana\",\n \"hubspot\",\n \"jira\",\n \"mixpanel\",\n \"notion\",\n \"posthog\",\n \"prometheus\",\n \"pylon\",\n \"sentry\",\n \"slack\",\n \"stripe\",\n \"twitter\",\n] as const;\n\nexport type ProviderApiId = (typeof PROVIDER_API_IDS)[number];\n\nexport type ProviderApiMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"HEAD\";\n\n/** Cursor-pagination config for fetchAllPages. */\nexport interface FetchAllPagesConfig {\n /**\n * Dot-path into the JSON response body where the next-page cursor lives,\n * e.g. \"meta.next_cursor\" or \"pagination.next_page_token\".\n */\n cursorPath: string;\n /**\n * Query parameter name to pass the cursor on the next request,\n * e.g. \"cursor\" or \"page_token\".\n */\n cursorParam: string;\n /**\n * Dot-path to the items array in each response body.\n * When omitted, the whole response body is appended to the items array.\n */\n itemsPath?: string;\n /**\n * Maximum number of pages to fetch. Default 10, max 50.\n */\n maxPages?: number;\n}\n\nexport interface ProviderApiRequestArgs {\n provider: ProviderApiId | string;\n method?: ProviderApiMethod;\n path: string;\n query?: unknown;\n headers?: Record<string, unknown>;\n body?: unknown;\n auth?: \"default\" | \"none\";\n timeoutMs?: number;\n maxBytes?: number;\n connectionId?: string | null;\n accountId?: string | null;\n /**\n * When set, write the full response body to this workspace file path instead\n * of returning it in context. Returns a compact summary with status, bytes,\n * path, and a preview. Allows up to 20 MB (vs the normal 4 MB context limit).\n */\n saveToFile?: string;\n /**\n * When set, automatically paginate by cursor until the cursor field is empty\n * or maxPages is reached. Accumulates items from itemsPath (or whole bodies)\n * across all pages. Combine with saveToFile to write the full dataset.\n */\n fetchAllPages?: FetchAllPagesConfig;\n}\n\nexport type ProviderApiAuthKind =\n | { type: \"none\" }\n | {\n type: \"bearer\";\n keys: readonly string[];\n workspaceProvider?: string;\n }\n | {\n type: \"basic\";\n usernameKey: string;\n passwordKey: string;\n workspaceProvider?: string;\n }\n | {\n type: \"basic-raw\";\n key: string;\n workspaceProvider?: string;\n }\n | {\n type: \"api-key-header\";\n key: string;\n header: string;\n workspaceProvider?: string;\n }\n | {\n type: \"google-service-account\";\n scopes: readonly string[];\n }\n | {\n type: \"oauth-bearer\";\n oauthProvider: string;\n tokenLabel: string;\n }\n | {\n type: \"prometheus\";\n };\n\nexport interface ProviderApiConfig {\n id: ProviderApiId;\n label: string;\n defaultBaseUrl: string;\n baseUrlCredentialKey?: string;\n auth: ProviderApiAuthKind;\n credentialKeys: readonly string[];\n docsUrls: readonly string[];\n specUrls?: readonly string[];\n allowedHostSuffixes?: readonly string[];\n defaultHeaders?: Record<string, string>;\n placeholders?: readonly ProviderApiPlaceholder[];\n examples?: readonly ProviderApiExample[];\n notes?: readonly string[];\n templateUses?: readonly WorkspaceConnectionTemplateUse[];\n}\n\nexport interface ProviderApiPlaceholder {\n name: string;\n credentialKey: string;\n label: string;\n}\n\nexport interface ProviderApiExample {\n label: string;\n method: ProviderApiMethod;\n path: string;\n body?: unknown;\n}\n\nexport interface ProviderApiResolvedCredential {\n key: string;\n value: string;\n source: string;\n provider: string;\n connectionId?: string;\n connectionLabel?: string;\n accountId?: string;\n accountLabel?: string | null;\n scope?: string;\n}\n\nexport interface ProviderApiCredentialLookupOptions {\n appId: string;\n provider: string;\n key: string;\n ctx: CredentialContext;\n workspaceProvider?: string;\n connectionId?: string | null;\n localCredentialSource: string;\n}\n\nexport type ProviderApiCredentialResolver = (\n options: ProviderApiCredentialLookupOptions,\n) => Promise<ProviderApiResolvedCredential | null>;\n\nexport interface ProviderApiRuntimeOptions {\n appId: string;\n providerIds?: readonly (ProviderApiId | string)[];\n localCredentialSource?: string;\n getCredentialContext?: () => CredentialContext | null;\n resolveCredential?: ProviderApiCredentialResolver;\n /**\n * Optional loader for custom providers registered at runtime. When provided,\n * custom providers are merged with the static built-in registry for catalog,\n * docs, and request operations. Custom providers cannot shadow built-in ids.\n */\n getCustomProviders?: () => Promise<CustomProviderConfig[]>;\n}\n\ninterface ProviderApiRuntime {\n providerIds: readonly ProviderApiId[];\n listCatalog(\n provider?: ProviderApiId | string,\n ): ReturnType<typeof listProviderApiCatalog> | Promise<unknown[]>;\n fetchDocs(options: {\n provider: ProviderApiId | string;\n url?: string;\n maxBytes?: number;\n }): Promise<unknown>;\n executeRequest(args: ProviderApiRequestArgs): Promise<unknown>;\n}\n\ninterface ResolvedAuth {\n headers: Record<string, string>;\n credentialSources: Array<Omit<ProviderApiResolvedCredential, \"value\">>;\n secretValues: string[];\n}\n\ninterface OAuthTokens {\n access_token?: string;\n accessToken?: string;\n refresh_token?: string;\n refreshToken?: string;\n expiry_date?: number;\n expiresAt?: number;\n expires_in?: number;\n token_type?: string;\n scope?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst DEFAULT_MAX_BYTES = 1024 * 1024;\nconst MAX_MAX_BYTES = 4 * 1024 * 1024;\n/** When saveToFile is used, allow a much larger per-page response since the\n * content won't enter the model's context window. */\nconst SAVE_TO_FILE_MAX_BYTES = 20 * 1024 * 1024; // 20 MB\nconst FETCH_ALL_PAGES_MAX = 50;\nconst HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\nconst BLOCKED_OUTBOUND_HEADERS = new Set([\n \"connection\",\n \"content-length\",\n \"cookie\",\n \"forwarded\",\n \"host\",\n \"keep-alive\",\n \"origin\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"referer\",\n \"set-cookie\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n]);\n\nconst PROVIDER_CONFIGS: Record<ProviderApiId, ProviderApiConfig> = {\n amplitude: {\n id: \"amplitude\",\n label: \"Amplitude\",\n defaultBaseUrl: \"https://amplitude.com/api/2\",\n auth: {\n type: \"basic\",\n usernameKey: \"AMPLITUDE_API_KEY\",\n passwordKey: \"AMPLITUDE_SECRET_KEY\",\n },\n credentialKeys: [\"AMPLITUDE_API_KEY\", \"AMPLITUDE_SECRET_KEY\"],\n docsUrls: [\"https://amplitude.com/docs/apis\"],\n allowedHostSuffixes: [\"amplitude.com\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"Export events\",\n method: \"GET\",\n path: \"/export?start=20260601T00&end=20260602T00\",\n },\n ],\n },\n apollo: {\n id: \"apollo\",\n label: \"Apollo\",\n defaultBaseUrl: \"https://api.apollo.io\",\n auth: {\n type: \"api-key-header\",\n key: \"APOLLO_API_KEY\",\n header: \"x-api-key\",\n },\n credentialKeys: [\"APOLLO_API_KEY\"],\n docsUrls: [\"https://docs.apollo.io/reference/api-reference\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"Search people\",\n method: \"POST\",\n path: \"/api/v1/mixed_people/search\",\n body: { q_keywords: \"vp marketing\", page: 1, per_page: 10 },\n },\n ],\n },\n bigquery: {\n id: \"bigquery\",\n label: \"BigQuery REST API\",\n defaultBaseUrl: \"https://bigquery.googleapis.com/bigquery/v2\",\n auth: {\n type: \"google-service-account\",\n scopes: [\n \"https://www.googleapis.com/auth/cloud-platform\",\n \"https://www.googleapis.com/auth/bigquery\",\n ],\n },\n credentialKeys: [\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"BIGQUERY_PROJECT_ID\",\n ],\n docsUrls: [\"https://cloud.google.com/bigquery/docs/reference/rest\"],\n specUrls: [\"https://bigquery.googleapis.com/$discovery/rest?version=v2\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"BIGQUERY_PROJECT_ID\",\n label: \"Configured BigQuery project ID\",\n },\n ],\n examples: [\n {\n label: \"List datasets\",\n method: \"GET\",\n path: \"/projects/{projectId}/datasets\",\n },\n {\n label: \"Run query\",\n method: \"POST\",\n path: \"/projects/{projectId}/queries\",\n body: { query: \"SELECT 1\", useLegacySql: false },\n },\n ],\n },\n commonroom: {\n id: \"commonroom\",\n label: \"Common Room\",\n defaultBaseUrl: \"https://api.commonroom.io/community/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"COMMONROOM_API_TOKEN\"],\n },\n credentialKeys: [\"COMMONROOM_API_TOKEN\"],\n docsUrls: [\"https://developer.commonroom.io/reference/overview\"],\n templateUses: [\"analytics\"],\n examples: [{ label: \"List members\", method: \"GET\", path: \"/members\" }],\n },\n dataforseo: {\n id: \"dataforseo\",\n label: \"DataForSEO\",\n defaultBaseUrl: \"https://api.dataforseo.com/v3\",\n auth: {\n type: \"basic\",\n usernameKey: \"DATAFORSEO_LOGIN\",\n passwordKey: \"DATAFORSEO_PASSWORD\",\n },\n credentialKeys: [\"DATAFORSEO_LOGIN\", \"DATAFORSEO_PASSWORD\"],\n docsUrls: [\"https://docs.dataforseo.com/v3/\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"SERP task post\",\n method: \"POST\",\n path: \"/serp/google/organic/task_post\",\n body: [\n { keyword: \"builder.io\", location_code: 2840, language_code: \"en\" },\n ],\n },\n ],\n },\n ga4: {\n id: \"ga4\",\n label: \"Google Analytics Data API\",\n defaultBaseUrl: \"https://analyticsdata.googleapis.com/v1beta\",\n auth: {\n type: \"google-service-account\",\n scopes: [\"https://www.googleapis.com/auth/analytics.readonly\"],\n },\n credentialKeys: [\"GOOGLE_APPLICATION_CREDENTIALS_JSON\", \"GA4_PROPERTY_ID\"],\n docsUrls: [\n \"https://developers.google.com/analytics/devguides/reporting/data/v1/rest\",\n ],\n specUrls: [\n \"https://analyticsdata.googleapis.com/$discovery/rest?version=v1beta\",\n ],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"propertyId\",\n credentialKey: \"GA4_PROPERTY_ID\",\n label: \"Configured GA4 property ID\",\n },\n ],\n examples: [\n {\n label: \"Run report\",\n method: \"POST\",\n path: \"/properties/{propertyId}:runReport\",\n body: {\n dateRanges: [{ startDate: \"30daysAgo\", endDate: \"today\" }],\n metrics: [{ name: \"activeUsers\" }],\n },\n },\n ],\n },\n gcloud: {\n id: \"gcloud\",\n label: \"Google Cloud APIs\",\n defaultBaseUrl: \"https://cloudresourcemanager.googleapis.com\",\n auth: {\n type: \"google-service-account\",\n scopes: [\n \"https://www.googleapis.com/auth/cloud-platform\",\n \"https://www.googleapis.com/auth/monitoring.read\",\n \"https://www.googleapis.com/auth/logging.read\",\n \"https://www.googleapis.com/auth/bigquery\",\n ],\n },\n credentialKeys: [\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"BIGQUERY_PROJECT_ID\",\n ],\n docsUrls: [\"https://cloud.google.com/apis/docs/overview\"],\n specUrls: [\"https://www.googleapis.com/discovery/v1/apis\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"BIGQUERY_PROJECT_ID\",\n label: \"Configured Google Cloud project ID\",\n },\n ],\n examples: [\n {\n label: \"Get project\",\n method: \"GET\",\n path: \"https://cloudresourcemanager.googleapis.com/v1/projects/{projectId}\",\n },\n ],\n },\n github: {\n id: \"github\",\n label: \"GitHub REST API\",\n defaultBaseUrl: \"https://api.github.com\",\n auth: {\n type: \"bearer\",\n keys: [\"GITHUB_TOKEN\"],\n workspaceProvider: \"github\",\n },\n credentialKeys: [\"GITHUB_TOKEN\"],\n docsUrls: [\"https://docs.github.com/rest\"],\n specUrls: [\n \"https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json\",\n ],\n defaultHeaders: {\n Accept: \"application/vnd.github+json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n templateUses: [\"analytics\", \"brain\", \"dispatch\"],\n examples: [\n { label: \"Authenticated user\", method: \"GET\", path: \"/user\" },\n { label: \"Search issues\", method: \"GET\", path: \"/search/issues\" },\n ],\n },\n gmail: {\n id: \"gmail\",\n label: \"Gmail API\",\n defaultBaseUrl: \"https://gmail.googleapis.com/gmail/v1\",\n auth: {\n type: \"oauth-bearer\",\n oauthProvider: \"google\",\n tokenLabel: \"Google OAuth token\",\n },\n credentialKeys: [\"GOOGLE_OAUTH_ACCOUNT\"],\n docsUrls: [\"https://developers.google.com/gmail/api/reference/rest\"],\n specUrls: [\"https://gmail.googleapis.com/$discovery/rest?version=v1\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"brain\", \"mail\", \"dispatch\"],\n examples: [\n {\n label: \"List messages\",\n method: \"GET\",\n path: \"/users/me/messages\",\n },\n {\n label: \"Search messages\",\n method: \"GET\",\n path: \"/users/me/messages\",\n body: undefined,\n },\n ],\n notes: [\n \"Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.\",\n ],\n },\n gong: {\n id: \"gong\",\n label: \"Gong\",\n defaultBaseUrl: \"https://api.gong.io/v2\",\n baseUrlCredentialKey: \"GONG_API_BASE\",\n auth: {\n type: \"basic\",\n usernameKey: \"GONG_ACCESS_KEY\",\n passwordKey: \"GONG_ACCESS_SECRET\",\n },\n credentialKeys: [\"GONG_ACCESS_KEY\", \"GONG_ACCESS_SECRET\", \"GONG_API_BASE\"],\n docsUrls: [\"https://gong.app.gong.io/settings/api/documentation\"],\n templateUses: [\"analytics\"],\n examples: [\n { label: \"List calls\", method: \"GET\", path: \"/calls\" },\n {\n label: \"Call transcript\",\n method: \"POST\",\n path: \"/calls/transcript\",\n body: { filter: { callIds: [\"<call-id>\"] } },\n },\n ],\n },\n google_calendar: {\n id: \"google_calendar\",\n label: \"Google Calendar API\",\n defaultBaseUrl: \"https://www.googleapis.com/calendar/v3\",\n auth: {\n type: \"oauth-bearer\",\n oauthProvider: \"google\",\n tokenLabel: \"Google OAuth token\",\n },\n credentialKeys: [\"GOOGLE_OAUTH_ACCOUNT\"],\n docsUrls: [\"https://developers.google.com/calendar/api/v3/reference\"],\n specUrls: [\"https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"brain\", \"calendar\", \"dispatch\"],\n examples: [\n {\n label: \"List calendars\",\n method: \"GET\",\n path: \"/users/me/calendarList\",\n },\n {\n label: \"Search events\",\n method: \"GET\",\n path: \"/calendars/primary/events\",\n },\n ],\n notes: [\n \"Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.\",\n ],\n },\n google_drive: {\n id: \"google_drive\",\n label: \"Google Drive API\",\n defaultBaseUrl: \"https://www.googleapis.com/drive/v3\",\n auth: {\n type: \"oauth-bearer\",\n oauthProvider: \"google\",\n tokenLabel: \"Google OAuth token\",\n },\n credentialKeys: [\"GOOGLE_OAUTH_ACCOUNT\"],\n docsUrls: [\"https://developers.google.com/drive/api/reference/rest/v3\"],\n specUrls: [\"https://www.googleapis.com/discovery/v1/apis/drive/v3/rest\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"brain\", \"content\", \"slides\", \"dispatch\"],\n examples: [\n { label: \"List files\", method: \"GET\", path: \"/files\" },\n { label: \"Get file metadata\", method: \"GET\", path: \"/files/{fileId}\" },\n ],\n notes: [\n \"Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.\",\n ],\n },\n granola: {\n id: \"granola\",\n label: \"Granola Public API\",\n defaultBaseUrl: \"https://public-api.granola.ai/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"GRANOLA_API_KEY\"],\n workspaceProvider: \"granola\",\n },\n credentialKeys: [\"GRANOLA_API_KEY\"],\n docsUrls: [\"https://docs.granola.ai/\"],\n templateUses: [\"brain\", \"dispatch\"],\n examples: [\n { label: \"List notes\", method: \"GET\", path: \"/notes\" },\n { label: \"Get note\", method: \"GET\", path: \"/notes/<note-id>\" },\n ],\n },\n grafana: {\n id: \"grafana\",\n label: \"Grafana\",\n defaultBaseUrl: \"https://grafana.example.com\",\n baseUrlCredentialKey: \"GRAFANA_URL\",\n auth: {\n type: \"bearer\",\n keys: [\"GRAFANA_API_TOKEN\"],\n },\n credentialKeys: [\"GRAFANA_URL\", \"GRAFANA_API_TOKEN\"],\n docsUrls: [\"https://grafana.com/docs/grafana/latest/developers/http_api/\"],\n templateUses: [\"analytics\"],\n examples: [\n { label: \"List dashboards\", method: \"GET\", path: \"/api/search\" },\n ],\n },\n hubspot: {\n id: \"hubspot\",\n label: \"HubSpot\",\n defaultBaseUrl: \"https://api.hubapi.com\",\n auth: {\n type: \"bearer\",\n keys: [\"HUBSPOT_PRIVATE_APP_TOKEN\", \"HUBSPOT_ACCESS_TOKEN\"],\n workspaceProvider: \"hubspot\",\n },\n credentialKeys: [\"HUBSPOT_PRIVATE_APP_TOKEN\", \"HUBSPOT_ACCESS_TOKEN\"],\n docsUrls: [\"https://developers.hubspot.com/docs/api/overview\"],\n templateUses: [\"analytics\", \"brain\", \"mail\", \"dispatch\"],\n examples: [\n {\n label: \"Search deals with any HubSpot CRM filter\",\n method: \"POST\",\n path: \"/crm/v3/objects/deals/search\",\n body: {\n filterGroups: [\n {\n filters: [\n {\n propertyName: \"products\",\n operator: \"CONTAINS_TOKEN\",\n value: \"Publish\",\n },\n ],\n },\n ],\n properties: [\"dealname\", \"products\", \"dealstage\", \"closedate\"],\n limit: 100,\n },\n },\n {\n label: \"List deal property metadata\",\n method: \"GET\",\n path: \"/crm/v3/properties/deals\",\n },\n ],\n },\n jira: {\n id: \"jira\",\n label: \"Jira Cloud\",\n defaultBaseUrl: \"https://example.atlassian.net\",\n baseUrlCredentialKey: \"JIRA_BASE_URL\",\n auth: {\n type: \"basic\",\n usernameKey: \"JIRA_USER_EMAIL\",\n passwordKey: \"JIRA_API_TOKEN\",\n },\n credentialKeys: [\"JIRA_BASE_URL\", \"JIRA_USER_EMAIL\", \"JIRA_API_TOKEN\"],\n docsUrls: [\n \"https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/\",\n ],\n specUrls: [\n \"https://dac-static.atlassian.com/cloud/jira/platform/swagger-v3.v3.json\",\n ],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"JQL search\",\n method: \"GET\",\n path: \"/rest/api/3/search/jql\",\n },\n ],\n },\n mixpanel: {\n id: \"mixpanel\",\n label: \"Mixpanel\",\n defaultBaseUrl: \"https://mixpanel.com/api/query\",\n auth: {\n type: \"basic-raw\",\n key: \"MIXPANEL_SERVICE_ACCOUNT\",\n },\n credentialKeys: [\"MIXPANEL_PROJECT_ID\", \"MIXPANEL_SERVICE_ACCOUNT\"],\n docsUrls: [\"https://developer.mixpanel.com/reference/overview\"],\n allowedHostSuffixes: [\"mixpanel.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"MIXPANEL_PROJECT_ID\",\n label: \"Configured Mixpanel project ID\",\n },\n ],\n examples: [\n {\n label: \"Query events\",\n method: \"GET\",\n path: \"/events\",\n },\n ],\n notes: [\n \"Mixpanel uses multiple API hosts. You may pass full URLs for mixpanel.com or data.mixpanel.com endpoints.\",\n ],\n },\n notion: {\n id: \"notion\",\n label: \"Notion\",\n defaultBaseUrl: \"https://api.notion.com/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"NOTION_API_KEY\"],\n workspaceProvider: \"notion\",\n },\n credentialKeys: [\"NOTION_API_KEY\"],\n docsUrls: [\"https://developers.notion.com/reference/intro\"],\n defaultHeaders: { \"Notion-Version\": \"2022-06-28\" },\n templateUses: [\"analytics\", \"brain\", \"content\", \"dispatch\"],\n examples: [{ label: \"Search\", method: \"POST\", path: \"/search\", body: {} }],\n },\n posthog: {\n id: \"posthog\",\n label: \"PostHog\",\n defaultBaseUrl: \"https://app.posthog.com\",\n baseUrlCredentialKey: \"POSTHOG_HOST\",\n auth: {\n type: \"bearer\",\n keys: [\"POSTHOG_API_KEY\"],\n },\n credentialKeys: [\"POSTHOG_API_KEY\", \"POSTHOG_PROJECT_ID\", \"POSTHOG_HOST\"],\n docsUrls: [\"https://posthog.com/docs/api\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"POSTHOG_PROJECT_ID\",\n label: \"Configured PostHog project ID\",\n },\n ],\n examples: [\n {\n label: \"List events\",\n method: \"GET\",\n path: \"/api/projects/{projectId}/events/\",\n },\n ],\n },\n prometheus: {\n id: \"prometheus\",\n label: \"Prometheus\",\n defaultBaseUrl: \"https://prometheus.example.com\",\n baseUrlCredentialKey: \"PROMETHEUS_URL\",\n auth: { type: \"prometheus\" },\n credentialKeys: [\n \"PROMETHEUS_URL\",\n \"PROMETHEUS_USERNAME\",\n \"PROMETHEUS_PASSWORD\",\n \"PROMETHEUS_BEARER_TOKEN\",\n ],\n docsUrls: [\"https://prometheus.io/docs/prometheus/latest/querying/api/\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"Instant query\",\n method: \"GET\",\n path: \"/api/v1/query\",\n },\n ],\n },\n pylon: {\n id: \"pylon\",\n label: \"Pylon\",\n defaultBaseUrl: \"https://api.usepylon.com\",\n auth: {\n type: \"bearer\",\n keys: [\"PYLON_API_KEY\"],\n },\n credentialKeys: [\"PYLON_API_KEY\"],\n docsUrls: [\"https://docs.usepylon.com/pylon-docs/developer/api-reference\"],\n templateUses: [\"analytics\"],\n examples: [{ label: \"List issues\", method: \"GET\", path: \"/issues\" }],\n },\n sentry: {\n id: \"sentry\",\n label: \"Sentry\",\n defaultBaseUrl: \"https://sentry.io/api/0\",\n auth: {\n type: \"bearer\",\n keys: [\"SENTRY_AUTH_TOKEN\", \"SENTRY_SERVER_TOKEN\"],\n },\n credentialKeys: [\n \"SENTRY_AUTH_TOKEN\",\n \"SENTRY_SERVER_TOKEN\",\n \"SENTRY_ORG_SLUG\",\n ],\n docsUrls: [\"https://docs.sentry.io/api/\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"orgSlug\",\n credentialKey: \"SENTRY_ORG_SLUG\",\n label: \"Configured Sentry organization slug\",\n },\n ],\n examples: [\n {\n label: \"List issues for org\",\n method: \"GET\",\n path: \"/organizations/{orgSlug}/issues/\",\n },\n ],\n },\n slack: {\n id: \"slack\",\n label: \"Slack Web API\",\n defaultBaseUrl: \"https://slack.com/api\",\n auth: {\n type: \"bearer\",\n keys: [\"SLACK_BOT_TOKEN\"],\n workspaceProvider: \"slack\",\n },\n credentialKeys: [\"SLACK_BOT_TOKEN\", \"SLACK_BOT_TOKEN_2\"],\n docsUrls: [\"https://api.slack.com/web\"],\n specUrls: [\n \"https://api.slack.com/specs/openapi/v2/slack_web_openapi_v2_without_examples.json\",\n ],\n templateUses: [\"analytics\", \"brain\", \"dispatch\"],\n examples: [\n { label: \"Search messages\", method: \"GET\", path: \"/search.messages\" },\n { label: \"Post message\", method: \"POST\", path: \"/chat.postMessage\" },\n ],\n },\n stripe: {\n id: \"stripe\",\n label: \"Stripe\",\n defaultBaseUrl: \"https://api.stripe.com/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"STRIPE_SECRET_KEY\"],\n },\n credentialKeys: [\"STRIPE_SECRET_KEY\"],\n docsUrls: [\"https://docs.stripe.com/api\"],\n specUrls: [\n \"https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json\",\n ],\n templateUses: [\"analytics\"],\n examples: [{ label: \"List customers\", method: \"GET\", path: \"/customers\" }],\n },\n twitter: {\n id: \"twitter\",\n label: \"Twitter/X via twitterapi.io\",\n defaultBaseUrl: \"https://api.twitterapi.io\",\n auth: {\n type: \"api-key-header\",\n key: \"TWITTER_BEARER_TOKEN\",\n header: \"X-API-Key\",\n },\n credentialKeys: [\"TWITTER_BEARER_TOKEN\"],\n docsUrls: [\"https://twitterapi.io/docs\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"User tweets\",\n method: \"GET\",\n path: \"/twitter/user/last_tweets\",\n },\n ],\n },\n};\n\nexport function getProviderApiConfig(\n provider: ProviderApiId | string,\n): ProviderApiConfig {\n const config = PROVIDER_CONFIGS[provider as ProviderApiId];\n if (!config) throw new Error(`Unsupported provider API: ${provider}`);\n return config;\n}\n\nexport function isProviderApiId(provider: string): provider is ProviderApiId {\n return Object.prototype.hasOwnProperty.call(PROVIDER_CONFIGS, provider);\n}\n\nexport function listProviderApiIdsForTemplateUse(\n templateUse: WorkspaceConnectionTemplateUse,\n): ProviderApiId[] {\n return PROVIDER_API_IDS.filter((id) =>\n (PROVIDER_CONFIGS[id].templateUses ?? []).includes(templateUse),\n );\n}\n\nexport function listProviderApiCatalog(\n provider?: ProviderApiId | string,\n options: { providerIds?: readonly (ProviderApiId | string)[] } = {},\n) {\n const providerIds = normalizeProviderIds(options.providerIds);\n if (provider) {\n assertProviderAllowed(provider, providerIds);\n }\n const configs = provider\n ? [getProviderApiConfig(provider)]\n : providerIds.map((id) => getProviderApiConfig(id));\n return configs.map((config) => ({\n id: config.id,\n label: config.label,\n defaultBaseUrl: config.defaultBaseUrl,\n baseUrlCredentialKey: config.baseUrlCredentialKey ?? null,\n auth: describeAuth(config.auth),\n credentialKeys: config.credentialKeys,\n docsUrls: config.docsUrls,\n specUrls: config.specUrls ?? [],\n allowedHostSuffixes: config.allowedHostSuffixes ?? [],\n placeholders: config.placeholders ?? [],\n defaultHeaders: config.defaultHeaders ?? {},\n examples: config.examples ?? [],\n notes: config.notes ?? [],\n templateUses: config.templateUses ?? [],\n }));\n}\n\nexport function createProviderApiRuntime(\n options: ProviderApiRuntimeOptions,\n): ProviderApiRuntime {\n const providerIds = normalizeProviderIds(options.providerIds);\n const runtimeOptions: Required<\n Pick<ProviderApiRuntimeOptions, \"appId\" | \"localCredentialSource\">\n > &\n Omit<ProviderApiRuntimeOptions, \"appId\" | \"localCredentialSource\"> = {\n ...options,\n providerIds,\n localCredentialSource: options.localCredentialSource ?? \"app_local\",\n };\n return {\n providerIds,\n listCatalog: (provider) =>\n listProviderApiCatalogWithCustom(\n provider,\n { providerIds },\n runtimeOptions,\n ),\n fetchDocs: (docsOptions) =>\n fetchProviderApiDocs(docsOptions, runtimeOptions),\n executeRequest: (args) => executeProviderApiRequest(args, runtimeOptions),\n };\n}\n\nexport async function fetchProviderApiDocs(\n options: {\n provider: ProviderApiId | string;\n url?: string;\n maxBytes?: number;\n },\n runtime: ProviderApiRuntimeOptions = { appId: \"app\" },\n) {\n await assertProviderAllowedAsync(options.provider, runtime);\n\n // Resolve config — may be a built-in or a custom provider.\n const builtIn = isProviderApiId(options.provider)\n ? getProviderApiConfig(options.provider)\n : null;\n const customConfig = builtIn\n ? null\n : await resolveCustomProvider(options.provider, runtime);\n\n if (!builtIn && !customConfig) {\n const known = await listAllProviderIds(runtime);\n throw new Error(\n `Unknown provider \"${options.provider}\". Known providers: ${known.join(\", \")}`,\n );\n }\n\n const catalog = builtIn\n ? listProviderApiCatalog(options.provider)[0]\n : customProviderToCatalogEntry(customConfig!);\n\n if (!options.url) {\n return {\n provider: options.provider,\n catalog,\n guidance:\n \"provider-api-docs can fetch ANY public http(s) URL — pass url to retrieve API documentation, OpenAPI specs, changelogs, or any public web page. Registered docsUrls above are curated starting points.\",\n };\n }\n\n // Open docs fetching: allow ANY public https/http URL.\n // The SSRF guard still applies — private/internal addresses are blocked.\n let url: URL;\n try {\n url = new URL(options.url);\n } catch {\n throw new Error(`Invalid docs URL: ${options.url}`);\n }\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new Error(`Docs URL must use https: or http: (got ${url.protocol})`);\n }\n if (await isBlockedExtensionUrlWithDns(url.href)) {\n throw new Error(`Blocked private/internal docs URL: ${url.href}`);\n }\n\n const response = await fetchWithTimeout(url.href, {\n method: \"GET\",\n maxBytes: clampMaxBytes(options.maxBytes),\n });\n return {\n provider: options.provider,\n catalog,\n request: { url: url.href },\n response,\n };\n}\n\nexport async function executeProviderApiRequest(\n args: ProviderApiRequestArgs,\n runtime: ProviderApiRuntimeOptions,\n) {\n await assertProviderAllowedAsync(args.provider, runtime);\n\n // Check whether this is a built-in or custom provider.\n const builtIn = isProviderApiId(args.provider)\n ? getProviderApiConfig(args.provider)\n : null;\n const customConfig = builtIn\n ? null\n : await resolveCustomProvider(args.provider, runtime);\n\n if (!builtIn && !customConfig) {\n const known = await listAllProviderIds(runtime);\n throw new Error(\n `Unknown provider \"${args.provider}\". Known providers: ${known.join(\", \")}`,\n );\n }\n\n if (customConfig) {\n return executeCustomProviderApiRequest(args, customConfig, runtime);\n }\n\n // --- built-in provider path (original code) ---\n const config = builtIn!;\n const ctx = requireRuntimeCredentialContext(\n runtime,\n config.credentialKeys[0] ?? config.id,\n );\n const baseUrl = await resolveBaseUrl(config, runtime, ctx, args);\n const placeholders = await resolvePlaceholders(config, runtime, ctx, args);\n const method = normalizeMethod(args.method);\n const url = buildProviderUrl({\n config,\n baseUrl,\n rawPath: substituteString(args.path, placeholders),\n query: substituteUnknown(args.query, placeholders),\n });\n if (await isBlockedExtensionUrlWithDns(url.href)) {\n throw new Error(`Blocked private/internal provider URL: ${url.href}`);\n }\n\n const auth =\n args.auth === \"none\"\n ? emptyAuth()\n : await resolveAuth(config, runtime, ctx, args);\n const extraHeaders = substituteUnknown(args.headers ?? {}, placeholders);\n const headers = sanitizeOutboundHeaders({\n ...(config.defaultHeaders ?? {}),\n ...(isPlainRecord(extraHeaders) ? extraHeaders : {}),\n ...auth.headers,\n });\n\n // Allow a much larger maxBytes ceiling when writing to a workspace file.\n const effectiveMaxBytes = args.saveToFile\n ? SAVE_TO_FILE_MAX_BYTES\n : clampMaxBytes(args.maxBytes);\n\n // --- fetchAllPages mode ---\n if (args.fetchAllPages) {\n const pageCfg = args.fetchAllPages;\n const { items, pageCount, lastStatus, lastContentType } =\n await fetchAllPages(pageCfg, async (extraQuery) => {\n const queryWithCursor = extraQuery\n ? mergeQueryObjects(\n substituteUnknown(args.query, placeholders),\n extraQuery,\n )\n : substituteUnknown(args.query, placeholders);\n const pageUrl = buildProviderUrl({\n config,\n baseUrl,\n rawPath: substituteString(args.path, placeholders),\n query: queryWithCursor,\n });\n const pageBody = prepareBody(\n substituteUnknown(args.body, placeholders),\n { ...headers },\n );\n const resp = await fetchWithTimeout(pageUrl.href, {\n method,\n headers,\n body: pageBody,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n return {\n text:\n resp.text ??\n (resp.json !== undefined ? JSON.stringify(resp.json) : \"\"),\n contentType: resp.contentType,\n status: resp.status,\n ok: resp.ok,\n };\n });\n\n const allItemsJson = JSON.stringify(items, null, 2);\n const metadata = {\n provider: { id: config.id, label: config.label },\n pagesRead: pageCount,\n totalItems: Array.isArray(items) ? items.length : 0,\n lastStatus,\n };\n\n if (args.saveToFile) {\n const saved = (await handleSaveToFile(\n args.saveToFile,\n allItemsJson,\n lastContentType ?? \"application/json\",\n lastStatus,\n )) as Record<string, unknown>;\n return { ...metadata, ...saved };\n }\n\n return { ...metadata, items };\n }\n\n // --- Single request ---\n const body = prepareBody(substituteUnknown(args.body, placeholders), headers);\n const response = await fetchWithTimeout(url.href, {\n method,\n headers,\n body,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n\n // saveToFile: write full body to workspace file and return compact summary.\n if (args.saveToFile) {\n const rawText =\n response.text ??\n (response.json !== undefined ? JSON.stringify(response.json) : \"\");\n const saved = (await handleSaveToFile(\n args.saveToFile,\n rawText,\n response.contentType,\n response.status,\n )) as Record<string, unknown>;\n return {\n provider: { id: config.id, label: config.label },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n },\n ...saved,\n };\n }\n\n return {\n provider: {\n id: config.id,\n label: config.label,\n docsUrls: config.docsUrls,\n specUrls: config.specUrls ?? [],\n },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n auth: args.auth === \"none\" ? \"none\" : describeAuth(config.auth),\n credentialSources: auth.credentialSources.map((source) => ({\n ...source,\n fingerprint: fingerprint(source.key),\n })),\n headerNames: Object.keys(headers).filter(\n (name) => name.toLowerCase() !== \"authorization\",\n ),\n ...(args.accountId ? { accountId: args.accountId } : {}),\n ...(args.connectionId ? { connectionId: args.connectionId } : {}),\n },\n response,\n guidance:\n \"This was a raw provider API request. Use provider docs/spec URLs to choose endpoints and include method/path/status plus relevant filters in the methodology. Prefer this escape hatch whenever canned actions are too narrow.\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Custom provider execution\n// ---------------------------------------------------------------------------\n\nasync function executeCustomProviderApiRequest(\n args: ProviderApiRequestArgs,\n customConfig: CustomProviderConfig,\n runtime: ProviderApiRuntimeOptions,\n): Promise<unknown> {\n const ctx = requireRuntimeCredentialContext(runtime, customConfig.id);\n const method = normalizeMethod(args.method);\n const baseUrl = customConfig.baseUrl;\n\n // Build a lightweight ProviderApiConfig-like object so we can reuse\n // buildProviderUrl (which validates allowed hosts).\n const syntheticConfig: ProviderApiConfig = {\n id: customConfig.id as ProviderApiId,\n label: customConfig.label,\n defaultBaseUrl: baseUrl,\n auth: { type: \"none\" },\n credentialKeys: [],\n docsUrls: customConfig.docsUrls,\n allowedHostSuffixes: customConfig.allowedHostSuffixes,\n defaultHeaders: customConfig.defaultHeaders,\n };\n\n const url = buildProviderUrl({\n config: syntheticConfig,\n baseUrl,\n rawPath: args.path,\n query: args.query,\n });\n\n if (await isBlockedExtensionUrlWithDns(url.href)) {\n throw new Error(`Blocked private/internal provider URL: ${url.href}`);\n }\n\n const auth =\n args.auth === \"none\"\n ? emptyAuth()\n : await resolveCustomAuth(customConfig, runtime, ctx, args);\n\n const extraHeaders = args.headers ?? {};\n const headers = sanitizeOutboundHeaders({\n ...(customConfig.defaultHeaders ?? {}),\n ...(isPlainRecord(extraHeaders) ? extraHeaders : {}),\n ...auth.headers,\n });\n const body = prepareBody(args.body, headers);\n\n const effectiveMaxBytes = args.saveToFile\n ? SAVE_TO_FILE_MAX_BYTES\n : clampMaxBytes(args.maxBytes);\n\n // --- fetchAllPages mode (same cursor pagination as built-in providers) ---\n if (args.fetchAllPages) {\n const pageCfg = args.fetchAllPages;\n const { items, pageCount, lastStatus, lastContentType } =\n await fetchAllPages(pageCfg, async (extraQuery) => {\n const queryWithCursor = extraQuery\n ? mergeQueryObjects(args.query, extraQuery)\n : args.query;\n const pageUrl = buildProviderUrl({\n config: syntheticConfig,\n baseUrl,\n rawPath: args.path,\n query: queryWithCursor,\n });\n const pageBody = prepareBody(args.body, { ...headers });\n const resp = await fetchWithTimeout(pageUrl.href, {\n method,\n headers,\n body: pageBody,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n return {\n text:\n resp.text ??\n (resp.json !== undefined ? JSON.stringify(resp.json) : \"\"),\n contentType: resp.contentType,\n status: resp.status,\n ok: resp.ok,\n };\n });\n\n const allItemsJson = JSON.stringify(items, null, 2);\n const metadata = {\n provider: {\n id: customConfig.id,\n label: customConfig.label,\n custom: true,\n },\n pagesRead: pageCount,\n totalItems: Array.isArray(items) ? items.length : 0,\n lastStatus,\n };\n\n if (args.saveToFile) {\n const saved = (await handleSaveToFile(\n args.saveToFile,\n allItemsJson,\n lastContentType ?? \"application/json\",\n lastStatus,\n )) as Record<string, unknown>;\n return { ...metadata, ...saved };\n }\n\n return { ...metadata, items };\n }\n\n const response = await fetchWithTimeout(url.href, {\n method,\n headers,\n body,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n\n if (args.saveToFile) {\n const rawText =\n response.text ??\n (response.json !== undefined ? JSON.stringify(response.json) : \"\");\n const saved = (await handleSaveToFile(\n args.saveToFile,\n rawText,\n response.contentType,\n response.status,\n )) as Record<string, unknown>;\n return {\n provider: {\n id: customConfig.id,\n label: customConfig.label,\n custom: true,\n },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n },\n ...saved,\n };\n }\n\n return {\n provider: {\n id: customConfig.id,\n label: customConfig.label,\n docsUrls: customConfig.docsUrls,\n specUrls: [],\n custom: true,\n },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n auth:\n args.auth === \"none\" ? \"none\" : describeCustomAuth(customConfig.auth),\n credentialSources: auth.credentialSources.map((source) => ({\n ...source,\n fingerprint: fingerprint(source.key),\n })),\n headerNames: Object.keys(headers).filter(\n (name) => name.toLowerCase() !== \"authorization\",\n ),\n },\n response,\n guidance:\n \"This was a raw provider API request to a custom provider. Use provider docs URLs to choose endpoints.\",\n };\n}\n\nasync function resolveCustomAuth(\n customConfig: CustomProviderConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<ResolvedAuth> {\n const auth = customConfig.auth;\n if (auth.type === \"none\") return emptyAuth();\n\n if (auth.type === \"bearer\") {\n const credential = await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.credentialKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { Authorization: `Bearer ${credential.value}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n\n if (auth.type === \"basic\") {\n const username = await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.usernameKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const password =\n auth.passwordKey === auth.usernameKey\n ? username\n : await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.passwordKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const encoded = Buffer.from(`${username.value}:${password.value}`).toString(\n \"base64\",\n );\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [\n omitCredentialValue(username),\n ...(password.key === username.key\n ? []\n : [omitCredentialValue(password)]),\n ],\n secretValues: [username.value, password.value, encoded],\n };\n }\n\n if (auth.type === \"api-key-header\") {\n const credential = await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.credentialKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { [auth.headerName]: credential.value },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n\n return emptyAuth();\n}\n\n/** Resolve a credential by key name (no workspace-provider lookup for custom). */\nasync function resolveRequiredCredentialByKey(options: {\n provider: string;\n key: string;\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n const localCredentialSource =\n options.runtime.localCredentialSource ?? \"app_local\";\n const lookup: ProviderApiCredentialLookupOptions = {\n appId: options.runtime.appId,\n provider: options.provider,\n key: options.key,\n ctx: options.ctx,\n workspaceProvider: undefined,\n connectionId: options.connectionId,\n localCredentialSource,\n };\n const resolver =\n options.runtime.resolveCredential ?? defaultProviderApiCredentialResolver;\n const credential = await resolver(lookup);\n if (!credential?.value) {\n throw new Error(\n `Credential \"${options.key}\" not configured for custom provider \"${options.provider}\".`,\n );\n }\n return credential;\n}\n\nfunction describeCustomAuth(auth: CustomProviderAuthKind): string {\n if (auth.type === \"none\") return \"none\";\n if (auth.type === \"bearer\") return \"bearer\";\n if (auth.type === \"basic\") return \"basic\";\n if (auth.type === \"api-key-header\")\n return `api-key-header:${auth.headerName}`;\n return \"unknown\";\n}\n\n// ---------------------------------------------------------------------------\n// Catalog helpers with custom provider support\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a custom provider to the same catalog shape as built-in providers.\n */\nfunction customProviderToCatalogEntry(config: CustomProviderConfig) {\n return {\n id: config.id,\n label: config.label,\n defaultBaseUrl: config.baseUrl,\n baseUrlCredentialKey: null,\n auth: describeCustomAuth(config.auth),\n credentialKeys: extractCredentialKeysFromCustomAuth(config.auth),\n docsUrls: config.docsUrls,\n specUrls: [] as string[],\n allowedHostSuffixes: config.allowedHostSuffixes,\n placeholders: [] as unknown[],\n defaultHeaders: config.defaultHeaders,\n examples: [] as unknown[],\n notes: config.notes ? [config.notes] : ([] as string[]),\n templateUses: [] as string[],\n custom: true,\n };\n}\n\nfunction extractCredentialKeysFromCustomAuth(\n auth: CustomProviderAuthKind,\n): string[] {\n if (auth.type === \"bearer\") return [auth.credentialKey];\n if (auth.type === \"basic\") {\n return auth.usernameKey === auth.passwordKey\n ? [auth.usernameKey]\n : [auth.usernameKey, auth.passwordKey];\n }\n if (auth.type === \"api-key-header\") return [auth.credentialKey];\n return [];\n}\n\n/**\n * List catalog entries including custom providers (merged after built-ins).\n */\nasync function listProviderApiCatalogWithCustom(\n provider: ProviderApiId | string | undefined,\n options: { providerIds?: readonly (ProviderApiId | string)[] },\n runtime: ProviderApiRuntimeOptions,\n): Promise<unknown[]> {\n const customConfigs = runtime.getCustomProviders\n ? await runtime.getCustomProviders()\n : [];\n\n if (provider) {\n // Check built-ins first\n if (isProviderApiId(provider)) {\n return listProviderApiCatalog(provider, options) as unknown[];\n }\n // Check custom\n const custom = customConfigs.find((c) => c.id === provider);\n if (custom) return [customProviderToCatalogEntry(custom)];\n const known = [\n ...normalizeProviderIds(options.providerIds),\n ...customConfigs.map((c) => c.id),\n ];\n throw new Error(\n `Unknown provider \"${provider}\". Known providers: ${known.join(\", \")}`,\n );\n }\n\n const builtInEntries = listProviderApiCatalog(\n undefined,\n options,\n ) as unknown[];\n const builtInIds = new Set(\n (options.providerIds ?? PROVIDER_API_IDS).map(String),\n );\n const customEntries = customConfigs\n .filter((c) => !builtInIds.has(c.id))\n .map(customProviderToCatalogEntry);\n return [...builtInEntries, ...customEntries];\n}\n\n/**\n * Look up a custom provider by id from the runtime loader.\n */\nasync function resolveCustomProvider(\n id: string,\n runtime: ProviderApiRuntimeOptions,\n): Promise<CustomProviderConfig | null> {\n if (!runtime.getCustomProviders) return null;\n const configs = await runtime.getCustomProviders();\n return configs.find((c) => c.id === id) ?? null;\n}\n\n/**\n * List all provider ids (built-in + custom) visible to this runtime.\n */\nasync function listAllProviderIds(\n runtime: ProviderApiRuntimeOptions,\n): Promise<string[]> {\n const builtIn = normalizeProviderIds(runtime.providerIds).map(String);\n if (!runtime.getCustomProviders) return builtIn;\n const custom = await runtime.getCustomProviders();\n return [...builtIn, ...custom.map((c) => c.id)];\n}\n\n/**\n * Assert that a provider is either a known built-in or a registered custom\n * provider. Throws with a descriptive message listing known providers.\n */\nasync function assertProviderAllowedAsync(\n provider: string,\n runtime: ProviderApiRuntimeOptions,\n): Promise<void> {\n // Built-in check (fast path)\n if (isProviderApiId(provider)) {\n // Still check the providerIds whitelist if set\n const allowed = normalizeProviderIds(runtime.providerIds);\n if (!allowed.includes(provider as ProviderApiId)) {\n throw new Error(`Provider API ${provider} is not enabled for this app.`);\n }\n return;\n }\n // Custom provider check\n const custom = await resolveCustomProvider(provider, runtime);\n if (custom) return;\n const known = await listAllProviderIds(runtime);\n throw new Error(\n `Unknown provider \"${provider}\". Known providers: ${known.join(\", \")}`,\n );\n}\n\nexport async function defaultProviderApiCredentialResolver(\n options: ProviderApiCredentialLookupOptions,\n): Promise<ProviderApiResolvedCredential | null> {\n if (options.workspaceProvider) {\n const result = await resolveWorkspaceConnectionCredentialForApp({\n appId: options.appId,\n provider: options.workspaceProvider,\n key: options.key,\n connectionId: options.connectionId,\n userEmail: options.ctx.userEmail,\n orgId: options.ctx.orgId,\n });\n if (result.available && result.value) {\n return {\n key: result.provenance?.resolvedKey ?? result.key,\n value: result.value,\n source: \"workspace_connection\",\n provider: result.provider,\n connectionId: result.provenance?.connectionId,\n connectionLabel: result.provenance?.connectionLabel,\n scope:\n typeof result.provenance?.secretScope === \"string\"\n ? result.provenance.secretScope\n : undefined,\n };\n }\n }\n\n const value = await resolveCredential(options.key, options.ctx);\n if (!value) return null;\n return {\n key: options.key,\n value,\n source: options.localCredentialSource,\n provider: options.provider,\n };\n}\n\nfunction normalizeProviderIds(\n providerIds?: readonly (ProviderApiId | string)[],\n): ProviderApiId[] {\n if (!providerIds) return [...PROVIDER_API_IDS];\n const result: ProviderApiId[] = [];\n const seen = new Set<string>();\n for (const providerId of providerIds) {\n if (!isProviderApiId(providerId)) {\n throw new Error(`Unsupported provider API: ${providerId}`);\n }\n if (seen.has(providerId)) continue;\n seen.add(providerId);\n result.push(providerId);\n }\n return result;\n}\n\nfunction assertProviderAllowed(\n provider: ProviderApiId | string,\n providerIds?: readonly (ProviderApiId | string)[],\n) {\n const allowed = normalizeProviderIds(providerIds);\n if (!allowed.includes(provider as ProviderApiId)) {\n throw new Error(`Provider API ${provider} is not enabled for this app.`);\n }\n}\n\nfunction describeAuth(auth: ProviderApiAuthKind): string {\n if (auth.type === \"none\") return \"none\";\n if (auth.type === \"bearer\") return \"bearer\";\n if (auth.type === \"basic\") return \"basic\";\n if (auth.type === \"basic-raw\") return \"basic\";\n if (auth.type === \"api-key-header\") return `api-key-header:${auth.header}`;\n if (auth.type === \"google-service-account\") return \"google-service-account\";\n if (auth.type === \"oauth-bearer\") return `oauth-bearer:${auth.oauthProvider}`;\n return \"prometheus-basic-or-bearer\";\n}\n\nfunction requireRuntimeCredentialContext(\n runtime: ProviderApiRuntimeOptions,\n credentialKey: string,\n): CredentialContext {\n const ctx = runtime.getCredentialContext?.() ?? getCredentialContext();\n if (!ctx) {\n throw new Error(\n `Cannot resolve credential \"${credentialKey}\" outside an authenticated request context.`,\n );\n }\n return ctx;\n}\n\nasync function resolveBaseUrl(\n config: ProviderApiConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<string> {\n if (!config.baseUrlCredentialKey) return config.defaultBaseUrl;\n const configured = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: config.baseUrlCredentialKey,\n args,\n });\n return (configured || config.defaultBaseUrl).replace(/\\/+$/, \"\");\n}\n\nasync function resolvePlaceholders(\n config: ProviderApiConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<Record<string, string>> {\n const placeholders: Record<string, string> = {};\n for (const placeholder of config.placeholders ?? []) {\n const value = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: placeholder.credentialKey,\n args,\n });\n if (value) placeholders[placeholder.name] = value;\n }\n return placeholders;\n}\n\nasync function resolveCredentialValue(options: {\n config: ProviderApiConfig;\n runtime: ProviderApiRuntimeOptions;\n ctx: CredentialContext;\n key: string;\n args: ProviderApiRequestArgs;\n workspaceProvider?: string;\n}): Promise<string | undefined> {\n const credential = await resolveOptionalCredential({\n provider: options.config.id,\n workspaceProvider: options.workspaceProvider,\n key: options.key,\n ctx: options.ctx,\n runtime: options.runtime,\n connectionId: options.args.connectionId,\n });\n return credential?.value;\n}\n\nfunction substituteString(\n value: string,\n placeholders: Record<string, string>,\n): string {\n let result = value;\n for (const [name, replacement] of Object.entries(placeholders)) {\n result = result.split(`{${name}}`).join(replacement);\n }\n return result;\n}\n\nfunction substituteUnknown(\n value: unknown,\n placeholders: Record<string, string>,\n): unknown {\n if (typeof value === \"string\") return substituteString(value, placeholders);\n if (Array.isArray(value)) {\n return value.map((item) => substituteUnknown(item, placeholders));\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n substituteUnknown(entry, placeholders),\n ]),\n );\n }\n return value;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction buildProviderUrl(options: {\n config: ProviderApiConfig;\n baseUrl: string;\n rawPath: string;\n query: unknown;\n}): URL {\n const base = new URL(options.baseUrl);\n const rawPath = options.rawPath.trim();\n const url = /^https?:\\/\\//i.test(rawPath)\n ? new URL(rawPath)\n : new URL(rawPath.startsWith(\"/\") ? rawPath : `/${rawPath}`, base);\n\n if (!isAllowedProviderUrl(url, base, options.config)) {\n throw new Error(\n `${options.config.label} API requests must stay on the configured provider host or registered provider host suffix.`,\n );\n }\n\n for (const [key, value] of queryEntries(options.query)) {\n url.searchParams.append(key, value);\n }\n\n return url;\n}\n\nfunction isAllowedProviderUrl(\n url: URL,\n base: URL,\n config: ProviderApiConfig,\n): boolean {\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return false;\n if (url.origin === base.origin) return true;\n const host = url.hostname.toLowerCase();\n return (config.allowedHostSuffixes ?? []).some((suffix) => {\n const normalized = suffix.toLowerCase().replace(/^\\./, \"\");\n return host === normalized || host.endsWith(`.${normalized}`);\n });\n}\n\nfunction queryEntries(value: unknown): Array<[string, string]> {\n if (!value) return [];\n if (typeof value === \"string\") {\n const params = new URLSearchParams(value.replace(/^\\?/, \"\"));\n return Array.from(params.entries());\n }\n if (typeof value !== \"object\" || Array.isArray(value)) return [];\n const entries: Array<[string, string]> = [];\n for (const [key, raw] of Object.entries(value)) {\n if (raw === undefined || raw === null) continue;\n if (Array.isArray(raw)) {\n for (const item of raw) entries.push([key, String(item)]);\n } else {\n entries.push([key, String(raw)]);\n }\n }\n return entries;\n}\n\nasync function resolveAuth(\n config: ProviderApiConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<ResolvedAuth> {\n const auth = config.auth;\n if (auth.type === \"none\") return emptyAuth();\n if (auth.type === \"bearer\") {\n const credential = await resolveAnyCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n keys: auth.keys,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { Authorization: `Bearer ${credential.value}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n if (auth.type === \"basic\") {\n const username = await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.usernameKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const password =\n auth.passwordKey === auth.usernameKey\n ? username\n : await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.passwordKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const encoded = Buffer.from(`${username.value}:${password.value}`).toString(\n \"base64\",\n );\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [\n omitCredentialValue(username),\n ...(password.key === username.key\n ? []\n : [omitCredentialValue(password)]),\n ],\n secretValues: [username.value, password.value, encoded],\n };\n }\n if (auth.type === \"basic-raw\") {\n const credential = await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.key,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const encoded = Buffer.from(credential.value).toString(\"base64\");\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value, encoded],\n };\n }\n if (auth.type === \"api-key-header\") {\n const credential = await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.key,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { [auth.header]: credential.value },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n if (auth.type === \"google-service-account\") {\n const token = await getGoogleServiceAccountToken(auth.scopes, runtime, ctx);\n return {\n headers: { Authorization: `Bearer ${token}` },\n credentialSources: [\n {\n key: \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n ],\n secretValues: [token],\n };\n }\n if (auth.type === \"oauth-bearer\") {\n const credential = await resolveOAuthBearerToken({\n auth,\n ctx,\n accountId: args.accountId,\n });\n return {\n headers: { Authorization: `Bearer ${credential.value}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n\n const bearer = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: \"PROMETHEUS_BEARER_TOKEN\",\n args,\n });\n if (bearer) {\n return {\n headers: { Authorization: `Bearer ${bearer}` },\n credentialSources: [\n {\n key: \"PROMETHEUS_BEARER_TOKEN\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n ],\n secretValues: [bearer],\n };\n }\n const username = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: \"PROMETHEUS_USERNAME\",\n args,\n });\n const password = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: \"PROMETHEUS_PASSWORD\",\n args,\n });\n if (username && password) {\n const encoded = Buffer.from(`${username}:${password}`).toString(\"base64\");\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [\n {\n key: \"PROMETHEUS_USERNAME\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n {\n key: \"PROMETHEUS_PASSWORD\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n ],\n secretValues: [username, password, encoded],\n };\n }\n return emptyAuth();\n}\n\nfunction emptyAuth(): ResolvedAuth {\n return { headers: {}, credentialSources: [], secretValues: [] };\n}\n\nasync function resolveAnyCredential(options: {\n provider: ProviderApiId;\n workspaceProvider: string | undefined;\n keys: readonly string[];\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n for (const key of options.keys) {\n const credential = await resolveOptionalCredential({ ...options, key });\n if (credential?.value) return credential;\n }\n throw new Error(\n `${options.provider} credential not configured. Tried: ${options.keys.join(\n \", \",\n )}`,\n );\n}\n\nasync function resolveRequiredCredential(options: {\n provider: ProviderApiId;\n workspaceProvider: string | undefined;\n key: string;\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n const credential = await resolveOptionalCredential(options);\n if (!credential?.value) throw new Error(`${options.key} not configured`);\n return credential;\n}\n\nasync function resolveOptionalCredential(options: {\n provider: ProviderApiId;\n workspaceProvider: string | undefined;\n key: string;\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential | null> {\n const localCredentialSource =\n options.runtime.localCredentialSource ?? \"app_local\";\n const lookup: ProviderApiCredentialLookupOptions = {\n appId: options.runtime.appId,\n provider: options.provider,\n key: options.key,\n ctx: options.ctx,\n workspaceProvider: options.workspaceProvider,\n connectionId: options.connectionId,\n localCredentialSource,\n };\n if (options.runtime.resolveCredential) {\n return options.runtime.resolveCredential(lookup);\n }\n return defaultProviderApiCredentialResolver(lookup);\n}\n\nfunction omitCredentialValue(\n credential: ProviderApiResolvedCredential,\n): Omit<ProviderApiResolvedCredential, \"value\"> {\n const { value: _value, ...rest } = credential;\n return rest;\n}\n\nconst googleServiceTokenCache = new Map<\n string,\n { token: string; expiresAt: number }\n>();\n\nasync function getGoogleServiceAccountToken(\n scopes: readonly string[],\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n): Promise<string> {\n const cacheKey = createHash(\"sha256\")\n .update(\n `${runtime.appId}:${ctx.orgId ?? ctx.userEmail}:${scopes.join(\" \")}`,\n )\n .digest(\"hex\");\n const cached = googleServiceTokenCache.get(cacheKey);\n if (cached && Date.now() < cached.expiresAt - 30_000) return cached.token;\n\n const credsJson = await resolveCredentialValue({\n config: getProviderApiConfig(\"gcloud\"),\n runtime,\n ctx,\n key: \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n args: { provider: \"gcloud\", path: \"/\" },\n });\n if (!credsJson) {\n throw new Error(\"GOOGLE_APPLICATION_CREDENTIALS_JSON not configured\");\n }\n let creds: {\n type?: string;\n client_email?: string;\n private_key?: string;\n token_uri?: string;\n };\n try {\n creds = JSON.parse(credsJson) as typeof creds;\n } catch {\n throw new Error(\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON is not valid JSON. Upload a service account JSON key.\",\n );\n }\n if (!creds.client_email || !creds.private_key) {\n throw new Error(\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON must be a service account JSON key.\",\n );\n }\n\n const now = Math.floor(Date.now() / 1000);\n const aud = creds.token_uri || \"https://oauth2.googleapis.com/token\";\n const jwt = await signRs256Jwt(\n {\n iss: creds.client_email,\n scope: scopes.join(\" \"),\n aud,\n iat: now,\n exp: now + 3600,\n },\n creds.private_key,\n );\n const res = await fetch(aud, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n assertion: jwt,\n }),\n });\n if (!res.ok) {\n throw new Error(`Google OAuth error ${res.status}: ${await res.text()}`);\n }\n const data = (await res.json()) as {\n access_token: string;\n expires_in?: number;\n };\n googleServiceTokenCache.set(cacheKey, {\n token: data.access_token,\n expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,\n });\n return data.access_token;\n}\n\nasync function resolveOAuthBearerToken(options: {\n auth: Extract<ProviderApiAuthKind, { type: \"oauth-bearer\" }>;\n ctx: CredentialContext;\n accountId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n const accounts = await listOAuthAccountsByOwner(\n options.auth.oauthProvider,\n options.ctx.userEmail,\n );\n if (accounts.length === 0) {\n throw new Error(\n `${options.auth.tokenLabel} is not connected for ${options.ctx.userEmail}.`,\n );\n }\n const accountId = options.accountId?.trim();\n const account = accountId\n ? accounts.find((entry) => entry.accountId === accountId)\n : accounts[0];\n if (!account) {\n throw new Error(\n `${options.auth.tokenLabel} account ${accountId} is not available to ${options.ctx.userEmail}.`,\n );\n }\n const tokens = account.tokens as OAuthTokens;\n const token = await getValidOAuthAccessToken({\n oauthProvider: options.auth.oauthProvider,\n accountId: account.accountId,\n ownerEmail: options.ctx.userEmail,\n tokens,\n });\n return {\n key: `${options.auth.oauthProvider.toUpperCase()}_OAUTH_TOKEN`,\n value: token,\n source: \"oauth_token\",\n provider: options.auth.oauthProvider,\n accountId: account.accountId,\n accountLabel: account.displayName,\n };\n}\n\nasync function getValidOAuthAccessToken(options: {\n oauthProvider: string;\n accountId: string;\n ownerEmail: string;\n tokens: OAuthTokens;\n}): Promise<string> {\n const accessToken =\n options.tokens.access_token ?? options.tokens.accessToken ?? \"\";\n if (!accessToken) {\n throw new Error(\n `${options.oauthProvider} OAuth account has no access token.`,\n );\n }\n const expiresAt = options.tokens.expiry_date ?? options.tokens.expiresAt;\n if (\n !expiresAt ||\n !Number.isFinite(expiresAt) ||\n expiresAt > Date.now() + 60_000\n ) {\n return accessToken;\n }\n\n const refreshToken =\n options.tokens.refresh_token ?? options.tokens.refreshToken;\n if (!refreshToken) return accessToken;\n if (options.oauthProvider === \"google\") {\n return refreshGoogleOAuthToken(options, refreshToken);\n }\n throw new Error(\n `${options.oauthProvider} OAuth token is expired and automatic refresh is not configured for provider-api.`,\n );\n}\n\nasync function refreshGoogleOAuthToken(\n options: {\n oauthProvider: string;\n accountId: string;\n ownerEmail: string;\n tokens: OAuthTokens;\n },\n refreshToken: string,\n): Promise<string> {\n const clientId = process.env.GOOGLE_CLIENT_ID;\n const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n if (!clientId || !clientSecret) {\n throw new Error(\n \"GOOGLE_CLIENT_ID/SECRET not set for Google OAuth refresh.\",\n );\n }\n const res = await fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n refresh_token: refreshToken,\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: \"refresh_token\",\n }),\n });\n const data = (await res.json()) as {\n access_token?: string;\n expires_in?: number;\n token_type?: string;\n scope?: string;\n error?: string;\n error_description?: string;\n };\n if (!res.ok || !data.access_token) {\n const detail = data.error_description ?? data.error ?? res.statusText;\n throw new Error(`Google OAuth refresh failed: ${detail}`);\n }\n const merged: OAuthTokens = {\n ...options.tokens,\n access_token: data.access_token,\n expiry_date: Date.now() + (data.expires_in ?? 3600) * 1000,\n token_type: data.token_type ?? options.tokens.token_type,\n scope: data.scope ?? options.tokens.scope,\n };\n await saveOAuthTokens(\n options.oauthProvider,\n options.accountId,\n merged as unknown as Record<string, unknown>,\n options.ownerEmail,\n );\n return data.access_token;\n}\n\nfunction normalizeMethod(\n method: ProviderApiMethod | undefined,\n): ProviderApiMethod {\n const normalized = String(method || \"GET\").toUpperCase();\n if (\n normalized === \"GET\" ||\n normalized === \"POST\" ||\n normalized === \"PUT\" ||\n normalized === \"PATCH\" ||\n normalized === \"DELETE\" ||\n normalized === \"HEAD\"\n ) {\n return normalized;\n }\n throw new Error(`Unsupported HTTP method: ${method}`);\n}\n\nfunction sanitizeOutboundHeaders(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const headers: Record<string, string> = {};\n for (const [name, rawValue] of Object.entries(value)) {\n const lower = name.toLowerCase();\n if (!HEADER_NAME_RE.test(name) || BLOCKED_OUTBOUND_HEADERS.has(lower)) {\n continue;\n }\n if (rawValue === undefined || rawValue === null) continue;\n const headerValue = String(rawValue);\n if (/[\\r\\n]/.test(headerValue)) continue;\n headers[name] = headerValue;\n }\n return headers;\n}\n\nfunction prepareBody(\n body: unknown,\n headers: Record<string, string>,\n): BodyInit | undefined {\n if (body === undefined || body === null) return undefined;\n if (typeof body === \"string\") return body;\n const hasContentType = Object.keys(headers).some(\n (name) => name.toLowerCase() === \"content-type\",\n );\n if (!hasContentType) headers[\"Content-Type\"] = \"application/json\";\n return JSON.stringify(body);\n}\n\nasync function fetchWithTimeout(\n optionsUrl: string,\n options: {\n method?: ProviderApiMethod;\n headers?: Record<string, string>;\n body?: BodyInit;\n timeoutMs?: number;\n maxBytes?: number;\n secretValues?: string[];\n },\n) {\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n clampTimeout(options.timeoutMs),\n );\n try {\n const dispatcher = (await createSsrfSafeDispatcher()) ?? undefined;\n const fetchOptions: RequestInit & { dispatcher?: unknown } = {\n method: options.method ?? \"GET\",\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n redirect: \"manual\",\n };\n if (dispatcher) fetchOptions.dispatcher = dispatcher;\n const startedAt = Date.now();\n const res = await fetch(optionsUrl, fetchOptions);\n const elapsedMs = Date.now() - startedAt;\n const rawText = await readResponseTextWithLimit(\n res,\n clampMaxBytes(options.maxBytes),\n );\n const secretValues = options.secretValues ?? [];\n const redactedText = redactString(rawText.text, secretValues);\n const parsed = tryParseJson(redactedText);\n return {\n status: res.status,\n statusText: res.statusText,\n ok: res.ok,\n elapsedMs,\n headers: redactSecrets(headersToObject(res.headers), secretValues),\n contentType: res.headers.get(\"content-type\") ?? null,\n size: rawText.size,\n truncated: rawText.truncated,\n text: parsed === undefined ? redactedText : undefined,\n json: parsed,\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function readResponseTextWithLimit(\n response: Response,\n maxBytes: number,\n): Promise<{ text: string; truncated: boolean; size: number }> {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && Number(contentLength) > maxBytes) {\n return {\n text: `(response too large - ${contentLength} bytes, max ${maxBytes})`,\n truncated: true,\n size: Number(contentLength),\n };\n }\n const buffer = await response.arrayBuffer();\n const size = buffer.byteLength;\n const bytes = new Uint8Array(buffer.slice(0, maxBytes));\n return {\n text: new TextDecoder().decode(bytes),\n truncated: size > maxBytes,\n size,\n };\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n if (key.toLowerCase() !== \"set-cookie\") result[key] = value;\n });\n return result;\n}\n\nfunction tryParseJson(text: string): unknown | undefined {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return undefined;\n try {\n return JSON.parse(trimmed);\n } catch {\n return undefined;\n }\n}\n\nfunction redactSecrets<T>(value: T, secretValues: string[]): T {\n if (secretValues.length === 0) return value;\n if (typeof value === \"string\") return redactString(value, secretValues) as T;\n if (Array.isArray(value)) {\n return value.map((item) => redactSecrets(item, secretValues)) as T;\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactSecrets(entry, secretValues),\n ]),\n ) as T;\n }\n return value;\n}\n\nfunction redactString(text: string, secretValues: string[]): string {\n let output = text;\n for (const secret of [...secretValues].sort((a, b) => b.length - a.length)) {\n if (!secret) continue;\n output = output.split(secret).join(\"[redacted]\");\n try {\n output = output.split(encodeURIComponent(secret)).join(\"[redacted]\");\n } catch {}\n }\n return output;\n}\n\nfunction mergeQueryObjects(\n base: unknown,\n extra: Record<string, string>,\n): unknown {\n if (!base) return extra;\n if (typeof base === \"string\") {\n const params = new URLSearchParams(base.replace(/^\\?/, \"\"));\n for (const [key, value] of Object.entries(extra)) {\n params.set(key, value);\n }\n return params.toString();\n }\n if (typeof base === \"object\" && !Array.isArray(base)) {\n return { ...(base as Record<string, unknown>), ...extra };\n }\n return extra;\n}\n\nfunction clampTimeout(timeoutMs: number | undefined): number {\n if (!Number.isFinite(timeoutMs)) return DEFAULT_TIMEOUT_MS;\n return Math.max(1_000, Math.min(MAX_TIMEOUT_MS, Math.floor(timeoutMs!)));\n}\n\nfunction clampMaxBytes(maxBytes: number | undefined): number {\n if (!Number.isFinite(maxBytes)) return DEFAULT_MAX_BYTES;\n return Math.max(1_000, Math.min(MAX_MAX_BYTES, Math.floor(maxBytes!)));\n}\n\n/** Resolve a dot-path from a parsed JSON object, e.g. \"meta.next_cursor\". */\nfunction dotGet(obj: unknown, path: string): unknown {\n if (!path) return obj;\n let current: unknown = obj;\n for (const key of path.split(\".\")) {\n if (current === null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\n/**\n * Handle saveToFile: write the full provider-api response body to a workspace\n * file and return a compact summary.\n */\nasync function handleSaveToFile(\n filePath: string,\n responseText: string,\n contentType: string | null,\n status: number,\n): Promise<unknown> {\n const { writeWorkspaceFile, SAVE_TO_FILE_MAX_BYTES: maxSaveBytes } =\n await import(\"../workspace-files/store.js\");\n const { getRequestOrgId, getRequestUserEmail } =\n await import(\"../server/request-context.js\");\n\n const orgId = getRequestOrgId();\n const email = getRequestUserEmail();\n const scope = orgId\n ? { scope: \"org\" as const, scopeId: orgId }\n : email\n ? { scope: \"user\" as const, scopeId: email }\n : null;\n\n if (!scope) {\n throw new Error(\n \"saveToFile requires an authenticated request context (no user email or orgId found).\",\n );\n }\n\n const mimeType = contentType?.split(\";\")[0].trim() ?? \"text/plain\";\n await writeWorkspaceFile(scope, filePath, responseText, mimeType, {\n maxFileBytes: maxSaveBytes,\n });\n const bytes = Buffer.byteLength(responseText, \"utf8\");\n const preview = responseText.slice(0, 2000);\n return {\n savedToFile: true,\n savedTo: filePath,\n status,\n bytes,\n contentType: mimeType,\n preview: preview.length < responseText.length ? `${preview}…` : preview,\n };\n}\n\n/**\n * Execute paginated requests, accumulating items across pages.\n * Returns the accumulated items array and the last response for metadata.\n */\nasync function fetchAllPages(\n config: FetchAllPagesConfig,\n executeOnePage: (extraQuery?: Record<string, string>) => Promise<{\n text: string;\n contentType: string | null;\n status: number;\n ok: boolean;\n }>,\n): Promise<{\n items: unknown[];\n pageCount: number;\n lastStatus: number;\n lastContentType: string | null;\n}> {\n const maxPages = Math.min(\n Number.isFinite(config.maxPages) && config.maxPages! > 0\n ? config.maxPages!\n : 10,\n FETCH_ALL_PAGES_MAX,\n );\n\n const items: unknown[] = [];\n let cursor: string | undefined;\n let pageCount = 0;\n let lastStatus = 0;\n let lastContentType: string | null = null;\n\n while (pageCount < maxPages) {\n const extraQuery: Record<string, string> = {};\n if (cursor) extraQuery[config.cursorParam] = cursor;\n\n const page = await executeOnePage(pageCount > 0 ? extraQuery : undefined);\n lastStatus = page.status;\n lastContentType = page.contentType;\n pageCount++;\n\n let body: unknown;\n try {\n body = JSON.parse(page.text);\n } catch {\n body = page.text;\n }\n\n // Extract items\n if (config.itemsPath) {\n const extracted = dotGet(body, config.itemsPath);\n if (Array.isArray(extracted)) {\n items.push(...extracted);\n } else if (extracted !== undefined) {\n items.push(extracted);\n }\n } else {\n items.push(body);\n }\n\n // Extract next cursor\n const nextCursor = dotGet(body, config.cursorPath);\n if (\n !nextCursor ||\n nextCursor === \"\" ||\n nextCursor === null ||\n nextCursor === cursor\n ) {\n break;\n }\n cursor = String(nextCursor);\n }\n\n return { items, pageCount, lastStatus, lastContentType };\n}\n\nfunction fingerprint(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 1) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nfunction base64UrlEncodeString(value: string): string {\n return base64UrlEncode(new TextEncoder().encode(value));\n}\n\nfunction pemToPkcs8(pem: string): Uint8Array {\n const body = pem\n .replace(/-----BEGIN [^-]+-----/g, \"\")\n .replace(/-----END [^-]+-----/g, \"\")\n .replace(/\\s+/g, \"\");\n const binary = atob(body);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n out[i] = binary.charCodeAt(i);\n }\n return out;\n}\n\nconst keyCache = new Map<string, Promise<CryptoKey>>();\n\nasync function privateKeyCacheKey(privateKeyPem: string): Promise<string> {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(privateKeyPem) as BufferSource,\n );\n return `sha256:${base64UrlEncode(new Uint8Array(digest))}`;\n}\n\nasync function importRs256Key(privateKeyPem: string): Promise<CryptoKey> {\n const cacheKey = await privateKeyCacheKey(privateKeyPem);\n let cached = keyCache.get(cacheKey);\n if (!cached) {\n cached = crypto.subtle.importKey(\n \"pkcs8\",\n pemToPkcs8(privateKeyPem) as BufferSource,\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n keyCache.set(cacheKey, cached);\n }\n return cached;\n}\n\nasync function signRs256Jwt(\n payload: Record<string, unknown>,\n privateKeyPem: string,\n): Promise<string> {\n const header = { alg: \"RS256\", typ: \"JWT\" };\n const signingInput = `${base64UrlEncodeString(\n JSON.stringify(header),\n )}.${base64UrlEncodeString(JSON.stringify(payload))}`;\n\n const key = await importRs256Key(privateKeyPem);\n const signature = await crypto.subtle.sign(\n \"RSASSA-PKCS1-v1_5\",\n key,\n new TextEncoder().encode(signingInput) as BufferSource,\n );\n\n return `${signingInput}.${base64UrlEncode(new Uint8Array(signature))}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider-api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n resolveCredential,\n type CredentialContext,\n} from \"../credentials/index.js\";\nimport {\n createSsrfSafeDispatcher,\n isBlockedExtensionUrlWithDns,\n} from \"../extensions/url-safety.js\";\nimport {\n deleteOAuthTokens,\n listOAuthAccountsByOwner,\n saveOAuthTokens,\n} from \"../oauth-tokens/index.js\";\nimport { getCredentialContext } from \"../server/request-context.js\";\nimport { resolveWorkspaceConnectionCredentialForApp } from \"../workspace-connections/credentials.js\";\nimport type { WorkspaceConnectionTemplateUse } from \"../connections/catalog.js\";\nimport type {\n CustomProviderConfig,\n CustomProviderAuthKind,\n} from \"./custom-registry.js\";\n\nexport type {\n CustomProviderConfig,\n CustomProviderScope,\n CustomProviderAuthKind,\n UpsertCustomProviderArgs,\n} from \"./custom-registry.js\";\nexport {\n upsertCustomProvider,\n deleteCustomProvider,\n listCustomProviders,\n getCustomProvider,\n validateCustomBaseUrl,\n} from \"./custom-registry.js\";\n\nexport const PROVIDER_API_IDS = [\n \"amplitude\",\n \"apollo\",\n \"bigquery\",\n \"commonroom\",\n \"dataforseo\",\n \"ga4\",\n \"gcloud\",\n \"github\",\n \"gmail\",\n \"gong\",\n \"google_calendar\",\n \"google_drive\",\n \"granola\",\n \"grafana\",\n \"hubspot\",\n \"jira\",\n \"mixpanel\",\n \"notion\",\n \"posthog\",\n \"prometheus\",\n \"pylon\",\n \"sentry\",\n \"slack\",\n \"stripe\",\n \"twitter\",\n] as const;\n\nexport type ProviderApiId = (typeof PROVIDER_API_IDS)[number];\n\nexport type ProviderApiMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"HEAD\";\n\n/** Cursor-pagination config for fetchAllPages. */\nexport interface FetchAllPagesConfig {\n /**\n * Dot-path into the JSON response body where the next-page cursor lives,\n * e.g. \"meta.next_cursor\" or \"pagination.next_page_token\".\n */\n cursorPath: string;\n /**\n * Query parameter name to pass the cursor on the next request,\n * e.g. \"cursor\" or \"page_token\".\n */\n cursorParam: string;\n /**\n * Dot-path to the items array in each response body.\n * When omitted, the whole response body is appended to the items array.\n */\n itemsPath?: string;\n /**\n * Maximum number of pages to fetch. Default 10, max 50.\n */\n maxPages?: number;\n}\n\nexport interface ProviderApiRequestArgs {\n provider: ProviderApiId | string;\n method?: ProviderApiMethod;\n path: string;\n query?: unknown;\n headers?: Record<string, unknown>;\n body?: unknown;\n auth?: \"default\" | \"none\";\n timeoutMs?: number;\n maxBytes?: number;\n connectionId?: string | null;\n accountId?: string | null;\n /**\n * When set, write the full response body to this workspace file path instead\n * of returning it in context. Returns a compact summary with status, bytes,\n * path, and a preview. Allows up to 20 MB (vs the normal 4 MB context limit).\n */\n saveToFile?: string;\n /**\n * When set, automatically paginate by cursor until the cursor field is empty\n * or maxPages is reached. Accumulates items from itemsPath (or whole bodies)\n * across all pages. Combine with saveToFile to write the full dataset.\n */\n fetchAllPages?: FetchAllPagesConfig;\n}\n\nexport type ProviderApiAuthKind =\n | { type: \"none\" }\n | {\n type: \"bearer\";\n keys: readonly string[];\n workspaceProvider?: string;\n }\n | {\n type: \"basic\";\n usernameKey: string;\n passwordKey: string;\n workspaceProvider?: string;\n }\n | {\n type: \"basic-raw\";\n key: string;\n workspaceProvider?: string;\n }\n | {\n type: \"api-key-header\";\n key: string;\n header: string;\n workspaceProvider?: string;\n }\n | {\n type: \"google-service-account\";\n scopes: readonly string[];\n }\n | {\n type: \"oauth-bearer\";\n oauthProvider: string;\n tokenLabel: string;\n }\n | {\n type: \"prometheus\";\n };\n\nexport interface ProviderApiConfig {\n id: ProviderApiId;\n label: string;\n defaultBaseUrl: string;\n baseUrlCredentialKey?: string;\n auth: ProviderApiAuthKind;\n credentialKeys: readonly string[];\n docsUrls: readonly string[];\n specUrls?: readonly string[];\n allowedHostSuffixes?: readonly string[];\n defaultHeaders?: Record<string, string>;\n placeholders?: readonly ProviderApiPlaceholder[];\n examples?: readonly ProviderApiExample[];\n notes?: readonly string[];\n templateUses?: readonly WorkspaceConnectionTemplateUse[];\n}\n\nexport interface ProviderApiPlaceholder {\n name: string;\n credentialKey: string;\n label: string;\n}\n\nexport interface ProviderApiExample {\n label: string;\n method: ProviderApiMethod;\n path: string;\n body?: unknown;\n}\n\nexport interface ProviderApiResolvedCredential {\n key: string;\n value: string;\n source: string;\n provider: string;\n connectionId?: string;\n connectionLabel?: string;\n accountId?: string;\n accountLabel?: string | null;\n scope?: string;\n}\n\nexport interface ProviderApiCredentialLookupOptions {\n appId: string;\n provider: string;\n key: string;\n ctx: CredentialContext;\n workspaceProvider?: string;\n connectionId?: string | null;\n localCredentialSource: string;\n}\n\nexport type ProviderApiCredentialResolver = (\n options: ProviderApiCredentialLookupOptions,\n) => Promise<ProviderApiResolvedCredential | null>;\n\nexport interface ProviderApiRuntimeOptions {\n appId: string;\n providerIds?: readonly (ProviderApiId | string)[];\n localCredentialSource?: string;\n getCredentialContext?: () => CredentialContext | null;\n resolveCredential?: ProviderApiCredentialResolver;\n /**\n * Template-specific OAuth token provider overrides for built-in provider API\n * configs. Use when an app stores a provider's OAuth grant under a narrower\n * local provider id, e.g. Google Drive scoped to a \"google-docs\" connection.\n */\n oauthProviderOverrides?: Record<string, string>;\n /**\n * Optional loader for custom providers registered at runtime. When provided,\n * custom providers are merged with the static built-in registry for catalog,\n * docs, and request operations. Custom providers cannot shadow built-in ids.\n */\n getCustomProviders?: () => Promise<CustomProviderConfig[]>;\n}\n\ninterface ProviderApiRuntime {\n providerIds: readonly ProviderApiId[];\n listCatalog(\n provider?: ProviderApiId | string,\n ): ReturnType<typeof listProviderApiCatalog> | Promise<unknown[]>;\n fetchDocs(options: {\n provider: ProviderApiId | string;\n url?: string;\n maxBytes?: number;\n }): Promise<unknown>;\n executeRequest(args: ProviderApiRequestArgs): Promise<unknown>;\n}\n\ninterface ResolvedAuth {\n headers: Record<string, string>;\n credentialSources: Array<Omit<ProviderApiResolvedCredential, \"value\">>;\n secretValues: string[];\n}\n\ninterface OAuthTokens {\n access_token?: string;\n accessToken?: string;\n refresh_token?: string;\n refreshToken?: string;\n expiry_date?: number;\n expiresAt?: number;\n expires_in?: number;\n token_type?: string;\n scope?: string;\n}\n\nconst PERMANENT_GOOGLE_OAUTH_REFRESH_ERRORS = new Set([\n \"invalid_grant\",\n \"unauthorized_client\",\n \"invalid_client\",\n]);\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 120_000;\nconst DEFAULT_MAX_BYTES = 1024 * 1024;\nconst MAX_MAX_BYTES = 4 * 1024 * 1024;\n/** When saveToFile is used, allow a much larger per-page response since the\n * content won't enter the model's context window. */\nconst SAVE_TO_FILE_MAX_BYTES = 20 * 1024 * 1024; // 20 MB\nconst FETCH_ALL_PAGES_MAX = 50;\nconst HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\nconst BLOCKED_OUTBOUND_HEADERS = new Set([\n \"connection\",\n \"content-length\",\n \"cookie\",\n \"forwarded\",\n \"host\",\n \"keep-alive\",\n \"origin\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"referer\",\n \"set-cookie\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n]);\n\nconst PROVIDER_CONFIGS: Record<ProviderApiId, ProviderApiConfig> = {\n amplitude: {\n id: \"amplitude\",\n label: \"Amplitude\",\n defaultBaseUrl: \"https://amplitude.com/api/2\",\n auth: {\n type: \"basic\",\n usernameKey: \"AMPLITUDE_API_KEY\",\n passwordKey: \"AMPLITUDE_SECRET_KEY\",\n },\n credentialKeys: [\"AMPLITUDE_API_KEY\", \"AMPLITUDE_SECRET_KEY\"],\n docsUrls: [\"https://amplitude.com/docs/apis\"],\n allowedHostSuffixes: [\"amplitude.com\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"Export events\",\n method: \"GET\",\n path: \"/export?start=20260601T00&end=20260602T00\",\n },\n ],\n },\n apollo: {\n id: \"apollo\",\n label: \"Apollo\",\n defaultBaseUrl: \"https://api.apollo.io\",\n auth: {\n type: \"api-key-header\",\n key: \"APOLLO_API_KEY\",\n header: \"x-api-key\",\n },\n credentialKeys: [\"APOLLO_API_KEY\"],\n docsUrls: [\"https://docs.apollo.io/reference/api-reference\"],\n templateUses: [\"analytics\", \"calendar\"],\n examples: [\n {\n label: \"Search people\",\n method: \"POST\",\n path: \"/api/v1/mixed_people/search\",\n body: { q_keywords: \"vp marketing\", page: 1, per_page: 10 },\n },\n ],\n },\n bigquery: {\n id: \"bigquery\",\n label: \"BigQuery REST API\",\n defaultBaseUrl: \"https://bigquery.googleapis.com/bigquery/v2\",\n auth: {\n type: \"google-service-account\",\n scopes: [\n \"https://www.googleapis.com/auth/cloud-platform\",\n \"https://www.googleapis.com/auth/bigquery\",\n ],\n },\n credentialKeys: [\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"BIGQUERY_PROJECT_ID\",\n ],\n docsUrls: [\"https://cloud.google.com/bigquery/docs/reference/rest\"],\n specUrls: [\"https://bigquery.googleapis.com/$discovery/rest?version=v2\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"BIGQUERY_PROJECT_ID\",\n label: \"Configured BigQuery project ID\",\n },\n ],\n examples: [\n {\n label: \"List datasets\",\n method: \"GET\",\n path: \"/projects/{projectId}/datasets\",\n },\n {\n label: \"Run query\",\n method: \"POST\",\n path: \"/projects/{projectId}/queries\",\n body: { query: \"SELECT 1\", useLegacySql: false },\n },\n ],\n },\n commonroom: {\n id: \"commonroom\",\n label: \"Common Room\",\n defaultBaseUrl: \"https://api.commonroom.io/community/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"COMMONROOM_API_TOKEN\"],\n },\n credentialKeys: [\"COMMONROOM_API_TOKEN\"],\n docsUrls: [\"https://developer.commonroom.io/reference/overview\"],\n templateUses: [\"analytics\"],\n examples: [{ label: \"List members\", method: \"GET\", path: \"/members\" }],\n },\n dataforseo: {\n id: \"dataforseo\",\n label: \"DataForSEO\",\n defaultBaseUrl: \"https://api.dataforseo.com/v3\",\n auth: {\n type: \"basic\",\n usernameKey: \"DATAFORSEO_LOGIN\",\n passwordKey: \"DATAFORSEO_PASSWORD\",\n },\n credentialKeys: [\"DATAFORSEO_LOGIN\", \"DATAFORSEO_PASSWORD\"],\n docsUrls: [\"https://docs.dataforseo.com/v3/\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"SERP task post\",\n method: \"POST\",\n path: \"/serp/google/organic/task_post\",\n body: [\n { keyword: \"builder.io\", location_code: 2840, language_code: \"en\" },\n ],\n },\n ],\n },\n ga4: {\n id: \"ga4\",\n label: \"Google Analytics Data API\",\n defaultBaseUrl: \"https://analyticsdata.googleapis.com/v1beta\",\n auth: {\n type: \"google-service-account\",\n scopes: [\"https://www.googleapis.com/auth/analytics.readonly\"],\n },\n credentialKeys: [\"GOOGLE_APPLICATION_CREDENTIALS_JSON\", \"GA4_PROPERTY_ID\"],\n docsUrls: [\n \"https://developers.google.com/analytics/devguides/reporting/data/v1/rest\",\n ],\n specUrls: [\n \"https://analyticsdata.googleapis.com/$discovery/rest?version=v1beta\",\n ],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"propertyId\",\n credentialKey: \"GA4_PROPERTY_ID\",\n label: \"Configured GA4 property ID\",\n },\n ],\n examples: [\n {\n label: \"Run report\",\n method: \"POST\",\n path: \"/properties/{propertyId}:runReport\",\n body: {\n dateRanges: [{ startDate: \"30daysAgo\", endDate: \"today\" }],\n metrics: [{ name: \"activeUsers\" }],\n },\n },\n ],\n },\n gcloud: {\n id: \"gcloud\",\n label: \"Google Cloud APIs\",\n defaultBaseUrl: \"https://cloudresourcemanager.googleapis.com\",\n auth: {\n type: \"google-service-account\",\n scopes: [\n \"https://www.googleapis.com/auth/cloud-platform\",\n \"https://www.googleapis.com/auth/monitoring.read\",\n \"https://www.googleapis.com/auth/logging.read\",\n \"https://www.googleapis.com/auth/bigquery\",\n ],\n },\n credentialKeys: [\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n \"BIGQUERY_PROJECT_ID\",\n ],\n docsUrls: [\"https://cloud.google.com/apis/docs/overview\"],\n specUrls: [\"https://www.googleapis.com/discovery/v1/apis\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"BIGQUERY_PROJECT_ID\",\n label: \"Configured Google Cloud project ID\",\n },\n ],\n examples: [\n {\n label: \"Get project\",\n method: \"GET\",\n path: \"https://cloudresourcemanager.googleapis.com/v1/projects/{projectId}\",\n },\n ],\n },\n github: {\n id: \"github\",\n label: \"GitHub REST API\",\n defaultBaseUrl: \"https://api.github.com\",\n auth: {\n type: \"bearer\",\n keys: [\"GITHUB_TOKEN\"],\n workspaceProvider: \"github\",\n },\n credentialKeys: [\"GITHUB_TOKEN\"],\n docsUrls: [\"https://docs.github.com/rest\"],\n specUrls: [\n \"https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json\",\n ],\n defaultHeaders: {\n Accept: \"application/vnd.github+json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n templateUses: [\"analytics\", \"brain\", \"design\", \"dispatch\"],\n examples: [\n { label: \"Authenticated user\", method: \"GET\", path: \"/user\" },\n { label: \"Search issues\", method: \"GET\", path: \"/search/issues\" },\n ],\n },\n gmail: {\n id: \"gmail\",\n label: \"Gmail API\",\n defaultBaseUrl: \"https://gmail.googleapis.com/gmail/v1\",\n auth: {\n type: \"oauth-bearer\",\n oauthProvider: \"google\",\n tokenLabel: \"Google OAuth token\",\n },\n credentialKeys: [\"GOOGLE_OAUTH_ACCOUNT\"],\n docsUrls: [\"https://developers.google.com/gmail/api/reference/rest\"],\n specUrls: [\"https://gmail.googleapis.com/$discovery/rest?version=v1\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"brain\", \"mail\", \"dispatch\"],\n examples: [\n {\n label: \"List messages\",\n method: \"GET\",\n path: \"/users/me/messages\",\n },\n {\n label: \"Search messages\",\n method: \"GET\",\n path: \"/users/me/messages\",\n body: undefined,\n },\n ],\n notes: [\n \"Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.\",\n ],\n },\n gong: {\n id: \"gong\",\n label: \"Gong\",\n defaultBaseUrl: \"https://api.gong.io/v2\",\n baseUrlCredentialKey: \"GONG_API_BASE\",\n auth: {\n type: \"basic\",\n usernameKey: \"GONG_ACCESS_KEY\",\n passwordKey: \"GONG_ACCESS_SECRET\",\n },\n credentialKeys: [\"GONG_ACCESS_KEY\", \"GONG_ACCESS_SECRET\", \"GONG_API_BASE\"],\n docsUrls: [\"https://gong.app.gong.io/settings/api/documentation\"],\n templateUses: [\"analytics\", \"calendar\"],\n examples: [\n { label: \"List calls\", method: \"GET\", path: \"/calls\" },\n {\n label: \"Call transcript\",\n method: \"POST\",\n path: \"/calls/transcript\",\n body: { filter: { callIds: [\"<call-id>\"] } },\n },\n ],\n },\n google_calendar: {\n id: \"google_calendar\",\n label: \"Google Calendar API\",\n defaultBaseUrl: \"https://www.googleapis.com/calendar/v3\",\n auth: {\n type: \"oauth-bearer\",\n oauthProvider: \"google\",\n tokenLabel: \"Google OAuth token\",\n },\n credentialKeys: [\"GOOGLE_OAUTH_ACCOUNT\"],\n docsUrls: [\"https://developers.google.com/calendar/api/v3/reference\"],\n specUrls: [\"https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"brain\", \"calendar\", \"dispatch\", \"mail\"],\n examples: [\n {\n label: \"List calendars\",\n method: \"GET\",\n path: \"/users/me/calendarList\",\n },\n {\n label: \"Search events\",\n method: \"GET\",\n path: \"/calendars/primary/events\",\n },\n ],\n notes: [\n \"Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.\",\n ],\n },\n google_drive: {\n id: \"google_drive\",\n label: \"Google Drive API\",\n defaultBaseUrl: \"https://www.googleapis.com/drive/v3\",\n auth: {\n type: \"oauth-bearer\",\n oauthProvider: \"google\",\n tokenLabel: \"Google OAuth token\",\n },\n credentialKeys: [\"GOOGLE_OAUTH_ACCOUNT\"],\n docsUrls: [\"https://developers.google.com/drive/api/reference/rest/v3\"],\n specUrls: [\"https://www.googleapis.com/discovery/v1/apis/drive/v3/rest\"],\n allowedHostSuffixes: [\"googleapis.com\"],\n templateUses: [\"brain\", \"content\", \"slides\", \"dispatch\"],\n examples: [\n { label: \"List files\", method: \"GET\", path: \"/files\" },\n { label: \"Get file metadata\", method: \"GET\", path: \"/files/{fileId}\" },\n ],\n notes: [\n \"Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.\",\n ],\n },\n granola: {\n id: \"granola\",\n label: \"Granola Public API\",\n defaultBaseUrl: \"https://public-api.granola.ai/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"GRANOLA_API_KEY\"],\n workspaceProvider: \"granola\",\n },\n credentialKeys: [\"GRANOLA_API_KEY\"],\n docsUrls: [\"https://docs.granola.ai/\"],\n templateUses: [\"brain\", \"dispatch\"],\n examples: [\n { label: \"List notes\", method: \"GET\", path: \"/notes\" },\n { label: \"Get note\", method: \"GET\", path: \"/notes/<note-id>\" },\n ],\n },\n grafana: {\n id: \"grafana\",\n label: \"Grafana\",\n defaultBaseUrl: \"https://grafana.example.com\",\n baseUrlCredentialKey: \"GRAFANA_URL\",\n auth: {\n type: \"bearer\",\n keys: [\"GRAFANA_API_TOKEN\"],\n },\n credentialKeys: [\"GRAFANA_URL\", \"GRAFANA_API_TOKEN\"],\n docsUrls: [\"https://grafana.com/docs/grafana/latest/developers/http_api/\"],\n templateUses: [\"analytics\"],\n examples: [\n { label: \"List dashboards\", method: \"GET\", path: \"/api/search\" },\n ],\n },\n hubspot: {\n id: \"hubspot\",\n label: \"HubSpot\",\n defaultBaseUrl: \"https://api.hubapi.com\",\n auth: {\n type: \"bearer\",\n keys: [\"HUBSPOT_PRIVATE_APP_TOKEN\", \"HUBSPOT_ACCESS_TOKEN\"],\n workspaceProvider: \"hubspot\",\n },\n credentialKeys: [\"HUBSPOT_PRIVATE_APP_TOKEN\", \"HUBSPOT_ACCESS_TOKEN\"],\n docsUrls: [\"https://developers.hubspot.com/docs/api/overview\"],\n templateUses: [\"analytics\", \"brain\", \"calendar\", \"mail\", \"dispatch\"],\n examples: [\n {\n label: \"Search deals with any HubSpot CRM filter\",\n method: \"POST\",\n path: \"/crm/v3/objects/deals/search\",\n body: {\n filterGroups: [\n {\n filters: [\n {\n propertyName: \"products\",\n operator: \"CONTAINS_TOKEN\",\n value: \"Publish\",\n },\n ],\n },\n ],\n properties: [\"dealname\", \"products\", \"dealstage\", \"closedate\"],\n limit: 100,\n },\n },\n {\n label: \"List deal property metadata\",\n method: \"GET\",\n path: \"/crm/v3/properties/deals\",\n },\n ],\n },\n jira: {\n id: \"jira\",\n label: \"Jira Cloud\",\n defaultBaseUrl: \"https://example.atlassian.net\",\n baseUrlCredentialKey: \"JIRA_BASE_URL\",\n auth: {\n type: \"basic\",\n usernameKey: \"JIRA_USER_EMAIL\",\n passwordKey: \"JIRA_API_TOKEN\",\n },\n credentialKeys: [\"JIRA_BASE_URL\", \"JIRA_USER_EMAIL\", \"JIRA_API_TOKEN\"],\n docsUrls: [\n \"https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/\",\n ],\n specUrls: [\n \"https://dac-static.atlassian.com/cloud/jira/platform/swagger-v3.v3.json\",\n ],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"JQL search\",\n method: \"GET\",\n path: \"/rest/api/3/search/jql\",\n },\n ],\n },\n mixpanel: {\n id: \"mixpanel\",\n label: \"Mixpanel\",\n defaultBaseUrl: \"https://mixpanel.com/api/query\",\n auth: {\n type: \"basic-raw\",\n key: \"MIXPANEL_SERVICE_ACCOUNT\",\n },\n credentialKeys: [\"MIXPANEL_PROJECT_ID\", \"MIXPANEL_SERVICE_ACCOUNT\"],\n docsUrls: [\"https://developer.mixpanel.com/reference/overview\"],\n allowedHostSuffixes: [\"mixpanel.com\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"MIXPANEL_PROJECT_ID\",\n label: \"Configured Mixpanel project ID\",\n },\n ],\n examples: [\n {\n label: \"Query events\",\n method: \"GET\",\n path: \"/events\",\n },\n ],\n notes: [\n \"Mixpanel uses multiple API hosts. You may pass full URLs for mixpanel.com or data.mixpanel.com endpoints.\",\n ],\n },\n notion: {\n id: \"notion\",\n label: \"Notion\",\n defaultBaseUrl: \"https://api.notion.com/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"NOTION_API_KEY\"],\n workspaceProvider: \"notion\",\n },\n credentialKeys: [\"NOTION_API_KEY\"],\n docsUrls: [\"https://developers.notion.com/reference/intro\"],\n defaultHeaders: { \"Notion-Version\": \"2022-06-28\" },\n templateUses: [\"analytics\", \"brain\", \"content\", \"dispatch\"],\n examples: [{ label: \"Search\", method: \"POST\", path: \"/search\", body: {} }],\n },\n posthog: {\n id: \"posthog\",\n label: \"PostHog\",\n defaultBaseUrl: \"https://app.posthog.com\",\n baseUrlCredentialKey: \"POSTHOG_HOST\",\n auth: {\n type: \"bearer\",\n keys: [\"POSTHOG_API_KEY\"],\n },\n credentialKeys: [\"POSTHOG_API_KEY\", \"POSTHOG_PROJECT_ID\", \"POSTHOG_HOST\"],\n docsUrls: [\"https://posthog.com/docs/api\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"projectId\",\n credentialKey: \"POSTHOG_PROJECT_ID\",\n label: \"Configured PostHog project ID\",\n },\n ],\n examples: [\n {\n label: \"List events\",\n method: \"GET\",\n path: \"/api/projects/{projectId}/events/\",\n },\n ],\n },\n prometheus: {\n id: \"prometheus\",\n label: \"Prometheus\",\n defaultBaseUrl: \"https://prometheus.example.com\",\n baseUrlCredentialKey: \"PROMETHEUS_URL\",\n auth: { type: \"prometheus\" },\n credentialKeys: [\n \"PROMETHEUS_URL\",\n \"PROMETHEUS_USERNAME\",\n \"PROMETHEUS_PASSWORD\",\n \"PROMETHEUS_BEARER_TOKEN\",\n ],\n docsUrls: [\"https://prometheus.io/docs/prometheus/latest/querying/api/\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"Instant query\",\n method: \"GET\",\n path: \"/api/v1/query\",\n },\n ],\n },\n pylon: {\n id: \"pylon\",\n label: \"Pylon\",\n defaultBaseUrl: \"https://api.usepylon.com\",\n auth: {\n type: \"bearer\",\n keys: [\"PYLON_API_KEY\"],\n },\n credentialKeys: [\"PYLON_API_KEY\"],\n docsUrls: [\"https://docs.usepylon.com/pylon-docs/developer/api-reference\"],\n templateUses: [\"analytics\", \"calendar\"],\n examples: [{ label: \"List issues\", method: \"GET\", path: \"/issues\" }],\n },\n sentry: {\n id: \"sentry\",\n label: \"Sentry\",\n defaultBaseUrl: \"https://sentry.io/api/0\",\n auth: {\n type: \"bearer\",\n keys: [\"SENTRY_AUTH_TOKEN\", \"SENTRY_SERVER_TOKEN\"],\n },\n credentialKeys: [\n \"SENTRY_AUTH_TOKEN\",\n \"SENTRY_SERVER_TOKEN\",\n \"SENTRY_ORG_SLUG\",\n ],\n docsUrls: [\"https://docs.sentry.io/api/\"],\n templateUses: [\"analytics\"],\n placeholders: [\n {\n name: \"orgSlug\",\n credentialKey: \"SENTRY_ORG_SLUG\",\n label: \"Configured Sentry organization slug\",\n },\n ],\n examples: [\n {\n label: \"List issues for org\",\n method: \"GET\",\n path: \"/organizations/{orgSlug}/issues/\",\n },\n ],\n },\n slack: {\n id: \"slack\",\n label: \"Slack Web API\",\n defaultBaseUrl: \"https://slack.com/api\",\n auth: {\n type: \"bearer\",\n keys: [\"SLACK_BOT_TOKEN\"],\n workspaceProvider: \"slack\",\n },\n credentialKeys: [\"SLACK_BOT_TOKEN\", \"SLACK_BOT_TOKEN_2\"],\n docsUrls: [\"https://api.slack.com/web\"],\n specUrls: [\n \"https://api.slack.com/specs/openapi/v2/slack_web_openapi_v2_without_examples.json\",\n ],\n templateUses: [\"analytics\", \"brain\", \"dispatch\"],\n examples: [\n { label: \"Search messages\", method: \"GET\", path: \"/search.messages\" },\n { label: \"Post message\", method: \"POST\", path: \"/chat.postMessage\" },\n ],\n },\n stripe: {\n id: \"stripe\",\n label: \"Stripe\",\n defaultBaseUrl: \"https://api.stripe.com/v1\",\n auth: {\n type: \"bearer\",\n keys: [\"STRIPE_SECRET_KEY\"],\n },\n credentialKeys: [\"STRIPE_SECRET_KEY\"],\n docsUrls: [\"https://docs.stripe.com/api\"],\n specUrls: [\n \"https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json\",\n ],\n templateUses: [\"analytics\"],\n examples: [{ label: \"List customers\", method: \"GET\", path: \"/customers\" }],\n },\n twitter: {\n id: \"twitter\",\n label: \"Twitter/X via twitterapi.io\",\n defaultBaseUrl: \"https://api.twitterapi.io\",\n auth: {\n type: \"api-key-header\",\n key: \"TWITTER_BEARER_TOKEN\",\n header: \"X-API-Key\",\n },\n credentialKeys: [\"TWITTER_BEARER_TOKEN\"],\n docsUrls: [\"https://twitterapi.io/docs\"],\n templateUses: [\"analytics\"],\n examples: [\n {\n label: \"User tweets\",\n method: \"GET\",\n path: \"/twitter/user/last_tweets\",\n },\n ],\n },\n};\n\nexport function getProviderApiConfig(\n provider: ProviderApiId | string,\n): ProviderApiConfig {\n const config = PROVIDER_CONFIGS[provider as ProviderApiId];\n if (!config) throw new Error(`Unsupported provider API: ${provider}`);\n return config;\n}\n\nexport function isProviderApiId(provider: string): provider is ProviderApiId {\n return Object.prototype.hasOwnProperty.call(PROVIDER_CONFIGS, provider);\n}\n\nexport function listProviderApiIdsForTemplateUse(\n templateUse: WorkspaceConnectionTemplateUse,\n): ProviderApiId[] {\n return PROVIDER_API_IDS.filter((id) =>\n (PROVIDER_CONFIGS[id].templateUses ?? []).includes(templateUse),\n );\n}\n\nexport function listProviderApiCatalog(\n provider?: ProviderApiId | string,\n options: { providerIds?: readonly (ProviderApiId | string)[] } = {},\n) {\n const providerIds = normalizeProviderIds(options.providerIds);\n if (provider) {\n assertProviderAllowed(provider, providerIds);\n }\n const configs = provider\n ? [getProviderApiConfig(provider)]\n : providerIds.map((id) => getProviderApiConfig(id));\n return configs.map((config) => ({\n id: config.id,\n label: config.label,\n defaultBaseUrl: config.defaultBaseUrl,\n baseUrlCredentialKey: config.baseUrlCredentialKey ?? null,\n auth: describeAuth(config.auth),\n credentialKeys: config.credentialKeys,\n docsUrls: config.docsUrls,\n specUrls: config.specUrls ?? [],\n allowedHostSuffixes: config.allowedHostSuffixes ?? [],\n placeholders: config.placeholders ?? [],\n defaultHeaders: config.defaultHeaders ?? {},\n examples: config.examples ?? [],\n notes: config.notes ?? [],\n templateUses: config.templateUses ?? [],\n }));\n}\n\nexport function createProviderApiRuntime(\n options: ProviderApiRuntimeOptions,\n): ProviderApiRuntime {\n const providerIds = normalizeProviderIds(options.providerIds);\n const runtimeOptions: Required<\n Pick<ProviderApiRuntimeOptions, \"appId\" | \"localCredentialSource\">\n > &\n Omit<ProviderApiRuntimeOptions, \"appId\" | \"localCredentialSource\"> = {\n ...options,\n providerIds,\n localCredentialSource: options.localCredentialSource ?? \"app_local\",\n };\n return {\n providerIds,\n listCatalog: (provider) =>\n listProviderApiCatalogWithCustom(\n provider,\n { providerIds },\n runtimeOptions,\n ),\n fetchDocs: (docsOptions) =>\n fetchProviderApiDocs(docsOptions, runtimeOptions),\n executeRequest: (args) => executeProviderApiRequest(args, runtimeOptions),\n };\n}\n\nexport async function fetchProviderApiDocs(\n options: {\n provider: ProviderApiId | string;\n url?: string;\n maxBytes?: number;\n },\n runtime: ProviderApiRuntimeOptions = { appId: \"app\" },\n) {\n await assertProviderAllowedAsync(options.provider, runtime);\n\n // Resolve config — may be a built-in or a custom provider.\n const builtIn = isProviderApiId(options.provider)\n ? getProviderApiConfig(options.provider)\n : null;\n const customConfig = builtIn\n ? null\n : await resolveCustomProvider(options.provider, runtime);\n\n if (!builtIn && !customConfig) {\n const known = await listAllProviderIds(runtime);\n throw new Error(\n `Unknown provider \"${options.provider}\". Known providers: ${known.join(\", \")}`,\n );\n }\n\n const catalog = builtIn\n ? listProviderApiCatalog(options.provider)[0]\n : customProviderToCatalogEntry(customConfig!);\n\n if (!options.url) {\n return {\n provider: options.provider,\n catalog,\n guidance:\n \"provider-api-docs can fetch ANY public http(s) URL — pass url to retrieve API documentation, OpenAPI specs, changelogs, or any public web page. Registered docsUrls above are curated starting points.\",\n };\n }\n\n // Open docs fetching: allow ANY public https/http URL.\n // The SSRF guard still applies — private/internal addresses are blocked.\n let url: URL;\n try {\n url = new URL(options.url);\n } catch {\n throw new Error(`Invalid docs URL: ${options.url}`);\n }\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new Error(`Docs URL must use https: or http: (got ${url.protocol})`);\n }\n if (await isBlockedExtensionUrlWithDns(url.href)) {\n throw new Error(`Blocked private/internal docs URL: ${url.href}`);\n }\n\n const response = await fetchWithTimeout(url.href, {\n method: \"GET\",\n maxBytes: clampMaxBytes(options.maxBytes),\n });\n return {\n provider: options.provider,\n catalog,\n request: { url: url.href },\n response,\n };\n}\n\nexport async function executeProviderApiRequest(\n args: ProviderApiRequestArgs,\n runtime: ProviderApiRuntimeOptions,\n) {\n await assertProviderAllowedAsync(args.provider, runtime);\n\n // Check whether this is a built-in or custom provider.\n const builtIn = isProviderApiId(args.provider)\n ? getProviderApiConfig(args.provider)\n : null;\n const customConfig = builtIn\n ? null\n : await resolveCustomProvider(args.provider, runtime);\n\n if (!builtIn && !customConfig) {\n const known = await listAllProviderIds(runtime);\n throw new Error(\n `Unknown provider \"${args.provider}\". Known providers: ${known.join(\", \")}`,\n );\n }\n\n if (customConfig) {\n return executeCustomProviderApiRequest(args, customConfig, runtime);\n }\n\n // --- built-in provider path (original code) ---\n const config = builtIn!;\n const ctx = requireRuntimeCredentialContext(\n runtime,\n config.credentialKeys[0] ?? config.id,\n );\n const baseUrl = await resolveBaseUrl(config, runtime, ctx, args);\n const placeholders = await resolvePlaceholders(config, runtime, ctx, args);\n const method = normalizeMethod(args.method);\n const url = buildProviderUrl({\n config,\n baseUrl,\n rawPath: substituteString(args.path, placeholders),\n query: substituteUnknown(args.query, placeholders),\n });\n if (await isBlockedExtensionUrlWithDns(url.href)) {\n throw new Error(`Blocked private/internal provider URL: ${url.href}`);\n }\n\n const auth =\n args.auth === \"none\"\n ? emptyAuth()\n : await resolveAuth(config, runtime, ctx, args);\n const extraHeaders = substituteUnknown(args.headers ?? {}, placeholders);\n const headers = sanitizeOutboundHeaders({\n ...(config.defaultHeaders ?? {}),\n ...(isPlainRecord(extraHeaders) ? extraHeaders : {}),\n ...auth.headers,\n });\n\n // Allow a much larger maxBytes ceiling when writing to a workspace file.\n const effectiveMaxBytes = args.saveToFile\n ? SAVE_TO_FILE_MAX_BYTES\n : clampMaxBytes(args.maxBytes);\n\n // --- fetchAllPages mode ---\n if (args.fetchAllPages) {\n const pageCfg = args.fetchAllPages;\n const { items, pageCount, lastStatus, lastContentType } =\n await fetchAllPages(pageCfg, async (extraQuery) => {\n const queryWithCursor = extraQuery\n ? mergeQueryObjects(\n substituteUnknown(args.query, placeholders),\n extraQuery,\n )\n : substituteUnknown(args.query, placeholders);\n const pageUrl = buildProviderUrl({\n config,\n baseUrl,\n rawPath: substituteString(args.path, placeholders),\n query: queryWithCursor,\n });\n const pageBody = prepareBody(\n substituteUnknown(args.body, placeholders),\n { ...headers },\n );\n const resp = await fetchWithTimeout(pageUrl.href, {\n method,\n headers,\n body: pageBody,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n return {\n text:\n resp.text ??\n (resp.json !== undefined ? JSON.stringify(resp.json) : \"\"),\n contentType: resp.contentType,\n status: resp.status,\n ok: resp.ok,\n };\n });\n\n const allItemsJson = JSON.stringify(items, null, 2);\n const metadata = {\n provider: { id: config.id, label: config.label },\n pagesRead: pageCount,\n totalItems: Array.isArray(items) ? items.length : 0,\n lastStatus,\n };\n\n if (args.saveToFile) {\n const saved = (await handleSaveToFile(\n args.saveToFile,\n allItemsJson,\n lastContentType ?? \"application/json\",\n lastStatus,\n )) as Record<string, unknown>;\n return { ...metadata, ...saved };\n }\n\n return { ...metadata, items };\n }\n\n // --- Single request ---\n const body = prepareBody(substituteUnknown(args.body, placeholders), headers);\n const response = await fetchWithTimeout(url.href, {\n method,\n headers,\n body,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n\n // saveToFile: write full body to workspace file and return compact summary.\n if (args.saveToFile) {\n const rawText =\n response.text ??\n (response.json !== undefined ? JSON.stringify(response.json) : \"\");\n const saved = (await handleSaveToFile(\n args.saveToFile,\n rawText,\n response.contentType,\n response.status,\n )) as Record<string, unknown>;\n return {\n provider: { id: config.id, label: config.label },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n },\n ...saved,\n };\n }\n\n return {\n provider: {\n id: config.id,\n label: config.label,\n docsUrls: config.docsUrls,\n specUrls: config.specUrls ?? [],\n },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n auth: args.auth === \"none\" ? \"none\" : describeAuth(config.auth),\n credentialSources: auth.credentialSources.map((source) => ({\n ...source,\n fingerprint: fingerprint(source.key),\n })),\n headerNames: Object.keys(headers).filter(\n (name) => name.toLowerCase() !== \"authorization\",\n ),\n ...(args.accountId ? { accountId: args.accountId } : {}),\n ...(args.connectionId ? { connectionId: args.connectionId } : {}),\n },\n response,\n guidance:\n \"This was a raw provider API request. Use provider docs/spec URLs to choose endpoints and include method/path/status plus relevant filters in the methodology. Prefer this escape hatch whenever canned actions are too narrow.\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Custom provider execution\n// ---------------------------------------------------------------------------\n\nasync function executeCustomProviderApiRequest(\n args: ProviderApiRequestArgs,\n customConfig: CustomProviderConfig,\n runtime: ProviderApiRuntimeOptions,\n): Promise<unknown> {\n const ctx = requireRuntimeCredentialContext(runtime, customConfig.id);\n const method = normalizeMethod(args.method);\n const baseUrl = customConfig.baseUrl;\n\n // Build a lightweight ProviderApiConfig-like object so we can reuse\n // buildProviderUrl (which validates allowed hosts).\n const syntheticConfig: ProviderApiConfig = {\n id: customConfig.id as ProviderApiId,\n label: customConfig.label,\n defaultBaseUrl: baseUrl,\n auth: { type: \"none\" },\n credentialKeys: [],\n docsUrls: customConfig.docsUrls,\n allowedHostSuffixes: customConfig.allowedHostSuffixes,\n defaultHeaders: customConfig.defaultHeaders,\n };\n\n const url = buildProviderUrl({\n config: syntheticConfig,\n baseUrl,\n rawPath: args.path,\n query: args.query,\n });\n\n if (await isBlockedExtensionUrlWithDns(url.href)) {\n throw new Error(`Blocked private/internal provider URL: ${url.href}`);\n }\n\n const auth =\n args.auth === \"none\"\n ? emptyAuth()\n : await resolveCustomAuth(customConfig, runtime, ctx, args);\n\n const extraHeaders = args.headers ?? {};\n const headers = sanitizeOutboundHeaders({\n ...(customConfig.defaultHeaders ?? {}),\n ...(isPlainRecord(extraHeaders) ? extraHeaders : {}),\n ...auth.headers,\n });\n const body = prepareBody(args.body, headers);\n\n const effectiveMaxBytes = args.saveToFile\n ? SAVE_TO_FILE_MAX_BYTES\n : clampMaxBytes(args.maxBytes);\n\n // --- fetchAllPages mode (same cursor pagination as built-in providers) ---\n if (args.fetchAllPages) {\n const pageCfg = args.fetchAllPages;\n const { items, pageCount, lastStatus, lastContentType } =\n await fetchAllPages(pageCfg, async (extraQuery) => {\n const queryWithCursor = extraQuery\n ? mergeQueryObjects(args.query, extraQuery)\n : args.query;\n const pageUrl = buildProviderUrl({\n config: syntheticConfig,\n baseUrl,\n rawPath: args.path,\n query: queryWithCursor,\n });\n const pageBody = prepareBody(args.body, { ...headers });\n const resp = await fetchWithTimeout(pageUrl.href, {\n method,\n headers,\n body: pageBody,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n return {\n text:\n resp.text ??\n (resp.json !== undefined ? JSON.stringify(resp.json) : \"\"),\n contentType: resp.contentType,\n status: resp.status,\n ok: resp.ok,\n };\n });\n\n const allItemsJson = JSON.stringify(items, null, 2);\n const metadata = {\n provider: {\n id: customConfig.id,\n label: customConfig.label,\n custom: true,\n },\n pagesRead: pageCount,\n totalItems: Array.isArray(items) ? items.length : 0,\n lastStatus,\n };\n\n if (args.saveToFile) {\n const saved = (await handleSaveToFile(\n args.saveToFile,\n allItemsJson,\n lastContentType ?? \"application/json\",\n lastStatus,\n )) as Record<string, unknown>;\n return { ...metadata, ...saved };\n }\n\n return { ...metadata, items };\n }\n\n const response = await fetchWithTimeout(url.href, {\n method,\n headers,\n body,\n maxBytes: effectiveMaxBytes,\n timeoutMs: clampTimeout(args.timeoutMs),\n secretValues: auth.secretValues,\n });\n\n if (args.saveToFile) {\n const rawText =\n response.text ??\n (response.json !== undefined ? JSON.stringify(response.json) : \"\");\n const saved = (await handleSaveToFile(\n args.saveToFile,\n rawText,\n response.contentType,\n response.status,\n )) as Record<string, unknown>;\n return {\n provider: {\n id: customConfig.id,\n label: customConfig.label,\n custom: true,\n },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n },\n ...saved,\n };\n }\n\n return {\n provider: {\n id: customConfig.id,\n label: customConfig.label,\n docsUrls: customConfig.docsUrls,\n specUrls: [],\n custom: true,\n },\n request: {\n method,\n url: redactString(url.href, auth.secretValues),\n path: redactString(`${url.pathname}${url.search}`, auth.secretValues),\n auth:\n args.auth === \"none\" ? \"none\" : describeCustomAuth(customConfig.auth),\n credentialSources: auth.credentialSources.map((source) => ({\n ...source,\n fingerprint: fingerprint(source.key),\n })),\n headerNames: Object.keys(headers).filter(\n (name) => name.toLowerCase() !== \"authorization\",\n ),\n },\n response,\n guidance:\n \"This was a raw provider API request to a custom provider. Use provider docs URLs to choose endpoints.\",\n };\n}\n\nasync function resolveCustomAuth(\n customConfig: CustomProviderConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<ResolvedAuth> {\n const auth = customConfig.auth;\n if (auth.type === \"none\") return emptyAuth();\n\n if (auth.type === \"bearer\") {\n const credential = await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.credentialKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { Authorization: `Bearer ${credential.value}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n\n if (auth.type === \"basic\") {\n const username = await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.usernameKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const password =\n auth.passwordKey === auth.usernameKey\n ? username\n : await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.passwordKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const encoded = Buffer.from(`${username.value}:${password.value}`).toString(\n \"base64\",\n );\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [\n omitCredentialValue(username),\n ...(password.key === username.key\n ? []\n : [omitCredentialValue(password)]),\n ],\n secretValues: [username.value, password.value, encoded],\n };\n }\n\n if (auth.type === \"api-key-header\") {\n const credential = await resolveRequiredCredentialByKey({\n provider: customConfig.id,\n key: auth.credentialKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { [auth.headerName]: credential.value },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n\n return emptyAuth();\n}\n\n/** Resolve a credential by key name (no workspace-provider lookup for custom). */\nasync function resolveRequiredCredentialByKey(options: {\n provider: string;\n key: string;\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n const localCredentialSource =\n options.runtime.localCredentialSource ?? \"app_local\";\n const lookup: ProviderApiCredentialLookupOptions = {\n appId: options.runtime.appId,\n provider: options.provider,\n key: options.key,\n ctx: options.ctx,\n workspaceProvider: undefined,\n connectionId: options.connectionId,\n localCredentialSource,\n };\n const resolver =\n options.runtime.resolveCredential ?? defaultProviderApiCredentialResolver;\n const credential = await resolver(lookup);\n if (!credential?.value) {\n throw new Error(\n `Credential \"${options.key}\" not configured for custom provider \"${options.provider}\".`,\n );\n }\n return credential;\n}\n\nfunction describeCustomAuth(auth: CustomProviderAuthKind): string {\n if (auth.type === \"none\") return \"none\";\n if (auth.type === \"bearer\") return \"bearer\";\n if (auth.type === \"basic\") return \"basic\";\n if (auth.type === \"api-key-header\")\n return `api-key-header:${auth.headerName}`;\n return \"unknown\";\n}\n\n// ---------------------------------------------------------------------------\n// Catalog helpers with custom provider support\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a custom provider to the same catalog shape as built-in providers.\n */\nfunction customProviderToCatalogEntry(config: CustomProviderConfig) {\n return {\n id: config.id,\n label: config.label,\n defaultBaseUrl: config.baseUrl,\n baseUrlCredentialKey: null,\n auth: describeCustomAuth(config.auth),\n credentialKeys: extractCredentialKeysFromCustomAuth(config.auth),\n docsUrls: config.docsUrls,\n specUrls: [] as string[],\n allowedHostSuffixes: config.allowedHostSuffixes,\n placeholders: [] as unknown[],\n defaultHeaders: config.defaultHeaders,\n examples: [] as unknown[],\n notes: config.notes ? [config.notes] : ([] as string[]),\n templateUses: [] as string[],\n custom: true,\n };\n}\n\nfunction extractCredentialKeysFromCustomAuth(\n auth: CustomProviderAuthKind,\n): string[] {\n if (auth.type === \"bearer\") return [auth.credentialKey];\n if (auth.type === \"basic\") {\n return auth.usernameKey === auth.passwordKey\n ? [auth.usernameKey]\n : [auth.usernameKey, auth.passwordKey];\n }\n if (auth.type === \"api-key-header\") return [auth.credentialKey];\n return [];\n}\n\n/**\n * List catalog entries including custom providers (merged after built-ins).\n */\nasync function listProviderApiCatalogWithCustom(\n provider: ProviderApiId | string | undefined,\n options: { providerIds?: readonly (ProviderApiId | string)[] },\n runtime: ProviderApiRuntimeOptions,\n): Promise<unknown[]> {\n const customConfigs = runtime.getCustomProviders\n ? await runtime.getCustomProviders()\n : [];\n\n if (provider) {\n // Check built-ins first\n if (isProviderApiId(provider)) {\n return listProviderApiCatalog(provider, options) as unknown[];\n }\n // Check custom\n const custom = customConfigs.find((c) => c.id === provider);\n if (custom) return [customProviderToCatalogEntry(custom)];\n const known = [\n ...normalizeProviderIds(options.providerIds),\n ...customConfigs.map((c) => c.id),\n ];\n throw new Error(\n `Unknown provider \"${provider}\". Known providers: ${known.join(\", \")}`,\n );\n }\n\n const builtInEntries = listProviderApiCatalog(\n undefined,\n options,\n ) as unknown[];\n const builtInIds = new Set(\n (options.providerIds ?? PROVIDER_API_IDS).map(String),\n );\n const customEntries = customConfigs\n .filter((c) => !builtInIds.has(c.id))\n .map(customProviderToCatalogEntry);\n return [...builtInEntries, ...customEntries];\n}\n\n/**\n * Look up a custom provider by id from the runtime loader.\n */\nasync function resolveCustomProvider(\n id: string,\n runtime: ProviderApiRuntimeOptions,\n): Promise<CustomProviderConfig | null> {\n if (!runtime.getCustomProviders) return null;\n const configs = await runtime.getCustomProviders();\n return configs.find((c) => c.id === id) ?? null;\n}\n\n/**\n * List all provider ids (built-in + custom) visible to this runtime.\n */\nasync function listAllProviderIds(\n runtime: ProviderApiRuntimeOptions,\n): Promise<string[]> {\n const builtIn = normalizeProviderIds(runtime.providerIds).map(String);\n if (!runtime.getCustomProviders) return builtIn;\n const custom = await runtime.getCustomProviders();\n return [...builtIn, ...custom.map((c) => c.id)];\n}\n\n/**\n * Assert that a provider is either a known built-in or a registered custom\n * provider. Throws with a descriptive message listing known providers.\n */\nasync function assertProviderAllowedAsync(\n provider: string,\n runtime: ProviderApiRuntimeOptions,\n): Promise<void> {\n // Built-in check (fast path)\n if (isProviderApiId(provider)) {\n // Still check the providerIds whitelist if set\n const allowed = normalizeProviderIds(runtime.providerIds);\n if (!allowed.includes(provider as ProviderApiId)) {\n throw new Error(`Provider API ${provider} is not enabled for this app.`);\n }\n return;\n }\n // Custom provider check\n const custom = await resolveCustomProvider(provider, runtime);\n if (custom) return;\n const known = await listAllProviderIds(runtime);\n throw new Error(\n `Unknown provider \"${provider}\". Known providers: ${known.join(\", \")}`,\n );\n}\n\nexport async function defaultProviderApiCredentialResolver(\n options: ProviderApiCredentialLookupOptions,\n): Promise<ProviderApiResolvedCredential | null> {\n if (options.workspaceProvider) {\n const result = await resolveWorkspaceConnectionCredentialForApp({\n appId: options.appId,\n provider: options.workspaceProvider,\n key: options.key,\n connectionId: options.connectionId,\n userEmail: options.ctx.userEmail,\n orgId: options.ctx.orgId,\n });\n if (result.available && result.value) {\n return {\n key: result.provenance?.resolvedKey ?? result.key,\n value: result.value,\n source: \"workspace_connection\",\n provider: result.provider,\n connectionId: result.provenance?.connectionId,\n connectionLabel: result.provenance?.connectionLabel,\n scope:\n typeof result.provenance?.secretScope === \"string\"\n ? result.provenance.secretScope\n : undefined,\n };\n }\n }\n\n const value = await resolveCredential(options.key, options.ctx);\n if (!value) return null;\n return {\n key: options.key,\n value,\n source: options.localCredentialSource,\n provider: options.provider,\n };\n}\n\nfunction normalizeProviderIds(\n providerIds?: readonly (ProviderApiId | string)[],\n): ProviderApiId[] {\n if (!providerIds) return [...PROVIDER_API_IDS];\n const result: ProviderApiId[] = [];\n const seen = new Set<string>();\n for (const providerId of providerIds) {\n if (!isProviderApiId(providerId)) {\n throw new Error(`Unsupported provider API: ${providerId}`);\n }\n if (seen.has(providerId)) continue;\n seen.add(providerId);\n result.push(providerId);\n }\n return result;\n}\n\nfunction assertProviderAllowed(\n provider: ProviderApiId | string,\n providerIds?: readonly (ProviderApiId | string)[],\n) {\n const allowed = normalizeProviderIds(providerIds);\n if (!allowed.includes(provider as ProviderApiId)) {\n throw new Error(`Provider API ${provider} is not enabled for this app.`);\n }\n}\n\nfunction describeAuth(auth: ProviderApiAuthKind): string {\n if (auth.type === \"none\") return \"none\";\n if (auth.type === \"bearer\") return \"bearer\";\n if (auth.type === \"basic\") return \"basic\";\n if (auth.type === \"basic-raw\") return \"basic\";\n if (auth.type === \"api-key-header\") return `api-key-header:${auth.header}`;\n if (auth.type === \"google-service-account\") return \"google-service-account\";\n if (auth.type === \"oauth-bearer\") return `oauth-bearer:${auth.oauthProvider}`;\n return \"prometheus-basic-or-bearer\";\n}\n\nfunction requireRuntimeCredentialContext(\n runtime: ProviderApiRuntimeOptions,\n credentialKey: string,\n): CredentialContext {\n const ctx = runtime.getCredentialContext?.() ?? getCredentialContext();\n if (!ctx) {\n throw new Error(\n `Cannot resolve credential \"${credentialKey}\" outside an authenticated request context.`,\n );\n }\n return ctx;\n}\n\nasync function resolveBaseUrl(\n config: ProviderApiConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<string> {\n if (!config.baseUrlCredentialKey) return config.defaultBaseUrl;\n const configured = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: config.baseUrlCredentialKey,\n args,\n });\n return (configured || config.defaultBaseUrl).replace(/\\/+$/, \"\");\n}\n\nasync function resolvePlaceholders(\n config: ProviderApiConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<Record<string, string>> {\n const placeholders: Record<string, string> = {};\n for (const placeholder of config.placeholders ?? []) {\n const value = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: placeholder.credentialKey,\n args,\n });\n if (value) placeholders[placeholder.name] = value;\n }\n return placeholders;\n}\n\nasync function resolveCredentialValue(options: {\n config: ProviderApiConfig;\n runtime: ProviderApiRuntimeOptions;\n ctx: CredentialContext;\n key: string;\n args: ProviderApiRequestArgs;\n workspaceProvider?: string;\n}): Promise<string | undefined> {\n const credential = await resolveOptionalCredential({\n provider: options.config.id,\n workspaceProvider: options.workspaceProvider,\n key: options.key,\n ctx: options.ctx,\n runtime: options.runtime,\n connectionId: options.args.connectionId,\n });\n return credential?.value;\n}\n\nfunction substituteString(\n value: string,\n placeholders: Record<string, string>,\n): string {\n let result = value;\n for (const [name, replacement] of Object.entries(placeholders)) {\n result = result.split(`{${name}}`).join(replacement);\n }\n return result;\n}\n\nfunction substituteUnknown(\n value: unknown,\n placeholders: Record<string, string>,\n): unknown {\n if (typeof value === \"string\") return substituteString(value, placeholders);\n if (Array.isArray(value)) {\n return value.map((item) => substituteUnknown(item, placeholders));\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n substituteUnknown(entry, placeholders),\n ]),\n );\n }\n return value;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction buildProviderUrl(options: {\n config: ProviderApiConfig;\n baseUrl: string;\n rawPath: string;\n query: unknown;\n}): URL {\n const base = new URL(options.baseUrl);\n const rawPath = options.rawPath.trim();\n const url = /^https?:\\/\\//i.test(rawPath)\n ? new URL(rawPath)\n : new URL(joinProviderUrlPath(base, rawPath), base.origin);\n\n if (!isAllowedProviderUrl(url, base, options.config)) {\n throw new Error(\n `${options.config.label} API requests must stay on the configured provider host or registered provider host suffix.`,\n );\n }\n\n for (const [key, value] of queryEntries(options.query)) {\n url.searchParams.append(key, value);\n }\n\n return url;\n}\n\nfunction joinProviderUrlPath(base: URL, rawPath: string): string {\n const basePath = base.pathname.replace(/\\/+$/, \"\");\n const providerPath = rawPath.replace(/^\\/+/, \"\");\n if (!providerPath) return basePath || \"/\";\n return `${basePath}/${providerPath}`;\n}\n\nfunction isAllowedProviderUrl(\n url: URL,\n base: URL,\n config: ProviderApiConfig,\n): boolean {\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return false;\n if (url.origin === base.origin) return true;\n const host = url.hostname.toLowerCase();\n return (config.allowedHostSuffixes ?? []).some((suffix) => {\n const normalized = suffix.toLowerCase().replace(/^\\./, \"\");\n return host === normalized || host.endsWith(`.${normalized}`);\n });\n}\n\nfunction queryEntries(value: unknown): Array<[string, string]> {\n if (!value) return [];\n if (typeof value === \"string\") {\n const params = new URLSearchParams(value.replace(/^\\?/, \"\"));\n return Array.from(params.entries());\n }\n if (typeof value !== \"object\" || Array.isArray(value)) return [];\n const entries: Array<[string, string]> = [];\n for (const [key, raw] of Object.entries(value)) {\n if (raw === undefined || raw === null) continue;\n if (Array.isArray(raw)) {\n for (const item of raw) entries.push([key, String(item)]);\n } else {\n entries.push([key, String(raw)]);\n }\n }\n return entries;\n}\n\nasync function resolveAuth(\n config: ProviderApiConfig,\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n args: ProviderApiRequestArgs,\n): Promise<ResolvedAuth> {\n const auth = config.auth;\n if (auth.type === \"none\") return emptyAuth();\n if (auth.type === \"bearer\") {\n const credential = await resolveAnyCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n keys: auth.keys,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { Authorization: `Bearer ${credential.value}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n if (auth.type === \"basic\") {\n const username = await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.usernameKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const password =\n auth.passwordKey === auth.usernameKey\n ? username\n : await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.passwordKey,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const encoded = Buffer.from(`${username.value}:${password.value}`).toString(\n \"base64\",\n );\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [\n omitCredentialValue(username),\n ...(password.key === username.key\n ? []\n : [omitCredentialValue(password)]),\n ],\n secretValues: [username.value, password.value, encoded],\n };\n }\n if (auth.type === \"basic-raw\") {\n const credential = await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.key,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n const encoded = Buffer.from(credential.value).toString(\"base64\");\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value, encoded],\n };\n }\n if (auth.type === \"api-key-header\") {\n const credential = await resolveRequiredCredential({\n provider: config.id,\n workspaceProvider: auth.workspaceProvider,\n key: auth.key,\n ctx,\n runtime,\n connectionId: args.connectionId,\n });\n return {\n headers: { [auth.header]: credential.value },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n if (auth.type === \"google-service-account\") {\n const token = await getGoogleServiceAccountToken(auth.scopes, runtime, ctx);\n return {\n headers: { Authorization: `Bearer ${token}` },\n credentialSources: [\n {\n key: \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n ],\n secretValues: [token],\n };\n }\n if (auth.type === \"oauth-bearer\") {\n const oauthProvider =\n runtime.oauthProviderOverrides?.[config.id] ?? auth.oauthProvider;\n const credential = await resolveOAuthBearerToken({\n auth: { ...auth, oauthProvider },\n ctx,\n accountId: args.accountId,\n });\n return {\n headers: { Authorization: `Bearer ${credential.value}` },\n credentialSources: [omitCredentialValue(credential)],\n secretValues: [credential.value],\n };\n }\n\n const bearer = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: \"PROMETHEUS_BEARER_TOKEN\",\n args,\n });\n if (bearer) {\n return {\n headers: { Authorization: `Bearer ${bearer}` },\n credentialSources: [\n {\n key: \"PROMETHEUS_BEARER_TOKEN\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n ],\n secretValues: [bearer],\n };\n }\n const username = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: \"PROMETHEUS_USERNAME\",\n args,\n });\n const password = await resolveCredentialValue({\n config,\n runtime,\n ctx,\n key: \"PROMETHEUS_PASSWORD\",\n args,\n });\n if (username && password) {\n const encoded = Buffer.from(`${username}:${password}`).toString(\"base64\");\n return {\n headers: { Authorization: `Basic ${encoded}` },\n credentialSources: [\n {\n key: \"PROMETHEUS_USERNAME\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n {\n key: \"PROMETHEUS_PASSWORD\",\n provider: config.id,\n source: runtime.localCredentialSource ?? \"app_local\",\n },\n ],\n secretValues: [username, password, encoded],\n };\n }\n return emptyAuth();\n}\n\nfunction emptyAuth(): ResolvedAuth {\n return { headers: {}, credentialSources: [], secretValues: [] };\n}\n\nasync function resolveAnyCredential(options: {\n provider: ProviderApiId;\n workspaceProvider: string | undefined;\n keys: readonly string[];\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n for (const key of options.keys) {\n const credential = await resolveOptionalCredential({ ...options, key });\n if (credential?.value) return credential;\n }\n throw new Error(\n `${options.provider} credential not configured. Tried: ${options.keys.join(\n \", \",\n )}`,\n );\n}\n\nasync function resolveRequiredCredential(options: {\n provider: ProviderApiId;\n workspaceProvider: string | undefined;\n key: string;\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n const credential = await resolveOptionalCredential(options);\n if (!credential?.value) throw new Error(`${options.key} not configured`);\n return credential;\n}\n\nasync function resolveOptionalCredential(options: {\n provider: ProviderApiId;\n workspaceProvider: string | undefined;\n key: string;\n ctx: CredentialContext;\n runtime: ProviderApiRuntimeOptions;\n connectionId?: string | null;\n}): Promise<ProviderApiResolvedCredential | null> {\n const localCredentialSource =\n options.runtime.localCredentialSource ?? \"app_local\";\n const lookup: ProviderApiCredentialLookupOptions = {\n appId: options.runtime.appId,\n provider: options.provider,\n key: options.key,\n ctx: options.ctx,\n workspaceProvider: options.workspaceProvider,\n connectionId: options.connectionId,\n localCredentialSource,\n };\n if (options.runtime.resolveCredential) {\n return options.runtime.resolveCredential(lookup);\n }\n return defaultProviderApiCredentialResolver(lookup);\n}\n\nfunction omitCredentialValue(\n credential: ProviderApiResolvedCredential,\n): Omit<ProviderApiResolvedCredential, \"value\"> {\n const { value: _value, ...rest } = credential;\n return rest;\n}\n\nconst googleServiceTokenCache = new Map<\n string,\n { token: string; expiresAt: number }\n>();\n\nasync function getGoogleServiceAccountToken(\n scopes: readonly string[],\n runtime: ProviderApiRuntimeOptions,\n ctx: CredentialContext,\n): Promise<string> {\n const cacheKey = createHash(\"sha256\")\n .update(\n `${runtime.appId}:${ctx.orgId ?? ctx.userEmail}:${scopes.join(\" \")}`,\n )\n .digest(\"hex\");\n const cached = googleServiceTokenCache.get(cacheKey);\n if (cached && Date.now() < cached.expiresAt - 30_000) return cached.token;\n\n const credsJson = await resolveCredentialValue({\n config: getProviderApiConfig(\"gcloud\"),\n runtime,\n ctx,\n key: \"GOOGLE_APPLICATION_CREDENTIALS_JSON\",\n args: { provider: \"gcloud\", path: \"/\" },\n });\n if (!credsJson) {\n throw new Error(\"GOOGLE_APPLICATION_CREDENTIALS_JSON not configured\");\n }\n let creds: {\n type?: string;\n client_email?: string;\n private_key?: string;\n token_uri?: string;\n };\n try {\n creds = JSON.parse(credsJson) as typeof creds;\n } catch {\n throw new Error(\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON is not valid JSON. Upload a service account JSON key.\",\n );\n }\n if (!creds.client_email || !creds.private_key) {\n throw new Error(\n \"GOOGLE_APPLICATION_CREDENTIALS_JSON must be a service account JSON key.\",\n );\n }\n\n const now = Math.floor(Date.now() / 1000);\n const aud = creds.token_uri || \"https://oauth2.googleapis.com/token\";\n const jwt = await signRs256Jwt(\n {\n iss: creds.client_email,\n scope: scopes.join(\" \"),\n aud,\n iat: now,\n exp: now + 3600,\n },\n creds.private_key,\n );\n const res = await fetch(aud, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n assertion: jwt,\n }),\n });\n if (!res.ok) {\n throw new Error(`Google OAuth error ${res.status}: ${await res.text()}`);\n }\n const data = (await res.json()) as {\n access_token: string;\n expires_in?: number;\n };\n googleServiceTokenCache.set(cacheKey, {\n token: data.access_token,\n expiresAt: Date.now() + (data.expires_in ?? 3600) * 1000,\n });\n return data.access_token;\n}\n\nasync function resolveOAuthBearerToken(options: {\n auth: Extract<ProviderApiAuthKind, { type: \"oauth-bearer\" }>;\n ctx: CredentialContext;\n accountId?: string | null;\n}): Promise<ProviderApiResolvedCredential> {\n const accounts = await listOAuthAccountsByOwner(\n options.auth.oauthProvider,\n options.ctx.userEmail,\n );\n if (accounts.length === 0) {\n throw new Error(\n `${options.auth.tokenLabel} is not connected for ${options.ctx.userEmail}.`,\n );\n }\n const accountId = options.accountId?.trim();\n const account = accountId\n ? accounts.find((entry) => entry.accountId === accountId)\n : accounts[0];\n if (!account) {\n throw new Error(\n `${options.auth.tokenLabel} account ${accountId} is not available to ${options.ctx.userEmail}.`,\n );\n }\n const tokens = account.tokens as OAuthTokens;\n const token = await getValidOAuthAccessToken({\n oauthProvider: options.auth.oauthProvider,\n accountId: account.accountId,\n ownerEmail: options.ctx.userEmail,\n tokens,\n });\n return {\n key: `${options.auth.oauthProvider.toUpperCase()}_OAUTH_TOKEN`,\n value: token,\n source: \"oauth_token\",\n provider: options.auth.oauthProvider,\n accountId: account.accountId,\n accountLabel: account.displayName,\n };\n}\n\nasync function getValidOAuthAccessToken(options: {\n oauthProvider: string;\n accountId: string;\n ownerEmail: string;\n tokens: OAuthTokens;\n}): Promise<string> {\n const accessToken =\n options.tokens.access_token ?? options.tokens.accessToken ?? \"\";\n if (!accessToken) {\n throw new Error(\n `${options.oauthProvider} OAuth account has no access token.`,\n );\n }\n const expiresAt = options.tokens.expiry_date ?? options.tokens.expiresAt;\n if (\n !expiresAt ||\n !Number.isFinite(expiresAt) ||\n expiresAt > Date.now() + 60_000\n ) {\n return accessToken;\n }\n\n const refreshToken =\n options.tokens.refresh_token ?? options.tokens.refreshToken;\n if (!refreshToken) return accessToken;\n if (\n options.oauthProvider === \"google\" ||\n options.oauthProvider === \"google-docs\"\n ) {\n return refreshGoogleOAuthToken(options, refreshToken);\n }\n throw new Error(\n `${options.oauthProvider} OAuth token is expired and automatic refresh is not configured for provider-api.`,\n );\n}\n\nasync function refreshGoogleOAuthToken(\n options: {\n oauthProvider: string;\n accountId: string;\n ownerEmail: string;\n tokens: OAuthTokens;\n },\n refreshToken: string,\n): Promise<string> {\n const clientId = process.env.GOOGLE_CLIENT_ID;\n const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n if (!clientId || !clientSecret) {\n throw new Error(\n \"GOOGLE_CLIENT_ID/SECRET not set for Google OAuth refresh.\",\n );\n }\n const res = await fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n refresh_token: refreshToken,\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: \"refresh_token\",\n }),\n });\n const data = (await res.json()) as {\n access_token?: string;\n expires_in?: number;\n token_type?: string;\n scope?: string;\n error?: string;\n error_description?: string;\n };\n if (!res.ok || !data.access_token) {\n if (data.error && PERMANENT_GOOGLE_OAUTH_REFRESH_ERRORS.has(data.error)) {\n await deleteOAuthTokens(options.oauthProvider, options.accountId);\n }\n const detail = data.error_description ?? data.error ?? res.statusText;\n throw new Error(`Google OAuth refresh failed: ${detail}`);\n }\n const merged: OAuthTokens = {\n ...options.tokens,\n access_token: data.access_token,\n expiry_date: Date.now() + (data.expires_in ?? 3600) * 1000,\n token_type: data.token_type ?? options.tokens.token_type,\n scope: data.scope ?? options.tokens.scope,\n };\n await saveOAuthTokens(\n options.oauthProvider,\n options.accountId,\n merged as unknown as Record<string, unknown>,\n options.ownerEmail,\n );\n return data.access_token;\n}\n\nfunction normalizeMethod(\n method: ProviderApiMethod | undefined,\n): ProviderApiMethod {\n const normalized = String(method || \"GET\").toUpperCase();\n if (\n normalized === \"GET\" ||\n normalized === \"POST\" ||\n normalized === \"PUT\" ||\n normalized === \"PATCH\" ||\n normalized === \"DELETE\" ||\n normalized === \"HEAD\"\n ) {\n return normalized;\n }\n throw new Error(`Unsupported HTTP method: ${method}`);\n}\n\nfunction sanitizeOutboundHeaders(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const headers: Record<string, string> = {};\n for (const [name, rawValue] of Object.entries(value)) {\n const lower = name.toLowerCase();\n if (!HEADER_NAME_RE.test(name) || BLOCKED_OUTBOUND_HEADERS.has(lower)) {\n continue;\n }\n if (rawValue === undefined || rawValue === null) continue;\n const headerValue = String(rawValue);\n if (/[\\r\\n]/.test(headerValue)) continue;\n headers[name] = headerValue;\n }\n return headers;\n}\n\nfunction prepareBody(\n body: unknown,\n headers: Record<string, string>,\n): BodyInit | undefined {\n if (body === undefined || body === null) return undefined;\n if (typeof body === \"string\") return body;\n const hasContentType = Object.keys(headers).some(\n (name) => name.toLowerCase() === \"content-type\",\n );\n if (!hasContentType) headers[\"Content-Type\"] = \"application/json\";\n return JSON.stringify(body);\n}\n\nasync function fetchWithTimeout(\n optionsUrl: string,\n options: {\n method?: ProviderApiMethod;\n headers?: Record<string, string>;\n body?: BodyInit;\n timeoutMs?: number;\n maxBytes?: number;\n secretValues?: string[];\n },\n) {\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n clampTimeout(options.timeoutMs),\n );\n try {\n const dispatcher = (await createSsrfSafeDispatcher()) ?? undefined;\n const fetchOptions: RequestInit & { dispatcher?: unknown } = {\n method: options.method ?? \"GET\",\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n redirect: \"manual\",\n };\n if (dispatcher) fetchOptions.dispatcher = dispatcher;\n const startedAt = Date.now();\n const res = await fetch(optionsUrl, fetchOptions);\n const elapsedMs = Date.now() - startedAt;\n const rawText = await readResponseTextWithLimit(\n res,\n clampMaxBytes(options.maxBytes),\n );\n const secretValues = options.secretValues ?? [];\n const redactedText = redactString(rawText.text, secretValues);\n const parsed = tryParseJson(redactedText);\n return {\n status: res.status,\n statusText: res.statusText,\n ok: res.ok,\n elapsedMs,\n headers: redactSecrets(headersToObject(res.headers), secretValues),\n contentType: res.headers.get(\"content-type\") ?? null,\n size: rawText.size,\n truncated: rawText.truncated,\n text: parsed === undefined ? redactedText : undefined,\n json: parsed,\n };\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function readResponseTextWithLimit(\n response: Response,\n maxBytes: number,\n): Promise<{ text: string; truncated: boolean; size: number }> {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && Number(contentLength) > maxBytes) {\n return {\n text: `(response too large - ${contentLength} bytes, max ${maxBytes})`,\n truncated: true,\n size: Number(contentLength),\n };\n }\n const buffer = await response.arrayBuffer();\n const size = buffer.byteLength;\n const bytes = new Uint8Array(buffer.slice(0, maxBytes));\n return {\n text: new TextDecoder().decode(bytes),\n truncated: size > maxBytes,\n size,\n };\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n if (key.toLowerCase() !== \"set-cookie\") result[key] = value;\n });\n return result;\n}\n\nfunction tryParseJson(text: string): unknown | undefined {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return undefined;\n try {\n return JSON.parse(trimmed);\n } catch {\n return undefined;\n }\n}\n\nfunction redactSecrets<T>(value: T, secretValues: string[]): T {\n if (secretValues.length === 0) return value;\n if (typeof value === \"string\") return redactString(value, secretValues) as T;\n if (Array.isArray(value)) {\n return value.map((item) => redactSecrets(item, secretValues)) as T;\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactSecrets(entry, secretValues),\n ]),\n ) as T;\n }\n return value;\n}\n\nfunction redactString(text: string, secretValues: string[]): string {\n let output = text;\n for (const secret of [...secretValues].sort((a, b) => b.length - a.length)) {\n if (!secret) continue;\n output = output.split(secret).join(\"[redacted]\");\n try {\n output = output.split(encodeURIComponent(secret)).join(\"[redacted]\");\n } catch {}\n }\n return output;\n}\n\nfunction mergeQueryObjects(\n base: unknown,\n extra: Record<string, string>,\n): unknown {\n if (!base) return extra;\n if (typeof base === \"string\") {\n const params = new URLSearchParams(base.replace(/^\\?/, \"\"));\n for (const [key, value] of Object.entries(extra)) {\n params.set(key, value);\n }\n return params.toString();\n }\n if (typeof base === \"object\" && !Array.isArray(base)) {\n return { ...(base as Record<string, unknown>), ...extra };\n }\n return extra;\n}\n\nfunction clampTimeout(timeoutMs: number | undefined): number {\n if (!Number.isFinite(timeoutMs)) return DEFAULT_TIMEOUT_MS;\n return Math.max(1_000, Math.min(MAX_TIMEOUT_MS, Math.floor(timeoutMs!)));\n}\n\nfunction clampMaxBytes(maxBytes: number | undefined): number {\n if (!Number.isFinite(maxBytes)) return DEFAULT_MAX_BYTES;\n return Math.max(1_000, Math.min(MAX_MAX_BYTES, Math.floor(maxBytes!)));\n}\n\n/** Resolve a dot-path from a parsed JSON object, e.g. \"meta.next_cursor\". */\nfunction dotGet(obj: unknown, path: string): unknown {\n if (!path) return obj;\n let current: unknown = obj;\n for (const key of path.split(\".\")) {\n if (current === null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\n/**\n * Handle saveToFile: write the full provider-api response body to a workspace\n * file and return a compact summary.\n */\nasync function handleSaveToFile(\n filePath: string,\n responseText: string,\n contentType: string | null,\n status: number,\n): Promise<unknown> {\n const { writeWorkspaceFile, SAVE_TO_FILE_MAX_BYTES: maxSaveBytes } =\n await import(\"../workspace-files/store.js\");\n const { getRequestOrgId, getRequestUserEmail } =\n await import(\"../server/request-context.js\");\n\n const orgId = getRequestOrgId();\n const email = getRequestUserEmail();\n const scope = orgId\n ? { scope: \"org\" as const, scopeId: orgId }\n : email\n ? { scope: \"user\" as const, scopeId: email }\n : null;\n\n if (!scope) {\n throw new Error(\n \"saveToFile requires an authenticated request context (no user email or orgId found).\",\n );\n }\n\n const mimeType = contentType?.split(\";\")[0].trim() ?? \"text/plain\";\n await writeWorkspaceFile(scope, filePath, responseText, mimeType, {\n maxFileBytes: maxSaveBytes,\n });\n const bytes = Buffer.byteLength(responseText, \"utf8\");\n const preview = responseText.slice(0, 2000);\n return {\n savedToFile: true,\n savedTo: filePath,\n status,\n bytes,\n contentType: mimeType,\n preview: preview.length < responseText.length ? `${preview}…` : preview,\n };\n}\n\n/**\n * Execute paginated requests, accumulating items across pages.\n * Returns the accumulated items array and the last response for metadata.\n */\nasync function fetchAllPages(\n config: FetchAllPagesConfig,\n executeOnePage: (extraQuery?: Record<string, string>) => Promise<{\n text: string;\n contentType: string | null;\n status: number;\n ok: boolean;\n }>,\n): Promise<{\n items: unknown[];\n pageCount: number;\n lastStatus: number;\n lastContentType: string | null;\n}> {\n const maxPages = Math.min(\n Number.isFinite(config.maxPages) && config.maxPages! > 0\n ? config.maxPages!\n : 10,\n FETCH_ALL_PAGES_MAX,\n );\n\n const items: unknown[] = [];\n let cursor: string | undefined;\n let pageCount = 0;\n let lastStatus = 0;\n let lastContentType: string | null = null;\n\n while (pageCount < maxPages) {\n const extraQuery: Record<string, string> = {};\n if (cursor) extraQuery[config.cursorParam] = cursor;\n\n const page = await executeOnePage(pageCount > 0 ? extraQuery : undefined);\n lastStatus = page.status;\n lastContentType = page.contentType;\n pageCount++;\n\n let body: unknown;\n try {\n body = JSON.parse(page.text);\n } catch {\n body = page.text;\n }\n\n // Extract items\n if (config.itemsPath) {\n const extracted = dotGet(body, config.itemsPath);\n if (Array.isArray(extracted)) {\n items.push(...extracted);\n } else if (extracted !== undefined) {\n items.push(extracted);\n }\n } else {\n items.push(body);\n }\n\n // Extract next cursor\n const nextCursor = dotGet(body, config.cursorPath);\n if (\n !nextCursor ||\n nextCursor === \"\" ||\n nextCursor === null ||\n nextCursor === cursor\n ) {\n break;\n }\n cursor = String(nextCursor);\n }\n\n return { items, pageCount, lastStatus, lastContentType };\n}\n\nfunction fingerprint(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 1) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nfunction base64UrlEncodeString(value: string): string {\n return base64UrlEncode(new TextEncoder().encode(value));\n}\n\nfunction pemToPkcs8(pem: string): Uint8Array {\n const body = pem\n .replace(/-----BEGIN [^-]+-----/g, \"\")\n .replace(/-----END [^-]+-----/g, \"\")\n .replace(/\\s+/g, \"\");\n const binary = atob(body);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n out[i] = binary.charCodeAt(i);\n }\n return out;\n}\n\nconst keyCache = new Map<string, Promise<CryptoKey>>();\n\nasync function privateKeyCacheKey(privateKeyPem: string): Promise<string> {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(privateKeyPem) as BufferSource,\n );\n return `sha256:${base64UrlEncode(new Uint8Array(digest))}`;\n}\n\nasync function importRs256Key(privateKeyPem: string): Promise<CryptoKey> {\n const cacheKey = await privateKeyCacheKey(privateKeyPem);\n let cached = keyCache.get(cacheKey);\n if (!cached) {\n cached = crypto.subtle.importKey(\n \"pkcs8\",\n pemToPkcs8(privateKeyPem) as BufferSource,\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n keyCache.set(cacheKey, cached);\n }\n return cached;\n}\n\nasync function signRs256Jwt(\n payload: Record<string, unknown>,\n privateKeyPem: string,\n): Promise<string> {\n const header = { alg: \"RS256\", typ: \"JWT\" };\n const signingInput = `${base64UrlEncodeString(\n JSON.stringify(header),\n )}.${base64UrlEncodeString(JSON.stringify(payload))}`;\n\n const key = await importRs256Key(privateKeyPem);\n const signature = await crypto.subtle.sign(\n \"RSASSA-PKCS1-v1_5\",\n key,\n new TextEncoder().encode(signingInput) as BufferSource,\n );\n\n return `${signingInput}.${base64UrlEncode(new Uint8Array(signature))}`;\n}\n"]}
|
|
@@ -104,7 +104,9 @@ Do not build an umbrella REST API to make actions "easier" to call. Actions are
|
|
|
104
104
|
|
|
105
105
|
For provider integrations used in ad hoc analysis, querying, reporting, or
|
|
106
106
|
cross-source research, do not hardcode every provider endpoint as a separate
|
|
107
|
-
rigid action
|
|
107
|
+
rigid action and do not encode one lookback window, filter shape, or pagination
|
|
108
|
+
strategy as the only path the agent can take. Expose the shared provider API
|
|
109
|
+
action trio instead:
|
|
108
110
|
|
|
109
111
|
- `provider-api-catalog`: lists provider base URLs, auth style, credential keys,
|
|
110
112
|
docs/spec URLs, placeholders, and examples without exposing secrets.
|
|
@@ -117,11 +119,25 @@ rigid action. Expose the shared provider API action trio instead:
|
|
|
117
119
|
|
|
118
120
|
Use `@agent-native/core/provider-api` as the shared substrate. A template should
|
|
119
121
|
only add a thin credential adapter when it has app-specific credential lookup
|
|
120
|
-
rules.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
rules. If the app stores a built-in provider's OAuth grant under a narrower
|
|
123
|
+
local provider id, use the runtime's `oauthProviderOverrides` instead of
|
|
124
|
+
duplicating the provider config. If credentials are stored on shareable/resource
|
|
125
|
+
rows rather than in the shared credential or OAuth-token stores, build a resolver
|
|
126
|
+
that enforces those access checks before exposing raw provider requests. Keep
|
|
127
|
+
`provider-api-request` `http: false` unless you have a separate UI permission
|
|
128
|
+
model for arbitrary provider writes. Specific actions such as `hubspot-deals`,
|
|
129
|
+
`search-emails`, or `sync-source` are convenience shortcuts, not capability
|
|
130
|
+
limits; agents should fall back to the provider API trio when a question
|
|
131
|
+
requires an endpoint or filter that the shortcut does not model.
|
|
132
|
+
|
|
133
|
+
This is a framework tenet. The safety boundary should be provider host
|
|
134
|
+
allow-listing, credential scoping, auth injection, private-network blocking,
|
|
135
|
+
secret redaction, and user/org access checks, not an artificially small set of
|
|
136
|
+
hand-authored read actions. If the upstream provider API supports a capability,
|
|
137
|
+
the agent should normally be able to reach it through `provider-api-request`
|
|
138
|
+
with the user's configured credentials. For large responses, expose staging
|
|
139
|
+
(`stageAs`, `itemsPath`, pagination, and `query-staged-dataset`) or sandboxed
|
|
140
|
+
code execution so the agent can reduce data without flooding context.
|
|
125
141
|
|
|
126
142
|
### The `http` Option
|
|
127
143
|
|
|
@@ -59,7 +59,13 @@ For provider-backed analysis/query/reporting integrations, do not turn every
|
|
|
59
59
|
provider endpoint or filter into a rigid action. Prefer the shared
|
|
60
60
|
`provider-api-catalog` / `provider-api-docs` / `provider-api-request` pattern
|
|
61
61
|
from `@agent-native/core/provider-api`, then add narrow convenience actions only
|
|
62
|
-
for workflows that truly deserve a first-class shortcut.
|
|
62
|
+
for workflows that truly deserve a first-class shortcut. Treat this as a
|
|
63
|
+
capability requirement, not a nice-to-have: convenience actions must not become
|
|
64
|
+
the ceiling of what the agent can ask the provider to do. Pair broad provider
|
|
65
|
+
access with staging or sandboxed code execution when responses may be too large
|
|
66
|
+
for chat context. If provider credentials live on resource/share rows, add the
|
|
67
|
+
scoped resolver first so broad access preserves the same ownership boundary as
|
|
68
|
+
the app UI.
|
|
63
69
|
|
|
64
70
|
If the feature needs credentials, design the credential path in the same change.
|
|
65
71
|
Never hardcode API keys, tokens, webhook URLs, signing secrets, private
|
|
@@ -104,7 +104,9 @@ Do not build an umbrella REST API to make actions "easier" to call. Actions are
|
|
|
104
104
|
|
|
105
105
|
For provider integrations used in ad hoc analysis, querying, reporting, or
|
|
106
106
|
cross-source research, do not hardcode every provider endpoint as a separate
|
|
107
|
-
rigid action
|
|
107
|
+
rigid action and do not encode one lookback window, filter shape, or pagination
|
|
108
|
+
strategy as the only path the agent can take. Expose the shared provider API
|
|
109
|
+
action trio instead:
|
|
108
110
|
|
|
109
111
|
- `provider-api-catalog`: lists provider base URLs, auth style, credential keys,
|
|
110
112
|
docs/spec URLs, placeholders, and examples without exposing secrets.
|
|
@@ -117,11 +119,25 @@ rigid action. Expose the shared provider API action trio instead:
|
|
|
117
119
|
|
|
118
120
|
Use `@agent-native/core/provider-api` as the shared substrate. A template should
|
|
119
121
|
only add a thin credential adapter when it has app-specific credential lookup
|
|
120
|
-
rules.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
rules. If the app stores a built-in provider's OAuth grant under a narrower
|
|
123
|
+
local provider id, use the runtime's `oauthProviderOverrides` instead of
|
|
124
|
+
duplicating the provider config. If credentials are stored on shareable/resource
|
|
125
|
+
rows rather than in the shared credential or OAuth-token stores, build a resolver
|
|
126
|
+
that enforces those access checks before exposing raw provider requests. Keep
|
|
127
|
+
`provider-api-request` `http: false` unless you have a separate UI permission
|
|
128
|
+
model for arbitrary provider writes. Specific actions such as `hubspot-deals`,
|
|
129
|
+
`search-emails`, or `sync-source` are convenience shortcuts, not capability
|
|
130
|
+
limits; agents should fall back to the provider API trio when a question
|
|
131
|
+
requires an endpoint or filter that the shortcut does not model.
|
|
132
|
+
|
|
133
|
+
This is a framework tenet. The safety boundary should be provider host
|
|
134
|
+
allow-listing, credential scoping, auth injection, private-network blocking,
|
|
135
|
+
secret redaction, and user/org access checks, not an artificially small set of
|
|
136
|
+
hand-authored read actions. If the upstream provider API supports a capability,
|
|
137
|
+
the agent should normally be able to reach it through `provider-api-request`
|
|
138
|
+
with the user's configured credentials. For large responses, expose staging
|
|
139
|
+
(`stageAs`, `itemsPath`, pagination, and `query-staged-dataset`) or sandboxed
|
|
140
|
+
code execution so the agent can reduce data without flooding context.
|
|
125
141
|
|
|
126
142
|
### The `http` Option
|
|
127
143
|
|
|
@@ -59,7 +59,13 @@ For provider-backed analysis/query/reporting integrations, do not turn every
|
|
|
59
59
|
provider endpoint or filter into a rigid action. Prefer the shared
|
|
60
60
|
`provider-api-catalog` / `provider-api-docs` / `provider-api-request` pattern
|
|
61
61
|
from `@agent-native/core/provider-api`, then add narrow convenience actions only
|
|
62
|
-
for workflows that truly deserve a first-class shortcut.
|
|
62
|
+
for workflows that truly deserve a first-class shortcut. Treat this as a
|
|
63
|
+
capability requirement, not a nice-to-have: convenience actions must not become
|
|
64
|
+
the ceiling of what the agent can ask the provider to do. Pair broad provider
|
|
65
|
+
access with staging or sandboxed code execution when responses may be too large
|
|
66
|
+
for chat context. If provider credentials live on resource/share rows, add the
|
|
67
|
+
scoped resolver first so broad access preserves the same ownership boundary as
|
|
68
|
+
the app UI.
|
|
63
69
|
|
|
64
70
|
If the feature needs credentials, design the credential path in the same change.
|
|
65
71
|
Never hardcode API keys, tokens, webhook URLs, signing secrets, private
|
package/package.json
CHANGED
|
@@ -104,7 +104,9 @@ Do not build an umbrella REST API to make actions "easier" to call. Actions are
|
|
|
104
104
|
|
|
105
105
|
For provider integrations used in ad hoc analysis, querying, reporting, or
|
|
106
106
|
cross-source research, do not hardcode every provider endpoint as a separate
|
|
107
|
-
rigid action
|
|
107
|
+
rigid action and do not encode one lookback window, filter shape, or pagination
|
|
108
|
+
strategy as the only path the agent can take. Expose the shared provider API
|
|
109
|
+
action trio instead:
|
|
108
110
|
|
|
109
111
|
- `provider-api-catalog`: lists provider base URLs, auth style, credential keys,
|
|
110
112
|
docs/spec URLs, placeholders, and examples without exposing secrets.
|
|
@@ -117,11 +119,25 @@ rigid action. Expose the shared provider API action trio instead:
|
|
|
117
119
|
|
|
118
120
|
Use `@agent-native/core/provider-api` as the shared substrate. A template should
|
|
119
121
|
only add a thin credential adapter when it has app-specific credential lookup
|
|
120
|
-
rules.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
rules. If the app stores a built-in provider's OAuth grant under a narrower
|
|
123
|
+
local provider id, use the runtime's `oauthProviderOverrides` instead of
|
|
124
|
+
duplicating the provider config. If credentials are stored on shareable/resource
|
|
125
|
+
rows rather than in the shared credential or OAuth-token stores, build a resolver
|
|
126
|
+
that enforces those access checks before exposing raw provider requests. Keep
|
|
127
|
+
`provider-api-request` `http: false` unless you have a separate UI permission
|
|
128
|
+
model for arbitrary provider writes. Specific actions such as `hubspot-deals`,
|
|
129
|
+
`search-emails`, or `sync-source` are convenience shortcuts, not capability
|
|
130
|
+
limits; agents should fall back to the provider API trio when a question
|
|
131
|
+
requires an endpoint or filter that the shortcut does not model.
|
|
132
|
+
|
|
133
|
+
This is a framework tenet. The safety boundary should be provider host
|
|
134
|
+
allow-listing, credential scoping, auth injection, private-network blocking,
|
|
135
|
+
secret redaction, and user/org access checks, not an artificially small set of
|
|
136
|
+
hand-authored read actions. If the upstream provider API supports a capability,
|
|
137
|
+
the agent should normally be able to reach it through `provider-api-request`
|
|
138
|
+
with the user's configured credentials. For large responses, expose staging
|
|
139
|
+
(`stageAs`, `itemsPath`, pagination, and `query-staged-dataset`) or sandboxed
|
|
140
|
+
code execution so the agent can reduce data without flooding context.
|
|
125
141
|
|
|
126
142
|
### The `http` Option
|
|
127
143
|
|
|
@@ -59,7 +59,13 @@ For provider-backed analysis/query/reporting integrations, do not turn every
|
|
|
59
59
|
provider endpoint or filter into a rigid action. Prefer the shared
|
|
60
60
|
`provider-api-catalog` / `provider-api-docs` / `provider-api-request` pattern
|
|
61
61
|
from `@agent-native/core/provider-api`, then add narrow convenience actions only
|
|
62
|
-
for workflows that truly deserve a first-class shortcut.
|
|
62
|
+
for workflows that truly deserve a first-class shortcut. Treat this as a
|
|
63
|
+
capability requirement, not a nice-to-have: convenience actions must not become
|
|
64
|
+
the ceiling of what the agent can ask the provider to do. Pair broad provider
|
|
65
|
+
access with staging or sandboxed code execution when responses may be too large
|
|
66
|
+
for chat context. If provider credentials live on resource/share rows, add the
|
|
67
|
+
scoped resolver first so broad access preserves the same ownership boundary as
|
|
68
|
+
the app UI.
|
|
63
69
|
|
|
64
70
|
If the feature needs credentials, design the credential path in the same change.
|
|
65
71
|
Never hardcode API keys, tokens, webhook URLs, signing secrets, private
|
|
@@ -104,7 +104,9 @@ Do not build an umbrella REST API to make actions "easier" to call. Actions are
|
|
|
104
104
|
|
|
105
105
|
For provider integrations used in ad hoc analysis, querying, reporting, or
|
|
106
106
|
cross-source research, do not hardcode every provider endpoint as a separate
|
|
107
|
-
rigid action
|
|
107
|
+
rigid action and do not encode one lookback window, filter shape, or pagination
|
|
108
|
+
strategy as the only path the agent can take. Expose the shared provider API
|
|
109
|
+
action trio instead:
|
|
108
110
|
|
|
109
111
|
- `provider-api-catalog`: lists provider base URLs, auth style, credential keys,
|
|
110
112
|
docs/spec URLs, placeholders, and examples without exposing secrets.
|
|
@@ -117,11 +119,25 @@ rigid action. Expose the shared provider API action trio instead:
|
|
|
117
119
|
|
|
118
120
|
Use `@agent-native/core/provider-api` as the shared substrate. A template should
|
|
119
121
|
only add a thin credential adapter when it has app-specific credential lookup
|
|
120
|
-
rules.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
rules. If the app stores a built-in provider's OAuth grant under a narrower
|
|
123
|
+
local provider id, use the runtime's `oauthProviderOverrides` instead of
|
|
124
|
+
duplicating the provider config. If credentials are stored on shareable/resource
|
|
125
|
+
rows rather than in the shared credential or OAuth-token stores, build a resolver
|
|
126
|
+
that enforces those access checks before exposing raw provider requests. Keep
|
|
127
|
+
`provider-api-request` `http: false` unless you have a separate UI permission
|
|
128
|
+
model for arbitrary provider writes. Specific actions such as `hubspot-deals`,
|
|
129
|
+
`search-emails`, or `sync-source` are convenience shortcuts, not capability
|
|
130
|
+
limits; agents should fall back to the provider API trio when a question
|
|
131
|
+
requires an endpoint or filter that the shortcut does not model.
|
|
132
|
+
|
|
133
|
+
This is a framework tenet. The safety boundary should be provider host
|
|
134
|
+
allow-listing, credential scoping, auth injection, private-network blocking,
|
|
135
|
+
secret redaction, and user/org access checks, not an artificially small set of
|
|
136
|
+
hand-authored read actions. If the upstream provider API supports a capability,
|
|
137
|
+
the agent should normally be able to reach it through `provider-api-request`
|
|
138
|
+
with the user's configured credentials. For large responses, expose staging
|
|
139
|
+
(`stageAs`, `itemsPath`, pagination, and `query-staged-dataset`) or sandboxed
|
|
140
|
+
code execution so the agent can reduce data without flooding context.
|
|
125
141
|
|
|
126
142
|
### The `http` Option
|
|
127
143
|
|
|
@@ -59,7 +59,13 @@ For provider-backed analysis/query/reporting integrations, do not turn every
|
|
|
59
59
|
provider endpoint or filter into a rigid action. Prefer the shared
|
|
60
60
|
`provider-api-catalog` / `provider-api-docs` / `provider-api-request` pattern
|
|
61
61
|
from `@agent-native/core/provider-api`, then add narrow convenience actions only
|
|
62
|
-
for workflows that truly deserve a first-class shortcut.
|
|
62
|
+
for workflows that truly deserve a first-class shortcut. Treat this as a
|
|
63
|
+
capability requirement, not a nice-to-have: convenience actions must not become
|
|
64
|
+
the ceiling of what the agent can ask the provider to do. Pair broad provider
|
|
65
|
+
access with staging or sandboxed code execution when responses may be too large
|
|
66
|
+
for chat context. If provider credentials live on resource/share rows, add the
|
|
67
|
+
scoped resolver first so broad access preserves the same ownership boundary as
|
|
68
|
+
the app UI.
|
|
63
69
|
|
|
64
70
|
If the feature needs credentials, design the credential path in the same change.
|
|
65
71
|
Never hardcode API keys, tokens, webhook URLs, signing secrets, private
|