@executor-js/plugin-openapi 1.4.28 → 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.
Files changed (45) hide show
  1. package/dist/{AddOpenApiSource-FLMNI742.js → AddOpenApiSource-KSOMPQ2R.js} +4 -4
  2. package/dist/{EditOpenApiSource-I4NIGIIJ.js → EditOpenApiSource-AOA7APR2.js} +301 -192
  3. package/dist/EditOpenApiSource-AOA7APR2.js.map +1 -0
  4. package/dist/{OpenApiSourceSummary-CM46DB4L.js → OpenApiSourceSummary-Y3S6ZBOZ.js} +4 -4
  5. package/dist/OpenApiSourceSummary-Y3S6ZBOZ.js.map +1 -0
  6. package/dist/api/group.d.ts +124 -118
  7. package/dist/api/index.d.ts +148 -369
  8. package/dist/chunk-BB5IAKRG.js +136 -0
  9. package/dist/chunk-BB5IAKRG.js.map +1 -0
  10. package/dist/{chunk-E7PZ2QGD.js → chunk-EOXXE5DG.js} +17 -455
  11. package/dist/chunk-EOXXE5DG.js.map +1 -0
  12. package/dist/{chunk-OZ67JNID.js → chunk-NIKLYJ3X.js} +830 -319
  13. package/dist/chunk-NIKLYJ3X.js.map +1 -0
  14. package/dist/{chunk-TGDT6QCH.js → chunk-YJMXYKYX.js} +178 -117
  15. package/dist/chunk-YJMXYKYX.js.map +1 -0
  16. package/dist/{chunk-GFQUEZUW.js → chunk-ZZBTLFTA.js} +78 -93
  17. package/dist/chunk-ZZBTLFTA.js.map +1 -0
  18. package/dist/client.js +7 -137
  19. package/dist/client.js.map +1 -1
  20. package/dist/core.js +5 -10
  21. package/dist/index.js +3 -2
  22. package/dist/react/atoms.d.ts +83 -223
  23. package/dist/react/client.d.ts +123 -117
  24. package/dist/sdk/credential-status.d.ts +3 -3
  25. package/dist/sdk/extract.d.ts +19 -19
  26. package/dist/sdk/index.d.ts +2 -2
  27. package/dist/sdk/invoke.d.ts +7 -7
  28. package/dist/sdk/parse.d.ts +2 -3
  29. package/dist/sdk/plugin.d.ts +181 -275
  30. package/dist/sdk/preview.d.ts +12 -12
  31. package/dist/sdk/source-contracts.d.ts +55 -0
  32. package/dist/sdk/store.d.ts +6 -269
  33. package/dist/sdk/types.d.ts +16 -65
  34. package/dist/testing/index.d.ts +149 -11
  35. package/dist/testing.js +419 -33
  36. package/dist/testing.js.map +1 -1
  37. package/dist/testing.test.d.ts +1 -0
  38. package/package.json +3 -4
  39. package/dist/EditOpenApiSource-I4NIGIIJ.js.map +0 -1
  40. package/dist/OpenApiSourceSummary-CM46DB4L.js.map +0 -1
  41. package/dist/chunk-E7PZ2QGD.js.map +0 -1
  42. package/dist/chunk-GFQUEZUW.js.map +0 -1
  43. package/dist/chunk-OZ67JNID.js.map +0 -1
  44. package/dist/chunk-TGDT6QCH.js.map +0 -1
  45. /package/dist/{AddOpenApiSource-FLMNI742.js.map → AddOpenApiSource-KSOMPQ2R.js.map} +0 -0
@@ -0,0 +1 @@
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 Effect from \"effect/Effect\";\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 {\n ConnectionId,\n ScopeId,\n SecretId,\n SetSourceCredentialBindingInput,\n} from \"@executor-js/sdk/shared\";\nimport { setSourceCredentialBinding, 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 } 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 specFetchHeaderBindingSlot,\n specFetchQueryParamBindingSlot,\n} from \"../sdk/source-contracts\";\nimport { OAuth2SourceConfig, type ServerInfo } 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\nconst specInputForAdd = (input: string) => {\n const value = input.trim();\n const parsed = Effect.runSyncExit(\n Effect.try({\n try: () => new URL(value),\n catch: () => null,\n }),\n );\n return Exit.isSuccess(parsed)\n ? { kind: \"url\" as const, url: value }\n : { kind: \"blob\" as const, value };\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 defaultOAuthTokenTargetScope = credentialScopeOptions[0]?.scopeId ?? scopeId;\n const [oauthTokenTargetScope, setOAuthTokenTargetScope] = useState<ScopeId>(\n defaultOAuthTokenTargetScope,\n );\n useEffect(() => {\n if (!credentialScopeOptions.some((option) => option.scopeId === oauthTokenTargetScope)) {\n setOAuthTokenTargetScope(defaultOAuthTokenTargetScope);\n }\n }, [credentialScopeOptions, defaultOAuthTokenTargetScope, oauthTokenTargetScope]);\n useEffect(() => {\n if (\n oauth2ClientIdScope &&\n !credentialScopeOptions.some((option) => option.scopeId === oauth2ClientIdScope)\n ) {\n setOauth2ClientIdScope(null);\n setOauth2ClientIdSecretId(null);\n setOauth2AuthState(null);\n }\n if (\n oauth2ClientSecretScope &&\n !credentialScopeOptions.some((option) => option.scopeId === oauth2ClientSecretScope)\n ) {\n setOauth2ClientSecretScope(null);\n setOauth2ClientSecretSecretId(null);\n setOauth2AuthState(null);\n }\n }, [credentialScopeOptions, oauth2ClientIdScope, oauth2ClientSecretScope]);\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(setSourceCredentialBinding, {\n mode: \"promiseExit\",\n });\n const secretList = useSecretPickerSecrets();\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 const sourceScope = ScopeId.make(scopeId);\n\n type PendingSecretBinding = {\n readonly slot: string;\n readonly secretId: string;\n readonly scope: ScopeId;\n readonly secretScope: ScopeId;\n };\n\n const configuredHeaders: Record<string, { kind: \"secret\"; prefix?: string }> = {};\n const headerBindings: PendingSecretBinding[] = [];\n const configuredQueryParams: Record<string, string | { kind: \"secret\"; prefix?: string }> = {};\n const queryParamBindings: PendingSecretBinding[] = [];\n for (const ch of customHeaders) {\n if (!ch.name.trim()) continue;\n const slot = headerBindingSlot(ch.name.trim());\n configuredHeaders[ch.name.trim()] = { kind: \"secret\", prefix: ch.prefix };\n if (ch.secretId) {\n const targetScope = ch.targetScope ?? sourceScope;\n headerBindings.push({\n slot,\n secretId: ch.secretId,\n scope: targetScope,\n secretScope: ch.secretScope ?? targetScope,\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 const targetScope = param.targetScope ?? sourceScope;\n configuredQueryParams[name] = { kind: \"secret\", prefix: param.prefix };\n queryParamBindings.push({\n slot,\n secretId: param.secretId,\n scope: targetScope,\n secretScope: param.secretScope ?? targetScope,\n });\n continue;\n }\n if (param.literalValue?.trim()) {\n configuredQueryParams[name] = param.literalValue.trim();\n }\n }\n const configuredSpecFetchHeaders: Record<string, { kind: \"secret\"; prefix?: string }> = {};\n const configuredSpecFetchQueryParams: Record<\n string,\n string | { kind: \"secret\"; prefix?: string }\n > = {};\n const specFetchBindings: PendingSecretBinding[] = [];\n for (const header of specFetchCredentials.headers) {\n const name = header.name.trim();\n if (!name || !header.secretId) continue;\n const targetScope = header.targetScope ?? sourceScope;\n configuredSpecFetchHeaders[name] = { kind: \"secret\", prefix: header.prefix };\n specFetchBindings.push({\n slot: specFetchHeaderBindingSlot(name),\n secretId: header.secretId,\n scope: targetScope,\n secretScope: header.secretScope ?? targetScope,\n });\n }\n for (const param of specFetchCredentials.queryParams) {\n const name = param.name.trim();\n if (!name) continue;\n if (param.secretId) {\n const targetScope = param.targetScope ?? sourceScope;\n configuredSpecFetchQueryParams[name] = { kind: \"secret\", prefix: param.prefix };\n specFetchBindings.push({\n slot: specFetchQueryParamBindingSlot(name),\n secretId: param.secretId,\n scope: targetScope,\n secretScope: param.secretScope ?? targetScope,\n });\n continue;\n }\n if (param.literalValue?.trim()) {\n configuredSpecFetchQueryParams[name] = param.literalValue.trim();\n }\n }\n const configuredSpecFetchCredentials =\n Object.keys(configuredSpecFetchHeaders).length > 0 ||\n Object.keys(configuredSpecFetchQueryParams).length > 0\n ? {\n ...(Object.keys(configuredSpecFetchHeaders).length > 0\n ? { headers: configuredSpecFetchHeaders }\n : {}),\n ...(Object.keys(configuredSpecFetchQueryParams).length > 0\n ? { queryParams: configuredSpecFetchQueryParams }\n : {}),\n }\n : null;\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 hasIncompleteSpecFetchCredentials =\n specFetchCredentials.headers.some((header) => header.name.trim() && !header.secretId) ||\n specFetchCredentials.queryParams.some(\n (param) => param.name.trim() && !param.secretId && !param.literalValue?.trim(),\n );\n const willAddWithoutInitialCredentials =\n Boolean(selectedOAuth2Preset && !oauth2Auth) ||\n hasIncompleteSpecFetchCredentials ||\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 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 const clientIdSecretScope = oauth2ClientIdScope ?? sourceScope;\n const clientSecretSecretScope = oauth2ClientSecretScope ?? sourceScope;\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 clientIdSecretScopeId: String(clientIdSecretScope),\n clientSecretSecretId: oauth2ClientSecretSecretId,\n clientSecretSecretScopeId: String(clientSecretSecretScope),\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 clientIdSecretScopeId: String(clientIdSecretScope),\n clientSecretSecretId: oauth2ClientSecretSecretId ?? null,\n clientSecretSecretScopeId: oauth2ClientSecretSecretId\n ? String(clientSecretSecretScope)\n : 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 oauth2ClientIdScope,\n oauth2ClientSecretScope,\n sourceScope,\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 spec: specInputForAdd(specUrl),\n name: displayName,\n namespace,\n baseUrl: resolvedBaseUrl,\n ...(configuredSpecFetchCredentials\n ? { specFetchCredentials: configuredSpecFetchCredentials }\n : {}),\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 oauthTokenBindingScope = ScopeId.make(oauthTokenTargetScope);\n const clientIdBindingScope = oauth2ClientIdScope ?? sourceScope;\n const clientSecretBindingScope = oauth2ClientSecretScope ?? sourceScope;\n\n for (const binding of headerBindings) {\n const bindingExit = await doSetBinding({\n params: { scopeId },\n payload: SetSourceCredentialBindingInput.make({\n source: { id: sourceId, scope: sourceScope },\n scope: binding.scope,\n slotKey: 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: SetSourceCredentialBindingInput.make({\n source: { id: sourceId, scope: sourceScope },\n scope: binding.scope,\n slotKey: 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 specFetchBindings) {\n const bindingExit = await doSetBinding({\n params: { scopeId },\n payload: SetSourceCredentialBindingInput.make({\n source: { id: sourceId, scope: sourceScope },\n scope: binding.scope,\n slotKey: 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: SetSourceCredentialBindingInput.make({\n source: { id: sourceId, scope: sourceScope },\n scope: clientIdBindingScope,\n slotKey: configuredOAuth2.clientIdSlot,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(oauth2ClientIdSecretId),\n secretScopeId: clientIdBindingScope,\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: SetSourceCredentialBindingInput.make({\n source: { id: sourceId, scope: sourceScope },\n scope: clientSecretBindingScope,\n slotKey: configuredOAuth2.clientSecretSlot,\n value: {\n kind: \"secret\",\n secretId: SecretId.make(oauth2ClientSecretSecretId),\n secretScopeId: clientSecretBindingScope,\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: SetSourceCredentialBindingInput.make({\n source: { id: sourceId, scope: sourceScope },\n scope: oauthTokenBindingScope,\n slotKey: 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={sourceScope}\n credentialScopeOptions={credentialScopeOptions}\n bindingScopeOptions={credentialScopeOptions}\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={sourceScope}\n credentialScopeOptions={credentialScopeOptions}\n bindingScopeOptions={credentialScopeOptions}\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={sourceScope}\n credentialScopeOptions={credentialScopeOptions}\n bindingScopeOptions={credentialScopeOptions}\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 ?? sourceScope);\n setOauth2AuthState(null);\n }}\n secrets={secretList}\n sourceName={identity.name}\n secretLabel=\"Client ID\"\n targetScope={oauth2ClientIdScope ?? sourceScope}\n credentialScopeOptions={credentialScopeOptions}\n onCreatedScope={setOauth2ClientIdScope}\n />\n </div>\n <CredentialScopeDropdown\n value={oauth2ClientIdScope ?? sourceScope}\n options={credentialScopeOptions}\n onChange={(targetScope) => {\n setOauth2ClientIdScope(targetScope);\n setOauth2ClientIdSecretId(null);\n setOauth2AuthState(null);\n }}\n label=\"Used by\"\n help=\"Choose where this OAuth client ID credential lives.\"\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 ?? sourceScope);\n setOauth2AuthState(null);\n }}\n secrets={secretList}\n sourceName={identity.name}\n secretLabel=\"Client Secret\"\n targetScope={oauth2ClientSecretScope ?? sourceScope}\n credentialScopeOptions={credentialScopeOptions}\n onCreatedScope={setOauth2ClientSecretScope}\n />\n </div>\n <CredentialScopeDropdown\n value={oauth2ClientSecretScope ?? sourceScope}\n options={credentialScopeOptions}\n onChange={(targetScope) => {\n setOauth2ClientSecretScope(targetScope);\n setOauth2ClientSecretSecretId(null);\n setOauth2AuthState(null);\n }}\n label=\"Used by\"\n help=\"Choose where this OAuth client secret credential lives.\"\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"]}
@@ -3,16 +3,14 @@ import {
3
3
  OpenApiExtractionError,
4
4
  OpenApiOAuthError,
5
5
  OpenApiParseError,
6
- OpenApiSourceBindingInput,
7
- OpenApiSourceBindingRef,
8
6
  SpecPreview,
9
7
  StoredSourceSchema
10
- } from "./chunk-E7PZ2QGD.js";
8
+ } from "./chunk-EOXXE5DG.js";
11
9
 
12
10
  // src/react/atoms.ts
13
11
  import * as Atom from "effect/unstable/reactivity/Atom";
14
12
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
15
- import { sourcesOptimisticAtom } from "@executor-js/react/api/atoms";
13
+ import { sourceCredentialBindingsAtom, sourcesOptimisticAtom } from "@executor-js/react/api/atoms";
16
14
  import { ReactivityKey } from "@executor-js/react/api/reactivity-keys";
17
15
 
18
16
  // src/react/client.ts
@@ -23,11 +21,12 @@ import { getBaseUrl } from "@executor-js/react/api/base-url";
23
21
  import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
24
22
  import { Schema } from "effect";
25
23
  import {
24
+ ConnectionId,
25
+ CredentialBindingRef,
26
26
  InternalError,
27
27
  ScopeId,
28
- ScopedSecretCredentialInput,
29
28
  SecretBackedValue
30
- } from "@executor-js/sdk/core";
29
+ } from "@executor-js/sdk/shared";
31
30
  var DomainErrors = [
32
31
  InternalError,
33
32
  OpenApiParseError,
@@ -41,64 +40,78 @@ var SourceParams = {
41
40
  scopeId: ScopeId,
42
41
  namespace: Schema.String
43
42
  };
44
- var SourceBindingParams = {
45
- scopeId: ScopeId,
46
- namespace: Schema.String,
47
- sourceScopeId: ScopeId
48
- };
49
- var SpecFetchCredentialsPayload = Schema.Struct({
43
+ var OpenApiSpecInputPayload = Schema.Union([
44
+ Schema.Struct({ kind: Schema.Literal("url"), url: Schema.String }),
45
+ Schema.Struct({ kind: Schema.Literal("blob"), value: Schema.String })
46
+ ]);
47
+ var PreviewSpecFetchCredentialsPayload = Schema.Struct({
50
48
  headers: Schema.optional(Schema.Record(Schema.String, SecretBackedValue)),
51
49
  queryParams: Schema.optional(Schema.Record(Schema.String, SecretBackedValue))
52
50
  });
53
- var ConfiguredCredentialBindingPayload = Schema.Struct({
54
- kind: Schema.Literal("binding"),
55
- slot: Schema.String,
51
+ var OpenApiSecretShapePayload = Schema.Struct({
52
+ kind: Schema.Literal("secret"),
56
53
  prefix: Schema.optional(Schema.String)
57
54
  });
58
- var ConfiguredCredentialValuePayload = Schema.Union([
59
- Schema.String,
60
- ConfiguredCredentialBindingPayload
61
- ]);
62
- var OpenApiCredentialInputPayload = Schema.Union([
63
- ScopedSecretCredentialInput,
64
- SecretBackedValue,
65
- ConfiguredCredentialValuePayload
66
- ]);
55
+ var OpenApiConfiguredValuePayload = Schema.Union([Schema.String, OpenApiSecretShapePayload]);
56
+ var SpecFetchCredentialsPayload = Schema.Struct({
57
+ headers: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
58
+ queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload))
59
+ });
67
60
  var AddSpecPayload = Schema.Struct({
68
- targetScope: ScopeId,
69
- credentialTargetScope: Schema.optional(ScopeId),
70
- spec: Schema.String,
61
+ spec: OpenApiSpecInputPayload,
71
62
  specFetchCredentials: Schema.optional(SpecFetchCredentialsPayload),
72
- name: Schema.optional(Schema.String),
73
- baseUrl: Schema.optional(Schema.String),
74
- namespace: Schema.optional(Schema.String),
75
- headers: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
76
- queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
63
+ name: Schema.String,
64
+ baseUrl: Schema.String,
65
+ namespace: Schema.String,
66
+ headers: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
67
+ queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),
77
68
  oauth2: Schema.optional(OAuth2SourceConfig)
78
69
  });
79
70
  var PreviewSpecPayload = Schema.Struct({
80
71
  spec: Schema.String,
81
- specFetchCredentials: Schema.optional(SpecFetchCredentialsPayload)
82
- });
83
- var UpdateSourcePayload = Schema.Struct({
84
- sourceScope: ScopeId,
85
- name: Schema.optional(Schema.String),
86
- baseUrl: Schema.optional(Schema.String),
87
- headers: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
88
- queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiCredentialInputPayload)),
89
- credentialTargetScope: Schema.optional(ScopeId),
90
- // Set after a successful re-authenticate to refresh the source's
91
- // stored OAuth2 metadata.
92
- oauth2: Schema.optional(OAuth2SourceConfig)
93
- });
94
- var UpdateSourceResponse = Schema.Struct({
95
- updated: Schema.Boolean
72
+ specFetchCredentials: Schema.optional(PreviewSpecFetchCredentialsPayload)
96
73
  });
97
- var RemoveBindingPayload = Schema.Struct({
98
- sourceId: Schema.String,
99
- sourceScope: ScopeId,
100
- slot: Schema.String,
101
- scope: ScopeId
74
+ var ConfigureCredentialPayload = Schema.Union([
75
+ Schema.String,
76
+ Schema.Struct({
77
+ kind: Schema.Literal("text"),
78
+ text: Schema.String,
79
+ prefix: Schema.optional(Schema.String)
80
+ }),
81
+ Schema.Struct({
82
+ kind: Schema.Literal("secret"),
83
+ secretId: Schema.String,
84
+ secretScope: Schema.optional(ScopeId),
85
+ prefix: Schema.optional(Schema.String)
86
+ }),
87
+ Schema.Struct({
88
+ kind: Schema.Literal("connection"),
89
+ connectionId: ConnectionId
90
+ })
91
+ ]);
92
+ var ConfigureCredentialMapPayload = Schema.Record(Schema.String, ConfigureCredentialPayload);
93
+ var ConfigurePayload = Schema.Struct({
94
+ source: Schema.Struct({
95
+ id: Schema.String,
96
+ scope: ScopeId
97
+ }),
98
+ scope: ScopeId,
99
+ headers: Schema.optional(ConfigureCredentialMapPayload),
100
+ queryParams: Schema.optional(ConfigureCredentialMapPayload),
101
+ specFetchCredentials: Schema.optional(
102
+ Schema.Struct({
103
+ headers: Schema.optional(ConfigureCredentialMapPayload),
104
+ queryParams: Schema.optional(ConfigureCredentialMapPayload)
105
+ })
106
+ ),
107
+ oauth2: Schema.optional(
108
+ Schema.Struct({
109
+ clientId: Schema.optional(ConfigureCredentialPayload),
110
+ clientSecret: Schema.optional(ConfigureCredentialPayload),
111
+ connection: Schema.optional(ConfigureCredentialPayload)
112
+ })
113
+ ),
114
+ oauth2Source: Schema.optional(OAuth2SourceConfig)
102
115
  });
103
116
  var AddSpecResponse = Schema.Struct({
104
117
  toolCount: Schema.Number,
@@ -125,34 +138,10 @@ var OpenApiGroup = HttpApiGroup.make("openapi").add(
125
138
  error: DomainErrors
126
139
  })
127
140
  ).add(
128
- HttpApiEndpoint.patch("updateSource", "/scopes/:scopeId/openapi/sources/:namespace", {
129
- params: SourceParams,
130
- payload: UpdateSourcePayload,
131
- success: UpdateSourceResponse,
132
- error: DomainErrors
133
- })
134
- ).add(
135
- HttpApiEndpoint.get(
136
- "listSourceBindings",
137
- "/scopes/:scopeId/openapi/sources/:namespace/base/:sourceScopeId/bindings",
138
- {
139
- params: SourceBindingParams,
140
- success: Schema.Array(OpenApiSourceBindingRef),
141
- error: DomainErrors
142
- }
143
- )
144
- ).add(
145
- HttpApiEndpoint.post("setSourceBinding", "/scopes/:scopeId/openapi/source-bindings", {
146
- params: ScopeIdParam,
147
- payload: OpenApiSourceBindingInput,
148
- success: OpenApiSourceBindingRef,
149
- error: DomainErrors
150
- })
151
- ).add(
152
- HttpApiEndpoint.post("removeSourceBinding", "/scopes/:scopeId/openapi/source-bindings/remove", {
141
+ HttpApiEndpoint.post("configure", "/scopes/:scopeId/openapi/configure", {
153
142
  params: ScopeIdParam,
154
- payload: RemoveBindingPayload,
155
- success: Schema.Struct({ removed: Schema.Boolean }),
143
+ payload: ConfigurePayload,
144
+ success: Schema.Array(CredentialBindingRef),
156
145
  error: DomainErrors
157
146
  })
158
147
  );
@@ -168,11 +157,13 @@ var openApiSourceAtom = (scopeId, namespace) => OpenApiClient.query("openapi", "
168
157
  timeToLive: "15 seconds",
169
158
  reactivityKeys: [ReactivityKey.sources, ReactivityKey.tools]
170
159
  });
171
- var openApiSourceBindingsAtom = (scopeId, namespace, sourceScopeId) => OpenApiClient.query("openapi", "listSourceBindings", {
172
- params: { scopeId, namespace, sourceScopeId },
173
- timeToLive: "15 seconds",
174
- reactivityKeys: [ReactivityKey.sources, ReactivityKey.secrets, ReactivityKey.connections]
175
- });
160
+ var openApiSourceBindingsAtom = (scopeId, namespace, sourceScopeId) => Atom.mapResult(
161
+ sourceCredentialBindingsAtom(scopeId, namespace, sourceScopeId),
162
+ (rows) => rows.map((row) => ({
163
+ ...row,
164
+ slot: row.slotKey
165
+ }))
166
+ );
176
167
  var previewOpenApiSpec = OpenApiClient.mutation("openapi", "previewSpec");
177
168
  var addOpenApiSpec = OpenApiClient.mutation("openapi", "addSpec");
178
169
  var addOpenApiSpecOptimistic = Atom.family(
@@ -182,7 +173,7 @@ var addOpenApiSpecOptimistic = Atom.family(
182
173
  const id = arg.payload.namespace ?? `pending-${Math.random().toString(36).slice(2)}`;
183
174
  const source = {
184
175
  id,
185
- scopeId: arg.payload.targetScope,
176
+ scopeId,
186
177
  kind: "openapi",
187
178
  pluginId: "openapi",
188
179
  name: arg.payload.name ?? id,
@@ -200,17 +191,11 @@ var addOpenApiSpecOptimistic = Atom.family(
200
191
  })
201
192
  )
202
193
  );
203
- var updateOpenApiSource = OpenApiClient.mutation("openapi", "updateSource");
204
- var setOpenApiSourceBinding = OpenApiClient.mutation("openapi", "setSourceBinding");
205
- var removeOpenApiSourceBinding = OpenApiClient.mutation("openapi", "removeSourceBinding");
206
194
 
207
195
  export {
208
196
  openApiSourceAtom,
209
197
  openApiSourceBindingsAtom,
210
198
  previewOpenApiSpec,
211
- addOpenApiSpecOptimistic,
212
- updateOpenApiSource,
213
- setOpenApiSourceBinding,
214
- removeOpenApiSourceBinding
199
+ addOpenApiSpecOptimistic
215
200
  };
216
- //# sourceMappingURL=chunk-GFQUEZUW.js.map
201
+ //# sourceMappingURL=chunk-ZZBTLFTA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/atoms.ts","../src/react/client.ts","../src/api/group.ts"],"sourcesContent":["import type { ScopeId } from \"@executor-js/sdk/shared\";\nimport * as Atom from \"effect/unstable/reactivity/Atom\";\nimport * as AsyncResult from \"effect/unstable/reactivity/AsyncResult\";\nimport { sourceCredentialBindingsAtom, sourcesOptimisticAtom } from \"@executor-js/react/api/atoms\";\nimport { ReactivityKey } from \"@executor-js/react/api/reactivity-keys\";\nimport { OpenApiClient } from \"./client\";\n\n// ---------------------------------------------------------------------------\n// Query atoms\n// ---------------------------------------------------------------------------\n\nexport const openApiSourceAtom = (scopeId: ScopeId, namespace: string) =>\n OpenApiClient.query(\"openapi\", \"getSource\", {\n params: { scopeId, namespace },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.sources, ReactivityKey.tools],\n });\n\nexport const openApiSourceBindingsAtom = (\n scopeId: ScopeId,\n namespace: string,\n sourceScopeId: ScopeId,\n) =>\n Atom.mapResult(sourceCredentialBindingsAtom(scopeId, namespace, sourceScopeId), (rows) =>\n rows.map((row) => ({\n ...row,\n slot: row.slotKey,\n })),\n );\n\n// ---------------------------------------------------------------------------\n// Mutation atoms\n// ---------------------------------------------------------------------------\n\nexport const previewOpenApiSpec = OpenApiClient.mutation(\"openapi\", \"previewSpec\");\n\nexport const addOpenApiSpec = OpenApiClient.mutation(\"openapi\", \"addSpec\");\n\nexport const addOpenApiSpecOptimistic = Atom.family((scopeId: ScopeId) =>\n sourcesOptimisticAtom(scopeId).pipe(\n Atom.optimisticFn({\n reducer: (current, arg) =>\n AsyncResult.map(current, (rows) => {\n const id = arg.payload.namespace ?? `pending-${Math.random().toString(36).slice(2)}`;\n const source = {\n id,\n scopeId,\n kind: \"openapi\",\n pluginId: \"openapi\",\n name: arg.payload.name ?? id,\n ...(arg.payload.baseUrl ? { url: arg.payload.baseUrl } : {}),\n canRemove: false,\n canRefresh: false,\n canEdit: false,\n runtime: false,\n };\n return [source, ...rows.filter((row) => row.id !== id)].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n }),\n fn: addOpenApiSpec,\n }),\n ),\n);\n","import { createPluginAtomClient } from \"@executor-js/sdk/client\";\nimport { getBaseUrl } from \"@executor-js/react/api/base-url\";\nimport { OpenApiGroup } from \"../api/group\";\n\nexport const OpenApiClient = createPluginAtomClient(OpenApiGroup, {\n baseUrl: getBaseUrl,\n});\n","import { HttpApiEndpoint, HttpApiGroup } from \"effect/unstable/httpapi\";\nimport { Schema } from \"effect\";\nimport {\n ConnectionId,\n CredentialBindingRef,\n InternalError,\n ScopeId,\n SecretBackedValue,\n} from \"@executor-js/sdk/shared\";\n\nimport { OpenApiParseError, OpenApiExtractionError, OpenApiOAuthError } from \"../sdk/errors\";\nimport { SpecPreview } from \"../sdk/preview\";\nimport { StoredSourceSchema } from \"../sdk/source-contracts\";\nimport { OAuth2SourceConfig } from \"../sdk/types\";\n\n// ---------------------------------------------------------------------------\n// Params\n// ---------------------------------------------------------------------------\n\nconst DomainErrors = [\n InternalError,\n OpenApiParseError,\n OpenApiExtractionError,\n OpenApiOAuthError,\n] as const;\n\nconst ScopeIdParam = {\n scopeId: ScopeId,\n};\n\nconst SourceParams = {\n scopeId: ScopeId,\n namespace: Schema.String,\n};\n\nconst OpenApiSpecInputPayload = Schema.Union([\n Schema.Struct({ kind: Schema.Literal(\"url\"), url: Schema.String }),\n Schema.Struct({ kind: Schema.Literal(\"blob\"), value: Schema.String }),\n]);\n\nconst PreviewSpecFetchCredentialsPayload = Schema.Struct({\n headers: Schema.optional(Schema.Record(Schema.String, SecretBackedValue)),\n queryParams: Schema.optional(Schema.Record(Schema.String, SecretBackedValue)),\n});\n\nconst OpenApiSecretShapePayload = Schema.Struct({\n kind: Schema.Literal(\"secret\"),\n prefix: Schema.optional(Schema.String),\n});\n\nconst OpenApiConfiguredValuePayload = Schema.Union([Schema.String, OpenApiSecretShapePayload]);\n\nconst SpecFetchCredentialsPayload = Schema.Struct({\n headers: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),\n queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),\n});\n\n// ---------------------------------------------------------------------------\n// Payloads\n// ---------------------------------------------------------------------------\n\nconst AddSpecPayload = Schema.Struct({\n spec: OpenApiSpecInputPayload,\n specFetchCredentials: Schema.optional(SpecFetchCredentialsPayload),\n name: Schema.String,\n baseUrl: Schema.String,\n namespace: Schema.String,\n headers: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),\n queryParams: Schema.optional(Schema.Record(Schema.String, OpenApiConfiguredValuePayload)),\n oauth2: Schema.optional(OAuth2SourceConfig),\n});\n\nconst PreviewSpecPayload = Schema.Struct({\n spec: Schema.String,\n specFetchCredentials: Schema.optional(PreviewSpecFetchCredentialsPayload),\n});\n\nconst ConfigureCredentialPayload = Schema.Union([\n Schema.String,\n Schema.Struct({\n kind: Schema.Literal(\"text\"),\n text: Schema.String,\n prefix: Schema.optional(Schema.String),\n }),\n Schema.Struct({\n kind: Schema.Literal(\"secret\"),\n secretId: Schema.String,\n secretScope: Schema.optional(ScopeId),\n prefix: Schema.optional(Schema.String),\n }),\n Schema.Struct({\n kind: Schema.Literal(\"connection\"),\n connectionId: ConnectionId,\n }),\n]);\n\nconst ConfigureCredentialMapPayload = Schema.Record(Schema.String, ConfigureCredentialPayload);\n\nconst ConfigurePayload = Schema.Struct({\n source: Schema.Struct({\n id: Schema.String,\n scope: ScopeId,\n }),\n scope: ScopeId,\n headers: Schema.optional(ConfigureCredentialMapPayload),\n queryParams: Schema.optional(ConfigureCredentialMapPayload),\n specFetchCredentials: Schema.optional(\n Schema.Struct({\n headers: Schema.optional(ConfigureCredentialMapPayload),\n queryParams: Schema.optional(ConfigureCredentialMapPayload),\n }),\n ),\n oauth2: Schema.optional(\n Schema.Struct({\n clientId: Schema.optional(ConfigureCredentialPayload),\n clientSecret: Schema.optional(ConfigureCredentialPayload),\n connection: Schema.optional(ConfigureCredentialPayload),\n }),\n ),\n oauth2Source: Schema.optional(OAuth2SourceConfig),\n});\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\n\nconst AddSpecResponse = Schema.Struct({\n toolCount: Schema.Number,\n namespace: Schema.String,\n});\n\n// HTTP status on the three domain errors lives on their class\n// declarations in `../sdk/errors.ts` — see the comment there.\n\n// ---------------------------------------------------------------------------\n// Group\n//\n// Plugin SDK errors (OpenApiParseError, OpenApiExtractionError,\n// OpenApiOAuthError) are declared once at the group level via\n// `.addError(...)` — every endpoint inherits them. The errors themselves\n// carry their HTTP status via `HttpApiSchema.annotations` above, so\n// handlers just `return yield* ext.foo(...)` and the schema encodes\n// whatever comes out.\n//\n// 5xx is handled at the API level: `.addError(InternalError)` adds the\n// shared opaque 500 surface. Defects are captured + downgraded to it by\n// an HttpApiBuilder middleware (see apps/cloud/src/observability.ts).\n// StorageError → InternalError translation happens at service wiring\n// time via `withCapture(executor)`.\n// ---------------------------------------------------------------------------\n\nexport const OpenApiGroup = HttpApiGroup.make(\"openapi\")\n .add(\n HttpApiEndpoint.post(\"previewSpec\", \"/scopes/:scopeId/openapi/preview\", {\n params: ScopeIdParam,\n payload: PreviewSpecPayload,\n success: SpecPreview,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"addSpec\", \"/scopes/:scopeId/openapi/specs\", {\n params: ScopeIdParam,\n payload: AddSpecPayload,\n success: AddSpecResponse,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getSource\", \"/scopes/:scopeId/openapi/sources/:namespace\", {\n params: SourceParams,\n success: Schema.NullOr(StoredSourceSchema),\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"configure\", \"/scopes/:scopeId/openapi/configure\", {\n params: ScopeIdParam,\n payload: ConfigurePayload,\n success: Schema.Array(CredentialBindingRef),\n error: DomainErrors,\n }),\n );\n"],"mappings":"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","names":[]}