@executor-js/plugin-openapi 0.2.1 → 1.4.21
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/{AddOpenApiSource-EV3NJHLA.js → AddOpenApiSource-FLMNI742.js} +4 -4
- package/dist/{EditOpenApiSource-J7NXCVT5.js → EditOpenApiSource-I4NIGIIJ.js} +8 -8
- package/dist/EditOpenApiSource-I4NIGIIJ.js.map +1 -0
- package/dist/{OpenApiSourceSummary-K5WZD5NR.js → OpenApiSourceSummary-CM46DB4L.js} +3 -3
- package/dist/api/group.d.ts +146 -7
- package/dist/api/index.d.ts +257 -7
- package/dist/{chunk-2BXVRXGL.js → chunk-E7PZ2QGD.js} +70 -112
- package/dist/chunk-E7PZ2QGD.js.map +1 -0
- package/dist/{chunk-LBTK5F65.js → chunk-GFQUEZUW.js} +7 -7
- package/dist/chunk-GFQUEZUW.js.map +1 -0
- package/dist/{chunk-TRD7KSKA.js → chunk-OZ67JNID.js} +11 -8
- package/dist/chunk-OZ67JNID.js.map +1 -0
- package/dist/{chunk-E4QUTDQ2.js → chunk-TGDT6QCH.js} +11 -11
- package/dist/chunk-TGDT6QCH.js.map +1 -0
- package/dist/client.js +3 -3
- package/dist/core.js +2 -2
- package/dist/index.js +2 -2
- package/dist/react/atoms.d.ts +164 -4
- package/dist/react/client.d.ts +146 -4
- package/dist/sdk/extract.d.ts +54 -3
- package/dist/sdk/invoke.d.ts +48 -4
- package/dist/sdk/plugin.d.ts +112 -4
- package/dist/sdk/preview.d.ts +201 -49
- package/dist/sdk/store.d.ts +36 -11
- package/dist/sdk/types.d.ts +191 -99
- package/package.json +4 -4
- package/dist/EditOpenApiSource-J7NXCVT5.js.map +0 -1
- package/dist/chunk-2BXVRXGL.js.map +0 -1
- package/dist/chunk-E4QUTDQ2.js.map +0 -1
- package/dist/chunk-LBTK5F65.js.map +0 -1
- package/dist/chunk-TRD7KSKA.js.map +0 -1
- /package/dist/{AddOpenApiSource-EV3NJHLA.js.map → AddOpenApiSource-FLMNI742.js.map} +0 -0
- /package/dist/{OpenApiSourceSummary-K5WZD5NR.js.map → OpenApiSourceSummary-CM46DB4L.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk/errors.ts","../src/sdk/parse.ts","../src/sdk/openapi-utils.ts","../src/sdk/types.ts","../src/sdk/extract.ts","../src/sdk/preview.ts","../src/sdk/store.ts"],"sourcesContent":["import { Data, Schema } from \"effect\";\nimport type { Option } from \"effect\";\n\n// HTTP status lives on the class declaration so HttpApiBuilder's error\n// encoder (which reads `ast.annotations` off the schema it stored on\n// `group.addError(...)`) finds it. Applying the annotation post-hoc\n// via `.annotate(...)` in group.ts produced a transform-wrapper AST\n// whose status was not picked up — the error then slipped the typed\n// channel and was captured as a 500 by the observability middleware,\n// spamming Sentry on user misconfig.\nexport class OpenApiParseError extends Schema.TaggedErrorClass<OpenApiParseError>()(\n \"OpenApiParseError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class OpenApiExtractionError extends Schema.TaggedErrorClass<OpenApiExtractionError>()(\n \"OpenApiExtractionError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class OpenApiInvocationError extends Data.TaggedError(\"OpenApiInvocationError\")<{\n readonly message: string;\n readonly statusCode: Option.Option<number>;\n readonly cause?: unknown;\n}> {}\n\nexport class OpenApiOAuthError extends Schema.TaggedErrorClass<OpenApiOAuthError>()(\n \"OpenApiOAuthError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n","import type { OpenAPI, OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport { Duration, Effect, Schema } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport YAML from \"yaml\";\n\nimport { OpenApiExtractionError, OpenApiParseError } from \"./errors\";\n\nexport type ParsedDocument = OpenAPIV3.Document | OpenAPIV3_1.Document;\n\nexport interface SpecFetchCredentials {\n readonly headers?: Record<string, string>;\n readonly queryParams?: Record<string, string>;\n}\n\n// ExtractionError subclass raised from parse() for non-3.x specs\nclass OpenApiExtractionErrorFromParse extends OpenApiExtractionError {}\n\n/**\n * Fetch an OpenAPI spec URL and return its body text. Uses the Effect\n * HttpClient so the caller chooses the transport via layer — in Cloudflare\n * Workers, `FetchHttpClient.layer` binds to the Workers-native `fetch` and\n * avoids json-schema-ref-parser's Node-polyfill http resolver, which hangs\n * in production. Bounded by a 60s timeout.\n */\nexport const fetchSpecText = Effect.fn(\"OpenApi.fetchSpecText\")(function* (\n url: string,\n credentials?: SpecFetchCredentials,\n) {\n const client = yield* HttpClient.HttpClient;\n const requestUrl = new URL(url);\n for (const [name, value] of Object.entries(credentials?.queryParams ?? {})) {\n requestUrl.searchParams.set(name, value);\n }\n let request = HttpClientRequest.get(requestUrl.toString()).pipe(\n HttpClientRequest.setHeader(\"Accept\", \"application/json, application/yaml, text/yaml, */*\"),\n );\n for (const [name, value] of Object.entries(credentials?.headers ?? {})) {\n request = HttpClientRequest.setHeader(request, name, value);\n }\n const response = yield* client.execute(request).pipe(\n Effect.timeout(Duration.seconds(60)),\n Effect.mapError(\n (_cause) =>\n new OpenApiParseError({\n message: \"Failed to fetch OpenAPI document\",\n }),\n ),\n );\n if (response.status < 200 || response.status >= 300) {\n return yield* new OpenApiParseError({\n message: `Failed to fetch OpenAPI document: HTTP ${response.status}`,\n });\n }\n return yield* response.text.pipe(\n Effect.mapError(\n (_cause) =>\n new OpenApiParseError({\n message: \"Failed to read OpenAPI document body\",\n }),\n ),\n );\n});\n\n/**\n * Resolve an input string to spec text — if it's a URL, fetch it via\n * HttpClient; otherwise return it as-is.\n */\nexport const resolveSpecText = (input: string, credentials?: SpecFetchCredentials) =>\n input.startsWith(\"http://\") || input.startsWith(\"https://\")\n ? fetchSpecText(input, credentials)\n : Effect.succeed(input);\n\n/**\n * Parse an OpenAPI document from spec text and validate it's OpenAPI 3.x.\n *\n * NOTE: does NOT resolve `$ref`s. `DocResolver` + `normalizeOpenApiRefs`\n * downstream work on refs lazily, so inlining them here would just waste\n * memory — and for big specs (e.g. Cloudflare's API) that blows through\n * the 128MB Cloudflare Workers memory cap.\n */\nexport const parse = Effect.fn(\"OpenApi.parse\")(function* (text: string) {\n const api = yield* parseTextToObject(text);\n\n if (!isOpenApi3(api)) {\n return yield* new OpenApiExtractionErrorFromParse({\n message:\n \"Only OpenAPI 3.x documents are supported. Swagger 2.x documents should be converted first.\",\n });\n }\n\n return api as ParsedDocument;\n});\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\nconst isOpenApi3 = (doc: OpenAPI.Document): doc is OpenAPIV3.Document | OpenAPIV3_1.Document =>\n \"openapi\" in doc && typeof doc.openapi === \"string\" && doc.openapi.startsWith(\"3.\");\n\nconst parseTextToObject = (text: string): Effect.Effect<OpenAPI.Document, OpenApiParseError> =>\n Effect.gen(function* () {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n return yield* new OpenApiParseError({\n message: \"OpenAPI document is empty\",\n });\n }\n\n const parsed = yield* parseJsonLike(trimmed).pipe(\n Effect.mapError(\n () =>\n new OpenApiParseError({\n message: \"Failed to parse OpenAPI document\",\n }),\n ),\n );\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return yield* new OpenApiParseError({\n message: \"OpenAPI document must parse to an object\",\n });\n }\n\n return parsed as OpenAPI.Document;\n });\n\nconst parseJsonText = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));\n\nconst parseJsonLike = (text: string): Effect.Effect<unknown, unknown> => {\n const parseYaml = Effect.try({\n try: () => YAML.parse(text) as unknown,\n catch: () => \"YamlParseFailed\" as const,\n });\n if (!text.startsWith(\"{\") && !text.startsWith(\"[\")) return parseYaml;\n return parseJsonText(text).pipe(Effect.catch(() => parseYaml));\n};\n","// ---------------------------------------------------------------------------\n// OpenAPI type aliases and $ref resolution\n//\n// Wraps the openapi-types V3/V3_1 union mess and provides clean ref resolution.\n// ---------------------------------------------------------------------------\n\nimport { Option } from \"effect\";\nimport type { OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport type { ParsedDocument } from \"./parse\";\nimport type { ServerVariable } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Type aliases — collapse V3 / V3_1 unions into single names\n// ---------------------------------------------------------------------------\n\nexport type ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\nexport type OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\nexport type PathItemObject = OpenAPIV3.PathItemObject | OpenAPIV3_1.PathItemObject;\nexport type RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\nexport type ResponseObject = OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject;\nexport type MediaTypeObject = OpenAPIV3.MediaTypeObject | OpenAPIV3_1.MediaTypeObject;\n\n// ---------------------------------------------------------------------------\n// DocResolver — wraps a parsed document for clean $ref resolution\n// ---------------------------------------------------------------------------\n\nexport class DocResolver {\n constructor(readonly doc: ParsedDocument) {}\n\n /** Resolve a value that might be a $ref, returning the resolved object */\n resolve<T>(value: T | OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject): T | null {\n if (isRef(value)) {\n const resolved = this.resolvePointer(value.$ref);\n return resolved as T | null;\n }\n return value as T;\n }\n\n private resolvePointer(ref: string): unknown {\n if (!ref.startsWith(\"#/\")) return null;\n const segments = ref.slice(2).split(\"/\");\n let current: unknown = this.doc;\n for (const segment of segments) {\n if (typeof current !== \"object\" || current === null) return null;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n }\n}\n\nconst isRef = (value: unknown): value is { $ref: string } =>\n typeof value === \"object\" && value !== null && \"$ref\" in value;\n\n// ---------------------------------------------------------------------------\n// Server URL resolution\n// ---------------------------------------------------------------------------\n\n/** Substitute `{var}` placeholders in a templated URL using a plain map. */\nexport const substituteUrlVariables = (url: string, values: Record<string, string>): string => {\n let out = url;\n for (const [name, value] of Object.entries(values)) {\n out = out.replaceAll(`{${name}}`, value);\n }\n return out;\n};\n\nexport const OPENAPI_MAX_SERVER_VARIABLE_OPTIONS = 64;\n\ntype ServerLike = {\n url: string;\n variables: import(\"effect/Option\").Option<Record<string, ServerVariable | string>>;\n};\n\nexport const expandServerUrlOptions = (\n server: ServerLike,\n limit = OPENAPI_MAX_SERVER_VARIABLE_OPTIONS,\n): readonly string[] => {\n if (!Option.isSome(server.variables)) return [server.url];\n let urls: readonly string[] = [server.url];\n for (const [name, variable] of Object.entries(server.variables.value)) {\n const enumValues =\n typeof variable === \"string\" ? [] : Option.getOrElse(variable.enum, () => []);\n const values =\n enumValues.length > 0\n ? enumValues\n : [typeof variable === \"string\" ? variable : variable.default];\n const next: string[] = [];\n for (const url of urls) {\n for (const value of values) {\n next.push(url.replaceAll(`{${name}}`, value));\n if (next.length >= limit) return next;\n }\n }\n urls = next;\n }\n return urls;\n};\n\nexport const resolveBaseUrl = (servers: readonly ServerLike[]): string => {\n const server = servers[0];\n if (!server) return \"\";\n\n if (!Option.isSome(server.variables)) return server.url;\n\n const values: Record<string, string> = {};\n for (const [name, v] of Object.entries(server.variables.value)) {\n values[name] = typeof v === \"string\" ? v : v.default;\n }\n return substituteUrlVariables(server.url, values);\n};\n\n// ---------------------------------------------------------------------------\n// Content negotiation\n// ---------------------------------------------------------------------------\n\n/**\n * Return all declared media entries in spec order. `Object.entries` on a\n * plain object preserves insertion order in modern engines, which matches\n * spec declaration order as the parser produced it.\n */\nexport const declaredContents = (\n content: Record<string, MediaTypeObject> | undefined,\n): ReadonlyArray<{ mediaType: string; media: MediaTypeObject }> => {\n if (!content) return [];\n return Object.entries(content).map(([mediaType, media]) => ({ mediaType, media }));\n};\n\n/**\n * Pick the default media type for a requestBody or response. Matches\n * swagger-client behaviour: **first declared wins** (not JSON-first). Spec\n * authors order content entries to signal intent (upload-heavy endpoints\n * declare multipart first, JSON second); respecting that order avoids\n * silently downgrading a multipart endpoint to JSON.\n *\n * For response bodies we still want a JSON preference because the server\n * picks the response content type, not the client — the old `application/\n * json` preference is preserved via `preferredResponseContent` below.\n */\nexport const preferredContent = (\n content: Record<string, MediaTypeObject> | undefined,\n): { mediaType: string; media: MediaTypeObject } | undefined => {\n const first = declaredContents(content)[0];\n return first ? first : undefined;\n};\n\n/** Response-side content picker — still JSON-first because the server\n * picks the response media type, so we want to advertise a preference. */\nexport const preferredResponseContent = (\n content: Record<string, MediaTypeObject> | undefined,\n): { mediaType: string; media: MediaTypeObject } | undefined => {\n if (!content) return undefined;\n const entries = Object.entries(content);\n const pick =\n entries.find(([mt]) => mt === \"application/json\") ??\n entries.find(([mt]) => mt.toLowerCase().includes(\"+json\")) ??\n entries.find(([mt]) => mt.toLowerCase().includes(\"json\")) ??\n entries[0];\n return pick ? { mediaType: pick[0], media: pick[1] } : undefined;\n};\n","import { Schema } from \"effect\";\nimport {\n ConnectionId,\n ScopeId,\n ScopedSecretCredentialInput,\n SecretBackedValue,\n SecretId,\n} from \"@executor-js/sdk/core\";\n\n// ---------------------------------------------------------------------------\n// Branded IDs\n// ---------------------------------------------------------------------------\n\nexport const OperationId = Schema.String.pipe(Schema.brand(\"OperationId\"));\nexport type OperationId = typeof OperationId.Type;\n\n// ---------------------------------------------------------------------------\n// HTTP\n// ---------------------------------------------------------------------------\n\nexport const HttpMethod = Schema.Literals([\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n]);\nexport type HttpMethod = typeof HttpMethod.Type;\n\nexport const ParameterLocation = Schema.Literals([\"path\", \"query\", \"header\", \"cookie\"]);\nexport type ParameterLocation = typeof ParameterLocation.Type;\n\n// ---------------------------------------------------------------------------\n// Extracted operation\n// ---------------------------------------------------------------------------\n\nexport class OperationParameter extends Schema.Class<OperationParameter>(\"OperationParameter\")({\n name: Schema.String,\n location: ParameterLocation,\n required: Schema.Boolean,\n schema: Schema.OptionFromOptional(Schema.Unknown),\n style: Schema.OptionFromOptional(Schema.String),\n explode: Schema.OptionFromOptional(Schema.Boolean),\n allowReserved: Schema.OptionFromOptional(Schema.Boolean),\n description: Schema.OptionFromOptional(Schema.String),\n}) {}\n\n/**\n * OpenAPI 3.x `Encoding Object` (§4.8.15). Declared per-property inside a\n * multipart/form-data or application/x-www-form-urlencoded request body.\n *\n * - `contentType` — for multipart, overrides the per-part `Content-Type`\n * header (e.g. `application/json` for a JSON-encoded metadata part).\n * - `style` / `explode` / `allowReserved` — for form-urlencoded, control\n * array / object serialization the same way parameter-level style does.\n */\nexport class EncodingObject extends Schema.Class<EncodingObject>(\"EncodingObject\")({\n contentType: Schema.OptionFromOptional(Schema.String),\n style: Schema.OptionFromOptional(Schema.String),\n explode: Schema.OptionFromOptional(Schema.Boolean),\n allowReserved: Schema.OptionFromOptional(Schema.Boolean),\n}) {}\n\nexport class MediaBinding extends Schema.Class<MediaBinding>(\"MediaBinding\")({\n contentType: Schema.String,\n schema: Schema.OptionFromOptional(Schema.Unknown),\n encoding: Schema.OptionFromOptional(Schema.Record(Schema.String, EncodingObject)),\n}) {}\n\nexport class OperationRequestBody extends Schema.Class<OperationRequestBody>(\n \"OperationRequestBody\",\n)({\n required: Schema.Boolean,\n /** Default media type — first declared in spec order (not JSON-first).\n * Used when the caller does not override via the tool's `contentType` arg. */\n contentType: Schema.String,\n /** Schema of the default media type. Kept for backward compat with stored\n * bindings from before `contents` was added. */\n schema: Schema.OptionFromOptional(Schema.Unknown),\n /** All declared media types in spec order. Populated by `extract.ts`\n * going forward; older persisted bindings may have this unset and will\n * fall back to `{contentType, schema}`. */\n contents: Schema.OptionFromOptional(Schema.Array(MediaBinding)),\n}) {}\n\nexport class ExtractedOperation extends Schema.Class<ExtractedOperation>(\"ExtractedOperation\")({\n operationId: OperationId,\n method: HttpMethod,\n pathTemplate: Schema.String,\n summary: Schema.OptionFromOptional(Schema.String),\n description: Schema.OptionFromOptional(Schema.String),\n tags: Schema.Array(Schema.String),\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.OptionFromOptional(OperationRequestBody),\n inputSchema: Schema.OptionFromOptional(Schema.Unknown),\n outputSchema: Schema.OptionFromOptional(Schema.Unknown),\n deprecated: Schema.Boolean,\n}) {}\n\nexport class ServerVariable extends Schema.Class<ServerVariable>(\"ServerVariable\")({\n default: Schema.String,\n enum: Schema.OptionFromOptional(Schema.Array(Schema.String)),\n description: Schema.OptionFromOptional(Schema.String),\n}) {}\n\nexport class ServerInfo extends Schema.Class<ServerInfo>(\"ServerInfo\")({\n url: Schema.String,\n description: Schema.OptionFromOptional(Schema.String),\n variables: Schema.OptionFromOptional(Schema.Record(Schema.String, ServerVariable)),\n}) {}\n\nexport class ExtractionResult extends Schema.Class<ExtractionResult>(\"ExtractionResult\")({\n title: Schema.OptionFromOptional(Schema.String),\n version: Schema.OptionFromOptional(Schema.String),\n servers: Schema.Array(ServerInfo),\n operations: Schema.Array(ExtractedOperation),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Operation binding — minimal invocation data (no schemas/metadata)\n// ---------------------------------------------------------------------------\n\nexport class OperationBinding extends Schema.Class<OperationBinding>(\"OperationBinding\")({\n method: HttpMethod,\n pathTemplate: Schema.String,\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.OptionFromOptional(OperationRequestBody),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Invocation\n// ---------------------------------------------------------------------------\n\n/**\n * A header value — either a static string or a reference to a secret.\n * Stored as JSON-serializable data.\n */\nexport const HeaderValue = SecretBackedValue;\nexport type HeaderValue = typeof HeaderValue.Type;\n\nexport class ConfiguredHeaderBinding extends Schema.Class<ConfiguredHeaderBinding>(\n \"OpenApiConfiguredHeaderBinding\",\n)({\n kind: Schema.Literal(\"binding\"),\n slot: Schema.String,\n prefix: Schema.optional(Schema.String),\n}) {}\n\nexport const ConfiguredHeaderValue = Schema.Union([Schema.String, ConfiguredHeaderBinding]);\nexport type ConfiguredHeaderValue = typeof ConfiguredHeaderValue.Type;\n\nexport const OpenApiCredentialInput = Schema.Union([\n ScopedSecretCredentialInput,\n HeaderValue,\n ConfiguredHeaderValue,\n]);\nexport type OpenApiCredentialInput = typeof OpenApiCredentialInput.Type;\n\nexport const OpenApiSourceBindingValue = Schema.Union([\n Schema.Struct({\n kind: Schema.Literal(\"secret\"),\n secretId: SecretId,\n secretScopeId: Schema.optional(ScopeId),\n }),\n Schema.Struct({\n kind: Schema.Literal(\"connection\"),\n connectionId: ConnectionId,\n }),\n Schema.Struct({\n kind: Schema.Literal(\"text\"),\n text: Schema.String,\n }),\n]);\nexport type OpenApiSourceBindingValue = typeof OpenApiSourceBindingValue.Type;\n\nexport const OpenApiSourceBindingInputSchema = Schema.Struct({\n sourceId: Schema.String,\n sourceScope: ScopeId,\n scope: ScopeId,\n slot: Schema.String,\n value: OpenApiSourceBindingValue,\n});\n\nexport class OpenApiSourceBindingInput extends Schema.Class<OpenApiSourceBindingInput>(\n \"OpenApiSourceBindingInput\",\n)(OpenApiSourceBindingInputSchema.fields) {}\n\nexport class OpenApiSourceBindingRef extends Schema.Class<OpenApiSourceBindingRef>(\n \"OpenApiSourceBindingRef\",\n)({\n sourceId: Schema.String,\n sourceScopeId: ScopeId,\n scopeId: ScopeId,\n slot: Schema.String,\n value: OpenApiSourceBindingValue,\n createdAt: Schema.Date,\n updatedAt: Schema.Date,\n}) {}\n\n// ---------------------------------------------------------------------------\n// OAuth2 source config — carries source-owned slots and API-level config to\n// kick off a fresh sign-in from the source detail UI without needing any\n// one user's live connection to still exist.\n//\n// Split of responsibilities:\n// - The Source owns: the OAuth config (tokenUrl, authorizationUrl,\n// client credential slots, connection slot, scopes, flow,\n// securitySchemeName).\n// Values are a property of the target API, identical for every user\n// signing into this source. Source-owned = reconnect works even if\n// the connection row has been removed.\n// - The Connection owns: live access/refresh tokens, token expiry,\n// provider state the refresh path reads from. The connection's\n// `providerState` caches the refresh-relevant bits of the config\n// so the refresh loop never reaches back into source storage.\n//\n// This is a deliberate small duplication (scopes + tokenUrl and the static\n// client credential ids referenced by slots appear in source bindings and\n// connection providerState). The values are static per source so the two\n// copies can't drift under normal reconnect flows.\n// ---------------------------------------------------------------------------\n\nexport const OAuth2Flow = Schema.Literals([\"authorizationCode\", \"clientCredentials\"]);\nexport type OAuth2Flow = typeof OAuth2Flow.Type;\n\nexport const OAuth2SourceConfigSchema = Schema.Struct({\n kind: Schema.Literal(\"oauth2\"),\n securitySchemeName: Schema.String,\n flow: OAuth2Flow,\n tokenUrl: Schema.String,\n authorizationUrl: Schema.NullOr(Schema.String),\n issuerUrl: Schema.optional(Schema.NullOr(Schema.String)),\n clientIdSlot: Schema.String,\n clientSecretSlot: Schema.NullOr(Schema.String),\n connectionSlot: Schema.String,\n scopes: Schema.Array(Schema.String),\n});\n\nexport class OAuth2SourceConfig extends Schema.Class<OAuth2SourceConfig>(\n \"OpenApiOAuth2SourceConfig\",\n)(OAuth2SourceConfigSchema.fields) {}\n\nexport class InvocationResult extends Schema.Class<InvocationResult>(\"InvocationResult\")({\n status: Schema.Number,\n headers: Schema.Record(Schema.String, Schema.String),\n data: Schema.NullOr(Schema.Unknown),\n error: Schema.NullOr(Schema.Unknown),\n}) {}\n","import { Effect, Option } from \"effect\";\n\nimport { OpenApiExtractionError } from \"./errors\";\nimport type { ParsedDocument } from \"./parse\";\nimport {\n declaredContents,\n DocResolver,\n preferredResponseContent,\n type OperationObject,\n type ParameterObject,\n type PathItemObject,\n type RequestBodyObject,\n type ResponseObject,\n} from \"./openapi-utils\";\nimport {\n EncodingObject,\n ExtractedOperation,\n ExtractionResult,\n type HttpMethod,\n MediaBinding,\n OperationId,\n OperationParameter,\n OperationRequestBody,\n type ParameterLocation,\n ServerInfo,\n ServerVariable,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst HTTP_METHODS: readonly HttpMethod[] = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n];\n\nconst VALID_PARAM_LOCATIONS = new Set<string>([\"path\", \"query\", \"header\", \"cookie\"]);\n\n// ---------------------------------------------------------------------------\n// Parameter extraction\n// ---------------------------------------------------------------------------\n\nconst extractParameters = (\n pathItem: PathItemObject,\n operation: OperationObject,\n r: DocResolver,\n): OperationParameter[] => {\n const merged = new Map<string, ParameterObject>();\n\n for (const raw of pathItem.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n for (const raw of operation.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n\n return [...merged.values()]\n .filter((p) => VALID_PARAM_LOCATIONS.has(p.in))\n .map(\n (p) =>\n new OperationParameter({\n name: p.name,\n location: p.in as ParameterLocation,\n required: p.in === \"path\" ? true : p.required === true,\n schema: Option.fromNullishOr(p.schema),\n style: Option.fromNullishOr(p.style),\n explode: Option.fromNullishOr(p.explode),\n allowReserved: Option.fromNullishOr(\"allowReserved\" in p ? p.allowReserved : undefined),\n description: Option.fromNullishOr(p.description),\n }),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Request body extraction\n// ---------------------------------------------------------------------------\n\nconst buildEncodingRecord = (\n encoding: Record<string, unknown> | undefined,\n): Record<string, EncodingObject> | undefined => {\n if (!encoding) return undefined;\n const out: Record<string, EncodingObject> = {};\n for (const [prop, raw] of Object.entries(encoding)) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const e = raw as {\n contentType?: string;\n style?: string;\n explode?: boolean;\n allowReserved?: boolean;\n };\n out[prop] = new EncodingObject({\n contentType: Option.fromNullishOr(e.contentType),\n style: Option.fromNullishOr(e.style),\n explode: Option.fromNullishOr(e.explode),\n allowReserved: Option.fromNullishOr(e.allowReserved),\n });\n }\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\nconst extractRequestBody = (\n operation: OperationObject,\n r: DocResolver,\n): OperationRequestBody | undefined => {\n if (!operation.requestBody) return undefined;\n\n const body = r.resolve<RequestBodyObject>(operation.requestBody);\n if (!body) return undefined;\n\n const contents = declaredContents(body.content).map(\n ({ mediaType, media }) =>\n new MediaBinding({\n contentType: mediaType,\n schema: Option.fromNullishOr(media.schema),\n encoding: Option.fromNullishOr(\n buildEncodingRecord((media as { encoding?: Record<string, unknown> }).encoding),\n ),\n }),\n );\n if (contents.length === 0) return undefined;\n\n // Default = first declared (spec author's preferred order). Callers can\n // override at invoke time with a `contentType` arg.\n const defaultContent = contents[0]!;\n\n return new OperationRequestBody({\n required: body.required === true,\n contentType: defaultContent.contentType,\n schema: defaultContent.schema,\n contents: Option.some(contents),\n });\n};\n\n// ---------------------------------------------------------------------------\n// Response schema extraction\n// ---------------------------------------------------------------------------\n\nconst extractOutputSchema = (operation: OperationObject, r: DocResolver): unknown | undefined => {\n if (!operation.responses) return undefined;\n\n const entries = Object.entries(operation.responses);\n const preferred = [\n ...entries.filter(([s]) => /^2\\d\\d$/.test(s)).sort(([a], [b]) => a.localeCompare(b)),\n ...entries.filter(([s]) => s === \"default\"),\n ];\n\n for (const [, ref] of preferred) {\n const resp = r.resolve<ResponseObject>(ref);\n if (!resp) continue;\n const content = preferredResponseContent(resp.content);\n if (content?.media.schema) return content.media.schema;\n }\n\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Input schema builder\n// ---------------------------------------------------------------------------\n\nconst buildInputSchema = (\n parameters: readonly OperationParameter[],\n requestBody: OperationRequestBody | undefined,\n): Record<string, unknown> | undefined => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const param of parameters) {\n properties[param.name] = Option.getOrElse(param.schema, () => ({ type: \"string\" }));\n if (param.required) required.push(param.name);\n }\n\n if (requestBody) {\n properties.body = Option.getOrElse(requestBody.schema, () => ({ type: \"object\" }));\n if (requestBody.required) required.push(\"body\");\n\n // When the spec declares multiple media types for this requestBody,\n // expose `contentType` so the model can pick. Default = first declared.\n // `body` schema tracks the default; the model is responsible for\n // supplying a body shape that matches whichever contentType it picks.\n const contents = Option.getOrUndefined(requestBody.contents);\n if (contents && contents.length > 1) {\n properties.contentType = {\n type: \"string\",\n enum: contents.map((c) => c.contentType),\n default: requestBody.contentType,\n description:\n \"Content-Type for the request body. Declared media types for this operation, in spec order.\",\n };\n }\n }\n\n if (Object.keys(properties).length === 0) return undefined;\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Operation ID derivation\n// ---------------------------------------------------------------------------\n\nconst deriveOperationId = (\n method: HttpMethod,\n pathTemplate: string,\n operation: OperationObject,\n): string =>\n operation.operationId ??\n (`${method}_${pathTemplate.replace(/[^a-zA-Z0-9]+/g, \"_\")}`.replace(/^_+|_+$/g, \"\") ||\n `${method}_operation`);\n\n// ---------------------------------------------------------------------------\n// Server extraction\n// ---------------------------------------------------------------------------\n\nconst extractServers = (doc: ParsedDocument): ServerInfo[] =>\n (doc.servers ?? []).flatMap((server) => {\n if (!server.url) return [];\n const vars = server.variables\n ? Object.fromEntries(\n Object.entries(server.variables).flatMap(([name, v]) => {\n if (v.default === undefined || v.default === null) return [];\n const enumValues = Array.isArray(v.enum)\n ? v.enum.filter((x): x is string => typeof x === \"string\")\n : undefined;\n return [\n [\n name,\n new ServerVariable({\n default: String(v.default),\n enum:\n enumValues && enumValues.length > 0 ? Option.some(enumValues) : Option.none(),\n description: Option.fromNullishOr(v.description),\n }),\n ],\n ];\n }),\n )\n : undefined;\n return [\n new ServerInfo({\n url: server.url,\n description: Option.fromNullishOr(server.description),\n variables: vars && Object.keys(vars).length > 0 ? Option.some(vars) : Option.none(),\n }),\n ];\n });\n\n// ---------------------------------------------------------------------------\n// Main extraction\n// ---------------------------------------------------------------------------\n\n/** Extract all operations from a bundled OpenAPI 3.x document */\nexport const extract = Effect.fn(\"OpenApi.extract\")(function* (doc: ParsedDocument) {\n const paths = doc.paths;\n if (!paths) {\n return yield* new OpenApiExtractionError({\n message: \"OpenAPI document has no paths defined\",\n });\n }\n\n const r = new DocResolver(doc);\n const operations: ExtractedOperation[] = [];\n\n for (const [pathTemplate, pathItem] of Object.entries(paths).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n if (!pathItem) continue;\n\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const parameters = extractParameters(pathItem, operation, r);\n const requestBody = extractRequestBody(operation, r);\n const inputSchema = buildInputSchema(parameters, requestBody);\n const outputSchema = extractOutputSchema(operation, r);\n const tags = (operation.tags ?? []).filter((t) => t.trim().length > 0);\n\n operations.push(\n new ExtractedOperation({\n operationId: OperationId.make(deriveOperationId(method, pathTemplate, operation)),\n method,\n pathTemplate,\n summary: Option.fromNullishOr(operation.summary),\n description: Option.fromNullishOr(operation.description),\n tags,\n parameters,\n requestBody: Option.fromNullishOr(requestBody),\n inputSchema: Option.fromNullishOr(inputSchema),\n outputSchema: Option.fromNullishOr(outputSchema),\n deprecated: operation.deprecated === true,\n }),\n );\n }\n }\n\n return new ExtractionResult({\n title: Option.fromNullishOr(doc.info?.title),\n version: Option.fromNullishOr(doc.info?.version),\n servers: extractServers(doc),\n operations,\n });\n});\n","import { Effect, Option } from \"effect\";\nimport { Schema } from \"effect\";\n\nimport { parse, resolveSpecText, type ParsedDocument } from \"./parse\";\nimport { extract } from \"./extract\";\nimport { DocResolver } from \"./openapi-utils\";\nimport { HttpMethod, ServerInfo, type ExtractionResult } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// OAuth 2.0 flows — one entry per supported grant type\n// ---------------------------------------------------------------------------\n\n/** Scopes declared by a flow: `{ scopeName: description }` */\nconst OAuth2Scopes = Schema.Record(Schema.String, Schema.String);\nconst SecuritySchemeType = Schema.Literals([\"http\", \"apiKey\", \"oauth2\", \"openIdConnect\"]);\ntype SecuritySchemeType = typeof SecuritySchemeType.Type;\n\nconst decodeSecuritySchemeType = Schema.decodeUnknownOption(SecuritySchemeType);\n\nexport class OAuth2AuthorizationCodeFlow extends Schema.Class<OAuth2AuthorizationCodeFlow>(\n \"OAuth2AuthorizationCodeFlow\",\n)({\n authorizationUrl: Schema.String,\n tokenUrl: Schema.String,\n refreshUrl: Schema.OptionFromOptional(Schema.String),\n scopes: OAuth2Scopes,\n}) {}\n\nexport class OAuth2ClientCredentialsFlow extends Schema.Class<OAuth2ClientCredentialsFlow>(\n \"OAuth2ClientCredentialsFlow\",\n)({\n tokenUrl: Schema.String,\n refreshUrl: Schema.OptionFromOptional(Schema.String),\n scopes: OAuth2Scopes,\n}) {}\n\nexport class OAuth2Flows extends Schema.Class<OAuth2Flows>(\"OAuth2Flows\")({\n authorizationCode: Schema.OptionFromOptional(OAuth2AuthorizationCodeFlow),\n clientCredentials: Schema.OptionFromOptional(OAuth2ClientCredentialsFlow),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Security scheme — what the spec declares it needs\n// ---------------------------------------------------------------------------\n\nexport class SecurityScheme extends Schema.Class<SecurityScheme>(\"SecurityScheme\")({\n /** Key name in components.securitySchemes (e.g. \"api_token\") */\n name: Schema.String,\n /** OpenAPI security scheme type */\n type: SecuritySchemeType,\n /** For type: \"http\" — e.g. \"bearer\", \"basic\" */\n scheme: Schema.OptionFromOptional(Schema.String),\n /** For type: \"http\" with scheme \"bearer\" — e.g. \"JWT\" */\n bearerFormat: Schema.OptionFromOptional(Schema.String),\n /** For type: \"apiKey\" — where the key goes */\n in: Schema.OptionFromOptional(Schema.Literals([\"header\", \"query\", \"cookie\"])),\n /** For type: \"apiKey\" — the header/query/cookie name */\n headerName: Schema.OptionFromOptional(Schema.String),\n description: Schema.OptionFromOptional(Schema.String),\n /** For type: \"oauth2\" — declared flows (authorizationCode / clientCredentials only; implicit and password are deprecated). */\n flows: Schema.OptionFromOptional(OAuth2Flows),\n /** For type: \"openIdConnect\" — the discovery URL. */\n openIdConnectUrl: Schema.OptionFromOptional(Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Auth strategy — a valid combination of security schemes\n// ---------------------------------------------------------------------------\n\nexport class AuthStrategy extends Schema.Class<AuthStrategy>(\"AuthStrategy\")({\n /** The security schemes required together for this strategy */\n schemes: Schema.Array(Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Header preset — derived from an auth strategy\n// ---------------------------------------------------------------------------\n\nexport class HeaderPreset extends Schema.Class<HeaderPreset>(\"HeaderPreset\")({\n /** Human-readable label for the UI (e.g. \"Bearer Token\", \"API Key + Email\") */\n label: Schema.String,\n /** Headers this strategy needs. Value is null when the user must provide it. */\n headers: Schema.Record(Schema.String, Schema.NullOr(Schema.String)),\n /** Which headers should be stored as secrets */\n secretHeaders: Schema.Array(Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// OAuth2 preset — derived from an oauth2 security scheme + a flow choice\n// ---------------------------------------------------------------------------\n\nexport class OAuth2Preset extends Schema.Class<OAuth2Preset>(\"OAuth2Preset\")({\n /** Human-readable label for the UI (e.g. \"OAuth2 (Authorization Code) — oauth_app\") */\n label: Schema.String,\n /** The source security scheme this preset came from (components.securitySchemes key). */\n securitySchemeName: Schema.String,\n /** Which OAuth2 flow this preset uses. */\n flow: Schema.Literals([\"authorizationCode\", \"clientCredentials\"]),\n /** For authorizationCode: user-agent redirect URL (from the spec). */\n authorizationUrl: Schema.OptionFromOptional(Schema.String),\n /** Token endpoint to exchange the code / refresh. */\n tokenUrl: Schema.String,\n /** Optional refresh endpoint if the spec declares one separately. */\n refreshUrl: Schema.OptionFromOptional(Schema.String),\n /** Declared scopes for this flow: `{ scope: description }`. */\n scopes: Schema.Record(Schema.String, Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Preview operation — lightweight shape for the add-source UI list\n// ---------------------------------------------------------------------------\n\nexport class PreviewOperation extends Schema.Class<PreviewOperation>(\"PreviewOperation\")({\n operationId: Schema.String,\n method: HttpMethod,\n path: Schema.String,\n summary: Schema.OptionFromOptional(Schema.String),\n tags: Schema.Array(Schema.String),\n deprecated: Schema.Boolean,\n}) {}\n\n// ---------------------------------------------------------------------------\n// Spec preview — everything the frontend needs\n// ---------------------------------------------------------------------------\n\nexport class SpecPreview extends Schema.Class<SpecPreview>(\"SpecPreview\")({\n title: Schema.OptionFromOptional(Schema.String),\n version: Schema.OptionFromOptional(Schema.String),\n /** Reuses ServerInfo from extraction */\n servers: Schema.Array(ServerInfo),\n operationCount: Schema.Number,\n /** Lightweight operation list for the add-source UI */\n operations: Schema.Array(PreviewOperation),\n tags: Schema.Array(Schema.String),\n securitySchemes: Schema.Array(SecurityScheme),\n /** Valid auth strategies (each is a set of schemes used together) */\n authStrategies: Schema.Array(AuthStrategy),\n /** Pre-built header presets derived from auth strategies */\n headerPresets: Schema.Array(HeaderPreset),\n /** OAuth2 presets — one per (oauth2 scheme × supported flow) combination */\n oauth2Presets: Schema.Array(OAuth2Preset),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Security scheme extraction\n// ---------------------------------------------------------------------------\n\nconst stringRecord = (value: unknown): Record<string, string> => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === \"string\") out[k] = v;\n }\n return out;\n};\n\nconst extractFlows = (rawFlows: unknown): Option.Option<OAuth2Flows> => {\n if (!rawFlows || typeof rawFlows !== \"object\") return Option.none();\n const flows = rawFlows as Record<string, unknown>;\n\n const parseFlow = <K extends \"authorizationCode\" | \"clientCredentials\">(key: K): unknown =>\n flows[key];\n\n let authorizationCode: Option.Option<OAuth2AuthorizationCodeFlow> = Option.none();\n const authCodeRaw = parseFlow(\"authorizationCode\");\n if (authCodeRaw && typeof authCodeRaw === \"object\") {\n const f = authCodeRaw as Record<string, unknown>;\n const authUrl = typeof f.authorizationUrl === \"string\" ? f.authorizationUrl : null;\n const tokenUrl = typeof f.tokenUrl === \"string\" ? f.tokenUrl : null;\n if (authUrl && tokenUrl) {\n authorizationCode = Option.some(\n new OAuth2AuthorizationCodeFlow({\n authorizationUrl: authUrl,\n tokenUrl,\n refreshUrl: Option.fromNullishOr(\n typeof f.refreshUrl === \"string\" ? f.refreshUrl : undefined,\n ),\n scopes: stringRecord(f.scopes),\n }),\n );\n }\n }\n\n let clientCredentials: Option.Option<OAuth2ClientCredentialsFlow> = Option.none();\n const ccRaw = parseFlow(\"clientCredentials\");\n if (ccRaw && typeof ccRaw === \"object\") {\n const f = ccRaw as Record<string, unknown>;\n const tokenUrl = typeof f.tokenUrl === \"string\" ? f.tokenUrl : null;\n if (tokenUrl) {\n clientCredentials = Option.some(\n new OAuth2ClientCredentialsFlow({\n tokenUrl,\n refreshUrl: Option.fromNullishOr(\n typeof f.refreshUrl === \"string\" ? f.refreshUrl : undefined,\n ),\n scopes: stringRecord(f.scopes),\n }),\n );\n }\n }\n\n if (Option.isNone(authorizationCode) && Option.isNone(clientCredentials)) {\n return Option.none();\n }\n return Option.some(new OAuth2Flows({ authorizationCode, clientCredentials }));\n};\n\nconst extractSecuritySchemes = (\n rawSchemes: Record<string, unknown>,\n resolver: DocResolver,\n): SecurityScheme[] =>\n Object.entries(rawSchemes).flatMap(([name, schemeOrRef]) => {\n if (!schemeOrRef || typeof schemeOrRef !== \"object\") return [];\n // Resolve $ref so schemes defined via `$ref` aren't silently dropped.\n const resolved = resolver.resolve<Record<string, unknown>>(\n schemeOrRef as Record<string, unknown>,\n );\n if (!resolved || typeof resolved !== \"object\") return [];\n const scheme = resolved;\n\n const type = decodeSecuritySchemeType(scheme.type);\n if (Option.isNone(type)) return [];\n const schemeType = type.value;\n\n return [\n new SecurityScheme({\n name,\n type: schemeType,\n scheme: Option.fromNullishOr(scheme.scheme as string | undefined),\n bearerFormat: Option.fromNullishOr(scheme.bearerFormat as string | undefined),\n in: Option.fromNullishOr(scheme.in as \"header\" | \"query\" | \"cookie\" | undefined),\n headerName: Option.fromNullishOr(scheme.name as string | undefined),\n description: Option.fromNullishOr(scheme.description as string | undefined),\n flows: schemeType === \"oauth2\" ? extractFlows(scheme.flows) : Option.none(),\n openIdConnectUrl: Option.fromNullishOr(scheme.openIdConnectUrl as string | undefined),\n }),\n ];\n });\n\n// ---------------------------------------------------------------------------\n// Header preset builder\n// ---------------------------------------------------------------------------\n\nconst buildHeaderPresets = (\n schemes: readonly SecurityScheme[],\n strategies: readonly AuthStrategy[],\n): HeaderPreset[] => {\n const schemeMap = new Map(schemes.map((s) => [s.name, s]));\n\n return strategies.flatMap((strategy) => {\n const resolved = strategy.schemes\n .map((name) => schemeMap.get(name))\n .filter((s): s is SecurityScheme => s !== undefined);\n\n if (resolved.length === 0) return [];\n\n const headers: Record<string, string | null> = {};\n const secretHeaders: string[] = [];\n const labelParts: string[] = [];\n\n for (const scheme of resolved) {\n if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"bearer\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Bearer Token\");\n } else if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"basic\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Basic Auth\");\n } else if (scheme.type === \"apiKey\" && Option.getOrElse(scheme.in, () => \"\") === \"header\") {\n const headerName = Option.getOrElse(scheme.headerName, () => scheme.name);\n headers[headerName] = null;\n secretHeaders.push(headerName);\n labelParts.push(scheme.name);\n } else if (scheme.type === \"apiKey\") {\n labelParts.push(`${scheme.name} (${Option.getOrElse(scheme.in, () => \"unknown\")})`);\n } else if (scheme.type === \"oauth2\" || scheme.type === \"openIdConnect\") {\n return [];\n } else {\n labelParts.push(scheme.name);\n }\n }\n\n if (Object.keys(headers).length === 0 && resolved.length > 0) {\n return [\n new HeaderPreset({\n label: labelParts.join(\" + \"),\n headers: {},\n secretHeaders: [],\n }),\n ];\n }\n\n return [\n new HeaderPreset({\n label: labelParts.join(\" + \"),\n headers,\n secretHeaders,\n }),\n ];\n });\n};\n\n// ---------------------------------------------------------------------------\n// OAuth2 preset builder\n// ---------------------------------------------------------------------------\n\nconst buildOAuth2Presets = (schemes: readonly SecurityScheme[]): OAuth2Preset[] => {\n const presets: OAuth2Preset[] = [];\n for (const scheme of schemes) {\n if (scheme.type !== \"oauth2\") continue;\n if (Option.isNone(scheme.flows)) continue;\n const flows = scheme.flows.value;\n\n if (Option.isSome(flows.authorizationCode)) {\n const flow = flows.authorizationCode.value;\n presets.push(\n new OAuth2Preset({\n label: `OAuth2 Authorization Code · ${scheme.name}`,\n securitySchemeName: scheme.name,\n flow: \"authorizationCode\",\n authorizationUrl: Option.some(flow.authorizationUrl),\n tokenUrl: flow.tokenUrl,\n refreshUrl: flow.refreshUrl,\n scopes: flow.scopes,\n }),\n );\n }\n\n if (Option.isSome(flows.clientCredentials)) {\n const flow = flows.clientCredentials.value;\n presets.push(\n new OAuth2Preset({\n label: `OAuth2 Client Credentials · ${scheme.name}`,\n securitySchemeName: scheme.name,\n flow: \"clientCredentials\",\n authorizationUrl: Option.none(),\n tokenUrl: flow.tokenUrl,\n refreshUrl: flow.refreshUrl,\n scopes: flow.scopes,\n }),\n );\n }\n }\n return presets;\n};\n\n// ---------------------------------------------------------------------------\n// Collect unique tags from extraction result\n// ---------------------------------------------------------------------------\n\nconst collectTags = (result: ExtractionResult): string[] => {\n const tagSet = new Set<string>();\n for (const op of result.operations) {\n for (const tag of op.tags) tagSet.add(tag);\n }\n return [...tagSet].sort();\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Preview an OpenAPI spec — extract metadata without registering anything.\n * Accepts either a URL or raw JSON/YAML text. */\nexport const previewSpec = Effect.fn(\"OpenApi.previewSpec\")(function* (input: string) {\n const specText = yield* resolveSpecText(input);\n const doc: ParsedDocument = yield* parse(specText);\n const result = yield* extract(doc);\n\n const resolver = new DocResolver(doc);\n const securitySchemes = extractSecuritySchemes(doc.components?.securitySchemes ?? {}, resolver);\n\n const rawSecurity = (doc.security ?? []) as Array<Record<string, unknown>>;\n const declaredStrategies = rawSecurity.map(\n (entry) => new AuthStrategy({ schemes: Object.keys(entry) }),\n );\n // Fall back to one strategy per scheme when the spec only declares schemes\n // under components (e.g. Sentry) so the user still sees auth options.\n const authStrategies =\n declaredStrategies.length > 0\n ? declaredStrategies\n : securitySchemes.map((scheme) => new AuthStrategy({ schemes: [scheme.name] }));\n\n return new SpecPreview({\n title: result.title,\n version: result.version,\n servers: result.servers,\n operationCount: result.operations.length,\n operations: result.operations.map(\n (op) =>\n new PreviewOperation({\n operationId: op.operationId,\n method: op.method,\n path: op.pathTemplate,\n summary: op.summary,\n tags: op.tags,\n deprecated: op.deprecated,\n }),\n ),\n tags: collectTags(result),\n securitySchemes,\n authStrategies,\n headerPresets: buildHeaderPresets(securitySchemes, authStrategies),\n oauth2Presets: buildOAuth2Presets(securitySchemes),\n });\n});\n","import { Effect, Option, Schema } from \"effect\";\n\nimport { defineSchema, type StorageDeps, type StorageFailure } from \"@executor-js/sdk/core\";\n\nimport {\n ConfiguredHeaderValue,\n ConfiguredHeaderBinding,\n OAuth2SourceConfig,\n OperationBinding,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Schema:\n// - openapi_source: one row per onboarded spec (baseUrl, oauth2, ...)\n// - openapi_operation: one row per operation binding keyed by tool id\n// ---------------------------------------------------------------------------\n\n// Each of the source-owned credential-structure child tables (`openapi_source_header`,\n// `openapi_source_query_param`,\n// `openapi_source_spec_fetch_header`,\n// `openapi_source_spec_fetch_query_param`) shares the same column shape:\n// id/scope_id/source_id/name plus a `kind` enum that discriminates a\n// literal text value from a credential slot binding (with optional prefix).\n// The fields are inlined per-table because `defineSchema`'s type\n// narrowing relies on the literal types staying on the original\n// declaration site.\n\nexport const openapiSchema = defineSchema({\n openapi_source: {\n fields: {\n id: { type: \"string\", required: true },\n scope_id: { type: \"string\", required: true, index: true },\n name: { type: \"string\", required: true },\n spec: { type: \"string\", required: true },\n // Origin URL the spec was fetched from. Set when `addSpec` was\n // invoked with an http(s) URL; null when the caller passed raw\n // spec text. Drives `canRefresh` on the core source row and\n // is the address re-fetched on `refreshSource`.\n source_url: { type: \"string\", required: false },\n base_url: { type: \"string\", required: false },\n // OAuth2 stays JSON because it is one typed source-owned config object\n // carrying slot names, not concrete secret/connection ids.\n oauth2: { type: \"json\", required: false },\n },\n },\n openapi_operation: {\n fields: {\n id: { type: \"string\", required: true },\n scope_id: { type: \"string\", required: true, index: true },\n source_id: { type: \"string\", required: true, index: true },\n binding: { type: \"json\", required: true },\n },\n },\n openapi_source_header: {\n fields: {\n id: { type: \"string\", required: true },\n scope_id: { type: \"string\", required: true, index: true },\n source_id: { type: \"string\", required: true, index: true },\n name: { type: \"string\", required: true },\n kind: { type: [\"text\", \"binding\"], required: true },\n text_value: { type: \"string\", required: false },\n slot_key: { type: \"string\", required: false },\n prefix: { type: \"string\", required: false },\n },\n },\n openapi_source_query_param: {\n fields: {\n id: { type: \"string\", required: true },\n scope_id: { type: \"string\", required: true, index: true },\n source_id: { type: \"string\", required: true, index: true },\n name: { type: \"string\", required: true },\n kind: { type: [\"text\", \"binding\"], required: true },\n text_value: { type: \"string\", required: false },\n slot_key: { type: \"string\", required: false },\n prefix: { type: \"string\", required: false },\n },\n },\n openapi_source_spec_fetch_header: {\n fields: {\n id: { type: \"string\", required: true },\n scope_id: { type: \"string\", required: true, index: true },\n source_id: { type: \"string\", required: true, index: true },\n name: { type: \"string\", required: true },\n kind: { type: [\"text\", \"binding\"], required: true },\n text_value: { type: \"string\", required: false },\n slot_key: { type: \"string\", required: false },\n prefix: { type: \"string\", required: false },\n },\n },\n openapi_source_spec_fetch_query_param: {\n fields: {\n id: { type: \"string\", required: true },\n scope_id: { type: \"string\", required: true, index: true },\n source_id: { type: \"string\", required: true, index: true },\n name: { type: \"string\", required: true },\n kind: { type: [\"text\", \"binding\"], required: true },\n text_value: { type: \"string\", required: false },\n slot_key: { type: \"string\", required: false },\n prefix: { type: \"string\", required: false },\n },\n },\n});\n\nexport type OpenapiSchema = typeof openapiSchema;\n\n// ---------------------------------------------------------------------------\n// In-memory shapes\n// ---------------------------------------------------------------------------\n\nexport interface SourceConfig {\n readonly spec: string;\n /** Origin URL when the spec was fetched from http(s). Absent for\n * raw-text adds. Persisted so `refreshSource` can re-fetch. */\n readonly sourceUrl?: string;\n readonly baseUrl?: string;\n readonly namespace?: string;\n readonly headers?: Record<string, ConfiguredHeaderValue>;\n readonly queryParams?: Record<string, ConfiguredHeaderValue>;\n readonly specFetchCredentials?: OpenApiSpecFetchCredentials;\n readonly oauth2?: OAuth2SourceConfig;\n}\n\nexport interface OpenApiSpecFetchCredentials {\n readonly headers?: Record<string, ConfiguredHeaderValue>;\n readonly queryParams?: Record<string, ConfiguredHeaderValue>;\n}\n\nexport interface StoredSource {\n readonly namespace: string;\n /** Executor scope id this source row lives in. Writes stamp this on\n * `scope_id`; reads return whichever scope's row the adapter's\n * fall-through filter sees first. */\n readonly scope: string;\n readonly name: string;\n readonly config: SourceConfig;\n}\n\n// ---------------------------------------------------------------------------\n// Schema-class mirror of StoredSource for the API layer, where we need\n// an encodable/decodable shape for HTTP responses.\n// ---------------------------------------------------------------------------\n\nexport class StoredSourceSchema extends Schema.Class<StoredSourceSchema>(\"OpenApiStoredSource\")({\n namespace: Schema.String,\n scope: Schema.String,\n name: Schema.String,\n config: Schema.Struct({\n spec: Schema.String,\n sourceUrl: Schema.optional(Schema.String),\n baseUrl: Schema.optional(Schema.String),\n namespace: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record(Schema.String, ConfiguredHeaderValue)),\n queryParams: Schema.optional(Schema.Record(Schema.String, ConfiguredHeaderValue)),\n specFetchCredentials: Schema.optional(\n Schema.Struct({\n headers: Schema.optional(Schema.Record(Schema.String, ConfiguredHeaderValue)),\n queryParams: Schema.optional(Schema.Record(Schema.String, ConfiguredHeaderValue)),\n }),\n ),\n // Canonical source-owned OAuth config. Concrete client credentials\n // and connection ids live in OpenAPI-owned scoped binding rows.\n oauth2: Schema.optional(OAuth2SourceConfig),\n }),\n}) {}\n\nexport type StoredSourceSchemaType = typeof StoredSourceSchema.Type;\n\nexport interface StoredOperation {\n readonly toolId: string;\n readonly sourceId: string;\n readonly binding: OperationBinding;\n}\n\n// ---------------------------------------------------------------------------\n// Schema encode/decode — OperationBinding has Option fields, so we must use\n// Schema.encode/decode rather than plain JSON to round-trip correctly.\n// ---------------------------------------------------------------------------\n\nconst encodeBinding = Schema.encodeSync(OperationBinding);\nconst decodeBinding = Schema.decodeUnknownSync(OperationBinding);\nconst decodeBindingJson = Schema.decodeUnknownSync(Schema.fromJsonString(OperationBinding));\n\nconst decodeOAuth2SourceConfigOption = Schema.decodeUnknownOption(OAuth2SourceConfig);\nconst decodeOAuth2SourceConfigJsonOption = Schema.decodeUnknownOption(\n Schema.fromJsonString(OAuth2SourceConfig),\n);\nconst encodeOAuth2SourceConfig = Schema.encodeSync(OAuth2SourceConfig);\n\nconst NullableString = Schema.NullOr(Schema.String);\nconst OptionalNullableString = Schema.optional(NullableString);\n\nconst ChildStorageRow = Schema.Struct({\n name: Schema.String,\n kind: Schema.Literals([\"text\", \"binding\"]),\n text_value: OptionalNullableString,\n slot_key: OptionalNullableString,\n prefix: OptionalNullableString,\n});\nconst decodeChildStorageRowOption = Schema.decodeUnknownOption(ChildStorageRow);\n\nconst SourceStorageRow = Schema.Struct({\n id: Schema.String,\n scope_id: Schema.String,\n name: Schema.String,\n spec: Schema.String,\n source_url: OptionalNullableString,\n base_url: OptionalNullableString,\n oauth2: Schema.optional(Schema.Unknown),\n});\nconst decodeSourceStorageRow = Schema.decodeUnknownSync(SourceStorageRow);\n\nconst OperationStorageRow = Schema.Struct({\n id: Schema.String,\n source_id: Schema.String,\n binding: Schema.Unknown,\n});\nconst decodeOperationStorageRow = Schema.decodeUnknownSync(OperationStorageRow);\n\ninterface ChildRow {\n readonly id: string;\n readonly scope_id: string;\n readonly source_id: string;\n readonly name: string;\n readonly kind: \"text\" | \"binding\";\n readonly text_value?: string;\n readonly slot_key?: string;\n readonly prefix?: string;\n // Index signature to satisfy adapter's `RowInput` shape (the typed\n // adapter exposes its row shape with one).\n readonly [k: string]: unknown;\n}\n\n// Collapse a structural credential map into the flat child-table column\n// shape used by openapi_source_header, openapi_source_query_param, and\n// the two openapi_source_spec_fetch_* tables. Returns one record per entry.\nconst valueMapToChildRows = (\n sourceId: string,\n scope: string,\n values: Record<string, ConfiguredHeaderValue> | undefined,\n): readonly ChildRow[] => {\n if (!values) return [];\n return Object.entries(values).map(([name, value]) => {\n const id = JSON.stringify([sourceId, name]);\n if (typeof value === \"string\") {\n return {\n id,\n scope_id: scope,\n source_id: sourceId,\n name,\n kind: \"text\",\n text_value: value,\n };\n }\n return {\n id,\n scope_id: scope,\n source_id: sourceId,\n name,\n kind: \"binding\",\n slot_key: value.slot,\n prefix: value.prefix,\n };\n });\n};\n\nconst childRowsToValueMap = (\n rows: readonly Record<string, unknown>[],\n): Record<string, ConfiguredHeaderValue> => {\n const out: Record<string, ConfiguredHeaderValue> = {};\n for (const row of rows) {\n const decoded = decodeChildStorageRowOption(row);\n if (Option.isSome(decoded)) {\n const child = decoded.value;\n if (child.kind === \"binding\" && child.slot_key != null) {\n out[child.name] =\n child.prefix != null\n ? new ConfiguredHeaderBinding({\n kind: \"binding\",\n slot: child.slot_key,\n prefix: child.prefix,\n })\n : new ConfiguredHeaderBinding({\n kind: \"binding\",\n slot: child.slot_key,\n });\n } else if (child.kind === \"text\" && child.text_value != null) {\n out[child.name] = child.text_value;\n }\n }\n }\n return out;\n};\n\n// oxlint-disable-next-line executor/no-explicit-unknown-record -- boundary: storage adapter accepts JSON object columns\nconst toJsonRecord = (value: unknown): Record<string, unknown> => value as Record<string, unknown>;\n\nconst slugifySlotPart = (value: string): string =>\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"default\";\n\nexport const headerBindingSlot = (headerName: string): string =>\n `header:${slugifySlotPart(headerName)}`;\n\nexport const queryParamBindingSlot = (name: string): string =>\n `query_param:${slugifySlotPart(name)}`;\n\nexport const oauth2ClientIdSlot = (securitySchemeName: string): string =>\n `oauth2:${slugifySlotPart(securitySchemeName)}:client-id`;\n\nexport const oauth2ClientSecretSlot = (securitySchemeName: string): string =>\n `oauth2:${slugifySlotPart(securitySchemeName)}:client-secret`;\n\nexport const oauth2ConnectionSlot = (securitySchemeName: string): string =>\n `oauth2:${slugifySlotPart(securitySchemeName)}:connection`;\n\nconst normalizeStoredOAuth2 = (value: unknown): OAuth2SourceConfig | undefined => {\n if (value == null) return undefined;\n const sourceConfig =\n typeof value === \"string\"\n ? decodeOAuth2SourceConfigJsonOption(value)\n : decodeOAuth2SourceConfigOption(value);\n if (Option.isSome(sourceConfig)) {\n return sourceConfig.value;\n }\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\n// Every method routes through the typed adapter (`ctx.storage.adapter`)\n// so the typed error channel is `StorageFailure`. Schema-decode failures\n// inside `Effect.gen` land as defects, not typed errors, and are caught\n// by the HTTP edge's observability middleware.\n//\n// Every read/write that targets a single row pins BOTH the natural id\n// (namespace, toolId, sessionId) AND the owning `scope_id`. The store\n// runs behind the scoped adapter (which auto-injects `scope_id IN\n// (stack)`), so a bare `{id}` filter resolves to any matching row in\n// the stack in adapter-iteration order. For shadowed rows (same id at\n// multiple scopes — e.g. an org-level openapi source with a per-user\n// override), that's a scope-isolation bug: updates and deletes can\n// land on the wrong scope's row. Callers thread the resolved scope in\n// (typically `path.scopeId` for HTTP, `toolRow.scope_id` /\n// `input.scope` for invokeTool/lifecycle) so every keyed mutation\n// targets exactly one row.\nexport interface OpenapiStore {\n readonly upsertSource: (\n input: StoredSource,\n operations: readonly StoredOperation[],\n ) => Effect.Effect<void, StorageFailure>;\n\n readonly updateSourceMeta: (\n namespace: string,\n scope: string,\n patch: {\n readonly name?: string;\n readonly baseUrl?: string;\n readonly headers?: Record<string, ConfiguredHeaderValue>;\n readonly queryParams?: Record<string, ConfiguredHeaderValue>;\n readonly oauth2?: OAuth2SourceConfig;\n },\n ) => Effect.Effect<void, StorageFailure>;\n\n readonly getSource: (\n namespace: string,\n scope: string,\n ) => Effect.Effect<StoredSource | null, StorageFailure>;\n\n readonly listSources: () => Effect.Effect<readonly StoredSource[], StorageFailure>;\n\n readonly getOperationByToolId: (\n toolId: string,\n scope: string,\n ) => Effect.Effect<StoredOperation | null, StorageFailure>;\n\n readonly listOperationsBySource: (\n sourceId: string,\n scope: string,\n ) => Effect.Effect<readonly StoredOperation[], StorageFailure>;\n\n readonly removeSource: (namespace: string, scope: string) => Effect.Effect<void, StorageFailure>;\n\n // ---------------------------------------------------------------------\n // Query params and spec-fetch credentials are source-owned structural\n // rows only. Secret/connection ownership and usages live in core\n // `credential_binding`.\n}\n\n// ---------------------------------------------------------------------------\n// Default store implementation\n// ---------------------------------------------------------------------------\n\nexport const makeDefaultOpenapiStore = ({ adapter }: StorageDeps<OpenapiSchema>): OpenapiStore => {\n const loadChildValueMap = (\n model:\n | \"openapi_source_header\"\n | \"openapi_source_query_param\"\n | \"openapi_source_spec_fetch_header\"\n | \"openapi_source_spec_fetch_query_param\",\n sourceId: string,\n scope: string,\n ) =>\n adapter\n .findMany({\n model,\n where: [\n { field: \"source_id\", value: sourceId },\n { field: \"scope_id\", value: scope },\n ],\n })\n .pipe(Effect.map(childRowsToValueMap));\n\n const rowToSource = (row: Record<string, unknown>): Effect.Effect<StoredSource, StorageFailure> =>\n Effect.gen(function* () {\n const sourceRow = decodeSourceStorageRow(row);\n const sourceId = sourceRow.id;\n const scope = sourceRow.scope_id;\n const oauth2 = normalizeStoredOAuth2(sourceRow.oauth2);\n\n const headers = yield* loadChildValueMap(\"openapi_source_header\", sourceId, scope);\n const queryParams = yield* loadChildValueMap(\"openapi_source_query_param\", sourceId, scope);\n const specFetchHeaders = yield* loadChildValueMap(\n \"openapi_source_spec_fetch_header\",\n sourceId,\n scope,\n );\n const specFetchQueryParams = yield* loadChildValueMap(\n \"openapi_source_spec_fetch_query_param\",\n sourceId,\n scope,\n );\n const specFetchCredentials: OpenApiSpecFetchCredentials | undefined =\n Object.keys(specFetchHeaders).length === 0 && Object.keys(specFetchQueryParams).length === 0\n ? undefined\n : {\n ...(Object.keys(specFetchHeaders).length > 0 ? { headers: specFetchHeaders } : {}),\n ...(Object.keys(specFetchQueryParams).length > 0\n ? { queryParams: specFetchQueryParams }\n : {}),\n };\n\n return {\n namespace: sourceId,\n scope,\n name: sourceRow.name,\n config: {\n spec: sourceRow.spec,\n sourceUrl: sourceRow.source_url ?? undefined,\n baseUrl: sourceRow.base_url ?? undefined,\n headers,\n queryParams,\n specFetchCredentials,\n oauth2,\n },\n };\n });\n\n const rowToOperation = (row: Record<string, unknown>): StoredOperation => {\n const operationRow = decodeOperationStorageRow(row);\n return {\n toolId: operationRow.id,\n sourceId: operationRow.source_id,\n binding: decodeBinding(\n typeof operationRow.binding === \"string\"\n ? decodeBindingJson(operationRow.binding)\n : operationRow.binding,\n ),\n };\n };\n\n // Replace the rows of one child table for a source: delete then bulk\n // insert. Single helper so upsertSource and updateSourceMeta both\n // funnel through the same write path.\n const replaceChildRows = (\n model:\n | \"openapi_source_header\"\n | \"openapi_source_query_param\"\n | \"openapi_source_spec_fetch_header\"\n | \"openapi_source_spec_fetch_query_param\",\n sourceId: string,\n scope: string,\n values: Record<string, ConfiguredHeaderValue> | undefined,\n ) =>\n Effect.gen(function* () {\n yield* adapter.deleteMany({\n model,\n where: [\n { field: \"source_id\", value: sourceId },\n { field: \"scope_id\", value: scope },\n ],\n });\n const rows = valueMapToChildRows(sourceId, scope, values);\n if (rows.length === 0) return;\n yield* adapter.createMany({\n model,\n data: rows,\n forceAllowId: true,\n });\n });\n\n const deleteSource = (namespace: string, scope: string) =>\n Effect.gen(function* () {\n yield* adapter.deleteMany({\n model: \"openapi_operation\",\n where: [\n { field: \"source_id\", value: namespace },\n { field: \"scope_id\", value: scope },\n ],\n });\n // Drop every child table's rows for this source/scope.\n for (const model of [\n \"openapi_source_header\",\n \"openapi_source_query_param\",\n \"openapi_source_spec_fetch_header\",\n \"openapi_source_spec_fetch_query_param\",\n ] as const) {\n yield* adapter.deleteMany({\n model,\n where: [\n { field: \"source_id\", value: namespace },\n { field: \"scope_id\", value: scope },\n ],\n });\n }\n yield* adapter.delete({\n model: \"openapi_source\",\n where: [\n { field: \"id\", value: namespace },\n { field: \"scope_id\", value: scope },\n ],\n });\n });\n\n return {\n upsertSource: (input, operations) =>\n Effect.gen(function* () {\n yield* deleteSource(input.namespace, input.scope);\n yield* adapter.create({\n model: \"openapi_source\",\n data: {\n id: input.namespace,\n scope_id: input.scope,\n name: input.name,\n spec: input.config.spec,\n source_url: input.config.sourceUrl ?? undefined,\n base_url: input.config.baseUrl ?? undefined,\n oauth2: input.config.oauth2\n ? toJsonRecord(encodeOAuth2SourceConfig(input.config.oauth2))\n : undefined,\n },\n forceAllowId: true,\n });\n yield* replaceChildRows(\n \"openapi_source_header\",\n input.namespace,\n input.scope,\n input.config.headers,\n );\n yield* replaceChildRows(\n \"openapi_source_query_param\",\n input.namespace,\n input.scope,\n input.config.queryParams,\n );\n yield* replaceChildRows(\n \"openapi_source_spec_fetch_header\",\n input.namespace,\n input.scope,\n input.config.specFetchCredentials?.headers,\n );\n yield* replaceChildRows(\n \"openapi_source_spec_fetch_query_param\",\n input.namespace,\n input.scope,\n input.config.specFetchCredentials?.queryParams,\n );\n if (operations.length > 0) {\n yield* adapter.createMany({\n model: \"openapi_operation\",\n data: operations.map((op) => ({\n id: op.toolId,\n scope_id: input.scope,\n source_id: op.sourceId,\n binding: toJsonRecord(encodeBinding(op.binding)),\n })),\n forceAllowId: true,\n });\n }\n }),\n\n updateSourceMeta: (namespace, scope, patch) =>\n Effect.gen(function* () {\n const existingRow = yield* adapter.findOne({\n model: \"openapi_source\",\n where: [\n { field: \"id\", value: namespace },\n { field: \"scope_id\", value: scope },\n ],\n });\n if (!existingRow) return;\n const existing = yield* rowToSource(existingRow);\n\n const nextName = patch.name?.trim() || existing.name;\n const nextBaseUrl = patch.baseUrl !== undefined ? patch.baseUrl : existing.config.baseUrl;\n const nextOAuth2 = patch.oauth2 !== undefined ? patch.oauth2 : existing.config.oauth2;\n\n yield* adapter.update({\n model: \"openapi_source\",\n where: [\n { field: \"id\", value: namespace },\n { field: \"scope_id\", value: scope },\n ],\n update: {\n name: nextName,\n base_url: nextBaseUrl ?? undefined,\n oauth2: nextOAuth2 ? toJsonRecord(encodeOAuth2SourceConfig(nextOAuth2)) : undefined,\n },\n });\n if (patch.headers !== undefined) {\n yield* replaceChildRows(\"openapi_source_header\", namespace, scope, patch.headers);\n }\n if (patch.queryParams !== undefined) {\n yield* replaceChildRows(\n \"openapi_source_query_param\",\n namespace,\n scope,\n patch.queryParams,\n );\n }\n }),\n\n getSource: (namespace, scope) =>\n Effect.gen(function* () {\n const row = yield* adapter.findOne({\n model: \"openapi_source\",\n where: [\n { field: \"id\", value: namespace },\n { field: \"scope_id\", value: scope },\n ],\n });\n if (!row) return null;\n return yield* rowToSource(row);\n }),\n\n listSources: () =>\n Effect.gen(function* () {\n const rows = yield* adapter.findMany({ model: \"openapi_source\" });\n return yield* Effect.forEach(rows, rowToSource, {\n concurrency: \"unbounded\",\n });\n }),\n\n getOperationByToolId: (toolId, scope) =>\n adapter\n .findOne({\n model: \"openapi_operation\",\n where: [\n { field: \"id\", value: toolId },\n { field: \"scope_id\", value: scope },\n ],\n })\n .pipe(Effect.map((row) => (row ? rowToOperation(row) : null))),\n\n listOperationsBySource: (sourceId, scope) =>\n adapter\n .findMany({\n model: \"openapi_operation\",\n where: [\n { field: \"source_id\", value: sourceId },\n { field: \"scope_id\", value: scope },\n ],\n })\n .pipe(Effect.map((rows) => rows.map(rowToOperation))),\n\n removeSource: (namespace, scope) => deleteSource(namespace, scope),\n };\n};\n"],"mappings":"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","names":["Schema","Schema","Schema","Effect","Option","Option","Effect","Effect","Option","Schema","Schema","Option","Effect","Effect","Option","Schema","Schema","Option","Effect"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/AddOpenApiSource.tsx","../src/react/OpenApiSourceDetailsFields.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useAtomSet } from \"@effect/atom-react\";\nimport * as Exit from \"effect/Exit\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\n\nimport { ConnectionId, ScopeId, SecretId } from \"@executor-js/sdk/core\";\nimport { startOAuth } from \"@executor-js/react/api/atoms\";\nimport { useScope, useScopeStack } from \"@executor-js/react/api/scope-context\";\nimport { connectionWriteKeys, sourceWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\n\n// `addSpec` with an oauth2 payload persists a source row AND (for\n// clientCredentials) a freshly-minted Connection + owned secrets,\n// because the inline token exchange happens during `startOAuth`.\n// Invalidate both so the source-detail page opens into its connected\n// state without a refresh.\nconst addSpecWriteKeys = [...sourceWriteKeys, ...connectionWriteKeys] as const;\nconst bindingWriteKeys = [...sourceWriteKeys, ...connectionWriteKeys] as const;\nimport { HeadersList } from \"@executor-js/react/plugins/headers-list\";\nimport {\n HttpCredentialsEditor,\n emptyHttpCredentials,\n serializeHttpCredentials,\n type HttpCredentialsState,\n} from \"@executor-js/react/plugins/http-credentials\";\nimport {\n oauthCallbackUrl,\n useOAuthPopupFlow,\n type OAuthCompletionPayload,\n} from \"@executor-js/react/plugins/oauth-sign-in\";\nimport {\n CreatableSecretPicker,\n matchPresetKey,\n type HeaderState,\n} from \"@executor-js/react/plugins/secret-header-auth\";\nimport { CredentialScopeDropdown } from \"@executor-js/react/plugins/credential-target-scope\";\nimport { slugifyNamespace, useSourceIdentity } from \"@executor-js/react/plugins/source-identity\";\nimport { useSecretPickerSecrets } from \"@executor-js/react/plugins/use-secret-picker-secrets\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport { CopyButton } from \"@executor-js/react/components/copy-button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@executor-js/react/components/collapsible\";\nimport {\n CardStack,\n CardStackContent,\n CardStackEntryField,\n} from \"@executor-js/react/components/card-stack\";\nimport { FieldLabel } from \"@executor-js/react/components/field\";\nimport { FloatActions } from \"@executor-js/react/components/float-actions\";\nimport { HelpTooltip } from \"@executor-js/react/components/help-tooltip\";\nimport { Label } from \"@executor-js/react/components/label\";\nimport { Textarea } from \"@executor-js/react/components/textarea\";\nimport { Checkbox } from \"@executor-js/react/components/checkbox\";\nimport { RadioGroup, RadioGroupItem } from \"@executor-js/react/components/radio-group\";\nimport { IOSSpinner, Spinner } from \"@executor-js/react/components/spinner\";\nimport { addOpenApiSpecOptimistic, previewOpenApiSpec, setOpenApiSourceBinding } from \"./atoms\";\nimport { OpenApiSourceDetailsFields } from \"./OpenApiSourceDetailsFields\";\nimport type { SpecPreview, HeaderPreset, OAuth2Preset } from \"../sdk/preview\";\nimport {\n headerBindingSlot,\n oauth2ClientIdSlot,\n oauth2ClientSecretSlot,\n oauth2ConnectionSlot,\n queryParamBindingSlot,\n} from \"../sdk/store\";\nimport {\n ConfiguredHeaderBinding,\n OAuth2SourceConfig,\n OpenApiSourceBindingInput,\n type ServerInfo,\n} from \"../sdk/types\";\nimport { expandServerUrlOptions } from \"../sdk/openapi-utils\";\n\nexport const OPENAPI_OAUTH_POPUP_NAME = \"openapi-oauth\";\nexport const OPENAPI_OAUTH_CALLBACK_PATH = \"/api/oauth/callback\";\n\nconst ErrorMessage = Schema.Struct({ message: Schema.String });\nconst decodeErrorMessage = Schema.decodeUnknownOption(ErrorMessage);\n\nconst errorMessageFromExit = (exit: Exit.Exit<unknown, unknown>, fallback: string): string =>\n Option.match(Option.flatMap(Exit.findErrorOption(exit), decodeErrorMessage), {\n onNone: () => fallback,\n onSome: ({ message }) => message,\n });\n\nexport const openApiOAuthConnectionId = (\n namespaceSlug: string,\n flow: OAuth2Preset[\"flow\"],\n): string =>\n flow === \"clientCredentials\"\n ? `openapi-oauth2-app-${namespaceSlug || \"default\"}`\n : `openapi-oauth2-user-${namespaceSlug || \"default\"}`;\n\n/**\n * OpenAPI 3.x requires OAuth2 tokenUrl/authorizationUrl to be absolute,\n * but some specs ship relative paths like `/api/rest/v1/oauth/token`.\n * Resolve them against the source's chosen baseUrl so the backend can\n * fetch them directly and the absolute URL is what gets persisted on\n * OAuth2SourceConfig.\n */\nexport function resolveOAuthUrl(url: string, baseUrl: string): string {\n if (!url) return url;\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: URL constructor normalizes provider metadata URLs\n try {\n new URL(url);\n return url;\n } catch {\n if (!baseUrl) return url;\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: URL constructor resolves relative provider metadata URLs\n try {\n return new URL(url, baseUrl).toString();\n } catch {\n return url;\n }\n }\n}\n\nexport function inferOAuthIssuerUrl(authorizationUrl: string): string | null {\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: URL constructor normalizes provider metadata URLs\n try {\n return new URL(authorizationUrl).origin;\n } catch {\n return null;\n }\n}\n\ntype StrategySelection =\n | { readonly kind: \"none\" }\n | { readonly kind: \"custom\" }\n | { readonly kind: \"header\"; readonly presetIndex: number }\n | { readonly kind: \"oauth2\"; readonly presetIndex: number };\n\nconst serializeStrategy = (s: StrategySelection): string =>\n Match.value(s).pipe(\n Match.when({ kind: \"none\" }, () => \"none\"),\n Match.when({ kind: \"custom\" }, () => \"custom\"),\n Match.when({ kind: \"header\" }, (sel) => `header:${sel.presetIndex}`),\n Match.when({ kind: \"oauth2\" }, (sel) => `oauth2:${sel.presetIndex}`),\n Match.exhaustive,\n );\n\nconst parseStrategy = (value: string): StrategySelection => {\n if (value === \"none\") return { kind: \"none\" };\n if (value === \"custom\") return { kind: \"custom\" };\n if (value.startsWith(\"header:\")) {\n return {\n kind: \"header\",\n presetIndex: Number(value.slice(\"header:\".length)),\n };\n }\n if (value.startsWith(\"oauth2:\")) {\n return {\n kind: \"oauth2\",\n presetIndex: Number(value.slice(\"oauth2:\".length)),\n };\n }\n return { kind: \"none\" };\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction prefixForHeader(preset: HeaderPreset, headerName: string): string | undefined {\n const label = preset.label.toLowerCase();\n if (headerName.toLowerCase() === \"authorization\") {\n if (label.includes(\"bearer\")) return \"Bearer \";\n if (label.includes(\"basic\")) return \"Basic \";\n }\n return undefined;\n}\n\nfunction entriesFromSpecPreset(preset: HeaderPreset): HeaderState[] {\n return preset.secretHeaders.map((headerName) => {\n const prefix = prefixForHeader(preset, headerName);\n return {\n name: headerName,\n secretId: null,\n prefix,\n presetKey: matchPresetKey(headerName, prefix),\n fromPreset: true,\n };\n });\n}\n\nconst secretStorageDescription = (label: string): string =>\n label === \"Personal\"\n ? \"Only you can use this secret.\"\n : \"Everyone in the organization can use this secret.\";\n\n// ---------------------------------------------------------------------------\n// Main component — single progressive form\n// ---------------------------------------------------------------------------\n\nexport default function AddOpenApiSource(props: {\n onComplete: () => void;\n onCancel: () => void;\n initialUrl?: string;\n initialNamespace?: string;\n}) {\n // Spec input\n const [specUrl, setSpecUrl] = useState(props.initialUrl ?? \"\");\n const [analyzing, setAnalyzing] = useState(false);\n const [analyzeError, setAnalyzeError] = useState<string | null>(null);\n\n // After analysis\n const [preview, setPreview] = useState<SpecPreview | null>(null);\n const [baseUrl, setBaseUrl] = useState(\"\");\n const identity = useSourceIdentity({\n fallbackName: preview ? Option.getOrElse(preview.title, () => \"\") : \"\",\n fallbackNamespace: props.initialNamespace,\n });\n\n // Auth\n const [strategy, setStrategy] = useState<StrategySelection>({ kind: \"none\" });\n const [customHeaders, setCustomHeaders] = useState<HeaderState[]>([]);\n const [specFetchCredentials, setSpecFetchCredentials] = useState<HttpCredentialsState>(() =>\n emptyHttpCredentials(),\n );\n const [specFetchCredentialsOpen, setSpecFetchCredentialsOpen] = useState(false);\n const [runtimeCredentials, setRuntimeCredentials] = useState<HttpCredentialsState>(() =>\n emptyHttpCredentials(),\n );\n\n // OAuth2 state (only populated while an oauth2 preset is selected)\n const [oauth2ClientIdSecretId, setOauth2ClientIdSecretId] = useState<string | null>(null);\n const [oauth2ClientSecretSecretId, setOauth2ClientSecretSecretId] = useState<string | null>(null);\n const [oauth2ClientIdScope, setOauth2ClientIdScope] = useState<ScopeId | null>(null);\n const [oauth2ClientSecretScope, setOauth2ClientSecretScope] = useState<ScopeId | null>(null);\n const [oauth2SelectedScopes, setOauth2SelectedScopes] = useState<Set<string>>(new Set());\n const [oauth2AuthState, setOauth2AuthState] = useState<{\n readonly fingerprint: string;\n readonly auth: { readonly connectionId: string };\n } | null>(null);\n const [startingOAuth, setStartingOAuth] = useState(false);\n const [oauth2Error, setOauth2Error] = useState<string | null>(null);\n\n // Submit\n const [adding, setAdding] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n\n const scopeId = useScope();\n const scopeStack = useScopeStack();\n const credentialScopeOptions = useMemo(\n () =>\n scopeStack.map((entry, index) => ({\n scopeId: entry.id,\n label: index === 0 ? \"Personal\" : entry.name || \"Organization\",\n description: secretStorageDescription(\n index === 0 ? \"Personal\" : entry.name || \"Organization\",\n ),\n })),\n [scopeStack],\n );\n const defaultCredentialTargetScope =\n credentialScopeOptions[credentialScopeOptions.length - 1]?.scopeId ?? scopeId;\n const defaultOAuthTokenTargetScope = credentialScopeOptions[0]?.scopeId ?? scopeId;\n const [credentialTargetScope, setCredentialTargetScope] = useState<ScopeId>(\n defaultCredentialTargetScope,\n );\n const [oauthTokenTargetScope, setOAuthTokenTargetScope] = useState<ScopeId>(\n defaultOAuthTokenTargetScope,\n );\n const bindingScopeOptions = useMemo(\n () => credentialScopeOptions.map((option) => ({ ...option })),\n [credentialScopeOptions],\n );\n useEffect(() => {\n if (!credentialScopeOptions.some((option) => option.scopeId === credentialTargetScope)) {\n setCredentialTargetScope(defaultCredentialTargetScope);\n }\n }, [credentialScopeOptions, credentialTargetScope, defaultCredentialTargetScope]);\n useEffect(() => {\n if (!credentialScopeOptions.some((option) => option.scopeId === oauthTokenTargetScope)) {\n setOAuthTokenTargetScope(defaultOAuthTokenTargetScope);\n }\n }, [credentialScopeOptions, defaultOAuthTokenTargetScope, oauthTokenTargetScope]);\n const initialCredentialScopeOption =\n credentialScopeOptions.find((option) => option.scopeId === credentialTargetScope) ??\n credentialScopeOptions[0];\n const initialCredentialScopeOptions = initialCredentialScopeOption\n ? [initialCredentialScopeOption]\n : [];\n const doPreview = useAtomSet(previewOpenApiSpec, { mode: \"promiseExit\" });\n const doAdd = useAtomSet(addOpenApiSpecOptimistic(scopeId), {\n mode: \"promiseExit\",\n });\n const doStartOAuth = useAtomSet(startOAuth, { mode: \"promiseExit\" });\n const doSetBinding = useAtomSet(setOpenApiSourceBinding, {\n mode: \"promiseExit\",\n });\n const secretList = useSecretPickerSecrets();\n const initialCredentialSecrets = useMemo(\n () => secretList.filter((secret) => secret.scopeId === String(credentialTargetScope)),\n [credentialTargetScope, secretList],\n );\n const oauth = useOAuthPopupFlow<OAuthCompletionPayload>({\n popupName: OPENAPI_OAUTH_POPUP_NAME,\n popupBlockedMessage: \"OAuth popup was blocked by the browser\",\n popupClosedMessage: \"OAuth cancelled - popup was closed before completing the flow.\",\n startErrorMessage: \"Failed to start OAuth\",\n });\n\n // Keep the latest handleAnalyze in a ref so the debounced effect doesn't\n // need it as a dependency (it closes over fresh state).\n const handleAnalyzeRef = useRef<() => void>(() => {});\n\n // Auto-analyze whenever the spec input changes, with a short debounce so\n // typing/pasting doesn't fire a request on every keystroke.\n useEffect(() => {\n const trimmed = specUrl.trim();\n if (!trimmed) return;\n if (preview) return;\n const handle = setTimeout(() => {\n handleAnalyzeRef.current();\n }, 400);\n return () => clearTimeout(handle);\n }, [specUrl, preview]);\n\n // ---- Derived state ----\n\n const expandServerOptions = (server: ServerInfo) => {\n return expandServerUrlOptions(server).map((value) => ({\n value,\n label: value,\n }));\n };\n\n const servers: readonly ServerInfo[] = preview?.servers ?? [];\n const baseUrlOptions = Array.from(\n new Map(servers.flatMap(expandServerOptions).map((option) => [option.value, option])).values(),\n );\n\n const resolvedBaseUrl = baseUrl.trim();\n\n const configuredHeaders: Record<string, ConfiguredHeaderBinding> = {};\n const headerBindings: Array<{\n slot: string;\n secretId: string;\n scope: ScopeId;\n secretScope: ScopeId;\n }> = [];\n const configuredQueryParams: Record<string, string | ConfiguredHeaderBinding> = {};\n const queryParamBindings: Array<{\n slot: string;\n secretId: string;\n scope: ScopeId;\n secretScope: ScopeId;\n }> = [];\n for (const ch of customHeaders) {\n if (!ch.name.trim()) continue;\n const slot = headerBindingSlot(ch.name.trim());\n configuredHeaders[ch.name.trim()] = new ConfiguredHeaderBinding({\n kind: \"binding\",\n slot,\n prefix: ch.prefix,\n });\n if (ch.secretId) {\n headerBindings.push({\n slot,\n secretId: ch.secretId,\n scope: ch.targetScope ?? credentialTargetScope,\n secretScope: ch.secretScope ?? ch.targetScope ?? credentialTargetScope,\n });\n }\n }\n for (const param of runtimeCredentials.queryParams) {\n const name = param.name.trim();\n if (!name) continue;\n if (param.secretId) {\n const slot = queryParamBindingSlot(name);\n configuredQueryParams[name] = new ConfiguredHeaderBinding({\n kind: \"binding\",\n slot,\n prefix: param.prefix,\n });\n queryParamBindings.push({\n slot,\n secretId: param.secretId,\n scope: param.targetScope ?? credentialTargetScope,\n secretScope: param.secretScope ?? param.targetScope ?? credentialTargetScope,\n });\n continue;\n }\n if (param.literalValue?.trim()) {\n configuredQueryParams[name] = param.literalValue.trim();\n }\n }\n\n const oauth2Presets: readonly OAuth2Preset[] = preview?.oauth2Presets ?? [];\n const oauth2RedirectUrl = oauthCallbackUrl(OPENAPI_OAUTH_CALLBACK_PATH);\n // Stable source id derivation. Matches the value `handleAdd` sends as\n // `namespace`, and is also the default credential key when the user\n // does not provide a more explicit shared connection id.\n const resolvedSourceId =\n slugifyNamespace(identity.namespace) ||\n (preview ? Option.getOrElse(preview.title, () => \"openapi\") : \"openapi\");\n const selectedOAuth2Preset: OAuth2Preset | null =\n strategy.kind === \"oauth2\" ? (oauth2Presets[strategy.presetIndex] ?? null) : null;\n const selectedOAuth2Fingerprint = selectedOAuth2Preset\n ? [\n resolvedSourceId,\n resolvedBaseUrl,\n selectedOAuth2Preset.securitySchemeName,\n selectedOAuth2Preset.flow,\n selectedOAuth2Preset.tokenUrl,\n Option.getOrElse(selectedOAuth2Preset.authorizationUrl, () => \"\"),\n ].join(\"\\n\")\n : \"\";\n const oauth2Auth =\n oauth2AuthState?.fingerprint === selectedOAuth2Fingerprint ? oauth2AuthState.auth : null;\n\n const configuredOAuth2 =\n strategy.kind === \"oauth2\" && selectedOAuth2Preset\n ? new OAuth2SourceConfig({\n kind: \"oauth2\",\n securitySchemeName: selectedOAuth2Preset.securitySchemeName,\n flow: selectedOAuth2Preset.flow,\n tokenUrl: resolveOAuthUrl(selectedOAuth2Preset.tokenUrl, resolvedBaseUrl),\n authorizationUrl:\n selectedOAuth2Preset.flow === \"authorizationCode\"\n ? resolveOAuthUrl(\n Option.getOrElse(selectedOAuth2Preset.authorizationUrl, () => \"\"),\n resolvedBaseUrl,\n ) || null\n : null,\n clientIdSlot: oauth2ClientIdSlot(selectedOAuth2Preset.securitySchemeName),\n // Authorization-code specs can still be confidential clients\n // (Spotify is one example). Persist the slot even when the value is\n // deferred so the edit screen can collect the secret later.\n clientSecretSlot: oauth2ClientSecretSlot(selectedOAuth2Preset.securitySchemeName),\n connectionSlot: oauth2ConnectionSlot(selectedOAuth2Preset.securitySchemeName),\n scopes: [...oauth2SelectedScopes],\n })\n : null;\n const hasHeaders = Object.keys(configuredHeaders).length > 0;\n const oauth2Busy = startingOAuth || oauth.busy;\n const canConnectOAuth2 = Boolean(oauth2ClientIdSecretId) && resolvedBaseUrl.length > 0;\n const hasIncompleteHeaderCredentials =\n strategy.kind !== \"none\" &&\n strategy.kind !== \"oauth2\" &&\n customHeaders.some((header) => header.name.trim() && !header.secretId);\n const hasIncompleteQueryCredentials = runtimeCredentials.queryParams.some(\n (param) => param.name.trim() && !param.secretId && !param.literalValue?.trim(),\n );\n const willAddWithoutInitialCredentials =\n Boolean(selectedOAuth2Preset && !oauth2Auth) ||\n hasIncompleteHeaderCredentials ||\n hasIncompleteQueryCredentials;\n\n const canAdd = preview !== null && resolvedBaseUrl.length > 0;\n\n // ---- Handlers ----\n\n const handleAnalyze = async () => {\n setAnalyzing(true);\n setAnalyzeError(null);\n setAddError(null);\n const credentials = serializeHttpCredentials(specFetchCredentials);\n const exit = await doPreview({\n params: { scopeId },\n payload: {\n spec: specUrl,\n specFetchCredentials: credentials,\n },\n });\n if (Exit.isFailure(exit)) {\n setAnalyzeError(errorMessageFromExit(exit, \"Failed to parse spec\"));\n setAnalyzing(false);\n return;\n }\n const result = exit.value;\n setPreview(result);\n\n const firstServer = result.servers[0];\n setBaseUrl(firstServer ? (expandServerOptions(firstServer)[0]?.value ?? \"\") : \"\");\n\n const firstPreset = result.headerPresets[0];\n if (firstPreset) {\n setStrategy({ kind: \"header\", presetIndex: 0 });\n setCustomHeaders(entriesFromSpecPreset(firstPreset));\n } else if (result.oauth2Presets[0]) {\n setStrategy({ kind: \"oauth2\", presetIndex: 0 });\n setCustomHeaders([]);\n setOauth2SelectedScopes(new Set(Object.keys(result.oauth2Presets[0].scopes)));\n } else {\n // No header presets — default to \"custom\" so the headers editor is\n // visible immediately. Specs with no `security` block (e.g. Microsoft\n // Graph) would otherwise leave the user staring at just the\n // Authentication heading with no way to add headers.\n setStrategy({ kind: \"custom\" });\n setCustomHeaders([]);\n }\n setAnalyzing(false);\n };\n\n handleAnalyzeRef.current = handleAnalyze;\n\n const selectStrategy = (next: StrategySelection) => {\n setStrategy(next);\n // Clear any stale OAuth grant whenever the strategy changes away from oauth2.\n if (next.kind !== \"oauth2\") {\n setOauth2AuthState(null);\n setOauth2Error(null);\n }\n Match.value(next).pipe(\n Match.when({ kind: \"none\" }, () => {\n setCustomHeaders([]);\n }),\n Match.when({ kind: \"custom\" }, () => {\n const userHeaders = customHeaders.filter((h) => !h.fromPreset);\n setCustomHeaders(userHeaders.length > 0 ? userHeaders : []);\n }),\n Match.when({ kind: \"header\" }, (n) => {\n const preset = preview?.headerPresets[n.presetIndex];\n if (!preset) return;\n const userHeaders = customHeaders.filter((h) => !h.fromPreset);\n setCustomHeaders([...entriesFromSpecPreset(preset), ...userHeaders]);\n }),\n Match.when({ kind: \"oauth2\" }, (n) => {\n setCustomHeaders([]);\n const preset = preview?.oauth2Presets[n.presetIndex];\n if (preset) {\n setOauth2SelectedScopes(new Set(Object.keys(preset.scopes)));\n }\n }),\n Match.exhaustive,\n );\n };\n\n const handleHeadersChange = (next: HeaderState[]) => {\n setCustomHeaders(next);\n if (strategy.kind === \"header\" && next.every((h) => !h.fromPreset)) {\n setStrategy(next.length === 0 ? { kind: \"none\" } : { kind: \"custom\" });\n }\n };\n\n const setInitialCredentialScope = (targetScope: ScopeId) => {\n setCredentialTargetScope(targetScope);\n setCustomHeaders((headers) =>\n headers.map((header) => ({\n ...header,\n targetScope,\n ...(header.secretScope && header.secretScope !== targetScope\n ? { secretId: null, secretScope: undefined }\n : {}),\n })),\n );\n setOauth2ClientIdSecretId(null);\n setOauth2ClientSecretSecretId(null);\n setOauth2ClientIdScope(null);\n setOauth2ClientSecretScope(null);\n setOauth2AuthState(null);\n };\n\n const toggleOAuth2Scope = (scope: string) => {\n setOauth2SelectedScopes((prev) => {\n const copy = new Set(prev);\n if (copy.has(scope)) copy.delete(scope);\n else copy.add(scope);\n return copy;\n });\n // Changing scopes invalidates any previously-granted token.\n setOauth2AuthState(null);\n };\n\n const handleConnectOAuth2 = useCallback(async () => {\n if (!selectedOAuth2Preset || !oauth2ClientIdSecretId || !preview) return;\n oauth.cancel();\n setOauth2Error(null);\n const displayName = identity.name.trim() || selectedOAuth2Preset.securitySchemeName;\n\n const tokenUrl = resolveOAuthUrl(selectedOAuth2Preset.tokenUrl, resolvedBaseUrl);\n\n if (selectedOAuth2Preset.flow === \"clientCredentials\") {\n // RFC 6749 §4.4: no user-interactive consent step. The client_secret\n // is mandatory; the backend exchanges tokens inline and returns a\n // completed Connection we bind to the source's connection slot.\n if (!oauth2ClientSecretSecretId) {\n setOauth2Error(\"client_credentials requires a client secret\");\n return;\n }\n setStartingOAuth(true);\n const connectionId = openApiOAuthConnectionId(resolvedSourceId, selectedOAuth2Preset.flow);\n const exit = await doStartOAuth({\n params: { scopeId: oauthTokenTargetScope },\n payload: {\n endpoint: tokenUrl,\n redirectUrl: tokenUrl,\n connectionId,\n tokenScope: oauthTokenTargetScope,\n strategy: {\n kind: \"client-credentials\",\n tokenEndpoint: tokenUrl,\n clientIdSecretId: oauth2ClientIdSecretId,\n clientSecretSecretId: oauth2ClientSecretSecretId,\n scopes: [...oauth2SelectedScopes],\n },\n pluginId: \"openapi\",\n identityLabel: `${displayName} OAuth`,\n },\n });\n setStartingOAuth(false);\n if (Exit.isFailure(exit)) {\n setOauth2Error(errorMessageFromExit(exit, \"Failed to start OAuth\"));\n return;\n }\n const response = exit.value;\n if (!response.completedConnection) {\n setOauth2Error(\"client_credentials flow did not mint a connection\");\n return;\n }\n setOauth2AuthState({\n fingerprint: selectedOAuth2Fingerprint,\n auth: { connectionId: response.completedConnection.connectionId },\n });\n setOauth2Error(null);\n return;\n }\n\n const authorizationUrl = resolveOAuthUrl(\n Option.getOrElse(selectedOAuth2Preset.authorizationUrl, () => \"\"),\n resolvedBaseUrl,\n );\n const issuerUrl = inferOAuthIssuerUrl(authorizationUrl);\n\n await oauth.openAuthorization({\n tokenScope: oauthTokenTargetScope,\n run: async () => {\n const exit = await doStartOAuth({\n params: { scopeId: oauthTokenTargetScope },\n payload: {\n endpoint: authorizationUrl,\n connectionId: openApiOAuthConnectionId(resolvedSourceId, selectedOAuth2Preset.flow),\n tokenScope: oauthTokenTargetScope,\n redirectUrl: oauth2RedirectUrl,\n strategy: {\n kind: \"authorization-code\",\n authorizationEndpoint: authorizationUrl,\n tokenEndpoint: tokenUrl,\n issuerUrl,\n clientIdSecretId: oauth2ClientIdSecretId,\n clientSecretSecretId: oauth2ClientSecretSecretId ?? null,\n scopes: [...oauth2SelectedScopes],\n },\n pluginId: \"openapi\",\n identityLabel: `${displayName} OAuth`,\n },\n });\n if (Exit.isFailure(exit)) {\n // oxlint-disable-next-line executor/no-try-catch-or-throw, executor/no-error-constructor -- boundary: OAuth popup API represents start failure by rejecting run()\n throw new Error(errorMessageFromExit(exit, \"Failed to start OAuth\"));\n }\n const response = exit.value;\n if (response.authorizationUrl === null) {\n // oxlint-disable-next-line executor/no-try-catch-or-throw, executor/no-error-constructor -- boundary: OAuth popup API represents start failure by rejecting run()\n throw new Error(\"Unexpected response flow from server\");\n }\n return {\n sessionId: response.sessionId,\n authorizationUrl: response.authorizationUrl,\n };\n },\n onSuccess: (result) => {\n setOauth2AuthState({\n fingerprint: selectedOAuth2Fingerprint,\n auth: { connectionId: result.connectionId },\n });\n setOauth2Error(null);\n },\n onError: (message) => {\n setStartingOAuth(false);\n setOauth2Error(message);\n },\n });\n }, [\n selectedOAuth2Preset,\n oauth2ClientIdSecretId,\n oauth2ClientSecretSecretId,\n oauth2SelectedScopes,\n oauth2RedirectUrl,\n resolvedBaseUrl,\n preview,\n doStartOAuth,\n identity.name,\n resolvedSourceId,\n selectedOAuth2Fingerprint,\n oauth,\n oauthTokenTargetScope,\n ]);\n\n const handleCancelOAuth2 = useCallback(() => {\n oauth.cancel();\n setStartingOAuth(false);\n setOauth2Error(null);\n }, [oauth]);\n\n const handleAdd = async () => {\n setAdding(true);\n setAddError(null);\n const namespace = resolvedSourceId;\n const displayName =\n identity.name.trim() ||\n (preview ? Option.getOrElse(preview.title, () => namespace) : namespace);\n const exit = await doAdd({\n params: { scopeId },\n payload: {\n targetScope: scopeId,\n credentialTargetScope,\n spec: specUrl,\n specFetchCredentials: serializeHttpCredentials(specFetchCredentials),\n name: displayName,\n namespace,\n baseUrl: resolvedBaseUrl || undefined,\n ...(hasHeaders ? { headers: configuredHeaders } : {}),\n ...(Object.keys(configuredQueryParams).length > 0\n ? { queryParams: configuredQueryParams }\n : {}),\n ...(configuredOAuth2 ? { oauth2: configuredOAuth2 } : {}),\n },\n reactivityKeys: addSpecWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n setAddError(errorMessageFromExit(exit, \"Failed to add source\"));\n setAdding(false);\n return;\n }\n\n const sourceId = exit.value.namespace;\n const sourceScope = ScopeId.make(scopeId);\n const bindingScope = ScopeId.make(credentialTargetScope);\n const oauthTokenBindingScope = ScopeId.make(oauthTokenTargetScope);\n const clientIdSecretScope = oauth2ClientIdScope ?? bindingScope;\n const clientSecretSecretScope = oauth2ClientSecretScope ?? bindingScope;\n\n for (const binding of headerBindings) {\n const bindingExit = await doSetBinding({\n params: { scopeId },\n payload: new OpenApiSourceBindingInput({\n sourceId,\n sourceScope,\n scope: binding.scope,\n slot: binding.slot,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(binding.secretId),\n secretScopeId: binding.secretScope,\n },\n }),\n reactivityKeys: bindingWriteKeys,\n });\n if (Exit.isFailure(bindingExit)) {\n setAddError(errorMessageFromExit(bindingExit, \"Failed to add source\"));\n setAdding(false);\n return;\n }\n }\n\n for (const binding of queryParamBindings) {\n const bindingExit = await doSetBinding({\n params: { scopeId },\n payload: new OpenApiSourceBindingInput({\n sourceId,\n sourceScope,\n scope: binding.scope,\n slot: binding.slot,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(binding.secretId),\n secretScopeId: binding.secretScope,\n },\n }),\n reactivityKeys: bindingWriteKeys,\n });\n if (Exit.isFailure(bindingExit)) {\n setAddError(errorMessageFromExit(bindingExit, \"Failed to add source\"));\n setAdding(false);\n return;\n }\n }\n\n if (configuredOAuth2 && oauth2ClientIdSecretId) {\n const bindingExit = await doSetBinding({\n params: { scopeId },\n payload: new OpenApiSourceBindingInput({\n sourceId,\n sourceScope,\n scope: bindingScope,\n slot: configuredOAuth2.clientIdSlot,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(oauth2ClientIdSecretId),\n secretScopeId: clientIdSecretScope,\n },\n }),\n reactivityKeys: bindingWriteKeys,\n });\n if (Exit.isFailure(bindingExit)) {\n setAddError(errorMessageFromExit(bindingExit, \"Failed to add source\"));\n setAdding(false);\n return;\n }\n }\n\n if (configuredOAuth2?.clientSecretSlot && oauth2ClientSecretSecretId) {\n const bindingExit = await doSetBinding({\n params: { scopeId },\n payload: new OpenApiSourceBindingInput({\n sourceId,\n sourceScope,\n scope: bindingScope,\n slot: configuredOAuth2.clientSecretSlot,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(oauth2ClientSecretSecretId),\n secretScopeId: clientSecretSecretScope,\n },\n }),\n reactivityKeys: bindingWriteKeys,\n });\n if (Exit.isFailure(bindingExit)) {\n setAddError(errorMessageFromExit(bindingExit, \"Failed to add source\"));\n setAdding(false);\n return;\n }\n }\n\n if (configuredOAuth2 && oauth2Auth) {\n const bindingExit = await doSetBinding({\n params: { scopeId },\n payload: new OpenApiSourceBindingInput({\n sourceId,\n sourceScope,\n scope: oauthTokenBindingScope,\n slot: configuredOAuth2.connectionSlot,\n value: {\n kind: \"connection\",\n connectionId: ConnectionId.make(oauth2Auth.connectionId),\n },\n }),\n reactivityKeys: bindingWriteKeys,\n });\n if (Exit.isFailure(bindingExit)) {\n setAddError(errorMessageFromExit(bindingExit, \"Failed to add source\"));\n setAdding(false);\n return;\n }\n }\n\n props.onComplete();\n };\n\n // ---- Render ----\n\n return (\n <div className=\"flex flex-1 flex-col gap-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Add OpenAPI Source</h1>\n </div>\n\n {!preview && (\n <>\n {/* ── Spec input ── */}\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntryField\n label=\"OpenAPI Spec\"\n hint=\"Paste a URL or raw JSON/YAML content.\"\n >\n <div className=\"relative\">\n <Textarea\n value={specUrl}\n onChange={(e) => {\n setSpecUrl((e.target as HTMLTextAreaElement).value);\n }}\n placeholder=\"https://api.example.com/openapi.json\"\n rows={3}\n maxRows={10}\n className=\"font-mono text-sm\"\n />\n {analyzing && (\n <div className=\"pointer-events-none absolute right-2 top-2\">\n <IOSSpinner className=\"size-4\" />\n </div>\n )}\n </div>\n </CardStackEntryField>\n </CardStackContent>\n </CardStack>\n\n <Collapsible\n open={specFetchCredentialsOpen}\n onOpenChange={setSpecFetchCredentialsOpen}\n className=\"space-y-3\"\n >\n <CollapsibleTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"self-start\">\n {specFetchCredentialsOpen ? \"Hide spec credentials\" : \"Add spec credentials\"}\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <HttpCredentialsEditor\n credentials={specFetchCredentials}\n onChange={setSpecFetchCredentials}\n existingSecrets={secretList}\n sourceName={identity.name}\n targetScope={credentialTargetScope}\n labels={{\n headers: \"Spec fetch headers\",\n queryParams: \"Spec fetch query parameters\",\n }}\n />\n </CollapsibleContent>\n </Collapsible>\n </>\n )}\n\n {/* ── Source information card (shown after analysis) ── */}\n {preview ? (\n <OpenApiSourceDetailsFields\n title={Option.getOrElse(preview.title, () => \"API\")}\n description={`${Option.getOrElse(preview.version, () => \"\")}${\n Option.isSome(preview.version) ? \" · \" : \"\"\n }${preview.operationCount} operation${preview.operationCount !== 1 ? \"s\" : \"\"}${\n preview.tags.length > 0\n ? ` · ${preview.tags.length} tag${preview.tags.length !== 1 ? \"s\" : \"\"}`\n : \"\"\n }`}\n identity={identity}\n baseUrl={resolvedBaseUrl}\n onBaseUrlChange={setBaseUrl}\n baseUrlOptions={baseUrlOptions}\n specUrl={specUrl}\n onSpecUrlChange={(value) => {\n setSpecUrl(value);\n setPreview(null);\n setBaseUrl(\"\");\n setCustomHeaders([]);\n setStrategy({ kind: \"none\" });\n setOauth2AuthState(null);\n setOauth2Error(null);\n }}\n faviconUrl={resolvedBaseUrl}\n baseUrlMissingMessage=\"A base URL is required to make requests.\"\n />\n ) : null}\n\n {analyzeError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-[12px] text-destructive\">{analyzeError}</p>\n </div>\n )}\n\n {/* ── Everything below appears after analysis ── */}\n {preview && (\n <>\n <section className=\"space-y-2.5\">\n <FieldLabel>Authentication method</FieldLabel>\n {/* RadioGroup always renders so the static Custom + None radios\n stay visible for specs with no security schemes (e.g. MS Graph).\n The preset .map() blocks below render nothing when their arrays\n are empty. */}\n <RadioGroup\n value={serializeStrategy(strategy)}\n onValueChange={(value) => selectStrategy(parseStrategy(value))}\n className=\"gap-1.5\"\n >\n {preview.headerPresets.map((preset, i) => {\n const selected = strategy.kind === \"header\" && strategy.presetIndex === i;\n return (\n <Label\n key={`header-${i}`}\n className={`flex items-start gap-2.5 rounded-lg border px-3 py-2 cursor-pointer transition-colors ${\n selected\n ? \"border-primary/50 bg-primary/[0.03]\"\n : \"border-border hover:bg-accent/50\"\n }`}\n >\n <RadioGroupItem value={`header:${i}`} className=\"mt-0.5\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">{preset.label}</div>\n {preset.secretHeaders.length > 0 && (\n <div className=\"mt-0.5 font-mono text-[10px] text-muted-foreground\">\n {preset.secretHeaders.join(\" · \")}\n </div>\n )}\n </div>\n </Label>\n );\n })}\n {oauth2Presets.map((preset, i) => {\n const selected = strategy.kind === \"oauth2\" && strategy.presetIndex === i;\n const scopeCount = Object.keys(preset.scopes).length;\n return (\n <Label\n key={`oauth2-${i}`}\n className={`flex items-start gap-2.5 rounded-lg border px-3 py-2 cursor-pointer transition-colors ${\n selected\n ? \"border-primary/50 bg-primary/[0.03]\"\n : \"border-border hover:bg-accent/50\"\n }`}\n >\n <RadioGroupItem value={`oauth2:${i}`} className=\"mt-0.5\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-foreground\">{preset.label}</div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground\">\n {scopeCount} scope{scopeCount === 1 ? \"\" : \"s\"}\n </div>\n </div>\n </Label>\n );\n })}\n <Label\n className={`flex items-center gap-2.5 rounded-lg border px-3 py-2 cursor-pointer transition-colors ${\n strategy.kind === \"custom\"\n ? \"border-primary/50 bg-primary/[0.03]\"\n : \"border-border hover:bg-accent/50\"\n }`}\n >\n <RadioGroupItem value=\"custom\" />\n <span className=\"text-xs font-medium text-foreground\">Custom</span>\n </Label>\n <Label\n className={`flex items-center gap-2.5 rounded-lg border px-3 py-2 cursor-pointer transition-colors ${\n strategy.kind === \"none\"\n ? \"border-primary/50 bg-primary/[0.03]\"\n : \"border-border hover:bg-accent/50\"\n }`}\n >\n <RadioGroupItem value=\"none\" />\n <span className=\"text-xs font-medium text-foreground\">None</span>\n </Label>\n </RadioGroup>\n\n {/* Header-based auth input */}\n {strategy.kind !== \"none\" && strategy.kind !== \"oauth2\" && (\n <div className=\"space-y-3\">\n <HeadersList\n headers={customHeaders}\n onHeadersChange={handleHeadersChange}\n existingSecrets={secretList}\n sourceName={identity.name}\n targetScope={credentialTargetScope}\n credentialScopeOptions={initialCredentialScopeOptions}\n bindingScopeOptions={bindingScopeOptions}\n restrictSecretsToTargetScope\n emptyLabel=\"No credentials yet. Add the header value this method should use.\"\n />\n </div>\n )}\n\n <HttpCredentialsEditor\n credentials={runtimeCredentials}\n onChange={setRuntimeCredentials}\n existingSecrets={secretList}\n sourceName={identity.name}\n targetScope={credentialTargetScope}\n credentialScopeOptions={initialCredentialScopeOptions}\n bindingScopeOptions={bindingScopeOptions}\n restrictSecretsToTargetScope\n sections={{ headers: false, queryParams: true }}\n labels={{ queryParams: \"Runtime query parameters\" }}\n />\n\n {/* OAuth2 configuration */}\n {selectedOAuth2Preset && (\n <div className=\"space-y-3 rounded-lg border border-border/60 bg-muted/10 p-3\">\n <div className=\"space-y-3\">\n <div className=\"space-y-1.5\">\n <FieldLabel className=\"text-[11px]\">\n Redirect URL{\" \"}\n <span className=\"text-muted-foreground\">\n · add this to your OAuth app's allowed redirects\n </span>\n </FieldLabel>\n <div className=\"flex items-center gap-1 rounded-md border border-border bg-background/50 px-2.5 py-1.5 font-mono text-[11px]\">\n <span className=\"truncate flex-1 text-foreground\">{oauth2RedirectUrl}</span>\n <CopyButton value={oauth2RedirectUrl} />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <FieldLabel className=\"text-[11px]\">Client ID secret</FieldLabel>\n <div className=\"grid gap-2 md:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <FieldLabel className=\"text-[11px]\">Secret</FieldLabel>\n <HelpTooltip label=\"Client ID secret\">\n Select or create the OAuth client ID secret.\n </HelpTooltip>\n </div>\n <CreatableSecretPicker\n value={oauth2ClientIdSecretId}\n onSelect={(id: string, secretScopeId?: ScopeId) => {\n setOauth2ClientIdSecretId(id);\n setOauth2ClientIdScope(secretScopeId ?? credentialTargetScope);\n setOauth2AuthState(null);\n }}\n secrets={initialCredentialSecrets}\n sourceName={identity.name}\n secretLabel=\"Client ID\"\n targetScope={oauth2ClientIdScope ?? credentialTargetScope}\n credentialScopeOptions={initialCredentialScopeOptions}\n onCreatedScope={setOauth2ClientIdScope}\n />\n </div>\n <CredentialScopeDropdown\n value={credentialTargetScope}\n options={bindingScopeOptions}\n onChange={setInitialCredentialScope}\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <FieldLabel className=\"text-[11px]\">\n Client secret{\" \"}\n <span className=\"text-muted-foreground\">\n · optional for public clients with PKCE\n </span>\n </FieldLabel>\n <div className=\"grid gap-2 md:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <FieldLabel className=\"text-[11px]\">Secret</FieldLabel>\n <HelpTooltip label=\"Client secret\">\n Select or create the OAuth client secret.\n </HelpTooltip>\n </div>\n <CreatableSecretPicker\n value={oauth2ClientSecretSecretId}\n onSelect={(id: string, secretScopeId?: ScopeId) => {\n setOauth2ClientSecretSecretId(id);\n setOauth2ClientSecretScope(secretScopeId ?? credentialTargetScope);\n setOauth2AuthState(null);\n }}\n secrets={initialCredentialSecrets}\n sourceName={identity.name}\n secretLabel=\"Client Secret\"\n targetScope={oauth2ClientSecretScope ?? credentialTargetScope}\n credentialScopeOptions={initialCredentialScopeOptions}\n onCreatedScope={setOauth2ClientSecretScope}\n />\n </div>\n <CredentialScopeDropdown\n value={credentialTargetScope}\n options={bindingScopeOptions}\n onChange={setInitialCredentialScope}\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <FieldLabel className=\"text-[11px]\">Scopes</FieldLabel>\n <div className=\"space-y-1 rounded-md border border-border/50 bg-background/50 p-2\">\n {Object.keys(selectedOAuth2Preset.scopes).length === 0 ? (\n <div className=\"text-[11px] italic text-muted-foreground\">\n No scopes declared by the spec.\n </div>\n ) : (\n Object.entries(selectedOAuth2Preset.scopes).map(([scope, description]) => (\n <Label key={scope} className=\"flex items-start gap-2 cursor-pointer py-1\">\n <Checkbox\n checked={oauth2SelectedScopes.has(scope)}\n onCheckedChange={() => toggleOAuth2Scope(scope)}\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-mono text-[11px] text-foreground\">{scope}</div>\n {description && (\n <div className=\"text-[10px] text-muted-foreground\">\n {description}\n </div>\n )}\n </div>\n </Label>\n ))\n )}\n </div>\n </div>\n\n {oauth2Auth ? (\n <div className=\"flex items-center justify-between rounded-md border border-green-500/30 bg-green-500/5 px-3 py-2\">\n <div className=\"text-[11px] text-green-700 dark:text-green-400\">\n Connected · {oauth2SelectedScopes.size} scope\n {oauth2SelectedScopes.size === 1 ? \"\" : \"s\"} granted\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setOauth2AuthState(null)}>\n Disconnect\n </Button>\n </div>\n ) : oauth2Busy ? (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-1 items-center gap-2 rounded-md border border-border/60 bg-background/50 px-3 py-2 text-[11px] text-muted-foreground\">\n <Spinner className=\"size-3.5\" />\n Waiting for OAuth… complete the flow in the popup, or cancel to retry.\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleCancelOAuth2}>\n Cancel\n </Button>\n <Button variant=\"secondary\" size=\"sm\" onClick={handleConnectOAuth2}>\n Retry\n </Button>\n </div>\n ) : (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"grid gap-2 md:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <FieldLabel className=\"text-[11px]\">OAuth sign-in</FieldLabel>\n <HelpTooltip label=\"OAuth sign-in\">\n Start the provider OAuth flow.\n </HelpTooltip>\n </div>\n <Button\n variant=\"secondary\"\n onClick={handleConnectOAuth2}\n disabled={!canConnectOAuth2}\n className={\n canConnectOAuth2\n ? \"w-full border border-green-500/30 bg-green-600 text-white hover:bg-green-700 focus-visible:ring-green-500/30 dark:bg-green-500 dark:text-white dark:hover:bg-green-600\"\n : \"w-full\"\n }\n >\n Connect via OAuth\n </Button>\n </div>\n <CredentialScopeDropdown\n value={oauthTokenTargetScope}\n options={credentialScopeOptions}\n onChange={(targetScope) => {\n setOAuthTokenTargetScope(targetScope);\n setOauth2AuthState(null);\n }}\n label=\"Token saved to\"\n help=\"Choose who can use the signed-in OAuth token.\"\n />\n </div>\n </div>\n )}\n\n {oauth2Error && (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-[11px] text-destructive\">{oauth2Error}</p>\n </div>\n )}\n </div>\n </div>\n )}\n </section>\n\n {/* Add error */}\n {addError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2\">\n <p className=\"text-[12px] text-destructive\">{addError}</p>\n </div>\n )}\n </>\n )}\n\n <FloatActions>\n <Button variant=\"ghost\" onClick={props.onCancel} disabled={adding}>\n Cancel\n </Button>\n {preview && (\n <Button onClick={handleAdd} disabled={!canAdd || adding}>\n {adding && <Spinner className=\"size-3.5\" />}\n {adding\n ? \"Adding…\"\n : willAddWithoutInitialCredentials\n ? \"Add without credentials\"\n : \"Add source\"}\n </Button>\n )}\n </FloatActions>\n </div>\n );\n}\n","import {\n CardStack,\n CardStackContent,\n CardStackEntry,\n CardStackEntryContent,\n CardStackEntryDescription,\n CardStackEntryField,\n CardStackEntryTitle,\n} from \"@executor-js/react/components/card-stack\";\nimport {\n FreeformCombobox,\n type FreeformComboboxOption,\n} from \"@executor-js/react/components/combobox\";\nimport { Input } from \"@executor-js/react/components/input\";\nimport { SourceFavicon } from \"@executor-js/react/components/source-favicon\";\nimport {\n SourceIdentityFieldRows,\n type SourceIdentity,\n} from \"@executor-js/react/plugins/source-identity\";\n\nexport function OpenApiSourceDetailsFields(props: {\n readonly title: string;\n readonly description?: string;\n readonly identity: SourceIdentity;\n readonly baseUrl: string;\n readonly onBaseUrlChange: (value: string) => void;\n readonly baseUrlOptions?: readonly FreeformComboboxOption[];\n readonly specUrl?: string;\n readonly onSpecUrlChange?: (value: string) => void;\n readonly faviconUrl?: string;\n readonly namespaceReadOnly?: boolean;\n readonly specUrlDisabled?: boolean;\n readonly saveState?: \"idle\" | \"saving\" | \"saved\";\n readonly baseUrlMissingMessage?: string;\n readonly footer?: string;\n}) {\n const baseUrlOptions = props.baseUrlOptions ?? [];\n\n return (\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntry>\n {props.faviconUrl && <SourceFavicon url={props.faviconUrl} size={16} />}\n <CardStackEntryContent>\n <CardStackEntryTitle>{props.title}</CardStackEntryTitle>\n {props.description && (\n <CardStackEntryDescription>{props.description}</CardStackEntryDescription>\n )}\n </CardStackEntryContent>\n {props.saveState && props.saveState !== \"idle\" && (\n <span className=\"text-xs text-muted-foreground\">\n {props.saveState === \"saving\" ? \"Saving…\" : \"Saved\"}\n </span>\n )}\n </CardStackEntry>\n <SourceIdentityFieldRows\n identity={props.identity}\n namespaceReadOnly={props.namespaceReadOnly}\n />\n <div className=\"grid grid-cols-1 md:grid-cols-2\">\n <CardStackEntryField label=\"Base URL\">\n {baseUrlOptions.length > 0 ? (\n <FreeformCombobox\n value={props.baseUrl}\n onValueChange={props.onBaseUrlChange}\n options={baseUrlOptions}\n placeholder=\"https://api.example.com\"\n className=\"w-full\"\n inputClassName=\"font-mono text-sm\"\n />\n ) : (\n <Input\n value={props.baseUrl}\n onChange={(e) => props.onBaseUrlChange((e.target as HTMLInputElement).value)}\n placeholder=\"https://api.example.com\"\n className=\"font-mono text-sm\"\n />\n )}\n\n {props.baseUrlMissingMessage && !props.baseUrl && (\n <p className=\"text-[11px] text-amber-600 dark:text-amber-400\">\n {props.baseUrlMissingMessage}\n </p>\n )}\n </CardStackEntryField>\n {props.specUrl !== undefined && props.onSpecUrlChange && (\n <CardStackEntryField label=\"Spec URL\">\n <Input\n value={props.specUrl}\n onChange={(e) => props.onSpecUrlChange?.((e.target as HTMLInputElement).value)}\n placeholder=\"https://api.example.com/openapi.json\"\n className=\"font-mono text-sm\"\n disabled={props.specUrlDisabled}\n />\n </CardStackEntryField>\n )}\n </div>\n {props.footer && (\n <CardStackEntry>\n <CardStackEntryContent>\n <CardStackEntryTitle>{props.footer}</CardStackEntryTitle>\n </CardStackEntryContent>\n </CardStackEntry>\n )}\n </CardStackContent>\n </CardStack>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa,WAAW,SAAS,QAAQ,gBAAgB;AAClE,SAAS,kBAAkB;AAC3B,YAAY,UAAU;AACtB,YAAY,WAAW;AACvB,YAAY,YAAY;AACxB,YAAY,YAAY;AAExB,SAAS,cAAc,SAAS,gBAAgB;AAChD,SAAS,kBAAkB;AAC3B,SAAS,UAAU,qBAAqB;AACxC,SAAS,qBAAqB,uBAAuB;AASrD,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,+BAA+B;AACxC,SAAS,kBAAkB,yBAAyB;AACpD,SAAS,8BAA8B;AACvC,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE,aAAAA;AAAA,EACA,oBAAAC;AAAA,EACA,uBAAAC;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,YAAY,sBAAsB;AAC3C,SAAS,YAAY,eAAe;;;AC1DpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,OAEK;AACP,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,OAEK;AAwBwB,cACrB,YADqB;AAtBxB,SAAS,2BAA2B,OAexC;AACD,QAAM,iBAAiB,MAAM,kBAAkB,CAAC;AAEhD,SACE,oBAAC,aACC,+BAAC,oBAAiB,WAAU,cAC1B;AAAA,yBAAC,kBACE;AAAA,YAAM,cAAc,oBAAC,iBAAc,KAAK,MAAM,YAAY,MAAM,IAAI;AAAA,MACrE,qBAAC,yBACC;AAAA,4BAAC,uBAAqB,gBAAM,OAAM;AAAA,QACjC,MAAM,eACL,oBAAC,6BAA2B,gBAAM,aAAY;AAAA,SAElD;AAAA,MACC,MAAM,aAAa,MAAM,cAAc,UACtC,oBAAC,UAAK,WAAU,iCACb,gBAAM,cAAc,WAAW,iBAAY,SAC9C;AAAA,OAEJ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,MAAM;AAAA,QAChB,mBAAmB,MAAM;AAAA;AAAA,IAC3B;AAAA,IACA,qBAAC,SAAI,WAAU,mCACb;AAAA,2BAAC,uBAAoB,OAAM,YACxB;AAAA,uBAAe,SAAS,IACvB;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,eAAe,MAAM;AAAA,YACrB,SAAS;AAAA,YACT,aAAY;AAAA,YACZ,WAAU;AAAA,YACV,gBAAe;AAAA;AAAA,QACjB,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM;AAAA,YACb,UAAU,CAAC,MAAM,MAAM,gBAAiB,EAAE,OAA4B,KAAK;AAAA,YAC3E,aAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACZ;AAAA,QAGD,MAAM,yBAAyB,CAAC,MAAM,WACrC,oBAAC,OAAE,WAAU,kDACV,gBAAM,uBACT;AAAA,SAEJ;AAAA,MACC,MAAM,YAAY,UAAa,MAAM,mBACpC,oBAAC,uBAAoB,OAAM,YACzB;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,CAAC,MAAM,MAAM,kBAAmB,EAAE,OAA4B,KAAK;AAAA,UAC7E,aAAY;AAAA,UACZ,WAAU;AAAA,UACV,UAAU,MAAM;AAAA;AAAA,MAClB,GACF;AAAA,OAEJ;AAAA,IACC,MAAM,UACL,oBAAC,kBACC,8BAAC,yBACC,8BAAC,uBAAqB,gBAAM,QAAO,GACrC,GACF;AAAA,KAEJ,GACF;AAEJ;;;ADkvBQ,SAIA,UAJA,OAAAC,MAYQ,QAAAC,aAZR;AA50BR,IAAM,mBAAmB,CAAC,GAAG,iBAAiB,GAAG,mBAAmB;AACpE,IAAM,mBAAmB,CAAC,GAAG,iBAAiB,GAAG,mBAAmB;AA2D7D,IAAM,2BAA2B;AACjC,IAAM,8BAA8B;AAE3C,IAAM,eAAsB,cAAO,EAAE,SAAgB,cAAO,CAAC;AAC7D,IAAM,qBAA4B,2BAAoB,YAAY;AAElE,IAAM,uBAAuB,CAAC,MAAmC,aACxD,aAAa,eAAa,qBAAgB,IAAI,GAAG,kBAAkB,GAAG;AAAA,EAC3E,QAAQ,MAAM;AAAA,EACd,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAC3B,CAAC;AAEI,IAAM,2BAA2B,CACtC,eACA,SAEA,SAAS,sBACL,sBAAsB,iBAAiB,SAAS,KAChD,uBAAuB,iBAAiB,SAAS;AAShD,SAAS,gBAAgB,KAAa,SAAyB;AACpE,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI;AACF,QAAI,IAAI,GAAG;AACX,WAAO;AAAA,EACT,QAAQ;AACN,QAAI,CAAC,QAAS,QAAO;AAErB,QAAI;AACF,aAAO,IAAI,IAAI,KAAK,OAAO,EAAE,SAAS;AAAA,IACxC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,kBAAyC;AAE3E,MAAI;AACF,WAAO,IAAI,IAAI,gBAAgB,EAAE;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,IAAM,oBAAoB,CAAC,MACnB,YAAM,CAAC,EAAE;AAAA,EACP,WAAK,EAAE,MAAM,OAAO,GAAG,MAAM,MAAM;AAAA,EACnC,WAAK,EAAE,MAAM,SAAS,GAAG,MAAM,QAAQ;AAAA,EACvC,WAAK,EAAE,MAAM,SAAS,GAAG,CAAC,QAAQ,UAAU,IAAI,WAAW,EAAE;AAAA,EAC7D,WAAK,EAAE,MAAM,SAAS,GAAG,CAAC,QAAQ,UAAU,IAAI,WAAW,EAAE;AAAA,EAC7D;AACR;AAEF,IAAM,gBAAgB,CAACC,WAAqC;AAC1D,MAAIA,WAAU,OAAQ,QAAO,EAAE,MAAM,OAAO;AAC5C,MAAIA,WAAU,SAAU,QAAO,EAAE,MAAM,SAAS;AAChD,MAAIA,OAAM,WAAW,SAAS,GAAG;AAC/B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,OAAOA,OAAM,MAAM,UAAU,MAAM,CAAC;AAAA,IACnD;AAAA,EACF;AACA,MAAIA,OAAM,WAAW,SAAS,GAAG;AAC/B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa,OAAOA,OAAM,MAAM,UAAU,MAAM,CAAC;AAAA,IACnD;AAAA,EACF;AACA,SAAO,EAAE,MAAM,OAAO;AACxB;AAMA,SAAS,gBAAgB,QAAsB,YAAwC;AACrF,QAAM,QAAQ,OAAO,MAAM,YAAY;AACvC,MAAI,WAAW,YAAY,MAAM,iBAAiB;AAChD,QAAI,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrC,QAAI,MAAM,SAAS,OAAO,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAqC;AAClE,SAAO,OAAO,cAAc,IAAI,CAAC,eAAe;AAC9C,UAAM,SAAS,gBAAgB,QAAQ,UAAU;AACjD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,WAAW,eAAe,YAAY,MAAM;AAAA,MAC5C,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEA,IAAM,2BAA2B,CAAC,UAChC,UAAU,aACN,kCACA;AAMS,SAAR,iBAAkC,OAKtC;AAED,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,MAAM,cAAc,EAAE;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,IAAI;AAGpE,QAAM,CAAC,SAAS,UAAU,IAAI,SAA6B,IAAI;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,EAAE;AACzC,QAAM,WAAW,kBAAkB;AAAA,IACjC,cAAc,UAAiB,iBAAU,QAAQ,OAAO,MAAM,EAAE,IAAI;AAAA,IACpE,mBAAmB,MAAM;AAAA,EAC3B,CAAC;AAGD,QAAM,CAAC,UAAU,WAAW,IAAI,SAA4B,EAAE,MAAM,OAAO,CAAC;AAC5E,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,CAAC,CAAC;AACpE,QAAM,CAAC,sBAAsB,uBAAuB,IAAI;AAAA,IAA+B,MACrF,qBAAqB;AAAA,EACvB;AACA,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAAS,KAAK;AAC9E,QAAM,CAAC,oBAAoB,qBAAqB,IAAI;AAAA,IAA+B,MACjF,qBAAqB;AAAA,EACvB;AAGA,QAAM,CAAC,wBAAwB,yBAAyB,IAAI,SAAwB,IAAI;AACxF,QAAM,CAAC,4BAA4B,6BAA6B,IAAI,SAAwB,IAAI;AAChG,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAyB,IAAI;AACnF,QAAM,CAAC,yBAAyB,0BAA0B,IAAI,SAAyB,IAAI;AAC3F,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAsB,oBAAI,IAAI,CAAC;AACvF,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAGpC,IAAI;AACd,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAGlE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwB,IAAI;AAE5D,QAAM,UAAU,SAAS;AACzB,QAAM,aAAa,cAAc;AACjC,QAAM,yBAAyB;AAAA,IAC7B,MACE,WAAW,IAAI,CAAC,OAAO,WAAW;AAAA,MAChC,SAAS,MAAM;AAAA,MACf,OAAO,UAAU,IAAI,aAAa,MAAM,QAAQ;AAAA,MAChD,aAAa;AAAA,QACX,UAAU,IAAI,aAAa,MAAM,QAAQ;AAAA,MAC3C;AAAA,IACF,EAAE;AAAA,IACJ,CAAC,UAAU;AAAA,EACb;AACA,QAAM,+BACJ,uBAAuB,uBAAuB,SAAS,CAAC,GAAG,WAAW;AACxE,QAAM,+BAA+B,uBAAuB,CAAC,GAAG,WAAW;AAC3E,QAAM,CAAC,uBAAuB,wBAAwB,IAAI;AAAA,IACxD;AAAA,EACF;AACA,QAAM,CAAC,uBAAuB,wBAAwB,IAAI;AAAA,IACxD;AAAA,EACF;AACA,QAAM,sBAAsB;AAAA,IAC1B,MAAM,uBAAuB,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,EAAE;AAAA,IAC5D,CAAC,sBAAsB;AAAA,EACzB;AACA,YAAU,MAAM;AACd,QAAI,CAAC,uBAAuB,KAAK,CAAC,WAAW,OAAO,YAAY,qBAAqB,GAAG;AACtF,+BAAyB,4BAA4B;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,wBAAwB,uBAAuB,4BAA4B,CAAC;AAChF,YAAU,MAAM;AACd,QAAI,CAAC,uBAAuB,KAAK,CAAC,WAAW,OAAO,YAAY,qBAAqB,GAAG;AACtF,+BAAyB,4BAA4B;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,wBAAwB,8BAA8B,qBAAqB,CAAC;AAChF,QAAM,+BACJ,uBAAuB,KAAK,CAAC,WAAW,OAAO,YAAY,qBAAqB,KAChF,uBAAuB,CAAC;AAC1B,QAAM,gCAAgC,+BAClC,CAAC,4BAA4B,IAC7B,CAAC;AACL,QAAM,YAAY,WAAW,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,QAAM,QAAQ,WAAW,yBAAyB,OAAO,GAAG;AAAA,IAC1D,MAAM;AAAA,EACR,CAAC;AACD,QAAM,eAAe,WAAW,YAAY,EAAE,MAAM,cAAc,CAAC;AACnE,QAAM,eAAe,WAAW,yBAAyB;AAAA,IACvD,MAAM;AAAA,EACR,CAAC;AACD,QAAM,aAAa,uBAAuB;AAC1C,QAAM,2BAA2B;AAAA,IAC/B,MAAM,WAAW,OAAO,CAAC,WAAW,OAAO,YAAY,OAAO,qBAAqB,CAAC;AAAA,IACpF,CAAC,uBAAuB,UAAU;AAAA,EACpC;AACA,QAAM,QAAQ,kBAA0C;AAAA,IACtD,WAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,EACrB,CAAC;AAID,QAAM,mBAAmB,OAAmB,MAAM;AAAA,EAAC,CAAC;AAIpD,YAAU,MAAM;AACd,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,CAAC,QAAS;AACd,QAAI,QAAS;AACb,UAAM,SAAS,WAAW,MAAM;AAC9B,uBAAiB,QAAQ;AAAA,IAC3B,GAAG,GAAG;AACN,WAAO,MAAM,aAAa,MAAM;AAAA,EAClC,GAAG,CAAC,SAAS,OAAO,CAAC;AAIrB,QAAM,sBAAsB,CAAC,WAAuB;AAClD,WAAO,uBAAuB,MAAM,EAAE,IAAI,CAACA,YAAW;AAAA,MACpD,OAAAA;AAAA,MACA,OAAOA;AAAA,IACT,EAAE;AAAA,EACJ;AAEA,QAAM,UAAiC,SAAS,WAAW,CAAC;AAC5D,QAAM,iBAAiB,MAAM;AAAA,IAC3B,IAAI,IAAI,QAAQ,QAAQ,mBAAmB,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC,EAAE,OAAO;AAAA,EAC/F;AAEA,QAAM,kBAAkB,QAAQ,KAAK;AAErC,QAAM,oBAA6D,CAAC;AACpE,QAAM,iBAKD,CAAC;AACN,QAAM,wBAA0E,CAAC;AACjF,QAAM,qBAKD,CAAC;AACN,aAAW,MAAM,eAAe;AAC9B,QAAI,CAAC,GAAG,KAAK,KAAK,EAAG;AACrB,UAAM,OAAO,kBAAkB,GAAG,KAAK,KAAK,CAAC;AAC7C,sBAAkB,GAAG,KAAK,KAAK,CAAC,IAAI,IAAI,wBAAwB;AAAA,MAC9D,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,GAAG;AAAA,IACb,CAAC;AACD,QAAI,GAAG,UAAU;AACf,qBAAe,KAAK;AAAA,QAClB;AAAA,QACA,UAAU,GAAG;AAAA,QACb,OAAO,GAAG,eAAe;AAAA,QACzB,aAAa,GAAG,eAAe,GAAG,eAAe;AAAA,MACnD,CAAC;AAAA,IACH;AAAA,EACF;AACA,aAAW,SAAS,mBAAmB,aAAa;AAClD,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,QAAI,CAAC,KAAM;AACX,QAAI,MAAM,UAAU;AAClB,YAAM,OAAO,sBAAsB,IAAI;AACvC,4BAAsB,IAAI,IAAI,IAAI,wBAAwB;AAAA,QACxD,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,yBAAmB,KAAK;AAAA,QACtB;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM,eAAe;AAAA,QAC5B,aAAa,MAAM,eAAe,MAAM,eAAe;AAAA,MACzD,CAAC;AACD;AAAA,IACF;AACA,QAAI,MAAM,cAAc,KAAK,GAAG;AAC9B,4BAAsB,IAAI,IAAI,MAAM,aAAa,KAAK;AAAA,IACxD;AAAA,EACF;AAEA,QAAM,gBAAyC,SAAS,iBAAiB,CAAC;AAC1E,QAAM,oBAAoB,iBAAiB,2BAA2B;AAItE,QAAM,mBACJ,iBAAiB,SAAS,SAAS,MAClC,UAAiB,iBAAU,QAAQ,OAAO,MAAM,SAAS,IAAI;AAChE,QAAM,uBACJ,SAAS,SAAS,WAAY,cAAc,SAAS,WAAW,KAAK,OAAQ;AAC/E,QAAM,4BAA4B,uBAC9B;AAAA,IACE;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACd,iBAAU,qBAAqB,kBAAkB,MAAM,EAAE;AAAA,EAClE,EAAE,KAAK,IAAI,IACX;AACJ,QAAM,aACJ,iBAAiB,gBAAgB,4BAA4B,gBAAgB,OAAO;AAEtF,QAAM,mBACJ,SAAS,SAAS,YAAY,uBAC1B,IAAI,mBAAmB;AAAA,IACrB,MAAM;AAAA,IACN,oBAAoB,qBAAqB;AAAA,IACzC,MAAM,qBAAqB;AAAA,IAC3B,UAAU,gBAAgB,qBAAqB,UAAU,eAAe;AAAA,IACxE,kBACE,qBAAqB,SAAS,sBAC1B;AAAA,MACS,iBAAU,qBAAqB,kBAAkB,MAAM,EAAE;AAAA,MAChE;AAAA,IACF,KAAK,OACL;AAAA,IACN,cAAc,mBAAmB,qBAAqB,kBAAkB;AAAA;AAAA;AAAA;AAAA,IAIxE,kBAAkB,uBAAuB,qBAAqB,kBAAkB;AAAA,IAChF,gBAAgB,qBAAqB,qBAAqB,kBAAkB;AAAA,IAC5E,QAAQ,CAAC,GAAG,oBAAoB;AAAA,EAClC,CAAC,IACD;AACN,QAAM,aAAa,OAAO,KAAK,iBAAiB,EAAE,SAAS;AAC3D,QAAM,aAAa,iBAAiB,MAAM;AAC1C,QAAM,mBAAmB,QAAQ,sBAAsB,KAAK,gBAAgB,SAAS;AACrF,QAAM,iCACJ,SAAS,SAAS,UAClB,SAAS,SAAS,YAClB,cAAc,KAAK,CAAC,WAAW,OAAO,KAAK,KAAK,KAAK,CAAC,OAAO,QAAQ;AACvE,QAAM,gCAAgC,mBAAmB,YAAY;AAAA,IACnE,CAAC,UAAU,MAAM,KAAK,KAAK,KAAK,CAAC,MAAM,YAAY,CAAC,MAAM,cAAc,KAAK;AAAA,EAC/E;AACA,QAAM,mCACJ,QAAQ,wBAAwB,CAAC,UAAU,KAC3C,kCACA;AAEF,QAAM,SAAS,YAAY,QAAQ,gBAAgB,SAAS;AAI5D,QAAM,gBAAgB,YAAY;AAChC,iBAAa,IAAI;AACjB,oBAAgB,IAAI;AACpB,gBAAY,IAAI;AAChB,UAAM,cAAc,yBAAyB,oBAAoB;AACjE,UAAM,OAAO,MAAM,UAAU;AAAA,MAC3B,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,sBAAsB;AAAA,MACxB;AAAA,IACF,CAAC;AACD,QAAS,eAAU,IAAI,GAAG;AACxB,sBAAgB,qBAAqB,MAAM,sBAAsB,CAAC;AAClE,mBAAa,KAAK;AAClB;AAAA,IACF;AACA,UAAM,SAAS,KAAK;AACpB,eAAW,MAAM;AAEjB,UAAM,cAAc,OAAO,QAAQ,CAAC;AACpC,eAAW,cAAe,oBAAoB,WAAW,EAAE,CAAC,GAAG,SAAS,KAAM,EAAE;AAEhF,UAAM,cAAc,OAAO,cAAc,CAAC;AAC1C,QAAI,aAAa;AACf,kBAAY,EAAE,MAAM,UAAU,aAAa,EAAE,CAAC;AAC9C,uBAAiB,sBAAsB,WAAW,CAAC;AAAA,IACrD,WAAW,OAAO,cAAc,CAAC,GAAG;AAClC,kBAAY,EAAE,MAAM,UAAU,aAAa,EAAE,CAAC;AAC9C,uBAAiB,CAAC,CAAC;AACnB,8BAAwB,IAAI,IAAI,OAAO,KAAK,OAAO,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;AAAA,IAC9E,OAAO;AAKL,kBAAY,EAAE,MAAM,SAAS,CAAC;AAC9B,uBAAiB,CAAC,CAAC;AAAA,IACrB;AACA,iBAAa,KAAK;AAAA,EACpB;AAEA,mBAAiB,UAAU;AAE3B,QAAM,iBAAiB,CAAC,SAA4B;AAClD,gBAAY,IAAI;AAEhB,QAAI,KAAK,SAAS,UAAU;AAC1B,yBAAmB,IAAI;AACvB,qBAAe,IAAI;AAAA,IACrB;AACA,IAAM,YAAM,IAAI,EAAE;AAAA,MACV,WAAK,EAAE,MAAM,OAAO,GAAG,MAAM;AACjC,yBAAiB,CAAC,CAAC;AAAA,MACrB,CAAC;AAAA,MACK,WAAK,EAAE,MAAM,SAAS,GAAG,MAAM;AACnC,cAAM,cAAc,cAAc,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAC7D,yBAAiB,YAAY,SAAS,IAAI,cAAc,CAAC,CAAC;AAAA,MAC5D,CAAC;AAAA,MACK,WAAK,EAAE,MAAM,SAAS,GAAG,CAAC,MAAM;AACpC,cAAM,SAAS,SAAS,cAAc,EAAE,WAAW;AACnD,YAAI,CAAC,OAAQ;AACb,cAAM,cAAc,cAAc,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAC7D,yBAAiB,CAAC,GAAG,sBAAsB,MAAM,GAAG,GAAG,WAAW,CAAC;AAAA,MACrE,CAAC;AAAA,MACK,WAAK,EAAE,MAAM,SAAS,GAAG,CAAC,MAAM;AACpC,yBAAiB,CAAC,CAAC;AACnB,cAAM,SAAS,SAAS,cAAc,EAAE,WAAW;AACnD,YAAI,QAAQ;AACV,kCAAwB,IAAI,IAAI,OAAO,KAAK,OAAO,MAAM,CAAC,CAAC;AAAA,QAC7D;AAAA,MACF,CAAC;AAAA,MACK;AAAA,IACR;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,SAAwB;AACnD,qBAAiB,IAAI;AACrB,QAAI,SAAS,SAAS,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG;AAClE,kBAAY,KAAK,WAAW,IAAI,EAAE,MAAM,OAAO,IAAI,EAAE,MAAM,SAAS,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,4BAA4B,CAAC,gBAAyB;AAC1D,6BAAyB,WAAW;AACpC;AAAA,MAAiB,CAAC,YAChB,QAAQ,IAAI,CAAC,YAAY;AAAA,QACvB,GAAG;AAAA,QACH;AAAA,QACA,GAAI,OAAO,eAAe,OAAO,gBAAgB,cAC7C,EAAE,UAAU,MAAM,aAAa,OAAU,IACzC,CAAC;AAAA,MACP,EAAE;AAAA,IACJ;AACA,8BAA0B,IAAI;AAC9B,kCAA8B,IAAI;AAClC,2BAAuB,IAAI;AAC3B,+BAA2B,IAAI;AAC/B,uBAAmB,IAAI;AAAA,EACzB;AAEA,QAAM,oBAAoB,CAAC,UAAkB;AAC3C,4BAAwB,CAAC,SAAS;AAChC,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,KAAK,EAAG,MAAK,OAAO,KAAK;AAAA,UACjC,MAAK,IAAI,KAAK;AACnB,aAAO;AAAA,IACT,CAAC;AAED,uBAAmB,IAAI;AAAA,EACzB;AAEA,QAAM,sBAAsB,YAAY,YAAY;AAClD,QAAI,CAAC,wBAAwB,CAAC,0BAA0B,CAAC,QAAS;AAClE,UAAM,OAAO;AACb,mBAAe,IAAI;AACnB,UAAM,cAAc,SAAS,KAAK,KAAK,KAAK,qBAAqB;AAEjE,UAAM,WAAW,gBAAgB,qBAAqB,UAAU,eAAe;AAE/E,QAAI,qBAAqB,SAAS,qBAAqB;AAIrD,UAAI,CAAC,4BAA4B;AAC/B,uBAAe,6CAA6C;AAC5D;AAAA,MACF;AACA,uBAAiB,IAAI;AACrB,YAAM,eAAe,yBAAyB,kBAAkB,qBAAqB,IAAI;AACzF,YAAM,OAAO,MAAM,aAAa;AAAA,QAC9B,QAAQ,EAAE,SAAS,sBAAsB;AAAA,QACzC,SAAS;AAAA,UACP,UAAU;AAAA,UACV,aAAa;AAAA,UACb;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,YACR,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB;AAAA,YAClB,sBAAsB;AAAA,YACtB,QAAQ,CAAC,GAAG,oBAAoB;AAAA,UAClC;AAAA,UACA,UAAU;AAAA,UACV,eAAe,GAAG,WAAW;AAAA,QAC/B;AAAA,MACF,CAAC;AACD,uBAAiB,KAAK;AACtB,UAAS,eAAU,IAAI,GAAG;AACxB,uBAAe,qBAAqB,MAAM,uBAAuB,CAAC;AAClE;AAAA,MACF;AACA,YAAM,WAAW,KAAK;AACtB,UAAI,CAAC,SAAS,qBAAqB;AACjC,uBAAe,mDAAmD;AAClE;AAAA,MACF;AACA,yBAAmB;AAAA,QACjB,aAAa;AAAA,QACb,MAAM,EAAE,cAAc,SAAS,oBAAoB,aAAa;AAAA,MAClE,CAAC;AACD,qBAAe,IAAI;AACnB;AAAA,IACF;AAEA,UAAM,mBAAmB;AAAA,MAChB,iBAAU,qBAAqB,kBAAkB,MAAM,EAAE;AAAA,MAChE;AAAA,IACF;AACA,UAAM,YAAY,oBAAoB,gBAAgB;AAEtD,UAAM,MAAM,kBAAkB;AAAA,MAC5B,YAAY;AAAA,MACZ,KAAK,YAAY;AACf,cAAM,OAAO,MAAM,aAAa;AAAA,UAC9B,QAAQ,EAAE,SAAS,sBAAsB;AAAA,UACzC,SAAS;AAAA,YACP,UAAU;AAAA,YACV,cAAc,yBAAyB,kBAAkB,qBAAqB,IAAI;AAAA,YAClF,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,UAAU;AAAA,cACR,MAAM;AAAA,cACN,uBAAuB;AAAA,cACvB,eAAe;AAAA,cACf;AAAA,cACA,kBAAkB;AAAA,cAClB,sBAAsB,8BAA8B;AAAA,cACpD,QAAQ,CAAC,GAAG,oBAAoB;AAAA,YAClC;AAAA,YACA,UAAU;AAAA,YACV,eAAe,GAAG,WAAW;AAAA,UAC/B;AAAA,QACF,CAAC;AACD,YAAS,eAAU,IAAI,GAAG;AAExB,gBAAM,IAAI,MAAM,qBAAqB,MAAM,uBAAuB,CAAC;AAAA,QACrE;AACA,cAAM,WAAW,KAAK;AACtB,YAAI,SAAS,qBAAqB,MAAM;AAEtC,gBAAM,IAAI,MAAM,sCAAsC;AAAA,QACxD;AACA,eAAO;AAAA,UACL,WAAW,SAAS;AAAA,UACpB,kBAAkB,SAAS;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,WAAW,CAAC,WAAW;AACrB,2BAAmB;AAAA,UACjB,aAAa;AAAA,UACb,MAAM,EAAE,cAAc,OAAO,aAAa;AAAA,QAC5C,CAAC;AACD,uBAAe,IAAI;AAAA,MACrB;AAAA,MACA,SAAS,CAAC,YAAY;AACpB,yBAAiB,KAAK;AACtB,uBAAe,OAAO;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,qBAAqB,YAAY,MAAM;AAC3C,UAAM,OAAO;AACb,qBAAiB,KAAK;AACtB,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,YAAY,YAAY;AAC5B,cAAU,IAAI;AACd,gBAAY,IAAI;AAChB,UAAM,YAAY;AAClB,UAAM,cACJ,SAAS,KAAK,KAAK,MAClB,UAAiB,iBAAU,QAAQ,OAAO,MAAM,SAAS,IAAI;AAChE,UAAM,OAAO,MAAM,MAAM;AAAA,MACvB,QAAQ,EAAE,QAAQ;AAAA,MAClB,SAAS;AAAA,QACP,aAAa;AAAA,QACb;AAAA,QACA,MAAM;AAAA,QACN,sBAAsB,yBAAyB,oBAAoB;AAAA,QACnE,MAAM;AAAA,QACN;AAAA,QACA,SAAS,mBAAmB;AAAA,QAC5B,GAAI,aAAa,EAAE,SAAS,kBAAkB,IAAI,CAAC;AAAA,QACnD,GAAI,OAAO,KAAK,qBAAqB,EAAE,SAAS,IAC5C,EAAE,aAAa,sBAAsB,IACrC,CAAC;AAAA,QACL,GAAI,mBAAmB,EAAE,QAAQ,iBAAiB,IAAI,CAAC;AAAA,MACzD;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAS,eAAU,IAAI,GAAG;AACxB,kBAAY,qBAAqB,MAAM,sBAAsB,CAAC;AAC9D,gBAAU,KAAK;AACf;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM;AAC5B,UAAM,cAAc,QAAQ,KAAK,OAAO;AACxC,UAAM,eAAe,QAAQ,KAAK,qBAAqB;AACvD,UAAM,yBAAyB,QAAQ,KAAK,qBAAqB;AACjE,UAAM,sBAAsB,uBAAuB;AACnD,UAAM,0BAA0B,2BAA2B;AAE3D,eAAW,WAAW,gBAAgB;AACpC,YAAM,cAAc,MAAM,aAAa;AAAA,QACrC,QAAQ,EAAE,QAAQ;AAAA,QAClB,SAAS,IAAI,0BAA0B;AAAA,UACrC;AAAA,UACA;AAAA,UACA,OAAO,QAAQ;AAAA,UACf,MAAM,QAAQ;AAAA,UACd,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU,SAAS,KAAK,QAAQ,QAAQ;AAAA,YACxC,eAAe,QAAQ;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,QACD,gBAAgB;AAAA,MAClB,CAAC;AACD,UAAS,eAAU,WAAW,GAAG;AAC/B,oBAAY,qBAAqB,aAAa,sBAAsB,CAAC;AACrE,kBAAU,KAAK;AACf;AAAA,MACF;AAAA,IACF;AAEA,eAAW,WAAW,oBAAoB;AACxC,YAAM,cAAc,MAAM,aAAa;AAAA,QACrC,QAAQ,EAAE,QAAQ;AAAA,QAClB,SAAS,IAAI,0BAA0B;AAAA,UACrC;AAAA,UACA;AAAA,UACA,OAAO,QAAQ;AAAA,UACf,MAAM,QAAQ;AAAA,UACd,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU,SAAS,KAAK,QAAQ,QAAQ;AAAA,YACxC,eAAe,QAAQ;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,QACD,gBAAgB;AAAA,MAClB,CAAC;AACD,UAAS,eAAU,WAAW,GAAG;AAC/B,oBAAY,qBAAqB,aAAa,sBAAsB,CAAC;AACrE,kBAAU,KAAK;AACf;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,wBAAwB;AAC9C,YAAM,cAAc,MAAM,aAAa;AAAA,QACrC,QAAQ,EAAE,QAAQ;AAAA,QAClB,SAAS,IAAI,0BAA0B;AAAA,UACrC;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,MAAM,iBAAiB;AAAA,UACvB,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU,SAAS,KAAK,sBAAsB;AAAA,YAC9C,eAAe;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,QACD,gBAAgB;AAAA,MAClB,CAAC;AACD,UAAS,eAAU,WAAW,GAAG;AAC/B,oBAAY,qBAAqB,aAAa,sBAAsB,CAAC;AACrE,kBAAU,KAAK;AACf;AAAA,MACF;AAAA,IACF;AAEA,QAAI,kBAAkB,oBAAoB,4BAA4B;AACpE,YAAM,cAAc,MAAM,aAAa;AAAA,QACrC,QAAQ,EAAE,QAAQ;AAAA,QAClB,SAAS,IAAI,0BAA0B;AAAA,UACrC;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,MAAM,iBAAiB;AAAA,UACvB,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU,SAAS,KAAK,0BAA0B;AAAA,YAClD,eAAe;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,QACD,gBAAgB;AAAA,MAClB,CAAC;AACD,UAAS,eAAU,WAAW,GAAG;AAC/B,oBAAY,qBAAqB,aAAa,sBAAsB,CAAC;AACrE,kBAAU,KAAK;AACf;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,YAAY;AAClC,YAAM,cAAc,MAAM,aAAa;AAAA,QACrC,QAAQ,EAAE,QAAQ;AAAA,QAClB,SAAS,IAAI,0BAA0B;AAAA,UACrC;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,MAAM,iBAAiB;AAAA,UACvB,OAAO;AAAA,YACL,MAAM;AAAA,YACN,cAAc,aAAa,KAAK,WAAW,YAAY;AAAA,UACzD;AAAA,QACF,CAAC;AAAA,QACD,gBAAgB;AAAA,MAClB,CAAC;AACD,UAAS,eAAU,WAAW,GAAG;AAC/B,oBAAY,qBAAqB,aAAa,sBAAsB,CAAC;AACrE,kBAAU,KAAK;AACf;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,EACnB;AAIA,SACE,gBAAAD,MAAC,SAAI,WAAU,8BACb;AAAA,oBAAAD,KAAC,SACC,0BAAAA,KAAC,QAAG,WAAU,yCAAwC,gCAAkB,GAC1E;AAAA,IAEC,CAAC,WACA,gBAAAC,MAAA,YAEE;AAAA,sBAAAD,KAACG,YAAA,EACC,0BAAAH,KAACI,mBAAA,EAAiB,WAAU,cAC1B,0BAAAJ;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,MAAK;AAAA,UAEL,0BAAAJ,MAAC,SAAI,WAAU,YACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM;AACf,6BAAY,EAAE,OAA+B,KAAK;AAAA,gBACpD;AAAA,gBACA,aAAY;AAAA,gBACZ,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,WAAU;AAAA;AAAA,YACZ;AAAA,YACC,aACC,gBAAAA,KAAC,SAAI,WAAU,8CACb,0BAAAA,KAAC,cAAW,WAAU,UAAS,GACjC;AAAA,aAEJ;AAAA;AAAA,MACF,GACF,GACF;AAAA,MAEA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,cAAc;AAAA,UACd,WAAU;AAAA,UAEV;AAAA,4BAAAD,KAAC,sBAAmB,SAAO,MACzB,0BAAAA,KAAC,UAAO,SAAQ,WAAU,MAAK,MAAK,WAAU,cAC3C,qCAA2B,0BAA0B,wBACxD,GACF;AAAA,YACA,gBAAAA,KAAC,sBACC,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAa;AAAA,gBACb,UAAU;AAAA,gBACV,iBAAiB;AAAA,gBACjB,YAAY,SAAS;AAAA,gBACrB,aAAa;AAAA,gBACb,QAAQ;AAAA,kBACN,SAAS;AAAA,kBACT,aAAa;AAAA,gBACf;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAID,UACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAc,iBAAU,QAAQ,OAAO,MAAM,KAAK;AAAA,QAClD,aAAa,GAAU,iBAAU,QAAQ,SAAS,MAAM,EAAE,CAAC,GAClD,cAAO,QAAQ,OAAO,IAAI,WAAQ,EAC3C,GAAG,QAAQ,cAAc,aAAa,QAAQ,mBAAmB,IAAI,MAAM,EAAE,GAC3E,QAAQ,KAAK,SAAS,IAClB,SAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,KAAK,WAAW,IAAI,MAAM,EAAE,KACpE,EACN;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA,iBAAiB,CAACE,WAAU;AAC1B,qBAAWA,MAAK;AAChB,qBAAW,IAAI;AACf,qBAAW,EAAE;AACb,2BAAiB,CAAC,CAAC;AACnB,sBAAY,EAAE,MAAM,OAAO,CAAC;AAC5B,6BAAmB,IAAI;AACvB,yBAAe,IAAI;AAAA,QACrB;AAAA,QACA,YAAY;AAAA,QACZ,uBAAsB;AAAA;AAAA,IACxB,IACE;AAAA,IAEH,gBACC,gBAAAF,KAAC,SAAI,WAAU,sEACb,0BAAAA,KAAC,OAAE,WAAU,gCAAgC,wBAAa,GAC5D;AAAA,IAID,WACC,gBAAAC,MAAA,YACE;AAAA,sBAAAA,MAAC,aAAQ,WAAU,eACjB;AAAA,wBAAAD,KAAC,cAAW,mCAAqB;AAAA,QAKjC,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,kBAAkB,QAAQ;AAAA,YACjC,eAAe,CAACC,WAAU,eAAe,cAAcA,MAAK,CAAC;AAAA,YAC7D,WAAU;AAAA,YAET;AAAA,sBAAQ,cAAc,IAAI,CAAC,QAAQ,MAAM;AACxC,sBAAM,WAAW,SAAS,SAAS,YAAY,SAAS,gBAAgB;AACxE,uBACE,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBAEC,WAAW,yFACT,WACI,wCACA,kCACN;AAAA,oBAEA;AAAA,sCAAAD,KAAC,kBAAe,OAAO,UAAU,CAAC,IAAI,WAAU,UAAS;AAAA,sBACzD,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,wCAAAD,KAAC,SAAI,WAAU,uCAAuC,iBAAO,OAAM;AAAA,wBAClE,OAAO,cAAc,SAAS,KAC7B,gBAAAA,KAAC,SAAI,WAAU,sDACZ,iBAAO,cAAc,KAAK,QAAK,GAClC;AAAA,yBAEJ;AAAA;AAAA;AAAA,kBAfK,UAAU,CAAC;AAAA,gBAgBlB;AAAA,cAEJ,CAAC;AAAA,cACA,cAAc,IAAI,CAAC,QAAQ,MAAM;AAChC,sBAAM,WAAW,SAAS,SAAS,YAAY,SAAS,gBAAgB;AACxE,sBAAM,aAAa,OAAO,KAAK,OAAO,MAAM,EAAE;AAC9C,uBACE,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBAEC,WAAW,yFACT,WACI,wCACA,kCACN;AAAA,oBAEA;AAAA,sCAAAD,KAAC,kBAAe,OAAO,UAAU,CAAC,IAAI,WAAU,UAAS;AAAA,sBACzD,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,wCAAAD,KAAC,SAAI,WAAU,uCAAuC,iBAAO,OAAM;AAAA,wBACnE,gBAAAC,MAAC,SAAI,WAAU,4CACZ;AAAA;AAAA,0BAAW;AAAA,0BAAO,eAAe,IAAI,KAAK;AAAA,2BAC7C;AAAA,yBACF;AAAA;AAAA;AAAA,kBAbK,UAAU,CAAC;AAAA,gBAclB;AAAA,cAEJ,CAAC;AAAA,cACD,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,0FACT,SAAS,SAAS,WACd,wCACA,kCACN;AAAA,kBAEA;AAAA,oCAAAD,KAAC,kBAAe,OAAM,UAAS;AAAA,oBAC/B,gBAAAA,KAAC,UAAK,WAAU,uCAAsC,oBAAM;AAAA;AAAA;AAAA,cAC9D;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,0FACT,SAAS,SAAS,SACd,wCACA,kCACN;AAAA,kBAEA;AAAA,oCAAAD,KAAC,kBAAe,OAAM,QAAO;AAAA,oBAC7B,gBAAAA,KAAC,UAAK,WAAU,uCAAsC,kBAAI;AAAA;AAAA;AAAA,cAC5D;AAAA;AAAA;AAAA,QACF;AAAA,QAGC,SAAS,SAAS,UAAU,SAAS,SAAS,YAC7C,gBAAAA,KAAC,SAAI,WAAU,aACb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,YAAY,SAAS;AAAA,YACrB,aAAa;AAAA,YACb,wBAAwB;AAAA,YACxB;AAAA,YACA,8BAA4B;AAAA,YAC5B,YAAW;AAAA;AAAA,QACb,GACF;AAAA,QAGF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,YACb,UAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,YAAY,SAAS;AAAA,YACrB,aAAa;AAAA,YACb,wBAAwB;AAAA,YACxB;AAAA,YACA,8BAA4B;AAAA,YAC5B,UAAU,EAAE,SAAS,OAAO,aAAa,KAAK;AAAA,YAC9C,QAAQ,EAAE,aAAa,2BAA2B;AAAA;AAAA,QACpD;AAAA,QAGC,wBACC,gBAAAA,KAAC,SAAI,WAAU,gEACb,0BAAAC,MAAC,SAAI,WAAU,aACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,eACb;AAAA,4BAAAA,MAAC,cAAW,WAAU,eAAc;AAAA;AAAA,cACrB;AAAA,cACb,gBAAAD,KAAC,UAAK,WAAU,yBAAwB,iEAExC;AAAA,eACF;AAAA,YACA,gBAAAC,MAAC,SAAI,WAAU,gHACb;AAAA,8BAAAD,KAAC,UAAK,WAAU,mCAAmC,6BAAkB;AAAA,cACrE,gBAAAA,KAAC,cAAW,OAAO,mBAAmB;AAAA,eACxC;AAAA,aACF;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,4BAAAD,KAAC,cAAW,WAAU,eAAc,8BAAgB;AAAA,YACpD,gBAAAC,MAAC,SAAI,WAAU,6BACb;AAAA,8BAAAA,MAAC,SAAI,WAAU,eACb;AAAA,gCAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,kCAAAD,KAAC,cAAW,WAAU,eAAc,oBAAM;AAAA,kBAC1C,gBAAAA,KAAC,eAAY,OAAM,oBAAmB,0DAEtC;AAAA,mBACF;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,IAAY,kBAA4B;AACjD,gDAA0B,EAAE;AAC5B,6CAAuB,iBAAiB,qBAAqB;AAC7D,yCAAmB,IAAI;AAAA,oBACzB;AAAA,oBACA,SAAS;AAAA,oBACT,YAAY,SAAS;AAAA,oBACrB,aAAY;AAAA,oBACZ,aAAa,uBAAuB;AAAA,oBACpC,wBAAwB;AAAA,oBACxB,gBAAgB;AAAA;AAAA,gBAClB;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,UAAU;AAAA;AAAA,cACZ;AAAA,eACF;AAAA,aACF;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,4BAAAA,MAAC,cAAW,WAAU,eAAc;AAAA;AAAA,cACpB;AAAA,cACd,gBAAAD,KAAC,UAAK,WAAU,yBAAwB,wDAExC;AAAA,eACF;AAAA,YACA,gBAAAC,MAAC,SAAI,WAAU,6BACb;AAAA,8BAAAA,MAAC,SAAI,WAAU,eACb;AAAA,gCAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,kCAAAD,KAAC,cAAW,WAAU,eAAc,oBAAM;AAAA,kBAC1C,gBAAAA,KAAC,eAAY,OAAM,iBAAgB,uDAEnC;AAAA,mBACF;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,IAAY,kBAA4B;AACjD,oDAA8B,EAAE;AAChC,iDAA2B,iBAAiB,qBAAqB;AACjE,yCAAmB,IAAI;AAAA,oBACzB;AAAA,oBACA,SAAS;AAAA,oBACT,YAAY,SAAS;AAAA,oBACrB,aAAY;AAAA,oBACZ,aAAa,2BAA2B;AAAA,oBACxC,wBAAwB;AAAA,oBACxB,gBAAgB;AAAA;AAAA,gBAClB;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,UAAU;AAAA;AAAA,cACZ;AAAA,eACF;AAAA,aACF;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,4BAAAD,KAAC,cAAW,WAAU,eAAc,oBAAM;AAAA,YAC1C,gBAAAA,KAAC,SAAI,WAAU,qEACZ,iBAAO,KAAK,qBAAqB,MAAM,EAAE,WAAW,IACnD,gBAAAA,KAAC,SAAI,WAAU,4CAA2C,6CAE1D,IAEA,OAAO,QAAQ,qBAAqB,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,WAAW,MAClE,gBAAAC,MAAC,SAAkB,WAAU,8CAC3B;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,qBAAqB,IAAI,KAAK;AAAA,kBACvC,iBAAiB,MAAM,kBAAkB,KAAK;AAAA;AAAA,cAChD;AAAA,cACA,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,gCAAAD,KAAC,SAAI,WAAU,yCAAyC,iBAAM;AAAA,gBAC7D,eACC,gBAAAA,KAAC,SAAI,WAAU,qCACZ,uBACH;AAAA,iBAEJ;AAAA,iBAZU,KAaZ,CACD,GAEL;AAAA,aACF;AAAA,UAEC,aACC,gBAAAC,MAAC,SAAI,WAAU,oGACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,kDAAiD;AAAA;AAAA,cACjD,qBAAqB;AAAA,cAAK;AAAA,cACtC,qBAAqB,SAAS,IAAI,KAAK;AAAA,cAAI;AAAA,eAC9C;AAAA,YACA,gBAAAD,KAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,MAAM,mBAAmB,IAAI,GAAG,wBAE3E;AAAA,aACF,IACE,aACF,gBAAAC,MAAC,SAAI,WAAU,2BACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,kIACb;AAAA,8BAAAD,KAAC,WAAQ,WAAU,YAAW;AAAA,cAAE;AAAA,eAElC;AAAA,YACA,gBAAAA,KAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,oBAAoB,oBAE/D;AAAA,YACA,gBAAAA,KAAC,UAAO,SAAQ,aAAY,MAAK,MAAK,SAAS,qBAAqB,mBAEpE;AAAA,aACF,IAEA,gBAAAA,KAAC,SAAI,WAAU,yBACb,0BAAAC,MAAC,SAAI,WAAU,6BACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,eACb;AAAA,8BAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,gCAAAD,KAAC,cAAW,WAAU,eAAc,2BAAa;AAAA,gBACjD,gBAAAA,KAAC,eAAY,OAAM,iBAAgB,4CAEnC;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WACE,mBACI,2KACA;AAAA,kBAEP;AAAA;AAAA,cAED;AAAA,eACF;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,UAAU,CAAC,gBAAgB;AACzB,2CAAyB,WAAW;AACpC,qCAAmB,IAAI;AAAA,gBACzB;AAAA,gBACA,OAAM;AAAA,gBACN,MAAK;AAAA;AAAA,YACP;AAAA,aACF,GACF;AAAA,UAGD,eACC,gBAAAA,KAAC,SAAI,WAAU,sEACb,0BAAAA,KAAC,OAAE,WAAU,gCAAgC,uBAAY,GAC3D;AAAA,WAEJ,GACF;AAAA,SAEJ;AAAA,MAGC,YACC,gBAAAA,KAAC,SAAI,WAAU,sEACb,0BAAAA,KAAC,OAAE,WAAU,gCAAgC,oBAAS,GACxD;AAAA,OAEJ;AAAA,IAGF,gBAAAC,MAAC,gBACC;AAAA,sBAAAD,KAAC,UAAO,SAAQ,SAAQ,SAAS,MAAM,UAAU,UAAU,QAAQ,oBAEnE;AAAA,MACC,WACC,gBAAAC,MAAC,UAAO,SAAS,WAAW,UAAU,CAAC,UAAU,QAC9C;AAAA,kBAAU,gBAAAD,KAAC,WAAQ,WAAU,YAAW;AAAA,QACxC,SACG,iBACA,mCACE,4BACA;AAAA,SACR;AAAA,OAEJ;AAAA,KACF;AAEJ;","names":["CardStack","CardStackContent","CardStackEntryField","jsx","jsxs","value","CardStack","CardStackContent","CardStackEntryField"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/atoms.ts","../src/react/client.ts","../src/api/group.ts"],"sourcesContent":["import type { ScopeId } from \"@executor-js/sdk/core\";\nimport * as Atom from \"effect/unstable/reactivity/Atom\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\nimport { sourcesOptimisticAtom } from \"@executor-js/react/api/atoms\";\nimport { ReactivityKey } from \"@executor-js/react/api/reactivity-keys\";\nimport { OpenApiClient } from \"./client\";\n\n// ---------------------------------------------------------------------------\n// Query atoms\n// ---------------------------------------------------------------------------\n\nexport const openApiSourceAtom = (scopeId: ScopeId, namespace: string) =>\n OpenApiClient.query(\"openapi\", \"getSource\", {\n params: { scopeId, namespace },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.sources, ReactivityKey.tools],\n });\n\nexport const openApiSourceBindingsAtom = (\n scopeId: ScopeId,\n namespace: string,\n sourceScopeId: ScopeId,\n) =>\n OpenApiClient.query(\"openapi\", \"listSourceBindings\", {\n params: { scopeId, namespace, sourceScopeId },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.sources, ReactivityKey.secrets, ReactivityKey.connections],\n });\n\n// ---------------------------------------------------------------------------\n// Mutation atoms\n// ---------------------------------------------------------------------------\n\nexport const previewOpenApiSpec = OpenApiClient.mutation(\"openapi\", \"previewSpec\");\n\nexport const addOpenApiSpec = OpenApiClient.mutation(\"openapi\", \"addSpec\");\n\nexport const addOpenApiSpecOptimistic = Atom.family((scopeId: ScopeId) =>\n sourcesOptimisticAtom(scopeId).pipe(\n Atom.optimisticFn({\n reducer: (current, arg) =>\n AsyncResult.map(current, (rows) => {\n const id = arg.payload.namespace ?? `pending-${Math.random().toString(36).slice(2)}`;\n const source = {\n id,\n scopeId: arg.payload.targetScope,\n kind: \"openapi\",\n pluginId: \"openapi\",\n name: arg.payload.name ?? id,\n ...(arg.payload.baseUrl ? { url: arg.payload.baseUrl } : {}),\n canRemove: false,\n canRefresh: false,\n canEdit: false,\n runtime: false,\n };\n return [source, ...rows.filter((row) => row.id !== id)].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n }),\n fn: addOpenApiSpec,\n }),\n ),\n);\n\nexport const updateOpenApiSource = OpenApiClient.mutation(\"openapi\", \"updateSource\");\n\nexport const setOpenApiSourceBinding = OpenApiClient.mutation(\"openapi\", \"setSourceBinding\");\n\nexport const removeOpenApiSourceBinding = OpenApiClient.mutation(\"openapi\", \"removeSourceBinding\");\n","import { createPluginAtomClient } from \"@executor-js/sdk/client\";\nimport { getBaseUrl } from \"@executor-js/react/api/base-url\";\nimport { OpenApiGroup } from \"../api/group\";\n\nexport const OpenApiClient = createPluginAtomClient(OpenApiGroup, {\n baseUrl: getBaseUrl,\n});\n","import { HttpApiEndpoint, HttpApiGroup } from \"effect/unstable/httpapi\";\nimport { Schema } from \"effect\";\nimport {\n InternalError,\n ScopeId,\n ScopedSecretCredentialInput,\n SecretBackedValue,\n} from \"@executor-js/sdk/core\";\n\nimport { OpenApiParseError, OpenApiExtractionError, OpenApiOAuthError } from \"../sdk/errors\";\nimport { SpecPreview } from \"../sdk/preview\";\nimport { StoredSourceSchema } from \"../sdk/store\";\nimport {\n OAuth2SourceConfigSchema,\n OpenApiSourceBindingInputSchema,\n OpenApiSourceBindingRef,\n} from \"../sdk/types\";\n\n// ---------------------------------------------------------------------------\n// Params\n// ---------------------------------------------------------------------------\n\nconst DomainErrors = [\n InternalError,\n OpenApiParseError,\n OpenApiExtractionError,\n OpenApiOAuthError,\n] as const;\n\nconst ScopeIdParam = {\n scopeId: ScopeId,\n};\n\nconst SourceParams = {\n scopeId: ScopeId,\n namespace: Schema.String,\n};\n\nconst SourceBindingParams = {\n scopeId: ScopeId,\n namespace: Schema.String,\n sourceScopeId: ScopeId,\n};\n\nconst SpecFetchCredentialsPayload = Schema.Struct({\n headers: Schema.optional(Schema.Record(Schema.String, SecretBackedValue)),\n queryParams: Schema.optional(Schema.Record(Schema.String, SecretBackedValue)),\n});\n\nconst ConfiguredCredentialBindingPayload = Schema.Struct({\n kind: Schema.Literal(\"binding\"),\n slot: Schema.String,\n prefix: Schema.optional(Schema.String),\n});\n\nconst ConfiguredCredentialValuePayload = Schema.Union([\n Schema.String,\n ConfiguredCredentialBindingPayload,\n]);\n\nconst OpenApiCredentialInputPayload = Schema.Union([\n ScopedSecretCredentialInput,\n SecretBackedValue,\n ConfiguredCredentialValuePayload,\n]);\n\n// ---------------------------------------------------------------------------\n// Payloads\n// ---------------------------------------------------------------------------\n\nconst AddSpecPayload = Schema.Struct({\n targetScope: ScopeId,\n credentialTargetScope: Schema.optional(ScopeId),\n spec: Schema.String,\n specFetchCredentials: Schema.optional(SpecFetchCredentialsPayload),\n name: Schema.optional(Schema.String),\n baseUrl: Schema.optional(Schema.String),\n namespace: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),\n queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),\n oauth2: Schema.optional(OAuth2SourceConfigSchema),\n});\n\nconst PreviewSpecPayload = Schema.Struct({\n spec: Schema.String,\n specFetchCredentials: Schema.optional(SpecFetchCredentialsPayload),\n});\n\nconst UpdateSourcePayload = Schema.Struct({\n sourceScope: ScopeId,\n name: Schema.optional(Schema.String),\n baseUrl: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),\n queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),\n credentialTargetScope: Schema.optional(ScopeId),\n // Set after a successful re-authenticate to refresh the source's\n // stored OAuth2 metadata.\n oauth2: Schema.optional(OAuth2SourceConfigSchema),\n});\n\nconst UpdateSourceResponse = Schema.Struct({\n updated: Schema.Boolean,\n});\n\nconst RemoveBindingPayload = Schema.Struct({\n sourceId: Schema.String,\n sourceScope: ScopeId,\n slot: Schema.String,\n scope: ScopeId,\n});\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\n\nconst AddSpecResponse = Schema.Struct({\n toolCount: Schema.Number,\n namespace: Schema.String,\n});\n\n// HTTP status on the three domain errors lives on their class\n// declarations in `../sdk/errors.ts` — see the comment there.\n\n// ---------------------------------------------------------------------------\n// Group\n//\n// Plugin SDK errors (OpenApiParseError, OpenApiExtractionError,\n// OpenApiOAuthError) are declared once at the group level via\n// `.addError(...)` — every endpoint inherits them. The errors themselves\n// carry their HTTP status via `HttpApiSchema.annotations` above, so\n// handlers just `return yield* ext.foo(...)` and the schema encodes\n// whatever comes out.\n//\n// 5xx is handled at the API level: `.addError(InternalError)` adds the\n// shared opaque 500 surface. Defects are captured + downgraded to it by\n// an HttpApiBuilder middleware (see apps/cloud/src/observability.ts).\n// StorageError → InternalError translation happens at service wiring\n// time via `withCapture(executor)`.\n// ---------------------------------------------------------------------------\n\nexport const OpenApiGroup = HttpApiGroup.make(\"openapi\")\n .add(\n HttpApiEndpoint.post(\"previewSpec\", \"/scopes/:scopeId/openapi/preview\", {\n params: ScopeIdParam,\n payload: PreviewSpecPayload,\n success: SpecPreview,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"addSpec\", \"/scopes/:scopeId/openapi/specs\", {\n params: ScopeIdParam,\n payload: AddSpecPayload,\n success: AddSpecResponse,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getSource\", \"/scopes/:scopeId/openapi/sources/:namespace\", {\n params: SourceParams,\n success: Schema.NullOr(StoredSourceSchema),\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.patch(\"updateSource\", \"/scopes/:scopeId/openapi/sources/:namespace\", {\n params: SourceParams,\n payload: UpdateSourcePayload,\n success: UpdateSourceResponse,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\n \"listSourceBindings\",\n \"/scopes/:scopeId/openapi/sources/:namespace/base/:sourceScopeId/bindings\",\n {\n params: SourceBindingParams,\n success: Schema.Array(OpenApiSourceBindingRef),\n error: DomainErrors,\n },\n ),\n )\n .add(\n HttpApiEndpoint.post(\"setSourceBinding\", \"/scopes/:scopeId/openapi/source-bindings\", {\n params: ScopeIdParam,\n payload: OpenApiSourceBindingInputSchema,\n success: OpenApiSourceBindingRef,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"removeSourceBinding\", \"/scopes/:scopeId/openapi/source-bindings/remove\", {\n params: ScopeIdParam,\n payload: RemoveBindingPayload,\n success: Schema.Struct({ removed: Schema.Boolean }),\n error: DomainErrors,\n }),\n );\n"],"mappings":"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","names":[]}
|