@executor-js/plugin-openapi 1.5.21 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AddOpenApiSource-SSXZBQEK.js → AddOpenApiSource-6PJZWRRZ.js} +17 -12
- package/dist/AddOpenApiSource-6PJZWRRZ.js.map +1 -0
- package/dist/{OpenApiAccountsPanel-U47OVLYG.js → OpenApiAccountsPanel-W6IMUY7Q.js} +4 -4
- package/dist/{UpdateSpecSection-FFYVB3VH.js → UpdateSpecSection-R2RF2QV2.js} +3 -3
- package/dist/api/group.d.ts +10 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/{chunk-2RNIMASA.js → chunk-562TAVB2.js} +5 -3
- package/dist/chunk-562TAVB2.js.map +1 -0
- package/dist/{chunk-RCBR3QMJ.js → chunk-56PVOO6X.js} +10 -4
- package/dist/{chunk-RCBR3QMJ.js.map → chunk-56PVOO6X.js.map} +1 -1
- package/dist/{chunk-3O3PGRRG.js → chunk-DBA2BHE4.js} +287 -23
- package/dist/chunk-DBA2BHE4.js.map +1 -0
- package/dist/{chunk-QQFCICLX.js → chunk-HG5JB2UJ.js} +9 -1
- package/dist/{chunk-QQFCICLX.js.map → chunk-HG5JB2UJ.js.map} +1 -1
- package/dist/{chunk-MWF55JPY.js → chunk-IVRAOG3T.js} +5 -3
- package/dist/{chunk-MWF55JPY.js.map → chunk-IVRAOG3T.js.map} +1 -1
- package/dist/{chunk-R3X27XS6.js → chunk-WWZ7B34D.js} +35 -4
- package/dist/chunk-WWZ7B34D.js.map +1 -0
- package/dist/client.js +4 -4
- package/dist/core.js +4 -4
- package/dist/index.js +4 -4
- package/dist/react/AddOpenApiSource.d.ts +1 -0
- package/dist/react/AddOpenApiSource.test.d.ts +1 -0
- package/dist/react/atoms.d.ts +12 -0
- package/dist/react/client.d.ts +10 -0
- package/dist/sdk/config.d.ts +4 -0
- package/dist/sdk/plugin.d.ts +2 -0
- package/dist/sdk/preview.d.ts +16 -0
- package/package.json +3 -3
- package/dist/AddOpenApiSource-SSXZBQEK.js.map +0 -1
- package/dist/chunk-2RNIMASA.js.map +0 -1
- package/dist/chunk-3O3PGRRG.js.map +0 -1
- package/dist/chunk-R3X27XS6.js.map +0 -1
- /package/dist/{OpenApiAccountsPanel-U47OVLYG.js.map → OpenApiAccountsPanel-W6IMUY7Q.js.map} +0 -0
- /package/dist/{UpdateSpecSection-FFYVB3VH.js.map → UpdateSpecSection-R2RF2QV2.js.map} +0 -0
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
detectedAuthenticationTemplates
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IVRAOG3T.js";
|
|
4
4
|
import {
|
|
5
5
|
openApiPresets
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-HG5JB2UJ.js";
|
|
7
7
|
import {
|
|
8
8
|
authenticationFromEditorValue,
|
|
9
9
|
editorValueFromAuthentication,
|
|
10
10
|
openApiWireAuthInput
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-56PVOO6X.js";
|
|
12
12
|
import {
|
|
13
13
|
addOpenApiSpec,
|
|
14
14
|
previewOpenApiSpec
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-562TAVB2.js";
|
|
16
16
|
import {
|
|
17
17
|
resolveServerUrl
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-WWZ7B34D.js";
|
|
19
19
|
|
|
20
20
|
// src/react/AddOpenApiSource.tsx
|
|
21
21
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -37,7 +37,7 @@ import { CardStack as CardStack2, CardStackContent as CardStackContent2 } from "
|
|
|
37
37
|
import { FieldLabel } from "@executor-js/react/components/field";
|
|
38
38
|
import { FloatActions } from "@executor-js/react/components/float-actions";
|
|
39
39
|
import { Textarea as Textarea2 } from "@executor-js/react/components/textarea";
|
|
40
|
-
import { IOSSpinner
|
|
40
|
+
import { IOSSpinner } from "@executor-js/react/components/spinner";
|
|
41
41
|
import {
|
|
42
42
|
addIntegrationErrorMessage,
|
|
43
43
|
errorMessageFromExit,
|
|
@@ -167,6 +167,13 @@ var specInputForAdd = (input) => {
|
|
|
167
167
|
);
|
|
168
168
|
return Exit.isSuccess(parsed) ? { kind: "url", url: value } : { kind: "blob", value };
|
|
169
169
|
};
|
|
170
|
+
var baseUrlFromSpecInput = (input) => {
|
|
171
|
+
const value = input.trim();
|
|
172
|
+
if (!URL.canParse(value)) return "";
|
|
173
|
+
const parsed = new URL(value);
|
|
174
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return "";
|
|
175
|
+
return parsed.origin;
|
|
176
|
+
};
|
|
170
177
|
function AddOpenApiSource(props) {
|
|
171
178
|
const [specUrl, setSpecUrl] = useState(props.initialUrl ?? "");
|
|
172
179
|
const [analyzing, setAnalyzing] = useState(false);
|
|
@@ -253,7 +260,7 @@ function AddOpenApiSource(props) {
|
|
|
253
260
|
}
|
|
254
261
|
const result = exit.value;
|
|
255
262
|
setPreview(result);
|
|
256
|
-
setBaseUrl("");
|
|
263
|
+
setBaseUrl(result.servers.length === 0 ? baseUrlFromSpecInput(specUrl) : "");
|
|
257
264
|
setAnalyzing(false);
|
|
258
265
|
};
|
|
259
266
|
handleAnalyzeRef.current = handleAnalyze;
|
|
@@ -356,14 +363,12 @@ function AddOpenApiSource(props) {
|
|
|
356
363
|
addError && /* @__PURE__ */ jsx2(FormErrorAlert, { message: addError }),
|
|
357
364
|
/* @__PURE__ */ jsxs2(FloatActions, { children: [
|
|
358
365
|
/* @__PURE__ */ jsx2(Button, { variant: "ghost", onClick: () => props.onCancel(), disabled: adding, children: "Cancel" }),
|
|
359
|
-
preview && /* @__PURE__ */
|
|
360
|
-
adding && /* @__PURE__ */ jsx2(Spinner, { className: "size-3.5" }),
|
|
361
|
-
adding ? "Adding..." : "Add integration"
|
|
362
|
-
] })
|
|
366
|
+
preview && /* @__PURE__ */ jsx2(Button, { onClick: () => void handleAdd(), disabled: !canAdd, loading: adding, children: "Add integration" })
|
|
363
367
|
] })
|
|
364
368
|
] });
|
|
365
369
|
}
|
|
366
370
|
export {
|
|
371
|
+
baseUrlFromSpecInput,
|
|
367
372
|
AddOpenApiSource as default
|
|
368
373
|
};
|
|
369
|
-
//# sourceMappingURL=AddOpenApiSource-
|
|
374
|
+
//# sourceMappingURL=AddOpenApiSource-6PJZWRRZ.js.map
|
|
@@ -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 Option from \"effect/Option\";\n\nimport { IntegrationSlug } from \"@executor-js/sdk/shared\";\nimport { integrationWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport {\n slugifyNamespace,\n useIntegrationIdentity,\n} from \"@executor-js/react/plugins/integration-identity\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n AuthMethodListEditor,\n useAuthMethodList,\n type AuthMethodRow,\n type AuthMethodSeed,\n} from \"@executor-js/react/components/auth-method-list-editor\";\nimport { CardStack, CardStackContent } 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 { Textarea } from \"@executor-js/react/components/textarea\";\nimport { IOSSpinner } from \"@executor-js/react/components/spinner\";\nimport {\n addIntegrationErrorMessage,\n errorMessageFromExit,\n FormErrorAlert,\n SlugCollisionAlert,\n useSlugAlreadyExists,\n} from \"@executor-js/react/lib/integration-add\";\n\nimport {\n authenticationFromEditorValue,\n editorValueFromAuthentication,\n openApiWireAuthInput,\n} from \"./auth-method-config\";\nimport { addOpenApiSpec, previewOpenApiSpec } from \"./atoms\";\nimport { OpenApiSourceDetailsFields } from \"./OpenApiSourceDetailsFields\";\nimport { openApiPresets } from \"../sdk/presets\";\nimport type { SpecPreviewSummary } from \"../sdk/preview\";\nimport { type Authentication } from \"../sdk/types\";\nimport { resolveServerUrl } from \"../sdk/openapi-utils\";\nimport { detectedAuthenticationTemplates } from \"../sdk/derive-auth\";\n\nconst normalizePresetUrl = (url: string): string => {\n const trimmed = url.trim();\n if (!URL.canParse(trimmed)) return trimmed.replace(/\\/$/, \"\");\n const parsed = new URL(trimmed);\n parsed.hash = \"\";\n parsed.searchParams.sort();\n return parsed.toString().replace(/\\/$/, \"\");\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\nexport const baseUrlFromSpecInput = (input: string): string => {\n const value = input.trim();\n if (!URL.canParse(value)) return \"\";\n const parsed = new URL(value);\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") return \"\";\n return parsed.origin;\n};\n\n// ---------------------------------------------------------------------------\n// Component: single progressive form. Post-redesign: preview -> addSpec\n// (register the integration catalog entry with ALL detected auth methods) →\n// route to the integration's detail hub, where the user adds accounts. The add\n// flow no longer creates a connection.\n// ---------------------------------------------------------------------------\n\nexport default function AddOpenApiSource(props: {\n onComplete: (slug?: string) => void;\n onCancel: () => void;\n initialUrl?: string;\n initialPreset?: string;\n initialNamespace?: string;\n}) {\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<SpecPreviewSummary | null>(null);\n const [baseUrl, setBaseUrl] = useState(\"\");\n // Agent-visible description: prefilled from the spec's `info.description`\n // until the user types (null = untouched, keep deriving from the preview).\n const [descriptionDraft, setDescriptionDraft] = useState<string | null>(null);\n const identityFallbackName = preview ? Option.getOrElse(preview.title, () => \"\") : \"\";\n const identity = useIntegrationIdentity({\n fallbackName: identityFallbackName,\n fallbackNamespace: props.initialNamespace,\n });\n\n // Submit\n const [adding, setAdding] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n\n const doPreview = useAtomSet(previewOpenApiSpec, { mode: \"promiseExit\" });\n const doAdd = useAtomSet(addOpenApiSpec, { mode: \"promiseExit\" });\n\n // Keep the latest handleAnalyze in a ref so the debounced effect doesn't need\n // it as a dependency (it closes over fresh state).\n const handleAnalyzeRef = useRef<() => void>(() => {});\n\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 previewHasNoServers = preview !== null && preview.servers.length === 0;\n // Offer the spec's servers (resolved with defaults) as base-URL choices when\n // there's more than one; a single/no server uses a plain input.\n const baseUrlOptions =\n preview && preview.servers.length > 1\n ? preview.servers.map((server) => {\n const url = resolveServerUrl(server.url, Option.getOrUndefined(server.variables), {});\n return { value: url, label: url };\n })\n : undefined;\n const firstServer = preview?.servers[0];\n const firstServerUrl = firstServer\n ? resolveServerUrl(firstServer.url, Option.getOrUndefined(firstServer.variables), {})\n : \"\";\n const previewPresetIcon =\n openApiPresets.find(\n (preset) => preset.url && normalizePresetUrl(preset.url) === normalizePresetUrl(specUrl),\n )?.icon ?? null;\n\n const resolvedBaseUrl = baseUrl.trim();\n const resolvedSourceId =\n slugifyNamespace(identity.namespace) ||\n (preview ? Option.getOrElse(preview.title, () => \"openapi\") : \"openapi\");\n const resolvedDisplayName =\n identity.name.trim() ||\n (preview ? Option.getOrElse(preview.title, () => resolvedSourceId) : resolvedSourceId);\n const resolvedDescription =\n descriptionDraft ?? (preview ? Option.getOrElse(preview.description, () => \"\") : \"\");\n\n // Register EVERY spec-detected auth method, not just a single selected one.\n // Keyed off `preview` (stable per analysis) so the memo doesn't re-run on the\n // freshly-allocated `?? []` fallback arrays.\n const authenticationTemplate: readonly Authentication[] = useMemo(\n () =>\n detectedAuthenticationTemplates(\n preview?.headerPresets ?? [],\n preview?.oauth2Presets ?? [],\n resolvedBaseUrl,\n ),\n [preview, resolvedBaseUrl],\n );\n\n // Editable auth methods, seeded from the spec-detected templates. The add flow\n // registers EVERY method (P6), so this is a LIST, preserving multi-method\n // specs (e.g. apiKey + OAuth). Each seed carries the detected template's\n // original slug, so an unedited detected method submits with its EXACT\n // original slug (preserving behavior); added methods (no seed) get a\n // deterministic fresh slug. Re-seeded whenever a fresh detection arrives\n // (keyed on the detected templates, stable per analysis + base URL).\n const authMethodSeeds: readonly AuthMethodSeed[] = useMemo(() => {\n const labels = [\n ...(preview?.headerPresets ?? []).map((preset) => preset.label),\n ...(preview?.oauth2Presets ?? []).map((preset) => preset.label),\n ];\n return authenticationTemplate.map(\n (template: Authentication, index: number): AuthMethodSeed => ({\n value: editorValueFromAuthentication(template),\n slug: String(template.slug),\n ...(labels[index] !== undefined ? { label: labels[index] } : {}),\n }),\n );\n }, [preview, authenticationTemplate]);\n const authMethodList = useAuthMethodList(authMethodSeeds);\n\n // The methods to register, mapped back to stored `Authentication[]`. Drops\n // `none` rows (nothing to register). An unedited detected method keeps its\n // original `seedSlug`; an added method gets a deterministic fresh slug.\n const editedAuthenticationTemplate: readonly Authentication[] = useMemo(() => {\n const templates: Authentication[] = [];\n authMethodList.rows.forEach((row: AuthMethodRow, index: number) => {\n const slug =\n row.seedSlug ?? (row.value.kind === \"oauth\" ? `oauth-${index}` : `apikey-${index}`);\n const template = authenticationFromEditorValue(row.value, slug);\n if (template !== null) templates.push(template);\n });\n return templates;\n }, [authMethodList.rows]);\n\n // Pre-empt the API's `IntegrationAlreadyExistsError`: adding an integration\n // whose slug already exists clobbers the existing one's connections/policies,\n // so the API blocks it. Surface that here from the tenant-scoped catalog list.\n const slugAlreadyExists = useSlugAlreadyExists(resolvedSourceId);\n\n // The base URL is optional when the spec declares servers (resolved per call);\n // required only when it doesn't.\n const canAdd =\n preview !== null && !slugAlreadyExists && (!previewHasNoServers || resolvedBaseUrl.length > 0);\n\n // ---- Handlers ----\n\n const handleAnalyze = async () => {\n setAnalyzing(true);\n setAnalyzeError(null);\n setAddError(null);\n const exit = await doPreview({ payload: { spec: specUrl } });\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 setBaseUrl(result.servers.length === 0 ? baseUrlFromSpecInput(specUrl) : \"\");\n setAnalyzing(false);\n };\n\n handleAnalyzeRef.current = handleAnalyze;\n\n // Persist the integration and return its slug. Registers the catalog entry\n // with every detected auth method. Adding a slug that already exists is\n // rejected by the API (`IntegrationAlreadyExistsError`), surfaced inline.\n const ensureIntegration = useCallback(async (): Promise<IntegrationSlug | null> => {\n const exit = await doAdd({\n payload: {\n spec: specInputForAdd(specUrl),\n slug: resolvedSourceId,\n name: resolvedDisplayName,\n ...(resolvedDescription.trim().length > 0\n ? { description: resolvedDescription.trim() }\n : {}),\n baseUrl: resolvedBaseUrl,\n // Always send the edited method list (even empty) when the user has\n // inspected a preview: an explicit [] means \"no auth methods\", while\n // OMITTING the field tells the server to derive defaults from the\n // spec, which would silently resurrect methods the user deleted.\n // Serialize to the wire input dialect (apikey -> request-shaped).\n authenticationTemplate: editedAuthenticationTemplate.map(openApiWireAuthInput),\n },\n reactivityKeys: integrationWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n setAddError(addIntegrationErrorMessage(exit, resolvedSourceId, \"Failed to add integration\"));\n return null;\n }\n return exit.value.slug;\n }, [\n specUrl,\n doAdd,\n resolvedSourceId,\n resolvedDisplayName,\n resolvedDescription,\n resolvedBaseUrl,\n editedAuthenticationTemplate,\n ]);\n\n const handleAdd = async () => {\n setAdding(true);\n setAddError(null);\n\n const integration = await ensureIntegration();\n if (!integration) {\n setAdding(false);\n return;\n }\n\n props.onComplete(String(integration));\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 Integration</h1>\n </div>\n\n {!preview ? (\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <div className=\"space-y-2 p-3\">\n <FieldLabel>OpenAPI Spec</FieldLabel>\n <div className=\"relative\">\n <Textarea\n value={specUrl}\n onChange={(e) => setSpecUrl((e.target as HTMLTextAreaElement).value)}\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 <p className=\"text-[11px] text-muted-foreground\">\n Paste a URL or raw JSON/YAML content.\n </p>\n </div>\n </CardStackContent>\n </CardStack>\n ) : null}\n\n {preview ? (\n <OpenApiSourceDetailsFields\n title={Option.getOrElse(preview.title, () => \"API\")}\n subtitle={`${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 description={resolvedDescription}\n onDescriptionChange={setDescriptionDraft}\n baseUrl={resolvedBaseUrl}\n onBaseUrlChange={setBaseUrl}\n baseUrlOptions={baseUrlOptions}\n baseUrlLabel={previewHasNoServers ? \"Base URL\" : \"Base URL override (optional)\"}\n baseUrlPlaceholder={firstServerUrl || \"https://api.example.com\"}\n baseUrlHint={\n previewHasNoServers\n ? undefined\n : \"Overrides the spec's servers; leave empty to choose the server (and variables) per tool call.\"\n }\n baseUrlMissingMessage={\n previewHasNoServers ? \"This spec declares no servers, enter a base URL.\" : undefined\n }\n specUrl={specUrl}\n onSpecUrlChange={(value) => {\n setSpecUrl(value);\n setPreview(null);\n setBaseUrl(\"\");\n }}\n faviconIcon={previewPresetIcon}\n faviconUrl={resolvedBaseUrl || firstServerUrl}\n />\n ) : null}\n\n {analyzeError && <FormErrorAlert message={analyzeError} />}\n\n {preview && (\n <AuthMethodListEditor\n list={authMethodList}\n emptyHint=\"No authentication detected. Add a method, or add the integration without auth and connect an account from the integration page later.\"\n footerHint=\"Every method here is registered with the integration. Connect an account from the integration page after adding.\"\n />\n )}\n\n {preview && slugAlreadyExists && !adding && <SlugCollisionAlert slug={resolvedSourceId} />}\n\n {addError && <FormErrorAlert message={addError} />}\n\n <FloatActions>\n <Button variant=\"ghost\" onClick={() => props.onCancel()} disabled={adding}>\n Cancel\n </Button>\n {preview && (\n <Button onClick={() => void handleAdd()} disabled={!canAdd} loading={adding}>\n Add integration\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 { Textarea } from \"@executor-js/react/components/textarea\";\nimport { IntegrationFavicon } from \"@executor-js/react/components/integration-favicon\";\nimport {\n IntegrationIdentityFieldRows,\n type IntegrationIdentity,\n} from \"@executor-js/react/plugins/integration-identity\";\n\n/** The spec input is shown as a one-line \"Spec URL\" field only when it IS a\n * URL; pasted document content gets a multi-line editor instead. */\nconst isUrlInput = (value: string): boolean => URL.canParse(value.trim());\n\nexport function OpenApiSourceDetailsFields(props: {\n readonly title: string;\n readonly subtitle?: string;\n readonly identity: IntegrationIdentity;\n /** The integration's agent-visible description (prefilled from the spec). */\n readonly description?: string;\n readonly onDescriptionChange?: (value: string) => void;\n readonly baseUrl: string;\n readonly onBaseUrlChange: (value: string) => void;\n readonly baseUrlOptions?: readonly FreeformComboboxOption[];\n readonly baseUrlLabel?: string;\n readonly baseUrlPlaceholder?: string;\n readonly baseUrlHint?: string;\n readonly specUrl?: string;\n readonly onSpecUrlChange?: (value: string) => void;\n readonly faviconIcon?: string | null;\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 specIsUrl = props.specUrl !== undefined && isUrlInput(props.specUrl);\n\n return (\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntry>\n {(props.faviconIcon || props.faviconUrl) && (\n <IntegrationFavicon icon={props.faviconIcon} url={props.faviconUrl} size={16} />\n )}\n <CardStackEntryContent>\n <CardStackEntryTitle>{props.title}</CardStackEntryTitle>\n {props.subtitle && (\n <CardStackEntryDescription>{props.subtitle}</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 <IntegrationIdentityFieldRows\n identity={props.identity}\n namespaceReadOnly={props.namespaceReadOnly}\n />\n {props.onDescriptionChange && (\n <CardStackEntryField label=\"Description\">\n <Textarea\n value={props.description ?? \"\"}\n onChange={(e) => props.onDescriptionChange?.((e.target as HTMLTextAreaElement).value)}\n placeholder=\"What this API is and when to reach for it\"\n rows={2}\n maxRows={6}\n className=\"text-sm\"\n />\n </CardStackEntryField>\n )}\n <div className=\"grid grid-cols-1 md:grid-cols-2\">\n <CardStackEntryField label={props.baseUrlLabel ?? \"Base URL\"}>\n {props.baseUrlOptions && props.baseUrlOptions.length > 0 ? (\n <FreeformCombobox\n value={props.baseUrl}\n onValueChange={props.onBaseUrlChange}\n options={props.baseUrlOptions}\n placeholder={props.baseUrlPlaceholder ?? \"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={props.baseUrlPlaceholder ?? \"https://api.example.com\"}\n className=\"font-mono text-sm\"\n />\n )}\n\n {props.baseUrlMissingMessage && !props.baseUrl && (\n <p className=\"text-[11px] text-muted-foreground\">{props.baseUrlMissingMessage}</p>\n )}\n {props.baseUrlHint && (\n <p className=\"text-[11px] text-muted-foreground\">{props.baseUrlHint}</p>\n )}\n </CardStackEntryField>\n {specIsUrl && 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.specUrl !== undefined && !specIsUrl && props.onSpecUrlChange && (\n <CardStackEntryField label=\"Spec\">\n <Textarea\n value={props.specUrl}\n onChange={(e) => props.onSpecUrlChange?.((e.target as HTMLTextAreaElement).value)}\n placeholder=\"Pasted OpenAPI JSON/YAML\"\n rows={4}\n maxRows={12}\n className=\"font-mono text-xs\"\n disabled={props.specUrlDisabled}\n />\n </CardStackEntryField>\n )}\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","Textarea","jsx","jsxs","CardStack","CardStackContent","Textarea"]}
|
|
@@ -2,12 +2,12 @@ import {
|
|
|
2
2
|
authMethodsFromConfig,
|
|
3
3
|
openApiWireAuthInput,
|
|
4
4
|
templateFromPlacements
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-56PVOO6X.js";
|
|
6
6
|
import {
|
|
7
7
|
openApiConfigAtom,
|
|
8
8
|
openapiConfigure
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-562TAVB2.js";
|
|
10
|
+
import "./chunk-WWZ7B34D.js";
|
|
11
11
|
|
|
12
12
|
// src/react/OpenApiAccountsPanel.tsx
|
|
13
13
|
import { useCallback, useMemo } from "react";
|
|
@@ -87,4 +87,4 @@ function OpenApiAccountsPanel(props) {
|
|
|
87
87
|
export {
|
|
88
88
|
OpenApiAccountsPanel as default
|
|
89
89
|
};
|
|
90
|
-
//# sourceMappingURL=OpenApiAccountsPanel-
|
|
90
|
+
//# sourceMappingURL=OpenApiAccountsPanel-W6IMUY7Q.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
openApiConfigAtom,
|
|
3
3
|
updateOpenApiSpec
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-562TAVB2.js";
|
|
5
|
+
import "./chunk-WWZ7B34D.js";
|
|
6
6
|
|
|
7
7
|
// src/react/UpdateSpecSection.tsx
|
|
8
8
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
@@ -101,4 +101,4 @@ function UpdateSpecSection(props) {
|
|
|
101
101
|
export {
|
|
102
102
|
UpdateSpecSection as default
|
|
103
103
|
};
|
|
104
|
-
//# sourceMappingURL=UpdateSpecSection-
|
|
104
|
+
//# sourceMappingURL=UpdateSpecSection-R2RF2QV2.js.map
|
package/dist/api/group.d.ts
CHANGED
|
@@ -56,9 +56,11 @@ export declare const OpenApiGroup: HttpApiGroup.HttpApiGroup<"openapi", HttpApiE
|
|
|
56
56
|
readonly flow: Schema.Literals<readonly ["authorizationCode", "clientCredentials"]>;
|
|
57
57
|
readonly authorizationUrl: Schema.OptionFromOptional<Schema.String>;
|
|
58
58
|
readonly tokenUrl: Schema.String;
|
|
59
|
+
readonly resource: Schema.OptionFromOptional<Schema.String>;
|
|
59
60
|
readonly refreshUrl: Schema.OptionFromOptional<Schema.String>;
|
|
60
61
|
readonly scopes: Schema.$Record<Schema.String, Schema.String>;
|
|
61
62
|
readonly identityScopes: Schema.Union<readonly [Schema.Literal<"auto">, Schema.Literal<false>, Schema.$Array<Schema.String>]>;
|
|
63
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
62
64
|
}>>;
|
|
63
65
|
}>>, HttpApiEndpoint.Json<typeof IntegrationAlreadyExistsError | typeof InternalError | typeof OpenApiParseError | typeof OpenApiExtractionError | typeof OpenApiOAuthError>, never, never> | HttpApiEndpoint.HttpApiEndpoint<"addSpec", "POST", "/openapi/specs", HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.StringTree<never>, HttpApiEndpoint.Json<Schema.Struct<{
|
|
64
66
|
readonly spec: Schema.Union<readonly [Schema.Struct<{
|
|
@@ -79,7 +81,9 @@ export declare const OpenApiGroup: HttpApiGroup.HttpApiGroup<"openapi", HttpApiE
|
|
|
79
81
|
readonly kind: Schema.Literal<"oauth2">;
|
|
80
82
|
readonly authorizationUrl: Schema.String;
|
|
81
83
|
readonly tokenUrl: Schema.String;
|
|
84
|
+
readonly resource: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
82
85
|
readonly scopes: Schema.$Array<Schema.String>;
|
|
86
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
83
87
|
}>, Schema.Struct<{
|
|
84
88
|
readonly slug: Schema.optional<Schema.String>;
|
|
85
89
|
readonly type: Schema.Literal<"apiKey">;
|
|
@@ -116,7 +120,9 @@ export declare const OpenApiGroup: HttpApiGroup.HttpApiGroup<"openapi", HttpApiE
|
|
|
116
120
|
readonly kind: Schema.Literal<"oauth2">;
|
|
117
121
|
readonly authorizationUrl: Schema.String;
|
|
118
122
|
readonly tokenUrl: Schema.String;
|
|
123
|
+
readonly resource: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
119
124
|
readonly scopes: Schema.$Array<Schema.String>;
|
|
125
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
120
126
|
}>, Schema.Struct<{
|
|
121
127
|
readonly slug: Schema.String;
|
|
122
128
|
readonly kind: Schema.Literal<"apikey">;
|
|
@@ -137,7 +143,9 @@ export declare const OpenApiGroup: HttpApiGroup.HttpApiGroup<"openapi", HttpApiE
|
|
|
137
143
|
readonly kind: Schema.Literal<"oauth2">;
|
|
138
144
|
readonly authorizationUrl: Schema.String;
|
|
139
145
|
readonly tokenUrl: Schema.String;
|
|
146
|
+
readonly resource: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
140
147
|
readonly scopes: Schema.$Array<Schema.String>;
|
|
148
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
141
149
|
}>, Schema.Struct<{
|
|
142
150
|
readonly slug: Schema.optional<Schema.String>;
|
|
143
151
|
readonly type: Schema.Literal<"apiKey">;
|
|
@@ -158,7 +166,9 @@ export declare const OpenApiGroup: HttpApiGroup.HttpApiGroup<"openapi", HttpApiE
|
|
|
158
166
|
readonly kind: Schema.Literal<"oauth2">;
|
|
159
167
|
readonly authorizationUrl: Schema.String;
|
|
160
168
|
readonly tokenUrl: Schema.String;
|
|
169
|
+
readonly resource: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
161
170
|
readonly scopes: Schema.$Array<Schema.String>;
|
|
171
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
162
172
|
}>, Schema.Struct<{
|
|
163
173
|
readonly slug: Schema.String;
|
|
164
174
|
readonly kind: Schema.Literal<"apikey">;
|
package/dist/api/index.d.ts
CHANGED
|
@@ -65,6 +65,7 @@ export declare const openApiHttpPlugin: import("@executor-js/sdk/core").Configur
|
|
|
65
65
|
readonly secretHeaders: readonly string[];
|
|
66
66
|
}[];
|
|
67
67
|
readonly oauth2Presets: readonly {
|
|
68
|
+
readonly resource: import("effect/Option").Option<string>;
|
|
68
69
|
readonly label: string;
|
|
69
70
|
readonly authorizationUrl: import("effect/Option").Option<string>;
|
|
70
71
|
readonly tokenUrl: string;
|
|
@@ -75,6 +76,7 @@ export declare const openApiHttpPlugin: import("@executor-js/sdk/core").Configur
|
|
|
75
76
|
readonly flow: "authorizationCode" | "clientCredentials";
|
|
76
77
|
readonly identityScopes: false | "auto" | readonly string[];
|
|
77
78
|
readonly securitySchemeName: string;
|
|
79
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
78
80
|
}[];
|
|
79
81
|
readonly operationCount: number;
|
|
80
82
|
}, import("../sdk").OpenApiParseError | import("../sdk").OpenApiExtractionError, never>;
|
|
@@ -146,9 +148,11 @@ export declare const openApiHttpPlugin: import("@executor-js/sdk/core").Configur
|
|
|
146
148
|
readonly flow: import("effect/Schema").Literals<readonly ["authorizationCode", "clientCredentials"]>;
|
|
147
149
|
readonly authorizationUrl: import("effect/Schema").OptionFromOptional<import("effect/Schema").String>;
|
|
148
150
|
readonly tokenUrl: import("effect/Schema").String;
|
|
151
|
+
readonly resource: import("effect/Schema").OptionFromOptional<import("effect/Schema").String>;
|
|
149
152
|
readonly refreshUrl: import("effect/Schema").OptionFromOptional<import("effect/Schema").String>;
|
|
150
153
|
readonly scopes: import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").String>;
|
|
151
154
|
readonly identityScopes: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"auto">, import("effect/Schema").Literal<false>, import("effect/Schema").$Array<import("effect/Schema").String>]>;
|
|
155
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
152
156
|
}>>;
|
|
153
157
|
}>>, import("effect/unstable/httpapi/HttpApiEndpoint").Json<typeof import("@executor-js/sdk/core").IntegrationAlreadyExistsError | typeof import("@executor-js/api").InternalError | typeof import("../sdk").OpenApiParseError | typeof import("../sdk").OpenApiExtractionError | typeof import("../sdk").OpenApiOAuthError>, never, never> | import("effect/unstable/httpapi/HttpApiEndpoint").HttpApiEndpoint<"addSpec", "POST", "/openapi/specs", import("effect/unstable/httpapi/HttpApiEndpoint").StringTree<never>, import("effect/unstable/httpapi/HttpApiEndpoint").StringTree<never>, import("effect/unstable/httpapi/HttpApiEndpoint").Json<import("effect/Schema").Struct<{
|
|
154
158
|
readonly spec: import("effect/Schema").Union<readonly [import("effect/Schema").Struct<{
|
|
@@ -169,7 +173,9 @@ export declare const openApiHttpPlugin: import("@executor-js/sdk/core").Configur
|
|
|
169
173
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
170
174
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
171
175
|
readonly tokenUrl: import("effect/Schema").String;
|
|
176
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
172
177
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
178
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
173
179
|
}>, import("effect/Schema").Struct<{
|
|
174
180
|
readonly slug: import("effect/Schema").optional<import("effect/Schema").String>;
|
|
175
181
|
readonly type: import("effect/Schema").Literal<"apiKey">;
|
|
@@ -206,7 +212,9 @@ export declare const openApiHttpPlugin: import("@executor-js/sdk/core").Configur
|
|
|
206
212
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
207
213
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
208
214
|
readonly tokenUrl: import("effect/Schema").String;
|
|
215
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
209
216
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
217
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
210
218
|
}>, import("effect/Schema").Struct<{
|
|
211
219
|
readonly slug: import("effect/Schema").String;
|
|
212
220
|
readonly kind: import("effect/Schema").Literal<"apikey">;
|
|
@@ -227,7 +235,9 @@ export declare const openApiHttpPlugin: import("@executor-js/sdk/core").Configur
|
|
|
227
235
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
228
236
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
229
237
|
readonly tokenUrl: import("effect/Schema").String;
|
|
238
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
230
239
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
240
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
231
241
|
}>, import("effect/Schema").Struct<{
|
|
232
242
|
readonly slug: import("effect/Schema").optional<import("effect/Schema").String>;
|
|
233
243
|
readonly type: import("effect/Schema").Literal<"apiKey">;
|
|
@@ -248,7 +258,9 @@ export declare const openApiHttpPlugin: import("@executor-js/sdk/core").Configur
|
|
|
248
258
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
249
259
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
250
260
|
readonly tokenUrl: import("effect/Schema").String;
|
|
261
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
251
262
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
263
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
252
264
|
}>, import("effect/Schema").Struct<{
|
|
253
265
|
readonly slug: import("effect/Schema").String;
|
|
254
266
|
readonly kind: import("effect/Schema").Literal<"apikey">;
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
OpenApiOAuthError,
|
|
4
4
|
OpenApiParseError,
|
|
5
5
|
SpecPreviewSummary
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-WWZ7B34D.js";
|
|
7
7
|
|
|
8
8
|
// src/react/atoms.ts
|
|
9
9
|
import * as Atom from "effect/unstable/reactivity/Atom";
|
|
@@ -54,7 +54,9 @@ var OAuthTemplatePayload = Schema.Struct({
|
|
|
54
54
|
kind: Schema.Literal("oauth2"),
|
|
55
55
|
authorizationUrl: Schema.String,
|
|
56
56
|
tokenUrl: Schema.String,
|
|
57
|
-
|
|
57
|
+
resource: Schema.optional(Schema.NullOr(Schema.String)),
|
|
58
|
+
scopes: Schema.Array(Schema.String),
|
|
59
|
+
supportsClientIdMetadataDocument: Schema.optional(Schema.Boolean)
|
|
58
60
|
});
|
|
59
61
|
var AuthenticationPayload = Schema.Union([OAuthTemplatePayload, ApiKeyAuthTemplate]);
|
|
60
62
|
var AuthenticationResponse = Schema.Union([OAuthTemplatePayload, ApiKeyAuthMethod]);
|
|
@@ -186,4 +188,4 @@ export {
|
|
|
186
188
|
updateOpenApiSpec,
|
|
187
189
|
openapiConfigure
|
|
188
190
|
};
|
|
189
|
-
//# sourceMappingURL=chunk-
|
|
191
|
+
//# sourceMappingURL=chunk-562TAVB2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/atoms.ts","../src/react/client.ts","../src/api/group.ts"],"sourcesContent":["import type { IntegrationSlug } from \"@executor-js/sdk/shared\";\nimport * as Atom from \"effect/unstable/reactivity/Atom\";\nimport { ReactivityKey } from \"@executor-js/react/api/reactivity-keys\";\nimport { OpenApiClient } from \"./client\";\n\n// ---------------------------------------------------------------------------\n// Query atoms — v2: the integration catalog is the unit of identity (the v1\n// per-scope `source` row is gone). `getIntegration` returns the catalog entry\n// (slug/description/kind/canRemove/canRefresh); credentials are owner-scoped\n// connections read from the shared `connections` API, not bound per source.\n// ---------------------------------------------------------------------------\n\nexport const openApiIntegrationAtom = (slug: IntegrationSlug) =>\n OpenApiClient.query(\"openapi\", \"getIntegration\", {\n params: { slug },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.integrations, ReactivityKey.tools],\n });\n\n// The full opaque config (including `authenticationTemplate`), used by the\n// configure UX to render existing auth methods and add custom ones.\nexport const openApiConfigAtom = (slug: IntegrationSlug) =>\n OpenApiClient.query(\"openapi\", \"getConfig\", {\n params: { slug },\n timeToLive: \"15 seconds\",\n reactivityKeys: [ReactivityKey.integrations, ReactivityKey.tools],\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 removeOpenApiSpec = OpenApiClient.mutation(\"openapi\", \"removeSpec\");\n\n/** Re-fetch (or replace) the integration's spec and rebuild its tools in\n * place — connections, policies, and the description survive. Pass\n * `reactivityKeys: integrationWriteKeys` at the call site. */\nexport const updateOpenApiSpec = OpenApiClient.mutation(\"openapi\", \"updateSpec\");\n\n// Add / merge custom auth methods onto an integration's `authenticationTemplate`.\nexport const openapiConfigure = OpenApiClient.mutation(\"openapi\", \"configure\");\n\n// `getIntegration` is read-only; the atom family lets a caller pass a slug.\nexport const openApiIntegrationFamily = Atom.family(openApiIntegrationAtom);\n\n// `getConfig` is read-only; the atom family lets a caller pass a slug.\nexport const openApiConfigFamily = Atom.family(openApiConfigAtom);\n","import { createPluginAtomClient } from \"@executor-js/sdk/client\";\nimport {\n getExecutorOrganizationHeaders,\n getExecutorApiBaseUrl,\n getExecutorServerAuthorizationHeader,\n} from \"@executor-js/react/api/server-connection\";\nimport { OpenApiGroup } from \"../api/group\";\n\nexport const OpenApiClient = createPluginAtomClient(OpenApiGroup, {\n baseUrl: getExecutorApiBaseUrl,\n authorizationHeader: getExecutorServerAuthorizationHeader,\n headers: getExecutorOrganizationHeaders,\n});\n","import { HttpApiEndpoint, HttpApiGroup } from \"effect/unstable/httpapi\";\nimport { Schema } from \"effect\";\nimport { ApiKeyAuthMethod, ApiKeyAuthTemplate } from \"@executor-js/sdk/http-auth\";\nimport {\n InternalError,\n IntegrationAlreadyExistsError,\n IntegrationNotFoundError,\n IntegrationSlug,\n} from \"@executor-js/sdk/shared\";\n\nimport { OpenApiParseError, OpenApiExtractionError, OpenApiOAuthError } from \"../sdk/errors\";\nimport { SpecPreviewSummary } from \"../sdk/preview\";\n\n// ---------------------------------------------------------------------------\n// Errors — the plugin-domain tagged errors flow directly to clients\n// (4xx, each carrying its own `httpApiStatus`). `InternalError` is the shared\n// opaque 500 surface; `StorageError` → `InternalError` translation happens at\n// service wiring time. `IntegrationAlreadyExistsError` (409) blocks re-adding\n// an existing slug — see addSpec.\n// ---------------------------------------------------------------------------\n\nconst DomainErrors = [\n InternalError,\n OpenApiParseError,\n OpenApiExtractionError,\n OpenApiOAuthError,\n IntegrationAlreadyExistsError,\n] as const;\n\nconst IntegrationNotFound = IntegrationNotFoundError.annotate({ httpApiStatus: 404 });\n\nconst UpdateSpecErrors = [\n InternalError,\n OpenApiParseError,\n OpenApiExtractionError,\n OpenApiOAuthError,\n IntegrationNotFound,\n] as const;\n\nconst SlugParams = {\n slug: Schema.String,\n};\n\n// ---------------------------------------------------------------------------\n// Payloads\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 OAuthTemplatePayload = Schema.Struct({\n slug: Schema.String,\n kind: Schema.Literal(\"oauth2\"),\n authorizationUrl: Schema.String,\n tokenUrl: Schema.String,\n resource: Schema.optional(Schema.NullOr(Schema.String)),\n scopes: Schema.Array(Schema.String),\n supportsClientIdMetadataDocument: Schema.optional(Schema.Boolean),\n});\n\n/** Auth INPUTS: oauth templates + the request-shaped apikey dialect. */\nconst AuthenticationPayload = Schema.Union([OAuthTemplatePayload, ApiKeyAuthTemplate]);\n\n/** Auth in RESPONSES: the canonical stored shapes (placements). */\nconst AuthenticationResponse = Schema.Union([OAuthTemplatePayload, ApiKeyAuthMethod]);\n\nconst AddSpecPayload = Schema.Struct({\n spec: OpenApiSpecInputPayload,\n slug: Schema.String,\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n baseUrl: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n queryParams: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n authenticationTemplate: Schema.optional(Schema.Array(AuthenticationPayload)),\n});\n\nconst PreviewSpecPayload = Schema.Struct({\n spec: Schema.String,\n});\n\n// The `configure` payload — the new/updated auth methods to merge onto the\n// integration's `authenticationTemplate`. Reuses the same `AuthenticationPayload`\n// schema as `addSpec` so a custom apiKey method round-trips identically.\nconst ConfigurePayload = Schema.Struct({\n authenticationTemplate: Schema.Array(AuthenticationPayload),\n mode: Schema.optional(Schema.Literals([\"merge\", \"replace\"])),\n});\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\n\nconst AddSpecResponse = Schema.Struct({\n slug: IntegrationSlug,\n toolCount: Schema.Number,\n});\n\n// Update the spec in place. Body optional fields only: an empty payload means\n// \"re-fetch from the stored source URL\".\nconst UpdateSpecPayload = Schema.Struct({\n spec: Schema.optional(OpenApiSpecInputPayload),\n});\n\nconst UpdateSpecResponse = Schema.Struct({\n slug: IntegrationSlug,\n toolCount: Schema.Number,\n /** Tool names new in this spec version (same diff for every connection). */\n addedTools: Schema.Array(Schema.String),\n /** Tool names the new spec no longer defines. */\n removedTools: Schema.Array(Schema.String),\n});\n\nconst IntegrationView = Schema.Struct({\n slug: IntegrationSlug,\n description: Schema.String,\n kind: Schema.String,\n canRemove: Schema.Boolean,\n canRefresh: Schema.Boolean,\n});\n\n// The integration config surfaced for the configure UX. Unlike\n// `IntegrationView` (catalog identity only), this carries the\n// `authenticationTemplate` the configure flow reads/writes. The spec text is\n// deliberately NOT served: it's a multi-MB build artifact in the plugin blob\n// store, and no client reads it (the configure UI only touches the template).\nconst OpenApiConfigView = Schema.Struct({\n sourceUrl: Schema.optional(Schema.String),\n baseUrl: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n queryParams: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n authenticationTemplate: Schema.optional(Schema.Array(AuthenticationResponse)),\n});\n\n// The configure result — the merged `authenticationTemplate` after the new\n// custom methods were appended/replaced.\nconst ConfigureResponse = Schema.Struct({\n authenticationTemplate: Schema.Array(AuthenticationResponse),\n});\n\n// ---------------------------------------------------------------------------\n// Group — addSpec/preview/get/remove over the integration catalog.\n// ---------------------------------------------------------------------------\n\nexport const OpenApiGroup = HttpApiGroup.make(\"openapi\")\n .add(\n HttpApiEndpoint.post(\"previewSpec\", \"/openapi/preview\", {\n payload: PreviewSpecPayload,\n success: SpecPreviewSummary,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"addSpec\", \"/openapi/specs\", {\n payload: AddSpecPayload,\n success: AddSpecResponse,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getIntegration\", \"/openapi/integrations/:slug\", {\n params: SlugParams,\n success: Schema.NullOr(IntegrationView),\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.get(\"getConfig\", \"/openapi/integrations/:slug/config\", {\n params: SlugParams,\n success: Schema.NullOr(OpenApiConfigView),\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"configure\", \"/openapi/integrations/:slug/config\", {\n params: SlugParams,\n payload: ConfigurePayload,\n success: ConfigureResponse,\n error: DomainErrors,\n }),\n )\n .add(\n HttpApiEndpoint.post(\"updateSpec\", \"/openapi/integrations/:slug/spec\", {\n params: SlugParams,\n payload: UpdateSpecPayload,\n success: UpdateSpecResponse,\n error: UpdateSpecErrors,\n }),\n )\n .add(\n HttpApiEndpoint.delete(\"removeSpec\", \"/openapi/integrations/:slug\", {\n params: SlugParams,\n success: Schema.Void,\n error: DomainErrors,\n }),\n );\n"],"mappings":"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","names":[]}
|
|
@@ -22,7 +22,9 @@ var oauthAuthMethod = (template) => {
|
|
|
22
22
|
oauth: {
|
|
23
23
|
authorizationUrl: template.authorizationUrl,
|
|
24
24
|
tokenUrl: template.tokenUrl,
|
|
25
|
-
|
|
25
|
+
resource: template.resource ?? null,
|
|
26
|
+
scopes: template.scopes,
|
|
27
|
+
supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument
|
|
26
28
|
}
|
|
27
29
|
};
|
|
28
30
|
};
|
|
@@ -45,7 +47,9 @@ function editorValueFromAuthentication(template) {
|
|
|
45
47
|
kind: "oauth",
|
|
46
48
|
authorizationUrl: template.authorizationUrl ?? "",
|
|
47
49
|
tokenUrl: template.tokenUrl ?? "",
|
|
48
|
-
|
|
50
|
+
resource: template.resource ?? null,
|
|
51
|
+
scopes: template.scopes ?? [],
|
|
52
|
+
supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument
|
|
49
53
|
};
|
|
50
54
|
}
|
|
51
55
|
return editorValueFromSharedMethod(template);
|
|
@@ -55,7 +59,9 @@ var oauthTemplateFromEditorValue = (value, slug) => ({
|
|
|
55
59
|
kind: "oauth2",
|
|
56
60
|
authorizationUrl: value.authorizationUrl,
|
|
57
61
|
tokenUrl: value.tokenUrl,
|
|
58
|
-
|
|
62
|
+
resource: value.resource ?? null,
|
|
63
|
+
scopes: [...value.scopes],
|
|
64
|
+
...value.supportsClientIdMetadataDocument === true ? { supportsClientIdMetadataDocument: true } : {}
|
|
59
65
|
});
|
|
60
66
|
function authenticationFromEditorValue(value, slug) {
|
|
61
67
|
if (value.kind === "none") return null;
|
|
@@ -70,4 +76,4 @@ export {
|
|
|
70
76
|
editorValueFromAuthentication,
|
|
71
77
|
authenticationFromEditorValue
|
|
72
78
|
};
|
|
73
|
-
//# sourceMappingURL=chunk-
|
|
79
|
+
//# sourceMappingURL=chunk-56PVOO6X.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/auth-method-config.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// OpenAPI ↔ generic auth-method converters — a thin oauth adapter over the\n// shared codec (`@executor-js/react/lib/shared-auth-method-codec`). The\n// apikey/none paths (multi-placement, multi-variable) live in the shared\n// codec; OpenAPI only contributes its oauth flavor: stored endpoints + scopes\n// (`kind: \"oauth2\"`, the core `OAuthAuthentication` shape) that pre-fill the client-registration form.\n// ---------------------------------------------------------------------------\n\nimport { AuthTemplateSlug } from \"@executor-js/sdk/shared\";\nimport type { AuthMethod, Placement } from \"@executor-js/react/lib/auth-placements\";\nimport type { AuthTemplateEditorValue } from \"@executor-js/react/components/auth-template-editor\";\nimport {\n authMethodFromSharedTemplate,\n editorPlacementsFromWire,\n editorValueFromSharedMethod,\n wireAuthInputFromShared,\n wirePlacementsFromEditor,\n} from \"@executor-js/react/lib/shared-auth-method-codec\";\n\nimport type { APIKeyAuthentication, Authentication, AuthenticationInput } from \"../sdk/types\";\n\n/** Serialize a canonical method into the wire input union (apikey → the\n * request-shaped dialect; oauth passes through). */\nexport const openApiWireAuthInput = (method: Authentication): AuthenticationInput =>\n method.kind === \"oauth2\" ? method : (wireAuthInputFromShared(method) as AuthenticationInput);\n\nexport const placementsFromApiKey = (template: APIKeyAuthentication): readonly Placement[] =>\n editorPlacementsFromWire(template.placements);\n\nconst oauthAuthMethod = (template: Extract<Authentication, { kind: \"oauth2\" }>): AuthMethod => {\n const slug = String(template.slug);\n return {\n id: slug,\n label: \"OAuth2\",\n kind: \"oauth\",\n source: slug.startsWith(\"custom_\") ? \"custom\" : \"spec\",\n template: AuthTemplateSlug.make(slug),\n placements: [],\n // Carry the integration's declared endpoints/scopes so the\n // client-registration form pre-fills them.\n oauth: {\n authorizationUrl: template.authorizationUrl,\n tokenUrl: template.tokenUrl,\n scopes: template.scopes,\n },\n };\n};\n\n/** Map each stored auth template to a generic `AuthMethod`. */\nexport function authMethodsFromConfig(templates: readonly Authentication[]): AuthMethod[] {\n return templates.map((template: Authentication): AuthMethod => {\n if (template.kind === \"oauth2\") return oauthAuthMethod(template);\n return authMethodFromSharedTemplate(template);\n });\n}\n\n/** Build an apikey method from generic placements. When `slug` is omitted the\n * backend assigns a `custom_<id>` slug. */\nexport function templateFromPlacements(\n placements: readonly Placement[],\n slug?: string,\n): APIKeyAuthentication {\n return {\n slug: slug ?? \"\",\n kind: \"apikey\",\n placements: wirePlacementsFromEditor(placements),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Stored `Authentication` ⇆ generic `AuthTemplateEditorValue`.\n// ---------------------------------------------------------------------------\n\n/** Convert one stored `Authentication` template into a generic editor value. */\nexport function editorValueFromAuthentication(template: Authentication): AuthTemplateEditorValue {\n if (template.kind === \"oauth2\") {\n return {\n kind: \"oauth\",\n authorizationUrl: template.authorizationUrl ?? \"\",\n tokenUrl: template.tokenUrl ?? \"\",\n scopes: template.scopes ?? [],\n };\n }\n return editorValueFromSharedMethod(template);\n}\n\n/** Build an `OAuthAuthentication` template from a generic oauth editor value. */\nconst oauthTemplateFromEditorValue = (\n value: Extract<AuthTemplateEditorValue, { kind: \"oauth\" }>,\n slug?: string,\n): Authentication => ({\n slug: AuthTemplateSlug.make(slug ?? \"\"),\n kind: \"oauth2\",\n authorizationUrl: value.authorizationUrl,\n tokenUrl: value.tokenUrl,\n scopes: [...value.scopes],\n});\n\n/** Convert one generic editor value back into a stored `Authentication`, or\n * `null` for `none` (no method to register). The optional `slug` names the\n * template; when omitted the backend backfills `custom_<id>`. */\nexport function authenticationFromEditorValue(\n value: AuthTemplateEditorValue,\n slug?: string,\n): Authentication | null {\n if (value.kind === \"none\") return null;\n if (value.kind === \"oauth\") return oauthTemplateFromEditorValue(value, slug);\n return templateFromPlacements(value.placements, slug);\n}\n"],"mappings":";AAQA,SAAS,wBAAwB;AAGjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMA,IAAM,uBAAuB,CAAC,WACnC,OAAO,SAAS,WAAW,SAAU,wBAAwB,MAAM;AAKrE,IAAM,kBAAkB,CAAC,aAAsE;AAC7F,QAAM,OAAO,OAAO,SAAS,IAAI;AACjC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ,KAAK,WAAW,SAAS,IAAI,WAAW;AAAA,IAChD,UAAU,iBAAiB,KAAK,IAAI;AAAA,IACpC,YAAY,CAAC;AAAA;AAAA;AAAA,IAGb,OAAO;AAAA,MACL,kBAAkB,SAAS;AAAA,MAC3B,UAAU,SAAS;AAAA,MACnB,QAAQ,SAAS;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/react/auth-method-config.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// OpenAPI ↔ generic auth-method converters — a thin oauth adapter over the\n// shared codec (`@executor-js/react/lib/shared-auth-method-codec`). The\n// apikey/none paths (multi-placement, multi-variable) live in the shared\n// codec; OpenAPI only contributes its oauth flavor: stored endpoints + scopes\n// (`kind: \"oauth2\"`, the core `OAuthAuthentication` shape) that pre-fill the client-registration form.\n// ---------------------------------------------------------------------------\n\nimport { AuthTemplateSlug } from \"@executor-js/sdk/shared\";\nimport type { AuthMethod, Placement } from \"@executor-js/react/lib/auth-placements\";\nimport type { AuthTemplateEditorValue } from \"@executor-js/react/components/auth-template-editor\";\nimport {\n authMethodFromSharedTemplate,\n editorPlacementsFromWire,\n editorValueFromSharedMethod,\n wireAuthInputFromShared,\n wirePlacementsFromEditor,\n} from \"@executor-js/react/lib/shared-auth-method-codec\";\n\nimport type { APIKeyAuthentication, Authentication, AuthenticationInput } from \"../sdk/types\";\n\n/** Serialize a canonical method into the wire input union (apikey → the\n * request-shaped dialect; oauth passes through). */\nexport const openApiWireAuthInput = (method: Authentication): AuthenticationInput =>\n method.kind === \"oauth2\" ? method : (wireAuthInputFromShared(method) as AuthenticationInput);\n\nexport const placementsFromApiKey = (template: APIKeyAuthentication): readonly Placement[] =>\n editorPlacementsFromWire(template.placements);\n\nconst oauthAuthMethod = (template: Extract<Authentication, { kind: \"oauth2\" }>): AuthMethod => {\n const slug = String(template.slug);\n return {\n id: slug,\n label: \"OAuth2\",\n kind: \"oauth\",\n source: slug.startsWith(\"custom_\") ? \"custom\" : \"spec\",\n template: AuthTemplateSlug.make(slug),\n placements: [],\n // Carry the integration's declared endpoints/scopes so the\n // client-registration form pre-fills them.\n oauth: {\n authorizationUrl: template.authorizationUrl,\n tokenUrl: template.tokenUrl,\n resource: template.resource ?? null,\n scopes: template.scopes,\n supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument,\n },\n };\n};\n\n/** Map each stored auth template to a generic `AuthMethod`. */\nexport function authMethodsFromConfig(templates: readonly Authentication[]): AuthMethod[] {\n return templates.map((template: Authentication): AuthMethod => {\n if (template.kind === \"oauth2\") return oauthAuthMethod(template);\n return authMethodFromSharedTemplate(template);\n });\n}\n\n/** Build an apikey method from generic placements. When `slug` is omitted the\n * backend assigns a `custom_<id>` slug. */\nexport function templateFromPlacements(\n placements: readonly Placement[],\n slug?: string,\n): APIKeyAuthentication {\n return {\n slug: slug ?? \"\",\n kind: \"apikey\",\n placements: wirePlacementsFromEditor(placements),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Stored `Authentication` ⇆ generic `AuthTemplateEditorValue`.\n// ---------------------------------------------------------------------------\n\n/** Convert one stored `Authentication` template into a generic editor value. */\nexport function editorValueFromAuthentication(template: Authentication): AuthTemplateEditorValue {\n if (template.kind === \"oauth2\") {\n return {\n kind: \"oauth\",\n authorizationUrl: template.authorizationUrl ?? \"\",\n tokenUrl: template.tokenUrl ?? \"\",\n resource: template.resource ?? null,\n scopes: template.scopes ?? [],\n supportsClientIdMetadataDocument: template.supportsClientIdMetadataDocument,\n };\n }\n return editorValueFromSharedMethod(template);\n}\n\n/** Build an `OAuthAuthentication` template from a generic oauth editor value. */\nconst oauthTemplateFromEditorValue = (\n value: Extract<AuthTemplateEditorValue, { kind: \"oauth\" }>,\n slug?: string,\n): Authentication => ({\n slug: AuthTemplateSlug.make(slug ?? \"\"),\n kind: \"oauth2\",\n authorizationUrl: value.authorizationUrl,\n tokenUrl: value.tokenUrl,\n resource: value.resource ?? null,\n scopes: [...value.scopes],\n ...(value.supportsClientIdMetadataDocument === true\n ? { supportsClientIdMetadataDocument: true }\n : {}),\n});\n\n/** Convert one generic editor value back into a stored `Authentication`, or\n * `null` for `none` (no method to register). The optional `slug` names the\n * template; when omitted the backend backfills `custom_<id>`. */\nexport function authenticationFromEditorValue(\n value: AuthTemplateEditorValue,\n slug?: string,\n): Authentication | null {\n if (value.kind === \"none\") return null;\n if (value.kind === \"oauth\") return oauthTemplateFromEditorValue(value, slug);\n return templateFromPlacements(value.placements, slug);\n}\n"],"mappings":";AAQA,SAAS,wBAAwB;AAGjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMA,IAAM,uBAAuB,CAAC,WACnC,OAAO,SAAS,WAAW,SAAU,wBAAwB,MAAM;AAKrE,IAAM,kBAAkB,CAAC,aAAsE;AAC7F,QAAM,OAAO,OAAO,SAAS,IAAI;AACjC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ,KAAK,WAAW,SAAS,IAAI,WAAW;AAAA,IAChD,UAAU,iBAAiB,KAAK,IAAI;AAAA,IACpC,YAAY,CAAC;AAAA;AAAA;AAAA,IAGb,OAAO;AAAA,MACL,kBAAkB,SAAS;AAAA,MAC3B,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS,YAAY;AAAA,MAC/B,QAAQ,SAAS;AAAA,MACjB,kCAAkC,SAAS;AAAA,IAC7C;AAAA,EACF;AACF;AAGO,SAAS,sBAAsB,WAAoD;AACxF,SAAO,UAAU,IAAI,CAAC,aAAyC;AAC7D,QAAI,SAAS,SAAS,SAAU,QAAO,gBAAgB,QAAQ;AAC/D,WAAO,6BAA6B,QAAQ;AAAA,EAC9C,CAAC;AACH;AAIO,SAAS,uBACd,YACA,MACsB;AACtB,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,YAAY,yBAAyB,UAAU;AAAA,EACjD;AACF;AAOO,SAAS,8BAA8B,UAAmD;AAC/F,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,kBAAkB,SAAS,oBAAoB;AAAA,MAC/C,UAAU,SAAS,YAAY;AAAA,MAC/B,UAAU,SAAS,YAAY;AAAA,MAC/B,QAAQ,SAAS,UAAU,CAAC;AAAA,MAC5B,kCAAkC,SAAS;AAAA,IAC7C;AAAA,EACF;AACA,SAAO,4BAA4B,QAAQ;AAC7C;AAGA,IAAM,+BAA+B,CACnC,OACA,UACoB;AAAA,EACpB,MAAM,iBAAiB,KAAK,QAAQ,EAAE;AAAA,EACtC,MAAM;AAAA,EACN,kBAAkB,MAAM;AAAA,EACxB,UAAU,MAAM;AAAA,EAChB,UAAU,MAAM,YAAY;AAAA,EAC5B,QAAQ,CAAC,GAAG,MAAM,MAAM;AAAA,EACxB,GAAI,MAAM,qCAAqC,OAC3C,EAAE,kCAAkC,KAAK,IACzC,CAAC;AACP;AAKO,SAAS,8BACd,OACA,MACuB;AACvB,MAAI,MAAM,SAAS,OAAQ,QAAO;AAClC,MAAI,MAAM,SAAS,QAAS,QAAO,6BAA6B,OAAO,IAAI;AAC3E,SAAO,uBAAuB,MAAM,YAAY,IAAI;AACtD;","names":[]}
|