@opengeni/capabilities 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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/openapi.ts","../src/providers.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 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 integrationId: 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 integrationId: 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 integrationId: 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 integrationId: options.integrationId,\n contentSha256,\n source: {\n url: options.sourceUrl ?? endpoint,\n ...(options.provider ? { provider: options.provider } : {}),\n },\n title: options.name?.trim() || options.integrationId,\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.integrationId)}`;\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.integrationId,\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.integrationId,\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 integrationId: 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 integrationId,\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 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 { 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 integrationId: 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 integrationId: options.integrationId,\n contentSha256,\n source: {\n ...(options.sourceUrl ? { url: options.sourceUrl } : {}),\n ...(options.provider ? { provider: options.provider } : {}),\n },\n title: stringValue(info.title) ?? options.integrationId,\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.integrationId)}`;\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 integrationId: options.revision.integrationId,\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 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 OAuthProviderPreset {\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 interface OpenApiProviderPreset {\n readonly id: string;\n readonly name: string;\n readonly summary: string;\n readonly family: \"google\" | \"microsoft\";\n readonly sourceFormat: \"google-discovery\" | \"openapi\";\n readonly sourceUrl: string;\n readonly baseUrl: string;\n readonly oauth: OAuthProviderPreset;\n readonly pathPrefixes?: readonly string[];\n readonly healthOperation?: string;\n readonly healthArgs?: Readonly<Record<string, unknown>>;\n readonly features: readonly IntegrationFeatureDefinition[];\n}\n\nexport interface IntegrationFeatureDefinition {\n readonly featureKey: 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 accountIdentityFeature = (\n provider: \"google\" | \"microsoft\",\n): IntegrationFeatureDefinition => ({\n featureKey: \"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 driveKnowledgeFeature = (\n provider: \"google-drive\" | \"microsoft-onedrive\",\n): IntegrationFeatureDefinition => ({\n featureKey: \"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 mailboxFeatures = (\n provider: \"google-gmail\" | \"microsoft-outlook-mail\",\n): readonly IntegrationFeatureDefinition[] => [\n {\n featureKey: \"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: provider === \"google-gmail\" ? \"history_id\" : \"delta_link\",\n },\n },\n {\n featureKey: \"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 accountIdentityFeature(provider === \"google-gmail\" ? \"google\" : \"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[]): OAuthProviderPreset => ({\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_PRESET: OpenApiProviderPreset = {\n id: \"google-drive\",\n name: \"Google Drive\",\n summary: \"Files, folders, permissions, and shared drives.\",\n family: \"google\",\n sourceFormat: \"google-discovery\",\n sourceUrl: googleDiscoveryUrl(\"drive\", \"v3\"),\n baseUrl: \"https://www.googleapis.com/drive/v3/\",\n oauth: googleOAuth([\"https://www.googleapis.com/auth/drive\"]),\n healthOperation: \"drive.about.get\",\n healthArgs: { query: { fields: \"user\" } },\n features: [driveKnowledgeFeature(\"google-drive\"), accountIdentityFeature(\"google\")],\n};\n\nexport const GOOGLE_GMAIL_PRESET: OpenApiProviderPreset = {\n id: \"google-gmail\",\n name: \"Gmail\",\n summary: \"Messages, threads, labels, drafts, and sending mail.\",\n family: \"google\",\n sourceFormat: \"google-discovery\",\n sourceUrl: googleDiscoveryUrl(\"gmail\", \"v1\"),\n baseUrl: \"https://gmail.googleapis.com/\",\n oauth: googleOAuth([\"https://mail.google.com/\"]),\n healthOperation: \"gmail.users.labels.list\",\n healthArgs: { path: { userId: \"me\" } },\n features: mailboxFeatures(\"google-gmail\"),\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[]): OAuthProviderPreset => ({\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_PRESET: OpenApiProviderPreset = {\n id: \"microsoft-outlook-mail\",\n name: \"Outlook Mail\",\n summary: \"Messages, folders, attachments, settings, and sending mail.\",\n family: \"microsoft\",\n sourceFormat: \"openapi\",\n sourceUrl: MICROSOFT_GRAPH_OPENAPI_URL,\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n oauth: microsoftOAuth([\"Mail.ReadWrite\", \"Mail.Send\", \"MailboxSettings.ReadWrite\"]),\n pathPrefixes: [\n \"/me/messages\",\n \"/me/mailFolders\",\n \"/me/sendMail\",\n \"/me/getMailTips\",\n \"/me/inferenceClassification\",\n \"/me/mailboxSettings\",\n \"/me/outlook\",\n ],\n features: mailboxFeatures(\"microsoft-outlook-mail\"),\n};\n\nexport const MICROSOFT_OUTLOOK_CALENDAR_PRESET: OpenApiProviderPreset = {\n id: \"microsoft-outlook-calendar\",\n name: \"Outlook Calendar\",\n summary: \"Calendars, events, availability, and scheduling.\",\n family: \"microsoft\",\n sourceFormat: \"openapi\",\n sourceUrl: MICROSOFT_GRAPH_OPENAPI_URL,\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n oauth: microsoftOAuth([\"Calendars.ReadWrite\"]),\n pathPrefixes: [\n \"/me/calendar\",\n \"/me/calendars\",\n \"/me/calendarGroups\",\n \"/me/calendarView\",\n \"/me/events\",\n \"/me/findMeetingTimes\",\n \"/me/reminderView\",\n ],\n features: [\n {\n featureKey: \"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 featureKey: \"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 accountIdentityFeature(\"microsoft\"),\n ],\n};\n\nexport const MICROSOFT_OUTLOOK_CONTACTS_PRESET: OpenApiProviderPreset = {\n id: \"microsoft-outlook-contacts\",\n name: \"Outlook Contacts\",\n summary: \"Contacts, contact folders, and people suggestions.\",\n family: \"microsoft\",\n sourceFormat: \"openapi\",\n sourceUrl: MICROSOFT_GRAPH_OPENAPI_URL,\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n oauth: microsoftOAuth([\"Contacts.ReadWrite\", \"People.Read.All\"]),\n pathPrefixes: [\"/me/contacts\", \"/me/contactFolders\", \"/me/people\"],\n features: [accountIdentityFeature(\"microsoft\")],\n};\n\nexport const MICROSOFT_ONEDRIVE_PRESET: OpenApiProviderPreset = {\n id: \"microsoft-onedrive\",\n name: \"OneDrive\",\n summary: \"Drives, files, folders, sharing links, and permissions.\",\n family: \"microsoft\",\n sourceFormat: \"openapi\",\n sourceUrl: MICROSOFT_GRAPH_OPENAPI_URL,\n baseUrl: MICROSOFT_GRAPH_BASE_URL,\n oauth: microsoftOAuth([\"Files.ReadWrite.All\", \"Sites.ReadWrite.All\"]),\n pathPrefixes: [\"/me/drive\", \"/me/drives\", \"/me/followedSites\", \"/drives\", \"/shares\"],\n features: [driveKnowledgeFeature(\"microsoft-onedrive\"), accountIdentityFeature(\"microsoft\")],\n};\n\nexport const CORE_PROVIDER_PRESETS: readonly OpenApiProviderPreset[] = [\n GOOGLE_DRIVE_PRESET,\n GOOGLE_GMAIL_PRESET,\n MICROSOFT_OUTLOOK_MAIL_PRESET,\n MICROSOFT_OUTLOOK_CALENDAR_PRESET,\n MICROSOFT_OUTLOOK_CONTACTS_PRESET,\n MICROSOFT_ONEDRIVE_PRESET,\n];\n\nexport function providerPresetById(id: string): OpenApiProviderPreset | undefined {\n return CORE_PROVIDER_PRESETS.find((preset) => preset.id === id);\n}\n\nexport function providerDomainForPreset(preset: OpenApiProviderPreset): string {\n return new URL(preset.baseUrl).hostname.toLowerCase();\n}\n\nexport function integrationFeaturesForPreset(\n presetId: string | null | undefined,\n): readonly IntegrationFeatureDefinition[] {\n return presetId ? (providerPresetById(presetId)?.features ?? []) : [];\n}\n\nexport function filterOpenApiDocumentForPreset(\n document: Record<string, unknown>,\n preset: OpenApiProviderPreset,\n): Record<string, unknown> {\n if (!preset.pathPrefixes?.length) return document;\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 preset.pathPrefixes!.some((prefix) => path === prefix || path.startsWith(`${prefix}/`)),\n ),\n );\n if (Object.keys(paths).length === 0) {\n throw new IntegrationProtocolError(\n \"provider_preset_empty\",\n `${preset.name} did not match any operations in the supplied OpenAPI document`,\n );\n }\n return {\n ...document,\n paths,\n ...(preset.baseUrl ? { servers: [{ url: preset.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(\n isRecord(rawMethod.parameters) ? rawMethod.parameters : {},\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 summary: stringValue(rawMethod.description) ?? 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"],"mappings":"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","names":["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/openapi.ts","../src/integration-definitions.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 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 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 { 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 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: \"google-gmail\" | \"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: provider === \"google-gmail\" ? \"history_id\" : \"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(provider === \"google-gmail\" ? \"google\" : \"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 GOOGLE_GMAIL_INTEGRATION_DEFINITION: IntegrationDefinition = {\n id: \"google-gmail\",\n name: \"Gmail\",\n summary: \"Messages, threads, labels, drafts, and sending mail.\",\n protocol: \"openapi\",\n provider: { id: \"google\", domain: \"gmail.googleapis.com\" },\n source: { kind: \"google_discovery\", url: googleDiscoveryUrl(\"gmail\", \"v1\") },\n baseUrl: \"https://gmail.googleapis.com/\",\n authentication: googleOAuth([\"https://mail.google.com/\"]),\n healthCheck: {\n operationKey: \"gmail.users.labels.list\",\n arguments: { path: { userId: \"me\" } },\n },\n facets: mailboxFacets(\"google-gmail\"),\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 GOOGLE_GMAIL_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(\n isRecord(rawMethod.parameters) ? rawMethod.parameters : {},\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 summary: stringValue(rawMethod.description) ?? 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"],"mappings":";AAwGO,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;;;AC1HA,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,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;;;AClIA,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,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;;;AG5lBO,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;;;ACxFA,SAAS,QAAQ,iBAAiB;AAsFlC,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,qBAAqB,QAAsD;AACzF,QAAM,QAAQ,OAAO,WAAW,WAAW,OAAO,WAAW,MAAM,IAAI,OAAO;AAC9E,MAAI,UAAU,KAAK,QAAQ,4BAA4B;AACrD,UAAM,IAAI;AAAA,MACR;AAAA,MACA,0CAA0C,0BAA0B;AAAA,IACtE;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,CAACA,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,UAAU,cAAc,QAAQ,CAAC;AACvD,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,WAAW;AACnE,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,sBAAsB,UAAU,UAAU,SAAS;AACxE,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,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,OACoD;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,YAAQ,YAAY,YAAY,CAAC,IAAI,kBAAkB,UAAU,SAAS,MAAM;AAAA,EAClF;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;;;ACzxBA,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,iBAAiB,eAAe;AAAA,IACvD;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,aAAa,iBAAiB,WAAW,WAAW;AAC3E;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,sCAA6D;AAAA,EACxE,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU,EAAE,IAAI,UAAU,QAAQ,uBAAuB;AAAA,EACzD,QAAQ,EAAE,MAAM,oBAAoB,KAAK,mBAAmB,SAAS,IAAI,EAAE;AAAA,EAC3E,SAAS;AAAA,EACT,gBAAgB,YAAY,CAAC,0BAA0B,CAAC;AAAA,EACxD,aAAa;AAAA,IACX,cAAc;AAAA,IACd,WAAW,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE;AAAA,EACtC;AAAA,EACA,QAAQ,cAAc,cAAc;AACtC;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,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,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,uBAAuB,CAAC,gBAAgB,sBAAsB,YAAY;AAAA,EAC5E;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB,eAAe,CAAC,sBAAsB,iBAAiB,CAAC;AAAA,EACxE,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,uBAAuB,CAAC,aAAa,cAAc,qBAAqB,WAAW,SAAS;AAAA,EAC9F;AAAA,EACA,SAAS;AAAA,EACT,gBAAgB,eAAe,CAAC,uBAAuB,qBAAqB,CAAC;AAAA,EAC7E,QAAQ,CAAC,oBAAoB,oBAAoB,GAAG,qBAAqB,WAAW,CAAC;AACvF;AAEO,IAAM,+BAAiE;AAAA,EAC5E;AAAA,EACA;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,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,MAAO,CAAC,CAAC,IAAI,MAC1C,sBAAsB,KAAK,CAAC,WAAW,SAAS,UAAU,KAAK,WAAW,GAAG,MAAM,GAAG,CAAC;AAAA,IACzF;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;AAAA,MACxBD,UAAS,UAAU,UAAU,IAAI,UAAU,aAAa,CAAC;AAAA,IAC3D,EAAE,QAAQ,CAAC,CAAC,MAAM,YAAY,MAAiC;AAC7D,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;AACD,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,MAC1C,SAASA,aAAY,UAAU,WAAW,KAAKA,aAAY,UAAU,EAAE,KAAK;AAAA,MAC5E,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;","names":["isRecord","normalizeMcpSchema","isRecord","stringValue"]}