@executor-js/plugin-openapi 1.4.29 → 1.4.30
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-FLMNI742.js → AddOpenApiSource-KSOMPQ2R.js} +4 -4
- package/dist/{EditOpenApiSource-I4NIGIIJ.js → EditOpenApiSource-AOA7APR2.js} +301 -192
- package/dist/EditOpenApiSource-AOA7APR2.js.map +1 -0
- package/dist/{OpenApiSourceSummary-CM46DB4L.js → OpenApiSourceSummary-Y3S6ZBOZ.js} +4 -4
- package/dist/OpenApiSourceSummary-Y3S6ZBOZ.js.map +1 -0
- package/dist/api/group.d.ts +124 -118
- package/dist/api/index.d.ts +148 -369
- package/dist/chunk-BB5IAKRG.js +136 -0
- package/dist/chunk-BB5IAKRG.js.map +1 -0
- package/dist/{chunk-E7PZ2QGD.js → chunk-EOXXE5DG.js} +17 -455
- package/dist/chunk-EOXXE5DG.js.map +1 -0
- package/dist/{chunk-OZ67JNID.js → chunk-NIKLYJ3X.js} +830 -319
- package/dist/chunk-NIKLYJ3X.js.map +1 -0
- package/dist/{chunk-TGDT6QCH.js → chunk-YJMXYKYX.js} +178 -117
- package/dist/chunk-YJMXYKYX.js.map +1 -0
- package/dist/{chunk-GFQUEZUW.js → chunk-ZZBTLFTA.js} +78 -93
- package/dist/chunk-ZZBTLFTA.js.map +1 -0
- package/dist/client.js +7 -137
- package/dist/client.js.map +1 -1
- package/dist/core.js +5 -10
- package/dist/index.js +3 -2
- package/dist/react/atoms.d.ts +83 -223
- package/dist/react/client.d.ts +123 -117
- package/dist/sdk/credential-status.d.ts +3 -3
- package/dist/sdk/extract.d.ts +19 -19
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/invoke.d.ts +7 -7
- package/dist/sdk/parse.d.ts +2 -3
- package/dist/sdk/plugin.d.ts +181 -275
- package/dist/sdk/preview.d.ts +12 -12
- package/dist/sdk/source-contracts.d.ts +55 -0
- package/dist/sdk/store.d.ts +6 -269
- package/dist/sdk/types.d.ts +16 -65
- package/dist/testing/index.d.ts +149 -11
- package/dist/testing.js +419 -33
- package/dist/testing.js.map +1 -1
- package/dist/testing.test.d.ts +1 -0
- package/package.json +3 -4
- package/dist/EditOpenApiSource-I4NIGIIJ.js.map +0 -1
- package/dist/OpenApiSourceSummary-CM46DB4L.js.map +0 -1
- package/dist/chunk-E7PZ2QGD.js.map +0 -1
- package/dist/chunk-GFQUEZUW.js.map +0 -1
- package/dist/chunk-OZ67JNID.js.map +0 -1
- package/dist/chunk-TGDT6QCH.js.map +0 -1
- /package/dist/{AddOpenApiSource-FLMNI742.js.map → AddOpenApiSource-KSOMPQ2R.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk/invoke.ts","../src/sdk/plugin.ts","../src/sdk/definitions.ts"],"sourcesContent":["import { Effect, Layer, Option } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\n\nimport type { SecretOwnedByConnectionError, StorageFailure } from \"@executor-js/sdk/core\";\n\nimport { OpenApiInvocationError } from \"./errors\";\nimport {\n type EncodingObject,\n type HeaderValue,\n type OperationBinding,\n InvocationResult,\n type MediaBinding,\n type OperationParameter,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Parameter reading\n// ---------------------------------------------------------------------------\n\nconst CONTAINER_KEYS: Record<string, readonly string[]> = {\n path: [\"path\", \"pathParams\", \"params\"],\n query: [\"query\", \"queryParams\", \"params\"],\n header: [\"headers\", \"header\"],\n cookie: [\"cookies\", \"cookie\"],\n};\n\nconst readParamValue = (args: Record<string, unknown>, param: OperationParameter): unknown => {\n const direct = args[param.name];\n if (direct !== undefined) return direct;\n\n for (const key of CONTAINER_KEYS[param.location] ?? []) {\n const container = args[key];\n if (typeof container === \"object\" && container !== null && !Array.isArray(container)) {\n const nested = (container as Record<string, unknown>)[param.name];\n if (nested !== undefined) return nested;\n }\n }\n\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Path resolution\n// ---------------------------------------------------------------------------\n\nconst resolvePath = Effect.fn(\"OpenApi.resolvePath\")(function* (\n pathTemplate: string,\n args: Record<string, unknown>,\n parameters: readonly OperationParameter[],\n) {\n let resolved = pathTemplate;\n\n for (const param of parameters) {\n if (param.location !== \"path\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) {\n if (param.required) {\n return yield* new OpenApiInvocationError({\n message: `Missing required path parameter: ${param.name}`,\n statusCode: Option.none(),\n });\n }\n continue;\n }\n resolved = resolved.replaceAll(`{${param.name}}`, encodeURIComponent(String(value)));\n }\n\n const remaining = [...resolved.matchAll(/\\{([^{}]+)\\}/g)]\n .map((m) => m[1])\n .filter((v): v is string => typeof v === \"string\");\n\n for (const name of remaining) {\n const value = args[name];\n if (value !== undefined && value !== null) {\n resolved = resolved.replaceAll(`{${name}}`, encodeURIComponent(String(value)));\n }\n }\n\n const unresolved = [...resolved.matchAll(/\\{([^{}]+)\\}/g)]\n .map((m) => m[1])\n .filter((v): v is string => typeof v === \"string\");\n\n if (unresolved.length > 0) {\n return yield* new OpenApiInvocationError({\n message: `Unresolved path parameters: ${[...new Set(unresolved)].join(\", \")}`,\n statusCode: Option.none(),\n });\n }\n\n return resolved;\n});\n\n// ---------------------------------------------------------------------------\n// Header resolution — resolves secret refs at invocation time\n// ---------------------------------------------------------------------------\n\nexport const resolveHeaders = (\n headers: Record<string, HeaderValue>,\n secrets: {\n readonly get: (\n id: string,\n ) => Effect.Effect<string | null, SecretOwnedByConnectionError | StorageFailure>;\n },\n): Effect.Effect<Record<string, string>, OpenApiInvocationError | StorageFailure> => {\n const entries = Object.entries(headers);\n const secretCount = entries.reduce(\n (acc, [, value]) => (typeof value === \"string\" ? acc : acc + 1),\n 0,\n );\n return Effect.gen(function* () {\n // Fan out secret lookups: on every invocation, one or two headers\n // typically each hit the secret store. Resolving them in parallel\n // is a free wall-clock win — preserved order is only needed for\n // the final assembly, not the fetches.\n const values = yield* Effect.all(\n entries.map(([name, value]) =>\n typeof value === \"string\"\n ? Effect.succeed({ name, value })\n : secrets.get(value.secretId).pipe(\n Effect.catchTag(\"SecretOwnedByConnectionError\", () =>\n Effect.fail(\n new OpenApiInvocationError({\n message: `Failed to resolve secret \"${value.secretId}\" for header \"${name}\"`,\n statusCode: Option.none(),\n }),\n ),\n ),\n Effect.flatMap((secret) =>\n secret === null\n ? Effect.fail(\n new OpenApiInvocationError({\n message: `Failed to resolve secret \"${value.secretId}\" for header \"${name}\"`,\n statusCode: Option.none(),\n }),\n )\n : Effect.succeed({\n name,\n value: value.prefix ? `${value.prefix}${secret}` : secret,\n }),\n ),\n ),\n ),\n { concurrency: \"unbounded\" },\n );\n const resolved: Record<string, string> = {};\n for (const { name, value } of values) resolved[name] = value;\n return resolved;\n }).pipe(\n Effect.withSpan(\"plugin.openapi.secret.resolve\", {\n attributes: {\n \"plugin.openapi.headers.total\": entries.length,\n \"plugin.openapi.headers.secret_count\": secretCount,\n },\n }),\n );\n};\n\nconst applyHeaders = (\n request: HttpClientRequest.HttpClientRequest,\n headers: Record<string, string>,\n): HttpClientRequest.HttpClientRequest => {\n let req = request;\n for (const [name, value] of Object.entries(headers)) {\n req = HttpClientRequest.setHeader(req, name, value);\n }\n return req;\n};\n\n// ---------------------------------------------------------------------------\n// Response helpers\n// ---------------------------------------------------------------------------\n\nconst normalizeContentType = (ct: string | null | undefined): string =>\n ct?.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n\nconst isJsonContentType = (ct: string | null | undefined): boolean => {\n const normalized = normalizeContentType(ct);\n if (!normalized) return false;\n return (\n normalized === \"application/json\" || normalized.includes(\"+json\") || normalized.includes(\"json\")\n );\n};\n\nconst isFormUrlEncoded = (ct: string | null | undefined): boolean =>\n normalizeContentType(ct) === \"application/x-www-form-urlencoded\";\n\nconst isMultipartFormData = (ct: string | null | undefined): boolean =>\n normalizeContentType(ct).startsWith(\"multipart/form-data\");\n\nconst isXmlContentType = (ct: string | null | undefined): boolean => {\n const normalized = normalizeContentType(ct);\n if (!normalized) return false;\n return (\n normalized === \"application/xml\" || normalized === \"text/xml\" || normalized.endsWith(\"+xml\")\n );\n};\n\nconst isTextContentType = (ct: string | null | undefined): boolean =>\n normalizeContentType(ct).startsWith(\"text/\");\n\nconst isOctetStream = (ct: string | null | undefined): boolean =>\n normalizeContentType(ct) === \"application/octet-stream\";\n\nconst toUint8Array = (value: unknown): Uint8Array | null => {\n if (value instanceof Uint8Array) return value;\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (ArrayBuffer.isView(value)) {\n const view = value as ArrayBufferView;\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n if (Array.isArray(value) && value.every((v) => typeof v === \"number\")) {\n return new Uint8Array(value as readonly number[]);\n }\n return null;\n};\n\ntype FormDataRecord = Parameters<typeof HttpClientRequest.bodyFormDataRecord>[1];\ntype FormDataCoercible = FormDataRecord[string];\n\n// Pull a plain ArrayBuffer out of a Uint8Array — `new Blob([u8])` rejects\n// views whose `.buffer` is `SharedArrayBuffer | ArrayBuffer` under strict\n// lib.dom typings.\nconst toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n const copy = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(copy).set(bytes);\n return copy;\n};\n\n// ---------------------------------------------------------------------------\n// OpenAPI 3.x encoding — per-property style/explode/allowReserved/contentType\n// for multipart/form-data and application/x-www-form-urlencoded bodies.\n// Spec ref: https://spec.openapis.org/oas/v3.1.0#encoding-object\n// ---------------------------------------------------------------------------\n\ntype StyleExplode = {\n readonly style: string;\n readonly explode: boolean;\n readonly allowReserved: boolean;\n};\n\nconst DEFAULT_FORM_STYLE: StyleExplode = {\n style: \"form\",\n explode: true,\n allowReserved: false,\n};\n\nconst resolveStyleExplode = (e: EncodingObject | undefined): StyleExplode => {\n if (!e) return DEFAULT_FORM_STYLE;\n return {\n style: Option.getOrElse(e.style, () => DEFAULT_FORM_STYLE.style),\n explode: Option.getOrElse(e.explode, () => DEFAULT_FORM_STYLE.explode),\n allowReserved: Option.getOrElse(e.allowReserved, () => DEFAULT_FORM_STYLE.allowReserved),\n };\n};\n\n// RFC 3986 §2.2 reserved chars. `allowReserved: true` leaves these\n// unencoded; default OAS behavior encodes everything non-unreserved.\nconst RESERVED_UNENCODED_RE = /[A-Za-z0-9\\-._~:/?#[\\]@!$&'()*+,;=]/;\n\nconst encodeFormValue = (v: unknown, allowReserved: boolean): string => {\n const raw = typeof v === \"object\" && v !== null ? JSON.stringify(v) : String(v);\n if (!allowReserved) return encodeURIComponent(raw);\n // Walk char-by-char so the reserved set passes through as-is.\n let out = \"\";\n for (const ch of raw) {\n out += RESERVED_UNENCODED_RE.test(ch) ? ch : encodeURIComponent(ch);\n }\n return out;\n};\n\n/**\n * Serialize a record to application/x-www-form-urlencoded with OAS3 style\n * rules honored per-field. Supports `form` (default), `deepObject`,\n * `pipeDelimited`, `spaceDelimited` styles with `explode` true / false.\n */\nconst serializeFormUrlEncoded = (\n value: Record<string, unknown>,\n encoding: Record<string, EncodingObject> | undefined,\n): string => {\n const parts: string[] = [];\n for (const [key, raw] of Object.entries(value)) {\n if (raw === undefined || raw === null) continue;\n const { style, explode, allowReserved } = resolveStyleExplode(encoding?.[key]);\n const encKey = encodeURIComponent(key);\n\n if (Array.isArray(raw)) {\n if (explode) {\n for (const v of raw) {\n parts.push(`${encKey}=${encodeFormValue(v, allowReserved)}`);\n }\n } else {\n const sep = style === \"spaceDelimited\" ? \" \" : style === \"pipeDelimited\" ? \"|\" : \",\";\n parts.push(\n `${encKey}=${encodeFormValue(\n raw.map((v) => (typeof v === \"object\" ? JSON.stringify(v) : String(v))).join(sep),\n allowReserved,\n )}`,\n );\n }\n continue;\n }\n\n if (typeof raw === \"object\") {\n const entries = Object.entries(raw as Record<string, unknown>).filter(\n ([, v]) => v !== undefined && v !== null,\n );\n if (style === \"deepObject\") {\n for (const [subkey, subval] of entries) {\n // Encode the whole `key[subkey]` fragment so `[` / `]` become\n // `%5B` / `%5D`. Matches swagger-client's behaviour and remains\n // accepted by common server-side parsers (qs, Rails, etc.).\n parts.push(\n `${encodeURIComponent(`${key}[${subkey}]`)}=${encodeFormValue(subval, allowReserved)}`,\n );\n }\n } else if (explode) {\n // form + explode=true on object: sub-keys become top-level fields.\n for (const [subkey, subval] of entries) {\n parts.push(`${encodeURIComponent(subkey)}=${encodeFormValue(subval, allowReserved)}`);\n }\n } else {\n // form + explode=false on object: flatten to csv key,val,key,val.\n const flat = entries.flatMap(([k, v]) => [\n k,\n typeof v === \"object\" ? JSON.stringify(v) : String(v),\n ]);\n parts.push(`${encKey}=${encodeFormValue(flat.join(\",\"), allowReserved)}`);\n }\n continue;\n }\n\n parts.push(`${encKey}=${encodeFormValue(raw, allowReserved)}`);\n }\n return parts.join(\"&\");\n};\n\n/**\n * Best-effort build of a multipart FormData entry record.\n *\n * If `encoding[key].contentType` is declared (OAS3 §4.8.15), wrap the value\n * in a `Blob` with that type so the runtime multipart framer emits the\n * per-part `Content-Type` header (e.g. `application/json` for a metadata\n * part whose server expects parsed JSON).\n *\n * Otherwise: primitives pass through, arrays handle their item types, byte\n * shapes wrap as Blob, nested objects JSON-stringify (never `[object Object]`).\n */\nconst coerceFormDataRecord = (\n value: Record<string, unknown>,\n encoding: Record<string, EncodingObject> | undefined,\n): FormDataRecord => {\n const out: Record<string, FormDataCoercible> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (raw === undefined || raw === null) continue;\n\n const partType = encoding?.[key]\n ? Option.getOrUndefined(encoding[key]!.contentType)\n : undefined;\n\n // Explicit per-part content type: wrap in a typed Blob so the framer\n // emits `Content-Type: <partType>` on this part. JSON types get the\n // value JSON-stringified first so the blob body is valid JSON.\n if (partType) {\n const isJson = partType.startsWith(\"application/json\") || partType.includes(\"+json\");\n const serialized =\n typeof raw === \"string\"\n ? raw\n : isJson\n ? JSON.stringify(raw)\n : typeof raw === \"object\"\n ? JSON.stringify(raw)\n : String(raw);\n out[key] = new Blob([serialized], { type: partType });\n continue;\n }\n\n if (\n typeof raw === \"string\" ||\n typeof raw === \"number\" ||\n typeof raw === \"boolean\" ||\n raw instanceof Blob ||\n (typeof File !== \"undefined\" && raw instanceof File)\n ) {\n out[key] = raw as FormDataCoercible;\n continue;\n }\n if (Array.isArray(raw)) {\n out[key] = raw.map((v) =>\n typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"boolean\" ||\n v instanceof Blob ||\n (typeof File !== \"undefined\" && v instanceof File)\n ? (v as FormDataCoercible)\n : JSON.stringify(v),\n ) as FormDataCoercible;\n continue;\n }\n const bytes = toUint8Array(raw);\n if (bytes) {\n out[key] = new Blob([toArrayBuffer(bytes)]);\n continue;\n }\n out[key] = JSON.stringify(raw);\n }\n return out;\n};\n\n// ---------------------------------------------------------------------------\n// Request body dispatch\n//\n// Dispatch is driven by the spec-declared content type first, JS type of\n// the provided body second. Servers that advertise a specific content type\n// almost always reject anything else (e.g. a multipart endpoint will hang\n// waiting for valid framing if it receives `application/json`), so the\n// content type wins.\n//\n// Within each content type we accept both pre-serialized strings (user\n// already produced the wire format) and structured JS values we can\n// serialize ourselves. The last-resort fallback is `JSON.stringify(body)`\n// — never `String(body)` (which produces the useless `[object Object]`).\n// ---------------------------------------------------------------------------\n\nconst applyRequestBody = (\n request: HttpClientRequest.HttpClientRequest,\n contentType: string,\n bodyValue: unknown,\n encoding: Record<string, EncodingObject> | undefined,\n): HttpClientRequest.HttpClientRequest => {\n if (isJsonContentType(contentType)) {\n // Pre-serialized JSON strings pass through with the declared media\n // type preserved (important for `application/vnd.foo+json` etc.).\n if (typeof bodyValue === \"string\") {\n return HttpClientRequest.bodyText(request, bodyValue, contentType);\n }\n return HttpClientRequest.bodyJsonUnsafe(request, bodyValue);\n }\n\n if (isFormUrlEncoded(contentType)) {\n if (typeof bodyValue === \"string\") {\n return HttpClientRequest.bodyText(request, bodyValue, contentType);\n }\n if (typeof bodyValue === \"object\" && bodyValue !== null && !Array.isArray(bodyValue)) {\n // Serialize ourselves so OAS3 encoding (style/explode/deepObject)\n // is honored. bodyUrlParams doesn't know about per-field style.\n const serialized = serializeFormUrlEncoded(bodyValue as Record<string, unknown>, encoding);\n return HttpClientRequest.bodyText(request, serialized, contentType);\n }\n // Non-object body — fall back to platform helper (handles URLSearchParams).\n return HttpClientRequest.bodyUrlParams(\n request,\n bodyValue as Parameters<typeof HttpClientRequest.bodyUrlParams>[1],\n );\n }\n\n if (isMultipartFormData(contentType)) {\n if (bodyValue instanceof FormData) {\n return HttpClientRequest.bodyFormData(request, bodyValue);\n }\n if (typeof bodyValue === \"object\" && bodyValue !== null) {\n return HttpClientRequest.bodyFormDataRecord(\n request,\n coerceFormDataRecord(bodyValue as Record<string, unknown>, encoding),\n );\n }\n // String / primitive under multipart is almost certainly wrong on the\n // caller's end — send it as text with their declared content type and\n // let the server produce a useful error.\n return HttpClientRequest.bodyText(request, String(bodyValue), contentType);\n }\n\n if (isOctetStream(contentType)) {\n const bytes = toUint8Array(bodyValue);\n if (bytes) return HttpClientRequest.bodyUint8Array(request, bytes, contentType);\n if (typeof bodyValue === \"string\") {\n return HttpClientRequest.bodyText(request, bodyValue, contentType);\n }\n // Unknown shape — serialize as JSON so at least the payload is visible.\n return HttpClientRequest.bodyText(request, JSON.stringify(bodyValue), contentType);\n }\n\n if (isXmlContentType(contentType) || isTextContentType(contentType)) {\n if (typeof bodyValue === \"string\") {\n return HttpClientRequest.bodyText(request, bodyValue, contentType);\n }\n const bytes = toUint8Array(bodyValue);\n if (bytes) return HttpClientRequest.bodyUint8Array(request, bytes, contentType);\n // Object body under text/xml is unusual — stringify so the caller sees\n // their own payload instead of `[object Object]`.\n return HttpClientRequest.bodyText(request, JSON.stringify(bodyValue), contentType);\n }\n\n // Unknown content type: respect what the caller supplied.\n if (typeof bodyValue === \"string\") {\n return HttpClientRequest.bodyText(request, bodyValue, contentType);\n }\n const bytes = toUint8Array(bodyValue);\n if (bytes) return HttpClientRequest.bodyUint8Array(request, bytes, contentType);\n return HttpClientRequest.bodyText(request, JSON.stringify(bodyValue), contentType);\n};\n\n// ---------------------------------------------------------------------------\n// Public API — invoke a single operation\n// ---------------------------------------------------------------------------\n\nexport const invoke = Effect.fn(\"OpenApi.invoke\")(function* (\n operation: OperationBinding,\n args: Record<string, unknown>,\n resolvedHeaders: Record<string, string>,\n sourceQueryParams: Record<string, string> = {},\n) {\n const client = yield* HttpClient.HttpClient;\n\n yield* Effect.annotateCurrentSpan({\n \"http.method\": operation.method.toUpperCase(),\n \"http.route\": operation.pathTemplate,\n \"plugin.openapi.method\": operation.method.toUpperCase(),\n \"plugin.openapi.path_template\": operation.pathTemplate,\n \"plugin.openapi.headers.resolved_count\": Object.keys(resolvedHeaders).length,\n });\n\n const resolvedPath = yield* resolvePath(operation.pathTemplate, args, operation.parameters);\n\n const path = resolvedPath.startsWith(\"/\") ? resolvedPath : `/${resolvedPath}`;\n\n let request = HttpClientRequest.make(operation.method.toUpperCase() as \"GET\")(path);\n\n for (const [name, value] of Object.entries(sourceQueryParams)) {\n request = HttpClientRequest.setUrlParam(request, name, value);\n }\n\n for (const param of operation.parameters) {\n if (param.location !== \"query\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) continue;\n request = HttpClientRequest.setUrlParam(request, param.name, String(value));\n }\n\n for (const param of operation.parameters) {\n if (param.location !== \"header\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) continue;\n request = HttpClientRequest.setHeader(request, param.name, String(value));\n }\n\n if (Option.isSome(operation.requestBody)) {\n const rb = operation.requestBody.value;\n const bodyValue = args.body ?? args.input;\n if (bodyValue !== undefined) {\n // Resolve which declared media type to use. When the spec declares\n // multiple, the caller can override via `args.contentType`; otherwise\n // we use the first-declared (spec author's preferred ordering).\n const contentsOpt = Option.getOrUndefined(rb.contents);\n const requestedCt = typeof args.contentType === \"string\" ? args.contentType : undefined;\n const selected: MediaBinding | undefined =\n contentsOpt && requestedCt\n ? contentsOpt.find((c) => c.contentType === requestedCt)\n : undefined;\n const chosenCt = selected?.contentType ?? rb.contentType;\n const chosenEncoding = selected\n ? Option.getOrUndefined(selected.encoding)\n : contentsOpt && contentsOpt[0]\n ? Option.getOrUndefined(contentsOpt[0].encoding)\n : undefined;\n request = applyRequestBody(request, chosenCt, bodyValue, chosenEncoding);\n }\n }\n\n request = applyHeaders(request, resolvedHeaders);\n\n const response = yield* client.execute(request).pipe(\n Effect.mapError(\n (err) =>\n new OpenApiInvocationError({\n message: \"HTTP request failed\",\n statusCode: Option.none(),\n cause: err,\n }),\n ),\n );\n\n const status = response.status;\n yield* Effect.annotateCurrentSpan({\n \"http.status_code\": status,\n });\n const responseHeaders: Record<string, string> = { ...response.headers };\n\n const contentType = response.headers[\"content-type\"] ?? null;\n const mapBodyError = Effect.mapError(\n (err: unknown) =>\n new OpenApiInvocationError({\n message: \"Failed to read response body\",\n statusCode: Option.some(status),\n cause: err,\n }),\n );\n const responseBody: unknown =\n status === 204\n ? null\n : isJsonContentType(contentType)\n ? yield* response.json.pipe(\n Effect.catch(() => response.text),\n mapBodyError,\n )\n : yield* response.text.pipe(mapBodyError);\n\n const ok = status >= 200 && status < 300;\n\n return InvocationResult.make({\n status,\n headers: responseHeaders,\n data: ok ? responseBody : null,\n error: ok ? null : responseBody,\n });\n});\n\n// ---------------------------------------------------------------------------\n// Invoke with a provided HttpClient layer + optional baseUrl prefix\n// ---------------------------------------------------------------------------\n\nexport const invokeWithLayer = (\n operation: OperationBinding,\n args: Record<string, unknown>,\n baseUrl: string,\n resolvedHeaders: Record<string, string>,\n sourceQueryParams: Record<string, string>,\n httpClientLayer: Layer.Layer<HttpClient.HttpClient, never, never>,\n) => {\n const clientWithBaseUrl = baseUrl\n ? Layer.effect(\n HttpClient.HttpClient,\n Effect.map(\n Effect.service(HttpClient.HttpClient),\n HttpClient.mapRequest(HttpClientRequest.prependUrl(baseUrl)),\n ),\n ).pipe(Layer.provide(httpClientLayer))\n : httpClientLayer;\n\n return invoke(operation, args, resolvedHeaders, sourceQueryParams).pipe(\n Effect.provide(clientWithBaseUrl),\n Effect.withSpan(\"plugin.openapi.invoke\", {\n attributes: {\n \"plugin.openapi.method\": operation.method.toUpperCase(),\n \"plugin.openapi.path_template\": operation.pathTemplate,\n \"plugin.openapi.base_url\": baseUrl,\n },\n }),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Derive annotations from HTTP method\n// ---------------------------------------------------------------------------\n\nconst REQUIRE_APPROVAL = new Set([\"post\", \"put\", \"patch\", \"delete\"]);\n\nexport const annotationsForOperation = (\n method: string,\n pathTemplate: string,\n): { requiresApproval?: boolean; approvalDescription?: string } => {\n const m = method.toLowerCase();\n if (!REQUIRE_APPROVAL.has(m)) return {};\n return {\n requiresApproval: true,\n approvalDescription: `${method.toUpperCase()} ${pathTemplate}`,\n };\n};\n","import { Effect, Option, Predicate, Schema } from \"effect\";\nimport type { Layer } from \"effect\";\nimport { HttpClient } from \"effect/unstable/http\";\n\nimport {\n ScopeId,\n SecretId,\n SourceDetectionResult,\n StorageError,\n definePlugin,\n tool,\n resolveSecretBackedMap,\n type CredentialBindingRef,\n type PluginCtx,\n type StorageFailure,\n type ToolAnnotations,\n type ToolRow,\n} from \"@executor-js/sdk/core\";\n\nimport {\n headersToConfigValues,\n type ConfigFileSink,\n type OpenApiSourceConfig,\n} from \"@executor-js/config\";\n\nimport { OpenApiExtractionError, OpenApiOAuthError, OpenApiParseError } from \"./errors\";\nimport { parse, resolveSpecText } from \"./parse\";\nimport { extract } from \"./extract\";\nimport { compileToolDefinitions, type ToolDefinition } from \"./definitions\";\nimport { annotationsForOperation, invokeWithLayer } from \"./invoke\";\nimport { resolveBaseUrl } from \"./openapi-utils\";\nimport { previewSpec, SpecPreview } from \"./preview\";\nimport {\n makeDefaultOpenapiStore,\n openapiSchema,\n type OpenapiStore,\n type SourceConfig,\n type StoredOperation,\n type StoredSource,\n} from \"./store\";\nimport {\n HeaderValue as HeaderValueSchema,\n ConfiguredHeaderValue as ConfiguredHeaderValueSchema,\n ConfiguredHeaderBinding,\n OAuth2SourceConfig,\n OpenApiCredentialInput as OpenApiCredentialInputSchema,\n OpenApiSourceBindingInput,\n OpenApiSourceBindingRef,\n type OpenApiCredentialInput as OpenApiCredentialInputValue,\n type OpenApiSourceBindingValue,\n OperationBinding,\n type ConfiguredHeaderValue as ConfiguredHeaderValueValue,\n type HeaderValue as HeaderValueValue,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Plugin config\n// ---------------------------------------------------------------------------\n\nexport type HeaderValue = HeaderValueValue;\nexport type ConfiguredHeaderValue = ConfiguredHeaderValueValue;\nexport type OpenApiHeaderInput = HeaderValue | ConfiguredHeaderValue;\nexport type OpenApiCredentialInput = OpenApiCredentialInputValue;\nexport type OpenApiOAuthInput = OAuth2SourceConfig;\n\nexport interface OpenApiSpecFetchCredentialsInput {\n readonly headers?: Record<string, HeaderValue>;\n readonly queryParams?: Record<string, HeaderValue>;\n}\n\nexport interface OpenApiPreviewInput {\n readonly spec: string;\n readonly specFetchCredentials?: OpenApiSpecFetchCredentialsInput;\n}\n\nexport interface OpenApiSpecConfig {\n readonly spec: string;\n readonly specFetchCredentials?: OpenApiSpecFetchCredentialsInput;\n /**\n * Executor scope id that owns this source row. Must be one of the\n * executor's configured scopes. Typical shape: an admin adds the\n * source at the outermost (organization) scope so it's visible to\n * every inner (per-user) scope via fall-through reads.\n */\n readonly scope: string;\n readonly name?: string;\n readonly baseUrl?: string;\n readonly namespace?: string;\n readonly headers?: Record<string, OpenApiCredentialInput>;\n readonly queryParams?: Record<string, OpenApiCredentialInput>;\n readonly oauth2?: OpenApiOAuthInput;\n readonly credentialTargetScope?: string;\n}\n\nexport interface OpenApiUpdateSourceInput {\n readonly name?: string;\n readonly baseUrl?: string;\n readonly headers?: Record<string, OpenApiCredentialInput>;\n readonly queryParams?: Record<string, OpenApiCredentialInput>;\n readonly credentialTargetScope?: string;\n /** Refresh the source's stored OAuth2 metadata after a successful\n * re-authenticate. */\n readonly oauth2?: OpenApiOAuthInput;\n}\n\n/**\n * Errors any OpenAPI extension method may surface. The first three are\n * plugin-domain tagged errors that flow directly to clients (4xx, each\n * carrying its own `HttpApiSchema` status). `StorageFailure` covers\n * raw backend failures (`StorageError`) plus `UniqueViolationError`;\n * the HTTP edge (`@executor-js/api`'s `withCapture`) translates\n * `StorageError` to the opaque `InternalError({ traceId })` at Layer\n * composition. `UniqueViolationError` passes through — plugins can\n * `Effect.catchTag` it if they want a friendlier user-facing error.\n */\nexport type OpenApiExtensionFailure =\n | OpenApiParseError\n | OpenApiExtractionError\n | OpenApiOAuthError\n | StorageFailure;\n\nexport interface OpenApiPluginExtension {\n readonly previewSpec: (\n input: string | OpenApiPreviewInput,\n ) => Effect.Effect<\n SpecPreview,\n OpenApiParseError | OpenApiExtractionError | OpenApiOAuthError | StorageFailure\n >;\n readonly addSpec: (\n config: OpenApiSpecConfig,\n ) => Effect.Effect<\n { readonly sourceId: string; readonly toolCount: number },\n OpenApiParseError | OpenApiExtractionError | OpenApiOAuthError | StorageFailure\n >;\n readonly removeSpec: (namespace: string, scope: string) => Effect.Effect<void, StorageFailure>;\n readonly getSource: (\n namespace: string,\n scope: string,\n ) => Effect.Effect<StoredSource | null, StorageFailure>;\n readonly updateSource: (\n namespace: string,\n scope: string,\n input: OpenApiUpdateSourceInput,\n ) => Effect.Effect<void, StorageFailure>;\n readonly listSourceBindings: (\n sourceId: string,\n sourceScope: string,\n ) => Effect.Effect<readonly OpenApiSourceBindingRef[], StorageFailure>;\n readonly setSourceBinding: (\n input: OpenApiSourceBindingInput,\n ) => Effect.Effect<OpenApiSourceBindingRef, StorageFailure>;\n readonly removeSourceBinding: (\n sourceId: string,\n sourceScope: string,\n slot: string,\n scope: string,\n ) => Effect.Effect<void, StorageFailure>;\n}\n\n// ---------------------------------------------------------------------------\n// Control-tool input/output schemas\n// ---------------------------------------------------------------------------\n\nconst PreviewSpecInputSchema = Schema.Struct({\n spec: Schema.String,\n specFetchCredentials: Schema.optional(\n Schema.Struct({\n headers: Schema.optional(Schema.Record(Schema.String, HeaderValueSchema)),\n queryParams: Schema.optional(Schema.Record(Schema.String, HeaderValueSchema)),\n }),\n ),\n});\n\nconst OpenApiHeaderInputSchema = Schema.Union([HeaderValueSchema, ConfiguredHeaderValueSchema]);\nconst OpenApiOAuthInputSchema = OAuth2SourceConfig;\n\nconst AddSourceInputSchema = Schema.Struct({\n scope: Schema.String,\n spec: Schema.String,\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, OpenApiHeaderInputSchema)),\n queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputSchema)),\n oauth2: Schema.optional(OpenApiOAuthInputSchema),\n credentialTargetScope: Schema.optional(Schema.String),\n specFetchCredentials: Schema.optional(\n Schema.Struct({\n headers: Schema.optional(Schema.Record(Schema.String, HeaderValueSchema)),\n queryParams: Schema.optional(Schema.Record(Schema.String, HeaderValueSchema)),\n }),\n ),\n});\n\nconst AddSourceOutputSchema = Schema.Struct({\n sourceId: Schema.String,\n toolCount: Schema.Number,\n});\n\nconst PreviewSpecInputStandardSchema = Schema.toStandardSchemaV1(\n Schema.toStandardJSONSchemaV1(PreviewSpecInputSchema),\n);\nconst AddSourceInputStandardSchema = Schema.toStandardSchemaV1(\n Schema.toStandardJSONSchemaV1(AddSourceInputSchema),\n);\nconst AddSourceOutputStandardSchema = Schema.toStandardSchemaV1(\n Schema.toStandardJSONSchemaV1(AddSourceOutputSchema),\n);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Rewrite OpenAPI `#/components/schemas/X` refs to standard `#/$defs/X`. */\nconst normalizeOpenApiRefs = (node: unknown): unknown => {\n if (node == null || typeof node !== \"object\") return node;\n if (Array.isArray(node)) {\n let changed = false;\n const out = node.map((item) => {\n const n = normalizeOpenApiRefs(item);\n if (n !== item) changed = true;\n return n;\n });\n return changed ? out : node;\n }\n\n const obj = node as Record<string, unknown>;\n\n if (typeof obj.$ref === \"string\") {\n const match = obj.$ref.match(/^#\\/components\\/schemas\\/(.+)$/);\n if (match) return { ...obj, $ref: `#/$defs/${match[1]}` };\n return obj;\n }\n\n let changed = false;\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const n = normalizeOpenApiRefs(v);\n if (n !== v) changed = true;\n result[k] = n;\n }\n return changed ? result : obj;\n};\n\nconst toBinding = (def: ToolDefinition): OperationBinding =>\n OperationBinding.make({\n method: def.operation.method,\n pathTemplate: def.operation.pathTemplate,\n parameters: [...def.operation.parameters],\n requestBody: def.operation.requestBody,\n });\n\nconst descriptionFor = (def: ToolDefinition): string => {\n const op = def.operation;\n return Option.getOrElse(op.description, () =>\n Option.getOrElse(op.summary, () => `${op.method.toUpperCase()} ${op.pathTemplate}`),\n );\n};\n\nconst slotPart = (value: string): string =>\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"default\";\n\nconst headerSlotFromName = (name: string): string => `header:${slotPart(name)}`;\n\nconst queryParamSlotFromName = (name: string): string => `query_param:${slotPart(name)}`;\n\nconst specFetchHeaderSlotFromName = (name: string): string => `spec_fetch_header:${slotPart(name)}`;\n\nconst specFetchQueryParamSlotFromName = (name: string): string =>\n `spec_fetch_query_param:${slotPart(name)}`;\n\nconst canonicalizeHeaders = (\n headers: Record<string, OpenApiCredentialInput> | undefined,\n): {\n readonly headers: Record<string, ConfiguredHeaderValue>;\n readonly bindings: ReadonlyArray<{\n readonly slot: string;\n readonly value: OpenApiSourceBindingValue;\n readonly targetScope?: string;\n }>;\n} => {\n const nextHeaders: Record<string, ConfiguredHeaderValue> = {};\n const bindings: Array<{\n slot: string;\n value: OpenApiSourceBindingValue;\n targetScope?: string;\n }> = [];\n for (const [name, value] of Object.entries(headers ?? {})) {\n if (typeof value === \"string\") {\n nextHeaders[name] = value;\n continue;\n }\n if (\"kind\" in value) {\n nextHeaders[name] = value;\n continue;\n }\n const slot = headerSlotFromName(name);\n nextHeaders[name] = ConfiguredHeaderBinding.make({\n kind: \"binding\",\n slot,\n prefix: value.prefix,\n });\n bindings.push({\n slot,\n targetScope: \"targetScope\" in value ? value.targetScope : undefined,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(value.secretId),\n ...(\"secretScopeId\" in value && value.secretScopeId\n ? { secretScopeId: value.secretScopeId }\n : {}),\n },\n });\n }\n return { headers: nextHeaders, bindings };\n};\n\nconst canonicalizeCredentialMap = (\n values: Record<string, OpenApiCredentialInput> | undefined,\n slotForName: (name: string) => string,\n): {\n readonly values: Record<string, ConfiguredHeaderValue>;\n readonly bindings: ReadonlyArray<{\n readonly slot: string;\n readonly value: OpenApiSourceBindingValue;\n readonly targetScope?: string;\n }>;\n} => {\n const nextValues: Record<string, ConfiguredHeaderValue> = {};\n const bindings: Array<{\n slot: string;\n value: OpenApiSourceBindingValue;\n targetScope?: string;\n }> = [];\n for (const [name, value] of Object.entries(values ?? {})) {\n if (typeof value === \"string\") {\n nextValues[name] = value;\n continue;\n }\n if (\"kind\" in value) {\n nextValues[name] = value;\n continue;\n }\n const slot = slotForName(name);\n nextValues[name] = ConfiguredHeaderBinding.make({\n kind: \"binding\",\n slot,\n prefix: value.prefix,\n });\n bindings.push({\n slot,\n targetScope: \"targetScope\" in value ? value.targetScope : undefined,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(value.secretId),\n ...(\"secretScopeId\" in value && value.secretScopeId\n ? { secretScopeId: value.secretScopeId }\n : {}),\n },\n });\n }\n return { values: nextValues, bindings };\n};\n\nconst canonicalizeSpecFetchCredentials = (\n credentials:\n | {\n readonly headers?: Record<string, OpenApiCredentialInput>;\n readonly queryParams?: Record<string, OpenApiCredentialInput>;\n }\n | undefined,\n): {\n readonly credentials?: SourceConfig[\"specFetchCredentials\"];\n readonly bindings: ReadonlyArray<{\n readonly slot: string;\n readonly value: OpenApiSourceBindingValue;\n readonly targetScope?: string;\n }>;\n} => {\n const headers = canonicalizeCredentialMap(credentials?.headers, specFetchHeaderSlotFromName);\n const queryParams = canonicalizeCredentialMap(\n credentials?.queryParams,\n specFetchQueryParamSlotFromName,\n );\n const nextCredentials =\n Object.keys(headers.values).length === 0 && Object.keys(queryParams.values).length === 0\n ? undefined\n : {\n ...(Object.keys(headers.values).length > 0 ? { headers: headers.values } : {}),\n ...(Object.keys(queryParams.values).length > 0\n ? { queryParams: queryParams.values }\n : {}),\n };\n return {\n credentials: nextCredentials,\n bindings: [...headers.bindings, ...queryParams.bindings],\n };\n};\n\nconst canonicalizeOAuth2 = (\n oauth2: OpenApiOAuthInput | undefined,\n): {\n readonly oauth2?: OAuth2SourceConfig;\n readonly bindings: ReadonlyArray<{\n readonly slot: string;\n readonly value: OpenApiSourceBindingValue;\n }>;\n} => {\n if (!oauth2) return { bindings: [] };\n return {\n oauth2,\n bindings: [],\n };\n};\n\ninterface EffectiveSourceConfig {\n readonly config: SourceConfig;\n readonly headersSource: StoredSource;\n readonly queryParamsSource: StoredSource;\n readonly specFetchCredentialsSource: StoredSource;\n readonly oauth2Source: StoredSource;\n}\n\nconst OPENAPI_PLUGIN_ID = \"openapi\";\n\nconst scopeRanks = (ctx: PluginCtx<OpenapiStore>): ReadonlyMap<string, number> =>\n new Map(ctx.scopes.map((scope, index) => [String(scope.id), index]));\n\nconst scopeRank = (ranks: ReadonlyMap<string, number>, scopeId: string): number =>\n ranks.get(scopeId) ?? Infinity;\n\nconst coreBindingToOpenApiBinding = (binding: CredentialBindingRef): OpenApiSourceBindingRef =>\n OpenApiSourceBindingRef.make({\n sourceId: binding.sourceId,\n sourceScopeId: binding.sourceScopeId,\n scopeId: binding.scopeId,\n slot: binding.slotKey,\n value: binding.value,\n createdAt: binding.createdAt,\n updatedAt: binding.updatedAt,\n });\n\nconst listOpenApiSourceBindings = (\n ctx: PluginCtx<OpenapiStore>,\n sourceId: string,\n sourceScope: string,\n): Effect.Effect<readonly OpenApiSourceBindingRef[], StorageFailure> =>\n Effect.gen(function* () {\n const ranks = scopeRanks(ctx);\n const sourceSourceRank = scopeRank(ranks, sourceScope);\n if (sourceSourceRank === Infinity) return [];\n const bindings = yield* ctx.credentialBindings.listForSource({\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId,\n sourceScope: ScopeId.make(sourceScope),\n });\n return bindings\n .filter((binding) => scopeRank(ranks, binding.scopeId) <= sourceSourceRank)\n .map(coreBindingToOpenApiBinding);\n });\n\nconst resolveOpenApiSourceBinding = (\n ctx: PluginCtx<OpenapiStore>,\n sourceId: string,\n sourceScope: string,\n slot: string,\n): Effect.Effect<OpenApiSourceBindingRef | null, StorageFailure> =>\n Effect.gen(function* () {\n const ranks = scopeRanks(ctx);\n const sourceSourceRank = scopeRank(ranks, sourceScope);\n if (sourceSourceRank === Infinity) return null;\n const bindings = yield* ctx.credentialBindings.listForSource({\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId,\n sourceScope: ScopeId.make(sourceScope),\n });\n const binding = bindings\n .filter(\n (candidate) =>\n candidate.slotKey === slot && scopeRank(ranks, candidate.scopeId) <= sourceSourceRank,\n )\n .sort((a, b) => scopeRank(ranks, a.scopeId) - scopeRank(ranks, b.scopeId))[0];\n return binding ? coreBindingToOpenApiBinding(binding) : null;\n });\n\nconst validateOpenApiBindingTarget = (\n ctx: PluginCtx<OpenapiStore>,\n input: {\n readonly sourceScope: string;\n readonly targetScope: string;\n readonly sourceId: string;\n },\n): Effect.Effect<void, StorageFailure> =>\n Effect.gen(function* () {\n const ranks = scopeRanks(ctx);\n const sourceSourceRank = scopeRank(ranks, input.sourceScope);\n const targetRank = scopeRank(ranks, input.targetScope);\n const scopeList = `[${ctx.scopes.map((s) => s.id).join(\", \")}]`;\n if (sourceSourceRank === Infinity) {\n return yield* new StorageError({\n message:\n `OpenAPI source binding references source scope \"${input.sourceScope}\" ` +\n `which is not in the executor's scope stack ${scopeList}.`,\n cause: undefined,\n });\n }\n if (targetRank === Infinity) {\n return yield* new StorageError({\n message:\n `OpenAPI source binding targets scope \"${input.targetScope}\" which is not ` +\n `in the executor's scope stack ${scopeList}.`,\n cause: undefined,\n });\n }\n if (targetRank > sourceSourceRank) {\n return yield* new StorageError({\n message:\n `OpenAPI source bindings for \"${input.sourceId}\" cannot be written at ` +\n `outer scope \"${input.targetScope}\" because the base source lives at ` +\n `\"${input.sourceScope}\"`,\n cause: undefined,\n });\n }\n });\n\nconst targetScopeForBinding = (\n fallbackTargetScope: string | undefined,\n binding: { readonly slot: string; readonly targetScope?: string },\n): Effect.Effect<string, OpenApiOAuthError> => {\n const targetScope = binding.targetScope ?? fallbackTargetScope;\n if (targetScope) return Effect.succeed(targetScope);\n return Effect.fail(\n new OpenApiOAuthError({\n message: \"credentialTargetScope is required when adding direct OpenAPI credentials\",\n }),\n );\n};\n\nconst findOuterSource = (\n ctx: PluginCtx<OpenapiStore>,\n namespace: string,\n scope: string,\n): Effect.Effect<StoredSource | null, StorageFailure> =>\n Effect.gen(function* () {\n const ranks = scopeRanks(ctx);\n const baseRank = scopeRank(ranks, scope);\n for (let index = baseRank + 1; index < ctx.scopes.length; index++) {\n const candidateScope = ctx.scopes[index];\n if (!candidateScope) continue;\n const source = yield* ctx.storage.getSource(namespace, candidateScope.id);\n if (source) return source;\n }\n return null;\n });\n\nconst resolveEffectiveSourceConfig = (\n ctx: PluginCtx<OpenapiStore>,\n base: StoredSource,\n): Effect.Effect<EffectiveSourceConfig, StorageFailure> =>\n Effect.gen(function* () {\n const fallback = yield* findOuterSource(ctx, base.namespace, base.scope);\n\n if (!fallback) {\n return {\n config: base.config,\n headersSource: base,\n queryParamsSource: base,\n specFetchCredentialsSource: base,\n oauth2Source: base,\n };\n }\n\n const hasBaseHeaders = Object.keys(base.config.headers ?? {}).length > 0;\n const hasBaseQueryParams = Object.keys(base.config.queryParams ?? {}).length > 0;\n const hasBaseSpecFetchCredentials = base.config.specFetchCredentials !== undefined;\n return {\n config: {\n ...base.config,\n sourceUrl: base.config.sourceUrl ?? fallback.config.sourceUrl,\n baseUrl: fallback.config.baseUrl,\n namespace: base.config.namespace ?? fallback.config.namespace,\n headers: hasBaseHeaders ? base.config.headers : fallback.config.headers,\n queryParams: hasBaseQueryParams ? base.config.queryParams : fallback.config.queryParams,\n specFetchCredentials:\n base.config.specFetchCredentials ?? fallback.config.specFetchCredentials,\n oauth2: base.config.oauth2 ?? fallback.config.oauth2,\n },\n headersSource: hasBaseHeaders ? base : fallback,\n queryParamsSource: hasBaseQueryParams ? base : fallback,\n specFetchCredentialsSource: hasBaseSpecFetchCredentials ? base : fallback,\n oauth2Source: base.config.oauth2 ? base : fallback,\n };\n });\n\nconst resolveConfiguredValueMap = (\n ctx: PluginCtx<OpenapiStore>,\n params: {\n readonly sourceId: string;\n readonly sourceScope: string;\n readonly values: Record<string, ConfiguredHeaderValue>;\n readonly missingLabel: string;\n },\n): Effect.Effect<Record<string, string>, OpenApiOAuthError | StorageFailure> =>\n Effect.gen(function* () {\n const resolved: Record<string, string> = {};\n for (const [name, value] of Object.entries(params.values)) {\n if (typeof value === \"string\") {\n resolved[name] = value;\n continue;\n }\n const binding = yield* resolveOpenApiSourceBinding(\n ctx,\n params.sourceId,\n params.sourceScope,\n value.slot,\n );\n if (binding?.value.kind === \"secret\") {\n const secret = yield* ctx.secrets\n .getAtScope(binding.value.secretId, binding.value.secretScopeId ?? binding.scopeId)\n .pipe(\n Effect.catchTag(\"SecretOwnedByConnectionError\", () =>\n Effect.fail(\n new OpenApiOAuthError({\n message: `Secret not found for header \"${name}\"`,\n }),\n ),\n ),\n );\n if (secret === null) {\n return yield* new OpenApiOAuthError({\n message: `Missing secret \"${binding.value.secretId}\" for ${params.missingLabel} \"${name}\"`,\n });\n }\n resolved[name] = value.prefix ? `${value.prefix}${secret}` : secret;\n continue;\n }\n if (binding?.value.kind === \"text\") {\n resolved[name] = value.prefix ? `${value.prefix}${binding.value.text}` : binding.value.text;\n continue;\n }\n return yield* new OpenApiOAuthError({\n message: `Missing binding for ${params.missingLabel} \"${name}\"`,\n });\n }\n return resolved;\n });\n\nconst resolveConfiguredHeaders = (\n ctx: PluginCtx<OpenapiStore>,\n params: {\n readonly sourceId: string;\n readonly sourceScope: string;\n readonly headers: Record<string, ConfiguredHeaderValue>;\n },\n): Effect.Effect<Record<string, string>, OpenApiOAuthError | StorageFailure> =>\n resolveConfiguredValueMap(ctx, {\n sourceId: params.sourceId,\n sourceScope: params.sourceScope,\n values: params.headers,\n missingLabel: \"header\",\n });\n\nconst resolveSecretBackedValues = (\n ctx: PluginCtx<OpenapiStore>,\n values: Record<string, HeaderValue> | undefined,\n): Effect.Effect<Record<string, string>, OpenApiOAuthError | StorageFailure> =>\n resolveSecretBackedMap({\n values,\n getSecret: ctx.secrets.get,\n onMissing: (name) =>\n new OpenApiOAuthError({\n message: `Secret not found for \"${name}\"`,\n }),\n onError: (err, name) =>\n Predicate.isTagged(\"SecretOwnedByConnectionError\")(err)\n ? new OpenApiOAuthError({\n message: `Secret not found for \"${name}\"`,\n })\n : err,\n }).pipe(\n Effect.mapError((err) =>\n Predicate.isTagged(\"SecretOwnedByConnectionError\")(err)\n ? new OpenApiOAuthError({ message: \"Secret resolution failed\" })\n : err,\n ),\n Effect.map((resolved) => resolved ?? {}),\n );\n\nconst resolveOAuthConnectionId = (\n ctx: PluginCtx<OpenapiStore>,\n params: {\n readonly sourceId: string;\n readonly sourceScope: string;\n readonly oauth2: OAuth2SourceConfig;\n },\n): Effect.Effect<\n { readonly connectionId: string; readonly scopeId: string } | null,\n StorageFailure\n> =>\n Effect.gen(function* () {\n const binding = yield* resolveOpenApiSourceBinding(\n ctx,\n params.sourceId,\n params.sourceScope,\n params.oauth2.connectionSlot,\n );\n if (binding?.value.kind === \"connection\") {\n const connectionId = binding.value.connectionId;\n const connection = yield* ctx.connections.getAtScope(connectionId, binding.scopeId);\n return connection ? { connectionId, scopeId: binding.scopeId } : null;\n }\n return null;\n });\n\nconst resolveSpecFetchInputCredentials = (\n ctx: PluginCtx<OpenapiStore>,\n credentials: OpenApiSpecFetchCredentialsInput | undefined,\n) =>\n Effect.gen(function* () {\n if (!credentials) return undefined;\n return {\n headers: yield* resolveSecretBackedValues(ctx, credentials.headers),\n queryParams: yield* resolveSecretBackedValues(ctx, credentials.queryParams),\n };\n });\n\nconst resolveStoredSpecFetchCredentials = (\n ctx: PluginCtx<OpenapiStore>,\n params: {\n readonly sourceId: string;\n readonly sourceScope: string;\n readonly credentials: SourceConfig[\"specFetchCredentials\"] | undefined;\n },\n) =>\n Effect.gen(function* () {\n if (!params.credentials) return undefined;\n return {\n headers: yield* resolveConfiguredValueMap(ctx, {\n sourceId: params.sourceId,\n sourceScope: params.sourceScope,\n values: params.credentials.headers ?? {},\n missingLabel: \"spec fetch header\",\n }),\n queryParams: yield* resolveConfiguredValueMap(ctx, {\n sourceId: params.sourceId,\n sourceScope: params.sourceScope,\n values: params.credentials.queryParams ?? {},\n missingLabel: \"spec fetch query parameter\",\n }),\n };\n });\n\n// ---------------------------------------------------------------------------\n// OAuth2 token exchange / refresh is owned by `ctx.oauth`, which registers\n// the canonical core `\"oauth2\"` ConnectionProvider. OpenAPI owns only the\n// source-specific semantics: slots for client credentials and the connection\n// binding that invocation resolves before calling `ctx.connections.accessToken`.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Plugin factory\n// ---------------------------------------------------------------------------\n\nexport interface OpenApiPluginOptions {\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient, never, never>;\n /** If provided, source add/remove is mirrored to executor.jsonc\n * (best-effort — file errors are logged, not raised). */\n readonly configFile?: ConfigFileSink;\n}\n\nconst toOpenApiSourceConfig = (\n namespace: string,\n config: OpenApiSpecConfig,\n): OpenApiSourceConfig => {\n const configHeaders: Record<string, HeaderValueValue> = {};\n for (const [name, value] of Object.entries(config.headers ?? {})) {\n if (typeof value === \"string\" || !(\"kind\" in value)) {\n configHeaders[name] = value;\n }\n }\n return {\n kind: \"openapi\",\n spec: config.spec,\n baseUrl: config.baseUrl,\n namespace,\n headers: headersToConfigValues(\n Object.keys(configHeaders).length > 0 ? configHeaders : undefined,\n ),\n };\n};\n\nconst isHttpUrl = (s: string): boolean => s.startsWith(\"http://\") || s.startsWith(\"https://\");\n\nexport const openApiPlugin = definePlugin((options?: OpenApiPluginOptions) => {\n type RebuildInput = {\n readonly specText: string;\n readonly scope: string;\n readonly sourceUrl?: string;\n readonly name?: string;\n readonly baseUrl?: string;\n readonly namespace?: string;\n readonly headers?: Record<string, OpenApiHeaderInput>;\n readonly queryParams?: Record<string, OpenApiCredentialInput>;\n readonly specFetchCredentials?: {\n readonly headers?: Record<string, OpenApiCredentialInput>;\n readonly queryParams?: Record<string, OpenApiCredentialInput>;\n };\n readonly oauth2?: OpenApiOAuthInput;\n readonly credentialTargetScope?: string;\n };\n\n // ctx comes from the plugin runtime — the same instance is passed to\n // `extension(ctx)` and to every lifecycle hook (`refreshSource`, etc.),\n // so helpers parameterised on ctx can be called from either surface.\n const rebuildSource = (ctx: PluginCtx<OpenapiStore>, input: RebuildInput) =>\n Effect.gen(function* () {\n const doc = yield* parse(input.specText);\n const result = yield* extract(doc);\n\n const namespace =\n input.namespace ??\n Option.getOrElse(result.title, () => \"api\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\");\n const outerSource = yield* findOuterSource(ctx, namespace, input.scope);\n if (outerSource && input.baseUrl !== undefined && input.baseUrl.trim() !== \"\") {\n return yield* new OpenApiOAuthError({\n message: \"OpenAPI source shadows inherit the outer source base URL\",\n });\n }\n\n const hoistedDefs: Record<string, unknown> = {};\n if (doc.components?.schemas) {\n for (const [k, v] of Object.entries(doc.components.schemas)) {\n hoistedDefs[k] = normalizeOpenApiRefs(v);\n }\n }\n\n const baseUrl = outerSource ? undefined : (input.baseUrl ?? resolveBaseUrl(result.servers));\n const canonicalHeaders = canonicalizeHeaders(input.headers);\n const canonicalQueryParams = canonicalizeCredentialMap(\n input.queryParams,\n queryParamSlotFromName,\n );\n const canonicalSpecFetchCredentials = canonicalizeSpecFetchCredentials(\n input.specFetchCredentials,\n );\n const canonicalOAuth2 = canonicalizeOAuth2(input.oauth2);\n const directBindings = [\n ...canonicalHeaders.bindings,\n ...canonicalQueryParams.bindings,\n ...canonicalSpecFetchCredentials.bindings,\n ...canonicalOAuth2.bindings,\n ];\n for (const binding of directBindings) {\n const bindingTargetScope = yield* targetScopeForBinding(\n input.credentialTargetScope,\n binding,\n );\n yield* validateOpenApiBindingTarget(ctx, {\n sourceId: namespace,\n sourceScope: input.scope,\n targetScope: bindingTargetScope,\n });\n }\n const definitions = compileToolDefinitions(result.operations);\n const sourceName = input.name ?? Option.getOrElse(result.title, () => namespace);\n\n const sourceConfig: SourceConfig = {\n spec: input.specText,\n sourceUrl: input.sourceUrl,\n baseUrl,\n namespace: input.namespace,\n headers: canonicalHeaders.headers,\n queryParams: canonicalQueryParams.values,\n specFetchCredentials: canonicalSpecFetchCredentials.credentials,\n oauth2: canonicalOAuth2.oauth2,\n };\n\n const storedSource: StoredSource = {\n namespace,\n scope: input.scope,\n name: sourceName,\n config: sourceConfig,\n };\n\n const storedOps: StoredOperation[] = definitions.map((def) => ({\n toolId: `${namespace}.${def.toolPath}`,\n sourceId: namespace,\n binding: toBinding(def),\n }));\n\n yield* ctx.transaction(\n Effect.gen(function* () {\n yield* ctx.storage.upsertSource(storedSource, storedOps);\n yield* ctx.core.sources.register({\n id: namespace,\n scope: input.scope,\n kind: \"openapi\",\n name: sourceName,\n url: baseUrl || undefined,\n canRemove: true,\n // `canRefresh` reflects whether we still know the\n // origin URL — sources added from raw spec text have\n // nothing to re-fetch, so refresh stays disabled.\n canRefresh: input.sourceUrl != null,\n canEdit: true,\n tools: definitions.map((def) => ({\n name: def.toolPath,\n description: descriptionFor(def),\n inputSchema: normalizeOpenApiRefs(Option.getOrUndefined(def.operation.inputSchema)),\n outputSchema: normalizeOpenApiRefs(Option.getOrUndefined(def.operation.outputSchema)),\n })),\n });\n\n if (directBindings.length > 0) {\n for (const binding of directBindings) {\n const bindingTargetScope = yield* targetScopeForBinding(\n input.credentialTargetScope,\n binding,\n );\n yield* ctx.credentialBindings.set({\n targetScope: ScopeId.make(bindingTargetScope),\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId: namespace,\n sourceScope: ScopeId.make(input.scope),\n slotKey: binding.slot,\n value: binding.value,\n });\n }\n }\n\n if (Object.keys(hoistedDefs).length > 0) {\n yield* ctx.core.definitions.register({\n sourceId: namespace,\n scope: input.scope,\n definitions: hoistedDefs,\n });\n }\n }),\n );\n\n return { sourceId: namespace, toolCount: definitions.length };\n });\n\n // No-op for missing sources and for sources added from raw spec\n // text (no URL to re-fetch from). UIs gate the action via\n // `canRefresh` on the source row; reaching here without a URL\n // means the caller bypassed that gate, so we stay quiet rather\n // than surface a 500 through the unwhitelisted error channel.\n const refreshSourceInternal = (ctx: PluginCtx<OpenapiStore>, sourceId: string, scope: string) =>\n Effect.gen(function* () {\n const httpClientLayer = options?.httpClientLayer ?? ctx.httpClientLayer;\n const existing = yield* ctx.storage.getSource(sourceId, scope);\n if (!existing) return;\n const effective = yield* resolveEffectiveSourceConfig(ctx, existing);\n const resolvedConfig = effective.config;\n const sourceUrl = resolvedConfig.sourceUrl;\n if (!sourceUrl) return;\n const credentials = yield* resolveStoredSpecFetchCredentials(ctx, {\n sourceId: existing.namespace,\n sourceScope: effective.specFetchCredentialsSource.scope,\n credentials: resolvedConfig.specFetchCredentials,\n });\n const specText = yield* resolveSpecText(sourceUrl, credentials).pipe(\n Effect.provide(httpClientLayer),\n );\n yield* rebuildSource(ctx, {\n specText,\n scope,\n sourceUrl,\n name: existing.name,\n baseUrl: resolvedConfig.baseUrl,\n namespace: existing.namespace,\n headers: existing.config.headers,\n queryParams: existing.config.queryParams,\n specFetchCredentials: existing.config.specFetchCredentials,\n oauth2: existing.config.oauth2,\n credentialTargetScope: scope,\n });\n });\n\n return {\n id: \"openapi\" as const,\n packageName: \"@executor-js/plugin-openapi\",\n schema: openapiSchema,\n storage: (deps): OpenapiStore => makeDefaultOpenapiStore(deps),\n\n extension: (ctx) => {\n const httpClientLayer = options?.httpClientLayer ?? ctx.httpClientLayer;\n const addSpecInternal = (config: OpenApiSpecConfig) =>\n Effect.gen(function* () {\n // Resolve URL → text and parse BEFORE opening a transaction.\n // Holding `BEGIN` on the pool=1 Postgres connection across a\n // network fetch is the Hyperdrive deadlock path in production.\n const credentials = yield* resolveSpecFetchInputCredentials(\n ctx,\n config.specFetchCredentials,\n );\n const specText = yield* resolveSpecText(config.spec, credentials).pipe(\n Effect.provide(httpClientLayer),\n );\n return yield* rebuildSource(ctx, {\n specText,\n scope: config.scope,\n sourceUrl: isHttpUrl(config.spec) ? config.spec : undefined,\n name: config.name,\n baseUrl: config.baseUrl,\n namespace: config.namespace,\n headers: config.headers,\n queryParams: config.queryParams,\n specFetchCredentials: config.specFetchCredentials,\n oauth2: config.oauth2,\n // Default to the source's own scope. refreshSource and editSource\n // do the same; without this, config-sync's addSpec — which never\n // passes the field — fails with \"credentialTargetScope is\n // required\" the moment the jsonc declares any header secret.\n credentialTargetScope: config.credentialTargetScope ?? config.scope,\n });\n });\n\n const configFile = options?.configFile;\n\n return {\n previewSpec: (input: string | OpenApiPreviewInput) =>\n Effect.gen(function* () {\n const previewInput = typeof input === \"string\" ? { spec: input } : input;\n const credentials = yield* resolveSpecFetchInputCredentials(\n ctx,\n previewInput.specFetchCredentials,\n );\n const specText = yield* resolveSpecText(previewInput.spec, credentials).pipe(\n Effect.provide(httpClientLayer),\n );\n return yield* previewSpec(specText).pipe(Effect.provide(httpClientLayer));\n }),\n\n addSpec: (config: OpenApiSpecConfig) =>\n Effect.gen(function* () {\n const result = yield* addSpecInternal(config);\n if (configFile) {\n yield* configFile.upsertSource(toOpenApiSourceConfig(result.sourceId, config));\n }\n return result;\n }),\n\n removeSpec: (namespace: string, scope: string) =>\n Effect.gen(function* () {\n yield* ctx.transaction(\n Effect.gen(function* () {\n yield* ctx.credentialBindings.removeForSource({\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId: namespace,\n sourceScope: ScopeId.make(scope),\n });\n yield* ctx.storage.removeSource(namespace, scope);\n yield* ctx.core.sources.unregister({\n id: namespace,\n targetScope: scope,\n });\n }),\n );\n if (configFile) {\n yield* configFile.removeSource(namespace);\n }\n }),\n\n getSource: (namespace: string, scope: string) =>\n Effect.gen(function* () {\n const source = yield* ctx.storage.getSource(namespace, scope);\n if (!source) return null;\n const effective = yield* resolveEffectiveSourceConfig(ctx, source);\n return {\n ...source,\n config: effective.config,\n };\n }),\n\n updateSource: (namespace: string, scope: string, input: OpenApiUpdateSourceInput) =>\n Effect.gen(function* () {\n const existing = yield* ctx.storage.getSource(namespace, scope);\n if (!existing) return;\n const canonicalHeaders =\n input.headers !== undefined ? canonicalizeHeaders(input.headers) : null;\n const canonicalOAuth2 =\n input.oauth2 !== undefined ? canonicalizeOAuth2(input.oauth2) : null;\n const canonicalQueryParams =\n input.queryParams !== undefined\n ? canonicalizeCredentialMap(input.queryParams, queryParamSlotFromName)\n : null;\n const directBindings = [\n ...(canonicalHeaders?.bindings ?? []),\n ...(canonicalQueryParams?.bindings ?? []),\n ...(canonicalOAuth2?.bindings ?? []),\n ];\n const affectedPrefixes = [\n ...(input.headers !== undefined ? [\"header:\"] : []),\n ...(input.queryParams !== undefined ? [\"query_param:\"] : []),\n ...(input.oauth2 !== undefined ? [\"oauth2:\"] : []),\n ];\n const targetScope = input.credentialTargetScope ?? scope;\n if (input.baseUrl !== undefined && input.baseUrl.trim() !== \"\") {\n const outerSource = yield* findOuterSource(ctx, namespace, scope);\n if (outerSource) {\n return yield* new OpenApiOAuthError({\n message: \"OpenAPI source shadows inherit the outer source base URL\",\n });\n }\n }\n if (affectedPrefixes.length > 0 || directBindings.length > 0) {\n yield* validateOpenApiBindingTarget(ctx, {\n sourceId: namespace,\n sourceScope: scope,\n targetScope,\n });\n }\n yield* ctx.transaction(\n Effect.gen(function* () {\n yield* ctx.storage.updateSourceMeta(namespace, scope, {\n name: input.name?.trim() || undefined,\n baseUrl: input.baseUrl,\n headers: canonicalHeaders?.headers,\n queryParams: canonicalQueryParams?.values,\n oauth2: canonicalOAuth2?.oauth2,\n });\n if (affectedPrefixes.length > 0 || directBindings.length > 0) {\n yield* ctx.credentialBindings.replaceForSource({\n targetScope: ScopeId.make(targetScope),\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId: namespace,\n sourceScope: ScopeId.make(scope),\n slotPrefixes: affectedPrefixes,\n bindings: directBindings.map((binding) => ({\n slotKey: binding.slot,\n value: binding.value,\n })),\n });\n }\n }),\n );\n }),\n\n listSourceBindings: (sourceId: string, sourceScope: string) =>\n listOpenApiSourceBindings(ctx, sourceId, sourceScope),\n\n setSourceBinding: (input: OpenApiSourceBindingInput) =>\n Effect.gen(function* () {\n yield* validateOpenApiBindingTarget(ctx, {\n sourceId: input.sourceId,\n sourceScope: input.sourceScope,\n targetScope: input.scope,\n });\n const binding = yield* ctx.credentialBindings.set({\n targetScope: input.scope,\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId: input.sourceId,\n sourceScope: input.sourceScope,\n slotKey: input.slot,\n value: input.value,\n });\n return coreBindingToOpenApiBinding(binding);\n }),\n\n removeSourceBinding: (sourceId: string, sourceScope: string, slot: string, scope: string) =>\n Effect.gen(function* () {\n yield* validateOpenApiBindingTarget(ctx, {\n sourceId,\n sourceScope,\n targetScope: scope,\n });\n yield* ctx.credentialBindings.remove({\n targetScope: ScopeId.make(scope),\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId,\n sourceScope: ScopeId.make(sourceScope),\n slotKey: slot,\n });\n }),\n };\n },\n\n staticSources: (self) => [\n {\n id: \"openapi\",\n kind: \"executor\",\n name: \"OpenAPI\",\n tools: [\n tool({\n name: \"previewSpec\",\n description: \"Preview an OpenAPI document before adding it as a source\",\n inputSchema: PreviewSpecInputStandardSchema,\n execute: (input) => self.previewSpec(input),\n }),\n tool({\n name: \"addSource\",\n description: \"Add an OpenAPI source and register its operations as tools\",\n annotations: {\n requiresApproval: true,\n approvalDescription: \"Add an OpenAPI source\",\n },\n inputSchema: AddSourceInputStandardSchema,\n outputSchema: AddSourceOutputStandardSchema,\n execute: (input) => self.addSpec(input),\n }),\n ],\n },\n ],\n\n invokeTool: ({ ctx, toolRow, args }) =>\n Effect.gen(function* () {\n const httpClientLayer = options?.httpClientLayer ?? ctx.httpClientLayer;\n // toolRow.scope_id is the resolved owning scope of the tool\n // (innermost-wins from the executor's stack). The matching\n // openapi_operation + openapi_source rows live at the same\n // scope, so pin every store lookup to it instead of relying\n // on the scoped adapter's stack-wide fall-through.\n const toolScope = toolRow.scope_id;\n const op = yield* ctx.storage.getOperationByToolId(toolRow.id, toolScope);\n if (!op) {\n return yield* new OpenApiExtractionError({\n message: `No OpenAPI operation found for tool \"${toolRow.id}\"`,\n });\n }\n const source = yield* ctx.storage.getSource(op.sourceId, toolScope);\n if (!source) {\n return yield* new OpenApiExtractionError({\n message: `No OpenAPI source found for \"${op.sourceId}\"`,\n });\n }\n\n const effective = yield* resolveEffectiveSourceConfig(ctx, source);\n const config = effective.config;\n const resolvedHeaders = yield* resolveConfiguredHeaders(ctx, {\n sourceId: op.sourceId,\n sourceScope: effective.headersSource.scope,\n headers: config.headers ?? {},\n });\n const resolvedQueryParams = yield* resolveConfiguredValueMap(ctx, {\n sourceId: op.sourceId,\n sourceScope: effective.queryParamsSource.scope,\n values: config.queryParams ?? {},\n missingLabel: \"query parameter\",\n });\n\n // If the source has OAuth2 auth, resolve a guaranteed-fresh\n // access token from the backing Connection and inject the\n // Authorization header (wins over a manually-set one). All the\n // refresh complexity lives in the SDK — the plugin just asks.\n if (config.oauth2) {\n const connection = yield* resolveOAuthConnectionId(ctx, {\n sourceId: op.sourceId,\n sourceScope: effective.oauth2Source.scope,\n oauth2: config.oauth2,\n });\n if (!connection) {\n return yield* new OpenApiOAuthError({\n message: `OAuth configuration for \"${op.sourceId}\" is missing a connection binding`,\n });\n }\n const accessToken = yield* ctx.connections\n .accessTokenAtScope(connection.connectionId, connection.scopeId)\n .pipe(\n Effect.mapError(\n () =>\n new OpenApiOAuthError({\n message: \"OAuth connection resolution failed\",\n }),\n ),\n );\n resolvedHeaders.authorization = `Bearer ${accessToken}`;\n }\n\n const result = yield* invokeWithLayer(\n op.binding,\n (args ?? {}) as Record<string, unknown>,\n config.baseUrl ?? \"\",\n resolvedHeaders,\n resolvedQueryParams,\n httpClientLayer,\n );\n\n return result;\n }),\n\n resolveAnnotations: ({ ctx, sourceId, toolRows }) =>\n Effect.gen(function* () {\n // toolRows for a single (plugin_id, source_id) group can still\n // straddle multiple scopes when the source is shadowed (e.g. an\n // org-level openapi source plus a per-user override that\n // re-registers the same tool ids). Run one listOperationsBySource\n // per distinct scope so each lookup pins {source_id, scope_id}\n // and we don't fall through to the wrong scope's bindings.\n const scopes = new Set<string>();\n for (const row of toolRows as readonly ToolRow[]) {\n scopes.add(row.scope_id);\n }\n // One listOperationsBySource per scope is independent storage\n // work; run them in parallel so a shadowed source doesn't\n // serialise two ~200ms reads back-to-back in the caller's\n // `executor.tools.list.annotations` span.\n const entries = yield* Effect.forEach(\n [...scopes],\n (scope) =>\n Effect.gen(function* () {\n const ops = yield* ctx.storage.listOperationsBySource(sourceId, scope);\n const byId = new Map<string, OperationBinding>();\n for (const op of ops) byId.set(op.toolId, op.binding);\n return [scope, byId] as const;\n }),\n { concurrency: \"unbounded\" },\n );\n const byScope = new Map<string, Map<string, OperationBinding>>(entries);\n\n const out: Record<string, ToolAnnotations> = {};\n for (const row of toolRows as readonly ToolRow[]) {\n const binding = byScope.get(row.scope_id)?.get(row.id);\n if (binding) {\n out[row.id] = annotationsForOperation(binding.method, binding.pathTemplate);\n }\n }\n return out;\n }),\n\n removeSource: ({ ctx, sourceId, scope }) =>\n Effect.gen(function* () {\n yield* ctx.transaction(\n Effect.gen(function* () {\n yield* ctx.credentialBindings.removeForSource({\n pluginId: OPENAPI_PLUGIN_ID,\n sourceId,\n sourceScope: ScopeId.make(scope),\n });\n yield* ctx.storage.removeSource(sourceId, scope);\n }),\n );\n if (options?.configFile) {\n yield* options.configFile.removeSource(sourceId);\n }\n }),\n\n // OpenAPI credential usages are reported by the core `credential_binding`\n // table. Source storage carries only source-owned slot structure.\n usagesForSecret: () => Effect.succeed([]),\n\n usagesForConnection: () => Effect.succeed([]),\n\n // Re-fetch the spec from its origin URL (captured at addSpec time)\n // and replay the same parse → extract → upsertSource → register\n // path used by addSpec. Sources without a stored URL surface a\n // typed `OpenApiParseError` — the executor only dispatches refresh\n // when `canRefresh: true`, so a raw-text source reaching here\n // means stale UI state, which is worth surfacing to the caller.\n refreshSource: ({ ctx, sourceId, scope }) => refreshSourceInternal(ctx, sourceId, scope),\n\n detect: ({ ctx, url }) =>\n Effect.gen(function* () {\n const httpClientLayer = options?.httpClientLayer ?? ctx.httpClientLayer;\n const trimmed = url.trim();\n if (!trimmed) return null;\n const parsed = yield* Effect.try({\n try: () => new URL(trimmed),\n catch: (error) => error,\n }).pipe(Effect.option);\n if (Option.isNone(parsed)) return null;\n const specText = yield* resolveSpecText(trimmed).pipe(\n Effect.provide(httpClientLayer),\n Effect.catch(() => Effect.succeed(null)),\n );\n if (specText === null) return null;\n const doc = yield* parse(specText).pipe(Effect.catch(() => Effect.succeed(null)));\n if (!doc) return null;\n const result = yield* extract(doc).pipe(Effect.catch(() => Effect.succeed(null)));\n if (!result) return null;\n const namespace = Option.getOrElse(result.title, () => \"api\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\");\n const name = Option.getOrElse(result.title, () => namespace);\n return SourceDetectionResult.make({\n kind: \"openapi\",\n confidence: \"high\",\n endpoint: trimmed,\n name,\n namespace,\n });\n }),\n };\n // HTTP transport (routes/handlers/extensionService) is layered on by\n // the api-aware factory in `@executor-js/plugin-openapi/api`. Hosts that\n // want the HTTP surface import the plugin from there; SDK-only\n // consumers stay on this entry and avoid the server-only deps.\n});\n","/**\n * Derives structured `group.leaf` tool paths from extracted OpenAPI operations.\n *\n * Ported from the v3 executor's `definitions.ts`. Turns flat operation IDs like\n * `zones_listZones` into nested paths like `zones.listZones` that the tree UI\n * can render with proper nesting.\n */\n\nimport type { ExtractedOperation } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Word / case utilities\n// ---------------------------------------------------------------------------\n\nconst splitWords = (value: string): string[] =>\n value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, \"$1 $2\")\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter((part) => part.length > 0);\n\nconst normalizeWord = (value: string): string => value.toLowerCase();\n\nconst toCamelCase = (value: string): string => {\n const words = splitWords(value).map(normalizeWord);\n if (words.length === 0) return \"tool\";\n const [first, ...rest] = words;\n return `${first}${rest.map((p) => `${p[0]?.toUpperCase() ?? \"\"}${p.slice(1)}`).join(\"\")}`;\n};\n\nconst toPascalCase = (value: string): string => {\n const camel = toCamelCase(value);\n return `${camel[0]?.toUpperCase() ?? \"\"}${camel.slice(1)}`;\n};\n\n// ---------------------------------------------------------------------------\n// Path utilities\n// ---------------------------------------------------------------------------\n\nconst VERSION_SEGMENT_REGEX = /^v\\d+(?:[._-]\\d+)?$/i;\nconst IGNORED_PATH_SEGMENTS = new Set([\"api\"]);\n\nconst pathSegmentsFromTemplate = (pathTemplate: string): string[] =>\n pathTemplate\n .split(\"/\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\nconst isPathParameterSegment = (segment: string): boolean =>\n segment.startsWith(\"{\") && segment.endsWith(\"}\");\n\nconst normalizeGroupSegment = (value: string | undefined): string | null => {\n const candidate = value?.trim();\n if (!candidate) return null;\n return toCamelCase(candidate);\n};\n\n// ---------------------------------------------------------------------------\n// Derivation\n// ---------------------------------------------------------------------------\n\nconst deriveVersionSegment = (pathTemplate: string): string | undefined =>\n pathSegmentsFromTemplate(pathTemplate)\n .map((s) => s.toLowerCase())\n .find((s) => VERSION_SEGMENT_REGEX.test(s));\n\nconst derivePathGroup = (pathTemplate: string): string => {\n for (const segment of pathSegmentsFromTemplate(pathTemplate)) {\n const lower = segment.toLowerCase();\n if (VERSION_SEGMENT_REGEX.test(lower)) continue;\n if (IGNORED_PATH_SEGMENTS.has(lower)) continue;\n if (isPathParameterSegment(segment)) continue;\n return normalizeGroupSegment(segment) ?? \"root\";\n }\n return \"root\";\n};\n\nconst splitOperationIdSegments = (value: string): string[] =>\n value\n .split(/[/.]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\nconst deriveLeafSeed = (operationId: string, group: string): string => {\n const segments = splitOperationIdSegments(operationId);\n if (segments.length > 1) {\n const [first, ...rest] = segments;\n if ((normalizeGroupSegment(first) ?? first) === group && rest.length > 0) {\n return rest.join(\" \");\n }\n }\n return operationId;\n};\n\nconst fallbackLeafSeed = (method: string, pathTemplate: string, group: string): string => {\n const relevantSegments = pathSegmentsFromTemplate(pathTemplate)\n .filter((s) => !VERSION_SEGMENT_REGEX.test(s.toLowerCase()))\n .filter((s) => !IGNORED_PATH_SEGMENTS.has(s.toLowerCase()))\n .filter((s) => !isPathParameterSegment(s))\n .map((s) => normalizeGroupSegment(s) ?? s)\n .filter((s) => s !== group);\n\n const segmentSuffix = relevantSegments.map((s) => toPascalCase(s)).join(\"\");\n return `${method}${segmentSuffix || \"Operation\"}`;\n};\n\nconst deriveLeaf = (\n operationId: string,\n method: string,\n pathTemplate: string,\n group: string,\n): string => {\n const preferred = toCamelCase(deriveLeafSeed(operationId, group));\n if (preferred.length > 0 && preferred !== group) return preferred;\n return toCamelCase(fallbackLeafSeed(method, pathTemplate, group));\n};\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ToolDefinition {\n /** Dot-separated path like `zones.listZones` */\n readonly toolPath: string;\n /** The group segment */\n readonly group: string;\n /** The leaf segment */\n readonly leaf: string;\n /** Index into the original operations array */\n readonly operationIndex: number;\n /** The original operation */\n readonly operation: ExtractedOperation;\n}\n\n// ---------------------------------------------------------------------------\n// Collision resolution\n// ---------------------------------------------------------------------------\n\nconst resolveCollisions = (\n definitions: {\n toolPath: string;\n group: string;\n leaf: string;\n versionSegment: string | undefined;\n method: string;\n operationHash: string;\n operationIndex: number;\n operation: ExtractedOperation;\n }[],\n): ToolDefinition[] => {\n // Mutable — we progressively refine toolPath on collision\n const staged = definitions.map((d) => ({ ...d }));\n\n const applyFactory = (items: typeof staged, factory: (d: (typeof staged)[number]) => string) => {\n const byPath = new Map<string, typeof staged>();\n for (const item of items) {\n const bucket = byPath.get(item.toolPath) ?? [];\n bucket.push(item);\n byPath.set(item.toolPath, bucket);\n }\n for (const bucket of byPath.values()) {\n if (bucket.length < 2) continue;\n for (const d of bucket) {\n d.toolPath = factory(d);\n }\n }\n };\n\n // Round 1: add version segment\n applyFactory(staged, (d) =>\n d.versionSegment ? `${d.group}.${d.versionSegment}.${d.leaf}` : d.toolPath,\n );\n\n // Round 2: add method suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment ? `${d.group}.${d.versionSegment}` : d.group;\n return `${prefix}.${d.leaf}${toPascalCase(d.method)}`;\n });\n\n // Round 3: add hash suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment ? `${d.group}.${d.versionSegment}` : d.group;\n return `${prefix}.${d.leaf}${toPascalCase(d.method)}${d.operationHash.slice(0, 8)}`;\n });\n\n return staged.map((d) => ({\n toolPath: d.toolPath,\n group: d.group,\n leaf: d.leaf,\n operationIndex: d.operationIndex,\n operation: d.operation,\n }));\n};\n\n// ---------------------------------------------------------------------------\n// Stable hash (simple, deterministic)\n// ---------------------------------------------------------------------------\n\nconst stableHash = (value: unknown): string => {\n const str = JSON.stringify(value, Object.keys(value as Record<string, unknown>).sort());\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash).toString(36).padStart(8, \"0\");\n};\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Compile extracted operations into tool definitions with structured\n * `group.leaf` paths suitable for tree rendering.\n */\nexport const compileToolDefinitions = (\n operations: readonly ExtractedOperation[],\n): ToolDefinition[] => {\n const raw = operations.map((op, index) => {\n const operationId = op.operationId;\n const group = normalizeGroupSegment(op.tags[0]) ?? derivePathGroup(op.pathTemplate);\n const leaf = deriveLeaf(operationId, op.method, op.pathTemplate, group);\n const versionSegment = deriveVersionSegment(op.pathTemplate);\n const operationHash = stableHash({\n method: op.method,\n path: op.pathTemplate,\n operationId,\n });\n\n return {\n toolPath: `${group}.${leaf}`,\n group,\n leaf,\n versionSegment,\n method: op.method,\n operationHash,\n operationIndex: index,\n operation: op,\n };\n });\n\n return resolveCollisions(raw).sort((a, b) => a.toolPath.localeCompare(b.toolPath));\n};\n"],"mappings":"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","names":["bytes","Effect","Option","changed","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()] = ConfiguredHeaderBinding.make({\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] = ConfiguredHeaderBinding.make({\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 ? OAuth2SourceConfig.make({\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: OpenApiSourceBindingInput.make({\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: OpenApiSourceBindingInput.make({\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: OpenApiSourceBindingInput.make({\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: OpenApiSourceBindingInput.make({\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: OpenApiSourceBindingInput.make({\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":"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","names":["CardStack","CardStackContent","CardStackEntryField","jsx","jsxs","value","CardStack","CardStackContent","CardStackEntryField"]}
|
|
File without changes
|