@opengeni/capabilities 0.3.3 → 0.3.4
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/README.md +16 -0
- package/dist/http.d.ts +1 -0
- package/dist/index.js +35 -12
- package/dist/index.js.map +1 -1
- package/dist/integration-definitions.d.ts +3 -0
- package/dist/openapi.d.ts +4 -1
- package/package.json +1 -1
- package/src/http.ts +1 -0
- package/src/integration-definitions.ts +19 -5
- package/src/openapi.ts +35 -7
package/README.md
CHANGED
|
@@ -37,3 +37,19 @@ Integration Definitions keep their existing local MCP adapters without
|
|
|
37
37
|
claiming this descriptor. Google Drive remains one functional Integration row
|
|
38
38
|
with its existing Connection and facet authority. See
|
|
39
39
|
`docs/design/first-party-mcp-bridges.md`.
|
|
40
|
+
|
|
41
|
+
## Curated Microsoft Graph schemas
|
|
42
|
+
|
|
43
|
+
Microsoft definitions explicitly use `provider_validated_json`: JSON request
|
|
44
|
+
bodies remain JSON values, and Graph validates their fields. Path/query/header
|
|
45
|
+
schemas, required bodies, media types, scopes, destinations and write approvals
|
|
46
|
+
are retained. Binary/text body schemas are retained. Optional response schemas
|
|
47
|
+
are omitted because the adapter returns an HTTP-result envelope. This avoids
|
|
48
|
+
expanding Graph's recursive entity graph into every operation. Custom OpenAPI
|
|
49
|
+
sources retain their full schema compilation. The mode participates in the
|
|
50
|
+
immutable revision digest; preview refuses revisions above the persistence bound.
|
|
51
|
+
|
|
52
|
+
Contacts uses delegated `People.Read` for `/me/people`. OneDrive uses
|
|
53
|
+
`Files.ReadWrite.All` and excludes the organization-only followed-sites API;
|
|
54
|
+
neither requires organization-wide people or SharePoint permissions merely to
|
|
55
|
+
connect a personal Microsoft account.
|
package/dist/http.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { IntegrationTransport, PinnedIntegrationTransportOptions } from "./
|
|
|
3
3
|
export declare const DEFAULT_INTEGRATION_TIMEOUT_MS = 30000;
|
|
4
4
|
export declare const DEFAULT_INTEGRATION_RESPONSE_BYTES: number;
|
|
5
5
|
export declare const MAX_INTEGRATION_SPEC_BYTES: number;
|
|
6
|
+
export declare const MAX_CURATED_INTEGRATION_SPEC_BYTES: number;
|
|
6
7
|
export declare const MAX_INTEGRATION_TOOLS = 2000;
|
|
7
8
|
export declare function fetchIntegrationSourceDocument(transport: IntegrationTransport, sourceUrl: string, maxBytes?: number): Promise<Uint8Array>;
|
|
8
9
|
export declare function createPinnedIntegrationTransport(options: PinnedIntegrationTransportOptions): IntegrationTransport;
|
package/dist/index.js
CHANGED
|
@@ -176,6 +176,7 @@ import { pinnedFetch, readResponseBodyBounded } from "@opengeni/network";
|
|
|
176
176
|
var DEFAULT_INTEGRATION_TIMEOUT_MS = 3e4;
|
|
177
177
|
var DEFAULT_INTEGRATION_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
178
178
|
var MAX_INTEGRATION_SPEC_BYTES = 8 * 1024 * 1024;
|
|
179
|
+
var MAX_CURATED_INTEGRATION_SPEC_BYTES = 64 * 1024 * 1024;
|
|
179
180
|
var MAX_INTEGRATION_TOOLS = 2e3;
|
|
180
181
|
async function fetchIntegrationSourceDocument(transport, sourceUrl, maxBytes = MAX_INTEGRATION_SPEC_BYTES) {
|
|
181
182
|
const url = new URL(sourceUrl);
|
|
@@ -921,12 +922,18 @@ var forbiddenParameterHeaders = /* @__PURE__ */ new Set([
|
|
|
921
922
|
"connection",
|
|
922
923
|
"transfer-encoding"
|
|
923
924
|
]);
|
|
924
|
-
function parseOpenApiDocument(source) {
|
|
925
|
+
function parseOpenApiDocument(source, options = {}) {
|
|
926
|
+
const maxBytes = options.maxBytes ?? MAX_INTEGRATION_SPEC_BYTES;
|
|
927
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 1 || maxBytes > MAX_CURATED_INTEGRATION_SPEC_BYTES) {
|
|
928
|
+
throw new RangeError(
|
|
929
|
+
`OpenAPI parser limit must be between 1 and ${MAX_CURATED_INTEGRATION_SPEC_BYTES} bytes`
|
|
930
|
+
);
|
|
931
|
+
}
|
|
925
932
|
const bytes = typeof source === "string" ? Buffer.byteLength(source) : source.byteLength;
|
|
926
|
-
if (bytes === 0 || bytes >
|
|
933
|
+
if (bytes === 0 || bytes > maxBytes) {
|
|
927
934
|
throw new IntegrationProtocolError(
|
|
928
935
|
"openapi_spec_size",
|
|
929
|
-
`OpenAPI document must be between 1 and ${
|
|
936
|
+
`OpenAPI document must be between 1 and ${maxBytes} bytes`
|
|
930
937
|
);
|
|
931
938
|
}
|
|
932
939
|
const text = typeof source === "string" ? source : new TextDecoder("utf-8", { fatal: true }).decode(source);
|
|
@@ -952,7 +959,9 @@ function parseOpenApiDocument(source) {
|
|
|
952
959
|
}
|
|
953
960
|
function compileOpenApiRevision(source, options) {
|
|
954
961
|
const document = isRecord2(source) ? source : parseOpenApiDocument(source);
|
|
955
|
-
const contentSha256 = sha256Hex(
|
|
962
|
+
const contentSha256 = sha256Hex(
|
|
963
|
+
canonicalJson(options.schemaMode ? { document, schemaMode: options.schemaMode } : document)
|
|
964
|
+
);
|
|
956
965
|
const revisionId = immutableRevisionId("openapi", contentSha256);
|
|
957
966
|
const info = isRecord2(document.info) ? document.info : {};
|
|
958
967
|
const documentServers = readServers(document.servers, options.baseUrl, options.sourceUrl);
|
|
@@ -976,7 +985,7 @@ function compileOpenApiRevision(source, options) {
|
|
|
976
985
|
sharedParameters,
|
|
977
986
|
readParameters(document, operation.parameters)
|
|
978
987
|
);
|
|
979
|
-
const requestBody = readRequestBody(document, operation.requestBody);
|
|
988
|
+
const requestBody = readRequestBody(document, operation.requestBody, options.schemaMode);
|
|
980
989
|
const serverUrl = firstServerUrl(
|
|
981
990
|
readServers(operation.servers, void 0, void 0),
|
|
982
991
|
pathServers,
|
|
@@ -985,7 +994,7 @@ function compileOpenApiRevision(source, options) {
|
|
|
985
994
|
const requiredScopeAlternatives = operation.security === void 0 ? documentSecurity : readSecurity(operation.security);
|
|
986
995
|
const safety = classifyHttpSafety(method, operation);
|
|
987
996
|
const inputSchema = operationInputSchema(parameters, requestBody);
|
|
988
|
-
const outputSchema = operationOutputSchema(document, operation.responses);
|
|
997
|
+
const outputSchema = options.schemaMode ? void 0 : operationOutputSchema(document, operation.responses);
|
|
989
998
|
const summary = stringValue(operation.summary) ?? stringValue(operation.description);
|
|
990
999
|
tools.push({
|
|
991
1000
|
id,
|
|
@@ -1294,14 +1303,18 @@ function mergeParameters(base, override) {
|
|
|
1294
1303
|
for (const entry of override) merged.set(`${entry.location}:${entry.name}`, entry);
|
|
1295
1304
|
return [...merged.values()];
|
|
1296
1305
|
}
|
|
1297
|
-
function readRequestBody(document, value) {
|
|
1306
|
+
function readRequestBody(document, value, schemaMode) {
|
|
1298
1307
|
if (value === void 0) return void 0;
|
|
1299
1308
|
const body = resolveObject(document, value, "request body");
|
|
1300
1309
|
if (!isRecord2(body.content)) return void 0;
|
|
1301
1310
|
const schemas = {};
|
|
1302
1311
|
for (const [contentType, rawMedia] of Object.entries(body.content)) {
|
|
1303
1312
|
if (!isRecord2(rawMedia)) continue;
|
|
1304
|
-
|
|
1313
|
+
const normalizedType = contentType.toLowerCase();
|
|
1314
|
+
const jsonBody = normalizedType === "application/json" || normalizedType.endsWith("+json");
|
|
1315
|
+
schemas[normalizedType] = schemaMode === "provider_validated_json" && jsonBody ? {
|
|
1316
|
+
description: "Request JSON for this API operation. The provider validates fields; follow the operation documentation."
|
|
1317
|
+
} : dereferenceSchema(document, rawMedia.schema);
|
|
1305
1318
|
}
|
|
1306
1319
|
const contentTypes = Object.keys(schemas);
|
|
1307
1320
|
return contentTypes.length === 0 ? void 0 : { required: body.required === true, contentTypes, schemas };
|
|
@@ -1671,6 +1684,7 @@ var MICROSOFT_OUTLOOK_MAIL_INTEGRATION_DEFINITION = {
|
|
|
1671
1684
|
source: {
|
|
1672
1685
|
kind: "openapi",
|
|
1673
1686
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
1687
|
+
schemaMode: "provider_validated_json",
|
|
1674
1688
|
operationPathPrefixes: [
|
|
1675
1689
|
"/me/messages",
|
|
1676
1690
|
"/me/mailFolders",
|
|
@@ -1694,6 +1708,7 @@ var MICROSOFT_OUTLOOK_CALENDAR_INTEGRATION_DEFINITION = {
|
|
|
1694
1708
|
source: {
|
|
1695
1709
|
kind: "openapi",
|
|
1696
1710
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
1711
|
+
schemaMode: "provider_validated_json",
|
|
1697
1712
|
operationPathPrefixes: [
|
|
1698
1713
|
"/me/calendar",
|
|
1699
1714
|
"/me/calendars",
|
|
@@ -1753,10 +1768,11 @@ var MICROSOFT_OUTLOOK_CONTACTS_INTEGRATION_DEFINITION = {
|
|
|
1753
1768
|
source: {
|
|
1754
1769
|
kind: "openapi",
|
|
1755
1770
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
1771
|
+
schemaMode: "provider_validated_json",
|
|
1756
1772
|
operationPathPrefixes: ["/me/contacts", "/me/contactFolders", "/me/people"]
|
|
1757
1773
|
},
|
|
1758
1774
|
baseUrl: MICROSOFT_GRAPH_BASE_URL,
|
|
1759
|
-
authentication: microsoftOAuth(["Contacts.ReadWrite", "People.Read
|
|
1775
|
+
authentication: microsoftOAuth(["Contacts.ReadWrite", "People.Read"]),
|
|
1760
1776
|
facets: [accountIdentityFacet("microsoft")]
|
|
1761
1777
|
};
|
|
1762
1778
|
var MICROSOFT_ONEDRIVE_INTEGRATION_DEFINITION = {
|
|
@@ -1768,10 +1784,13 @@ var MICROSOFT_ONEDRIVE_INTEGRATION_DEFINITION = {
|
|
|
1768
1784
|
source: {
|
|
1769
1785
|
kind: "openapi",
|
|
1770
1786
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
1771
|
-
|
|
1787
|
+
schemaMode: "provider_validated_json",
|
|
1788
|
+
operationPathPrefixes: ["/me/drive", "/me/drives", "/drives", "/shares"],
|
|
1789
|
+
// Excel's nested workbook API is a separate surface, not file management.
|
|
1790
|
+
excludedOperationPathPrefixes: ["/drives/{drive-id}/items/{driveItem-id}/workbook"]
|
|
1772
1791
|
},
|
|
1773
1792
|
baseUrl: MICROSOFT_GRAPH_BASE_URL,
|
|
1774
|
-
authentication: microsoftOAuth(["Files.ReadWrite.All"
|
|
1793
|
+
authentication: microsoftOAuth(["Files.ReadWrite.All"]),
|
|
1775
1794
|
facets: [driveKnowledgeFacet("microsoft-onedrive"), accountIdentityFacet("microsoft")]
|
|
1776
1795
|
};
|
|
1777
1796
|
var CORE_INTEGRATION_DEFINITIONS = [
|
|
@@ -1795,12 +1814,15 @@ function filterOpenApiDocumentForDefinition(document, definition) {
|
|
|
1795
1814
|
return document;
|
|
1796
1815
|
}
|
|
1797
1816
|
const operationPathPrefixes = definition.source.operationPathPrefixes;
|
|
1817
|
+
const excludedOperationPathPrefixes = definition.source.excludedOperationPathPrefixes ?? [];
|
|
1798
1818
|
if (!isRecord3(document.paths)) {
|
|
1799
1819
|
throw new IntegrationProtocolError("openapi_paths", "OpenAPI document has no paths object");
|
|
1800
1820
|
}
|
|
1801
1821
|
const paths = Object.fromEntries(
|
|
1802
1822
|
Object.entries(document.paths).filter(
|
|
1803
|
-
([path]) => operationPathPrefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`))
|
|
1823
|
+
([path]) => operationPathPrefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`)) && !excludedOperationPathPrefixes.some(
|
|
1824
|
+
(prefix) => path === prefix || path.startsWith(`${prefix}/`)
|
|
1825
|
+
)
|
|
1804
1826
|
)
|
|
1805
1827
|
);
|
|
1806
1828
|
if (Object.keys(paths).length === 0) {
|
|
@@ -2151,6 +2173,7 @@ export {
|
|
|
2151
2173
|
IntegrationInvocationError,
|
|
2152
2174
|
IntegrationProtocolError,
|
|
2153
2175
|
LOCAL_MCP_BRIDGE_CONTRACT_VERSION,
|
|
2176
|
+
MAX_CURATED_INTEGRATION_SPEC_BYTES,
|
|
2154
2177
|
MAX_INTEGRATION_SPEC_BYTES,
|
|
2155
2178
|
MAX_INTEGRATION_TOOLS,
|
|
2156
2179
|
MICROSOFT_GRAPH_BASE_URL,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/auth.ts","../src/graphql.ts","../src/http.ts","../src/revision.ts","../src/mcp-manifest.ts","../src/mcp-bridge.ts","../src/openapi.ts","../src/integration-definitions.ts","../src/integration-presentations.ts"],"sourcesContent":["import type { FetchLike, OutboundNetworkSettings } from \"@opengeni/network\";\n\nexport type IntegrationProtocol = \"mcp\" | \"openapi\" | \"graphql\";\nexport type IntegrationToolSafety = \"read\" | \"write\" | \"destructive\";\nexport type IntegrationApprovalMode = \"never\" | \"ask\";\n\nexport type JsonSchema = Readonly<Record<string, unknown>>;\n\nexport interface IntegrationToolDefinition {\n readonly id: string;\n readonly operationKey: string;\n readonly name: string;\n readonly description: string;\n readonly inputSchema: JsonSchema;\n readonly outputSchema?: JsonSchema;\n readonly safety: IntegrationToolSafety;\n readonly approvalMode: IntegrationApprovalMode;\n readonly deprecated: boolean;\n}\n\nexport type CredentialCarrier = \"header\" | \"query\" | \"cookie\";\n\nexport interface IntegrationCredentialPlacement {\n readonly carrier: CredentialCarrier;\n readonly name: string;\n readonly value: string;\n readonly prefix?: string;\n}\n\nexport interface IntegrationCredentialAudience {\n /** Exact normalized origin the credential may reach. */\n readonly origin: string;\n /** Optional normalized path prefix. Defaults to `/`. */\n readonly pathPrefix?: string;\n}\n\nexport interface ResolvedIntegrationCredential {\n readonly audience: IntegrationCredentialAudience;\n readonly placements: readonly IntegrationCredentialPlacement[];\n /** Exact accepted-attempt fence invoked immediately before one HTTP request. */\n readonly authorizeProviderRequest?: () => Promise<boolean>;\n readonly expiresAt?: string;\n readonly scope?: readonly string[];\n}\n\nexport interface IntegrationInvocationAuthority {\n readonly accountId: string;\n readonly workspaceId: string;\n readonly sessionId?: string;\n readonly rootSessionId?: string;\n readonly turnId?: string;\n readonly attemptId?: string;\n readonly initiatingSubjectId?: string;\n readonly connectionRef?: string;\n}\n\nexport interface ResolveIntegrationCredentialRequest extends IntegrationInvocationAuthority {\n readonly protocol: Exclude<IntegrationProtocol, \"mcp\">;\n readonly definitionId: string;\n readonly revisionId: string;\n readonly operationKey: string;\n readonly destinationUrl: string;\n readonly requiredScopeAlternatives?: readonly (readonly string[])[];\n /** Refresh the exact bound Connection for a safe retry or a later call. */\n readonly forceRefresh?: boolean;\n}\n\nexport interface IntegrationCredentialResolver {\n resolve(\n request: ResolveIntegrationCredentialRequest,\n ): Promise<ResolvedIntegrationCredential | null>;\n}\n\nexport interface IntegrationTransport {\n readonly fetch: FetchLike;\n}\n\nexport interface PinnedIntegrationTransportOptions {\n readonly network: OutboundNetworkSettings;\n readonly fetchImpl?: FetchLike;\n}\n\nexport type IntegrationRevisionSource = {\n readonly url?: string;\n readonly provider?: string;\n readonly fetchedAt?: string;\n};\n\nexport interface IntegrationRevision<\n TBinding = unknown,\n TProtocol extends Exclude<IntegrationProtocol, \"mcp\"> = Exclude<IntegrationProtocol, \"mcp\">,\n> {\n readonly id: string;\n readonly protocol: TProtocol;\n readonly definitionId: string;\n readonly contentSha256: string;\n readonly source: IntegrationRevisionSource;\n readonly title: string;\n readonly description?: string;\n readonly version?: string;\n readonly tools: readonly IntegrationToolDefinition[];\n readonly bindings: Readonly<Record<string, TBinding>>;\n}\n\nexport type InvocationOutcome = \"not_started\" | \"unknown\" | \"failed\";\n\nexport class IntegrationProtocolError extends Error {\n constructor(\n readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = \"IntegrationProtocolError\";\n }\n}\n\nexport class IntegrationInvocationError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly outcome: InvocationOutcome,\n readonly retryable: boolean,\n readonly status?: number,\n ) {\n super(message);\n this.name = \"IntegrationInvocationError\";\n }\n}\n","import type { IntegrationCredentialPlacement, ResolvedIntegrationCredential } from \"./types\";\nimport { IntegrationInvocationError } from \"./types\";\n\nconst forbiddenCredentialHeaders = new Set([\n \"connection\",\n \"content-length\",\n \"host\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n]);\nconst MAX_CREDENTIAL_PLACEMENTS = 32;\nconst MAX_CREDENTIAL_NAME_LENGTH = 256;\nconst MAX_CREDENTIAL_VALUE_LENGTH = 16_384;\nconst headerNamePattern = /^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/;\nconst queryNamePattern = /^[A-Za-z0-9._~-]+$/;\nconst cookieNamePattern = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\n\nfunction normalizeAudiencePath(path: string | undefined): string {\n if (!path?.trim()) return \"/\";\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return normalized.endsWith(\"/\") ? normalized : `${normalized}/`;\n}\n\nexport function assertCredentialAudience(\n credential: ResolvedIntegrationCredential,\n destination: URL,\n): void {\n let audience: URL;\n try {\n audience = new URL(credential.audience.origin);\n } catch {\n throw new IntegrationInvocationError(\n \"credential_audience_invalid\",\n \"Connection credential audience is invalid\",\n \"not_started\",\n false,\n );\n }\n if (\n audience.origin !== destination.origin ||\n audience.username ||\n audience.password ||\n audience.pathname !== \"/\" ||\n audience.search ||\n audience.hash\n ) {\n throw new IntegrationInvocationError(\n \"credential_audience_mismatch\",\n \"Connection credential is not authorized for this integration destination\",\n \"not_started\",\n false,\n );\n }\n const prefix = normalizeAudiencePath(credential.audience.pathPrefix);\n const path = destination.pathname.endsWith(\"/\")\n ? destination.pathname\n : `${destination.pathname}/`;\n if (!path.startsWith(prefix)) {\n throw new IntegrationInvocationError(\n \"credential_path_mismatch\",\n \"Connection credential is not authorized for this integration path\",\n \"not_started\",\n false,\n );\n }\n}\n\nfunction placementValue(placement: IntegrationCredentialPlacement): string {\n return `${placement.prefix ?? \"\"}${placement.value}`;\n}\n\nfunction validateCredentialPlacements(placements: readonly IntegrationCredentialPlacement[]): void {\n if (placements.length === 0 || placements.length > MAX_CREDENTIAL_PLACEMENTS) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential placement count is invalid\",\n \"not_started\",\n false,\n );\n }\n const seen = new Set<string>();\n for (const placement of placements) {\n const name = placement.name;\n const value = placementValue(placement);\n const normalizedName = placement.carrier === \"header\" ? name.toLowerCase() : name;\n if (\n name.length === 0 ||\n name.length > MAX_CREDENTIAL_NAME_LENGTH ||\n placement.value.length === 0 ||\n value.length > MAX_CREDENTIAL_VALUE_LENGTH ||\n /[\\r\\n\\0]/.test(name) ||\n /[\\r\\n\\0]/.test(value)\n ) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential placement is invalid\",\n \"not_started\",\n false,\n );\n }\n if (placement.carrier === \"header\") {\n if (\n !headerNamePattern.test(name) ||\n forbiddenCredentialHeaders.has(normalizedName) ||\n normalizedName.startsWith(\"sec-\")\n ) {\n throw new IntegrationInvocationError(\n \"credential_header_forbidden\",\n \"Connection credential targets a forbidden request header\",\n \"not_started\",\n false,\n );\n }\n } else if (placement.carrier === \"query\") {\n if (!queryNamePattern.test(name)) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential query placement is invalid\",\n \"not_started\",\n false,\n );\n }\n } else if (!cookieNamePattern.test(name) || /;/.test(value)) {\n throw new IntegrationInvocationError(\n \"credential_cookie_invalid\",\n \"Connection credential cookie placement is invalid\",\n \"not_started\",\n false,\n );\n }\n const key = `${placement.carrier}\\0${normalizedName}`;\n if (seen.has(key)) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential placements contain a duplicate destination\",\n \"not_started\",\n false,\n );\n }\n seen.add(key);\n }\n}\n\nexport function applyCredentialPlacements(\n destination: URL,\n headers: Headers,\n credential: ResolvedIntegrationCredential,\n): void {\n assertCredentialAudience(credential, destination);\n validateCredentialPlacements(credential.placements);\n const cookies: string[] = [];\n for (const placement of credential.placements) {\n const name = placement.name;\n const value = placementValue(placement);\n if (placement.carrier === \"header\") {\n headers.set(name, value);\n } else if (placement.carrier === \"query\") {\n destination.searchParams.set(name, value);\n } else {\n cookies.push(`${name}=${value}`);\n }\n }\n if (cookies.length > 0) {\n const current = headers.get(\"cookie\");\n headers.set(\"cookie\", [...(current ? [current] : []), ...cookies].join(\"; \"));\n }\n}\n","import type { CallToolResultContent, MCPCallToolOptions, MCPServer } from \"@openai/agents\";\nimport {\n buildClientSchema,\n getIntrospectionQuery,\n getNamedType,\n isEnumType,\n isInputObjectType,\n isInterfaceType,\n isListType,\n isNonNullType,\n isObjectType,\n isScalarType,\n isUnionType,\n parse,\n type GraphQLInputType,\n type GraphQLNamedType,\n type GraphQLOutputType,\n type IntrospectionQuery,\n} from \"graphql\";\n\nimport { applyCredentialPlacements } from \"./auth\";\nimport {\n DEFAULT_INTEGRATION_RESPONSE_BYTES,\n DEFAULT_INTEGRATION_TIMEOUT_MS,\n MAX_INTEGRATION_SPEC_BYTES,\n MAX_INTEGRATION_TOOLS,\n fetchWithDeadline,\n readIntegrationResponse,\n} from \"./http\";\nimport { canonicalJson, immutableRevisionId, sha256Hex, stableToolId } from \"./revision\";\nimport type {\n IntegrationCredentialResolver,\n IntegrationInvocationAuthority,\n IntegrationRevision,\n IntegrationTransport,\n JsonSchema,\n} from \"./types\";\nimport { IntegrationInvocationError, IntegrationProtocolError } from \"./types\";\n\nexport interface GraphqlOperationBinding {\n readonly kind: \"query\" | \"mutation\";\n readonly fieldName: string;\n readonly operationName: string;\n readonly variableDefinitions: readonly string[];\n readonly variableNames: readonly string[];\n readonly defaultSelection?: string;\n readonly selectionAllowed: boolean;\n}\n\nexport type GraphqlRevision = IntegrationRevision<GraphqlOperationBinding, \"graphql\">;\n\nexport interface CompileGraphqlOptions {\n readonly definitionId: string;\n readonly endpoint: string;\n readonly name?: string;\n readonly sourceUrl?: string;\n readonly provider?: string;\n}\n\nexport interface GraphqlServerOptions {\n readonly revision: GraphqlRevision;\n readonly endpoint: string;\n readonly transport: IntegrationTransport;\n readonly credentialResolver?: IntegrationCredentialResolver;\n readonly authority: IntegrationInvocationAuthority;\n readonly staticHeaders?: Readonly<Record<string, string>>;\n readonly staticQuery?: Readonly<Record<string, string>>;\n readonly timeoutMs?: number;\n readonly maxResponseBytes?: number;\n}\n\ntype LocalMcpTool = Awaited<ReturnType<MCPServer[\"listTools\"]>>[number];\n\nexport function compileGraphqlRevision(\n introspection: IntrospectionQuery | { readonly data?: IntrospectionQuery } | string,\n options: CompileGraphqlOptions,\n): GraphqlRevision {\n const document = parseIntrospection(introspection);\n let schema;\n try {\n schema = buildClientSchema(document);\n } catch {\n throw new IntegrationProtocolError(\n \"graphql_introspection_invalid\",\n \"GraphQL introspection result cannot build a client schema\",\n );\n }\n const endpoint = validateGraphqlEndpoint(options.endpoint);\n const contentSha256 = sha256Hex(canonicalJson(document));\n const id = immutableRevisionId(\"graphql\", contentSha256);\n const tools = [] as GraphqlRevision[\"tools\"] extends readonly (infer T)[] ? T[] : never;\n const bindings: Record<string, GraphqlOperationBinding> = {};\n const seen = new Map<string, number>();\n\n for (const [kind, root] of [\n [\"query\", schema.getQueryType()],\n [\"mutation\", schema.getMutationType()],\n ] as const) {\n if (!root) continue;\n for (const field of Object.values(root.getFields()).sort((left, right) =>\n left.name.localeCompare(right.name),\n )) {\n const toolId = stableToolId(`${kind}_${field.name}`, seen);\n const namedOutput = getNamedType(field.type);\n const selectionAllowed = !isLeafType(namedOutput);\n const defaultSelection = selectionAllowed\n ? buildDefaultSelection(field.type, new Set(), 0)\n : undefined;\n const properties: Record<string, unknown> = Object.fromEntries(\n field.args.map((arg) => [\n arg.name,\n {\n ...inputTypeSchema(arg.type, new Set(), 0),\n ...(arg.description ? { description: arg.description } : {}),\n },\n ]),\n );\n if (selectionAllowed) {\n properties.select = {\n type: \"string\",\n description:\n \"Optional GraphQL field selection without outer braces. The default selects safe scalar fields.\",\n maxLength: 4_000,\n };\n }\n const required = field.args.filter((arg) => isNonNullType(arg.type)).map((arg) => arg.name);\n const description = [\n field.description?.trim(),\n kind === \"mutation\"\n ? \"Changes external state and requires approval.\"\n : \"Read-only GraphQL query.\",\n ]\n .filter(Boolean)\n .join(\" \");\n tools.push({\n id: toolId,\n operationKey: `${kind}:${field.name}`,\n name: field.name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n safety: kind === \"query\" ? \"read\" : \"write\",\n approvalMode: kind === \"query\" ? \"never\" : \"ask\",\n deprecated: field.deprecationReason != null,\n });\n bindings[toolId] = {\n kind,\n fieldName: field.name,\n operationName: stableGraphqlName(`${kind}_${field.name}`),\n variableDefinitions: field.args.map((arg) => `$${arg.name}: ${String(arg.type)}`),\n variableNames: field.args.map((arg) => arg.name),\n ...(defaultSelection ? { defaultSelection } : {}),\n selectionAllowed,\n };\n if (tools.length > MAX_INTEGRATION_TOOLS) {\n throw new IntegrationProtocolError(\n \"graphql_tool_limit\",\n `GraphQL schema exceeds the ${MAX_INTEGRATION_TOOLS}-tool limit`,\n );\n }\n }\n }\n if (tools.length === 0) {\n throw new IntegrationProtocolError(\"graphql_empty\", \"GraphQL schema exposes no root fields\");\n }\n return {\n id,\n protocol: \"graphql\",\n definitionId: options.definitionId,\n contentSha256,\n source: {\n url: options.sourceUrl ?? endpoint,\n ...(options.provider ? { provider: options.provider } : {}),\n },\n title: options.name?.trim() || options.definitionId,\n tools,\n bindings,\n };\n}\n\nexport async function fetchGraphqlIntrospection(\n options: Omit<GraphqlServerOptions, \"revision\">,\n): Promise<IntrospectionQuery> {\n const request = { query: getIntrospectionQuery({ descriptions: true }) };\n const firstCredential = await resolveGraphqlCredential(\n options,\n \"graphql-introspection\",\n \"pending\",\n \"__introspection\",\n false,\n );\n let response = await sendGraphqlRequest(options, request, firstCredential);\n if (response.status === 401 && options.credentialResolver && options.authority.connectionRef) {\n const refreshed = await resolveGraphqlCredential(\n options,\n \"graphql-introspection\",\n \"pending\",\n \"__introspection\",\n true,\n );\n await response.body?.cancel().catch(() => undefined);\n if (!refreshed) {\n throw new IntegrationInvocationError(\n \"graphql_introspection_rejected\",\n \"GraphQL endpoint did not return an introspection schema\",\n \"failed\",\n false,\n 401,\n );\n }\n response = await sendGraphqlRequest(options, request, refreshed);\n }\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"redirect_rejected\",\n \"GraphQL endpoint attempted to redirect the introspection request\",\n \"unknown\",\n false,\n response.status,\n );\n }\n const body = await readIntegrationResponse(response, MAX_INTEGRATION_SPEC_BYTES);\n if (!response.ok || !isRecord(body.data) || !isRecord(body.data.data)) {\n throw new IntegrationInvocationError(\n \"graphql_introspection_rejected\",\n \"GraphQL endpoint did not return an introspection schema\",\n \"failed\",\n false,\n response.status,\n );\n }\n return body.data.data as unknown as IntrospectionQuery;\n}\n\nexport class GraphqlMcpServer implements MCPServer {\n readonly cacheToolsList = true;\n readonly useStructuredContent = true;\n readonly name: string;\n\n constructor(private readonly options: GraphqlServerOptions) {\n this.name = `graphql:${stableToolId(options.revision.definitionId)}`;\n }\n\n async connect(): Promise<void> {}\n async close(): Promise<void> {}\n async invalidateToolsCache(): Promise<void> {}\n\n async listTools(): Promise<LocalMcpTool[]> {\n return this.options.revision.tools.map(\n (tool) =>\n ({\n name: tool.id,\n description: tool.description,\n inputSchema: normalizeMcpSchema(tool.inputSchema),\n annotations: {\n readOnlyHint: tool.safety === \"read\",\n destructiveHint: false,\n idempotentHint: tool.safety === \"read\",\n openWorldHint: true,\n },\n _meta: {\n \"opengeni/approvalMode\": tool.approvalMode,\n \"opengeni/operationKey\": tool.operationKey,\n \"opengeni/revisionId\": this.options.revision.id,\n },\n }) as LocalMcpTool,\n );\n }\n\n async callTool(\n toolName: string,\n args: Record<string, unknown> | null,\n _meta?: Record<string, unknown> | null,\n callOptions?: MCPCallToolOptions,\n ): Promise<CallToolResultContent> {\n const result = await invokeGraphqlOperation(\n this.options,\n toolName,\n args ?? {},\n callOptions?.signal,\n );\n const content = [\n { type: \"text\" as const, text: JSON.stringify(result) },\n ] as CallToolResultContent;\n content.structuredContent = result;\n content.isError = result.ok === false;\n return content;\n }\n}\n\nexport function createGraphqlMcpServer(options: GraphqlServerOptions): MCPServer {\n return new GraphqlMcpServer(options);\n}\n\nexport async function invokeGraphqlOperation(\n options: GraphqlServerOptions,\n toolId: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<Record<string, unknown>> {\n const binding = options.revision.bindings[toolId];\n if (!binding) {\n throw new IntegrationInvocationError(\n \"operation_not_found\",\n \"GraphQL operation is not present in the frozen revision\",\n \"not_started\",\n false,\n );\n }\n const select = binding.selectionAllowed\n ? validateGraphqlSelection(\n typeof args.select === \"string\" ? args.select : (binding.defaultSelection ?? \"__typename\"),\n )\n : undefined;\n const variables = Object.fromEntries(\n binding.variableNames.flatMap((name) => (args[name] === undefined ? [] : [[name, args[name]]])),\n );\n const definitions = binding.variableDefinitions.length\n ? `(${binding.variableDefinitions.join(\", \")})`\n : \"\";\n const argumentsText = binding.variableNames.length\n ? `(${binding.variableNames.map((name) => `${name}: $${name}`).join(\", \")})`\n : \"\";\n const query = `${binding.kind} ${binding.operationName}${definitions} { ${binding.fieldName}${argumentsText}${select ? ` { ${select} }` : \"\"} }`;\n const request = { query, variables, operationName: binding.operationName };\n const firstCredential = await resolveGraphqlCredential(\n options,\n options.revision.definitionId,\n options.revision.id,\n toolId,\n false,\n );\n let response = await sendGraphqlRequest(options, request, firstCredential, signal);\n if (response.status === 401 && options.credentialResolver && options.authority.connectionRef) {\n const refreshed = await resolveGraphqlCredential(\n options,\n options.revision.definitionId,\n options.revision.id,\n toolId,\n true,\n );\n await response.body?.cancel().catch(() => undefined);\n if (binding.kind === \"query\" && refreshed) {\n response = await sendGraphqlRequest(options, request, refreshed, signal);\n } else {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this GraphQL operation\",\n binding.kind === \"mutation\" ? \"unknown\" : \"failed\",\n false,\n 401,\n );\n }\n }\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"redirect_rejected\",\n \"GraphQL endpoint attempted to redirect a credential-bearing request\",\n binding.kind === \"mutation\" ? \"unknown\" : \"failed\",\n false,\n response.status,\n );\n }\n const payload = await readIntegrationResponse(\n response,\n options.maxResponseBytes ?? DEFAULT_INTEGRATION_RESPONSE_BYTES,\n );\n if (response.status === 401 || response.status === 403) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this GraphQL operation\",\n binding.kind === \"mutation\" ? \"unknown\" : \"failed\",\n false,\n response.status,\n );\n }\n const graph = isRecord(payload.data) ? payload.data : {};\n return {\n ok: response.ok && !Array.isArray(graph.errors),\n status: response.status,\n data: graph.data ?? null,\n errors: graph.errors ?? null,\n };\n}\n\nasync function resolveGraphqlCredential(\n options: Omit<GraphqlServerOptions, \"revision\"> | GraphqlServerOptions,\n definitionId: string,\n revisionId: string,\n operationKey: string,\n forceRefresh: boolean,\n): Promise<Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>> {\n if (!options.credentialResolver || !options.authority.connectionRef) return null;\n const credential = await options.credentialResolver.resolve({\n ...options.authority,\n protocol: \"graphql\",\n definitionId,\n revisionId,\n operationKey,\n destinationUrl: graphqlEndpoint(options).toString(),\n ...(forceRefresh ? { forceRefresh: true } : {}),\n });\n if (!credential && !forceRefresh) {\n throw new IntegrationInvocationError(\n \"connection_required\",\n \"This GraphQL integration needs a connected account\",\n \"not_started\",\n false,\n );\n }\n return credential;\n}\n\nasync function sendGraphqlRequest(\n options: Omit<GraphqlServerOptions, \"revision\"> | GraphqlServerOptions,\n request: Record<string, unknown>,\n credential: Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>,\n signal?: AbortSignal,\n): Promise<Response> {\n const endpoint = graphqlEndpoint(options);\n const headers = new Headers(options.staticHeaders);\n headers.set(\"accept\", \"application/json\");\n headers.set(\"content-type\", \"application/json\");\n if (credential) applyCredentialPlacements(endpoint, headers, credential);\n if (credential?.authorizeProviderRequest) {\n let authorized = false;\n try {\n authorized = await credential.authorizeProviderRequest();\n } catch {\n authorized = false;\n }\n if (!authorized) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n \"not_started\",\n false,\n );\n }\n }\n return await fetchWithDeadline(\n options.transport,\n endpoint,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n ...(signal ? { signal } : {}),\n },\n options.timeoutMs ?? DEFAULT_INTEGRATION_TIMEOUT_MS,\n );\n}\n\nfunction graphqlEndpoint(options: Pick<GraphqlServerOptions, \"endpoint\" | \"staticQuery\">): URL {\n const endpoint = new URL(validateGraphqlEndpoint(options.endpoint));\n for (const [name, value] of Object.entries(options.staticQuery ?? {})) {\n endpoint.searchParams.set(name, value);\n }\n return endpoint;\n}\n\nexport function validateGraphqlSelection(value: string): string {\n const normalized = value.trim();\n if (!normalized || normalized.length > 4_000) {\n throw new IntegrationInvocationError(\n \"graphql_selection_invalid\",\n \"GraphQL selection must contain between 1 and 4000 characters\",\n \"not_started\",\n false,\n );\n }\n try {\n const document = parse(`fragment OpenGeniSelection on Placeholder { ${normalized} }`);\n if (\n document.definitions.length !== 1 ||\n document.definitions[0]?.kind !== \"FragmentDefinition\"\n ) {\n throw new Error(\"invalid selection document\");\n }\n return normalized;\n } catch {\n throw new IntegrationInvocationError(\n \"graphql_selection_invalid\",\n \"GraphQL selection is invalid\",\n \"not_started\",\n false,\n );\n }\n}\n\nfunction parseIntrospection(\n value: IntrospectionQuery | { readonly data?: IntrospectionQuery } | string,\n): IntrospectionQuery {\n let parsed: unknown = value;\n if (typeof value === \"string\") {\n if (Buffer.byteLength(value) > MAX_INTEGRATION_SPEC_BYTES) {\n throw new IntegrationProtocolError(\n \"graphql_introspection_size\",\n `GraphQL introspection exceeds ${MAX_INTEGRATION_SPEC_BYTES} bytes`,\n );\n }\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new IntegrationProtocolError(\n \"graphql_introspection_parse\",\n \"GraphQL introspection is not valid JSON\",\n );\n }\n }\n if (isRecord(parsed) && isRecord(parsed.data) && isRecord(parsed.data.__schema)) {\n return parsed.data as unknown as IntrospectionQuery;\n }\n if (isRecord(parsed) && isRecord(parsed.__schema)) {\n return parsed as unknown as IntrospectionQuery;\n }\n throw new IntegrationProtocolError(\n \"graphql_introspection_shape\",\n \"GraphQL introspection result has no __schema object\",\n );\n}\n\nfunction validateGraphqlEndpoint(value: string): string {\n let endpoint: URL;\n try {\n endpoint = new URL(value);\n } catch {\n throw new IntegrationProtocolError(\n \"graphql_endpoint_invalid\",\n \"GraphQL endpoint URL is invalid\",\n );\n }\n if (\n !/^https?:$/.test(endpoint.protocol) ||\n endpoint.username ||\n endpoint.password ||\n endpoint.hash\n ) {\n throw new IntegrationProtocolError(\n \"graphql_endpoint_invalid\",\n \"GraphQL endpoint URL is invalid\",\n );\n }\n return endpoint.toString();\n}\n\nfunction inputTypeSchema(input: GraphQLInputType, seen: Set<string>, depth: number): JsonSchema {\n if (depth > 12) return {};\n if (isNonNullType(input)) return inputTypeSchema(input.ofType, seen, depth + 1);\n if (isListType(input)) {\n return { type: \"array\", items: inputTypeSchema(input.ofType, seen, depth + 1) };\n }\n const type = getNamedType(input);\n if (isScalarType(type)) return scalarSchema(type.name);\n if (isEnumType(type))\n return { type: \"string\", enum: type.getValues().map((entry) => entry.name) };\n if (isInputObjectType(type)) {\n if (seen.has(type.name)) return { type: \"object\", additionalProperties: true };\n const nextSeen = new Set(seen).add(type.name);\n const fields = Object.values(type.getFields());\n return {\n type: \"object\",\n properties: Object.fromEntries(\n fields.map((field) => [\n field.name,\n {\n ...inputTypeSchema(field.type, nextSeen, depth + 1),\n ...(field.description ? { description: field.description } : {}),\n },\n ]),\n ),\n required: fields.filter((field) => isNonNullType(field.type)).map((field) => field.name),\n additionalProperties: false,\n };\n }\n return {};\n}\n\nfunction scalarSchema(name: string): JsonSchema {\n if (name === \"Boolean\") return { type: \"boolean\" };\n if (name === \"Int\") return { type: \"integer\" };\n if (name === \"Float\") return { type: \"number\" };\n if (name === \"ID\" || name === \"String\") return { type: \"string\" };\n return { description: `GraphQL scalar ${name}` };\n}\n\nfunction buildDefaultSelection(\n output: GraphQLOutputType,\n seen: Set<string>,\n depth: number,\n): string | undefined {\n const type = getNamedType(output);\n if (isLeafType(type)) return undefined;\n if (depth > 2 || seen.has(type.name)) return \"__typename\";\n if (isUnionType(type) || isInterfaceType(type)) return \"__typename\";\n if (!isObjectType(type)) return \"__typename\";\n const nextSeen = new Set(seen).add(type.name);\n const fields = Object.values(type.getFields());\n const scalarFields = fields.filter((field) => isLeafType(getNamedType(field.type))).slice(0, 20);\n const selections = scalarFields.map((field) => field.name);\n if (selections.length < 3 && depth < 2) {\n const nested = fields.find(\n (field) => field.args.length === 0 && !isLeafType(getNamedType(field.type)),\n );\n if (nested) {\n const child = buildDefaultSelection(nested.type, nextSeen, depth + 1);\n if (child) selections.push(`${nested.name} { ${child} }`);\n }\n }\n return selections.length ? selections.join(\" \") : \"__typename\";\n}\n\nfunction isLeafType(type: GraphQLNamedType): boolean {\n return isScalarType(type) || isEnumType(type);\n}\n\nfunction stableGraphqlName(value: string): string {\n const normalized = value.replace(/[^_0-9A-Za-z]/g, \"_\").replace(/^([^_A-Za-z])/, \"_$1\");\n return normalized || \"OpenGeniOperation\";\n}\n\nfunction normalizeMcpSchema(schema: JsonSchema): LocalMcpTool[\"inputSchema\"] {\n return {\n type: \"object\",\n properties: isRecord(schema.properties) ? schema.properties : {},\n required: Array.isArray(schema.required)\n ? schema.required.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n additionalProperties: schema.additionalProperties === true,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { pinnedFetch, readResponseBodyBounded, type FetchLike } from \"@opengeni/network\";\n\nimport type { IntegrationTransport, PinnedIntegrationTransportOptions } from \"./types\";\nimport { IntegrationInvocationError } from \"./types\";\n\nexport const DEFAULT_INTEGRATION_TIMEOUT_MS = 30_000;\nexport const DEFAULT_INTEGRATION_RESPONSE_BYTES = 4 * 1024 * 1024;\nexport const MAX_INTEGRATION_SPEC_BYTES = 8 * 1024 * 1024;\nexport const MAX_INTEGRATION_TOOLS = 2_000;\n\nexport async function fetchIntegrationSourceDocument(\n transport: IntegrationTransport,\n sourceUrl: string,\n maxBytes = MAX_INTEGRATION_SPEC_BYTES,\n): Promise<Uint8Array> {\n const url = new URL(sourceUrl);\n const response = await fetchWithDeadline(\n transport,\n url,\n {\n method: \"GET\",\n headers: { accept: \"application/json, application/yaml, text/yaml, */*;q=0.5\" },\n },\n DEFAULT_INTEGRATION_TIMEOUT_MS,\n );\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"source_redirect_rejected\",\n \"Integration source attempted to redirect\",\n \"failed\",\n false,\n response.status,\n );\n }\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"source_fetch_rejected\",\n \"Integration source could not be read\",\n \"failed\",\n response.status >= 500,\n response.status,\n );\n }\n return await readResponseBodyBounded(response, maxBytes, \"Integration source\");\n}\n\nexport function createPinnedIntegrationTransport(\n options: PinnedIntegrationTransportOptions,\n): IntegrationTransport {\n return {\n fetch: (input, init) =>\n pinnedFetch(input, init, options.network, {\n ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),\n label: \"Integration request\",\n requireHttpsOutsideLocalTest: true,\n }),\n };\n}\n\nexport function directIntegrationTransport(fetchImpl: FetchLike): IntegrationTransport {\n return { fetch: fetchImpl };\n}\n\nexport async function fetchWithDeadline(\n transport: IntegrationTransport,\n url: URL,\n init: RequestInit,\n timeoutMs = DEFAULT_INTEGRATION_TIMEOUT_MS,\n): Promise<Response> {\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 120_000) {\n throw new RangeError(\"integration timeout must be between 1 and 120000 milliseconds\");\n }\n const controller = new AbortController();\n const onAbort = () => controller.abort(init.signal?.reason);\n if (init.signal?.aborted) onAbort();\n else init.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const timer = setTimeout(\n () => controller.abort(new Error(\"integration request timed out\")),\n timeoutMs,\n );\n try {\n return await transport.fetch(url, {\n ...init,\n signal: controller.signal,\n redirect: \"manual\",\n });\n } catch {\n const timedOut = controller.signal.aborted && !init.signal?.aborted;\n throw new IntegrationInvocationError(\n timedOut ? \"request_timeout\" : \"request_failed\",\n timedOut ? \"Integration request timed out\" : \"Integration request failed\",\n requestCouldHaveStarted(init.method) ? \"unknown\" : \"not_started\",\n !requestCouldHaveStarted(init.method),\n );\n } finally {\n clearTimeout(timer);\n init.signal?.removeEventListener(\"abort\", onAbort);\n }\n}\n\nfunction requestCouldHaveStarted(method: string | undefined): boolean {\n const normalized = (method ?? \"GET\").toUpperCase();\n return normalized !== \"GET\" && normalized !== \"HEAD\" && normalized !== \"OPTIONS\";\n}\n\nexport async function readIntegrationResponse(\n response: Response,\n maxBytes = DEFAULT_INTEGRATION_RESPONSE_BYTES,\n): Promise<{ data: unknown; contentType: string; bytes: number }> {\n const body = await readResponseBodyBounded(response, maxBytes, \"Integration response\");\n const contentType =\n response.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n if (body.byteLength === 0) return { data: null, contentType, bytes: 0 };\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(body);\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n try {\n return { data: JSON.parse(text), contentType, bytes: body.byteLength };\n } catch {\n throw new IntegrationInvocationError(\n \"response_json_invalid\",\n \"Integration returned invalid JSON\",\n \"failed\",\n false,\n response.status,\n );\n }\n }\n return { data: text, contentType, bytes: body.byteLength };\n}\n","import { createHash } from \"node:crypto\";\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalize(entry)]),\n );\n}\n\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(canonicalize(value));\n}\n\nexport function sha256Hex(value: string | Uint8Array): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function immutableRevisionId(protocol: string, contentSha256: string): string {\n if (!/^[a-f0-9]{64}$/.test(contentSha256)) {\n throw new Error(\"contentSha256 must be a lowercase SHA-256 digest\");\n }\n return `${protocol}:${contentSha256.slice(0, 24)}`;\n}\n\nexport function stableToolId(value: string, seen?: Map<string, number>): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, 54);\n const base = normalized || \"tool\";\n if (!seen) return base;\n const count = (seen.get(base) ?? 0) + 1;\n seen.set(base, count);\n return count === 1 ? base : `${base}_${count}`;\n}\n","import { stableToolId } from \"./revision\";\n\nexport interface McpToolManifestEntry {\n readonly toolId: string;\n readonly toolName: string;\n readonly description: string | null;\n readonly inputSchema?: unknown;\n readonly outputSchema?: unknown;\n readonly annotations?: Readonly<Record<string, unknown>>;\n}\n\nexport interface McpToolManifest {\n readonly server: {\n readonly name: string | null;\n readonly version: string | null;\n readonly instructions: string | null;\n } | null;\n readonly tools: readonly McpToolManifestEntry[];\n}\n\nexport function extractMcpToolManifest(\n listToolsResult: unknown,\n metadata: {\n readonly serverInfo?: unknown;\n readonly instructions?: string;\n } = {},\n): McpToolManifest {\n const listed =\n listToolsResult &&\n typeof listToolsResult === \"object\" &&\n Array.isArray((listToolsResult as { tools?: unknown }).tools)\n ? (listToolsResult as { tools: unknown[] }).tools\n : [];\n const seen = new Map<string, number>();\n const tools = listed.flatMap((value): McpToolManifestEntry[] => {\n if (!value || typeof value !== \"object\") return [];\n const tool = value as Record<string, unknown>;\n if (typeof tool.name !== \"string\" || !tool.name.trim()) return [];\n const toolName = tool.name.trim();\n return [\n {\n toolId: stableToolId(toolName, seen),\n toolName,\n description: typeof tool.description === \"string\" ? tool.description : null,\n ...(tool.inputSchema !== undefined\n ? { inputSchema: tool.inputSchema }\n : tool.parameters !== undefined\n ? { inputSchema: tool.parameters }\n : {}),\n ...(tool.outputSchema !== undefined ? { outputSchema: tool.outputSchema } : {}),\n ...(tool.annotations && typeof tool.annotations === \"object\"\n ? { annotations: tool.annotations as Readonly<Record<string, unknown>> }\n : {}),\n },\n ];\n });\n const info =\n metadata.serverInfo && typeof metadata.serverInfo === \"object\"\n ? (metadata.serverInfo as Record<string, unknown>)\n : null;\n return {\n server: info\n ? {\n name: typeof info.name === \"string\" ? info.name : null,\n version: typeof info.version === \"string\" ? info.version : null,\n instructions: metadata.instructions ?? null,\n }\n : null,\n tools,\n };\n}\n\nexport function deriveMcpNamespace(input: {\n readonly name?: string | null;\n readonly endpoint?: string | null;\n readonly command?: string | null;\n}): string {\n const candidate =\n input.name?.trim() || hostname(input.endpoint) || basename(input.command) || \"mcp\";\n return stableToolId(candidate);\n}\n\nfunction hostname(value: string | null | undefined): string {\n if (!value || !URL.canParse(value)) return \"\";\n return new URL(value).hostname;\n}\n\nfunction basename(value: string | null | undefined): string {\n return value?.trim().split(/[\\\\/]/).pop() ?? \"\";\n}\n","import type { MCPServer } from \"@openai/agents\";\n\nexport const LOCAL_MCP_BRIDGE_CONTRACT_VERSION = 1 as const;\n\nexport type LocalMcpBridgeAuthority = \"connection\" | \"host\" | \"none\";\nexport type LocalMcpBridgeToolSurface = \"static_reviewed\";\n\nexport type LocalMcpBridgeDestination = Readonly<{\n origin: string;\n pathPrefix: string;\n}>;\n\n/**\n * Secret-free description of an in-process provider-to-MCP adapter.\n *\n * This is observability and registration metadata, not authorization. The\n * adapter must still revalidate its named authority before each physical\n * provider request and keep credentials outside tool results and schemas.\n */\nexport type LocalMcpBridgeDescriptor = Readonly<{\n contractVersion: typeof LOCAL_MCP_BRIDGE_CONTRACT_VERSION;\n adapterId: string;\n providerId: string;\n catalogIdentity: string;\n transport: \"in_process\";\n authority: LocalMcpBridgeAuthority;\n toolSurface: LocalMcpBridgeToolSurface;\n mutationReplay: \"safe_reads_only\";\n destinations: readonly LocalMcpBridgeDestination[];\n}>;\n\nexport interface LocalMcpBridgeServer extends MCPServer {\n readonly bridge: LocalMcpBridgeDescriptor;\n}\n\nexport interface LocalMcpBridgeAdapter<TConfig, TContext> {\n readonly adapterId: string;\n matches(config: TConfig): boolean;\n create(config: TConfig, context: TContext): LocalMcpBridgeServer;\n}\n\nexport function defineLocalMcpBridgeDescriptor(\n input: Omit<LocalMcpBridgeDescriptor, \"contractVersion\" | \"transport\">,\n): LocalMcpBridgeDescriptor {\n const adapterId = boundedIdentity(input.adapterId, \"adapterId\");\n const providerId = boundedIdentity(input.providerId, \"providerId\");\n const catalogIdentity = boundedIdentity(input.catalogIdentity, \"catalogIdentity\", 512);\n if (input.destinations.length === 0 || input.destinations.length > 32) {\n throw new Error(\"Local MCP bridge must declare 1-32 provider destinations\");\n }\n const destinations = input.destinations.map((destination) => {\n const url = new URL(destination.origin);\n if (url.protocol !== \"https:\" || url.origin !== destination.origin) {\n throw new Error(\"Local MCP bridge destinations must be exact HTTPS origins\");\n }\n if (\n !destination.pathPrefix.startsWith(\"/\") ||\n destination.pathPrefix.includes(\"\\\\\") ||\n destination.pathPrefix.includes(\"?\") ||\n destination.pathPrefix.includes(\"#\") ||\n new URL(destination.pathPrefix, url.origin).pathname !== destination.pathPrefix\n ) {\n throw new Error(\"Local MCP bridge destination pathPrefix must be an absolute URL path\");\n }\n return Object.freeze({ origin: url.origin, pathPrefix: destination.pathPrefix });\n });\n return Object.freeze({\n contractVersion: LOCAL_MCP_BRIDGE_CONTRACT_VERSION,\n adapterId,\n providerId,\n catalogIdentity,\n transport: \"in_process\",\n authority: input.authority,\n toolSurface: input.toolSurface,\n mutationReplay: input.mutationReplay,\n destinations: Object.freeze(destinations),\n });\n}\n\nexport function isLocalMcpBridgeServer(server: MCPServer): server is LocalMcpBridgeServer {\n const bridge = (server as Partial<LocalMcpBridgeServer>).bridge;\n return (\n bridge?.contractVersion === LOCAL_MCP_BRIDGE_CONTRACT_VERSION &&\n bridge.transport === \"in_process\"\n );\n}\n\n/**\n * Select exactly one adapter for a runtime catalog row. Ambiguous matches fail\n * closed so adding a bridge cannot silently replace another provider route.\n */\nexport function createLocalMcpBridgeFromAdapters<TConfig, TContext>(\n adapters: readonly LocalMcpBridgeAdapter<TConfig, TContext>[],\n config: TConfig,\n context: TContext,\n): LocalMcpBridgeServer | null {\n const matches = adapters.filter((adapter) => adapter.matches(config));\n if (matches.length === 0) return null;\n if (matches.length > 1) {\n throw new Error(\n `Multiple local MCP bridge adapters matched: ${matches.map((entry) => entry.adapterId).join(\", \")}`,\n );\n }\n const adapter = matches[0]!;\n const server = adapter.create(config, context);\n if (server.bridge.adapterId !== adapter.adapterId) {\n throw new Error(`Local MCP bridge adapter ${adapter.adapterId} returned mismatched metadata`);\n }\n return server;\n}\n\nfunction boundedIdentity(value: string, name: string, max = 128): string {\n if (value.length === 0 || value.length > max || /[\\u0000-\\u001f\\u007f]/u.test(value)) {\n throw new Error(`Local MCP bridge ${name} is invalid`);\n }\n return value;\n}\n","import type { CallToolResultContent, MCPCallToolOptions, MCPServer } from \"@openai/agents\";\nimport { load as parseYaml } from \"js-yaml\";\n\nimport { applyCredentialPlacements } from \"./auth\";\nimport {\n DEFAULT_INTEGRATION_RESPONSE_BYTES,\n DEFAULT_INTEGRATION_TIMEOUT_MS,\n MAX_INTEGRATION_SPEC_BYTES,\n MAX_INTEGRATION_TOOLS,\n fetchWithDeadline,\n readIntegrationResponse,\n} from \"./http\";\nimport { canonicalJson, immutableRevisionId, sha256Hex, stableToolId } from \"./revision\";\nimport type {\n IntegrationCredentialResolver,\n IntegrationInvocationAuthority,\n IntegrationRevision,\n IntegrationToolDefinition,\n IntegrationTransport,\n JsonSchema,\n} from \"./types\";\nimport { IntegrationInvocationError, IntegrationProtocolError } from \"./types\";\n\nexport type OpenApiHttpMethod =\n | \"get\"\n | \"put\"\n | \"post\"\n | \"delete\"\n | \"patch\"\n | \"head\"\n | \"options\"\n | \"trace\";\n\nexport interface OpenApiParameterBinding {\n readonly name: string;\n readonly location: \"path\" | \"query\" | \"header\" | \"cookie\";\n readonly required: boolean;\n readonly schema: JsonSchema;\n readonly description?: string;\n}\n\nexport interface OpenApiOperationBinding {\n readonly method: OpenApiHttpMethod;\n readonly pathTemplate: string;\n readonly serverUrl: string;\n readonly parameters: readonly OpenApiParameterBinding[];\n readonly requestBody?: {\n readonly required: boolean;\n readonly contentTypes: readonly string[];\n readonly schemas: Readonly<Record<string, JsonSchema>>;\n };\n readonly requiredScopeAlternatives?: readonly (readonly string[])[];\n}\n\nexport type OpenApiRevision = IntegrationRevision<OpenApiOperationBinding, \"openapi\">;\n\nexport interface CompileOpenApiOptions {\n readonly definitionId: string;\n readonly sourceUrl?: string;\n readonly baseUrl?: string;\n readonly provider?: string;\n}\n\nexport interface OpenApiServerOptions {\n readonly revision: OpenApiRevision;\n readonly transport: IntegrationTransport;\n readonly credentialResolver?: IntegrationCredentialResolver;\n readonly authority: IntegrationInvocationAuthority;\n readonly timeoutMs?: number;\n readonly maxResponseBytes?: number;\n}\n\nexport type OpenApiAuthDiscovery =\n | { kind: \"none\" }\n | {\n kind: \"oauth2\";\n scopes: string[];\n }\n | {\n kind: \"api_key\";\n carrier: \"header\" | \"query\" | \"cookie\";\n name: string;\n }\n | { kind: \"http\"; scheme: string };\n\ntype LocalMcpTool = Awaited<ReturnType<MCPServer[\"listTools\"]>>[number];\n\nconst methods = new Set<OpenApiHttpMethod>([\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n]);\nconst forbiddenParameterHeaders = new Set([\n \"host\",\n \"content-length\",\n \"connection\",\n \"transfer-encoding\",\n]);\n\nexport function parseOpenApiDocument(source: string | Uint8Array): Record<string, unknown> {\n const bytes = typeof source === \"string\" ? Buffer.byteLength(source) : source.byteLength;\n if (bytes === 0 || bytes > MAX_INTEGRATION_SPEC_BYTES) {\n throw new IntegrationProtocolError(\n \"openapi_spec_size\",\n `OpenAPI document must be between 1 and ${MAX_INTEGRATION_SPEC_BYTES} bytes`,\n );\n }\n const text =\n typeof source === \"string\" ? source : new TextDecoder(\"utf-8\", { fatal: true }).decode(source);\n let parsed: unknown;\n try {\n parsed = parseYaml(text, { json: true });\n } catch {\n throw new IntegrationProtocolError(\n \"openapi_parse\",\n \"OpenAPI document is not valid JSON or YAML\",\n );\n }\n if (\n !isRecord(parsed) ||\n typeof parsed.openapi !== \"string\" ||\n !/^3\\.(?:0|1)(?:\\.|$)/.test(parsed.openapi)\n ) {\n throw new IntegrationProtocolError(\n \"openapi_version\",\n \"Only OpenAPI 3.0 and 3.1 documents are supported\",\n );\n }\n if (!isRecord(parsed.paths)) {\n throw new IntegrationProtocolError(\"openapi_paths\", \"OpenAPI document has no paths object\");\n }\n return parsed;\n}\n\nexport function compileOpenApiRevision(\n source: string | Uint8Array | Record<string, unknown>,\n options: CompileOpenApiOptions,\n): OpenApiRevision {\n const document = isRecord(source) ? source : parseOpenApiDocument(source);\n const contentSha256 = sha256Hex(canonicalJson(document));\n const revisionId = immutableRevisionId(\"openapi\", contentSha256);\n const info = isRecord(document.info) ? document.info : {};\n const documentServers = readServers(document.servers, options.baseUrl, options.sourceUrl);\n const documentSecurity = readSecurity(document.security);\n const tools: IntegrationToolDefinition[] = [];\n const bindings: Record<string, OpenApiOperationBinding> = {};\n const seen = new Map<string, number>();\n\n for (const [pathTemplate, rawPathItem] of Object.entries(\n document.paths as Record<string, unknown>,\n )) {\n const pathItem = resolveObject(document, rawPathItem, \"path item\");\n const sharedParameters = readParameters(document, pathItem.parameters);\n const pathServers = readServers(pathItem.servers, undefined, undefined);\n for (const [rawMethod, rawOperation] of Object.entries(pathItem)) {\n const method = rawMethod.toLowerCase() as OpenApiHttpMethod;\n if (!methods.has(method) || !isRecord(rawOperation)) continue;\n const operation = resolveObject(document, rawOperation, \"operation\");\n const operationKey = operationIdentity(method, pathTemplate, operation.operationId);\n const id = stableToolId(operationKey, seen);\n const parameters = mergeParameters(\n sharedParameters,\n readParameters(document, operation.parameters),\n );\n const requestBody = readRequestBody(document, operation.requestBody);\n const serverUrl = firstServerUrl(\n readServers(operation.servers, undefined, undefined),\n pathServers,\n documentServers,\n );\n const requiredScopeAlternatives =\n operation.security === undefined ? documentSecurity : readSecurity(operation.security);\n const safety = classifyHttpSafety(method, operation);\n const inputSchema = operationInputSchema(parameters, requestBody);\n const outputSchema = operationOutputSchema(document, operation.responses);\n const summary = stringValue(operation.summary) ?? stringValue(operation.description);\n tools.push({\n id,\n operationKey,\n name: summary ?? `${method.toUpperCase()} ${pathTemplate}`,\n description: toolDescription(method, pathTemplate, operation, safety),\n inputSchema,\n ...(outputSchema ? { outputSchema } : {}),\n safety,\n approvalMode: safety === \"read\" ? \"never\" : \"ask\",\n deprecated: operation.deprecated === true,\n });\n bindings[id] = {\n method,\n pathTemplate,\n serverUrl,\n parameters,\n ...(requestBody ? { requestBody } : {}),\n ...(requiredScopeAlternatives.length > 0 ? { requiredScopeAlternatives } : {}),\n };\n if (tools.length > MAX_INTEGRATION_TOOLS) {\n throw new IntegrationProtocolError(\n \"openapi_tool_limit\",\n `OpenAPI document exceeds the ${MAX_INTEGRATION_TOOLS}-tool limit`,\n );\n }\n }\n }\n if (tools.length === 0) {\n throw new IntegrationProtocolError(\"openapi_empty\", \"OpenAPI document exposes no operations\");\n }\n return {\n id: revisionId,\n protocol: \"openapi\",\n definitionId: options.definitionId,\n contentSha256,\n source: {\n ...(options.sourceUrl ? { url: options.sourceUrl } : {}),\n ...(options.provider ? { provider: options.provider } : {}),\n },\n title: stringValue(info.title) ?? options.definitionId,\n ...(stringValue(info.description) ? { description: stringValue(info.description)! } : {}),\n ...(stringValue(info.version) ? { version: stringValue(info.version)! } : {}),\n tools,\n bindings,\n };\n}\n\nexport function discoverOpenApiAuth(document: Record<string, unknown>): OpenApiAuthDiscovery {\n const components = isRecord(document.components) ? document.components : {};\n const schemes = isRecord(components.securitySchemes) ? components.securitySchemes : {};\n for (const raw of Object.values(schemes)) {\n const scheme = resolveObject(document, raw, \"security scheme\");\n if (scheme.type === \"oauth2\") {\n const flows = isRecord(scheme.flows) ? scheme.flows : {};\n const scopes = new Set<string>();\n for (const flow of Object.values(flows)) {\n if (!isRecord(flow) || !isRecord(flow.scopes)) continue;\n for (const scope of Object.keys(flow.scopes)) scopes.add(scope);\n }\n return { kind: \"oauth2\", scopes: [...scopes].sort() };\n }\n if (\n scheme.type === \"apiKey\" &&\n (scheme.in === \"header\" || scheme.in === \"query\" || scheme.in === \"cookie\") &&\n typeof scheme.name === \"string\" &&\n scheme.name.length > 0\n ) {\n return { kind: \"api_key\", carrier: scheme.in, name: scheme.name };\n }\n if (scheme.type === \"http\" && typeof scheme.scheme === \"string\") {\n return { kind: \"http\", scheme: scheme.scheme.toLowerCase() };\n }\n }\n return { kind: \"none\" };\n}\n\nexport class OpenApiMcpServer implements MCPServer {\n readonly cacheToolsList = true;\n readonly useStructuredContent = true;\n readonly name: string;\n\n constructor(private readonly options: OpenApiServerOptions) {\n this.name = `openapi:${stableToolId(options.revision.definitionId)}`;\n }\n\n async connect(): Promise<void> {}\n async close(): Promise<void> {}\n async invalidateToolsCache(): Promise<void> {}\n\n async listTools(): Promise<LocalMcpTool[]> {\n return this.options.revision.tools.map(\n (tool) =>\n ({\n name: tool.id,\n description: tool.description,\n inputSchema: normalizeMcpSchema(tool.inputSchema),\n annotations: {\n readOnlyHint: tool.safety === \"read\",\n destructiveHint: tool.safety === \"destructive\",\n idempotentHint: isIdempotentMethod(this.options.revision.bindings[tool.id]?.method),\n openWorldHint: true,\n },\n _meta: {\n \"opengeni/approvalMode\": tool.approvalMode,\n \"opengeni/operationKey\": tool.operationKey,\n \"opengeni/revisionId\": this.options.revision.id,\n },\n }) as LocalMcpTool,\n );\n }\n\n async callTool(\n toolName: string,\n args: Record<string, unknown> | null,\n _meta?: Record<string, unknown> | null,\n callOptions?: MCPCallToolOptions,\n ): Promise<CallToolResultContent> {\n const result = await invokeOpenApiOperation(\n this.options,\n toolName,\n args ?? {},\n callOptions?.signal,\n );\n const content = [\n {\n type: \"text\" as const,\n text: JSON.stringify(result),\n },\n ] as CallToolResultContent;\n content.structuredContent = result as Record<string, unknown>;\n content.isError = result.ok === false;\n return content;\n }\n}\n\nexport function createOpenApiMcpServer(options: OpenApiServerOptions): MCPServer {\n return new OpenApiMcpServer(options);\n}\n\nexport async function invokeOpenApiOperation(\n options: OpenApiServerOptions,\n toolId: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<Record<string, unknown>> {\n const binding = options.revision.bindings[toolId];\n if (!binding) {\n throw new IntegrationInvocationError(\n \"operation_not_found\",\n \"Integration operation is not present in the frozen revision\",\n \"not_started\",\n false,\n );\n }\n const firstCredential = await resolveOpenApiCredential(options, binding, toolId, args, false);\n let response = await sendOpenApiRequest(options, binding, args, firstCredential, signal);\n if (response.status === 401 && options.credentialResolver && options.authority.connectionRef) {\n const refreshed = await resolveOpenApiCredential(options, binding, toolId, args, true);\n if (isReplaySafeMethod(binding.method) && refreshed) {\n await response.body?.cancel().catch(() => undefined);\n response = await sendOpenApiRequest(options, binding, args, refreshed, signal);\n } else {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n isReplaySafeMethod(binding.method) ? \"failed\" : \"unknown\",\n false,\n response.status,\n );\n }\n }\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"redirect_rejected\",\n \"Integration attempted to redirect a credential-bearing request\",\n binding.method === \"get\" || binding.method === \"head\" ? \"failed\" : \"unknown\",\n false,\n response.status,\n );\n }\n const payload = await readIntegrationResponse(\n response,\n options.maxResponseBytes ?? DEFAULT_INTEGRATION_RESPONSE_BYTES,\n );\n const result = {\n ok: response.ok,\n status: response.status,\n contentType: payload.contentType,\n data: payload.data,\n };\n if (!response.ok && (response.status === 401 || response.status === 403)) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n binding.method === \"get\" || binding.method === \"head\" ? \"failed\" : \"unknown\",\n false,\n response.status,\n );\n }\n return result;\n}\n\nasync function resolveOpenApiCredential(\n options: OpenApiServerOptions,\n binding: OpenApiOperationBinding,\n toolId: string,\n args: Record<string, unknown>,\n forceRefresh: boolean,\n): Promise<Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>> {\n if (!options.credentialResolver || !options.authority.connectionRef) return null;\n const destinationUrl = buildOperationUrl(binding, args).toString();\n const credential = await options.credentialResolver.resolve({\n ...options.authority,\n protocol: \"openapi\",\n definitionId: options.revision.definitionId,\n revisionId: options.revision.id,\n operationKey: toolId,\n destinationUrl,\n ...(binding.requiredScopeAlternatives\n ? { requiredScopeAlternatives: binding.requiredScopeAlternatives }\n : {}),\n ...(forceRefresh ? { forceRefresh: true } : {}),\n });\n if (!credential && !forceRefresh) {\n throw new IntegrationInvocationError(\n \"connection_required\",\n \"This integration needs a connected account\",\n \"not_started\",\n false,\n );\n }\n return credential;\n}\n\nasync function sendOpenApiRequest(\n options: OpenApiServerOptions,\n binding: OpenApiOperationBinding,\n args: Record<string, unknown>,\n credential: Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>,\n signal?: AbortSignal,\n): Promise<Response> {\n const url = buildOperationUrl(binding, args);\n const headers = buildOperationHeaders(binding, args);\n const body = buildOperationBody(binding, args, headers);\n if (credential) applyCredentialPlacements(url, headers, credential);\n if (credential?.authorizeProviderRequest) {\n let authorized = false;\n try {\n authorized = await credential.authorizeProviderRequest();\n } catch {\n authorized = false;\n }\n if (!authorized) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n \"not_started\",\n false,\n );\n }\n }\n return await fetchWithDeadline(\n options.transport,\n url,\n {\n method: binding.method.toUpperCase(),\n headers,\n ...(body !== undefined ? { body } : {}),\n ...(signal ? { signal } : {}),\n },\n options.timeoutMs ?? DEFAULT_INTEGRATION_TIMEOUT_MS,\n );\n}\n\nfunction readServers(\n value: unknown,\n explicitBaseUrl: string | undefined,\n sourceUrl: string | undefined,\n): string[] {\n if (explicitBaseUrl) return [normalizeServerUrl(explicitBaseUrl)];\n const servers = Array.isArray(value)\n ? value.flatMap((entry): string[] =>\n isRecord(entry) && typeof entry.url === \"string\"\n ? [resolveServerUrl(entry.url, sourceUrl)]\n : [],\n )\n : [];\n if (servers.length > 0) return servers;\n if (sourceUrl && URL.canParse(sourceUrl)) {\n const source = new URL(sourceUrl);\n return [`${source.origin}/`];\n }\n return [];\n}\n\nfunction firstServerUrl(...groups: readonly string[][]): string {\n const server = groups.flat().find(Boolean);\n if (!server) {\n throw new IntegrationProtocolError(\n \"openapi_server_missing\",\n \"OpenAPI operation has no resolvable server URL\",\n );\n }\n return server;\n}\n\nfunction resolveServerUrl(value: string, sourceUrl?: string): string {\n if (/[{}]/.test(value)) {\n throw new IntegrationProtocolError(\n \"openapi_server_variable\",\n \"OpenAPI server variables require an explicit resolved base URL\",\n );\n }\n try {\n return normalizeServerUrl(sourceUrl ? new URL(value, sourceUrl).toString() : value);\n } catch {\n throw new IntegrationProtocolError(\"openapi_server_invalid\", \"OpenAPI server URL is invalid\");\n }\n}\n\nfunction normalizeServerUrl(value: string): string {\n const url = new URL(value);\n if (!/^https?:$/.test(url.protocol) || url.username || url.password || url.hash) {\n throw new IntegrationProtocolError(\"openapi_server_invalid\", \"OpenAPI server URL is invalid\");\n }\n return url.toString();\n}\n\nfunction readParameters(\n document: Record<string, unknown>,\n value: unknown,\n): OpenApiParameterBinding[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((raw): OpenApiParameterBinding[] => {\n const parameter = resolveObject(document, raw, \"parameter\");\n const location = parameter.in;\n if (\n typeof parameter.name !== \"string\" ||\n (location !== \"path\" &&\n location !== \"query\" &&\n location !== \"header\" &&\n location !== \"cookie\")\n ) {\n return [];\n }\n if (location === \"header\" && forbiddenParameterHeaders.has(parameter.name.toLowerCase()))\n return [];\n return [\n {\n name: parameter.name,\n location,\n required: location === \"path\" || parameter.required === true,\n schema: dereferenceSchema(document, parameter.schema),\n ...(stringValue(parameter.description)\n ? { description: stringValue(parameter.description)! }\n : {}),\n },\n ];\n });\n}\n\nfunction mergeParameters(\n base: readonly OpenApiParameterBinding[],\n override: readonly OpenApiParameterBinding[],\n): OpenApiParameterBinding[] {\n const merged = new Map(base.map((entry) => [`${entry.location}:${entry.name}`, entry]));\n for (const entry of override) merged.set(`${entry.location}:${entry.name}`, entry);\n return [...merged.values()];\n}\n\nfunction readRequestBody(\n document: Record<string, unknown>,\n value: unknown,\n): OpenApiOperationBinding[\"requestBody\"] | undefined {\n if (value === undefined) return undefined;\n const body = resolveObject(document, value, \"request body\");\n if (!isRecord(body.content)) return undefined;\n const schemas: Record<string, JsonSchema> = {};\n for (const [contentType, rawMedia] of Object.entries(body.content)) {\n if (!isRecord(rawMedia)) continue;\n schemas[contentType.toLowerCase()] = dereferenceSchema(document, rawMedia.schema);\n }\n const contentTypes = Object.keys(schemas);\n return contentTypes.length === 0\n ? undefined\n : { required: body.required === true, contentTypes, schemas };\n}\n\nfunction operationInputSchema(\n parameters: readonly OpenApiParameterBinding[],\n body: OpenApiOperationBinding[\"requestBody\"],\n): JsonSchema {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const location of [\"path\", \"query\", \"header\", \"cookie\"] as const) {\n const group = parameters.filter((entry) => entry.location === location);\n if (group.length === 0) continue;\n properties[location] = {\n type: \"object\",\n properties: Object.fromEntries(\n group.map((entry) => [\n entry.name,\n { ...entry.schema, ...(entry.description ? { description: entry.description } : {}) },\n ]),\n ),\n required: group.filter((entry) => entry.required).map((entry) => entry.name),\n additionalProperties: false,\n };\n if (group.some((entry) => entry.required)) required.push(location);\n }\n if (body) {\n properties.body = body.schemas[body.contentTypes[0]!] ?? {};\n if (body.contentTypes.length > 1) {\n properties.contentType = { type: \"string\", enum: body.contentTypes };\n }\n if (body.required) required.push(\"body\");\n }\n return { type: \"object\", properties, required, additionalProperties: false };\n}\n\nfunction operationOutputSchema(\n document: Record<string, unknown>,\n value: unknown,\n): JsonSchema | undefined {\n if (!isRecord(value)) return undefined;\n for (const status of [\"200\", \"201\", \"202\", \"203\", \"204\", \"default\"]) {\n if (!(status in value)) continue;\n const response = resolveObject(document, value[status], \"response\");\n if (!isRecord(response.content)) return undefined;\n for (const media of Object.values(response.content)) {\n if (isRecord(media) && media.schema !== undefined) {\n return dereferenceSchema(document, media.schema);\n }\n }\n }\n return undefined;\n}\n\nfunction readSecurity(value: unknown): readonly (readonly string[])[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((entry): string[][] => {\n if (!isRecord(entry)) return [];\n const scopes = Object.values(entry).flatMap((raw) =>\n Array.isArray(raw) ? raw.filter((scope): scope is string => typeof scope === \"string\") : [],\n );\n return scopes.length > 0 ? [[...new Set(scopes)].sort()] : [];\n });\n}\n\nfunction classifyHttpSafety(\n method: OpenApiHttpMethod,\n operation: Record<string, unknown>,\n): IntegrationToolDefinition[\"safety\"] {\n if (method === \"get\" || method === \"head\" || method === \"options\") return \"read\";\n const text =\n `${stringValue(operation.operationId) ?? \"\"} ${stringValue(operation.summary) ?? \"\"}`.toLowerCase();\n return method === \"delete\" || /\\b(delete|destroy|remove|revoke|cancel|purge)\\b/.test(text)\n ? \"destructive\"\n : \"write\";\n}\n\nfunction operationIdentity(method: OpenApiHttpMethod, path: string, operationId: unknown): string {\n return typeof operationId === \"string\" && operationId.trim()\n ? operationId.trim()\n : `${method}_${path}`;\n}\n\nfunction toolDescription(\n method: OpenApiHttpMethod,\n path: string,\n operation: Record<string, unknown>,\n safety: IntegrationToolDefinition[\"safety\"],\n): string {\n const description = stringValue(operation.description) ?? stringValue(operation.summary);\n const approval =\n safety === \"read\" ? \"Read-only.\" : \"Changes external state and requires approval.\";\n return `${description ? `${description.trim()} ` : \"\"}${method.toUpperCase()} ${path}. ${approval}`.trim();\n}\n\nfunction isIdempotentMethod(method: OpenApiHttpMethod | undefined): boolean {\n return (\n method === \"get\" ||\n method === \"head\" ||\n method === \"options\" ||\n method === \"put\" ||\n method === \"delete\"\n );\n}\n\nfunction isReplaySafeMethod(method: OpenApiHttpMethod): boolean {\n return method === \"get\" || method === \"head\" || method === \"options\";\n}\n\nfunction buildOperationUrl(binding: OpenApiOperationBinding, args: Record<string, unknown>): URL {\n const pathArgs = objectValue(args.path);\n const path = binding.pathTemplate.replace(/\\{([^}]+)\\}/g, (_match, name: string) => {\n const value = pathArgs[name];\n if (value === undefined || value === null) {\n throw new IntegrationInvocationError(\n \"path_parameter_missing\",\n \"A required integration path parameter is missing\",\n \"not_started\",\n false,\n );\n }\n return encodeURIComponent(scalarString(value));\n });\n const base = new URL(binding.serverUrl);\n const url = new URL(\n path.replace(/^\\//, \"\"),\n base.toString().endsWith(\"/\") ? base : new URL(`${base}/`),\n );\n const query = objectValue(args.query);\n for (const [name, value] of Object.entries(query)) appendQueryValue(url, name, value);\n return url;\n}\n\nfunction buildOperationHeaders(\n binding: OpenApiOperationBinding,\n args: Record<string, unknown>,\n): Headers {\n const headers = new Headers({ accept: \"application/json, text/plain;q=0.9, */*;q=0.5\" });\n for (const [name, value] of Object.entries(objectValue(args.header))) {\n if (forbiddenParameterHeaders.has(name.toLowerCase())) continue;\n headers.set(name, scalarString(value));\n }\n const cookies = Object.entries(objectValue(args.cookie)).map(\n ([name, value]) => `${encodeURIComponent(name)}=${encodeURIComponent(scalarString(value))}`,\n );\n if (cookies.length > 0) headers.set(\"cookie\", cookies.join(\"; \"));\n if (binding.requestBody && args.body !== undefined) {\n const requested =\n typeof args.contentType === \"string\" ? args.contentType.toLowerCase() : undefined;\n const contentType =\n requested && binding.requestBody.contentTypes.includes(requested)\n ? requested\n : binding.requestBody.contentTypes[0]!;\n headers.set(\"content-type\", contentType);\n }\n return headers;\n}\n\nfunction buildOperationBody(\n binding: OpenApiOperationBinding,\n args: Record<string, unknown>,\n headers: Headers,\n): BodyInit | undefined {\n if (!binding.requestBody || args.body === undefined) return undefined;\n const contentType = headers.get(\"content-type\") ?? \"application/json\";\n if (contentType === \"application/x-www-form-urlencoded\") {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(objectValue(args.body)))\n appendSearchParam(params, key, value);\n return params;\n }\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n return JSON.stringify(args.body);\n }\n if (typeof args.body === \"string\") return args.body;\n throw new IntegrationInvocationError(\n \"request_body_unsupported\",\n \"This operation requires a text body for the selected content type\",\n \"not_started\",\n false,\n );\n}\n\nfunction appendQueryValue(url: URL, name: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const entry of value) url.searchParams.append(name, scalarString(entry));\n } else if (value !== undefined && value !== null) {\n url.searchParams.append(name, scalarString(value));\n }\n}\n\nfunction appendSearchParam(params: URLSearchParams, name: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const entry of value) params.append(name, scalarString(entry));\n } else if (value !== undefined && value !== null) {\n params.append(name, scalarString(value));\n }\n}\n\nfunction scalarString(value: unknown): string {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n throw new IntegrationInvocationError(\n \"parameter_invalid\",\n \"Integration parameters must be strings, numbers, booleans, or arrays of them\",\n \"not_started\",\n false,\n );\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction resolveObject(\n document: Record<string, unknown>,\n value: unknown,\n label: string,\n): Record<string, unknown> {\n const resolved = resolveLocalRef(document, value);\n if (!isRecord(resolved)) {\n throw new IntegrationProtocolError(\"openapi_shape\", `OpenAPI ${label} is invalid`);\n }\n return resolved;\n}\n\nfunction resolveLocalRef(document: Record<string, unknown>, value: unknown): unknown {\n if (!isRecord(value) || typeof value.$ref !== \"string\") return value;\n if (!value.$ref.startsWith(\"#/\")) {\n throw new IntegrationProtocolError(\n \"openapi_external_ref\",\n \"External OpenAPI references are not supported; bundle the document first\",\n );\n }\n return value.$ref\n .slice(2)\n .split(\"/\")\n .map((part) => part.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), document);\n}\n\nfunction dereferenceSchema(\n document: Record<string, unknown>,\n value: unknown,\n seen = new Set<string>(),\n depth = 0,\n): JsonSchema {\n if (depth > 20) return {};\n if (isRecord(value) && typeof value.$ref === \"string\") {\n if (seen.has(value.$ref)) return {};\n const nextSeen = new Set(seen).add(value.$ref);\n return dereferenceSchema(document, resolveLocalRef(document, value), nextSeen, depth + 1);\n }\n if (!isRecord(value)) return {};\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (key === \"properties\" && isRecord(entry)) {\n result.properties = Object.fromEntries(\n Object.entries(entry).map(([name, schema]) => [\n name,\n dereferenceSchema(document, schema, seen, depth + 1),\n ]),\n );\n } else if (key === \"items\") {\n result.items = dereferenceSchema(document, entry, seen, depth + 1);\n } else if (key === \"allOf\" || key === \"anyOf\" || key === \"oneOf\") {\n result[key] = Array.isArray(entry)\n ? entry.map((schema) => dereferenceSchema(document, schema, seen, depth + 1))\n : [];\n } else if (key !== \"$ref\") {\n result[key] = entry;\n }\n }\n return result;\n}\n\nfunction normalizeMcpSchema(schema: JsonSchema): LocalMcpTool[\"inputSchema\"] {\n return {\n type: \"object\",\n properties: isRecord(schema.properties) ? schema.properties : {},\n required: Array.isArray(schema.required)\n ? schema.required.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n additionalProperties: schema.additionalProperties === true,\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { IntegrationProtocolError } from \"./types\";\n\nexport interface IntegrationDefinitionOAuth2Authentication {\n readonly kind: \"oauth2\";\n readonly provider: \"google\" | \"microsoft\";\n readonly authorizationUrl: string;\n readonly tokenUrl: string;\n readonly scopes: readonly string[];\n readonly tokenPlacement: {\n readonly carrier: \"header\";\n readonly name: \"Authorization\";\n readonly prefix: \"Bearer \";\n };\n}\n\nexport type IntegrationDefinitionSource =\n | Readonly<{\n kind: \"google_discovery\";\n url: string;\n }>\n | Readonly<{\n kind: \"openapi\";\n url: string;\n operationPathPrefixes?: readonly string[];\n }>;\n\nexport interface IntegrationDefinition {\n readonly id: string;\n readonly name: string;\n readonly summary: string;\n readonly protocol: \"openapi\";\n readonly provider: Readonly<{\n id: \"google\" | \"microsoft\";\n domain: string;\n }>;\n readonly source: IntegrationDefinitionSource;\n readonly baseUrl: string;\n readonly authentication: IntegrationDefinitionOAuth2Authentication;\n readonly healthCheck?: Readonly<{\n operationKey: string;\n arguments: Readonly<Record<string, unknown>>;\n }>;\n readonly facets: readonly IntegrationFacetDefinition[];\n}\n\nexport interface IntegrationFacetDefinition {\n readonly facetKey: string;\n readonly kind: \"knowledge_source\" | \"inbound_trigger\" | \"delivery_destination\" | \"identity_link\";\n readonly configSchema: Readonly<Record<string, unknown>>;\n readonly capabilities: Readonly<Record<string, unknown>>;\n}\n\nconst accountIdentityFacet = (provider: \"google\" | \"microsoft\"): IntegrationFacetDefinition => ({\n facetKey: \"account-identity\",\n kind: \"identity_link\",\n configSchema: { type: \"object\", properties: {}, additionalProperties: false },\n capabilities: {\n provider,\n connectionRequired: true,\n identity: \"connected_account\",\n },\n});\n\nconst driveKnowledgeFacet = (\n provider: \"google-drive\" | \"microsoft-onedrive\",\n): IntegrationFacetDefinition => ({\n facetKey: \"drive-content\",\n kind: \"knowledge_source\",\n configSchema: {\n type: \"object\",\n required: [\"sources\", \"destination\", \"syncCadence\", \"readPolicy\"],\n properties: {\n sources: {\n type: \"array\",\n minItems: 1,\n maxItems: 100,\n items: {\n type: \"object\",\n required: [\"id\", \"name\", \"mimeType\", \"sourceKind\", \"includeDescendants\"],\n properties: {\n id: { type: \"string\", minLength: 1, maxLength: 512 },\n name: { type: \"string\", minLength: 1, maxLength: 1024 },\n mimeType: { type: \"string\", minLength: 1, maxLength: 256 },\n driveId: { type: \"string\", minLength: 1, maxLength: 512 },\n sourceKind: {\n type: \"string\",\n enum:\n provider === \"google-drive\"\n ? [\"my_drive\", \"shared_drive\", \"folder\"]\n : [\"my_drive\", \"shared_library\", \"folder\"],\n },\n includeDescendants: { type: \"boolean\" },\n },\n additionalProperties: false,\n },\n },\n destination: {\n type: \"object\",\n required: [\"authorityKind\", \"authorityAccountId\"],\n properties: {\n authorityKind: {\n type: \"string\",\n enum: [\"organization\", \"workspace\", \"personal\"],\n },\n authorityAccountId: { type: \"string\", minLength: 1, maxLength: 128 },\n authorityWorkspaceId: { type: \"string\", minLength: 1, maxLength: 128 },\n authoritySubjectId: { type: \"string\", minLength: 1, maxLength: 512 },\n collectionId: { type: \"string\", minLength: 1, maxLength: 512 },\n },\n additionalProperties: false,\n },\n syncCadence: { type: \"string\", enum: [\"manual\", \"hourly\", \"daily\"] },\n readPolicy: { type: \"string\", enum: [\"allow\", \"ask\", \"block\"] },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider,\n connectionRequired: true,\n sync: \"incremental\",\n cursor: provider === \"google-drive\" ? \"page_token\" : \"delta_link\",\n },\n});\n\nconst mailboxFacets = (\n provider: \"microsoft-outlook-mail\",\n): readonly IntegrationFacetDefinition[] => [\n {\n facetKey: \"mail-inbox\",\n kind: \"inbound_trigger\",\n configSchema: {\n type: \"object\",\n properties: {\n folder: { type: \"string\", minLength: 1, maxLength: 256 },\n unreadOnly: { type: \"boolean\" },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider,\n connectionRequired: true,\n delivery: \"poll\",\n cursor: \"delta_link\",\n },\n },\n {\n facetKey: \"mail-delivery\",\n kind: \"delivery_destination\",\n configSchema: {\n type: \"object\",\n properties: {\n fromAlias: { type: \"string\", minLength: 1, maxLength: 512 },\n saveToSent: { type: \"boolean\" },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider,\n connectionRequired: true,\n delivery: \"email\",\n },\n },\n accountIdentityFacet(\"microsoft\"),\n];\n\nconst googleDiscoveryUrl = (service: string, version: string): string =>\n `https://www.googleapis.com/discovery/v1/apis/${service}/${version}/rest`;\n\nconst googleOAuth = (scopes: readonly string[]): IntegrationDefinitionOAuth2Authentication => ({\n kind: \"oauth2\",\n provider: \"google\",\n authorizationUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n tokenUrl: \"https://oauth2.googleapis.com/token\",\n scopes: [\"openid\", \"email\", \"profile\", ...scopes],\n tokenPlacement: { carrier: \"header\", name: \"Authorization\", prefix: \"Bearer \" },\n});\n\nexport const GOOGLE_DRIVE_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"google-drive\",\n name: \"Google Drive\",\n summary: \"Files, folders, permissions, and shared drives.\",\n protocol: \"openapi\",\n provider: { id: \"google\", domain: \"www.googleapis.com\" },\n source: { kind: \"google_discovery\", url: googleDiscoveryUrl(\"drive\", \"v3\") },\n baseUrl: \"https://www.googleapis.com/drive/v3/\",\n authentication: googleOAuth([\"https://www.googleapis.com/auth/drive\"]),\n healthCheck: {\n operationKey: \"drive.about.get\",\n arguments: { query: { fields: \"user\" } },\n },\n facets: [driveKnowledgeFacet(\"google-drive\"), accountIdentityFacet(\"google\")],\n};\n\nexport const MICROSOFT_GRAPH_OPENAPI_URL =\n \"https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml\";\nexport const MICROSOFT_GRAPH_BASE_URL = \"https://graph.microsoft.com/v1.0\";\n\nconst microsoftOAuth = (scopes: readonly string[]): IntegrationDefinitionOAuth2Authentication => ({\n kind: \"oauth2\",\n provider: \"microsoft\",\n authorizationUrl: \"https://login.microsoftonline.com/common/oauth2/v2.0/authorize\",\n tokenUrl: \"https://login.microsoftonline.com/common/oauth2/v2.0/token\",\n scopes: [\"offline_access\", \"User.Read\", ...scopes],\n tokenPlacement: { carrier: \"header\", name: \"Authorization\", prefix: \"Bearer \" },\n});\n\nexport const MICROSOFT_OUTLOOK_MAIL_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-outlook-mail\",\n name: \"Outlook Mail\",\n summary: \"Messages, folders, attachments, settings, and sending mail.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n operationPathPrefixes: [\n \"/me/messages\",\n \"/me/mailFolders\",\n \"/me/sendMail\",\n \"/me/getMailTips\",\n \"/me/inferenceClassification\",\n \"/me/mailboxSettings\",\n \"/me/outlook\",\n ],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Mail.ReadWrite\", \"Mail.Send\", \"MailboxSettings.ReadWrite\"]),\n facets: mailboxFacets(\"microsoft-outlook-mail\"),\n};\n\nexport const MICROSOFT_OUTLOOK_CALENDAR_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-outlook-calendar\",\n name: \"Outlook Calendar\",\n summary: \"Calendars, events, availability, and scheduling.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n operationPathPrefixes: [\n \"/me/calendar\",\n \"/me/calendars\",\n \"/me/calendarGroups\",\n \"/me/calendarView\",\n \"/me/events\",\n \"/me/findMeetingTimes\",\n \"/me/reminderView\",\n ],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Calendars.ReadWrite\"]),\n facets: [\n {\n facetKey: \"calendar-events\",\n kind: \"inbound_trigger\",\n configSchema: {\n type: \"object\",\n properties: {\n calendarId: { type: \"string\", minLength: 1, maxLength: 512 },\n lookaheadDays: { type: \"integer\", minimum: 1, maximum: 365 },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider: \"microsoft-outlook-calendar\",\n connectionRequired: true,\n delivery: \"poll\",\n cursor: \"delta_link\",\n },\n },\n {\n facetKey: \"calendar-delivery\",\n kind: \"delivery_destination\",\n configSchema: {\n type: \"object\",\n properties: {\n calendarId: { type: \"string\", minLength: 1, maxLength: 512 },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider: \"microsoft-outlook-calendar\",\n connectionRequired: true,\n delivery: \"calendar_event\",\n },\n },\n accountIdentityFacet(\"microsoft\"),\n ],\n};\n\nexport const MICROSOFT_OUTLOOK_CONTACTS_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-outlook-contacts\",\n name: \"Outlook Contacts\",\n summary: \"Contacts, contact folders, and people suggestions.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n operationPathPrefixes: [\"/me/contacts\", \"/me/contactFolders\", \"/me/people\"],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Contacts.ReadWrite\", \"People.Read.All\"]),\n facets: [accountIdentityFacet(\"microsoft\")],\n};\n\nexport const MICROSOFT_ONEDRIVE_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-onedrive\",\n name: \"OneDrive\",\n summary: \"Drives, files, folders, sharing links, and permissions.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n operationPathPrefixes: [\"/me/drive\", \"/me/drives\", \"/me/followedSites\", \"/drives\", \"/shares\"],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Files.ReadWrite.All\", \"Sites.ReadWrite.All\"]),\n facets: [driveKnowledgeFacet(\"microsoft-onedrive\"), accountIdentityFacet(\"microsoft\")],\n};\n\nexport const CORE_INTEGRATION_DEFINITIONS: readonly IntegrationDefinition[] = [\n GOOGLE_DRIVE_INTEGRATION_DEFINITION,\n MICROSOFT_OUTLOOK_MAIL_INTEGRATION_DEFINITION,\n MICROSOFT_OUTLOOK_CALENDAR_INTEGRATION_DEFINITION,\n MICROSOFT_OUTLOOK_CONTACTS_INTEGRATION_DEFINITION,\n MICROSOFT_ONEDRIVE_INTEGRATION_DEFINITION,\n];\n\nexport function integrationDefinitionById(id: string): IntegrationDefinition | undefined {\n return CORE_INTEGRATION_DEFINITIONS.find((definition) => definition.id === id);\n}\n\nexport function integrationDefinitionProviderDomain(definition: IntegrationDefinition): string {\n return definition.provider.domain;\n}\n\nexport function integrationFacetDefinitions(\n definitionId: string | null | undefined,\n): readonly IntegrationFacetDefinition[] {\n return definitionId ? (integrationDefinitionById(definitionId)?.facets ?? []) : [];\n}\n\nexport function filterOpenApiDocumentForDefinition(\n document: Record<string, unknown>,\n definition: IntegrationDefinition,\n): Record<string, unknown> {\n if (definition.source.kind !== \"openapi\" || !definition.source.operationPathPrefixes?.length) {\n return document;\n }\n const operationPathPrefixes = definition.source.operationPathPrefixes;\n if (!isRecord(document.paths)) {\n throw new IntegrationProtocolError(\"openapi_paths\", \"OpenAPI document has no paths object\");\n }\n const paths = Object.fromEntries(\n Object.entries(document.paths).filter(([path]) =>\n operationPathPrefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`)),\n ),\n );\n if (Object.keys(paths).length === 0) {\n throw new IntegrationProtocolError(\n \"integration_definition_empty\",\n `${definition.name} did not match any operations in the supplied OpenAPI document`,\n );\n }\n return {\n ...document,\n paths,\n servers: [{ url: definition.baseUrl }],\n };\n}\n\nexport function googleDiscoveryToOpenApi(discovery: unknown): Record<string, unknown> {\n if (!isRecord(discovery)) {\n throw new IntegrationProtocolError(\n \"google_discovery_shape\",\n \"Google Discovery document is invalid\",\n );\n }\n const rootUrl = stringValue(discovery.rootUrl) ?? stringValue(discovery.baseUrl);\n const servicePath = stringValue(discovery.servicePath) ?? \"\";\n if (!rootUrl || !URL.canParse(rootUrl)) {\n throw new IntegrationProtocolError(\n \"google_discovery_server\",\n \"Google Discovery document has no valid root URL\",\n );\n }\n const paths: Record<string, unknown> = {};\n collectGoogleMethods(discovery, discovery.methods, paths);\n collectGoogleResources(discovery, discovery.resources, paths);\n if (Object.keys(paths).length === 0) {\n throw new IntegrationProtocolError(\n \"google_discovery_empty\",\n \"Google Discovery document exposes no methods\",\n );\n }\n const scopes =\n isRecord(discovery.auth) && isRecord(discovery.auth.oauth2)\n ? discovery.auth.oauth2.scopes\n : undefined;\n const scopeMap = isRecord(scopes)\n ? Object.fromEntries(\n Object.entries(scopes).map(([scope, value]) => [\n scope,\n isRecord(value) && typeof value.description === \"string\" ? value.description : \"\",\n ]),\n )\n : {};\n return {\n openapi: \"3.1.0\",\n info: {\n title: stringValue(discovery.title) ?? stringValue(discovery.name) ?? \"Google API\",\n description: stringValue(discovery.description) ?? \"Google Discovery API\",\n version: stringValue(discovery.version) ?? \"v1\",\n },\n servers: [{ url: new URL(servicePath, rootUrl).toString() }],\n paths,\n components: {\n schemas: Object.fromEntries(\n Object.entries(isRecord(discovery.schemas) ? discovery.schemas : {}).map(\n ([name, schema]) => [name, convertGoogleSchema(schema)],\n ),\n ),\n securitySchemes: {\n googleOAuth2: {\n type: \"oauth2\",\n flows: {\n authorizationCode: {\n authorizationUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n tokenUrl: \"https://oauth2.googleapis.com/token\",\n scopes: scopeMap,\n },\n },\n },\n },\n },\n security: Object.keys(scopeMap).length > 0 ? [{ googleOAuth2: [] }] : [],\n };\n}\n\nfunction collectGoogleResources(\n document: Record<string, unknown>,\n value: unknown,\n paths: Record<string, unknown>,\n): void {\n if (!isRecord(value)) return;\n for (const resource of Object.values(value)) {\n if (!isRecord(resource)) continue;\n collectGoogleMethods(document, resource.methods, paths);\n collectGoogleResources(document, resource.resources, paths);\n }\n}\n\nfunction collectGoogleMethods(\n document: Record<string, unknown>,\n value: unknown,\n paths: Record<string, unknown>,\n): void {\n if (!isRecord(value)) return;\n for (const [fallbackId, rawMethod] of Object.entries(value)) {\n if (!isRecord(rawMethod)) continue;\n const path = stringValue(rawMethod.path);\n const httpMethod = stringValue(rawMethod.httpMethod)?.toLowerCase();\n if (!path || !httpMethod) continue;\n const parameters = Object.entries(isRecord(rawMethod.parameters) ? rawMethod.parameters : {})\n .sort(([left], [right]) => left.localeCompare(right))\n .flatMap(([name, rawParameter]): Record<string, unknown>[] => {\n if (!isRecord(rawParameter)) return [];\n const location = rawParameter.location === \"path\" ? \"path\" : \"query\";\n return [\n {\n name,\n in: location,\n required: location === \"path\" || rawParameter.required === true,\n ...(stringValue(rawParameter.description)\n ? { description: stringValue(rawParameter.description) }\n : {}),\n schema: convertGoogleSchema(rawParameter),\n },\n ];\n });\n const requestRef = isRecord(rawMethod.request)\n ? stringValue(rawMethod.request.$ref)\n : undefined;\n const responseRef = isRecord(rawMethod.response)\n ? stringValue(rawMethod.response.$ref)\n : undefined;\n const operation: Record<string, unknown> = {\n operationId: stringValue(rawMethod.id) ?? fallbackId,\n // Discovery descriptions are often full documentation paragraphs. Keep\n // them as descriptions and use the stable method identity for the short\n // OpenGeni tool display name.\n summary: stringValue(rawMethod.id) ?? fallbackId,\n description: stringValue(rawMethod.description),\n parameters,\n responses: {\n \"200\": {\n description: \"Successful response\",\n ...(responseRef\n ? {\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${escapeJsonPointer(responseRef)}` },\n },\n },\n }\n : {}),\n },\n },\n ...(Array.isArray(rawMethod.scopes) && rawMethod.scopes.length > 0\n ? { security: [{ googleOAuth2: rawMethod.scopes }] }\n : {}),\n };\n if (requestRef) {\n operation.requestBody = {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${escapeJsonPointer(requestRef)}` },\n },\n },\n };\n }\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n const existing = isRecord(paths[normalizedPath]) ? paths[normalizedPath] : {};\n paths[normalizedPath] = { ...existing, [httpMethod]: operation };\n }\n}\n\nfunction convertGoogleSchema(value: unknown, depth = 0): Record<string, unknown> {\n if (!isRecord(value) || depth > 20) return {};\n if (typeof value.$ref === \"string\") {\n return { $ref: `#/components/schemas/${escapeJsonPointer(value.$ref)}` };\n }\n const result: Record<string, unknown> = {};\n const type = stringValue(value.type);\n if (type) result.type = type === \"any\" ? undefined : type;\n for (const key of [\n \"description\",\n \"format\",\n \"pattern\",\n \"minimum\",\n \"maximum\",\n \"default\",\n ] as const) {\n if (value[key] !== undefined) result[key] = value[key];\n }\n if (Array.isArray(value.enum)) result.enum = value.enum;\n if (isRecord(value.properties)) {\n result.type = result.type ?? \"object\";\n result.properties = Object.fromEntries(\n Object.entries(value.properties).map(([name, schema]) => [\n name,\n convertGoogleSchema(schema, depth + 1),\n ]),\n );\n }\n if (value.items !== undefined) {\n result.type = result.type ?? \"array\";\n result.items = convertGoogleSchema(value.items, depth + 1);\n }\n if (value.additionalProperties !== undefined) {\n result.additionalProperties =\n value.additionalProperties === true\n ? true\n : convertGoogleSchema(value.additionalProperties, depth + 1);\n }\n if (Array.isArray(value.required)) result.required = value.required;\n return Object.fromEntries(Object.entries(result).filter(([, entry]) => entry !== undefined));\n}\n\nfunction escapeJsonPointer(value: string): string {\n return value.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","/**\n * Reviewed consent copy for the core API integration definitions.\n *\n * Presentation only: nothing here grants a scope, selects a connection, or\n * replaces server-side authorization. The copy used to live hardcoded in the\n * web bundle (`REVIEWED_INTEGRATION_EXPERIENCES`); it is served with the\n * definition now so polishing a consent screen is a data change, not a\n * frontend release. The web keeps its generic fallback for any definition or\n * field missing here. Gmail's reviewed presentation lives on its catalog row\n * instead (`data/catalog/curated.json`): Gmail is a Connector, not one of\n * these API integration definitions.\n *\n * MCP connectors carry the same shape on their curated catalog row\n * (`presentation` in `data/catalog/curated.json` -> importer ->\n * `capability_catalog_items.metadata.presentation`).\n */\n\nexport type IntegrationPresentationIcon = \"calendar\" | \"cloud\" | \"contacts\" | \"files\" | \"mail\";\n\nexport type IntegrationPresentationCopy = {\n readonly providerName?: string;\n readonly icon?: IntegrationPresentationIcon;\n readonly introduction?: string;\n readonly capabilities?: readonly { readonly title: string; readonly description: string }[];\n readonly permissionSummary?: string;\n readonly scopeLabels?: Readonly<\n Record<string, { readonly label: string; readonly description: string }>\n >;\n};\n\nexport const INTEGRATION_DEFINITION_PRESENTATIONS: Readonly<\n Record<string, IntegrationPresentationCopy>\n> = {\n \"google-drive\": {\n providerName: \"Google\",\n icon: \"files\",\n introduction: \"Let agents work with files in the Google Drive account you choose.\",\n capabilities: [\n {\n title: \"Find files and folders\",\n description: \"Browse and search content in My Drive and shared drives.\",\n },\n {\n title: \"Create and update content\",\n description: \"Work with files and folders through the reviewed Drive tools.\",\n },\n {\n title: \"Manage sharing\",\n description: \"Review and update links, permissions, and shared-drive content.\",\n },\n ],\n permissionSummary:\n \"Google asks for access to the Drive account you approve, including files shared with that account.\",\n scopeLabels: {\n \"https://www.googleapis.com/auth/drive\": {\n label: \"Work with Google Drive files\",\n description: \"See, create, edit, organize, and share files available to this account.\",\n },\n },\n },\n \"microsoft-outlook-mail\": {\n providerName: \"Microsoft\",\n icon: \"mail\",\n introduction: \"Let agents work with mail in the Microsoft account you choose.\",\n capabilities: [\n {\n title: \"Find and understand mail\",\n description: \"Search messages, folders, and attachments for useful context.\",\n },\n {\n title: \"Draft and send messages\",\n description: \"Prepare, update, and send mail through the reviewed Outlook tools.\",\n },\n {\n title: \"Manage mailbox settings\",\n description: \"Work with supported folders, classifications, and mailbox preferences.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for mail and mailbox-setting access for the account you approve.\",\n scopeLabels: {\n \"Mail.ReadWrite\": {\n label: \"Read and update mail\",\n description: \"Work with messages, folders, and attachments in this mailbox.\",\n },\n \"Mail.Send\": {\n label: \"Send mail\",\n description: \"Send messages as the connected Microsoft account.\",\n },\n \"MailboxSettings.ReadWrite\": {\n label: \"Manage mailbox settings\",\n description: \"Read and update supported Outlook mailbox preferences.\",\n },\n },\n },\n \"microsoft-outlook-calendar\": {\n providerName: \"Microsoft\",\n icon: \"calendar\",\n introduction: \"Let agents help coordinate the calendars in your Microsoft account.\",\n capabilities: [\n {\n title: \"Understand your schedule\",\n description: \"Review calendars, events, availability, and reminders.\",\n },\n {\n title: \"Plan meetings\",\n description: \"Find suitable times and coordinate calendar activity.\",\n },\n {\n title: \"Manage events\",\n description: \"Create and update events through the reviewed calendar tools.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for permission to view and manage calendars for the account you approve.\",\n scopeLabels: {\n \"Calendars.ReadWrite\": {\n label: \"View and manage calendars\",\n description: \"Read, create, update, and organize calendar events.\",\n },\n },\n },\n \"microsoft-outlook-contacts\": {\n providerName: \"Microsoft\",\n icon: \"contacts\",\n introduction: \"Let agents work with contacts in your Microsoft account.\",\n capabilities: [\n {\n title: \"Find people\",\n description: \"Look up contacts and relevant people suggestions.\",\n },\n {\n title: \"Organize contacts\",\n description: \"Work with contacts and contact folders.\",\n },\n {\n title: \"Keep details current\",\n description: \"Create or update contact information through reviewed tools.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for contact access and people suggestions for the account you approve.\",\n scopeLabels: {\n \"Contacts.ReadWrite\": {\n label: \"View and manage contacts\",\n description: \"Read, create, update, and organize contacts and contact folders.\",\n },\n \"People.Read.All\": {\n label: \"Find relevant people\",\n description: \"Use people suggestions available to the connected account.\",\n },\n },\n },\n \"microsoft-onedrive\": {\n providerName: \"Microsoft\",\n icon: \"cloud\",\n introduction: \"Let agents work with files in the Microsoft account you choose.\",\n capabilities: [\n {\n title: \"Find files and folders\",\n description: \"Browse drives, folders, shared items, and sites available to the account.\",\n },\n {\n title: \"Create and update content\",\n description: \"Work with OneDrive and SharePoint files through reviewed tools.\",\n },\n {\n title: \"Manage sharing\",\n description: \"Review and update sharing links and permissions.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for file and site access anywhere the connected account already has access.\",\n scopeLabels: {\n \"Files.ReadWrite.All\": {\n label: \"Work with accessible files\",\n description: \"Read, create, update, and organize files available to this account.\",\n },\n \"Sites.ReadWrite.All\": {\n label: \"Work with accessible sites\",\n description: \"Read and update files in SharePoint sites available to this account.\",\n },\n },\n },\n};\n"],"mappings":"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","names":["adapter","isRecord","normalizeMcpSchema","isRecord","stringValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/auth.ts","../src/graphql.ts","../src/http.ts","../src/revision.ts","../src/mcp-manifest.ts","../src/mcp-bridge.ts","../src/openapi.ts","../src/integration-definitions.ts","../src/integration-presentations.ts"],"sourcesContent":["import type { FetchLike, OutboundNetworkSettings } from \"@opengeni/network\";\n\nexport type IntegrationProtocol = \"mcp\" | \"openapi\" | \"graphql\";\nexport type IntegrationToolSafety = \"read\" | \"write\" | \"destructive\";\nexport type IntegrationApprovalMode = \"never\" | \"ask\";\n\nexport type JsonSchema = Readonly<Record<string, unknown>>;\n\nexport interface IntegrationToolDefinition {\n readonly id: string;\n readonly operationKey: string;\n readonly name: string;\n readonly description: string;\n readonly inputSchema: JsonSchema;\n readonly outputSchema?: JsonSchema;\n readonly safety: IntegrationToolSafety;\n readonly approvalMode: IntegrationApprovalMode;\n readonly deprecated: boolean;\n}\n\nexport type CredentialCarrier = \"header\" | \"query\" | \"cookie\";\n\nexport interface IntegrationCredentialPlacement {\n readonly carrier: CredentialCarrier;\n readonly name: string;\n readonly value: string;\n readonly prefix?: string;\n}\n\nexport interface IntegrationCredentialAudience {\n /** Exact normalized origin the credential may reach. */\n readonly origin: string;\n /** Optional normalized path prefix. Defaults to `/`. */\n readonly pathPrefix?: string;\n}\n\nexport interface ResolvedIntegrationCredential {\n readonly audience: IntegrationCredentialAudience;\n readonly placements: readonly IntegrationCredentialPlacement[];\n /** Exact accepted-attempt fence invoked immediately before one HTTP request. */\n readonly authorizeProviderRequest?: () => Promise<boolean>;\n readonly expiresAt?: string;\n readonly scope?: readonly string[];\n}\n\nexport interface IntegrationInvocationAuthority {\n readonly accountId: string;\n readonly workspaceId: string;\n readonly sessionId?: string;\n readonly rootSessionId?: string;\n readonly turnId?: string;\n readonly attemptId?: string;\n readonly initiatingSubjectId?: string;\n readonly connectionRef?: string;\n}\n\nexport interface ResolveIntegrationCredentialRequest extends IntegrationInvocationAuthority {\n readonly protocol: Exclude<IntegrationProtocol, \"mcp\">;\n readonly definitionId: string;\n readonly revisionId: string;\n readonly operationKey: string;\n readonly destinationUrl: string;\n readonly requiredScopeAlternatives?: readonly (readonly string[])[];\n /** Refresh the exact bound Connection for a safe retry or a later call. */\n readonly forceRefresh?: boolean;\n}\n\nexport interface IntegrationCredentialResolver {\n resolve(\n request: ResolveIntegrationCredentialRequest,\n ): Promise<ResolvedIntegrationCredential | null>;\n}\n\nexport interface IntegrationTransport {\n readonly fetch: FetchLike;\n}\n\nexport interface PinnedIntegrationTransportOptions {\n readonly network: OutboundNetworkSettings;\n readonly fetchImpl?: FetchLike;\n}\n\nexport type IntegrationRevisionSource = {\n readonly url?: string;\n readonly provider?: string;\n readonly fetchedAt?: string;\n};\n\nexport interface IntegrationRevision<\n TBinding = unknown,\n TProtocol extends Exclude<IntegrationProtocol, \"mcp\"> = Exclude<IntegrationProtocol, \"mcp\">,\n> {\n readonly id: string;\n readonly protocol: TProtocol;\n readonly definitionId: string;\n readonly contentSha256: string;\n readonly source: IntegrationRevisionSource;\n readonly title: string;\n readonly description?: string;\n readonly version?: string;\n readonly tools: readonly IntegrationToolDefinition[];\n readonly bindings: Readonly<Record<string, TBinding>>;\n}\n\nexport type InvocationOutcome = \"not_started\" | \"unknown\" | \"failed\";\n\nexport class IntegrationProtocolError extends Error {\n constructor(\n readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = \"IntegrationProtocolError\";\n }\n}\n\nexport class IntegrationInvocationError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly outcome: InvocationOutcome,\n readonly retryable: boolean,\n readonly status?: number,\n ) {\n super(message);\n this.name = \"IntegrationInvocationError\";\n }\n}\n","import type { IntegrationCredentialPlacement, ResolvedIntegrationCredential } from \"./types\";\nimport { IntegrationInvocationError } from \"./types\";\n\nconst forbiddenCredentialHeaders = new Set([\n \"connection\",\n \"content-length\",\n \"host\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n]);\nconst MAX_CREDENTIAL_PLACEMENTS = 32;\nconst MAX_CREDENTIAL_NAME_LENGTH = 256;\nconst MAX_CREDENTIAL_VALUE_LENGTH = 16_384;\nconst headerNamePattern = /^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/;\nconst queryNamePattern = /^[A-Za-z0-9._~-]+$/;\nconst cookieNamePattern = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;\n\nfunction normalizeAudiencePath(path: string | undefined): string {\n if (!path?.trim()) return \"/\";\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n return normalized.endsWith(\"/\") ? normalized : `${normalized}/`;\n}\n\nexport function assertCredentialAudience(\n credential: ResolvedIntegrationCredential,\n destination: URL,\n): void {\n let audience: URL;\n try {\n audience = new URL(credential.audience.origin);\n } catch {\n throw new IntegrationInvocationError(\n \"credential_audience_invalid\",\n \"Connection credential audience is invalid\",\n \"not_started\",\n false,\n );\n }\n if (\n audience.origin !== destination.origin ||\n audience.username ||\n audience.password ||\n audience.pathname !== \"/\" ||\n audience.search ||\n audience.hash\n ) {\n throw new IntegrationInvocationError(\n \"credential_audience_mismatch\",\n \"Connection credential is not authorized for this integration destination\",\n \"not_started\",\n false,\n );\n }\n const prefix = normalizeAudiencePath(credential.audience.pathPrefix);\n const path = destination.pathname.endsWith(\"/\")\n ? destination.pathname\n : `${destination.pathname}/`;\n if (!path.startsWith(prefix)) {\n throw new IntegrationInvocationError(\n \"credential_path_mismatch\",\n \"Connection credential is not authorized for this integration path\",\n \"not_started\",\n false,\n );\n }\n}\n\nfunction placementValue(placement: IntegrationCredentialPlacement): string {\n return `${placement.prefix ?? \"\"}${placement.value}`;\n}\n\nfunction validateCredentialPlacements(placements: readonly IntegrationCredentialPlacement[]): void {\n if (placements.length === 0 || placements.length > MAX_CREDENTIAL_PLACEMENTS) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential placement count is invalid\",\n \"not_started\",\n false,\n );\n }\n const seen = new Set<string>();\n for (const placement of placements) {\n const name = placement.name;\n const value = placementValue(placement);\n const normalizedName = placement.carrier === \"header\" ? name.toLowerCase() : name;\n if (\n name.length === 0 ||\n name.length > MAX_CREDENTIAL_NAME_LENGTH ||\n placement.value.length === 0 ||\n value.length > MAX_CREDENTIAL_VALUE_LENGTH ||\n /[\\r\\n\\0]/.test(name) ||\n /[\\r\\n\\0]/.test(value)\n ) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential placement is invalid\",\n \"not_started\",\n false,\n );\n }\n if (placement.carrier === \"header\") {\n if (\n !headerNamePattern.test(name) ||\n forbiddenCredentialHeaders.has(normalizedName) ||\n normalizedName.startsWith(\"sec-\")\n ) {\n throw new IntegrationInvocationError(\n \"credential_header_forbidden\",\n \"Connection credential targets a forbidden request header\",\n \"not_started\",\n false,\n );\n }\n } else if (placement.carrier === \"query\") {\n if (!queryNamePattern.test(name)) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential query placement is invalid\",\n \"not_started\",\n false,\n );\n }\n } else if (!cookieNamePattern.test(name) || /;/.test(value)) {\n throw new IntegrationInvocationError(\n \"credential_cookie_invalid\",\n \"Connection credential cookie placement is invalid\",\n \"not_started\",\n false,\n );\n }\n const key = `${placement.carrier}\\0${normalizedName}`;\n if (seen.has(key)) {\n throw new IntegrationInvocationError(\n \"credential_placement_invalid\",\n \"Connection credential placements contain a duplicate destination\",\n \"not_started\",\n false,\n );\n }\n seen.add(key);\n }\n}\n\nexport function applyCredentialPlacements(\n destination: URL,\n headers: Headers,\n credential: ResolvedIntegrationCredential,\n): void {\n assertCredentialAudience(credential, destination);\n validateCredentialPlacements(credential.placements);\n const cookies: string[] = [];\n for (const placement of credential.placements) {\n const name = placement.name;\n const value = placementValue(placement);\n if (placement.carrier === \"header\") {\n headers.set(name, value);\n } else if (placement.carrier === \"query\") {\n destination.searchParams.set(name, value);\n } else {\n cookies.push(`${name}=${value}`);\n }\n }\n if (cookies.length > 0) {\n const current = headers.get(\"cookie\");\n headers.set(\"cookie\", [...(current ? [current] : []), ...cookies].join(\"; \"));\n }\n}\n","import type { CallToolResultContent, MCPCallToolOptions, MCPServer } from \"@openai/agents\";\nimport {\n buildClientSchema,\n getIntrospectionQuery,\n getNamedType,\n isEnumType,\n isInputObjectType,\n isInterfaceType,\n isListType,\n isNonNullType,\n isObjectType,\n isScalarType,\n isUnionType,\n parse,\n type GraphQLInputType,\n type GraphQLNamedType,\n type GraphQLOutputType,\n type IntrospectionQuery,\n} from \"graphql\";\n\nimport { applyCredentialPlacements } from \"./auth\";\nimport {\n DEFAULT_INTEGRATION_RESPONSE_BYTES,\n DEFAULT_INTEGRATION_TIMEOUT_MS,\n MAX_INTEGRATION_SPEC_BYTES,\n MAX_INTEGRATION_TOOLS,\n fetchWithDeadline,\n readIntegrationResponse,\n} from \"./http\";\nimport { canonicalJson, immutableRevisionId, sha256Hex, stableToolId } from \"./revision\";\nimport type {\n IntegrationCredentialResolver,\n IntegrationInvocationAuthority,\n IntegrationRevision,\n IntegrationTransport,\n JsonSchema,\n} from \"./types\";\nimport { IntegrationInvocationError, IntegrationProtocolError } from \"./types\";\n\nexport interface GraphqlOperationBinding {\n readonly kind: \"query\" | \"mutation\";\n readonly fieldName: string;\n readonly operationName: string;\n readonly variableDefinitions: readonly string[];\n readonly variableNames: readonly string[];\n readonly defaultSelection?: string;\n readonly selectionAllowed: boolean;\n}\n\nexport type GraphqlRevision = IntegrationRevision<GraphqlOperationBinding, \"graphql\">;\n\nexport interface CompileGraphqlOptions {\n readonly definitionId: string;\n readonly endpoint: string;\n readonly name?: string;\n readonly sourceUrl?: string;\n readonly provider?: string;\n}\n\nexport interface GraphqlServerOptions {\n readonly revision: GraphqlRevision;\n readonly endpoint: string;\n readonly transport: IntegrationTransport;\n readonly credentialResolver?: IntegrationCredentialResolver;\n readonly authority: IntegrationInvocationAuthority;\n readonly staticHeaders?: Readonly<Record<string, string>>;\n readonly staticQuery?: Readonly<Record<string, string>>;\n readonly timeoutMs?: number;\n readonly maxResponseBytes?: number;\n}\n\ntype LocalMcpTool = Awaited<ReturnType<MCPServer[\"listTools\"]>>[number];\n\nexport function compileGraphqlRevision(\n introspection: IntrospectionQuery | { readonly data?: IntrospectionQuery } | string,\n options: CompileGraphqlOptions,\n): GraphqlRevision {\n const document = parseIntrospection(introspection);\n let schema;\n try {\n schema = buildClientSchema(document);\n } catch {\n throw new IntegrationProtocolError(\n \"graphql_introspection_invalid\",\n \"GraphQL introspection result cannot build a client schema\",\n );\n }\n const endpoint = validateGraphqlEndpoint(options.endpoint);\n const contentSha256 = sha256Hex(canonicalJson(document));\n const id = immutableRevisionId(\"graphql\", contentSha256);\n const tools = [] as GraphqlRevision[\"tools\"] extends readonly (infer T)[] ? T[] : never;\n const bindings: Record<string, GraphqlOperationBinding> = {};\n const seen = new Map<string, number>();\n\n for (const [kind, root] of [\n [\"query\", schema.getQueryType()],\n [\"mutation\", schema.getMutationType()],\n ] as const) {\n if (!root) continue;\n for (const field of Object.values(root.getFields()).sort((left, right) =>\n left.name.localeCompare(right.name),\n )) {\n const toolId = stableToolId(`${kind}_${field.name}`, seen);\n const namedOutput = getNamedType(field.type);\n const selectionAllowed = !isLeafType(namedOutput);\n const defaultSelection = selectionAllowed\n ? buildDefaultSelection(field.type, new Set(), 0)\n : undefined;\n const properties: Record<string, unknown> = Object.fromEntries(\n field.args.map((arg) => [\n arg.name,\n {\n ...inputTypeSchema(arg.type, new Set(), 0),\n ...(arg.description ? { description: arg.description } : {}),\n },\n ]),\n );\n if (selectionAllowed) {\n properties.select = {\n type: \"string\",\n description:\n \"Optional GraphQL field selection without outer braces. The default selects safe scalar fields.\",\n maxLength: 4_000,\n };\n }\n const required = field.args.filter((arg) => isNonNullType(arg.type)).map((arg) => arg.name);\n const description = [\n field.description?.trim(),\n kind === \"mutation\"\n ? \"Changes external state and requires approval.\"\n : \"Read-only GraphQL query.\",\n ]\n .filter(Boolean)\n .join(\" \");\n tools.push({\n id: toolId,\n operationKey: `${kind}:${field.name}`,\n name: field.name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n },\n safety: kind === \"query\" ? \"read\" : \"write\",\n approvalMode: kind === \"query\" ? \"never\" : \"ask\",\n deprecated: field.deprecationReason != null,\n });\n bindings[toolId] = {\n kind,\n fieldName: field.name,\n operationName: stableGraphqlName(`${kind}_${field.name}`),\n variableDefinitions: field.args.map((arg) => `$${arg.name}: ${String(arg.type)}`),\n variableNames: field.args.map((arg) => arg.name),\n ...(defaultSelection ? { defaultSelection } : {}),\n selectionAllowed,\n };\n if (tools.length > MAX_INTEGRATION_TOOLS) {\n throw new IntegrationProtocolError(\n \"graphql_tool_limit\",\n `GraphQL schema exceeds the ${MAX_INTEGRATION_TOOLS}-tool limit`,\n );\n }\n }\n }\n if (tools.length === 0) {\n throw new IntegrationProtocolError(\"graphql_empty\", \"GraphQL schema exposes no root fields\");\n }\n return {\n id,\n protocol: \"graphql\",\n definitionId: options.definitionId,\n contentSha256,\n source: {\n url: options.sourceUrl ?? endpoint,\n ...(options.provider ? { provider: options.provider } : {}),\n },\n title: options.name?.trim() || options.definitionId,\n tools,\n bindings,\n };\n}\n\nexport async function fetchGraphqlIntrospection(\n options: Omit<GraphqlServerOptions, \"revision\">,\n): Promise<IntrospectionQuery> {\n const request = { query: getIntrospectionQuery({ descriptions: true }) };\n const firstCredential = await resolveGraphqlCredential(\n options,\n \"graphql-introspection\",\n \"pending\",\n \"__introspection\",\n false,\n );\n let response = await sendGraphqlRequest(options, request, firstCredential);\n if (response.status === 401 && options.credentialResolver && options.authority.connectionRef) {\n const refreshed = await resolveGraphqlCredential(\n options,\n \"graphql-introspection\",\n \"pending\",\n \"__introspection\",\n true,\n );\n await response.body?.cancel().catch(() => undefined);\n if (!refreshed) {\n throw new IntegrationInvocationError(\n \"graphql_introspection_rejected\",\n \"GraphQL endpoint did not return an introspection schema\",\n \"failed\",\n false,\n 401,\n );\n }\n response = await sendGraphqlRequest(options, request, refreshed);\n }\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"redirect_rejected\",\n \"GraphQL endpoint attempted to redirect the introspection request\",\n \"unknown\",\n false,\n response.status,\n );\n }\n const body = await readIntegrationResponse(response, MAX_INTEGRATION_SPEC_BYTES);\n if (!response.ok || !isRecord(body.data) || !isRecord(body.data.data)) {\n throw new IntegrationInvocationError(\n \"graphql_introspection_rejected\",\n \"GraphQL endpoint did not return an introspection schema\",\n \"failed\",\n false,\n response.status,\n );\n }\n return body.data.data as unknown as IntrospectionQuery;\n}\n\nexport class GraphqlMcpServer implements MCPServer {\n readonly cacheToolsList = true;\n readonly useStructuredContent = true;\n readonly name: string;\n\n constructor(private readonly options: GraphqlServerOptions) {\n this.name = `graphql:${stableToolId(options.revision.definitionId)}`;\n }\n\n async connect(): Promise<void> {}\n async close(): Promise<void> {}\n async invalidateToolsCache(): Promise<void> {}\n\n async listTools(): Promise<LocalMcpTool[]> {\n return this.options.revision.tools.map(\n (tool) =>\n ({\n name: tool.id,\n description: tool.description,\n inputSchema: normalizeMcpSchema(tool.inputSchema),\n annotations: {\n readOnlyHint: tool.safety === \"read\",\n destructiveHint: false,\n idempotentHint: tool.safety === \"read\",\n openWorldHint: true,\n },\n _meta: {\n \"opengeni/approvalMode\": tool.approvalMode,\n \"opengeni/operationKey\": tool.operationKey,\n \"opengeni/revisionId\": this.options.revision.id,\n },\n }) as LocalMcpTool,\n );\n }\n\n async callTool(\n toolName: string,\n args: Record<string, unknown> | null,\n _meta?: Record<string, unknown> | null,\n callOptions?: MCPCallToolOptions,\n ): Promise<CallToolResultContent> {\n const result = await invokeGraphqlOperation(\n this.options,\n toolName,\n args ?? {},\n callOptions?.signal,\n );\n const content = [\n { type: \"text\" as const, text: JSON.stringify(result) },\n ] as CallToolResultContent;\n content.structuredContent = result;\n content.isError = result.ok === false;\n return content;\n }\n}\n\nexport function createGraphqlMcpServer(options: GraphqlServerOptions): MCPServer {\n return new GraphqlMcpServer(options);\n}\n\nexport async function invokeGraphqlOperation(\n options: GraphqlServerOptions,\n toolId: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<Record<string, unknown>> {\n const binding = options.revision.bindings[toolId];\n if (!binding) {\n throw new IntegrationInvocationError(\n \"operation_not_found\",\n \"GraphQL operation is not present in the frozen revision\",\n \"not_started\",\n false,\n );\n }\n const select = binding.selectionAllowed\n ? validateGraphqlSelection(\n typeof args.select === \"string\" ? args.select : (binding.defaultSelection ?? \"__typename\"),\n )\n : undefined;\n const variables = Object.fromEntries(\n binding.variableNames.flatMap((name) => (args[name] === undefined ? [] : [[name, args[name]]])),\n );\n const definitions = binding.variableDefinitions.length\n ? `(${binding.variableDefinitions.join(\", \")})`\n : \"\";\n const argumentsText = binding.variableNames.length\n ? `(${binding.variableNames.map((name) => `${name}: $${name}`).join(\", \")})`\n : \"\";\n const query = `${binding.kind} ${binding.operationName}${definitions} { ${binding.fieldName}${argumentsText}${select ? ` { ${select} }` : \"\"} }`;\n const request = { query, variables, operationName: binding.operationName };\n const firstCredential = await resolveGraphqlCredential(\n options,\n options.revision.definitionId,\n options.revision.id,\n toolId,\n false,\n );\n let response = await sendGraphqlRequest(options, request, firstCredential, signal);\n if (response.status === 401 && options.credentialResolver && options.authority.connectionRef) {\n const refreshed = await resolveGraphqlCredential(\n options,\n options.revision.definitionId,\n options.revision.id,\n toolId,\n true,\n );\n await response.body?.cancel().catch(() => undefined);\n if (binding.kind === \"query\" && refreshed) {\n response = await sendGraphqlRequest(options, request, refreshed, signal);\n } else {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this GraphQL operation\",\n binding.kind === \"mutation\" ? \"unknown\" : \"failed\",\n false,\n 401,\n );\n }\n }\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"redirect_rejected\",\n \"GraphQL endpoint attempted to redirect a credential-bearing request\",\n binding.kind === \"mutation\" ? \"unknown\" : \"failed\",\n false,\n response.status,\n );\n }\n const payload = await readIntegrationResponse(\n response,\n options.maxResponseBytes ?? DEFAULT_INTEGRATION_RESPONSE_BYTES,\n );\n if (response.status === 401 || response.status === 403) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this GraphQL operation\",\n binding.kind === \"mutation\" ? \"unknown\" : \"failed\",\n false,\n response.status,\n );\n }\n const graph = isRecord(payload.data) ? payload.data : {};\n return {\n ok: response.ok && !Array.isArray(graph.errors),\n status: response.status,\n data: graph.data ?? null,\n errors: graph.errors ?? null,\n };\n}\n\nasync function resolveGraphqlCredential(\n options: Omit<GraphqlServerOptions, \"revision\"> | GraphqlServerOptions,\n definitionId: string,\n revisionId: string,\n operationKey: string,\n forceRefresh: boolean,\n): Promise<Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>> {\n if (!options.credentialResolver || !options.authority.connectionRef) return null;\n const credential = await options.credentialResolver.resolve({\n ...options.authority,\n protocol: \"graphql\",\n definitionId,\n revisionId,\n operationKey,\n destinationUrl: graphqlEndpoint(options).toString(),\n ...(forceRefresh ? { forceRefresh: true } : {}),\n });\n if (!credential && !forceRefresh) {\n throw new IntegrationInvocationError(\n \"connection_required\",\n \"This GraphQL integration needs a connected account\",\n \"not_started\",\n false,\n );\n }\n return credential;\n}\n\nasync function sendGraphqlRequest(\n options: Omit<GraphqlServerOptions, \"revision\"> | GraphqlServerOptions,\n request: Record<string, unknown>,\n credential: Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>,\n signal?: AbortSignal,\n): Promise<Response> {\n const endpoint = graphqlEndpoint(options);\n const headers = new Headers(options.staticHeaders);\n headers.set(\"accept\", \"application/json\");\n headers.set(\"content-type\", \"application/json\");\n if (credential) applyCredentialPlacements(endpoint, headers, credential);\n if (credential?.authorizeProviderRequest) {\n let authorized = false;\n try {\n authorized = await credential.authorizeProviderRequest();\n } catch {\n authorized = false;\n }\n if (!authorized) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n \"not_started\",\n false,\n );\n }\n }\n return await fetchWithDeadline(\n options.transport,\n endpoint,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n ...(signal ? { signal } : {}),\n },\n options.timeoutMs ?? DEFAULT_INTEGRATION_TIMEOUT_MS,\n );\n}\n\nfunction graphqlEndpoint(options: Pick<GraphqlServerOptions, \"endpoint\" | \"staticQuery\">): URL {\n const endpoint = new URL(validateGraphqlEndpoint(options.endpoint));\n for (const [name, value] of Object.entries(options.staticQuery ?? {})) {\n endpoint.searchParams.set(name, value);\n }\n return endpoint;\n}\n\nexport function validateGraphqlSelection(value: string): string {\n const normalized = value.trim();\n if (!normalized || normalized.length > 4_000) {\n throw new IntegrationInvocationError(\n \"graphql_selection_invalid\",\n \"GraphQL selection must contain between 1 and 4000 characters\",\n \"not_started\",\n false,\n );\n }\n try {\n const document = parse(`fragment OpenGeniSelection on Placeholder { ${normalized} }`);\n if (\n document.definitions.length !== 1 ||\n document.definitions[0]?.kind !== \"FragmentDefinition\"\n ) {\n throw new Error(\"invalid selection document\");\n }\n return normalized;\n } catch {\n throw new IntegrationInvocationError(\n \"graphql_selection_invalid\",\n \"GraphQL selection is invalid\",\n \"not_started\",\n false,\n );\n }\n}\n\nfunction parseIntrospection(\n value: IntrospectionQuery | { readonly data?: IntrospectionQuery } | string,\n): IntrospectionQuery {\n let parsed: unknown = value;\n if (typeof value === \"string\") {\n if (Buffer.byteLength(value) > MAX_INTEGRATION_SPEC_BYTES) {\n throw new IntegrationProtocolError(\n \"graphql_introspection_size\",\n `GraphQL introspection exceeds ${MAX_INTEGRATION_SPEC_BYTES} bytes`,\n );\n }\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new IntegrationProtocolError(\n \"graphql_introspection_parse\",\n \"GraphQL introspection is not valid JSON\",\n );\n }\n }\n if (isRecord(parsed) && isRecord(parsed.data) && isRecord(parsed.data.__schema)) {\n return parsed.data as unknown as IntrospectionQuery;\n }\n if (isRecord(parsed) && isRecord(parsed.__schema)) {\n return parsed as unknown as IntrospectionQuery;\n }\n throw new IntegrationProtocolError(\n \"graphql_introspection_shape\",\n \"GraphQL introspection result has no __schema object\",\n );\n}\n\nfunction validateGraphqlEndpoint(value: string): string {\n let endpoint: URL;\n try {\n endpoint = new URL(value);\n } catch {\n throw new IntegrationProtocolError(\n \"graphql_endpoint_invalid\",\n \"GraphQL endpoint URL is invalid\",\n );\n }\n if (\n !/^https?:$/.test(endpoint.protocol) ||\n endpoint.username ||\n endpoint.password ||\n endpoint.hash\n ) {\n throw new IntegrationProtocolError(\n \"graphql_endpoint_invalid\",\n \"GraphQL endpoint URL is invalid\",\n );\n }\n return endpoint.toString();\n}\n\nfunction inputTypeSchema(input: GraphQLInputType, seen: Set<string>, depth: number): JsonSchema {\n if (depth > 12) return {};\n if (isNonNullType(input)) return inputTypeSchema(input.ofType, seen, depth + 1);\n if (isListType(input)) {\n return { type: \"array\", items: inputTypeSchema(input.ofType, seen, depth + 1) };\n }\n const type = getNamedType(input);\n if (isScalarType(type)) return scalarSchema(type.name);\n if (isEnumType(type))\n return { type: \"string\", enum: type.getValues().map((entry) => entry.name) };\n if (isInputObjectType(type)) {\n if (seen.has(type.name)) return { type: \"object\", additionalProperties: true };\n const nextSeen = new Set(seen).add(type.name);\n const fields = Object.values(type.getFields());\n return {\n type: \"object\",\n properties: Object.fromEntries(\n fields.map((field) => [\n field.name,\n {\n ...inputTypeSchema(field.type, nextSeen, depth + 1),\n ...(field.description ? { description: field.description } : {}),\n },\n ]),\n ),\n required: fields.filter((field) => isNonNullType(field.type)).map((field) => field.name),\n additionalProperties: false,\n };\n }\n return {};\n}\n\nfunction scalarSchema(name: string): JsonSchema {\n if (name === \"Boolean\") return { type: \"boolean\" };\n if (name === \"Int\") return { type: \"integer\" };\n if (name === \"Float\") return { type: \"number\" };\n if (name === \"ID\" || name === \"String\") return { type: \"string\" };\n return { description: `GraphQL scalar ${name}` };\n}\n\nfunction buildDefaultSelection(\n output: GraphQLOutputType,\n seen: Set<string>,\n depth: number,\n): string | undefined {\n const type = getNamedType(output);\n if (isLeafType(type)) return undefined;\n if (depth > 2 || seen.has(type.name)) return \"__typename\";\n if (isUnionType(type) || isInterfaceType(type)) return \"__typename\";\n if (!isObjectType(type)) return \"__typename\";\n const nextSeen = new Set(seen).add(type.name);\n const fields = Object.values(type.getFields());\n const scalarFields = fields.filter((field) => isLeafType(getNamedType(field.type))).slice(0, 20);\n const selections = scalarFields.map((field) => field.name);\n if (selections.length < 3 && depth < 2) {\n const nested = fields.find(\n (field) => field.args.length === 0 && !isLeafType(getNamedType(field.type)),\n );\n if (nested) {\n const child = buildDefaultSelection(nested.type, nextSeen, depth + 1);\n if (child) selections.push(`${nested.name} { ${child} }`);\n }\n }\n return selections.length ? selections.join(\" \") : \"__typename\";\n}\n\nfunction isLeafType(type: GraphQLNamedType): boolean {\n return isScalarType(type) || isEnumType(type);\n}\n\nfunction stableGraphqlName(value: string): string {\n const normalized = value.replace(/[^_0-9A-Za-z]/g, \"_\").replace(/^([^_A-Za-z])/, \"_$1\");\n return normalized || \"OpenGeniOperation\";\n}\n\nfunction normalizeMcpSchema(schema: JsonSchema): LocalMcpTool[\"inputSchema\"] {\n return {\n type: \"object\",\n properties: isRecord(schema.properties) ? schema.properties : {},\n required: Array.isArray(schema.required)\n ? schema.required.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n additionalProperties: schema.additionalProperties === true,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { pinnedFetch, readResponseBodyBounded, type FetchLike } from \"@opengeni/network\";\n\nimport type { IntegrationTransport, PinnedIntegrationTransportOptions } from \"./types\";\nimport { IntegrationInvocationError } from \"./types\";\n\nexport const DEFAULT_INTEGRATION_TIMEOUT_MS = 30_000;\nexport const DEFAULT_INTEGRATION_RESPONSE_BYTES = 4 * 1024 * 1024;\nexport const MAX_INTEGRATION_SPEC_BYTES = 8 * 1024 * 1024;\nexport const MAX_CURATED_INTEGRATION_SPEC_BYTES = 64 * 1024 * 1024;\nexport const MAX_INTEGRATION_TOOLS = 2_000;\n\nexport async function fetchIntegrationSourceDocument(\n transport: IntegrationTransport,\n sourceUrl: string,\n maxBytes = MAX_INTEGRATION_SPEC_BYTES,\n): Promise<Uint8Array> {\n const url = new URL(sourceUrl);\n const response = await fetchWithDeadline(\n transport,\n url,\n {\n method: \"GET\",\n headers: { accept: \"application/json, application/yaml, text/yaml, */*;q=0.5\" },\n },\n DEFAULT_INTEGRATION_TIMEOUT_MS,\n );\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"source_redirect_rejected\",\n \"Integration source attempted to redirect\",\n \"failed\",\n false,\n response.status,\n );\n }\n if (!response.ok) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"source_fetch_rejected\",\n \"Integration source could not be read\",\n \"failed\",\n response.status >= 500,\n response.status,\n );\n }\n return await readResponseBodyBounded(response, maxBytes, \"Integration source\");\n}\n\nexport function createPinnedIntegrationTransport(\n options: PinnedIntegrationTransportOptions,\n): IntegrationTransport {\n return {\n fetch: (input, init) =>\n pinnedFetch(input, init, options.network, {\n ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),\n label: \"Integration request\",\n requireHttpsOutsideLocalTest: true,\n }),\n };\n}\n\nexport function directIntegrationTransport(fetchImpl: FetchLike): IntegrationTransport {\n return { fetch: fetchImpl };\n}\n\nexport async function fetchWithDeadline(\n transport: IntegrationTransport,\n url: URL,\n init: RequestInit,\n timeoutMs = DEFAULT_INTEGRATION_TIMEOUT_MS,\n): Promise<Response> {\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 120_000) {\n throw new RangeError(\"integration timeout must be between 1 and 120000 milliseconds\");\n }\n const controller = new AbortController();\n const onAbort = () => controller.abort(init.signal?.reason);\n if (init.signal?.aborted) onAbort();\n else init.signal?.addEventListener(\"abort\", onAbort, { once: true });\n const timer = setTimeout(\n () => controller.abort(new Error(\"integration request timed out\")),\n timeoutMs,\n );\n try {\n return await transport.fetch(url, {\n ...init,\n signal: controller.signal,\n redirect: \"manual\",\n });\n } catch {\n const timedOut = controller.signal.aborted && !init.signal?.aborted;\n throw new IntegrationInvocationError(\n timedOut ? \"request_timeout\" : \"request_failed\",\n timedOut ? \"Integration request timed out\" : \"Integration request failed\",\n requestCouldHaveStarted(init.method) ? \"unknown\" : \"not_started\",\n !requestCouldHaveStarted(init.method),\n );\n } finally {\n clearTimeout(timer);\n init.signal?.removeEventListener(\"abort\", onAbort);\n }\n}\n\nfunction requestCouldHaveStarted(method: string | undefined): boolean {\n const normalized = (method ?? \"GET\").toUpperCase();\n return normalized !== \"GET\" && normalized !== \"HEAD\" && normalized !== \"OPTIONS\";\n}\n\nexport async function readIntegrationResponse(\n response: Response,\n maxBytes = DEFAULT_INTEGRATION_RESPONSE_BYTES,\n): Promise<{ data: unknown; contentType: string; bytes: number }> {\n const body = await readResponseBodyBounded(response, maxBytes, \"Integration response\");\n const contentType =\n response.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n if (body.byteLength === 0) return { data: null, contentType, bytes: 0 };\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(body);\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n try {\n return { data: JSON.parse(text), contentType, bytes: body.byteLength };\n } catch {\n throw new IntegrationInvocationError(\n \"response_json_invalid\",\n \"Integration returned invalid JSON\",\n \"failed\",\n false,\n response.status,\n );\n }\n }\n return { data: text, contentType, bytes: body.byteLength };\n}\n","import { createHash } from \"node:crypto\";\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalize(entry)]),\n );\n}\n\nexport function canonicalJson(value: unknown): string {\n return JSON.stringify(canonicalize(value));\n}\n\nexport function sha256Hex(value: string | Uint8Array): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function immutableRevisionId(protocol: string, contentSha256: string): string {\n if (!/^[a-f0-9]{64}$/.test(contentSha256)) {\n throw new Error(\"contentSha256 must be a lowercase SHA-256 digest\");\n }\n return `${protocol}:${contentSha256.slice(0, 24)}`;\n}\n\nexport function stableToolId(value: string, seen?: Map<string, number>): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, 54);\n const base = normalized || \"tool\";\n if (!seen) return base;\n const count = (seen.get(base) ?? 0) + 1;\n seen.set(base, count);\n return count === 1 ? base : `${base}_${count}`;\n}\n","import { stableToolId } from \"./revision\";\n\nexport interface McpToolManifestEntry {\n readonly toolId: string;\n readonly toolName: string;\n readonly description: string | null;\n readonly inputSchema?: unknown;\n readonly outputSchema?: unknown;\n readonly annotations?: Readonly<Record<string, unknown>>;\n}\n\nexport interface McpToolManifest {\n readonly server: {\n readonly name: string | null;\n readonly version: string | null;\n readonly instructions: string | null;\n } | null;\n readonly tools: readonly McpToolManifestEntry[];\n}\n\nexport function extractMcpToolManifest(\n listToolsResult: unknown,\n metadata: {\n readonly serverInfo?: unknown;\n readonly instructions?: string;\n } = {},\n): McpToolManifest {\n const listed =\n listToolsResult &&\n typeof listToolsResult === \"object\" &&\n Array.isArray((listToolsResult as { tools?: unknown }).tools)\n ? (listToolsResult as { tools: unknown[] }).tools\n : [];\n const seen = new Map<string, number>();\n const tools = listed.flatMap((value): McpToolManifestEntry[] => {\n if (!value || typeof value !== \"object\") return [];\n const tool = value as Record<string, unknown>;\n if (typeof tool.name !== \"string\" || !tool.name.trim()) return [];\n const toolName = tool.name.trim();\n return [\n {\n toolId: stableToolId(toolName, seen),\n toolName,\n description: typeof tool.description === \"string\" ? tool.description : null,\n ...(tool.inputSchema !== undefined\n ? { inputSchema: tool.inputSchema }\n : tool.parameters !== undefined\n ? { inputSchema: tool.parameters }\n : {}),\n ...(tool.outputSchema !== undefined ? { outputSchema: tool.outputSchema } : {}),\n ...(tool.annotations && typeof tool.annotations === \"object\"\n ? { annotations: tool.annotations as Readonly<Record<string, unknown>> }\n : {}),\n },\n ];\n });\n const info =\n metadata.serverInfo && typeof metadata.serverInfo === \"object\"\n ? (metadata.serverInfo as Record<string, unknown>)\n : null;\n return {\n server: info\n ? {\n name: typeof info.name === \"string\" ? info.name : null,\n version: typeof info.version === \"string\" ? info.version : null,\n instructions: metadata.instructions ?? null,\n }\n : null,\n tools,\n };\n}\n\nexport function deriveMcpNamespace(input: {\n readonly name?: string | null;\n readonly endpoint?: string | null;\n readonly command?: string | null;\n}): string {\n const candidate =\n input.name?.trim() || hostname(input.endpoint) || basename(input.command) || \"mcp\";\n return stableToolId(candidate);\n}\n\nfunction hostname(value: string | null | undefined): string {\n if (!value || !URL.canParse(value)) return \"\";\n return new URL(value).hostname;\n}\n\nfunction basename(value: string | null | undefined): string {\n return value?.trim().split(/[\\\\/]/).pop() ?? \"\";\n}\n","import type { MCPServer } from \"@openai/agents\";\n\nexport const LOCAL_MCP_BRIDGE_CONTRACT_VERSION = 1 as const;\n\nexport type LocalMcpBridgeAuthority = \"connection\" | \"host\" | \"none\";\nexport type LocalMcpBridgeToolSurface = \"static_reviewed\";\n\nexport type LocalMcpBridgeDestination = Readonly<{\n origin: string;\n pathPrefix: string;\n}>;\n\n/**\n * Secret-free description of an in-process provider-to-MCP adapter.\n *\n * This is observability and registration metadata, not authorization. The\n * adapter must still revalidate its named authority before each physical\n * provider request and keep credentials outside tool results and schemas.\n */\nexport type LocalMcpBridgeDescriptor = Readonly<{\n contractVersion: typeof LOCAL_MCP_BRIDGE_CONTRACT_VERSION;\n adapterId: string;\n providerId: string;\n catalogIdentity: string;\n transport: \"in_process\";\n authority: LocalMcpBridgeAuthority;\n toolSurface: LocalMcpBridgeToolSurface;\n mutationReplay: \"safe_reads_only\";\n destinations: readonly LocalMcpBridgeDestination[];\n}>;\n\nexport interface LocalMcpBridgeServer extends MCPServer {\n readonly bridge: LocalMcpBridgeDescriptor;\n}\n\nexport interface LocalMcpBridgeAdapter<TConfig, TContext> {\n readonly adapterId: string;\n matches(config: TConfig): boolean;\n create(config: TConfig, context: TContext): LocalMcpBridgeServer;\n}\n\nexport function defineLocalMcpBridgeDescriptor(\n input: Omit<LocalMcpBridgeDescriptor, \"contractVersion\" | \"transport\">,\n): LocalMcpBridgeDescriptor {\n const adapterId = boundedIdentity(input.adapterId, \"adapterId\");\n const providerId = boundedIdentity(input.providerId, \"providerId\");\n const catalogIdentity = boundedIdentity(input.catalogIdentity, \"catalogIdentity\", 512);\n if (input.destinations.length === 0 || input.destinations.length > 32) {\n throw new Error(\"Local MCP bridge must declare 1-32 provider destinations\");\n }\n const destinations = input.destinations.map((destination) => {\n const url = new URL(destination.origin);\n if (url.protocol !== \"https:\" || url.origin !== destination.origin) {\n throw new Error(\"Local MCP bridge destinations must be exact HTTPS origins\");\n }\n if (\n !destination.pathPrefix.startsWith(\"/\") ||\n destination.pathPrefix.includes(\"\\\\\") ||\n destination.pathPrefix.includes(\"?\") ||\n destination.pathPrefix.includes(\"#\") ||\n new URL(destination.pathPrefix, url.origin).pathname !== destination.pathPrefix\n ) {\n throw new Error(\"Local MCP bridge destination pathPrefix must be an absolute URL path\");\n }\n return Object.freeze({ origin: url.origin, pathPrefix: destination.pathPrefix });\n });\n return Object.freeze({\n contractVersion: LOCAL_MCP_BRIDGE_CONTRACT_VERSION,\n adapterId,\n providerId,\n catalogIdentity,\n transport: \"in_process\",\n authority: input.authority,\n toolSurface: input.toolSurface,\n mutationReplay: input.mutationReplay,\n destinations: Object.freeze(destinations),\n });\n}\n\nexport function isLocalMcpBridgeServer(server: MCPServer): server is LocalMcpBridgeServer {\n const bridge = (server as Partial<LocalMcpBridgeServer>).bridge;\n return (\n bridge?.contractVersion === LOCAL_MCP_BRIDGE_CONTRACT_VERSION &&\n bridge.transport === \"in_process\"\n );\n}\n\n/**\n * Select exactly one adapter for a runtime catalog row. Ambiguous matches fail\n * closed so adding a bridge cannot silently replace another provider route.\n */\nexport function createLocalMcpBridgeFromAdapters<TConfig, TContext>(\n adapters: readonly LocalMcpBridgeAdapter<TConfig, TContext>[],\n config: TConfig,\n context: TContext,\n): LocalMcpBridgeServer | null {\n const matches = adapters.filter((adapter) => adapter.matches(config));\n if (matches.length === 0) return null;\n if (matches.length > 1) {\n throw new Error(\n `Multiple local MCP bridge adapters matched: ${matches.map((entry) => entry.adapterId).join(\", \")}`,\n );\n }\n const adapter = matches[0]!;\n const server = adapter.create(config, context);\n if (server.bridge.adapterId !== adapter.adapterId) {\n throw new Error(`Local MCP bridge adapter ${adapter.adapterId} returned mismatched metadata`);\n }\n return server;\n}\n\nfunction boundedIdentity(value: string, name: string, max = 128): string {\n if (value.length === 0 || value.length > max || /[\\u0000-\\u001f\\u007f]/u.test(value)) {\n throw new Error(`Local MCP bridge ${name} is invalid`);\n }\n return value;\n}\n","import type { CallToolResultContent, MCPCallToolOptions, MCPServer } from \"@openai/agents\";\nimport { load as parseYaml } from \"js-yaml\";\n\nimport { applyCredentialPlacements } from \"./auth\";\nimport {\n DEFAULT_INTEGRATION_RESPONSE_BYTES,\n DEFAULT_INTEGRATION_TIMEOUT_MS,\n MAX_INTEGRATION_SPEC_BYTES,\n MAX_CURATED_INTEGRATION_SPEC_BYTES,\n MAX_INTEGRATION_TOOLS,\n fetchWithDeadline,\n readIntegrationResponse,\n} from \"./http\";\nimport { canonicalJson, immutableRevisionId, sha256Hex, stableToolId } from \"./revision\";\nimport type {\n IntegrationCredentialResolver,\n IntegrationInvocationAuthority,\n IntegrationRevision,\n IntegrationToolDefinition,\n IntegrationTransport,\n JsonSchema,\n} from \"./types\";\nimport { IntegrationInvocationError, IntegrationProtocolError } from \"./types\";\n\nexport type OpenApiHttpMethod =\n | \"get\"\n | \"put\"\n | \"post\"\n | \"delete\"\n | \"patch\"\n | \"head\"\n | \"options\"\n | \"trace\";\n\nexport interface OpenApiParameterBinding {\n readonly name: string;\n readonly location: \"path\" | \"query\" | \"header\" | \"cookie\";\n readonly required: boolean;\n readonly schema: JsonSchema;\n readonly description?: string;\n}\n\nexport interface OpenApiOperationBinding {\n readonly method: OpenApiHttpMethod;\n readonly pathTemplate: string;\n readonly serverUrl: string;\n readonly parameters: readonly OpenApiParameterBinding[];\n readonly requestBody?: {\n readonly required: boolean;\n readonly contentTypes: readonly string[];\n readonly schemas: Readonly<Record<string, JsonSchema>>;\n };\n readonly requiredScopeAlternatives?: readonly (readonly string[])[];\n}\n\nexport type OpenApiRevision = IntegrationRevision<OpenApiOperationBinding, \"openapi\">;\n\nexport interface CompileOpenApiOptions {\n readonly definitionId: string;\n readonly sourceUrl?: string;\n readonly baseUrl?: string;\n readonly provider?: string;\n readonly schemaMode?: \"provider_validated_json\";\n}\n\nexport interface OpenApiServerOptions {\n readonly revision: OpenApiRevision;\n readonly transport: IntegrationTransport;\n readonly credentialResolver?: IntegrationCredentialResolver;\n readonly authority: IntegrationInvocationAuthority;\n readonly timeoutMs?: number;\n readonly maxResponseBytes?: number;\n}\n\nexport type OpenApiAuthDiscovery =\n | { kind: \"none\" }\n | {\n kind: \"oauth2\";\n scopes: string[];\n }\n | {\n kind: \"api_key\";\n carrier: \"header\" | \"query\" | \"cookie\";\n name: string;\n }\n | { kind: \"http\"; scheme: string };\n\ntype LocalMcpTool = Awaited<ReturnType<MCPServer[\"listTools\"]>>[number];\n\nconst methods = new Set<OpenApiHttpMethod>([\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n]);\nconst forbiddenParameterHeaders = new Set([\n \"host\",\n \"content-length\",\n \"connection\",\n \"transfer-encoding\",\n]);\n\nexport function parseOpenApiDocument(\n source: string | Uint8Array,\n options: { maxBytes?: number } = {},\n): Record<string, unknown> {\n const maxBytes = options.maxBytes ?? MAX_INTEGRATION_SPEC_BYTES;\n if (\n !Number.isSafeInteger(maxBytes) ||\n maxBytes < 1 ||\n maxBytes > MAX_CURATED_INTEGRATION_SPEC_BYTES\n ) {\n throw new RangeError(\n `OpenAPI parser limit must be between 1 and ${MAX_CURATED_INTEGRATION_SPEC_BYTES} bytes`,\n );\n }\n const bytes = typeof source === \"string\" ? Buffer.byteLength(source) : source.byteLength;\n if (bytes === 0 || bytes > maxBytes) {\n throw new IntegrationProtocolError(\n \"openapi_spec_size\",\n `OpenAPI document must be between 1 and ${maxBytes} bytes`,\n );\n }\n const text =\n typeof source === \"string\" ? source : new TextDecoder(\"utf-8\", { fatal: true }).decode(source);\n let parsed: unknown;\n try {\n parsed = parseYaml(text, { json: true });\n } catch {\n throw new IntegrationProtocolError(\n \"openapi_parse\",\n \"OpenAPI document is not valid JSON or YAML\",\n );\n }\n if (\n !isRecord(parsed) ||\n typeof parsed.openapi !== \"string\" ||\n !/^3\\.(?:0|1)(?:\\.|$)/.test(parsed.openapi)\n ) {\n throw new IntegrationProtocolError(\n \"openapi_version\",\n \"Only OpenAPI 3.0 and 3.1 documents are supported\",\n );\n }\n if (!isRecord(parsed.paths)) {\n throw new IntegrationProtocolError(\"openapi_paths\", \"OpenAPI document has no paths object\");\n }\n return parsed;\n}\n\nexport function compileOpenApiRevision(\n source: string | Uint8Array | Record<string, unknown>,\n options: CompileOpenApiOptions,\n): OpenApiRevision {\n const document = isRecord(source) ? source : parseOpenApiDocument(source);\n const contentSha256 = sha256Hex(\n canonicalJson(options.schemaMode ? { document, schemaMode: options.schemaMode } : document),\n );\n const revisionId = immutableRevisionId(\"openapi\", contentSha256);\n const info = isRecord(document.info) ? document.info : {};\n const documentServers = readServers(document.servers, options.baseUrl, options.sourceUrl);\n const documentSecurity = readSecurity(document.security);\n const tools: IntegrationToolDefinition[] = [];\n const bindings: Record<string, OpenApiOperationBinding> = {};\n const seen = new Map<string, number>();\n\n for (const [pathTemplate, rawPathItem] of Object.entries(\n document.paths as Record<string, unknown>,\n )) {\n const pathItem = resolveObject(document, rawPathItem, \"path item\");\n const sharedParameters = readParameters(document, pathItem.parameters);\n const pathServers = readServers(pathItem.servers, undefined, undefined);\n for (const [rawMethod, rawOperation] of Object.entries(pathItem)) {\n const method = rawMethod.toLowerCase() as OpenApiHttpMethod;\n if (!methods.has(method) || !isRecord(rawOperation)) continue;\n const operation = resolveObject(document, rawOperation, \"operation\");\n const operationKey = operationIdentity(method, pathTemplate, operation.operationId);\n const id = stableToolId(operationKey, seen);\n const parameters = mergeParameters(\n sharedParameters,\n readParameters(document, operation.parameters),\n );\n const requestBody = readRequestBody(document, operation.requestBody, options.schemaMode);\n const serverUrl = firstServerUrl(\n readServers(operation.servers, undefined, undefined),\n pathServers,\n documentServers,\n );\n const requiredScopeAlternatives =\n operation.security === undefined ? documentSecurity : readSecurity(operation.security);\n const safety = classifyHttpSafety(method, operation);\n const inputSchema = operationInputSchema(parameters, requestBody);\n const outputSchema = options.schemaMode\n ? undefined\n : operationOutputSchema(document, operation.responses);\n const summary = stringValue(operation.summary) ?? stringValue(operation.description);\n tools.push({\n id,\n operationKey,\n name: summary ?? `${method.toUpperCase()} ${pathTemplate}`,\n description: toolDescription(method, pathTemplate, operation, safety),\n inputSchema,\n ...(outputSchema ? { outputSchema } : {}),\n safety,\n approvalMode: safety === \"read\" ? \"never\" : \"ask\",\n deprecated: operation.deprecated === true,\n });\n bindings[id] = {\n method,\n pathTemplate,\n serverUrl,\n parameters,\n ...(requestBody ? { requestBody } : {}),\n ...(requiredScopeAlternatives.length > 0 ? { requiredScopeAlternatives } : {}),\n };\n if (tools.length > MAX_INTEGRATION_TOOLS) {\n throw new IntegrationProtocolError(\n \"openapi_tool_limit\",\n `OpenAPI document exceeds the ${MAX_INTEGRATION_TOOLS}-tool limit`,\n );\n }\n }\n }\n if (tools.length === 0) {\n throw new IntegrationProtocolError(\"openapi_empty\", \"OpenAPI document exposes no operations\");\n }\n return {\n id: revisionId,\n protocol: \"openapi\",\n definitionId: options.definitionId,\n contentSha256,\n source: {\n ...(options.sourceUrl ? { url: options.sourceUrl } : {}),\n ...(options.provider ? { provider: options.provider } : {}),\n },\n title: stringValue(info.title) ?? options.definitionId,\n ...(stringValue(info.description) ? { description: stringValue(info.description)! } : {}),\n ...(stringValue(info.version) ? { version: stringValue(info.version)! } : {}),\n tools,\n bindings,\n };\n}\n\nexport function discoverOpenApiAuth(document: Record<string, unknown>): OpenApiAuthDiscovery {\n const components = isRecord(document.components) ? document.components : {};\n const schemes = isRecord(components.securitySchemes) ? components.securitySchemes : {};\n for (const raw of Object.values(schemes)) {\n const scheme = resolveObject(document, raw, \"security scheme\");\n if (scheme.type === \"oauth2\") {\n const flows = isRecord(scheme.flows) ? scheme.flows : {};\n const scopes = new Set<string>();\n for (const flow of Object.values(flows)) {\n if (!isRecord(flow) || !isRecord(flow.scopes)) continue;\n for (const scope of Object.keys(flow.scopes)) scopes.add(scope);\n }\n return { kind: \"oauth2\", scopes: [...scopes].sort() };\n }\n if (\n scheme.type === \"apiKey\" &&\n (scheme.in === \"header\" || scheme.in === \"query\" || scheme.in === \"cookie\") &&\n typeof scheme.name === \"string\" &&\n scheme.name.length > 0\n ) {\n return { kind: \"api_key\", carrier: scheme.in, name: scheme.name };\n }\n if (scheme.type === \"http\" && typeof scheme.scheme === \"string\") {\n return { kind: \"http\", scheme: scheme.scheme.toLowerCase() };\n }\n }\n return { kind: \"none\" };\n}\n\nexport class OpenApiMcpServer implements MCPServer {\n readonly cacheToolsList = true;\n readonly useStructuredContent = true;\n readonly name: string;\n\n constructor(private readonly options: OpenApiServerOptions) {\n this.name = `openapi:${stableToolId(options.revision.definitionId)}`;\n }\n\n async connect(): Promise<void> {}\n async close(): Promise<void> {}\n async invalidateToolsCache(): Promise<void> {}\n\n async listTools(): Promise<LocalMcpTool[]> {\n return this.options.revision.tools.map(\n (tool) =>\n ({\n name: tool.id,\n description: tool.description,\n inputSchema: normalizeMcpSchema(tool.inputSchema),\n annotations: {\n readOnlyHint: tool.safety === \"read\",\n destructiveHint: tool.safety === \"destructive\",\n idempotentHint: isIdempotentMethod(this.options.revision.bindings[tool.id]?.method),\n openWorldHint: true,\n },\n _meta: {\n \"opengeni/approvalMode\": tool.approvalMode,\n \"opengeni/operationKey\": tool.operationKey,\n \"opengeni/revisionId\": this.options.revision.id,\n },\n }) as LocalMcpTool,\n );\n }\n\n async callTool(\n toolName: string,\n args: Record<string, unknown> | null,\n _meta?: Record<string, unknown> | null,\n callOptions?: MCPCallToolOptions,\n ): Promise<CallToolResultContent> {\n const result = await invokeOpenApiOperation(\n this.options,\n toolName,\n args ?? {},\n callOptions?.signal,\n );\n const content = [\n {\n type: \"text\" as const,\n text: JSON.stringify(result),\n },\n ] as CallToolResultContent;\n content.structuredContent = result as Record<string, unknown>;\n content.isError = result.ok === false;\n return content;\n }\n}\n\nexport function createOpenApiMcpServer(options: OpenApiServerOptions): MCPServer {\n return new OpenApiMcpServer(options);\n}\n\nexport async function invokeOpenApiOperation(\n options: OpenApiServerOptions,\n toolId: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<Record<string, unknown>> {\n const binding = options.revision.bindings[toolId];\n if (!binding) {\n throw new IntegrationInvocationError(\n \"operation_not_found\",\n \"Integration operation is not present in the frozen revision\",\n \"not_started\",\n false,\n );\n }\n const firstCredential = await resolveOpenApiCredential(options, binding, toolId, args, false);\n let response = await sendOpenApiRequest(options, binding, args, firstCredential, signal);\n if (response.status === 401 && options.credentialResolver && options.authority.connectionRef) {\n const refreshed = await resolveOpenApiCredential(options, binding, toolId, args, true);\n if (isReplaySafeMethod(binding.method) && refreshed) {\n await response.body?.cancel().catch(() => undefined);\n response = await sendOpenApiRequest(options, binding, args, refreshed, signal);\n } else {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n isReplaySafeMethod(binding.method) ? \"failed\" : \"unknown\",\n false,\n response.status,\n );\n }\n }\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel().catch(() => undefined);\n throw new IntegrationInvocationError(\n \"redirect_rejected\",\n \"Integration attempted to redirect a credential-bearing request\",\n binding.method === \"get\" || binding.method === \"head\" ? \"failed\" : \"unknown\",\n false,\n response.status,\n );\n }\n const payload = await readIntegrationResponse(\n response,\n options.maxResponseBytes ?? DEFAULT_INTEGRATION_RESPONSE_BYTES,\n );\n const result = {\n ok: response.ok,\n status: response.status,\n contentType: payload.contentType,\n data: payload.data,\n };\n if (!response.ok && (response.status === 401 || response.status === 403)) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n binding.method === \"get\" || binding.method === \"head\" ? \"failed\" : \"unknown\",\n false,\n response.status,\n );\n }\n return result;\n}\n\nasync function resolveOpenApiCredential(\n options: OpenApiServerOptions,\n binding: OpenApiOperationBinding,\n toolId: string,\n args: Record<string, unknown>,\n forceRefresh: boolean,\n): Promise<Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>> {\n if (!options.credentialResolver || !options.authority.connectionRef) return null;\n const destinationUrl = buildOperationUrl(binding, args).toString();\n const credential = await options.credentialResolver.resolve({\n ...options.authority,\n protocol: \"openapi\",\n definitionId: options.revision.definitionId,\n revisionId: options.revision.id,\n operationKey: toolId,\n destinationUrl,\n ...(binding.requiredScopeAlternatives\n ? { requiredScopeAlternatives: binding.requiredScopeAlternatives }\n : {}),\n ...(forceRefresh ? { forceRefresh: true } : {}),\n });\n if (!credential && !forceRefresh) {\n throw new IntegrationInvocationError(\n \"connection_required\",\n \"This integration needs a connected account\",\n \"not_started\",\n false,\n );\n }\n return credential;\n}\n\nasync function sendOpenApiRequest(\n options: OpenApiServerOptions,\n binding: OpenApiOperationBinding,\n args: Record<string, unknown>,\n credential: Awaited<ReturnType<IntegrationCredentialResolver[\"resolve\"]>>,\n signal?: AbortSignal,\n): Promise<Response> {\n const url = buildOperationUrl(binding, args);\n const headers = buildOperationHeaders(binding, args);\n const body = buildOperationBody(binding, args, headers);\n if (credential) applyCredentialPlacements(url, headers, credential);\n if (credential?.authorizeProviderRequest) {\n let authorized = false;\n try {\n authorized = await credential.authorizeProviderRequest();\n } catch {\n authorized = false;\n }\n if (!authorized) {\n throw new IntegrationInvocationError(\n \"authorization_rejected\",\n \"The connected account is no longer authorized for this operation\",\n \"not_started\",\n false,\n );\n }\n }\n return await fetchWithDeadline(\n options.transport,\n url,\n {\n method: binding.method.toUpperCase(),\n headers,\n ...(body !== undefined ? { body } : {}),\n ...(signal ? { signal } : {}),\n },\n options.timeoutMs ?? DEFAULT_INTEGRATION_TIMEOUT_MS,\n );\n}\n\nfunction readServers(\n value: unknown,\n explicitBaseUrl: string | undefined,\n sourceUrl: string | undefined,\n): string[] {\n if (explicitBaseUrl) return [normalizeServerUrl(explicitBaseUrl)];\n const servers = Array.isArray(value)\n ? value.flatMap((entry): string[] =>\n isRecord(entry) && typeof entry.url === \"string\"\n ? [resolveServerUrl(entry.url, sourceUrl)]\n : [],\n )\n : [];\n if (servers.length > 0) return servers;\n if (sourceUrl && URL.canParse(sourceUrl)) {\n const source = new URL(sourceUrl);\n return [`${source.origin}/`];\n }\n return [];\n}\n\nfunction firstServerUrl(...groups: readonly string[][]): string {\n const server = groups.flat().find(Boolean);\n if (!server) {\n throw new IntegrationProtocolError(\n \"openapi_server_missing\",\n \"OpenAPI operation has no resolvable server URL\",\n );\n }\n return server;\n}\n\nfunction resolveServerUrl(value: string, sourceUrl?: string): string {\n if (/[{}]/.test(value)) {\n throw new IntegrationProtocolError(\n \"openapi_server_variable\",\n \"OpenAPI server variables require an explicit resolved base URL\",\n );\n }\n try {\n return normalizeServerUrl(sourceUrl ? new URL(value, sourceUrl).toString() : value);\n } catch {\n throw new IntegrationProtocolError(\"openapi_server_invalid\", \"OpenAPI server URL is invalid\");\n }\n}\n\nfunction normalizeServerUrl(value: string): string {\n const url = new URL(value);\n if (!/^https?:$/.test(url.protocol) || url.username || url.password || url.hash) {\n throw new IntegrationProtocolError(\"openapi_server_invalid\", \"OpenAPI server URL is invalid\");\n }\n return url.toString();\n}\n\nfunction readParameters(\n document: Record<string, unknown>,\n value: unknown,\n): OpenApiParameterBinding[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((raw): OpenApiParameterBinding[] => {\n const parameter = resolveObject(document, raw, \"parameter\");\n const location = parameter.in;\n if (\n typeof parameter.name !== \"string\" ||\n (location !== \"path\" &&\n location !== \"query\" &&\n location !== \"header\" &&\n location !== \"cookie\")\n ) {\n return [];\n }\n if (location === \"header\" && forbiddenParameterHeaders.has(parameter.name.toLowerCase()))\n return [];\n return [\n {\n name: parameter.name,\n location,\n required: location === \"path\" || parameter.required === true,\n schema: dereferenceSchema(document, parameter.schema),\n ...(stringValue(parameter.description)\n ? { description: stringValue(parameter.description)! }\n : {}),\n },\n ];\n });\n}\n\nfunction mergeParameters(\n base: readonly OpenApiParameterBinding[],\n override: readonly OpenApiParameterBinding[],\n): OpenApiParameterBinding[] {\n const merged = new Map(base.map((entry) => [`${entry.location}:${entry.name}`, entry]));\n for (const entry of override) merged.set(`${entry.location}:${entry.name}`, entry);\n return [...merged.values()];\n}\n\nfunction readRequestBody(\n document: Record<string, unknown>,\n value: unknown,\n schemaMode?: CompileOpenApiOptions[\"schemaMode\"],\n): OpenApiOperationBinding[\"requestBody\"] | undefined {\n if (value === undefined) return undefined;\n const body = resolveObject(document, value, \"request body\");\n if (!isRecord(body.content)) return undefined;\n const schemas: Record<string, JsonSchema> = {};\n for (const [contentType, rawMedia] of Object.entries(body.content)) {\n if (!isRecord(rawMedia)) continue;\n const normalizedType = contentType.toLowerCase();\n const jsonBody = normalizedType === \"application/json\" || normalizedType.endsWith(\"+json\");\n schemas[normalizedType] =\n schemaMode === \"provider_validated_json\" && jsonBody\n ? {\n description:\n \"Request JSON for this API operation. The provider validates fields; follow the operation documentation.\",\n }\n : dereferenceSchema(document, rawMedia.schema);\n }\n const contentTypes = Object.keys(schemas);\n return contentTypes.length === 0\n ? undefined\n : { required: body.required === true, contentTypes, schemas };\n}\n\nfunction operationInputSchema(\n parameters: readonly OpenApiParameterBinding[],\n body: OpenApiOperationBinding[\"requestBody\"],\n): JsonSchema {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const location of [\"path\", \"query\", \"header\", \"cookie\"] as const) {\n const group = parameters.filter((entry) => entry.location === location);\n if (group.length === 0) continue;\n properties[location] = {\n type: \"object\",\n properties: Object.fromEntries(\n group.map((entry) => [\n entry.name,\n { ...entry.schema, ...(entry.description ? { description: entry.description } : {}) },\n ]),\n ),\n required: group.filter((entry) => entry.required).map((entry) => entry.name),\n additionalProperties: false,\n };\n if (group.some((entry) => entry.required)) required.push(location);\n }\n if (body) {\n properties.body = body.schemas[body.contentTypes[0]!] ?? {};\n if (body.contentTypes.length > 1) {\n properties.contentType = { type: \"string\", enum: body.contentTypes };\n }\n if (body.required) required.push(\"body\");\n }\n return { type: \"object\", properties, required, additionalProperties: false };\n}\n\nfunction operationOutputSchema(\n document: Record<string, unknown>,\n value: unknown,\n): JsonSchema | undefined {\n if (!isRecord(value)) return undefined;\n for (const status of [\"200\", \"201\", \"202\", \"203\", \"204\", \"default\"]) {\n if (!(status in value)) continue;\n const response = resolveObject(document, value[status], \"response\");\n if (!isRecord(response.content)) return undefined;\n for (const media of Object.values(response.content)) {\n if (isRecord(media) && media.schema !== undefined) {\n return dereferenceSchema(document, media.schema);\n }\n }\n }\n return undefined;\n}\n\nfunction readSecurity(value: unknown): readonly (readonly string[])[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((entry): string[][] => {\n if (!isRecord(entry)) return [];\n const scopes = Object.values(entry).flatMap((raw) =>\n Array.isArray(raw) ? raw.filter((scope): scope is string => typeof scope === \"string\") : [],\n );\n return scopes.length > 0 ? [[...new Set(scopes)].sort()] : [];\n });\n}\n\nfunction classifyHttpSafety(\n method: OpenApiHttpMethod,\n operation: Record<string, unknown>,\n): IntegrationToolDefinition[\"safety\"] {\n if (method === \"get\" || method === \"head\" || method === \"options\") return \"read\";\n const text =\n `${stringValue(operation.operationId) ?? \"\"} ${stringValue(operation.summary) ?? \"\"}`.toLowerCase();\n return method === \"delete\" || /\\b(delete|destroy|remove|revoke|cancel|purge)\\b/.test(text)\n ? \"destructive\"\n : \"write\";\n}\n\nfunction operationIdentity(method: OpenApiHttpMethod, path: string, operationId: unknown): string {\n return typeof operationId === \"string\" && operationId.trim()\n ? operationId.trim()\n : `${method}_${path}`;\n}\n\nfunction toolDescription(\n method: OpenApiHttpMethod,\n path: string,\n operation: Record<string, unknown>,\n safety: IntegrationToolDefinition[\"safety\"],\n): string {\n const description = stringValue(operation.description) ?? stringValue(operation.summary);\n const approval =\n safety === \"read\" ? \"Read-only.\" : \"Changes external state and requires approval.\";\n return `${description ? `${description.trim()} ` : \"\"}${method.toUpperCase()} ${path}. ${approval}`.trim();\n}\n\nfunction isIdempotentMethod(method: OpenApiHttpMethod | undefined): boolean {\n return (\n method === \"get\" ||\n method === \"head\" ||\n method === \"options\" ||\n method === \"put\" ||\n method === \"delete\"\n );\n}\n\nfunction isReplaySafeMethod(method: OpenApiHttpMethod): boolean {\n return method === \"get\" || method === \"head\" || method === \"options\";\n}\n\nfunction buildOperationUrl(binding: OpenApiOperationBinding, args: Record<string, unknown>): URL {\n const pathArgs = objectValue(args.path);\n const path = binding.pathTemplate.replace(/\\{([^}]+)\\}/g, (_match, name: string) => {\n const value = pathArgs[name];\n if (value === undefined || value === null) {\n throw new IntegrationInvocationError(\n \"path_parameter_missing\",\n \"A required integration path parameter is missing\",\n \"not_started\",\n false,\n );\n }\n return encodeURIComponent(scalarString(value));\n });\n const base = new URL(binding.serverUrl);\n const url = new URL(\n path.replace(/^\\//, \"\"),\n base.toString().endsWith(\"/\") ? base : new URL(`${base}/`),\n );\n const query = objectValue(args.query);\n for (const [name, value] of Object.entries(query)) appendQueryValue(url, name, value);\n return url;\n}\n\nfunction buildOperationHeaders(\n binding: OpenApiOperationBinding,\n args: Record<string, unknown>,\n): Headers {\n const headers = new Headers({ accept: \"application/json, text/plain;q=0.9, */*;q=0.5\" });\n for (const [name, value] of Object.entries(objectValue(args.header))) {\n if (forbiddenParameterHeaders.has(name.toLowerCase())) continue;\n headers.set(name, scalarString(value));\n }\n const cookies = Object.entries(objectValue(args.cookie)).map(\n ([name, value]) => `${encodeURIComponent(name)}=${encodeURIComponent(scalarString(value))}`,\n );\n if (cookies.length > 0) headers.set(\"cookie\", cookies.join(\"; \"));\n if (binding.requestBody && args.body !== undefined) {\n const requested =\n typeof args.contentType === \"string\" ? args.contentType.toLowerCase() : undefined;\n const contentType =\n requested && binding.requestBody.contentTypes.includes(requested)\n ? requested\n : binding.requestBody.contentTypes[0]!;\n headers.set(\"content-type\", contentType);\n }\n return headers;\n}\n\nfunction buildOperationBody(\n binding: OpenApiOperationBinding,\n args: Record<string, unknown>,\n headers: Headers,\n): BodyInit | undefined {\n if (!binding.requestBody || args.body === undefined) return undefined;\n const contentType = headers.get(\"content-type\") ?? \"application/json\";\n if (contentType === \"application/x-www-form-urlencoded\") {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(objectValue(args.body)))\n appendSearchParam(params, key, value);\n return params;\n }\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n return JSON.stringify(args.body);\n }\n if (typeof args.body === \"string\") return args.body;\n throw new IntegrationInvocationError(\n \"request_body_unsupported\",\n \"This operation requires a text body for the selected content type\",\n \"not_started\",\n false,\n );\n}\n\nfunction appendQueryValue(url: URL, name: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const entry of value) url.searchParams.append(name, scalarString(entry));\n } else if (value !== undefined && value !== null) {\n url.searchParams.append(name, scalarString(value));\n }\n}\n\nfunction appendSearchParam(params: URLSearchParams, name: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const entry of value) params.append(name, scalarString(entry));\n } else if (value !== undefined && value !== null) {\n params.append(name, scalarString(value));\n }\n}\n\nfunction scalarString(value: unknown): string {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n throw new IntegrationInvocationError(\n \"parameter_invalid\",\n \"Integration parameters must be strings, numbers, booleans, or arrays of them\",\n \"not_started\",\n false,\n );\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction resolveObject(\n document: Record<string, unknown>,\n value: unknown,\n label: string,\n): Record<string, unknown> {\n const resolved = resolveLocalRef(document, value);\n if (!isRecord(resolved)) {\n throw new IntegrationProtocolError(\"openapi_shape\", `OpenAPI ${label} is invalid`);\n }\n return resolved;\n}\n\nfunction resolveLocalRef(document: Record<string, unknown>, value: unknown): unknown {\n if (!isRecord(value) || typeof value.$ref !== \"string\") return value;\n if (!value.$ref.startsWith(\"#/\")) {\n throw new IntegrationProtocolError(\n \"openapi_external_ref\",\n \"External OpenAPI references are not supported; bundle the document first\",\n );\n }\n return value.$ref\n .slice(2)\n .split(\"/\")\n .map((part) => part.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), document);\n}\n\nfunction dereferenceSchema(\n document: Record<string, unknown>,\n value: unknown,\n seen = new Set<string>(),\n depth = 0,\n): JsonSchema {\n if (depth > 20) return {};\n if (isRecord(value) && typeof value.$ref === \"string\") {\n if (seen.has(value.$ref)) return {};\n const nextSeen = new Set(seen).add(value.$ref);\n return dereferenceSchema(document, resolveLocalRef(document, value), nextSeen, depth + 1);\n }\n if (!isRecord(value)) return {};\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (key === \"properties\" && isRecord(entry)) {\n result.properties = Object.fromEntries(\n Object.entries(entry).map(([name, schema]) => [\n name,\n dereferenceSchema(document, schema, seen, depth + 1),\n ]),\n );\n } else if (key === \"items\") {\n result.items = dereferenceSchema(document, entry, seen, depth + 1);\n } else if (key === \"allOf\" || key === \"anyOf\" || key === \"oneOf\") {\n result[key] = Array.isArray(entry)\n ? entry.map((schema) => dereferenceSchema(document, schema, seen, depth + 1))\n : [];\n } else if (key !== \"$ref\") {\n result[key] = entry;\n }\n }\n return result;\n}\n\nfunction normalizeMcpSchema(schema: JsonSchema): LocalMcpTool[\"inputSchema\"] {\n return {\n type: \"object\",\n properties: isRecord(schema.properties) ? schema.properties : {},\n required: Array.isArray(schema.required)\n ? schema.required.filter((entry): entry is string => typeof entry === \"string\")\n : [],\n additionalProperties: schema.additionalProperties === true,\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { IntegrationProtocolError } from \"./types\";\n\nexport interface IntegrationDefinitionOAuth2Authentication {\n readonly kind: \"oauth2\";\n readonly provider: \"google\" | \"microsoft\";\n readonly authorizationUrl: string;\n readonly tokenUrl: string;\n readonly scopes: readonly string[];\n readonly tokenPlacement: {\n readonly carrier: \"header\";\n readonly name: \"Authorization\";\n readonly prefix: \"Bearer \";\n };\n}\n\nexport type IntegrationDefinitionSource =\n | Readonly<{\n kind: \"google_discovery\";\n url: string;\n }>\n | Readonly<{\n kind: \"openapi\";\n url: string;\n operationPathPrefixes?: readonly string[];\n excludedOperationPathPrefixes?: readonly string[];\n /** Expose JSON bodies without expanding the provider entity graph. */\n schemaMode?: \"provider_validated_json\";\n }>;\n\nexport interface IntegrationDefinition {\n readonly id: string;\n readonly name: string;\n readonly summary: string;\n readonly protocol: \"openapi\";\n readonly provider: Readonly<{\n id: \"google\" | \"microsoft\";\n domain: string;\n }>;\n readonly source: IntegrationDefinitionSource;\n readonly baseUrl: string;\n readonly authentication: IntegrationDefinitionOAuth2Authentication;\n readonly healthCheck?: Readonly<{\n operationKey: string;\n arguments: Readonly<Record<string, unknown>>;\n }>;\n readonly facets: readonly IntegrationFacetDefinition[];\n}\n\nexport interface IntegrationFacetDefinition {\n readonly facetKey: string;\n readonly kind: \"knowledge_source\" | \"inbound_trigger\" | \"delivery_destination\" | \"identity_link\";\n readonly configSchema: Readonly<Record<string, unknown>>;\n readonly capabilities: Readonly<Record<string, unknown>>;\n}\n\nconst accountIdentityFacet = (provider: \"google\" | \"microsoft\"): IntegrationFacetDefinition => ({\n facetKey: \"account-identity\",\n kind: \"identity_link\",\n configSchema: { type: \"object\", properties: {}, additionalProperties: false },\n capabilities: {\n provider,\n connectionRequired: true,\n identity: \"connected_account\",\n },\n});\n\nconst driveKnowledgeFacet = (\n provider: \"google-drive\" | \"microsoft-onedrive\",\n): IntegrationFacetDefinition => ({\n facetKey: \"drive-content\",\n kind: \"knowledge_source\",\n configSchema: {\n type: \"object\",\n required: [\"sources\", \"destination\", \"syncCadence\", \"readPolicy\"],\n properties: {\n sources: {\n type: \"array\",\n minItems: 1,\n maxItems: 100,\n items: {\n type: \"object\",\n required: [\"id\", \"name\", \"mimeType\", \"sourceKind\", \"includeDescendants\"],\n properties: {\n id: { type: \"string\", minLength: 1, maxLength: 512 },\n name: { type: \"string\", minLength: 1, maxLength: 1024 },\n mimeType: { type: \"string\", minLength: 1, maxLength: 256 },\n driveId: { type: \"string\", minLength: 1, maxLength: 512 },\n sourceKind: {\n type: \"string\",\n enum:\n provider === \"google-drive\"\n ? [\"my_drive\", \"shared_drive\", \"folder\"]\n : [\"my_drive\", \"shared_library\", \"folder\"],\n },\n includeDescendants: { type: \"boolean\" },\n },\n additionalProperties: false,\n },\n },\n destination: {\n type: \"object\",\n required: [\"authorityKind\", \"authorityAccountId\"],\n properties: {\n authorityKind: {\n type: \"string\",\n enum: [\"organization\", \"workspace\", \"personal\"],\n },\n authorityAccountId: { type: \"string\", minLength: 1, maxLength: 128 },\n authorityWorkspaceId: { type: \"string\", minLength: 1, maxLength: 128 },\n authoritySubjectId: { type: \"string\", minLength: 1, maxLength: 512 },\n collectionId: { type: \"string\", minLength: 1, maxLength: 512 },\n },\n additionalProperties: false,\n },\n syncCadence: { type: \"string\", enum: [\"manual\", \"hourly\", \"daily\"] },\n readPolicy: { type: \"string\", enum: [\"allow\", \"ask\", \"block\"] },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider,\n connectionRequired: true,\n sync: \"incremental\",\n cursor: provider === \"google-drive\" ? \"page_token\" : \"delta_link\",\n },\n});\n\nconst mailboxFacets = (\n provider: \"microsoft-outlook-mail\",\n): readonly IntegrationFacetDefinition[] => [\n {\n facetKey: \"mail-inbox\",\n kind: \"inbound_trigger\",\n configSchema: {\n type: \"object\",\n properties: {\n folder: { type: \"string\", minLength: 1, maxLength: 256 },\n unreadOnly: { type: \"boolean\" },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider,\n connectionRequired: true,\n delivery: \"poll\",\n cursor: \"delta_link\",\n },\n },\n {\n facetKey: \"mail-delivery\",\n kind: \"delivery_destination\",\n configSchema: {\n type: \"object\",\n properties: {\n fromAlias: { type: \"string\", minLength: 1, maxLength: 512 },\n saveToSent: { type: \"boolean\" },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider,\n connectionRequired: true,\n delivery: \"email\",\n },\n },\n accountIdentityFacet(\"microsoft\"),\n];\n\nconst googleDiscoveryUrl = (service: string, version: string): string =>\n `https://www.googleapis.com/discovery/v1/apis/${service}/${version}/rest`;\n\nconst googleOAuth = (scopes: readonly string[]): IntegrationDefinitionOAuth2Authentication => ({\n kind: \"oauth2\",\n provider: \"google\",\n authorizationUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n tokenUrl: \"https://oauth2.googleapis.com/token\",\n scopes: [\"openid\", \"email\", \"profile\", ...scopes],\n tokenPlacement: { carrier: \"header\", name: \"Authorization\", prefix: \"Bearer \" },\n});\n\nexport const GOOGLE_DRIVE_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"google-drive\",\n name: \"Google Drive\",\n summary: \"Files, folders, permissions, and shared drives.\",\n protocol: \"openapi\",\n provider: { id: \"google\", domain: \"www.googleapis.com\" },\n source: { kind: \"google_discovery\", url: googleDiscoveryUrl(\"drive\", \"v3\") },\n baseUrl: \"https://www.googleapis.com/drive/v3/\",\n authentication: googleOAuth([\"https://www.googleapis.com/auth/drive\"]),\n healthCheck: {\n operationKey: \"drive.about.get\",\n arguments: { query: { fields: \"user\" } },\n },\n facets: [driveKnowledgeFacet(\"google-drive\"), accountIdentityFacet(\"google\")],\n};\n\nexport const MICROSOFT_GRAPH_OPENAPI_URL =\n \"https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml\";\nexport const MICROSOFT_GRAPH_BASE_URL = \"https://graph.microsoft.com/v1.0\";\n\nconst microsoftOAuth = (scopes: readonly string[]): IntegrationDefinitionOAuth2Authentication => ({\n kind: \"oauth2\",\n provider: \"microsoft\",\n authorizationUrl: \"https://login.microsoftonline.com/common/oauth2/v2.0/authorize\",\n tokenUrl: \"https://login.microsoftonline.com/common/oauth2/v2.0/token\",\n scopes: [\"offline_access\", \"User.Read\", ...scopes],\n tokenPlacement: { carrier: \"header\", name: \"Authorization\", prefix: \"Bearer \" },\n});\n\nexport const MICROSOFT_OUTLOOK_MAIL_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-outlook-mail\",\n name: \"Outlook Mail\",\n summary: \"Messages, folders, attachments, settings, and sending mail.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n schemaMode: \"provider_validated_json\",\n operationPathPrefixes: [\n \"/me/messages\",\n \"/me/mailFolders\",\n \"/me/sendMail\",\n \"/me/getMailTips\",\n \"/me/inferenceClassification\",\n \"/me/mailboxSettings\",\n \"/me/outlook\",\n ],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Mail.ReadWrite\", \"Mail.Send\", \"MailboxSettings.ReadWrite\"]),\n facets: mailboxFacets(\"microsoft-outlook-mail\"),\n};\n\nexport const MICROSOFT_OUTLOOK_CALENDAR_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-outlook-calendar\",\n name: \"Outlook Calendar\",\n summary: \"Calendars, events, availability, and scheduling.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n schemaMode: \"provider_validated_json\",\n operationPathPrefixes: [\n \"/me/calendar\",\n \"/me/calendars\",\n \"/me/calendarGroups\",\n \"/me/calendarView\",\n \"/me/events\",\n \"/me/findMeetingTimes\",\n \"/me/reminderView\",\n ],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Calendars.ReadWrite\"]),\n facets: [\n {\n facetKey: \"calendar-events\",\n kind: \"inbound_trigger\",\n configSchema: {\n type: \"object\",\n properties: {\n calendarId: { type: \"string\", minLength: 1, maxLength: 512 },\n lookaheadDays: { type: \"integer\", minimum: 1, maximum: 365 },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider: \"microsoft-outlook-calendar\",\n connectionRequired: true,\n delivery: \"poll\",\n cursor: \"delta_link\",\n },\n },\n {\n facetKey: \"calendar-delivery\",\n kind: \"delivery_destination\",\n configSchema: {\n type: \"object\",\n properties: {\n calendarId: { type: \"string\", minLength: 1, maxLength: 512 },\n },\n additionalProperties: false,\n },\n capabilities: {\n provider: \"microsoft-outlook-calendar\",\n connectionRequired: true,\n delivery: \"calendar_event\",\n },\n },\n accountIdentityFacet(\"microsoft\"),\n ],\n};\n\nexport const MICROSOFT_OUTLOOK_CONTACTS_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-outlook-contacts\",\n name: \"Outlook Contacts\",\n summary: \"Contacts, contact folders, and people suggestions.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n schemaMode: \"provider_validated_json\",\n operationPathPrefixes: [\"/me/contacts\", \"/me/contactFolders\", \"/me/people\"],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Contacts.ReadWrite\", \"People.Read\"]),\n facets: [accountIdentityFacet(\"microsoft\")],\n};\n\nexport const MICROSOFT_ONEDRIVE_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"microsoft-onedrive\",\n name: \"OneDrive\",\n summary: \"Drives, files, folders, sharing links, and permissions.\",\n protocol: \"openapi\",\n provider: { id: \"microsoft\", domain: \"graph.microsoft.com\" },\n source: {\n kind: \"openapi\",\n url: MICROSOFT_GRAPH_OPENAPI_URL,\n schemaMode: \"provider_validated_json\",\n operationPathPrefixes: [\"/me/drive\", \"/me/drives\", \"/drives\", \"/shares\"],\n // Excel's nested workbook API is a separate surface, not file management.\n excludedOperationPathPrefixes: [\"/drives/{drive-id}/items/{driveItem-id}/workbook\"],\n },\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n authentication: microsoftOAuth([\"Files.ReadWrite.All\"]),\n facets: [driveKnowledgeFacet(\"microsoft-onedrive\"), accountIdentityFacet(\"microsoft\")],\n};\n\nexport const CORE_INTEGRATION_DEFINITIONS: readonly IntegrationDefinition[] = [\n GOOGLE_DRIVE_INTEGRATION_DEFINITION,\n MICROSOFT_OUTLOOK_MAIL_INTEGRATION_DEFINITION,\n MICROSOFT_OUTLOOK_CALENDAR_INTEGRATION_DEFINITION,\n MICROSOFT_OUTLOOK_CONTACTS_INTEGRATION_DEFINITION,\n MICROSOFT_ONEDRIVE_INTEGRATION_DEFINITION,\n];\n\nexport function integrationDefinitionById(id: string): IntegrationDefinition | undefined {\n return CORE_INTEGRATION_DEFINITIONS.find((definition) => definition.id === id);\n}\n\nexport function integrationDefinitionProviderDomain(definition: IntegrationDefinition): string {\n return definition.provider.domain;\n}\n\nexport function integrationFacetDefinitions(\n definitionId: string | null | undefined,\n): readonly IntegrationFacetDefinition[] {\n return definitionId ? (integrationDefinitionById(definitionId)?.facets ?? []) : [];\n}\n\nexport function filterOpenApiDocumentForDefinition(\n document: Record<string, unknown>,\n definition: IntegrationDefinition,\n): Record<string, unknown> {\n if (definition.source.kind !== \"openapi\" || !definition.source.operationPathPrefixes?.length) {\n return document;\n }\n const operationPathPrefixes = definition.source.operationPathPrefixes;\n const excludedOperationPathPrefixes = definition.source.excludedOperationPathPrefixes ?? [];\n if (!isRecord(document.paths)) {\n throw new IntegrationProtocolError(\"openapi_paths\", \"OpenAPI document has no paths object\");\n }\n const paths = Object.fromEntries(\n Object.entries(document.paths).filter(\n ([path]) =>\n operationPathPrefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`)) &&\n !excludedOperationPathPrefixes.some(\n (prefix) => path === prefix || path.startsWith(`${prefix}/`),\n ),\n ),\n );\n if (Object.keys(paths).length === 0) {\n throw new IntegrationProtocolError(\n \"integration_definition_empty\",\n `${definition.name} did not match any operations in the supplied OpenAPI document`,\n );\n }\n return {\n ...document,\n paths,\n servers: [{ url: definition.baseUrl }],\n };\n}\n\nexport function googleDiscoveryToOpenApi(discovery: unknown): Record<string, unknown> {\n if (!isRecord(discovery)) {\n throw new IntegrationProtocolError(\n \"google_discovery_shape\",\n \"Google Discovery document is invalid\",\n );\n }\n const rootUrl = stringValue(discovery.rootUrl) ?? stringValue(discovery.baseUrl);\n const servicePath = stringValue(discovery.servicePath) ?? \"\";\n if (!rootUrl || !URL.canParse(rootUrl)) {\n throw new IntegrationProtocolError(\n \"google_discovery_server\",\n \"Google Discovery document has no valid root URL\",\n );\n }\n const paths: Record<string, unknown> = {};\n collectGoogleMethods(discovery, discovery.methods, paths);\n collectGoogleResources(discovery, discovery.resources, paths);\n if (Object.keys(paths).length === 0) {\n throw new IntegrationProtocolError(\n \"google_discovery_empty\",\n \"Google Discovery document exposes no methods\",\n );\n }\n const scopes =\n isRecord(discovery.auth) && isRecord(discovery.auth.oauth2)\n ? discovery.auth.oauth2.scopes\n : undefined;\n const scopeMap = isRecord(scopes)\n ? Object.fromEntries(\n Object.entries(scopes).map(([scope, value]) => [\n scope,\n isRecord(value) && typeof value.description === \"string\" ? value.description : \"\",\n ]),\n )\n : {};\n return {\n openapi: \"3.1.0\",\n info: {\n title: stringValue(discovery.title) ?? stringValue(discovery.name) ?? \"Google API\",\n description: stringValue(discovery.description) ?? \"Google Discovery API\",\n version: stringValue(discovery.version) ?? \"v1\",\n },\n servers: [{ url: new URL(servicePath, rootUrl).toString() }],\n paths,\n components: {\n schemas: Object.fromEntries(\n Object.entries(isRecord(discovery.schemas) ? discovery.schemas : {}).map(\n ([name, schema]) => [name, convertGoogleSchema(schema)],\n ),\n ),\n securitySchemes: {\n googleOAuth2: {\n type: \"oauth2\",\n flows: {\n authorizationCode: {\n authorizationUrl: \"https://accounts.google.com/o/oauth2/v2/auth\",\n tokenUrl: \"https://oauth2.googleapis.com/token\",\n scopes: scopeMap,\n },\n },\n },\n },\n },\n security: Object.keys(scopeMap).length > 0 ? [{ googleOAuth2: [] }] : [],\n };\n}\n\nfunction collectGoogleResources(\n document: Record<string, unknown>,\n value: unknown,\n paths: Record<string, unknown>,\n): void {\n if (!isRecord(value)) return;\n for (const resource of Object.values(value)) {\n if (!isRecord(resource)) continue;\n collectGoogleMethods(document, resource.methods, paths);\n collectGoogleResources(document, resource.resources, paths);\n }\n}\n\nfunction collectGoogleMethods(\n document: Record<string, unknown>,\n value: unknown,\n paths: Record<string, unknown>,\n): void {\n if (!isRecord(value)) return;\n for (const [fallbackId, rawMethod] of Object.entries(value)) {\n if (!isRecord(rawMethod)) continue;\n const path = stringValue(rawMethod.path);\n const httpMethod = stringValue(rawMethod.httpMethod)?.toLowerCase();\n if (!path || !httpMethod) continue;\n const parameters = Object.entries(isRecord(rawMethod.parameters) ? rawMethod.parameters : {})\n .sort(([left], [right]) => left.localeCompare(right))\n .flatMap(([name, rawParameter]): Record<string, unknown>[] => {\n if (!isRecord(rawParameter)) return [];\n const location = rawParameter.location === \"path\" ? \"path\" : \"query\";\n return [\n {\n name,\n in: location,\n required: location === \"path\" || rawParameter.required === true,\n ...(stringValue(rawParameter.description)\n ? { description: stringValue(rawParameter.description) }\n : {}),\n schema: convertGoogleSchema(rawParameter),\n },\n ];\n });\n const requestRef = isRecord(rawMethod.request)\n ? stringValue(rawMethod.request.$ref)\n : undefined;\n const responseRef = isRecord(rawMethod.response)\n ? stringValue(rawMethod.response.$ref)\n : undefined;\n const operation: Record<string, unknown> = {\n operationId: stringValue(rawMethod.id) ?? fallbackId,\n // Discovery descriptions are often full documentation paragraphs. Keep\n // them as descriptions and use the stable method identity for the short\n // OpenGeni tool display name.\n summary: stringValue(rawMethod.id) ?? fallbackId,\n description: stringValue(rawMethod.description),\n parameters,\n responses: {\n \"200\": {\n description: \"Successful response\",\n ...(responseRef\n ? {\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${escapeJsonPointer(responseRef)}` },\n },\n },\n }\n : {}),\n },\n },\n ...(Array.isArray(rawMethod.scopes) && rawMethod.scopes.length > 0\n ? { security: [{ googleOAuth2: rawMethod.scopes }] }\n : {}),\n };\n if (requestRef) {\n operation.requestBody = {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${escapeJsonPointer(requestRef)}` },\n },\n },\n };\n }\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n const existing = isRecord(paths[normalizedPath]) ? paths[normalizedPath] : {};\n paths[normalizedPath] = { ...existing, [httpMethod]: operation };\n }\n}\n\nfunction convertGoogleSchema(value: unknown, depth = 0): Record<string, unknown> {\n if (!isRecord(value) || depth > 20) return {};\n if (typeof value.$ref === \"string\") {\n return { $ref: `#/components/schemas/${escapeJsonPointer(value.$ref)}` };\n }\n const result: Record<string, unknown> = {};\n const type = stringValue(value.type);\n if (type) result.type = type === \"any\" ? undefined : type;\n for (const key of [\n \"description\",\n \"format\",\n \"pattern\",\n \"minimum\",\n \"maximum\",\n \"default\",\n ] as const) {\n if (value[key] !== undefined) result[key] = value[key];\n }\n if (Array.isArray(value.enum)) result.enum = value.enum;\n if (isRecord(value.properties)) {\n result.type = result.type ?? \"object\";\n result.properties = Object.fromEntries(\n Object.entries(value.properties).map(([name, schema]) => [\n name,\n convertGoogleSchema(schema, depth + 1),\n ]),\n );\n }\n if (value.items !== undefined) {\n result.type = result.type ?? \"array\";\n result.items = convertGoogleSchema(value.items, depth + 1);\n }\n if (value.additionalProperties !== undefined) {\n result.additionalProperties =\n value.additionalProperties === true\n ? true\n : convertGoogleSchema(value.additionalProperties, depth + 1);\n }\n if (Array.isArray(value.required)) result.required = value.required;\n return Object.fromEntries(Object.entries(result).filter(([, entry]) => entry !== undefined));\n}\n\nfunction escapeJsonPointer(value: string): string {\n return value.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","/**\n * Reviewed consent copy for the core API integration definitions.\n *\n * Presentation only: nothing here grants a scope, selects a connection, or\n * replaces server-side authorization. The copy used to live hardcoded in the\n * web bundle (`REVIEWED_INTEGRATION_EXPERIENCES`); it is served with the\n * definition now so polishing a consent screen is a data change, not a\n * frontend release. The web keeps its generic fallback for any definition or\n * field missing here. Gmail's reviewed presentation lives on its catalog row\n * instead (`data/catalog/curated.json`): Gmail is a Connector, not one of\n * these API integration definitions.\n *\n * MCP connectors carry the same shape on their curated catalog row\n * (`presentation` in `data/catalog/curated.json` -> importer ->\n * `capability_catalog_items.metadata.presentation`).\n */\n\nexport type IntegrationPresentationIcon = \"calendar\" | \"cloud\" | \"contacts\" | \"files\" | \"mail\";\n\nexport type IntegrationPresentationCopy = {\n readonly providerName?: string;\n readonly icon?: IntegrationPresentationIcon;\n readonly introduction?: string;\n readonly capabilities?: readonly { readonly title: string; readonly description: string }[];\n readonly permissionSummary?: string;\n readonly scopeLabels?: Readonly<\n Record<string, { readonly label: string; readonly description: string }>\n >;\n};\n\nexport const INTEGRATION_DEFINITION_PRESENTATIONS: Readonly<\n Record<string, IntegrationPresentationCopy>\n> = {\n \"google-drive\": {\n providerName: \"Google\",\n icon: \"files\",\n introduction: \"Let agents work with files in the Google Drive account you choose.\",\n capabilities: [\n {\n title: \"Find files and folders\",\n description: \"Browse and search content in My Drive and shared drives.\",\n },\n {\n title: \"Create and update content\",\n description: \"Work with files and folders through the reviewed Drive tools.\",\n },\n {\n title: \"Manage sharing\",\n description: \"Review and update links, permissions, and shared-drive content.\",\n },\n ],\n permissionSummary:\n \"Google asks for access to the Drive account you approve, including files shared with that account.\",\n scopeLabels: {\n \"https://www.googleapis.com/auth/drive\": {\n label: \"Work with Google Drive files\",\n description: \"See, create, edit, organize, and share files available to this account.\",\n },\n },\n },\n \"microsoft-outlook-mail\": {\n providerName: \"Microsoft\",\n icon: \"mail\",\n introduction: \"Let agents work with mail in the Microsoft account you choose.\",\n capabilities: [\n {\n title: \"Find and understand mail\",\n description: \"Search messages, folders, and attachments for useful context.\",\n },\n {\n title: \"Draft and send messages\",\n description: \"Prepare, update, and send mail through the reviewed Outlook tools.\",\n },\n {\n title: \"Manage mailbox settings\",\n description: \"Work with supported folders, classifications, and mailbox preferences.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for mail and mailbox-setting access for the account you approve.\",\n scopeLabels: {\n \"Mail.ReadWrite\": {\n label: \"Read and update mail\",\n description: \"Work with messages, folders, and attachments in this mailbox.\",\n },\n \"Mail.Send\": {\n label: \"Send mail\",\n description: \"Send messages as the connected Microsoft account.\",\n },\n \"MailboxSettings.ReadWrite\": {\n label: \"Manage mailbox settings\",\n description: \"Read and update supported Outlook mailbox preferences.\",\n },\n },\n },\n \"microsoft-outlook-calendar\": {\n providerName: \"Microsoft\",\n icon: \"calendar\",\n introduction: \"Let agents help coordinate the calendars in your Microsoft account.\",\n capabilities: [\n {\n title: \"Understand your schedule\",\n description: \"Review calendars, events, availability, and reminders.\",\n },\n {\n title: \"Plan meetings\",\n description: \"Find suitable times and coordinate calendar activity.\",\n },\n {\n title: \"Manage events\",\n description: \"Create and update events through the reviewed calendar tools.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for permission to view and manage calendars for the account you approve.\",\n scopeLabels: {\n \"Calendars.ReadWrite\": {\n label: \"View and manage calendars\",\n description: \"Read, create, update, and organize calendar events.\",\n },\n },\n },\n \"microsoft-outlook-contacts\": {\n providerName: \"Microsoft\",\n icon: \"contacts\",\n introduction: \"Let agents work with contacts in your Microsoft account.\",\n capabilities: [\n {\n title: \"Find people\",\n description: \"Look up contacts and relevant people suggestions.\",\n },\n {\n title: \"Organize contacts\",\n description: \"Work with contacts and contact folders.\",\n },\n {\n title: \"Keep details current\",\n description: \"Create or update contact information through reviewed tools.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for contact access and people suggestions for the account you approve.\",\n scopeLabels: {\n \"Contacts.ReadWrite\": {\n label: \"View and manage contacts\",\n description: \"Read, create, update, and organize contacts and contact folders.\",\n },\n \"People.Read.All\": {\n label: \"Find relevant people\",\n description: \"Use people suggestions available to the connected account.\",\n },\n },\n },\n \"microsoft-onedrive\": {\n providerName: \"Microsoft\",\n icon: \"cloud\",\n introduction: \"Let agents work with files in the Microsoft account you choose.\",\n capabilities: [\n {\n title: \"Find files and folders\",\n description: \"Browse drives, folders, shared items, and sites available to the account.\",\n },\n {\n title: \"Create and update content\",\n description: \"Work with OneDrive and SharePoint files through reviewed tools.\",\n },\n {\n title: \"Manage sharing\",\n description: \"Review and update sharing links and permissions.\",\n },\n ],\n permissionSummary:\n \"Microsoft asks for file and site access anywhere the connected account already has access.\",\n scopeLabels: {\n \"Files.ReadWrite.All\": {\n label: \"Work with accessible files\",\n description: \"Read, create, update, and organize files available to this account.\",\n },\n \"Sites.ReadWrite.All\": {\n label: \"Work with accessible sites\",\n description: \"Read and update files in SharePoint sites available to this account.\",\n },\n },\n },\n};\n"],"mappings":";AA0GO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YACW,MACT,SACA;AACA,UAAM,OAAO;AAHJ;AAIT,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,6BAAN,cAAyC,MAAM;AAAA,EACpD,YACW,MACT,SACS,SACA,WACA,QACT;AACA,UAAM,OAAO;AANJ;AAEA;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AACF;;;AC5HA,IAAM,6BAA6B,oBAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AACnC,IAAM,8BAA8B;AACpC,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAE1B,SAAS,sBAAsB,MAAkC;AAC/D,MAAI,CAAC,MAAM,KAAK,EAAG,QAAO;AAC1B,QAAM,aAAa,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AACzD,SAAO,WAAW,SAAS,GAAG,IAAI,aAAa,GAAG,UAAU;AAC9D;AAEO,SAAS,yBACd,YACA,aACM;AACN,MAAI;AACJ,MAAI;AACF,eAAW,IAAI,IAAI,WAAW,SAAS,MAAM;AAAA,EAC/C,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MACE,SAAS,WAAW,YAAY,UAChC,SAAS,YACT,SAAS,YACT,SAAS,aAAa,OACtB,SAAS,UACT,SAAS,MACT;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,sBAAsB,WAAW,SAAS,UAAU;AACnE,QAAM,OAAO,YAAY,SAAS,SAAS,GAAG,IAC1C,YAAY,WACZ,GAAG,YAAY,QAAQ;AAC3B,MAAI,CAAC,KAAK,WAAW,MAAM,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,WAAmD;AACzE,SAAO,GAAG,UAAU,UAAU,EAAE,GAAG,UAAU,KAAK;AACpD;AAEA,SAAS,6BAA6B,YAA6D;AACjG,MAAI,WAAW,WAAW,KAAK,WAAW,SAAS,2BAA2B;AAC5E,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,aAAa,YAAY;AAClC,UAAM,OAAO,UAAU;AACvB,UAAM,QAAQ,eAAe,SAAS;AACtC,UAAM,iBAAiB,UAAU,YAAY,WAAW,KAAK,YAAY,IAAI;AAC7E,QACE,KAAK,WAAW,KAChB,KAAK,SAAS,8BACd,UAAU,MAAM,WAAW,KAC3B,MAAM,SAAS,+BACf,WAAW,KAAK,IAAI,KACpB,WAAW,KAAK,KAAK,GACrB;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,YAAY,UAAU;AAClC,UACE,CAAC,kBAAkB,KAAK,IAAI,KAC5B,2BAA2B,IAAI,cAAc,KAC7C,eAAe,WAAW,MAAM,GAChC;AACA,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,UAAU,YAAY,SAAS;AACxC,UAAI,CAAC,iBAAiB,KAAK,IAAI,GAAG;AAChC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,CAAC,kBAAkB,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG;AAC3D,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,MAAM,GAAG,UAAU,OAAO,KAAK,cAAc;AACnD,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,SAAK,IAAI,GAAG;AAAA,EACd;AACF;AAEO,SAAS,0BACd,aACA,SACA,YACM;AACN,2BAAyB,YAAY,WAAW;AAChD,+BAA6B,WAAW,UAAU;AAClD,QAAM,UAAoB,CAAC;AAC3B,aAAW,aAAa,WAAW,YAAY;AAC7C,UAAM,OAAO,UAAU;AACvB,UAAM,QAAQ,eAAe,SAAS;AACtC,QAAI,UAAU,YAAY,UAAU;AAClC,cAAQ,IAAI,MAAM,KAAK;AAAA,IACzB,WAAW,UAAU,YAAY,SAAS;AACxC,kBAAY,aAAa,IAAI,MAAM,KAAK;AAAA,IAC1C,OAAO;AACL,cAAQ,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,IACjC;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,UAAU,QAAQ,IAAI,QAAQ;AACpC,YAAQ,IAAI,UAAU,CAAC,GAAI,UAAU,CAAC,OAAO,IAAI,CAAC,GAAI,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,EAC9E;AACF;;;ACzKA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;;;AClBP,SAAS,aAAa,+BAA+C;AAK9D,IAAM,iCAAiC;AACvC,IAAM,qCAAqC,IAAI,OAAO;AACtD,IAAM,6BAA6B,IAAI,OAAO;AAC9C,IAAM,qCAAqC,KAAK,OAAO;AACvD,IAAM,wBAAwB;AAErC,eAAsB,+BACpB,WACA,WACA,WAAW,4BACU;AACrB,QAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,QAAQ,2DAA2D;AAAA,IAChF;AAAA,IACA;AAAA,EACF;AACA,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;AACnD,UAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,UAAU;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO,MAAM,wBAAwB,UAAU,UAAU,oBAAoB;AAC/E;AAEO,SAAS,iCACd,SACsB;AACtB,SAAO;AAAA,IACL,OAAO,CAAC,OAAO,SACb,YAAY,OAAO,MAAM,QAAQ,SAAS;AAAA,MACxC,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,MAC5D,OAAO;AAAA,MACP,8BAA8B;AAAA,IAChC,CAAC;AAAA,EACL;AACF;AAEO,SAAS,2BAA2B,WAA4C;AACrF,SAAO,EAAE,OAAO,UAAU;AAC5B;AAEA,eAAsB,kBACpB,WACA,KACA,MACA,YAAY,gCACO;AACnB,MAAI,CAAC,OAAO,cAAc,SAAS,KAAK,YAAY,KAAK,YAAY,MAAS;AAC5E,UAAM,IAAI,WAAW,+DAA+D;AAAA,EACtF;AACA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,MAAM,WAAW,MAAM,KAAK,QAAQ,MAAM;AAC1D,MAAI,KAAK,QAAQ,QAAS,SAAQ;AAAA,MAC7B,MAAK,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACnE,QAAM,QAAQ;AAAA,IACZ,MAAM,WAAW,MAAM,IAAI,MAAM,+BAA+B,CAAC;AAAA,IACjE;AAAA,EACF;AACA,MAAI;AACF,WAAO,MAAM,UAAU,MAAM,KAAK;AAAA,MAChC,GAAG;AAAA,MACH,QAAQ,WAAW;AAAA,MACnB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,QAAQ;AACN,UAAM,WAAW,WAAW,OAAO,WAAW,CAAC,KAAK,QAAQ;AAC5D,UAAM,IAAI;AAAA,MACR,WAAW,oBAAoB;AAAA,MAC/B,WAAW,kCAAkC;AAAA,MAC7C,wBAAwB,KAAK,MAAM,IAAI,YAAY;AAAA,MACnD,CAAC,wBAAwB,KAAK,MAAM;AAAA,IACtC;AAAA,EACF,UAAE;AACA,iBAAa,KAAK;AAClB,SAAK,QAAQ,oBAAoB,SAAS,OAAO;AAAA,EACnD;AACF;AAEA,SAAS,wBAAwB,QAAqC;AACpE,QAAM,cAAc,UAAU,OAAO,YAAY;AACjD,SAAO,eAAe,SAAS,eAAe,UAAU,eAAe;AACzE;AAEA,eAAsB,wBACpB,UACA,WAAW,oCACqD;AAChE,QAAM,OAAO,MAAM,wBAAwB,UAAU,UAAU,sBAAsB;AACrF,QAAM,cACJ,SAAS,QAAQ,IAAI,cAAc,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,YAAY,KAAK;AAClF,MAAI,KAAK,eAAe,EAAG,QAAO,EAAE,MAAM,MAAM,aAAa,OAAO,EAAE;AACtE,QAAM,OAAO,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,OAAO,IAAI;AACnE,MAAI,gBAAgB,sBAAsB,YAAY,SAAS,OAAO,GAAG;AACvE,QAAI;AACF,aAAO,EAAE,MAAM,KAAK,MAAM,IAAI,GAAG,aAAa,OAAO,KAAK,WAAW;AAAA,IACvE,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,MAAM,MAAM,aAAa,OAAO,KAAK,WAAW;AAC3D;;;ACnIA,SAAS,kBAAkB;AAE3B,SAAS,aAAa,OAAyB;AAC7C,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,YAAY;AACvD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAgC,EAC5C,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,aAAa,KAAK,CAAC,CAAC;AAAA,EACrD;AACF;AAEO,SAAS,cAAc,OAAwB;AACpD,SAAO,KAAK,UAAU,aAAa,KAAK,CAAC;AAC3C;AAEO,SAAS,UAAU,OAAoC;AAC5D,SAAO,WAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACxD;AAEO,SAAS,oBAAoB,UAAkB,eAA+B;AACnF,MAAI,CAAC,iBAAiB,KAAK,aAAa,GAAG;AACzC,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,SAAO,GAAG,QAAQ,IAAI,cAAc,MAAM,GAAG,EAAE,CAAC;AAClD;AAEO,SAAS,aAAa,OAAe,MAAoC;AAC9E,QAAM,aAAa,MAChB,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AACd,QAAM,OAAO,cAAc;AAC3B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK;AACtC,OAAK,IAAI,MAAM,KAAK;AACpB,SAAO,UAAU,IAAI,OAAO,GAAG,IAAI,IAAI,KAAK;AAC9C;;;AFkCO,SAAS,uBACd,eACA,SACiB;AACjB,QAAM,WAAW,mBAAmB,aAAa;AACjD,MAAI;AACJ,MAAI;AACF,aAAS,kBAAkB,QAAQ;AAAA,EACrC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,wBAAwB,QAAQ,QAAQ;AACzD,QAAM,gBAAgB,UAAU,cAAc,QAAQ,CAAC;AACvD,QAAM,KAAK,oBAAoB,WAAW,aAAa;AACvD,QAAM,QAAQ,CAAC;AACf,QAAM,WAAoD,CAAC;AAC3D,QAAM,OAAO,oBAAI,IAAoB;AAErC,aAAW,CAAC,MAAM,IAAI,KAAK;AAAA,IACzB,CAAC,SAAS,OAAO,aAAa,CAAC;AAAA,IAC/B,CAAC,YAAY,OAAO,gBAAgB,CAAC;AAAA,EACvC,GAAY;AACV,QAAI,CAAC,KAAM;AACX,eAAW,SAAS,OAAO,OAAO,KAAK,UAAU,CAAC,EAAE;AAAA,MAAK,CAAC,MAAM,UAC9D,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,IACpC,GAAG;AACD,YAAM,SAAS,aAAa,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI;AACzD,YAAM,cAAc,aAAa,MAAM,IAAI;AAC3C,YAAM,mBAAmB,CAAC,WAAW,WAAW;AAChD,YAAM,mBAAmB,mBACrB,sBAAsB,MAAM,MAAM,oBAAI,IAAI,GAAG,CAAC,IAC9C;AACJ,YAAM,aAAsC,OAAO;AAAA,QACjD,MAAM,KAAK,IAAI,CAAC,QAAQ;AAAA,UACtB,IAAI;AAAA,UACJ;AAAA,YACE,GAAG,gBAAgB,IAAI,MAAM,oBAAI,IAAI,GAAG,CAAC;AAAA,YACzC,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,kBAAkB;AACpB,mBAAW,SAAS;AAAA,UAClB,MAAM;AAAA,UACN,aACE;AAAA,UACF,WAAW;AAAA,QACb;AAAA,MACF;AACA,YAAM,WAAW,MAAM,KAAK,OAAO,CAAC,QAAQ,cAAc,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;AAC1F,YAAM,cAAc;AAAA,QAClB,MAAM,aAAa,KAAK;AAAA,QACxB,SAAS,aACL,kDACA;AAAA,MACN,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACX,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,cAAc,GAAG,IAAI,IAAI,MAAM,IAAI;AAAA,QACnC,MAAM,MAAM;AAAA,QACZ;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,sBAAsB;AAAA,QACxB;AAAA,QACA,QAAQ,SAAS,UAAU,SAAS;AAAA,QACpC,cAAc,SAAS,UAAU,UAAU;AAAA,QAC3C,YAAY,MAAM,qBAAqB;AAAA,MACzC,CAAC;AACD,eAAS,MAAM,IAAI;AAAA,QACjB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe,kBAAkB,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE;AAAA,QACxD,qBAAqB,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE;AAAA,QAChF,eAAe,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAA,QAC/C,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,QAC/C;AAAA,MACF;AACA,UAAI,MAAM,SAAS,uBAAuB;AACxC,cAAM,IAAI;AAAA,UACR;AAAA,UACA,8BAA8B,qBAAqB;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,yBAAyB,iBAAiB,uCAAuC;AAAA,EAC7F;AACA,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA,QAAQ;AAAA,MACN,KAAK,QAAQ,aAAa;AAAA,MAC1B,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,IAC3D;AAAA,IACA,OAAO,QAAQ,MAAM,KAAK,KAAK,QAAQ;AAAA,IACvC;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,0BACpB,SAC6B;AAC7B,QAAM,UAAU,EAAE,OAAO,sBAAsB,EAAE,cAAc,KAAK,CAAC,EAAE;AACvE,QAAM,kBAAkB,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,WAAW,MAAM,mBAAmB,SAAS,SAAS,eAAe;AACzE,MAAI,SAAS,WAAW,OAAO,QAAQ,sBAAsB,QAAQ,UAAU,eAAe;AAC5F,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,eAAW,MAAM,mBAAmB,SAAS,SAAS,SAAS;AAAA,EACjE;AACA,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;AACnD,UAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,OAAO,MAAM,wBAAwB,UAAU,0BAA0B;AAC/E,MAAI,CAAC,SAAS,MAAM,CAAC,SAAS,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,GAAG;AACrE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO,KAAK,KAAK;AACnB;AAEO,IAAM,mBAAN,MAA4C;AAAA,EAKjD,YAA6B,SAA+B;AAA/B;AAC3B,SAAK,OAAO,WAAW,aAAa,QAAQ,SAAS,YAAY,CAAC;AAAA,EACpE;AAAA,EANS,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB;AAAA,EAMT,MAAM,UAAyB;AAAA,EAAC;AAAA,EAChC,MAAM,QAAuB;AAAA,EAAC;AAAA,EAC9B,MAAM,uBAAsC;AAAA,EAAC;AAAA,EAE7C,MAAM,YAAqC;AACzC,WAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,MACjC,CAAC,UACE;AAAA,QACC,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,aAAa,mBAAmB,KAAK,WAAW;AAAA,QAChD,aAAa;AAAA,UACX,cAAc,KAAK,WAAW;AAAA,UAC9B,iBAAiB;AAAA,UACjB,gBAAgB,KAAK,WAAW;AAAA,UAChC,eAAe;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,UACL,yBAAyB,KAAK;AAAA,UAC9B,yBAAyB,KAAK;AAAA,UAC9B,uBAAuB,KAAK,QAAQ,SAAS;AAAA,QAC/C;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,UACA,MACA,OACA,aACgC;AAChC,UAAM,SAAS,MAAM;AAAA,MACnB,KAAK;AAAA,MACL;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,aAAa;AAAA,IACf;AACA,UAAM,UAAU;AAAA,MACd,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,EAAE;AAAA,IACxD;AACA,YAAQ,oBAAoB;AAC5B,YAAQ,UAAU,OAAO,OAAO;AAChC,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBAAuB,SAA0C;AAC/E,SAAO,IAAI,iBAAiB,OAAO;AACrC;AAEA,eAAsB,uBACpB,SACA,QACA,MACA,QACkC;AAClC,QAAM,UAAU,QAAQ,SAAS,SAAS,MAAM;AAChD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,mBACnB;AAAA,IACE,OAAO,KAAK,WAAW,WAAW,KAAK,SAAU,QAAQ,oBAAoB;AAAA,EAC/E,IACA;AACJ,QAAM,YAAY,OAAO;AAAA,IACvB,QAAQ,cAAc,QAAQ,CAAC,SAAU,KAAK,IAAI,MAAM,SAAY,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAE;AAAA,EAChG;AACA,QAAM,cAAc,QAAQ,oBAAoB,SAC5C,IAAI,QAAQ,oBAAoB,KAAK,IAAI,CAAC,MAC1C;AACJ,QAAM,gBAAgB,QAAQ,cAAc,SACxC,IAAI,QAAQ,cAAc,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC,MACvE;AACJ,QAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,QAAQ,aAAa,GAAG,WAAW,MAAM,QAAQ,SAAS,GAAG,aAAa,GAAG,SAAS,MAAM,MAAM,OAAO,EAAE;AAC5I,QAAM,UAAU,EAAE,OAAO,WAAW,eAAe,QAAQ,cAAc;AACzE,QAAM,kBAAkB,MAAM;AAAA,IAC5B;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACA,MAAI,WAAW,MAAM,mBAAmB,SAAS,SAAS,iBAAiB,MAAM;AACjF,MAAI,SAAS,WAAW,OAAO,QAAQ,sBAAsB,QAAQ,UAAU,eAAe;AAC5F,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,QAAI,QAAQ,SAAS,WAAW,WAAW;AACzC,iBAAW,MAAM,mBAAmB,SAAS,SAAS,WAAW,MAAM;AAAA,IACzE,OAAO;AACL,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,QAAQ,SAAS,aAAa,YAAY;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;AACnD,UAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,SAAS,aAAa,YAAY;AAAA,MAC1C;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA,QAAQ,oBAAoB;AAAA,EAC9B;AACA,MAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,SAAS,aAAa,YAAY;AAAA,MAC1C;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,QAAQ,SAAS,QAAQ,IAAI,IAAI,QAAQ,OAAO,CAAC;AACvD,SAAO;AAAA,IACL,IAAI,SAAS,MAAM,CAAC,MAAM,QAAQ,MAAM,MAAM;AAAA,IAC9C,QAAQ,SAAS;AAAA,IACjB,MAAM,MAAM,QAAQ;AAAA,IACpB,QAAQ,MAAM,UAAU;AAAA,EAC1B;AACF;AAEA,eAAe,yBACb,SACA,cACA,YACA,cACA,cACwE;AACxE,MAAI,CAAC,QAAQ,sBAAsB,CAAC,QAAQ,UAAU,cAAe,QAAO;AAC5E,QAAM,aAAa,MAAM,QAAQ,mBAAmB,QAAQ;AAAA,IAC1D,GAAG,QAAQ;AAAA,IACX,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,gBAAgB,OAAO,EAAE,SAAS;AAAA,IAClD,GAAI,eAAe,EAAE,cAAc,KAAK,IAAI,CAAC;AAAA,EAC/C,CAAC;AACD,MAAI,CAAC,cAAc,CAAC,cAAc;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,mBACb,SACA,SACA,YACA,QACmB;AACnB,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,UAAU,IAAI,QAAQ,QAAQ,aAAa;AACjD,UAAQ,IAAI,UAAU,kBAAkB;AACxC,UAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,MAAI,WAAY,2BAA0B,UAAU,SAAS,UAAU;AACvE,MAAI,YAAY,0BAA0B;AACxC,QAAI,aAAa;AACjB,QAAI;AACF,mBAAa,MAAM,WAAW,yBAAyB;AAAA,IACzD,QAAQ;AACN,mBAAa;AAAA,IACf;AACA,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA,IACA,QAAQ,aAAa;AAAA,EACvB;AACF;AAEA,SAAS,gBAAgB,SAAsE;AAC7F,QAAM,WAAW,IAAI,IAAI,wBAAwB,QAAQ,QAAQ,CAAC;AAClE,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,QAAQ,eAAe,CAAC,CAAC,GAAG;AACrE,aAAS,aAAa,IAAI,MAAM,KAAK;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,OAAuB;AAC9D,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,cAAc,WAAW,SAAS,KAAO;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,UAAM,WAAW,MAAM,+CAA+C,UAAU,IAAI;AACpF,QACE,SAAS,YAAY,WAAW,KAChC,SAAS,YAAY,CAAC,GAAG,SAAS,sBAClC;AACA,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBACP,OACoB;AACpB,MAAI,SAAkB;AACtB,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,OAAO,WAAW,KAAK,IAAI,4BAA4B;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,iCAAiC,0BAA0B;AAAA,MAC7D;AAAA,IACF;AACA,QAAI;AACF,eAAS,KAAK,MAAM,KAAK;AAAA,IAC3B,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,MAAM,KAAK,SAAS,OAAO,IAAI,KAAK,SAAS,OAAO,KAAK,QAAQ,GAAG;AAC/E,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,SAAS,MAAM,KAAK,SAAS,OAAO,QAAQ,GAAG;AACjD,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAAuB;AACtD,MAAI;AACJ,MAAI;AACF,eAAW,IAAI,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MACE,CAAC,YAAY,KAAK,SAAS,QAAQ,KACnC,SAAS,YACT,SAAS,YACT,SAAS,MACT;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,SAAS,SAAS;AAC3B;AAEA,SAAS,gBAAgB,OAAyB,MAAmB,OAA2B;AAC9F,MAAI,QAAQ,GAAI,QAAO,CAAC;AACxB,MAAI,cAAc,KAAK,EAAG,QAAO,gBAAgB,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAC9E,MAAI,WAAW,KAAK,GAAG;AACrB,WAAO,EAAE,MAAM,SAAS,OAAO,gBAAgB,MAAM,QAAQ,MAAM,QAAQ,CAAC,EAAE;AAAA,EAChF;AACA,QAAM,OAAO,aAAa,KAAK;AAC/B,MAAI,aAAa,IAAI,EAAG,QAAO,aAAa,KAAK,IAAI;AACrD,MAAI,WAAW,IAAI;AACjB,WAAO,EAAE,MAAM,UAAU,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE;AAC7E,MAAI,kBAAkB,IAAI,GAAG;AAC3B,QAAI,KAAK,IAAI,KAAK,IAAI,EAAG,QAAO,EAAE,MAAM,UAAU,sBAAsB,KAAK;AAC7E,UAAM,WAAW,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI;AAC5C,UAAM,SAAS,OAAO,OAAO,KAAK,UAAU,CAAC;AAC7C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY,OAAO;AAAA,QACjB,OAAO,IAAI,CAAC,UAAU;AAAA,UACpB,MAAM;AAAA,UACN;AAAA,YACE,GAAG,gBAAgB,MAAM,MAAM,UAAU,QAAQ,CAAC;AAAA,YAClD,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,UAChE;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,UAAU,OAAO,OAAO,CAAC,UAAU,cAAc,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACvF,sBAAsB;AAAA,IACxB;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,aAAa,MAA0B;AAC9C,MAAI,SAAS,UAAW,QAAO,EAAE,MAAM,UAAU;AACjD,MAAI,SAAS,MAAO,QAAO,EAAE,MAAM,UAAU;AAC7C,MAAI,SAAS,QAAS,QAAO,EAAE,MAAM,SAAS;AAC9C,MAAI,SAAS,QAAQ,SAAS,SAAU,QAAO,EAAE,MAAM,SAAS;AAChE,SAAO,EAAE,aAAa,kBAAkB,IAAI,GAAG;AACjD;AAEA,SAAS,sBACP,QACA,MACA,OACoB;AACpB,QAAM,OAAO,aAAa,MAAM;AAChC,MAAI,WAAW,IAAI,EAAG,QAAO;AAC7B,MAAI,QAAQ,KAAK,KAAK,IAAI,KAAK,IAAI,EAAG,QAAO;AAC7C,MAAI,YAAY,IAAI,KAAK,gBAAgB,IAAI,EAAG,QAAO;AACvD,MAAI,CAAC,aAAa,IAAI,EAAG,QAAO;AAChC,QAAM,WAAW,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI;AAC5C,QAAM,SAAS,OAAO,OAAO,KAAK,UAAU,CAAC;AAC7C,QAAM,eAAe,OAAO,OAAO,CAAC,UAAU,WAAW,aAAa,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE;AAC/F,QAAM,aAAa,aAAa,IAAI,CAAC,UAAU,MAAM,IAAI;AACzD,MAAI,WAAW,SAAS,KAAK,QAAQ,GAAG;AACtC,UAAM,SAAS,OAAO;AAAA,MACpB,CAAC,UAAU,MAAM,KAAK,WAAW,KAAK,CAAC,WAAW,aAAa,MAAM,IAAI,CAAC;AAAA,IAC5E;AACA,QAAI,QAAQ;AACV,YAAM,QAAQ,sBAAsB,OAAO,MAAM,UAAU,QAAQ,CAAC;AACpE,UAAI,MAAO,YAAW,KAAK,GAAG,OAAO,IAAI,MAAM,KAAK,IAAI;AAAA,IAC1D;AAAA,EACF;AACA,SAAO,WAAW,SAAS,WAAW,KAAK,GAAG,IAAI;AACpD;AAEA,SAAS,WAAW,MAAiC;AACnD,SAAO,aAAa,IAAI,KAAK,WAAW,IAAI;AAC9C;AAEA,SAAS,kBAAkB,OAAuB;AAChD,QAAM,aAAa,MAAM,QAAQ,kBAAkB,GAAG,EAAE,QAAQ,iBAAiB,KAAK;AACtF,SAAO,cAAc;AACvB;AAEA,SAAS,mBAAmB,QAAiD;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,SAAS,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AAAA,IAC/D,UAAU,MAAM,QAAQ,OAAO,QAAQ,IACnC,OAAO,SAAS,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC5E,CAAC;AAAA,IACL,sBAAsB,OAAO,yBAAyB;AAAA,EACxD;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AG5mBO,SAAS,uBACd,iBACA,WAGI,CAAC,GACY;AACjB,QAAM,SACJ,mBACA,OAAO,oBAAoB,YAC3B,MAAM,QAAS,gBAAwC,KAAK,IACvD,gBAAyC,QAC1C,CAAC;AACP,QAAM,OAAO,oBAAI,IAAoB;AACrC,QAAM,QAAQ,OAAO,QAAQ,CAAC,UAAkC;AAC9D,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AACjD,UAAM,OAAO;AACb,QAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,KAAK,KAAK,EAAG,QAAO,CAAC;AAChE,UAAM,WAAW,KAAK,KAAK,KAAK;AAChC,WAAO;AAAA,MACL;AAAA,QACE,QAAQ,aAAa,UAAU,IAAI;AAAA,QACnC;AAAA,QACA,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,QACvE,GAAI,KAAK,gBAAgB,SACrB,EAAE,aAAa,KAAK,YAAY,IAChC,KAAK,eAAe,SAClB,EAAE,aAAa,KAAK,WAAW,IAC/B,CAAC;AAAA,QACP,GAAI,KAAK,iBAAiB,SAAY,EAAE,cAAc,KAAK,aAAa,IAAI,CAAC;AAAA,QAC7E,GAAI,KAAK,eAAe,OAAO,KAAK,gBAAgB,WAChD,EAAE,aAAa,KAAK,YAAiD,IACrE,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,OACJ,SAAS,cAAc,OAAO,SAAS,eAAe,WACjD,SAAS,aACV;AACN,SAAO;AAAA,IACL,QAAQ,OACJ;AAAA,MACE,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,MAClD,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,MAC3D,cAAc,SAAS,gBAAgB;AAAA,IACzC,IACA;AAAA,IACJ;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,OAIxB;AACT,QAAM,YACJ,MAAM,MAAM,KAAK,KAAK,SAAS,MAAM,QAAQ,KAAK,SAAS,MAAM,OAAO,KAAK;AAC/E,SAAO,aAAa,SAAS;AAC/B;AAEA,SAAS,SAAS,OAA0C;AAC1D,MAAI,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,EAAG,QAAO;AAC3C,SAAO,IAAI,IAAI,KAAK,EAAE;AACxB;AAEA,SAAS,SAAS,OAA0C;AAC1D,SAAO,OAAO,KAAK,EAAE,MAAM,OAAO,EAAE,IAAI,KAAK;AAC/C;;;ACvFO,IAAM,oCAAoC;AAuC1C,SAAS,+BACd,OAC0B;AAC1B,QAAM,YAAY,gBAAgB,MAAM,WAAW,WAAW;AAC9D,QAAM,aAAa,gBAAgB,MAAM,YAAY,YAAY;AACjE,QAAM,kBAAkB,gBAAgB,MAAM,iBAAiB,mBAAmB,GAAG;AACrF,MAAI,MAAM,aAAa,WAAW,KAAK,MAAM,aAAa,SAAS,IAAI;AACrE,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,QAAM,eAAe,MAAM,aAAa,IAAI,CAAC,gBAAgB;AAC3D,UAAM,MAAM,IAAI,IAAI,YAAY,MAAM;AACtC,QAAI,IAAI,aAAa,YAAY,IAAI,WAAW,YAAY,QAAQ;AAClE,YAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AACA,QACE,CAAC,YAAY,WAAW,WAAW,GAAG,KACtC,YAAY,WAAW,SAAS,IAAI,KACpC,YAAY,WAAW,SAAS,GAAG,KACnC,YAAY,WAAW,SAAS,GAAG,KACnC,IAAI,IAAI,YAAY,YAAY,IAAI,MAAM,EAAE,aAAa,YAAY,YACrE;AACA,YAAM,IAAI,MAAM,sEAAsE;AAAA,IACxF;AACA,WAAO,OAAO,OAAO,EAAE,QAAQ,IAAI,QAAQ,YAAY,YAAY,WAAW,CAAC;AAAA,EACjF,CAAC;AACD,SAAO,OAAO,OAAO;AAAA,IACnB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,gBAAgB,MAAM;AAAA,IACtB,cAAc,OAAO,OAAO,YAAY;AAAA,EAC1C,CAAC;AACH;AAEO,SAAS,uBAAuB,QAAmD;AACxF,QAAM,SAAU,OAAyC;AACzD,SACE,QAAQ,oBAAoB,qCAC5B,OAAO,cAAc;AAEzB;AAMO,SAAS,iCACd,UACA,QACA,SAC6B;AAC7B,QAAM,UAAU,SAAS,OAAO,CAACA,aAAYA,SAAQ,QAAQ,MAAM,CAAC;AACpE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,+CAA+C,QAAQ,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA,IACnG;AAAA,EACF;AACA,QAAM,UAAU,QAAQ,CAAC;AACzB,QAAM,SAAS,QAAQ,OAAO,QAAQ,OAAO;AAC7C,MAAI,OAAO,OAAO,cAAc,QAAQ,WAAW;AACjD,UAAM,IAAI,MAAM,4BAA4B,QAAQ,SAAS,+BAA+B;AAAA,EAC9F;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAe,MAAc,MAAM,KAAa;AACvE,MAAI,MAAM,WAAW,KAAK,MAAM,SAAS,OAAO,yBAAyB,KAAK,KAAK,GAAG;AACpF,UAAM,IAAI,MAAM,oBAAoB,IAAI,aAAa;AAAA,EACvD;AACA,SAAO;AACT;;;ACnHA,SAAS,QAAQ,iBAAiB;AAwFlC,IAAM,UAAU,oBAAI,IAAuB;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,4BAA4B,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,qBACd,QACA,UAAiC,CAAC,GACT;AACzB,QAAM,WAAW,QAAQ,YAAY;AACrC,MACE,CAAC,OAAO,cAAc,QAAQ,KAC9B,WAAW,KACX,WAAW,oCACX;AACA,UAAM,IAAI;AAAA,MACR,8CAA8C,kCAAkC;AAAA,IAClF;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,WAAW,WAAW,OAAO,WAAW,MAAM,IAAI,OAAO;AAC9E,MAAI,UAAU,KAAK,QAAQ,UAAU;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,0CAA0C,QAAQ;AAAA,IACpD;AAAA,EACF;AACA,QAAM,OACJ,OAAO,WAAW,WAAW,SAAS,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE,OAAO,MAAM;AAC/F,MAAI;AACJ,MAAI;AACF,aAAS,UAAU,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,EACzC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MACE,CAACC,UAAS,MAAM,KAChB,OAAO,OAAO,YAAY,YAC1B,CAAC,sBAAsB,KAAK,OAAO,OAAO,GAC1C;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAACA,UAAS,OAAO,KAAK,GAAG;AAC3B,UAAM,IAAI,yBAAyB,iBAAiB,sCAAsC;AAAA,EAC5F;AACA,SAAO;AACT;AAEO,SAAS,uBACd,QACA,SACiB;AACjB,QAAM,WAAWA,UAAS,MAAM,IAAI,SAAS,qBAAqB,MAAM;AACxE,QAAM,gBAAgB;AAAA,IACpB,cAAc,QAAQ,aAAa,EAAE,UAAU,YAAY,QAAQ,WAAW,IAAI,QAAQ;AAAA,EAC5F;AACA,QAAM,aAAa,oBAAoB,WAAW,aAAa;AAC/D,QAAM,OAAOA,UAAS,SAAS,IAAI,IAAI,SAAS,OAAO,CAAC;AACxD,QAAM,kBAAkB,YAAY,SAAS,SAAS,QAAQ,SAAS,QAAQ,SAAS;AACxF,QAAM,mBAAmB,aAAa,SAAS,QAAQ;AACvD,QAAM,QAAqC,CAAC;AAC5C,QAAM,WAAoD,CAAC;AAC3D,QAAM,OAAO,oBAAI,IAAoB;AAErC,aAAW,CAAC,cAAc,WAAW,KAAK,OAAO;AAAA,IAC/C,SAAS;AAAA,EACX,GAAG;AACD,UAAM,WAAW,cAAc,UAAU,aAAa,WAAW;AACjE,UAAM,mBAAmB,eAAe,UAAU,SAAS,UAAU;AACrE,UAAM,cAAc,YAAY,SAAS,SAAS,QAAW,MAAS;AACtE,eAAW,CAAC,WAAW,YAAY,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChE,YAAM,SAAS,UAAU,YAAY;AACrC,UAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,CAACA,UAAS,YAAY,EAAG;AACrD,YAAM,YAAY,cAAc,UAAU,cAAc,WAAW;AACnE,YAAM,eAAe,kBAAkB,QAAQ,cAAc,UAAU,WAAW;AAClF,YAAM,KAAK,aAAa,cAAc,IAAI;AAC1C,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,eAAe,UAAU,UAAU,UAAU;AAAA,MAC/C;AACA,YAAM,cAAc,gBAAgB,UAAU,UAAU,aAAa,QAAQ,UAAU;AACvF,YAAM,YAAY;AAAA,QAChB,YAAY,UAAU,SAAS,QAAW,MAAS;AAAA,QACnD;AAAA,QACA;AAAA,MACF;AACA,YAAM,4BACJ,UAAU,aAAa,SAAY,mBAAmB,aAAa,UAAU,QAAQ;AACvF,YAAM,SAAS,mBAAmB,QAAQ,SAAS;AACnD,YAAM,cAAc,qBAAqB,YAAY,WAAW;AAChE,YAAM,eAAe,QAAQ,aACzB,SACA,sBAAsB,UAAU,UAAU,SAAS;AACvD,YAAM,UAAU,YAAY,UAAU,OAAO,KAAK,YAAY,UAAU,WAAW;AACnF,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,IAAI,YAAY;AAAA,QACxD,aAAa,gBAAgB,QAAQ,cAAc,WAAW,MAAM;AAAA,QACpE;AAAA,QACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,QACvC;AAAA,QACA,cAAc,WAAW,SAAS,UAAU;AAAA,QAC5C,YAAY,UAAU,eAAe;AAAA,MACvC,CAAC;AACD,eAAS,EAAE,IAAI;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,GAAI,0BAA0B,SAAS,IAAI,EAAE,0BAA0B,IAAI,CAAC;AAAA,MAC9E;AACA,UAAI,MAAM,SAAS,uBAAuB;AACxC,cAAM,IAAI;AAAA,UACR;AAAA,UACA,gCAAgC,qBAAqB;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,yBAAyB,iBAAiB,wCAAwC;AAAA,EAC9F;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA,QAAQ;AAAA,MACN,GAAI,QAAQ,YAAY,EAAE,KAAK,QAAQ,UAAU,IAAI,CAAC;AAAA,MACtD,GAAI,QAAQ,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,IAC3D;AAAA,IACA,OAAO,YAAY,KAAK,KAAK,KAAK,QAAQ;AAAA,IAC1C,GAAI,YAAY,KAAK,WAAW,IAAI,EAAE,aAAa,YAAY,KAAK,WAAW,EAAG,IAAI,CAAC;AAAA,IACvF,GAAI,YAAY,KAAK,OAAO,IAAI,EAAE,SAAS,YAAY,KAAK,OAAO,EAAG,IAAI,CAAC;AAAA,IAC3E;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,UAAyD;AAC3F,QAAM,aAAaA,UAAS,SAAS,UAAU,IAAI,SAAS,aAAa,CAAC;AAC1E,QAAM,UAAUA,UAAS,WAAW,eAAe,IAAI,WAAW,kBAAkB,CAAC;AACrF,aAAW,OAAO,OAAO,OAAO,OAAO,GAAG;AACxC,UAAM,SAAS,cAAc,UAAU,KAAK,iBAAiB;AAC7D,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,QAAQA,UAAS,OAAO,KAAK,IAAI,OAAO,QAAQ,CAAC;AACvD,YAAM,SAAS,oBAAI,IAAY;AAC/B,iBAAW,QAAQ,OAAO,OAAO,KAAK,GAAG;AACvC,YAAI,CAACA,UAAS,IAAI,KAAK,CAACA,UAAS,KAAK,MAAM,EAAG;AAC/C,mBAAW,SAAS,OAAO,KAAK,KAAK,MAAM,EAAG,QAAO,IAAI,KAAK;AAAA,MAChE;AACA,aAAO,EAAE,MAAM,UAAU,QAAQ,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE;AAAA,IACtD;AACA,QACE,OAAO,SAAS,aACf,OAAO,OAAO,YAAY,OAAO,OAAO,WAAW,OAAO,OAAO,aAClE,OAAO,OAAO,SAAS,YACvB,OAAO,KAAK,SAAS,GACrB;AACA,aAAO,EAAE,MAAM,WAAW,SAAS,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,IAClE;AACA,QAAI,OAAO,SAAS,UAAU,OAAO,OAAO,WAAW,UAAU;AAC/D,aAAO,EAAE,MAAM,QAAQ,QAAQ,OAAO,OAAO,YAAY,EAAE;AAAA,IAC7D;AAAA,EACF;AACA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEO,IAAM,mBAAN,MAA4C;AAAA,EAKjD,YAA6B,SAA+B;AAA/B;AAC3B,SAAK,OAAO,WAAW,aAAa,QAAQ,SAAS,YAAY,CAAC;AAAA,EACpE;AAAA,EANS,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB;AAAA,EAMT,MAAM,UAAyB;AAAA,EAAC;AAAA,EAChC,MAAM,QAAuB;AAAA,EAAC;AAAA,EAC9B,MAAM,uBAAsC;AAAA,EAAC;AAAA,EAE7C,MAAM,YAAqC;AACzC,WAAO,KAAK,QAAQ,SAAS,MAAM;AAAA,MACjC,CAAC,UACE;AAAA,QACC,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,aAAaC,oBAAmB,KAAK,WAAW;AAAA,QAChD,aAAa;AAAA,UACX,cAAc,KAAK,WAAW;AAAA,UAC9B,iBAAiB,KAAK,WAAW;AAAA,UACjC,gBAAgB,mBAAmB,KAAK,QAAQ,SAAS,SAAS,KAAK,EAAE,GAAG,MAAM;AAAA,UAClF,eAAe;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,UACL,yBAAyB,KAAK;AAAA,UAC9B,yBAAyB,KAAK;AAAA,UAC9B,uBAAuB,KAAK,QAAQ,SAAS;AAAA,QAC/C;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,UACA,MACA,OACA,aACgC;AAChC,UAAM,SAAS,MAAM;AAAA,MACnB,KAAK;AAAA,MACL;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,aAAa;AAAA,IACf;AACA,UAAM,UAAU;AAAA,MACd;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,MAAM;AAAA,MAC7B;AAAA,IACF;AACA,YAAQ,oBAAoB;AAC5B,YAAQ,UAAU,OAAO,OAAO;AAChC,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBAAuB,SAA0C;AAC/E,SAAO,IAAI,iBAAiB,OAAO;AACrC;AAEA,eAAsB,uBACpB,SACA,QACA,MACA,QACkC;AAClC,QAAM,UAAU,QAAQ,SAAS,SAAS,MAAM;AAChD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,kBAAkB,MAAM,yBAAyB,SAAS,SAAS,QAAQ,MAAM,KAAK;AAC5F,MAAI,WAAW,MAAM,mBAAmB,SAAS,SAAS,MAAM,iBAAiB,MAAM;AACvF,MAAI,SAAS,WAAW,OAAO,QAAQ,sBAAsB,QAAQ,UAAU,eAAe;AAC5F,UAAM,YAAY,MAAM,yBAAyB,SAAS,SAAS,QAAQ,MAAM,IAAI;AACrF,QAAI,mBAAmB,QAAQ,MAAM,KAAK,WAAW;AACnD,YAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,iBAAW,MAAM,mBAAmB,SAAS,SAAS,MAAM,WAAW,MAAM;AAAA,IAC/E,OAAO;AACL,YAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA,mBAAmB,QAAQ,MAAM,IAAI,WAAW;AAAA,QAChD;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,KAAK;AACnD,UAAM,SAAS,MAAM,OAAO,EAAE,MAAM,MAAM,MAAS;AACnD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,SAAS,QAAQ,WAAW,SAAS,WAAW;AAAA,MACnE;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA,QAAQ,oBAAoB;AAAA,EAC9B;AACA,QAAM,SAAS;AAAA,IACb,IAAI,SAAS;AAAA,IACb,QAAQ,SAAS;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,MAAM,QAAQ;AAAA,EAChB;AACA,MAAI,CAAC,SAAS,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,MAAM;AACxE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,WAAW,SAAS,QAAQ,WAAW,SAAS,WAAW;AAAA,MACnE;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,yBACb,SACA,SACA,QACA,MACA,cACwE;AACxE,MAAI,CAAC,QAAQ,sBAAsB,CAAC,QAAQ,UAAU,cAAe,QAAO;AAC5E,QAAM,iBAAiB,kBAAkB,SAAS,IAAI,EAAE,SAAS;AACjE,QAAM,aAAa,MAAM,QAAQ,mBAAmB,QAAQ;AAAA,IAC1D,GAAG,QAAQ;AAAA,IACX,UAAU;AAAA,IACV,cAAc,QAAQ,SAAS;AAAA,IAC/B,YAAY,QAAQ,SAAS;AAAA,IAC7B,cAAc;AAAA,IACd;AAAA,IACA,GAAI,QAAQ,4BACR,EAAE,2BAA2B,QAAQ,0BAA0B,IAC/D,CAAC;AAAA,IACL,GAAI,eAAe,EAAE,cAAc,KAAK,IAAI,CAAC;AAAA,EAC/C,CAAC;AACD,MAAI,CAAC,cAAc,CAAC,cAAc;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,mBACb,SACA,SACA,MACA,YACA,QACmB;AACnB,QAAM,MAAM,kBAAkB,SAAS,IAAI;AAC3C,QAAM,UAAU,sBAAsB,SAAS,IAAI;AACnD,QAAM,OAAO,mBAAmB,SAAS,MAAM,OAAO;AACtD,MAAI,WAAY,2BAA0B,KAAK,SAAS,UAAU;AAClE,MAAI,YAAY,0BAA0B;AACxC,QAAI,aAAa;AACjB,QAAI;AACF,mBAAa,MAAM,WAAW,yBAAyB;AAAA,IACzD,QAAQ;AACN,mBAAa;AAAA,IACf;AACA,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,MACE,QAAQ,QAAQ,OAAO,YAAY;AAAA,MACnC;AAAA,MACA,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,MACrC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA,IACA,QAAQ,aAAa;AAAA,EACvB;AACF;AAEA,SAAS,YACP,OACA,iBACA,WACU;AACV,MAAI,gBAAiB,QAAO,CAAC,mBAAmB,eAAe,CAAC;AAChE,QAAM,UAAU,MAAM,QAAQ,KAAK,IAC/B,MAAM;AAAA,IAAQ,CAAC,UACbD,UAAS,KAAK,KAAK,OAAO,MAAM,QAAQ,WACpC,CAAC,iBAAiB,MAAM,KAAK,SAAS,CAAC,IACvC,CAAC;AAAA,EACP,IACA,CAAC;AACL,MAAI,QAAQ,SAAS,EAAG,QAAO;AAC/B,MAAI,aAAa,IAAI,SAAS,SAAS,GAAG;AACxC,UAAM,SAAS,IAAI,IAAI,SAAS;AAChC,WAAO,CAAC,GAAG,OAAO,MAAM,GAAG;AAAA,EAC7B;AACA,SAAO,CAAC;AACV;AAEA,SAAS,kBAAkB,QAAqC;AAC9D,QAAM,SAAS,OAAO,KAAK,EAAE,KAAK,OAAO;AACzC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAe,WAA4B;AACnE,MAAI,OAAO,KAAK,KAAK,GAAG;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,WAAO,mBAAmB,YAAY,IAAI,IAAI,OAAO,SAAS,EAAE,SAAS,IAAI,KAAK;AAAA,EACpF,QAAQ;AACN,UAAM,IAAI,yBAAyB,0BAA0B,+BAA+B;AAAA,EAC9F;AACF;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,MAAM,IAAI,IAAI,KAAK;AACzB,MAAI,CAAC,YAAY,KAAK,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI,YAAY,IAAI,MAAM;AAC/E,UAAM,IAAI,yBAAyB,0BAA0B,+BAA+B;AAAA,EAC9F;AACA,SAAO,IAAI,SAAS;AACtB;AAEA,SAAS,eACP,UACA,OAC2B;AAC3B,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MAAM,QAAQ,CAAC,QAAmC;AACvD,UAAM,YAAY,cAAc,UAAU,KAAK,WAAW;AAC1D,UAAM,WAAW,UAAU;AAC3B,QACE,OAAO,UAAU,SAAS,YACzB,aAAa,UACZ,aAAa,WACb,aAAa,YACb,aAAa,UACf;AACA,aAAO,CAAC;AAAA,IACV;AACA,QAAI,aAAa,YAAY,0BAA0B,IAAI,UAAU,KAAK,YAAY,CAAC;AACrF,aAAO,CAAC;AACV,WAAO;AAAA,MACL;AAAA,QACE,MAAM,UAAU;AAAA,QAChB;AAAA,QACA,UAAU,aAAa,UAAU,UAAU,aAAa;AAAA,QACxD,QAAQ,kBAAkB,UAAU,UAAU,MAAM;AAAA,QACpD,GAAI,YAAY,UAAU,WAAW,IACjC,EAAE,aAAa,YAAY,UAAU,WAAW,EAAG,IACnD,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBACP,MACA,UAC2B;AAC3B,QAAM,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC;AACtF,aAAW,SAAS,SAAU,QAAO,IAAI,GAAG,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,KAAK;AACjF,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEA,SAAS,gBACP,UACA,OACA,YACoD;AACpD,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,OAAO,cAAc,UAAU,OAAO,cAAc;AAC1D,MAAI,CAACA,UAAS,KAAK,OAAO,EAAG,QAAO;AACpC,QAAM,UAAsC,CAAC;AAC7C,aAAW,CAAC,aAAa,QAAQ,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AAClE,QAAI,CAACA,UAAS,QAAQ,EAAG;AACzB,UAAM,iBAAiB,YAAY,YAAY;AAC/C,UAAM,WAAW,mBAAmB,sBAAsB,eAAe,SAAS,OAAO;AACzF,YAAQ,cAAc,IACpB,eAAe,6BAA6B,WACxC;AAAA,MACE,aACE;AAAA,IACJ,IACA,kBAAkB,UAAU,SAAS,MAAM;AAAA,EACnD;AACA,QAAM,eAAe,OAAO,KAAK,OAAO;AACxC,SAAO,aAAa,WAAW,IAC3B,SACA,EAAE,UAAU,KAAK,aAAa,MAAM,cAAc,QAAQ;AAChE;AAEA,SAAS,qBACP,YACA,MACY;AACZ,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAC5B,aAAW,YAAY,CAAC,QAAQ,SAAS,UAAU,QAAQ,GAAY;AACrE,UAAM,QAAQ,WAAW,OAAO,CAAC,UAAU,MAAM,aAAa,QAAQ;AACtE,QAAI,MAAM,WAAW,EAAG;AACxB,eAAW,QAAQ,IAAI;AAAA,MACrB,MAAM;AAAA,MACN,YAAY,OAAO;AAAA,QACjB,MAAM,IAAI,CAAC,UAAU;AAAA,UACnB,MAAM;AAAA,UACN,EAAE,GAAG,MAAM,QAAQ,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC,EAAG;AAAA,QACtF,CAAC;AAAA,MACH;AAAA,MACA,UAAU,MAAM,OAAO,CAAC,UAAU,MAAM,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MAC3E,sBAAsB;AAAA,IACxB;AACA,QAAI,MAAM,KAAK,CAAC,UAAU,MAAM,QAAQ,EAAG,UAAS,KAAK,QAAQ;AAAA,EACnE;AACA,MAAI,MAAM;AACR,eAAW,OAAO,KAAK,QAAQ,KAAK,aAAa,CAAC,CAAE,KAAK,CAAC;AAC1D,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,iBAAW,cAAc,EAAE,MAAM,UAAU,MAAM,KAAK,aAAa;AAAA,IACrE;AACA,QAAI,KAAK,SAAU,UAAS,KAAK,MAAM;AAAA,EACzC;AACA,SAAO,EAAE,MAAM,UAAU,YAAY,UAAU,sBAAsB,MAAM;AAC7E;AAEA,SAAS,sBACP,UACA,OACwB;AACxB,MAAI,CAACA,UAAS,KAAK,EAAG,QAAO;AAC7B,aAAW,UAAU,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,SAAS,GAAG;AACnE,QAAI,EAAE,UAAU,OAAQ;AACxB,UAAM,WAAW,cAAc,UAAU,MAAM,MAAM,GAAG,UAAU;AAClE,QAAI,CAACA,UAAS,SAAS,OAAO,EAAG,QAAO;AACxC,eAAW,SAAS,OAAO,OAAO,SAAS,OAAO,GAAG;AACnD,UAAIA,UAAS,KAAK,KAAK,MAAM,WAAW,QAAW;AACjD,eAAO,kBAAkB,UAAU,MAAM,MAAM;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAgD;AACpE,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MAAM,QAAQ,CAAC,UAAsB;AAC1C,QAAI,CAACA,UAAS,KAAK,EAAG,QAAO,CAAC;AAC9B,UAAM,SAAS,OAAO,OAAO,KAAK,EAAE;AAAA,MAAQ,CAAC,QAC3C,MAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAAI,CAAC;AAAA,IAC5F;AACA,WAAO,OAAO,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;AAAA,EAC9D,CAAC;AACH;AAEA,SAAS,mBACP,QACA,WACqC;AACrC,MAAI,WAAW,SAAS,WAAW,UAAU,WAAW,UAAW,QAAO;AAC1E,QAAM,OACJ,GAAG,YAAY,UAAU,WAAW,KAAK,EAAE,IAAI,YAAY,UAAU,OAAO,KAAK,EAAE,GAAG,YAAY;AACpG,SAAO,WAAW,YAAY,kDAAkD,KAAK,IAAI,IACrF,gBACA;AACN;AAEA,SAAS,kBAAkB,QAA2B,MAAc,aAA8B;AAChG,SAAO,OAAO,gBAAgB,YAAY,YAAY,KAAK,IACvD,YAAY,KAAK,IACjB,GAAG,MAAM,IAAI,IAAI;AACvB;AAEA,SAAS,gBACP,QACA,MACA,WACA,QACQ;AACR,QAAM,cAAc,YAAY,UAAU,WAAW,KAAK,YAAY,UAAU,OAAO;AACvF,QAAM,WACJ,WAAW,SAAS,eAAe;AACrC,SAAO,GAAG,cAAc,GAAG,YAAY,KAAK,CAAC,MAAM,EAAE,GAAG,OAAO,YAAY,CAAC,IAAI,IAAI,KAAK,QAAQ,GAAG,KAAK;AAC3G;AAEA,SAAS,mBAAmB,QAAgD;AAC1E,SACE,WAAW,SACX,WAAW,UACX,WAAW,aACX,WAAW,SACX,WAAW;AAEf;AAEA,SAAS,mBAAmB,QAAoC;AAC9D,SAAO,WAAW,SAAS,WAAW,UAAU,WAAW;AAC7D;AAEA,SAAS,kBAAkB,SAAkC,MAAoC;AAC/F,QAAM,WAAW,YAAY,KAAK,IAAI;AACtC,QAAM,OAAO,QAAQ,aAAa,QAAQ,gBAAgB,CAAC,QAAQ,SAAiB;AAClF,UAAM,QAAQ,SAAS,IAAI;AAC3B,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,mBAAmB,aAAa,KAAK,CAAC;AAAA,EAC/C,CAAC;AACD,QAAM,OAAO,IAAI,IAAI,QAAQ,SAAS;AACtC,QAAM,MAAM,IAAI;AAAA,IACd,KAAK,QAAQ,OAAO,EAAE;AAAA,IACtB,KAAK,SAAS,EAAE,SAAS,GAAG,IAAI,OAAO,IAAI,IAAI,GAAG,IAAI,GAAG;AAAA,EAC3D;AACA,QAAM,QAAQ,YAAY,KAAK,KAAK;AACpC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,EAAG,kBAAiB,KAAK,MAAM,KAAK;AACpF,SAAO;AACT;AAEA,SAAS,sBACP,SACA,MACS;AACT,QAAM,UAAU,IAAI,QAAQ,EAAE,QAAQ,gDAAgD,CAAC;AACvF,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,YAAY,KAAK,MAAM,CAAC,GAAG;AACpE,QAAI,0BAA0B,IAAI,KAAK,YAAY,CAAC,EAAG;AACvD,YAAQ,IAAI,MAAM,aAAa,KAAK,CAAC;AAAA,EACvC;AACA,QAAM,UAAU,OAAO,QAAQ,YAAY,KAAK,MAAM,CAAC,EAAE;AAAA,IACvD,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,mBAAmB,IAAI,CAAC,IAAI,mBAAmB,aAAa,KAAK,CAAC,CAAC;AAAA,EAC3F;AACA,MAAI,QAAQ,SAAS,EAAG,SAAQ,IAAI,UAAU,QAAQ,KAAK,IAAI,CAAC;AAChE,MAAI,QAAQ,eAAe,KAAK,SAAS,QAAW;AAClD,UAAM,YACJ,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,YAAY,IAAI;AAC1E,UAAM,cACJ,aAAa,QAAQ,YAAY,aAAa,SAAS,SAAS,IAC5D,YACA,QAAQ,YAAY,aAAa,CAAC;AACxC,YAAQ,IAAI,gBAAgB,WAAW;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,mBACP,SACA,MACA,SACsB;AACtB,MAAI,CAAC,QAAQ,eAAe,KAAK,SAAS,OAAW,QAAO;AAC5D,QAAM,cAAc,QAAQ,IAAI,cAAc,KAAK;AACnD,MAAI,gBAAgB,qCAAqC;AACvD,UAAM,SAAS,IAAI,gBAAgB;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,KAAK,IAAI,CAAC;AAC9D,wBAAkB,QAAQ,KAAK,KAAK;AACtC,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,sBAAsB,YAAY,SAAS,OAAO,GAAG;AACvE,WAAO,KAAK,UAAU,KAAK,IAAI;AAAA,EACjC;AACA,MAAI,OAAO,KAAK,SAAS,SAAU,QAAO,KAAK;AAC/C,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,KAAU,MAAc,OAAsB;AACtE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,SAAS,MAAO,KAAI,aAAa,OAAO,MAAM,aAAa,KAAK,CAAC;AAAA,EAC9E,WAAW,UAAU,UAAa,UAAU,MAAM;AAChD,QAAI,aAAa,OAAO,MAAM,aAAa,KAAK,CAAC;AAAA,EACnD;AACF;AAEA,SAAS,kBAAkB,QAAyB,MAAc,OAAsB;AACtF,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,SAAS,MAAO,QAAO,OAAO,MAAM,aAAa,KAAK,CAAC;AAAA,EACpE,WAAW,UAAU,UAAa,UAAU,MAAM;AAChD,WAAO,OAAO,MAAM,aAAa,KAAK,CAAC;AAAA,EACzC;AACF;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YAAY,OAAyC;AAC5D,SAAOA,UAAS,KAAK,IAAI,QAAQ,CAAC;AACpC;AAEA,SAAS,cACP,UACA,OACA,OACyB;AACzB,QAAM,WAAW,gBAAgB,UAAU,KAAK;AAChD,MAAI,CAACA,UAAS,QAAQ,GAAG;AACvB,UAAM,IAAI,yBAAyB,iBAAiB,WAAW,KAAK,aAAa;AAAA,EACnF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,UAAmC,OAAyB;AACnF,MAAI,CAACA,UAAS,KAAK,KAAK,OAAO,MAAM,SAAS,SAAU,QAAO;AAC/D,MAAI,CAAC,MAAM,KAAK,WAAW,IAAI,GAAG;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KACV,MAAM,CAAC,EACP,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,WAAW,MAAM,GAAG,EAAE,WAAW,MAAM,GAAG,CAAC,EAC9D,OAAgB,CAAC,SAAS,SAAUA,UAAS,OAAO,IAAI,QAAQ,IAAI,IAAI,QAAY,QAAQ;AACjG;AAEA,SAAS,kBACP,UACA,OACA,OAAO,oBAAI,IAAY,GACvB,QAAQ,GACI;AACZ,MAAI,QAAQ,GAAI,QAAO,CAAC;AACxB,MAAIA,UAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAAU;AACrD,QAAI,KAAK,IAAI,MAAM,IAAI,EAAG,QAAO,CAAC;AAClC,UAAM,WAAW,IAAI,IAAI,IAAI,EAAE,IAAI,MAAM,IAAI;AAC7C,WAAO,kBAAkB,UAAU,gBAAgB,UAAU,KAAK,GAAG,UAAU,QAAQ,CAAC;AAAA,EAC1F;AACA,MAAI,CAACA,UAAS,KAAK,EAAG,QAAO,CAAC;AAC9B,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,QAAQ,gBAAgBA,UAAS,KAAK,GAAG;AAC3C,aAAO,aAAa,OAAO;AAAA,QACzB,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM;AAAA,UAC5C;AAAA,UACA,kBAAkB,UAAU,QAAQ,MAAM,QAAQ,CAAC;AAAA,QACrD,CAAC;AAAA,MACH;AAAA,IACF,WAAW,QAAQ,SAAS;AAC1B,aAAO,QAAQ,kBAAkB,UAAU,OAAO,MAAM,QAAQ,CAAC;AAAA,IACnE,WAAW,QAAQ,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAChE,aAAO,GAAG,IAAI,MAAM,QAAQ,KAAK,IAC7B,MAAM,IAAI,CAAC,WAAW,kBAAkB,UAAU,QAAQ,MAAM,QAAQ,CAAC,CAAC,IAC1E,CAAC;AAAA,IACP,WAAW,QAAQ,QAAQ;AACzB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASC,oBAAmB,QAAiD;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAYD,UAAS,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AAAA,IAC/D,UAAU,MAAM,QAAQ,OAAO,QAAQ,IACnC,OAAO,SAAS,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC5E,CAAC;AAAA,IACL,sBAAsB,OAAO,yBAAyB;AAAA,EACxD;AACF;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AAC7D;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACl0BA,IAAM,uBAAuB,CAAC,cAAkE;AAAA,EAC9F,UAAU;AAAA,EACV,MAAM;AAAA,EACN,cAAc,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,sBAAsB,MAAM;AAAA,EAC5E,cAAc;AAAA,IACZ;AAAA,IACA,oBAAoB;AAAA,IACpB,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,sBAAsB,CAC1B,cACgC;AAAA,EAChC,UAAU;AAAA,EACV,MAAM;AAAA,EACN,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,UAAU,CAAC,WAAW,eAAe,eAAe,YAAY;AAAA,IAChE,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU,CAAC,MAAM,QAAQ,YAAY,cAAc,oBAAoB;AAAA,UACvE,YAAY;AAAA,YACV,IAAI,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,YACnD,MAAM,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,KAAK;AAAA,YACtD,UAAU,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,YACzD,SAAS,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,YACxD,YAAY;AAAA,cACV,MAAM;AAAA,cACN,MACE,aAAa,iBACT,CAAC,YAAY,gBAAgB,QAAQ,IACrC,CAAC,YAAY,kBAAkB,QAAQ;AAAA,YAC/C;AAAA,YACA,oBAAoB,EAAE,MAAM,UAAU;AAAA,UACxC;AAAA,UACA,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,UAAU,CAAC,iBAAiB,oBAAoB;AAAA,QAChD,YAAY;AAAA,UACV,eAAe;AAAA,YACb,MAAM;AAAA,YACN,MAAM,CAAC,gBAAgB,aAAa,UAAU;AAAA,UAChD;AAAA,UACA,oBAAoB,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,UACnE,sBAAsB,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,UACrE,oBAAoB,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,UACnE,cAAc,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,QAC/D;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,MACA,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,UAAU,OAAO,EAAE;AAAA,MACnE,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,OAAO,OAAO,EAAE;AAAA,IAChE;AAAA,IACA,sBAAsB;AAAA,EACxB;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA,oBAAoB;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ,aAAa,iBAAiB,eAAe;AAAA,EACvD;AACF;AAEA,IAAM,gBAAgB,CACpB,aAC0C;AAAA,EAC1C;AAAA,IACE,UAAU;AAAA,IACV,MAAM;AAAA,IACN,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,QACvD,YAAY,EAAE,MAAM,UAAU;AAAA,MAChC;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,cAAc;AAAA,MACZ;AAAA,MACA,oBAAoB;AAAA,MACpB,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,MAAM;AAAA,IACN,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,QAC1D,YAAY,EAAE,MAAM,UAAU;AAAA,MAChC;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,cAAc;AAAA,MACZ;AAAA,MACA,oBAAoB;AAAA,MACpB,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,qBAAqB,WAAW;AAClC;AAEA,IAAM,qBAAqB,CAAC,SAAiB,YAC3C,gDAAgD,OAAO,IAAI,OAAO;AAEpE,IAAM,cAAc,CAAC,YAA0E;AAAA,EAC7F,MAAM;AAAA,EACN,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,QAAQ,CAAC,UAAU,SAAS,WAAW,GAAG,MAAM;AAAA,EAChD,gBAAgB,EAAE,SAAS,UAAU,MAAM,iBAAiB,QAAQ,UAAU;AAChF;AAEO,IAAM,sCAA6D;AAAA,EACxE,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU,EAAE,IAAI,UAAU,QAAQ,qBAAqB;AAAA,EACvD,QAAQ,EAAE,MAAM,oBAAoB,KAAK,mBAAmB,SAAS,IAAI,EAAE;AAAA,EAC3E,SAAS;AAAA,EACT,gBAAgB,YAAY,CAAC,uCAAuC,CAAC;AAAA,EACrE,aAAa;AAAA,IACX,cAAc;AAAA,IACd,WAAW,EAAE,OAAO,EAAE,QAAQ,OAAO,EAAE;AAAA,EACzC;AAAA,EACA,QAAQ,CAAC,oBAAoB,cAAc,GAAG,qBAAqB,QAAQ,CAAC;AAC9E;AAEO,IAAM,8BACX;AACK,IAAM,2BAA2B;AAExC,IAAM,iBAAiB,CAAC,YAA0E;AAAA,EAChG,MAAM;AAAA,EACN,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,QAAQ,CAAC,kBAAkB,aAAa,GAAG,MAAM;AAAA,EACjD,gBAAgB,EAAE,SAAS,UAAU,MAAM,iBAAiB,QAAQ,UAAU;AAChF;AAEO,IAAM,gDAAuE;AAAA,EAClF,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU,EAAE,IAAI,aAAa,QAAQ,sBAAsB;AAAA,EAC3D,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB,eAAe,CAAC,kBAAkB,aAAa,2BAA2B,CAAC;AAAA,EAC3F,QAAQ,cAAc,wBAAwB;AAChD;AAEO,IAAM,oDAA2E;AAAA,EACtF,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU,EAAE,IAAI,aAAa,QAAQ,sBAAsB;AAAA,EAC3D,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB,eAAe,CAAC,qBAAqB,CAAC;AAAA,EACtD,QAAQ;AAAA,IACN;AAAA,MACE,UAAU;AAAA,MACV,MAAM;AAAA,MACN,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,UAC3D,eAAe,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,IAAI;AAAA,QAC7D;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,MACA,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,oBAAoB;AAAA,QACpB,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,MAAM;AAAA,MACN,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAI;AAAA,QAC7D;AAAA,QACA,sBAAsB;AAAA,MACxB;AAAA,MACA,cAAc;AAAA,QACZ,UAAU;AAAA,QACV,oBAAoB;AAAA,QACpB,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,qBAAqB,WAAW;AAAA,EAClC;AACF;AAEO,IAAM,oDAA2E;AAAA,EACtF,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU,EAAE,IAAI,aAAa,QAAQ,sBAAsB;AAAA,EAC3D,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,uBAAuB,CAAC,gBAAgB,sBAAsB,YAAY;AAAA,EAC5E;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB,eAAe,CAAC,sBAAsB,aAAa,CAAC;AAAA,EACpE,QAAQ,CAAC,qBAAqB,WAAW,CAAC;AAC5C;AAEO,IAAM,4CAAmE;AAAA,EAC9E,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU,EAAE,IAAI,aAAa,QAAQ,sBAAsB;AAAA,EAC3D,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,uBAAuB,CAAC,aAAa,cAAc,WAAW,SAAS;AAAA;AAAA,IAEvE,+BAA+B,CAAC,kDAAkD;AAAA,EACpF;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB,eAAe,CAAC,qBAAqB,CAAC;AAAA,EACtD,QAAQ,CAAC,oBAAoB,oBAAoB,GAAG,qBAAqB,WAAW,CAAC;AACvF;AAEO,IAAM,+BAAiE;AAAA,EAC5E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,0BAA0B,IAA+C;AACvF,SAAO,6BAA6B,KAAK,CAAC,eAAe,WAAW,OAAO,EAAE;AAC/E;AAEO,SAAS,oCAAoC,YAA2C;AAC7F,SAAO,WAAW,SAAS;AAC7B;AAEO,SAAS,4BACd,cACuC;AACvC,SAAO,eAAgB,0BAA0B,YAAY,GAAG,UAAU,CAAC,IAAK,CAAC;AACnF;AAEO,SAAS,mCACd,UACA,YACyB;AACzB,MAAI,WAAW,OAAO,SAAS,aAAa,CAAC,WAAW,OAAO,uBAAuB,QAAQ;AAC5F,WAAO;AAAA,EACT;AACA,QAAM,wBAAwB,WAAW,OAAO;AAChD,QAAM,gCAAgC,WAAW,OAAO,iCAAiC,CAAC;AAC1F,MAAI,CAACE,UAAS,SAAS,KAAK,GAAG;AAC7B,UAAM,IAAI,yBAAyB,iBAAiB,sCAAsC;AAAA,EAC5F;AACA,QAAM,QAAQ,OAAO;AAAA,IACnB,OAAO,QAAQ,SAAS,KAAK,EAAE;AAAA,MAC7B,CAAC,CAAC,IAAI,MACJ,sBAAsB,KAAK,CAAC,WAAW,SAAS,UAAU,KAAK,WAAW,GAAG,MAAM,GAAG,CAAC,KACvF,CAAC,8BAA8B;AAAA,QAC7B,CAAC,WAAW,SAAS,UAAU,KAAK,WAAW,GAAG,MAAM,GAAG;AAAA,MAC7D;AAAA,IACJ;AAAA,EACF;AACA,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,WAAW,IAAI;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,SAAS,CAAC,EAAE,KAAK,WAAW,QAAQ,CAAC;AAAA,EACvC;AACF;AAEO,SAAS,yBAAyB,WAA6C;AACpF,MAAI,CAACA,UAAS,SAAS,GAAG;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAUC,aAAY,UAAU,OAAO,KAAKA,aAAY,UAAU,OAAO;AAC/E,QAAM,cAAcA,aAAY,UAAU,WAAW,KAAK;AAC1D,MAAI,CAAC,WAAW,CAAC,IAAI,SAAS,OAAO,GAAG;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAiC,CAAC;AACxC,uBAAqB,WAAW,UAAU,SAAS,KAAK;AACxD,yBAAuB,WAAW,UAAU,WAAW,KAAK;AAC5D,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,SACJD,UAAS,UAAU,IAAI,KAAKA,UAAS,UAAU,KAAK,MAAM,IACtD,UAAU,KAAK,OAAO,SACtB;AACN,QAAM,WAAWA,UAAS,MAAM,IAC5B,OAAO;AAAA,IACL,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM;AAAA,MAC7C;AAAA,MACAA,UAAS,KAAK,KAAK,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,IACjF,CAAC;AAAA,EACH,IACA,CAAC;AACL,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,OAAOC,aAAY,UAAU,KAAK,KAAKA,aAAY,UAAU,IAAI,KAAK;AAAA,MACtE,aAAaA,aAAY,UAAU,WAAW,KAAK;AAAA,MACnD,SAASA,aAAY,UAAU,OAAO,KAAK;AAAA,IAC7C;AAAA,IACA,SAAS,CAAC,EAAE,KAAK,IAAI,IAAI,aAAa,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,IAC3D;AAAA,IACA,YAAY;AAAA,MACV,SAAS,OAAO;AAAA,QACd,OAAO,QAAQD,UAAS,UAAU,OAAO,IAAI,UAAU,UAAU,CAAC,CAAC,EAAE;AAAA,UACnE,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,oBAAoB,MAAM,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,MACA,iBAAiB;AAAA,QACf,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,OAAO;AAAA,YACL,mBAAmB;AAAA,cACjB,kBAAkB;AAAA,cAClB,UAAU;AAAA,cACV,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC;AAAA,EACzE;AACF;AAEA,SAAS,uBACP,UACA,OACA,OACM;AACN,MAAI,CAACA,UAAS,KAAK,EAAG;AACtB,aAAW,YAAY,OAAO,OAAO,KAAK,GAAG;AAC3C,QAAI,CAACA,UAAS,QAAQ,EAAG;AACzB,yBAAqB,UAAU,SAAS,SAAS,KAAK;AACtD,2BAAuB,UAAU,SAAS,WAAW,KAAK;AAAA,EAC5D;AACF;AAEA,SAAS,qBACP,UACA,OACA,OACM;AACN,MAAI,CAACA,UAAS,KAAK,EAAG;AACtB,aAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC3D,QAAI,CAACA,UAAS,SAAS,EAAG;AAC1B,UAAM,OAAOC,aAAY,UAAU,IAAI;AACvC,UAAM,aAAaA,aAAY,UAAU,UAAU,GAAG,YAAY;AAClE,QAAI,CAAC,QAAQ,CAAC,WAAY;AAC1B,UAAM,aAAa,OAAO,QAAQD,UAAS,UAAU,UAAU,IAAI,UAAU,aAAa,CAAC,CAAC,EACzF,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,QAAQ,CAAC,CAAC,MAAM,YAAY,MAAiC;AAC5D,UAAI,CAACA,UAAS,YAAY,EAAG,QAAO,CAAC;AACrC,YAAM,WAAW,aAAa,aAAa,SAAS,SAAS;AAC7D,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA,IAAI;AAAA,UACJ,UAAU,aAAa,UAAU,aAAa,aAAa;AAAA,UAC3D,GAAIC,aAAY,aAAa,WAAW,IACpC,EAAE,aAAaA,aAAY,aAAa,WAAW,EAAE,IACrD,CAAC;AAAA,UACL,QAAQ,oBAAoB,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AACH,UAAM,aAAaD,UAAS,UAAU,OAAO,IACzCC,aAAY,UAAU,QAAQ,IAAI,IAClC;AACJ,UAAM,cAAcD,UAAS,UAAU,QAAQ,IAC3CC,aAAY,UAAU,SAAS,IAAI,IACnC;AACJ,UAAM,YAAqC;AAAA,MACzC,aAAaA,aAAY,UAAU,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,MAI1C,SAASA,aAAY,UAAU,EAAE,KAAK;AAAA,MACtC,aAAaA,aAAY,UAAU,WAAW;AAAA,MAC9C;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,UACL,aAAa;AAAA,UACb,GAAI,cACA;AAAA,YACE,SAAS;AAAA,cACP,oBAAoB;AAAA,gBAClB,QAAQ,EAAE,MAAM,wBAAwB,kBAAkB,WAAW,CAAC,GAAG;AAAA,cAC3E;AAAA,YACF;AAAA,UACF,IACA,CAAC;AAAA,QACP;AAAA,MACF;AAAA,MACA,GAAI,MAAM,QAAQ,UAAU,MAAM,KAAK,UAAU,OAAO,SAAS,IAC7D,EAAE,UAAU,CAAC,EAAE,cAAc,UAAU,OAAO,CAAC,EAAE,IACjD,CAAC;AAAA,IACP;AACA,QAAI,YAAY;AACd,gBAAU,cAAc;AAAA,QACtB,UAAU;AAAA,QACV,SAAS;AAAA,UACP,oBAAoB;AAAA,YAClB,QAAQ,EAAE,MAAM,wBAAwB,kBAAkB,UAAU,CAAC,GAAG;AAAA,UAC1E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAC7D,UAAM,WAAWD,UAAS,MAAM,cAAc,CAAC,IAAI,MAAM,cAAc,IAAI,CAAC;AAC5E,UAAM,cAAc,IAAI,EAAE,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU;AAAA,EACjE;AACF;AAEA,SAAS,oBAAoB,OAAgB,QAAQ,GAA4B;AAC/E,MAAI,CAACA,UAAS,KAAK,KAAK,QAAQ,GAAI,QAAO,CAAC;AAC5C,MAAI,OAAO,MAAM,SAAS,UAAU;AAClC,WAAO,EAAE,MAAM,wBAAwB,kBAAkB,MAAM,IAAI,CAAC,GAAG;AAAA,EACzE;AACA,QAAM,SAAkC,CAAC;AACzC,QAAM,OAAOC,aAAY,MAAM,IAAI;AACnC,MAAI,KAAM,QAAO,OAAO,SAAS,QAAQ,SAAY;AACrD,aAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,QAAI,MAAM,GAAG,MAAM,OAAW,QAAO,GAAG,IAAI,MAAM,GAAG;AAAA,EACvD;AACA,MAAI,MAAM,QAAQ,MAAM,IAAI,EAAG,QAAO,OAAO,MAAM;AACnD,MAAID,UAAS,MAAM,UAAU,GAAG;AAC9B,WAAO,OAAO,OAAO,QAAQ;AAC7B,WAAO,aAAa,OAAO;AAAA,MACzB,OAAO,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM;AAAA,QACvD;AAAA,QACA,oBAAoB,QAAQ,QAAQ,CAAC;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,MAAM,UAAU,QAAW;AAC7B,WAAO,OAAO,OAAO,QAAQ;AAC7B,WAAO,QAAQ,oBAAoB,MAAM,OAAO,QAAQ,CAAC;AAAA,EAC3D;AACA,MAAI,MAAM,yBAAyB,QAAW;AAC5C,WAAO,uBACL,MAAM,yBAAyB,OAC3B,OACA,oBAAoB,MAAM,sBAAsB,QAAQ,CAAC;AAAA,EACjE;AACA,MAAI,MAAM,QAAQ,MAAM,QAAQ,EAAG,QAAO,WAAW,MAAM;AAC3D,SAAO,OAAO,YAAY,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,CAAC;AAC7F;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,WAAW,KAAK,IAAI,EAAE,WAAW,KAAK,IAAI;AACzD;AAEA,SAASC,aAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AAC7D;AAEA,SAASD,UAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACtjBO,IAAM,uCAET;AAAA,EACF,gBAAgB;AAAA,IACd,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,MACZ;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,mBACE;AAAA,IACF,aAAa;AAAA,MACX,yCAAyC;AAAA,QACvC,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,0BAA0B;AAAA,IACxB,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,MACZ;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,mBACE;AAAA,IACF,aAAa;AAAA,MACX,kBAAkB;AAAA,QAChB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,6BAA6B;AAAA,QAC3B,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,8BAA8B;AAAA,IAC5B,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,MACZ;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,mBACE;AAAA,IACF,aAAa;AAAA,MACX,uBAAuB;AAAA,QACrB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,8BAA8B;AAAA,IAC5B,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,MACZ;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,mBACE;AAAA,IACF,aAAa;AAAA,MACX,sBAAsB;AAAA,QACpB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,mBAAmB;AAAA,QACjB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB,cAAc;AAAA,IACd,MAAM;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,MACZ;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,mBACE;AAAA,IACF,aAAa;AAAA,MACX,uBAAuB;AAAA,QACrB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,uBAAuB;AAAA,QACrB,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;","names":["adapter","isRecord","normalizeMcpSchema","isRecord","stringValue"]}
|
|
@@ -17,6 +17,9 @@ export type IntegrationDefinitionSource = Readonly<{
|
|
|
17
17
|
kind: "openapi";
|
|
18
18
|
url: string;
|
|
19
19
|
operationPathPrefixes?: readonly string[];
|
|
20
|
+
excludedOperationPathPrefixes?: readonly string[];
|
|
21
|
+
/** Expose JSON bodies without expanding the provider entity graph. */
|
|
22
|
+
schemaMode?: "provider_validated_json";
|
|
20
23
|
}>;
|
|
21
24
|
export interface IntegrationDefinition {
|
|
22
25
|
readonly id: string;
|
package/dist/openapi.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export interface CompileOpenApiOptions {
|
|
|
26
26
|
readonly sourceUrl?: string;
|
|
27
27
|
readonly baseUrl?: string;
|
|
28
28
|
readonly provider?: string;
|
|
29
|
+
readonly schemaMode?: "provider_validated_json";
|
|
29
30
|
}
|
|
30
31
|
export interface OpenApiServerOptions {
|
|
31
32
|
readonly revision: OpenApiRevision;
|
|
@@ -49,7 +50,9 @@ export type OpenApiAuthDiscovery = {
|
|
|
49
50
|
scheme: string;
|
|
50
51
|
};
|
|
51
52
|
type LocalMcpTool = Awaited<ReturnType<MCPServer["listTools"]>>[number];
|
|
52
|
-
export declare function parseOpenApiDocument(source: string | Uint8Array
|
|
53
|
+
export declare function parseOpenApiDocument(source: string | Uint8Array, options?: {
|
|
54
|
+
maxBytes?: number;
|
|
55
|
+
}): Record<string, unknown>;
|
|
53
56
|
export declare function compileOpenApiRevision(source: string | Uint8Array | Record<string, unknown>, options: CompileOpenApiOptions): OpenApiRevision;
|
|
54
57
|
export declare function discoverOpenApiAuth(document: Record<string, unknown>): OpenApiAuthDiscovery;
|
|
55
58
|
export declare class OpenApiMcpServer implements MCPServer {
|
package/package.json
CHANGED
package/src/http.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { IntegrationInvocationError } from "./types";
|
|
|
6
6
|
export const DEFAULT_INTEGRATION_TIMEOUT_MS = 30_000;
|
|
7
7
|
export const DEFAULT_INTEGRATION_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
8
8
|
export const MAX_INTEGRATION_SPEC_BYTES = 8 * 1024 * 1024;
|
|
9
|
+
export const MAX_CURATED_INTEGRATION_SPEC_BYTES = 64 * 1024 * 1024;
|
|
9
10
|
export const MAX_INTEGRATION_TOOLS = 2_000;
|
|
10
11
|
|
|
11
12
|
export async function fetchIntegrationSourceDocument(
|
|
@@ -22,6 +22,9 @@ export type IntegrationDefinitionSource =
|
|
|
22
22
|
kind: "openapi";
|
|
23
23
|
url: string;
|
|
24
24
|
operationPathPrefixes?: readonly string[];
|
|
25
|
+
excludedOperationPathPrefixes?: readonly string[];
|
|
26
|
+
/** Expose JSON bodies without expanding the provider entity graph. */
|
|
27
|
+
schemaMode?: "provider_validated_json";
|
|
25
28
|
}>;
|
|
26
29
|
|
|
27
30
|
export interface IntegrationDefinition {
|
|
@@ -213,6 +216,7 @@ export const MICROSOFT_OUTLOOK_MAIL_INTEGRATION_DEFINITION: IntegrationDefinitio
|
|
|
213
216
|
source: {
|
|
214
217
|
kind: "openapi",
|
|
215
218
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
219
|
+
schemaMode: "provider_validated_json",
|
|
216
220
|
operationPathPrefixes: [
|
|
217
221
|
"/me/messages",
|
|
218
222
|
"/me/mailFolders",
|
|
@@ -237,6 +241,7 @@ export const MICROSOFT_OUTLOOK_CALENDAR_INTEGRATION_DEFINITION: IntegrationDefin
|
|
|
237
241
|
source: {
|
|
238
242
|
kind: "openapi",
|
|
239
243
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
244
|
+
schemaMode: "provider_validated_json",
|
|
240
245
|
operationPathPrefixes: [
|
|
241
246
|
"/me/calendar",
|
|
242
247
|
"/me/calendars",
|
|
@@ -297,10 +302,11 @@ export const MICROSOFT_OUTLOOK_CONTACTS_INTEGRATION_DEFINITION: IntegrationDefin
|
|
|
297
302
|
source: {
|
|
298
303
|
kind: "openapi",
|
|
299
304
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
305
|
+
schemaMode: "provider_validated_json",
|
|
300
306
|
operationPathPrefixes: ["/me/contacts", "/me/contactFolders", "/me/people"],
|
|
301
307
|
},
|
|
302
308
|
baseUrl: MICROSOFT_GRAPH_BASE_URL,
|
|
303
|
-
authentication: microsoftOAuth(["Contacts.ReadWrite", "People.Read
|
|
309
|
+
authentication: microsoftOAuth(["Contacts.ReadWrite", "People.Read"]),
|
|
304
310
|
facets: [accountIdentityFacet("microsoft")],
|
|
305
311
|
};
|
|
306
312
|
|
|
@@ -313,10 +319,13 @@ export const MICROSOFT_ONEDRIVE_INTEGRATION_DEFINITION: IntegrationDefinition =
|
|
|
313
319
|
source: {
|
|
314
320
|
kind: "openapi",
|
|
315
321
|
url: MICROSOFT_GRAPH_OPENAPI_URL,
|
|
316
|
-
|
|
322
|
+
schemaMode: "provider_validated_json",
|
|
323
|
+
operationPathPrefixes: ["/me/drive", "/me/drives", "/drives", "/shares"],
|
|
324
|
+
// Excel's nested workbook API is a separate surface, not file management.
|
|
325
|
+
excludedOperationPathPrefixes: ["/drives/{drive-id}/items/{driveItem-id}/workbook"],
|
|
317
326
|
},
|
|
318
327
|
baseUrl: MICROSOFT_GRAPH_BASE_URL,
|
|
319
|
-
authentication: microsoftOAuth(["Files.ReadWrite.All"
|
|
328
|
+
authentication: microsoftOAuth(["Files.ReadWrite.All"]),
|
|
320
329
|
facets: [driveKnowledgeFacet("microsoft-onedrive"), accountIdentityFacet("microsoft")],
|
|
321
330
|
};
|
|
322
331
|
|
|
@@ -350,12 +359,17 @@ export function filterOpenApiDocumentForDefinition(
|
|
|
350
359
|
return document;
|
|
351
360
|
}
|
|
352
361
|
const operationPathPrefixes = definition.source.operationPathPrefixes;
|
|
362
|
+
const excludedOperationPathPrefixes = definition.source.excludedOperationPathPrefixes ?? [];
|
|
353
363
|
if (!isRecord(document.paths)) {
|
|
354
364
|
throw new IntegrationProtocolError("openapi_paths", "OpenAPI document has no paths object");
|
|
355
365
|
}
|
|
356
366
|
const paths = Object.fromEntries(
|
|
357
|
-
Object.entries(document.paths).filter(
|
|
358
|
-
|
|
367
|
+
Object.entries(document.paths).filter(
|
|
368
|
+
([path]) =>
|
|
369
|
+
operationPathPrefixes.some((prefix) => path === prefix || path.startsWith(`${prefix}/`)) &&
|
|
370
|
+
!excludedOperationPathPrefixes.some(
|
|
371
|
+
(prefix) => path === prefix || path.startsWith(`${prefix}/`),
|
|
372
|
+
),
|
|
359
373
|
),
|
|
360
374
|
);
|
|
361
375
|
if (Object.keys(paths).length === 0) {
|
package/src/openapi.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
DEFAULT_INTEGRATION_RESPONSE_BYTES,
|
|
7
7
|
DEFAULT_INTEGRATION_TIMEOUT_MS,
|
|
8
8
|
MAX_INTEGRATION_SPEC_BYTES,
|
|
9
|
+
MAX_CURATED_INTEGRATION_SPEC_BYTES,
|
|
9
10
|
MAX_INTEGRATION_TOOLS,
|
|
10
11
|
fetchWithDeadline,
|
|
11
12
|
readIntegrationResponse,
|
|
@@ -59,6 +60,7 @@ export interface CompileOpenApiOptions {
|
|
|
59
60
|
readonly sourceUrl?: string;
|
|
60
61
|
readonly baseUrl?: string;
|
|
61
62
|
readonly provider?: string;
|
|
63
|
+
readonly schemaMode?: "provider_validated_json";
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
export interface OpenApiServerOptions {
|
|
@@ -102,12 +104,25 @@ const forbiddenParameterHeaders = new Set([
|
|
|
102
104
|
"transfer-encoding",
|
|
103
105
|
]);
|
|
104
106
|
|
|
105
|
-
export function parseOpenApiDocument(
|
|
107
|
+
export function parseOpenApiDocument(
|
|
108
|
+
source: string | Uint8Array,
|
|
109
|
+
options: { maxBytes?: number } = {},
|
|
110
|
+
): Record<string, unknown> {
|
|
111
|
+
const maxBytes = options.maxBytes ?? MAX_INTEGRATION_SPEC_BYTES;
|
|
112
|
+
if (
|
|
113
|
+
!Number.isSafeInteger(maxBytes) ||
|
|
114
|
+
maxBytes < 1 ||
|
|
115
|
+
maxBytes > MAX_CURATED_INTEGRATION_SPEC_BYTES
|
|
116
|
+
) {
|
|
117
|
+
throw new RangeError(
|
|
118
|
+
`OpenAPI parser limit must be between 1 and ${MAX_CURATED_INTEGRATION_SPEC_BYTES} bytes`,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
106
121
|
const bytes = typeof source === "string" ? Buffer.byteLength(source) : source.byteLength;
|
|
107
|
-
if (bytes === 0 || bytes >
|
|
122
|
+
if (bytes === 0 || bytes > maxBytes) {
|
|
108
123
|
throw new IntegrationProtocolError(
|
|
109
124
|
"openapi_spec_size",
|
|
110
|
-
`OpenAPI document must be between 1 and ${
|
|
125
|
+
`OpenAPI document must be between 1 and ${maxBytes} bytes`,
|
|
111
126
|
);
|
|
112
127
|
}
|
|
113
128
|
const text =
|
|
@@ -142,7 +157,9 @@ export function compileOpenApiRevision(
|
|
|
142
157
|
options: CompileOpenApiOptions,
|
|
143
158
|
): OpenApiRevision {
|
|
144
159
|
const document = isRecord(source) ? source : parseOpenApiDocument(source);
|
|
145
|
-
const contentSha256 = sha256Hex(
|
|
160
|
+
const contentSha256 = sha256Hex(
|
|
161
|
+
canonicalJson(options.schemaMode ? { document, schemaMode: options.schemaMode } : document),
|
|
162
|
+
);
|
|
146
163
|
const revisionId = immutableRevisionId("openapi", contentSha256);
|
|
147
164
|
const info = isRecord(document.info) ? document.info : {};
|
|
148
165
|
const documentServers = readServers(document.servers, options.baseUrl, options.sourceUrl);
|
|
@@ -167,7 +184,7 @@ export function compileOpenApiRevision(
|
|
|
167
184
|
sharedParameters,
|
|
168
185
|
readParameters(document, operation.parameters),
|
|
169
186
|
);
|
|
170
|
-
const requestBody = readRequestBody(document, operation.requestBody);
|
|
187
|
+
const requestBody = readRequestBody(document, operation.requestBody, options.schemaMode);
|
|
171
188
|
const serverUrl = firstServerUrl(
|
|
172
189
|
readServers(operation.servers, undefined, undefined),
|
|
173
190
|
pathServers,
|
|
@@ -177,7 +194,9 @@ export function compileOpenApiRevision(
|
|
|
177
194
|
operation.security === undefined ? documentSecurity : readSecurity(operation.security);
|
|
178
195
|
const safety = classifyHttpSafety(method, operation);
|
|
179
196
|
const inputSchema = operationInputSchema(parameters, requestBody);
|
|
180
|
-
const outputSchema =
|
|
197
|
+
const outputSchema = options.schemaMode
|
|
198
|
+
? undefined
|
|
199
|
+
: operationOutputSchema(document, operation.responses);
|
|
181
200
|
const summary = stringValue(operation.summary) ?? stringValue(operation.description);
|
|
182
201
|
tools.push({
|
|
183
202
|
id,
|
|
@@ -554,6 +573,7 @@ function mergeParameters(
|
|
|
554
573
|
function readRequestBody(
|
|
555
574
|
document: Record<string, unknown>,
|
|
556
575
|
value: unknown,
|
|
576
|
+
schemaMode?: CompileOpenApiOptions["schemaMode"],
|
|
557
577
|
): OpenApiOperationBinding["requestBody"] | undefined {
|
|
558
578
|
if (value === undefined) return undefined;
|
|
559
579
|
const body = resolveObject(document, value, "request body");
|
|
@@ -561,7 +581,15 @@ function readRequestBody(
|
|
|
561
581
|
const schemas: Record<string, JsonSchema> = {};
|
|
562
582
|
for (const [contentType, rawMedia] of Object.entries(body.content)) {
|
|
563
583
|
if (!isRecord(rawMedia)) continue;
|
|
564
|
-
|
|
584
|
+
const normalizedType = contentType.toLowerCase();
|
|
585
|
+
const jsonBody = normalizedType === "application/json" || normalizedType.endsWith("+json");
|
|
586
|
+
schemas[normalizedType] =
|
|
587
|
+
schemaMode === "provider_validated_json" && jsonBody
|
|
588
|
+
? {
|
|
589
|
+
description:
|
|
590
|
+
"Request JSON for this API operation. The provider validates fields; follow the operation documentation.",
|
|
591
|
+
}
|
|
592
|
+
: dereferenceSchema(document, rawMedia.schema);
|
|
565
593
|
}
|
|
566
594
|
const contentTypes = Object.keys(schemas);
|
|
567
595
|
return contentTypes.length === 0
|