@executor-js/plugin-openapi 1.5.14 → 1.5.15

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.
@@ -2,7 +2,7 @@ import {
2
2
  compactGoogleOAuthScopes,
3
3
  detectedAuthenticationTemplates,
4
4
  isGoogleDiscoveryUrl
5
- } from "./chunk-I2XDCVVM.js";
5
+ } from "./chunk-UOLBAX5D.js";
6
6
  import {
7
7
  openApiPresets
8
8
  } from "./chunk-PAHWRRS3.js";
@@ -19,10 +19,10 @@ import {
19
19
  import {
20
20
  addOpenApiSpec,
21
21
  previewOpenApiSpec
22
- } from "./chunk-GS5YN6J4.js";
22
+ } from "./chunk-NJ4Q3VF4.js";
23
23
  import {
24
24
  resolveServerUrl
25
- } from "./chunk-RFSMGUBJ.js";
25
+ } from "./chunk-O54VFSWE.js";
26
26
 
27
27
  // src/react/AddOpenApiSource.tsx
28
28
  import { useCallback, useEffect, useMemo as useMemo2, useRef, useState as useState2 } from "react";
@@ -762,4 +762,4 @@ function AddOpenApiSource(props) {
762
762
  export {
763
763
  AddOpenApiSource as default
764
764
  };
765
- //# sourceMappingURL=AddOpenApiSource-7TI5XUUY.js.map
765
+ //# sourceMappingURL=AddOpenApiSource-IRMLVLDK.js.map
@@ -9,8 +9,8 @@ import {
9
9
  import {
10
10
  openApiConfigAtom,
11
11
  openapiConfigure
12
- } from "./chunk-GS5YN6J4.js";
13
- import "./chunk-RFSMGUBJ.js";
12
+ } from "./chunk-NJ4Q3VF4.js";
13
+ import "./chunk-O54VFSWE.js";
14
14
 
15
15
  // src/react/OpenApiAccountsPanel.tsx
16
16
  import { useCallback, useMemo } from "react";
@@ -111,4 +111,4 @@ function OpenApiAccountsPanel(props) {
111
111
  export {
112
112
  OpenApiAccountsPanel as default
113
113
  };
114
- //# sourceMappingURL=OpenApiAccountsPanel-Y2RGBSSL.js.map
114
+ //# sourceMappingURL=OpenApiAccountsPanel-X5Z5XKRM.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  openApiConfigAtom,
3
3
  updateOpenApiSpec
4
- } from "./chunk-GS5YN6J4.js";
5
- import "./chunk-RFSMGUBJ.js";
4
+ } from "./chunk-NJ4Q3VF4.js";
5
+ import "./chunk-O54VFSWE.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-MIZ5GLBM.js.map
104
+ //# sourceMappingURL=UpdateSpecSection-Z2DEEWZW.js.map
@@ -3,7 +3,7 @@ import {
3
3
  OpenApiOAuthError,
4
4
  OpenApiParseError,
5
5
  SpecPreview
6
- } from "./chunk-RFSMGUBJ.js";
6
+ } from "./chunk-O54VFSWE.js";
7
7
 
8
8
  // src/react/atoms.ts
9
9
  import * as Atom from "effect/unstable/reactivity/Atom";
@@ -195,4 +195,4 @@ export {
195
195
  updateOpenApiSpec,
196
196
  openapiConfigure
197
197
  };
198
- //# sourceMappingURL=chunk-GS5YN6J4.js.map
198
+ //# sourceMappingURL=chunk-NJ4Q3VF4.js.map
@@ -227,6 +227,18 @@ var OperationRequestBody = Schema3.Struct({
227
227
  * fall back to `{contentType, schema}`. */
228
228
  contents: Schema3.OptionFromOptional(Schema3.Array(MediaBinding))
229
229
  });
230
+ var OperationFileHint = Schema3.Struct({
231
+ kind: Schema3.Literals(["binaryResponse", "byteField"]),
232
+ mimeType: Schema3.OptionFromOptional(Schema3.String),
233
+ dataField: Schema3.OptionFromOptional(Schema3.String),
234
+ sizeField: Schema3.OptionFromOptional(Schema3.String),
235
+ encoding: Schema3.OptionFromOptional(Schema3.Literals(["base64", "base64url"]))
236
+ });
237
+ var OperationResponseBody = Schema3.Struct({
238
+ contentType: Schema3.String,
239
+ schema: Schema3.OptionFromOptional(Schema3.Unknown),
240
+ fileHint: Schema3.OptionFromOptional(OperationFileHint)
241
+ });
230
242
  var ServerVariable = Schema3.Struct({
231
243
  default: Schema3.String,
232
244
  enum: Schema3.OptionFromOptional(Schema3.Array(Schema3.String)),
@@ -248,6 +260,7 @@ var ExtractedOperation = Schema3.Struct({
248
260
  tags: Schema3.Array(Schema3.String),
249
261
  parameters: Schema3.Array(OperationParameter),
250
262
  requestBody: Schema3.OptionFromOptional(OperationRequestBody),
263
+ responseBody: Schema3.OptionFromOptional(OperationResponseBody),
251
264
  inputSchema: Schema3.OptionFromOptional(Schema3.Unknown),
252
265
  outputSchema: Schema3.OptionFromOptional(Schema3.Unknown),
253
266
  deprecated: Schema3.Boolean
@@ -265,7 +278,8 @@ var OperationBinding = Schema3.Struct({
265
278
  servers: Schema3.optional(Schema3.Array(ServerInfo)),
266
279
  pathTemplate: Schema3.String,
267
280
  parameters: Schema3.Array(OperationParameter),
268
- requestBody: Schema3.OptionFromOptional(OperationRequestBody)
281
+ requestBody: Schema3.OptionFromOptional(OperationRequestBody),
282
+ responseBody: Schema3.OptionFromOptional(OperationResponseBody)
269
283
  });
270
284
  var InvocationResult = Schema3.Struct({
271
285
  status: Schema3.Number,
@@ -349,7 +363,46 @@ var extractRequestBody = (operation, r) => {
349
363
  contents: Option.some(contents)
350
364
  });
351
365
  };
352
- var extractOutputSchema = (operation, r) => {
366
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
367
+ var stringType = (schema) => schema.type === "string" || Array.isArray(schema.type) && schema.type.includes("string");
368
+ var numericType = (schema) => schema.type === "integer" || schema.type === "number" || Array.isArray(schema.type) && (schema.type.includes("integer") || schema.type.includes("number"));
369
+ var normalizedMediaType = (mediaType) => mediaType.split(";")[0]?.trim().toLowerCase() ?? "";
370
+ var isJsonMediaType = (mediaType) => {
371
+ const normalized = normalizedMediaType(mediaType);
372
+ return normalized === "application/json" || normalized.includes("+json") || normalized.includes("json");
373
+ };
374
+ var binaryStringSchema = (schema) => stringType(schema) && (schema.format === "binary" || schema.format === "byte");
375
+ var base64EncodingFromDescription = (schema) => typeof schema.description === "string" && /base64url|base64-url|url[- ]safe/i.test(schema.description) ? "base64url" : "base64";
376
+ var detectFileHint = (schema, mediaType, r) => {
377
+ const resolved = isRecord(schema) ? r.resolve(schema) : null;
378
+ if (!resolved) return void 0;
379
+ if (!isJsonMediaType(mediaType) && binaryStringSchema(resolved)) {
380
+ return OperationFileHint.make({
381
+ kind: "binaryResponse",
382
+ mimeType: Option.some(mediaType),
383
+ dataField: Option.none(),
384
+ sizeField: Option.none(),
385
+ encoding: Option.none()
386
+ });
387
+ }
388
+ if (!isJsonMediaType(mediaType)) return void 0;
389
+ const properties = resolved.properties;
390
+ if (!isRecord(properties)) return void 0;
391
+ const data = properties.data;
392
+ const dataSchema = isRecord(data) ? r.resolve(data) : null;
393
+ if (!dataSchema || !binaryStringSchema(dataSchema)) return void 0;
394
+ const size = properties.size;
395
+ const sizeSchema = isRecord(size) ? r.resolve(size) : null;
396
+ const sizeField = sizeSchema && numericType(sizeSchema) ? "size" : void 0;
397
+ return OperationFileHint.make({
398
+ kind: "byteField",
399
+ mimeType: Option.some("application/octet-stream"),
400
+ dataField: Option.some("data"),
401
+ sizeField: sizeField ? Option.some(sizeField) : Option.none(),
402
+ encoding: Option.some(base64EncodingFromDescription(dataSchema))
403
+ });
404
+ };
405
+ var extractResponseBody = (operation, r) => {
353
406
  if (!operation.responses) return void 0;
354
407
  const entries = Object.entries(operation.responses);
355
408
  const preferred = [
@@ -360,7 +413,13 @@ var extractOutputSchema = (operation, r) => {
360
413
  const resp = r.resolve(ref);
361
414
  if (!resp) continue;
362
415
  const content = preferredResponseContent(resp.content);
363
- if (content?.media.schema) return content.media.schema;
416
+ if (content?.media.schema) {
417
+ return OperationResponseBody.make({
418
+ contentType: content.mediaType,
419
+ schema: Option.some(content.media.schema),
420
+ fileHint: Option.fromNullishOr(detectFileHint(content.media.schema, content.mediaType, r))
421
+ });
422
+ }
364
423
  }
365
424
  return void 0;
366
425
  };
@@ -501,9 +560,10 @@ var extract = Effect2.fn("OpenApi.extract")(function* (doc) {
501
560
  if (!operation) continue;
502
561
  const parameters = extractParameters(pathItem, operation, r);
503
562
  const requestBody = extractRequestBody(operation, r);
563
+ const responseBody = extractResponseBody(operation, r);
504
564
  const servers = operationServers(pathItem, operation, docServers);
505
565
  const inputSchema = buildInputSchema(parameters, requestBody, servers);
506
- const outputSchema = extractOutputSchema(operation, r);
566
+ const outputSchema = responseBody ? Option.getOrUndefined(responseBody.schema) : void 0;
507
567
  const tags = (operation.tags ?? []).filter((t) => t.trim().length > 0);
508
568
  const operationPathTemplate = explicitPathTemplate(operation) ?? pathTemplate;
509
569
  operations.push(
@@ -518,6 +578,7 @@ var extract = Effect2.fn("OpenApi.extract")(function* (doc) {
518
578
  tags,
519
579
  parameters,
520
580
  requestBody: Option.fromNullishOr(requestBody),
581
+ responseBody: Option.fromNullishOr(responseBody),
521
582
  inputSchema: Option.fromNullishOr(inputSchema),
522
583
  outputSchema: Option.fromNullishOr(outputSchema),
523
584
  deprecated: operation.deprecated === true
@@ -885,4 +946,4 @@ export {
885
946
  previewSpecText,
886
947
  previewSpec
887
948
  };
888
- //# sourceMappingURL=chunk-RFSMGUBJ.js.map
949
+ //# sourceMappingURL=chunk-O54VFSWE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/errors.ts","../src/sdk/parse.ts","../src/sdk/openapi-utils.ts","../src/sdk/types.ts","../src/sdk/extract.ts","../src/sdk/preview.ts"],"sourcesContent":["import { Data, Schema } from \"effect\";\nimport type { Option } from \"effect\";\nimport type { AuthToolFailureCode } from \"@executor-js/sdk/core\";\n\n// HTTP status lives on the class declaration so HttpApiBuilder's error\n// encoder (which reads `ast.annotations` off the schema it stored on\n// `group.addError(...)`) finds it. Applying the annotation post-hoc\n// via `.annotate(...)` in group.ts produced a transform-wrapper AST\n// whose status was not picked up — the error then slipped the typed\n// channel and was captured as a 500 by the observability middleware,\n// spamming Sentry on user misconfig.\nexport class OpenApiParseError extends Schema.TaggedErrorClass<OpenApiParseError>()(\n \"OpenApiParseError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class OpenApiExtractionError extends Schema.TaggedErrorClass<OpenApiExtractionError>()(\n \"OpenApiExtractionError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\nexport class OpenApiInvocationError extends Data.TaggedError(\"OpenApiInvocationError\")<{\n readonly message: string;\n readonly statusCode: Option.Option<number>;\n readonly cause?: unknown;\n}> {}\n\nexport class OpenApiOAuthError extends Schema.TaggedErrorClass<OpenApiOAuthError>()(\n \"OpenApiOAuthError\",\n {\n message: Schema.String,\n },\n { httpApiStatus: 400 },\n) {}\n\n// ---------------------------------------------------------------------------\n// Auth required — v2 reframes this around the connection (owner/integration/\n// name) that supplies the missing credential, not v1's source/slot/secret.\n// ---------------------------------------------------------------------------\n\nexport class OpenApiAuthRequiredError extends Data.TaggedError(\"OpenApiAuthRequiredError\")<{\n readonly code: AuthToolFailureCode;\n readonly message: string;\n readonly owner: \"org\" | \"user\";\n readonly integration: string;\n readonly connection: string;\n readonly credentialKind: \"secret\" | \"oauth\" | \"upstream\";\n readonly credentialLabel?: string;\n readonly status?: number;\n readonly details?: unknown;\n readonly cause?: unknown;\n}> {}\n","import type { OpenAPI, OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport { Duration, Effect, Schema } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport YAML from \"yaml\";\n\nimport { OpenApiExtractionError, OpenApiParseError } from \"./errors\";\n\nexport type ParsedDocument = OpenAPIV3.Document | OpenAPIV3_1.Document;\n\nexport interface SpecFetchCredentials {\n readonly headers?: Record<string, string>;\n readonly queryParams?: Record<string, string>;\n}\n\n// ExtractionError subclass raised from parse() for non-3.x specs\nclass OpenApiExtractionErrorFromParse extends OpenApiExtractionError {}\n\n/**\n * Fetch an OpenAPI spec URL and return its body text. Uses the Effect\n * HttpClient so the caller chooses the transport via layer — in Cloudflare\n * Workers, `FetchHttpClient.layer` binds to the Workers-native `fetch`.\n * Bounded by a 60s timeout.\n */\nexport const fetchSpecText = Effect.fn(\"OpenApi.fetchSpecText\")(function* (\n url: string,\n credentials?: SpecFetchCredentials,\n) {\n const client = yield* HttpClient.HttpClient;\n const requestUrl = new URL(url);\n for (const [name, value] of Object.entries(credentials?.queryParams ?? {})) {\n requestUrl.searchParams.set(name, value);\n }\n let request = HttpClientRequest.get(requestUrl.toString()).pipe(\n HttpClientRequest.setHeader(\"Accept\", \"application/json, application/yaml, text/yaml, */*\"),\n );\n for (const [name, value] of Object.entries(credentials?.headers ?? {})) {\n request = HttpClientRequest.setHeader(request, name, value);\n }\n const response = yield* client.execute(request).pipe(\n Effect.timeout(Duration.seconds(60)),\n Effect.mapError(\n (_cause) =>\n new OpenApiParseError({\n message: \"Failed to fetch OpenAPI document\",\n }),\n ),\n );\n if (response.status < 200 || response.status >= 300) {\n return yield* new OpenApiParseError({\n message: `Failed to fetch OpenAPI document: HTTP ${response.status}`,\n });\n }\n return yield* response.text.pipe(\n Effect.mapError(\n (_cause) =>\n new OpenApiParseError({\n message: \"Failed to read OpenAPI document body\",\n }),\n ),\n );\n});\n\n/**\n * Resolve an input string to spec text — if it's a URL, fetch it via\n * HttpClient; otherwise return it as-is.\n */\nexport const resolveSpecText = (input: string, credentials?: SpecFetchCredentials) =>\n input.startsWith(\"http://\") || input.startsWith(\"https://\")\n ? fetchSpecText(input, credentials)\n : Effect.succeed(input);\n\n/**\n * Parse an OpenAPI document from spec text and validate it's OpenAPI 3.x.\n *\n * NOTE: does NOT resolve `$ref`s. `DocResolver` + `normalizeOpenApiRefs`\n * downstream work on refs lazily, so inlining them here would just waste\n * memory — and for big specs (e.g. Cloudflare's API) that blows through\n * the 128MB Cloudflare Workers memory cap.\n */\nexport const parse = Effect.fn(\"OpenApi.parse\")(function* (text: string) {\n const api = yield* parseTextToObject(text);\n\n if (!isOpenApi3(api)) {\n return yield* new OpenApiExtractionErrorFromParse({\n message:\n \"Only OpenAPI 3.x documents are supported. Swagger 2.x documents should be converted first.\",\n });\n }\n\n return api as ParsedDocument;\n});\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\nconst isOpenApi3 = (doc: OpenAPI.Document): doc is OpenAPIV3.Document | OpenAPIV3_1.Document =>\n \"openapi\" in doc && typeof doc.openapi === \"string\" && doc.openapi.startsWith(\"3.\");\n\nconst parseTextToObject = (text: string): Effect.Effect<OpenAPI.Document, OpenApiParseError> =>\n Effect.gen(function* () {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n return yield* new OpenApiParseError({\n message: \"OpenAPI document is empty\",\n });\n }\n\n const parsed = yield* parseJsonLike(trimmed).pipe(\n Effect.mapError(\n () =>\n new OpenApiParseError({\n message: \"Failed to parse OpenAPI document\",\n }),\n ),\n );\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return yield* new OpenApiParseError({\n message: \"OpenAPI document must parse to an object\",\n });\n }\n\n return parsed as OpenAPI.Document;\n });\n\nconst parseJsonText = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));\n\nconst parseJsonLike = (text: string): Effect.Effect<unknown, unknown> => {\n const parseYaml = Effect.try({\n try: () => YAML.parse(text) as unknown,\n catch: () => \"YamlParseFailed\" as const,\n });\n if (!text.startsWith(\"{\") && !text.startsWith(\"[\")) return parseYaml;\n return parseJsonText(text).pipe(Effect.catch(() => parseYaml));\n};\n","// ---------------------------------------------------------------------------\n// OpenAPI type aliases and $ref resolution\n//\n// Wraps the openapi-types V3/V3_1 union mess and provides clean ref resolution.\n// ---------------------------------------------------------------------------\n\nimport type { OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport type { ParsedDocument } from \"./parse\";\nimport type { ServerVariable } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Type aliases — collapse V3 / V3_1 unions into single names\n// ---------------------------------------------------------------------------\n\nexport type ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\nexport type OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\nexport type PathItemObject = OpenAPIV3.PathItemObject | OpenAPIV3_1.PathItemObject;\nexport type RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\nexport type ResponseObject = OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject;\nexport type MediaTypeObject = OpenAPIV3.MediaTypeObject | OpenAPIV3_1.MediaTypeObject;\nexport type ServerObject = OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject;\n\n// ---------------------------------------------------------------------------\n// DocResolver — wraps a parsed document for clean $ref resolution\n// ---------------------------------------------------------------------------\n\nexport class DocResolver {\n constructor(readonly doc: ParsedDocument) {}\n\n /** Resolve a value that might be a $ref, returning the resolved object */\n resolve<T>(value: T | OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject): T | null {\n if (isRef(value)) {\n const resolved = this.resolvePointer(value.$ref);\n return resolved as T | null;\n }\n return value as T;\n }\n\n private resolvePointer(ref: string): unknown {\n if (!ref.startsWith(\"#/\")) return null;\n const segments = ref.slice(2).split(\"/\");\n let current: unknown = this.doc;\n for (const segment of segments) {\n if (typeof current !== \"object\" || current === null) return null;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n }\n}\n\nconst isRef = (value: unknown): value is { $ref: string } =>\n typeof value === \"object\" && value !== null && \"$ref\" in value;\n\n// ---------------------------------------------------------------------------\n// Server URL resolution\n// ---------------------------------------------------------------------------\n\n/** Substitute `{var}` placeholders in a templated URL using a plain map. */\nexport const substituteUrlVariables = (url: string, values: Record<string, string>): string => {\n let out = url;\n for (const [name, value] of Object.entries(values)) {\n out = out.replaceAll(`{${name}}`, value);\n }\n return out;\n};\n\n/** Resolve a templated server URL, filling each `{var}` from `overrides` when\n * non-empty, otherwise the variable's spec default. URLs without placeholders\n * pass through unchanged. */\nexport const resolveServerUrl = (\n templateUrl: string,\n variables: Record<string, ServerVariable> | undefined,\n overrides: Record<string, string>,\n): string => {\n const values: Record<string, string> = {};\n for (const [name, v] of Object.entries(variables ?? {})) values[name] = v.default;\n for (const [name, value] of Object.entries(overrides)) {\n if (value) values[name] = value;\n }\n return substituteUrlVariables(templateUrl, values);\n};\n\n// ---------------------------------------------------------------------------\n// Content negotiation\n// ---------------------------------------------------------------------------\n\n/**\n * Return all declared media entries in spec order. `Object.entries` on a\n * plain object preserves insertion order in modern engines, which matches\n * spec declaration order as the parser produced it.\n */\nexport const declaredContents = (\n content: Record<string, MediaTypeObject> | undefined,\n): ReadonlyArray<{ mediaType: string; media: MediaTypeObject }> => {\n if (!content) return [];\n return Object.entries(content).map(([mediaType, media]) => ({ mediaType, media }));\n};\n\n/**\n * Pick the default media type for a requestBody or response. Matches\n * swagger-client behaviour: **first declared wins** (not JSON-first). Spec\n * authors order content entries to signal intent (upload-heavy endpoints\n * declare multipart first, JSON second); respecting that order avoids\n * silently downgrading a multipart endpoint to JSON.\n *\n * For response bodies we still want a JSON preference because the server\n * picks the response content type, not the client — the old `application/\n * json` preference is preserved via `preferredResponseContent` below.\n */\nexport const preferredContent = (\n content: Record<string, MediaTypeObject> | undefined,\n): { mediaType: string; media: MediaTypeObject } | undefined => {\n const first = declaredContents(content)[0];\n return first ? first : undefined;\n};\n\n/** Response-side content picker — still JSON-first because the server\n * picks the response media type, so we want to advertise a preference. */\nexport const preferredResponseContent = (\n content: Record<string, MediaTypeObject> | undefined,\n): { mediaType: string; media: MediaTypeObject } | undefined => {\n if (!content) return undefined;\n const entries = Object.entries(content);\n const pick =\n entries.find(([mt]) => mt === \"application/json\") ??\n entries.find(([mt]) => mt.toLowerCase().includes(\"+json\")) ??\n entries.find(([mt]) => mt.toLowerCase().includes(\"json\")) ??\n entries[0];\n return pick ? { mediaType: pick[0], media: pick[1] } : undefined;\n};\n","import { Schema } from \"effect\";\nimport { AuthTemplateSlug, type OAuthAuthentication } from \"@executor-js/sdk/shared\";\nimport {\n apiKeyMethodFromAuthTemplate,\n isApiKeyAuthTemplate,\n type ApiKeyAuthMethod,\n type ApiKeyAuthTemplate,\n} from \"@executor-js/sdk/http-auth\";\n\n// ---------------------------------------------------------------------------\n// Auth-template model.\n//\n// The apiKey method is the SHARED placements model (`@executor-js/sdk/http-auth`,\n// the same shape the graphql/mcp plugins store): N header/query placements,\n// each rendered from its own credential input. The oauth template is\n// mechanism-intrinsic and comes from core (`OAuthAuthentication`, keyed\n// `kind: \"oauth2\"` with stored endpoints+scopes); an integration's\n// `Authentication` union composes the two. Client credentials\n// (clientId/secret) live on the core `OAuthClient`, not here.\n//\n// Pre-canonical stored templates (`type: \"apiKey\"` with `variable()`-templated\n// header/query records) are rewritten by the one-off config migration\n// (`migrate-config.ts`) — runtime code knows only this model.\n// ---------------------------------------------------------------------------\n\nexport { TOKEN_VARIABLE } from \"@executor-js/sdk/http-auth\";\n\nexport type APIKeyAuthentication = ApiKeyAuthMethod;\n\n/** Every method is keyed by `kind` — `kind: \"oauth2\"` | `kind: \"apikey\"`. */\nexport type Authentication = OAuthAuthentication | APIKeyAuthentication;\n\n/** What auth inputs accept: oauth templates (wire-typed: plain slug) plus the\n * request-shaped apikey dialect (`type: \"apiKey\"`, headers/queryParams\n * records) — the ONE apikey authoring shape. Stored configs and the catalog\n * read as canonical placements; `apiKeyAuthTemplateFromMethod` serializes\n * them back for read-modify-write flows. */\nexport type OAuthAuthenticationInput = Omit<OAuthAuthentication, \"slug\"> & {\n readonly slug: string;\n};\nexport type AuthenticationInput = OAuthAuthenticationInput | ApiKeyAuthTemplate;\n\n/** Expand the request-shaped dialect into canonical placements and brand the\n * oauth slugs. A dialect entry without a slug gets a blank one —\n * `mergeAuthTemplates` backfills `custom_<id>`. */\nexport const normalizeOpenApiAuthInputs = (\n inputs: readonly AuthenticationInput[],\n): readonly Authentication[] =>\n inputs.map((input): Authentication => {\n if (!isApiKeyAuthTemplate(input)) {\n return { ...input, slug: AuthTemplateSlug.make(input.slug) };\n }\n const method = apiKeyMethodFromAuthTemplate(input);\n return { ...method, slug: method.slug ?? \"\" };\n });\n\n// ---------------------------------------------------------------------------\n// Branded IDs\n// ---------------------------------------------------------------------------\n\nexport const OperationId = Schema.String.pipe(Schema.brand(\"OperationId\"));\nexport type OperationId = typeof OperationId.Type;\n\n// ---------------------------------------------------------------------------\n// HTTP\n// ---------------------------------------------------------------------------\n\nexport const HttpMethod = Schema.Literals([\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n]);\nexport type HttpMethod = typeof HttpMethod.Type;\n\nexport const ParameterLocation = Schema.Literals([\"path\", \"query\", \"header\", \"cookie\"]);\nexport type ParameterLocation = typeof ParameterLocation.Type;\n\n// ---------------------------------------------------------------------------\n// Extracted operation\n// ---------------------------------------------------------------------------\n\nexport const OperationParameter = Schema.Struct({\n name: Schema.String,\n location: ParameterLocation,\n required: Schema.Boolean,\n schema: Schema.OptionFromOptional(Schema.Unknown),\n style: Schema.OptionFromOptional(Schema.String),\n explode: Schema.OptionFromOptional(Schema.Boolean),\n allowReserved: Schema.OptionFromOptional(Schema.Boolean),\n description: Schema.OptionFromOptional(Schema.String),\n});\nexport type OperationParameter = typeof OperationParameter.Type;\n\n/**\n * OpenAPI 3.x `Encoding Object` (§4.8.15). Declared per-property inside a\n * multipart/form-data or application/x-www-form-urlencoded request body.\n *\n * - `contentType` — for multipart, overrides the per-part `Content-Type`\n * header (e.g. `application/json` for a JSON-encoded metadata part).\n * - `style` / `explode` / `allowReserved` — for form-urlencoded, control\n * array / object serialization the same way parameter-level style does.\n */\nexport const EncodingObject = Schema.Struct({\n contentType: Schema.OptionFromOptional(Schema.String),\n style: Schema.OptionFromOptional(Schema.String),\n explode: Schema.OptionFromOptional(Schema.Boolean),\n allowReserved: Schema.OptionFromOptional(Schema.Boolean),\n});\nexport type EncodingObject = typeof EncodingObject.Type;\n\nexport const MediaBinding = Schema.Struct({\n contentType: Schema.String,\n schema: Schema.OptionFromOptional(Schema.Unknown),\n encoding: Schema.OptionFromOptional(Schema.Record(Schema.String, EncodingObject)),\n});\nexport type MediaBinding = typeof MediaBinding.Type;\n\nexport const OperationRequestBody = Schema.Struct({\n required: Schema.Boolean,\n /** Default media type — first declared in spec order (not JSON-first).\n * Used when the caller does not override via the tool's `contentType` arg. */\n contentType: Schema.String,\n /** Schema of the default media type. Kept for backward compat with stored\n * bindings from before `contents` was added. */\n schema: Schema.OptionFromOptional(Schema.Unknown),\n /** All declared media types in spec order. Populated by `extract.ts`\n * going forward; older persisted bindings may have this unset and will\n * fall back to `{contentType, schema}`. */\n contents: Schema.OptionFromOptional(Schema.Array(MediaBinding)),\n});\nexport type OperationRequestBody = typeof OperationRequestBody.Type;\n\nexport const OperationFileHint = Schema.Struct({\n kind: Schema.Literals([\"binaryResponse\", \"byteField\"]),\n mimeType: Schema.OptionFromOptional(Schema.String),\n dataField: Schema.OptionFromOptional(Schema.String),\n sizeField: Schema.OptionFromOptional(Schema.String),\n encoding: Schema.OptionFromOptional(Schema.Literals([\"base64\", \"base64url\"])),\n});\nexport type OperationFileHint = typeof OperationFileHint.Type;\n\nexport const OperationResponseBody = Schema.Struct({\n contentType: Schema.String,\n schema: Schema.OptionFromOptional(Schema.Unknown),\n fileHint: Schema.OptionFromOptional(OperationFileHint),\n});\nexport type OperationResponseBody = typeof OperationResponseBody.Type;\n\nexport const ServerVariable = Schema.Struct({\n default: Schema.String,\n enum: Schema.OptionFromOptional(Schema.Array(Schema.String)),\n description: Schema.OptionFromOptional(Schema.String),\n});\nexport type ServerVariable = typeof ServerVariable.Type;\n\nexport const ServerInfo = Schema.Struct({\n url: Schema.String,\n description: Schema.OptionFromOptional(Schema.String),\n variables: Schema.OptionFromOptional(Schema.Record(Schema.String, ServerVariable)),\n});\nexport type ServerInfo = typeof ServerInfo.Type;\n\nexport const ExtractedOperation = Schema.Struct({\n operationId: OperationId,\n toolPath: Schema.OptionFromOptional(Schema.String),\n method: HttpMethod,\n servers: Schema.Array(ServerInfo),\n pathTemplate: Schema.String,\n summary: Schema.OptionFromOptional(Schema.String),\n description: Schema.OptionFromOptional(Schema.String),\n tags: Schema.Array(Schema.String),\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.OptionFromOptional(OperationRequestBody),\n responseBody: Schema.OptionFromOptional(OperationResponseBody),\n inputSchema: Schema.OptionFromOptional(Schema.Unknown),\n outputSchema: Schema.OptionFromOptional(Schema.Unknown),\n deprecated: Schema.Boolean,\n});\nexport type ExtractedOperation = typeof ExtractedOperation.Type;\n\nexport const ExtractionResult = Schema.Struct({\n title: Schema.OptionFromOptional(Schema.String),\n /** The spec's `info.description` — the author's own summary of the API. */\n description: Schema.OptionFromOptional(Schema.String),\n version: Schema.OptionFromOptional(Schema.String),\n servers: Schema.Array(ServerInfo),\n operations: Schema.Array(ExtractedOperation),\n});\nexport type ExtractionResult = typeof ExtractionResult.Type;\n\n// ---------------------------------------------------------------------------\n// Operation binding — minimal invocation data (no schemas/metadata)\n// ---------------------------------------------------------------------------\n\nexport const OperationBinding = Schema.Struct({\n method: HttpMethod,\n servers: Schema.optional(Schema.Array(ServerInfo)),\n pathTemplate: Schema.String,\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.OptionFromOptional(OperationRequestBody),\n responseBody: Schema.OptionFromOptional(OperationResponseBody),\n});\nexport type OperationBinding = typeof OperationBinding.Type;\n\n// ---------------------------------------------------------------------------\n// Invocation\n// ---------------------------------------------------------------------------\n\nexport const InvocationResult = Schema.Struct({\n status: Schema.Number,\n headers: Schema.Record(Schema.String, Schema.String),\n data: Schema.NullOr(Schema.Unknown),\n error: Schema.NullOr(Schema.Unknown),\n});\nexport type InvocationResult = typeof InvocationResult.Type;\n","import { Effect, Option } from \"effect\";\n\nimport { OpenApiExtractionError } from \"./errors\";\nimport type { ParsedDocument } from \"./parse\";\nimport {\n declaredContents,\n DocResolver,\n preferredResponseContent,\n type OperationObject,\n type ParameterObject,\n type PathItemObject,\n type RequestBodyObject,\n type ResponseObject,\n type ServerObject,\n} from \"./openapi-utils\";\nimport {\n EncodingObject,\n ExtractedOperation,\n ExtractionResult,\n type HttpMethod,\n MediaBinding,\n OperationFileHint,\n OperationId,\n OperationParameter,\n OperationRequestBody,\n OperationResponseBody,\n type ParameterLocation,\n ServerInfo,\n ServerVariable,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst HTTP_METHODS: readonly HttpMethod[] = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n];\n\nconst VALID_PARAM_LOCATIONS = new Set<string>([\"path\", \"query\", \"header\", \"cookie\"]);\n\n// ---------------------------------------------------------------------------\n// Parameter extraction\n// ---------------------------------------------------------------------------\n\nconst extractParameters = (\n pathItem: PathItemObject,\n operation: OperationObject,\n r: DocResolver,\n): OperationParameter[] => {\n const merged = new Map<string, ParameterObject>();\n\n for (const raw of pathItem.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n for (const raw of operation.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n\n return [...merged.values()]\n .filter((p) => VALID_PARAM_LOCATIONS.has(p.in))\n .map((p) =>\n OperationParameter.make({\n name: p.name,\n location: p.in as ParameterLocation,\n required: p.in === \"path\" ? true : p.required === true,\n schema: Option.fromNullishOr(p.schema),\n style: Option.fromNullishOr(p.style),\n explode: Option.fromNullishOr(p.explode),\n allowReserved: Option.fromNullishOr(\"allowReserved\" in p ? p.allowReserved : undefined),\n description: Option.fromNullishOr(p.description),\n }),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Request body extraction\n// ---------------------------------------------------------------------------\n\nconst buildEncodingRecord = (\n encoding: Record<string, unknown> | undefined,\n): Record<string, EncodingObject> | undefined => {\n if (!encoding) return undefined;\n const out: Record<string, EncodingObject> = {};\n for (const [prop, raw] of Object.entries(encoding)) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const e = raw as {\n contentType?: string;\n style?: string;\n explode?: boolean;\n allowReserved?: boolean;\n };\n out[prop] = EncodingObject.make({\n contentType: Option.fromNullishOr(e.contentType),\n style: Option.fromNullishOr(e.style),\n explode: Option.fromNullishOr(e.explode),\n allowReserved: Option.fromNullishOr(e.allowReserved),\n });\n }\n return Object.keys(out).length > 0 ? out : undefined;\n};\n\nconst extractRequestBody = (\n operation: OperationObject,\n r: DocResolver,\n): OperationRequestBody | undefined => {\n if (!operation.requestBody) return undefined;\n\n const body = r.resolve<RequestBodyObject>(operation.requestBody);\n if (!body) return undefined;\n\n const contents = declaredContents(body.content).map(({ mediaType, media }) =>\n MediaBinding.make({\n contentType: mediaType,\n schema: Option.fromNullishOr(media.schema),\n encoding: Option.fromNullishOr(\n buildEncodingRecord((media as { encoding?: Record<string, unknown> }).encoding),\n ),\n }),\n );\n if (contents.length === 0) return undefined;\n\n // Default = first declared (spec author's preferred order). Callers can\n // override at invoke time with a `contentType` arg.\n const defaultContent = contents[0]!;\n\n return OperationRequestBody.make({\n required: body.required === true,\n contentType: defaultContent.contentType,\n schema: defaultContent.schema,\n contents: Option.some(contents),\n });\n};\n\n// ---------------------------------------------------------------------------\n// Response schema extraction\n// ---------------------------------------------------------------------------\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst stringType = (schema: Record<string, unknown>): boolean =>\n schema.type === \"string\" || (Array.isArray(schema.type) && schema.type.includes(\"string\"));\n\nconst numericType = (schema: Record<string, unknown>): boolean =>\n schema.type === \"integer\" ||\n schema.type === \"number\" ||\n (Array.isArray(schema.type) &&\n (schema.type.includes(\"integer\") || schema.type.includes(\"number\")));\n\nconst normalizedMediaType = (mediaType: string): string =>\n mediaType.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n\nconst isJsonMediaType = (mediaType: string): boolean => {\n const normalized = normalizedMediaType(mediaType);\n return (\n normalized === \"application/json\" || normalized.includes(\"+json\") || normalized.includes(\"json\")\n );\n};\n\nconst binaryStringSchema = (schema: Record<string, unknown>): boolean =>\n stringType(schema) && (schema.format === \"binary\" || schema.format === \"byte\");\n\nconst base64EncodingFromDescription = (schema: Record<string, unknown>): \"base64\" | \"base64url\" =>\n typeof schema.description === \"string\" &&\n /base64url|base64-url|url[- ]safe/i.test(schema.description)\n ? \"base64url\"\n : \"base64\";\n\nconst detectFileHint = (\n schema: unknown,\n mediaType: string,\n r: DocResolver,\n): OperationFileHint | undefined => {\n const resolved = isRecord(schema) ? r.resolve<Record<string, unknown>>(schema) : null;\n if (!resolved) return undefined;\n\n if (!isJsonMediaType(mediaType) && binaryStringSchema(resolved)) {\n return OperationFileHint.make({\n kind: \"binaryResponse\",\n mimeType: Option.some(mediaType),\n dataField: Option.none(),\n sizeField: Option.none(),\n encoding: Option.none(),\n });\n }\n\n if (!isJsonMediaType(mediaType)) return undefined;\n\n const properties = resolved.properties;\n if (!isRecord(properties)) return undefined;\n const data = properties.data;\n const dataSchema = isRecord(data) ? r.resolve<Record<string, unknown>>(data) : null;\n if (!dataSchema || !binaryStringSchema(dataSchema)) return undefined;\n\n const size = properties.size;\n const sizeSchema = isRecord(size) ? r.resolve<Record<string, unknown>>(size) : null;\n const sizeField = sizeSchema && numericType(sizeSchema) ? \"size\" : undefined;\n\n return OperationFileHint.make({\n kind: \"byteField\",\n mimeType: Option.some(\"application/octet-stream\"),\n dataField: Option.some(\"data\"),\n sizeField: sizeField ? Option.some(sizeField) : Option.none(),\n encoding: Option.some(base64EncodingFromDescription(dataSchema)),\n });\n};\n\nconst extractResponseBody = (\n operation: OperationObject,\n r: DocResolver,\n): OperationResponseBody | undefined => {\n if (!operation.responses) return undefined;\n\n const entries = Object.entries(operation.responses);\n const preferred = [\n ...entries.filter(([s]) => /^2\\d\\d$/.test(s)).sort(([a], [b]) => a.localeCompare(b)),\n ...entries.filter(([s]) => s === \"default\"),\n ];\n\n for (const [, ref] of preferred) {\n const resp = r.resolve<ResponseObject>(ref);\n if (!resp) continue;\n const content = preferredResponseContent(resp.content);\n if (content?.media.schema) {\n return OperationResponseBody.make({\n contentType: content.mediaType,\n schema: Option.some(content.media.schema),\n fileHint: Option.fromNullishOr(detectFileHint(content.media.schema, content.mediaType, r)),\n });\n }\n }\n\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Input schema builder\n// ---------------------------------------------------------------------------\n\n// Optional `server` input — host selection + server-URL variables. Undefined\n// when there's nothing to configure (a single server with no variables).\nconst buildServerInputProperty = (\n servers: readonly ServerInfo[],\n): Record<string, unknown> | undefined => {\n const variableDefs: Record<string, ServerVariable> = {};\n for (const server of servers) {\n for (const [name, v] of Object.entries(Option.getOrUndefined(server.variables) ?? {})) {\n if (!(name in variableDefs)) variableDefs[name] = v;\n }\n }\n const hasMultiple = servers.length > 1;\n const variableNames = Object.keys(variableDefs);\n if (!hasMultiple && variableNames.length === 0) return undefined;\n\n const properties: Record<string, unknown> = {};\n if (hasMultiple) {\n properties.url = {\n type: \"string\",\n enum: servers.map((server) => server.url),\n default: servers[0]!.url,\n description: \"Which of the spec's servers to send the request to.\",\n };\n }\n if (variableNames.length > 0) {\n properties.variables = {\n type: \"object\",\n additionalProperties: false,\n properties: Object.fromEntries(\n Object.entries(variableDefs).map(([name, v]) => [\n name,\n {\n type: \"string\",\n default: v.default,\n ...(Option.isSome(v.enum) ? { enum: v.enum.value } : {}),\n ...(Option.isSome(v.description) ? { description: v.description.value } : {}),\n },\n ]),\n ),\n description: \"Values for the server URL `{variables}`; spec defaults apply when omitted.\",\n };\n }\n return {\n type: \"object\",\n additionalProperties: false,\n properties,\n description: \"Optional host selection and server-URL variables for this request.\",\n };\n};\n\nconst buildInputSchema = (\n parameters: readonly OperationParameter[],\n requestBody: OperationRequestBody | undefined,\n servers: readonly ServerInfo[],\n): Record<string, unknown> | undefined => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const param of parameters) {\n properties[param.name] = Option.getOrElse(param.schema, () => ({ type: \"string\" }));\n if (param.required) required.push(param.name);\n }\n\n // A path/query parameter named `server` takes precedence over the host input.\n const serverProperty = buildServerInputProperty(servers);\n if (serverProperty && !(\"server\" in properties)) properties.server = serverProperty;\n\n if (requestBody) {\n properties.body = Option.getOrElse(requestBody.schema, () => ({ type: \"object\" }));\n if (requestBody.required) required.push(\"body\");\n\n // When the spec declares multiple media types for this requestBody,\n // expose `contentType` so the model can pick. Default = first declared.\n // `body` schema tracks the default; the model is responsible for\n // supplying a body shape that matches whichever contentType it picks.\n const contents = Option.getOrUndefined(requestBody.contents);\n if (contents && contents.length > 1) {\n properties.contentType = {\n type: \"string\",\n enum: contents.map((c) => c.contentType),\n default: requestBody.contentType,\n description:\n \"Content-Type for the request body. Declared media types for this operation, in spec order.\",\n };\n }\n }\n\n if (Object.keys(properties).length === 0) return undefined;\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Operation ID derivation\n// ---------------------------------------------------------------------------\n\nconst deriveOperationId = (\n method: HttpMethod,\n pathTemplate: string,\n operation: OperationObject,\n): string =>\n operation.operationId ??\n (`${method}_${pathTemplate.replace(/[^a-zA-Z0-9]+/g, \"_\")}`.replace(/^_+|_+$/g, \"\") ||\n `${method}_operation`);\n\nconst explicitToolPath = (operation: OperationObject): string | undefined => {\n const value = (operation as Record<string, unknown>)[\"x-executor-toolPath\"];\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n};\n\nconst explicitPathTemplate = (operation: OperationObject): string | undefined => {\n const value = (operation as Record<string, unknown>)[\"x-executor-pathTemplate\"];\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Server extraction\n// ---------------------------------------------------------------------------\n\nconst extractServerList = (servers: readonly ServerObject[] | undefined): ServerInfo[] =>\n (servers ?? []).flatMap((server) => {\n if (!server.url) return [];\n const serverVariables = server.variables as\n | Record<\n string,\n {\n readonly default?: string;\n readonly enum?: readonly string[];\n readonly description?: string;\n }\n >\n | undefined;\n const vars = serverVariables\n ? Object.fromEntries(\n Object.entries(serverVariables).flatMap(([name, v]) => {\n if (v.default === undefined || v.default === null) return [];\n const enumValues = Array.isArray(v.enum)\n ? v.enum.filter((x): x is string => typeof x === \"string\")\n : undefined;\n return [\n [\n name,\n ServerVariable.make({\n default: String(v.default),\n enum:\n enumValues && enumValues.length > 0 ? Option.some(enumValues) : Option.none(),\n description: Option.fromNullishOr(v.description),\n }),\n ],\n ];\n }),\n )\n : undefined;\n return [\n ServerInfo.make({\n url: server.url,\n description: Option.fromNullishOr(server.description),\n variables: vars && Object.keys(vars).length > 0 ? Option.some(vars) : Option.none(),\n }),\n ];\n });\n\nconst extractServers = (doc: ParsedDocument): ServerInfo[] => extractServerList(doc.servers);\n\nconst operationServers = (\n pathItem: PathItemObject,\n operation: OperationObject,\n docServers: readonly ServerInfo[],\n): readonly ServerInfo[] => {\n const operationLevel = extractServerList(operation.servers);\n if (operationLevel.length > 0) return operationLevel;\n const pathLevel = extractServerList(pathItem.servers);\n if (pathLevel.length > 0) return pathLevel;\n return docServers;\n};\n\n// ---------------------------------------------------------------------------\n// Main extraction\n// ---------------------------------------------------------------------------\n\n/** Extract all operations from a bundled OpenAPI 3.x document */\nexport const extract = Effect.fn(\"OpenApi.extract\")(function* (doc: ParsedDocument) {\n const paths = doc.paths;\n if (!paths) {\n return yield* new OpenApiExtractionError({\n message: \"OpenAPI document has no paths defined\",\n });\n }\n\n const r = new DocResolver(doc);\n const docServers = extractServers(doc);\n const operations: ExtractedOperation[] = [];\n\n for (const [pathTemplate, pathItem] of Object.entries(paths).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n if (!pathItem) continue;\n\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const parameters = extractParameters(pathItem, operation, r);\n const requestBody = extractRequestBody(operation, r);\n const responseBody = extractResponseBody(operation, r);\n const servers = operationServers(pathItem, operation, docServers);\n const inputSchema = buildInputSchema(parameters, requestBody, servers);\n const outputSchema = responseBody ? Option.getOrUndefined(responseBody.schema) : undefined;\n const tags = (operation.tags ?? []).filter((t) => t.trim().length > 0);\n const operationPathTemplate = explicitPathTemplate(operation) ?? pathTemplate;\n\n operations.push(\n ExtractedOperation.make({\n operationId: OperationId.make(deriveOperationId(method, pathTemplate, operation)),\n toolPath: Option.fromNullishOr(explicitToolPath(operation)),\n method,\n servers,\n pathTemplate: operationPathTemplate,\n summary: Option.fromNullishOr(operation.summary),\n description: Option.fromNullishOr(operation.description),\n tags,\n parameters,\n requestBody: Option.fromNullishOr(requestBody),\n responseBody: Option.fromNullishOr(responseBody),\n inputSchema: Option.fromNullishOr(inputSchema),\n outputSchema: Option.fromNullishOr(outputSchema),\n deprecated: operation.deprecated === true,\n }),\n );\n }\n }\n\n return ExtractionResult.make({\n title: Option.fromNullishOr(doc.info?.title),\n description: Option.fromNullishOr(doc.info?.description),\n version: Option.fromNullishOr(doc.info?.version),\n servers: docServers,\n operations,\n });\n});\n","import { Effect, Option, Predicate } from \"effect\";\nimport { Schema } from \"effect\";\n\nimport { parse, resolveSpecText, type ParsedDocument } from \"./parse\";\nimport { extract } from \"./extract\";\nimport { DocResolver } from \"./openapi-utils\";\nimport { HttpMethod, ServerInfo, type ExtractionResult } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// OAuth 2.0 flows — one entry per supported grant type\n// ---------------------------------------------------------------------------\n\n/** Scopes declared by a flow: `{ scopeName: description }` */\nconst OAuth2Scopes = Schema.Record(Schema.String, Schema.String);\nconst SecuritySchemeType = Schema.Literals([\"http\", \"apiKey\", \"oauth2\", \"openIdConnect\"]);\ntype SecuritySchemeType = typeof SecuritySchemeType.Type;\n\nconst decodeSecuritySchemeType = Schema.decodeUnknownOption(SecuritySchemeType);\n\nexport const OAuth2AuthorizationCodeFlow = Schema.Struct({\n authorizationUrl: Schema.String,\n tokenUrl: Schema.String,\n refreshUrl: Schema.OptionFromOptional(Schema.String),\n scopes: OAuth2Scopes,\n});\nexport type OAuth2AuthorizationCodeFlow = typeof OAuth2AuthorizationCodeFlow.Type;\n\nexport const OAuth2ClientCredentialsFlow = Schema.Struct({\n tokenUrl: Schema.String,\n refreshUrl: Schema.OptionFromOptional(Schema.String),\n scopes: OAuth2Scopes,\n});\nexport type OAuth2ClientCredentialsFlow = typeof OAuth2ClientCredentialsFlow.Type;\n\nexport const OAuth2Flows = Schema.Struct({\n authorizationCode: Schema.OptionFromOptional(OAuth2AuthorizationCodeFlow),\n clientCredentials: Schema.OptionFromOptional(OAuth2ClientCredentialsFlow),\n});\nexport type OAuth2Flows = typeof OAuth2Flows.Type;\n\n// ---------------------------------------------------------------------------\n// Security scheme — what the spec declares it needs\n// ---------------------------------------------------------------------------\n\nexport const SecurityScheme = Schema.Struct({\n /** Key name in components.securitySchemes (e.g. \"api_token\") */\n name: Schema.String,\n /** OpenAPI security scheme type */\n type: SecuritySchemeType,\n /** For type: \"http\" — e.g. \"bearer\", \"basic\" */\n scheme: Schema.OptionFromOptional(Schema.String),\n /** For type: \"http\" with scheme \"bearer\" — e.g. \"JWT\" */\n bearerFormat: Schema.OptionFromOptional(Schema.String),\n /** For type: \"apiKey\" — where the key goes */\n in: Schema.OptionFromOptional(Schema.Literals([\"header\", \"query\", \"cookie\"])),\n /** For type: \"apiKey\" — the header/query/cookie name */\n headerName: Schema.OptionFromOptional(Schema.String),\n description: Schema.OptionFromOptional(Schema.String),\n /** For type: \"oauth2\" — declared flows (authorizationCode / clientCredentials only; implicit and password are deprecated). */\n flows: Schema.OptionFromOptional(OAuth2Flows),\n /** For type: \"openIdConnect\" — the discovery URL. */\n openIdConnectUrl: Schema.OptionFromOptional(Schema.String),\n});\nexport type SecurityScheme = typeof SecurityScheme.Type;\n\n// ---------------------------------------------------------------------------\n// Auth strategy — a valid combination of security schemes\n// ---------------------------------------------------------------------------\n\nexport const AuthStrategy = Schema.Struct({\n /** The security schemes required together for this strategy */\n schemes: Schema.Array(Schema.String),\n});\nexport type AuthStrategy = typeof AuthStrategy.Type;\n\n// ---------------------------------------------------------------------------\n// Header preset — derived from an auth strategy\n// ---------------------------------------------------------------------------\n\nexport const HeaderPreset = Schema.Struct({\n /** Human-readable label for the UI (e.g. \"Bearer Token\", \"API Key + Email\") */\n label: Schema.String,\n /** Headers this strategy needs. Value is null when the user must provide it. */\n headers: Schema.Record(Schema.String, Schema.NullOr(Schema.String)),\n /** Which headers should be stored as secrets */\n secretHeaders: Schema.Array(Schema.String),\n});\nexport type HeaderPreset = typeof HeaderPreset.Type;\n\n// ---------------------------------------------------------------------------\n// OAuth2 preset — derived from an oauth2 security scheme + a flow choice\n// ---------------------------------------------------------------------------\n\nexport const OAuth2Preset = Schema.Struct({\n /** Human-readable label for the UI (e.g. \"OAuth2 (Authorization Code) — oauth_app\") */\n label: Schema.String,\n /** The source security scheme this preset came from (components.securitySchemes key). */\n securitySchemeName: Schema.String,\n /** Which OAuth2 flow this preset uses. */\n flow: Schema.Literals([\"authorizationCode\", \"clientCredentials\"]),\n /** For authorizationCode: user-agent redirect URL (from the spec). */\n authorizationUrl: Schema.OptionFromOptional(Schema.String),\n /** Token endpoint to exchange the code / refresh. */\n tokenUrl: Schema.String,\n /** Optional refresh endpoint if the spec declares one separately. */\n refreshUrl: Schema.OptionFromOptional(Schema.String),\n /** Declared scopes for this flow: `{ scope: description }`. */\n scopes: Schema.Record(Schema.String, Schema.String),\n /** Identity scopes to request alongside API scopes. `\"auto\"` discovers standard OIDC scopes. */\n identityScopes: Schema.Union([\n Schema.Literal(\"auto\"),\n Schema.Literal(false),\n Schema.Array(Schema.String),\n ]),\n});\nexport type OAuth2Preset = typeof OAuth2Preset.Type;\n\n// ---------------------------------------------------------------------------\n// Preview operation — lightweight shape for the add-source UI list\n// ---------------------------------------------------------------------------\n\nexport const PreviewOperation = Schema.Struct({\n operationId: Schema.String,\n method: HttpMethod,\n path: Schema.String,\n summary: Schema.OptionFromOptional(Schema.String),\n tags: Schema.Array(Schema.String),\n deprecated: Schema.Boolean,\n});\nexport type PreviewOperation = typeof PreviewOperation.Type;\n\n// ---------------------------------------------------------------------------\n// Spec preview — everything the frontend needs\n// ---------------------------------------------------------------------------\n\nexport const SpecPreview = Schema.Struct({\n title: Schema.OptionFromOptional(Schema.String),\n /** The spec's `info.description` — prefills the add form's description field. */\n description: Schema.OptionFromOptional(Schema.String),\n version: Schema.OptionFromOptional(Schema.String),\n /** Reuses ServerInfo from extraction */\n servers: Schema.Array(ServerInfo),\n operationCount: Schema.Number,\n /** Lightweight operation list for the add-source UI */\n operations: Schema.Array(PreviewOperation),\n tags: Schema.Array(Schema.String),\n securitySchemes: Schema.Array(SecurityScheme),\n /** Valid auth strategies (each is a set of schemes used together) */\n authStrategies: Schema.Array(AuthStrategy),\n /** Pre-built header presets derived from auth strategies */\n headerPresets: Schema.Array(HeaderPreset),\n /** OAuth2 presets — one per (oauth2 scheme × supported flow) combination */\n oauth2Presets: Schema.Array(OAuth2Preset),\n});\nexport type SpecPreview = typeof SpecPreview.Type;\n\n// ---------------------------------------------------------------------------\n// Security scheme extraction\n// ---------------------------------------------------------------------------\n\nconst stringRecord = (value: unknown): Record<string, string> => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (typeof v === \"string\") out[k] = v;\n }\n return out;\n};\n\nconst extractFlows = (rawFlows: unknown): Option.Option<OAuth2Flows> => {\n if (!rawFlows || typeof rawFlows !== \"object\") return Option.none();\n const flows = rawFlows as Record<string, unknown>;\n\n const parseFlow = <K extends \"authorizationCode\" | \"clientCredentials\">(key: K): unknown =>\n flows[key];\n\n let authorizationCode: Option.Option<OAuth2AuthorizationCodeFlow> = Option.none();\n const authCodeRaw = parseFlow(\"authorizationCode\");\n if (authCodeRaw && typeof authCodeRaw === \"object\") {\n const f = authCodeRaw as Record<string, unknown>;\n const authUrl = typeof f.authorizationUrl === \"string\" ? f.authorizationUrl : null;\n const tokenUrl = typeof f.tokenUrl === \"string\" ? f.tokenUrl : null;\n if (authUrl && tokenUrl) {\n authorizationCode = Option.some(\n OAuth2AuthorizationCodeFlow.make({\n authorizationUrl: authUrl,\n tokenUrl,\n refreshUrl: Option.fromNullishOr(\n typeof f.refreshUrl === \"string\" ? f.refreshUrl : undefined,\n ),\n scopes: stringRecord(f.scopes),\n }),\n );\n }\n }\n\n let clientCredentials: Option.Option<OAuth2ClientCredentialsFlow> = Option.none();\n const ccRaw = parseFlow(\"clientCredentials\");\n if (ccRaw && typeof ccRaw === \"object\") {\n const f = ccRaw as Record<string, unknown>;\n const tokenUrl = typeof f.tokenUrl === \"string\" ? f.tokenUrl : null;\n if (tokenUrl) {\n clientCredentials = Option.some(\n OAuth2ClientCredentialsFlow.make({\n tokenUrl,\n refreshUrl: Option.fromNullishOr(\n typeof f.refreshUrl === \"string\" ? f.refreshUrl : undefined,\n ),\n scopes: stringRecord(f.scopes),\n }),\n );\n }\n }\n\n if (Option.isNone(authorizationCode) && Option.isNone(clientCredentials)) {\n return Option.none();\n }\n return Option.some(OAuth2Flows.make({ authorizationCode, clientCredentials }));\n};\n\nconst extractSecuritySchemes = (\n rawSchemes: Record<string, unknown>,\n resolver: DocResolver,\n): SecurityScheme[] =>\n Object.entries(rawSchemes).flatMap(([name, schemeOrRef]) => {\n if (!schemeOrRef || typeof schemeOrRef !== \"object\") return [];\n // Resolve $ref so schemes defined via `$ref` aren't silently dropped.\n const resolved = resolver.resolve<Record<string, unknown>>(\n schemeOrRef as Record<string, unknown>,\n );\n if (!resolved || typeof resolved !== \"object\") return [];\n const scheme = resolved;\n\n const type = decodeSecuritySchemeType(scheme.type);\n if (Option.isNone(type)) return [];\n const schemeType = type.value;\n\n return [\n SecurityScheme.make({\n name,\n type: schemeType,\n scheme: Option.fromNullishOr(scheme.scheme as string | undefined),\n bearerFormat: Option.fromNullishOr(scheme.bearerFormat as string | undefined),\n in: Option.fromNullishOr(scheme.in as \"header\" | \"query\" | \"cookie\" | undefined),\n headerName: Option.fromNullishOr(scheme.name as string | undefined),\n description: Option.fromNullishOr(scheme.description as string | undefined),\n flows: schemeType === \"oauth2\" ? extractFlows(scheme.flows) : Option.none(),\n openIdConnectUrl: Option.fromNullishOr(scheme.openIdConnectUrl as string | undefined),\n }),\n ];\n });\n\n// ---------------------------------------------------------------------------\n// Header preset builder\n// ---------------------------------------------------------------------------\n\nconst buildHeaderPresets = (\n schemes: readonly SecurityScheme[],\n strategies: readonly AuthStrategy[],\n): HeaderPreset[] => {\n const schemeMap = new Map(schemes.map((s) => [s.name, s]));\n\n return strategies.flatMap((strategy) => {\n const resolved = strategy.schemes\n .map((name) => schemeMap.get(name))\n .filter(Predicate.isNotUndefined);\n\n if (resolved.length === 0) return [];\n\n const headers: Record<string, string | null> = {};\n const secretHeaders: string[] = [];\n const labelParts: string[] = [];\n\n for (const scheme of resolved) {\n if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"bearer\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Bearer Token\");\n } else if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"basic\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Basic Auth\");\n } else if (scheme.type === \"apiKey\" && Option.getOrElse(scheme.in, () => \"\") === \"header\") {\n const headerName = Option.getOrElse(scheme.headerName, () => scheme.name);\n headers[headerName] = null;\n secretHeaders.push(headerName);\n labelParts.push(scheme.name);\n } else if (scheme.type === \"apiKey\") {\n labelParts.push(`${scheme.name} (${Option.getOrElse(scheme.in, () => \"unknown\")})`);\n } else if (scheme.type === \"oauth2\" || scheme.type === \"openIdConnect\") {\n return [];\n } else {\n labelParts.push(scheme.name);\n }\n }\n\n if (Object.keys(headers).length === 0 && resolved.length > 0) {\n return [\n HeaderPreset.make({\n label: labelParts.join(\" + \"),\n headers: {},\n secretHeaders: [],\n }),\n ];\n }\n\n return [\n HeaderPreset.make({\n label: labelParts.join(\" + \"),\n headers,\n secretHeaders,\n }),\n ];\n });\n};\n\n// ---------------------------------------------------------------------------\n// OAuth2 preset builder\n// ---------------------------------------------------------------------------\n\nconst buildOAuth2Presets = (schemes: readonly SecurityScheme[]): OAuth2Preset[] => {\n const presets: OAuth2Preset[] = [];\n for (const scheme of schemes) {\n if (scheme.type !== \"oauth2\") continue;\n if (Option.isNone(scheme.flows)) continue;\n const flows = scheme.flows.value;\n\n if (Option.isSome(flows.authorizationCode)) {\n const flow = flows.authorizationCode.value;\n presets.push(\n OAuth2Preset.make({\n label: `OAuth2 Authorization Code · ${scheme.name}`,\n securitySchemeName: scheme.name,\n flow: \"authorizationCode\",\n authorizationUrl: Option.some(flow.authorizationUrl),\n tokenUrl: flow.tokenUrl,\n refreshUrl: flow.refreshUrl,\n scopes: flow.scopes,\n identityScopes: \"auto\",\n }),\n );\n }\n\n if (Option.isSome(flows.clientCredentials)) {\n const flow = flows.clientCredentials.value;\n presets.push(\n OAuth2Preset.make({\n label: `OAuth2 Client Credentials · ${scheme.name}`,\n securitySchemeName: scheme.name,\n flow: \"clientCredentials\",\n authorizationUrl: Option.none(),\n tokenUrl: flow.tokenUrl,\n refreshUrl: flow.refreshUrl,\n scopes: flow.scopes,\n identityScopes: false,\n }),\n );\n }\n }\n return presets;\n};\n\n// ---------------------------------------------------------------------------\n// Collect unique tags from extraction result\n// ---------------------------------------------------------------------------\n\nconst collectTags = (result: ExtractionResult): string[] => {\n const tagSet = new Set<string>();\n for (const op of result.operations) {\n for (const tag of op.tags) tagSet.add(tag);\n }\n return [...tagSet].sort();\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Preview already-resolved spec text — extract metadata without registering\n * anything and without any HTTP dependency. */\nexport const previewSpecText = Effect.fn(\"OpenApi.previewSpecText\")(function* (specText: string) {\n const doc: ParsedDocument = yield* parse(specText);\n const result = yield* extract(doc);\n\n const resolver = new DocResolver(doc);\n const securitySchemes = extractSecuritySchemes(doc.components?.securitySchemes ?? {}, resolver);\n\n const rawSecurity = (doc.security ?? []) as Array<Record<string, unknown>>;\n const declaredStrategies = rawSecurity.map((entry) =>\n AuthStrategy.make({ schemes: Object.keys(entry) }),\n );\n // Fall back to one strategy per scheme when the spec only declares schemes\n // under components (e.g. Sentry) so the user still sees auth options.\n const authStrategies =\n declaredStrategies.length > 0\n ? declaredStrategies\n : securitySchemes.map((scheme) => AuthStrategy.make({ schemes: [scheme.name] }));\n\n return SpecPreview.make({\n title: result.title,\n description: result.description,\n version: result.version,\n servers: result.servers,\n operationCount: result.operations.length,\n operations: result.operations.map((op) =>\n PreviewOperation.make({\n operationId: op.operationId,\n method: op.method,\n path: op.pathTemplate,\n summary: op.summary,\n tags: op.tags,\n deprecated: op.deprecated,\n }),\n ),\n tags: collectTags(result),\n securitySchemes,\n authStrategies,\n headerPresets: buildHeaderPresets(securitySchemes, authStrategies),\n oauth2Presets: buildOAuth2Presets(securitySchemes),\n });\n});\n\n/** Preview an OpenAPI spec — extract metadata without registering anything.\n * Accepts either a URL or raw JSON/YAML text. */\nexport const previewSpec = Effect.fn(\"OpenApi.previewSpec\")(function* (input: string) {\n const specText = yield* resolveSpecText(input);\n return yield* previewSpecText(specText);\n});\n"],"mappings":"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","names":["Schema","Schema","Schema","Effect","Effect","Effect","Option","Schema","Schema","Option","Effect"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  OpenApiParseError,
3
3
  resolveServerUrl
4
- } from "./chunk-RFSMGUBJ.js";
4
+ } from "./chunk-O54VFSWE.js";
5
5
 
6
6
  // src/sdk/google-discovery.ts
7
7
  import { Effect, Option, Predicate, Schema, SchemaGetter } from "effect";
@@ -709,4 +709,4 @@ export {
709
709
  firstBaseUrlForPreview,
710
710
  deriveAuthenticationTemplateFromPreview
711
711
  };
712
- //# sourceMappingURL=chunk-I2XDCVVM.js.map
712
+ //# sourceMappingURL=chunk-UOLBAX5D.js.map
@@ -5,7 +5,7 @@ import {
5
5
  fetchGoogleDiscoveryDocument,
6
6
  firstBaseUrlForPreview,
7
7
  isGoogleDiscoveryUrl
8
- } from "./chunk-I2XDCVVM.js";
8
+ } from "./chunk-UOLBAX5D.js";
9
9
  import {
10
10
  openApiPresets
11
11
  } from "./chunk-PAHWRRS3.js";
@@ -22,7 +22,7 @@ import {
22
22
  previewSpecText,
23
23
  resolveServerUrl,
24
24
  resolveSpecText
25
- } from "./chunk-RFSMGUBJ.js";
25
+ } from "./chunk-O54VFSWE.js";
26
26
 
27
27
  // src/sdk/config.ts
28
28
  import { Option, Schema } from "effect";
@@ -172,6 +172,72 @@ var isXmlContentType = (ct) => {
172
172
  };
173
173
  var isTextContentType = (ct) => normalizeContentType(ct).startsWith("text/");
174
174
  var isOctetStream = (ct) => normalizeContentType(ct) === "application/octet-stream";
175
+ var bytesToBase64 = (bytes) => {
176
+ let binary = "";
177
+ const chunkSize = 32768;
178
+ for (let i = 0; i < bytes.length; i += chunkSize) {
179
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));
180
+ }
181
+ return btoa(binary);
182
+ };
183
+ var normalizeBase64 = (value, encoding) => {
184
+ const compact = value.replace(/\s/g, "");
185
+ const alphabet = encoding === "base64url" ? compact.replace(/-/g, "+").replace(/_/g, "/") : compact;
186
+ const remainder = alphabet.length % 4;
187
+ return remainder === 0 ? alphabet : `${alphabet}${"=".repeat(4 - remainder)}`;
188
+ };
189
+ var byteLengthFromBase64 = (base64) => {
190
+ const compact = base64.replace(/\s/g, "");
191
+ const padding = compact.endsWith("==") ? 2 : compact.endsWith("=") ? 1 : 0;
192
+ return Math.max(0, Math.floor(compact.length * 3 / 4) - padding);
193
+ };
194
+ var isGenericMimeType = (mimeType) => normalizeContentType(mimeType) === "application/octet-stream";
195
+ var startsWithBytes = (bytes, prefix) => prefix.every((byte, index) => bytes[index] === byte);
196
+ var isLikelyUtf8Text = (bytes) => {
197
+ if (bytes.length === 0) return false;
198
+ let text;
199
+ try {
200
+ text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
201
+ } catch {
202
+ return false;
203
+ }
204
+ let suspicious = 0;
205
+ for (let index = 0; index < text.length; index += 1) {
206
+ const code = text.charCodeAt(index);
207
+ const allowedControl = code === 9 || code === 10 || code === 12 || code === 13;
208
+ if (code === 0) return false;
209
+ if (code < 32 && !allowedControl) suspicious += 1;
210
+ }
211
+ return suspicious / Math.max(1, text.length) <= 0.02;
212
+ };
213
+ var sniffMimeType = (bytes) => {
214
+ if (startsWithBytes(bytes, [255, 216, 255])) return "image/jpeg";
215
+ if (startsWithBytes(bytes, [137, 80, 78, 71, 13, 10, 26, 10])) {
216
+ return "image/png";
217
+ }
218
+ if (startsWithBytes(bytes, [71, 73, 70, 56, 55, 97]) || startsWithBytes(bytes, [71, 73, 70, 56, 57, 97])) {
219
+ return "image/gif";
220
+ }
221
+ if (startsWithBytes(bytes, [82, 73, 70, 70]) && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80) {
222
+ return "image/webp";
223
+ }
224
+ if (startsWithBytes(bytes, [37, 80, 68, 70, 45])) return "application/pdf";
225
+ if (startsWithBytes(bytes, [80, 75, 3, 4]) || startsWithBytes(bytes, [80, 75, 5, 6]) || startsWithBytes(bytes, [80, 75, 7, 8])) {
226
+ return "application/zip";
227
+ }
228
+ if (isLikelyUtf8Text(bytes)) return "text/plain";
229
+ return null;
230
+ };
231
+ var bytesFromBase64Prefix = (base64) => {
232
+ const prefix = base64.slice(0, Math.min(base64.length, 64));
233
+ const binary = atob(prefix);
234
+ const bytes = new Uint8Array(binary.length);
235
+ for (let index = 0; index < binary.length; index += 1) {
236
+ bytes[index] = binary.charCodeAt(index);
237
+ }
238
+ return bytes;
239
+ };
240
+ var sniffMimeTypeFromBase64 = (base64) => sniffMimeType(bytesFromBase64Prefix(base64));
175
241
  var toUint8Array = (value) => {
176
242
  if (value instanceof Uint8Array) return value;
177
243
  if (value instanceof ArrayBuffer) return new Uint8Array(value);
@@ -184,6 +250,37 @@ var toUint8Array = (value) => {
184
250
  }
185
251
  return null;
186
252
  };
253
+ var readHintString = (option, fallback) => Option2.getOrElse(option, () => fallback);
254
+ var readHintMimeType = (hint, fallback) => Option2.getOrElse(hint.mimeType, () => fallback);
255
+ var readHintEncoding = (hint) => Option2.getOrElse(hint.encoding, () => "base64");
256
+ var fileFromByteField = (body, hint) => {
257
+ if (typeof body !== "object" || body === null || Array.isArray(body)) return null;
258
+ const record = body;
259
+ const dataField = readHintString(hint.dataField, "data");
260
+ const rawData = record[dataField];
261
+ if (typeof rawData !== "string") return null;
262
+ const data = normalizeBase64(rawData, readHintEncoding(hint));
263
+ const sizeField = Option2.getOrUndefined(hint.sizeField);
264
+ const byteLength = sizeField && typeof record[sizeField] === "number" ? record[sizeField] : byteLengthFromBase64(data);
265
+ const hintedMimeType = readHintMimeType(hint, "application/octet-stream");
266
+ return {
267
+ _tag: "ToolFile",
268
+ mimeType: isGenericMimeType(hintedMimeType) ? sniffMimeTypeFromBase64(data) ?? hintedMimeType : hintedMimeType,
269
+ encoding: "base64",
270
+ data,
271
+ byteLength
272
+ };
273
+ };
274
+ var fileFromBinaryBytes = (bytes, hint, contentType) => {
275
+ const hintedMimeType = contentType ?? readHintMimeType(hint, "application/octet-stream");
276
+ return {
277
+ _tag: "ToolFile",
278
+ mimeType: isGenericMimeType(hintedMimeType) ? sniffMimeType(bytes) ?? hintedMimeType : hintedMimeType,
279
+ encoding: "base64",
280
+ data: bytesToBase64(bytes),
281
+ byteLength: bytes.byteLength
282
+ };
283
+ };
187
284
  var toArrayBuffer = (bytes) => {
188
285
  const copy = new ArrayBuffer(bytes.byteLength);
189
286
  new Uint8Array(copy).set(bytes);
@@ -403,15 +500,22 @@ var invoke = Effect.fn("OpenApi.invoke")(function* (operation, args, resolvedHea
403
500
  cause: err
404
501
  })
405
502
  );
406
- const responseBody = status === 204 ? null : isJsonContentType(contentType) ? yield* response.json.pipe(
503
+ const responseBodyBinding = Option2.getOrUndefined(operation.responseBody);
504
+ const fileHint = responseBodyBinding ? Option2.getOrUndefined(responseBodyBinding.fileHint) : void 0;
505
+ const ok = status >= 200 && status < 300;
506
+ const responseBody = status === 204 ? null : ok && fileHint?.kind === "binaryResponse" ? fileFromBinaryBytes(
507
+ new Uint8Array(yield* response.arrayBuffer.pipe(mapBodyError)),
508
+ fileHint,
509
+ contentType
510
+ ) : isJsonContentType(contentType) ? yield* response.json.pipe(
407
511
  Effect.catch(() => response.text),
408
512
  mapBodyError
409
513
  ) : yield* response.text.pipe(mapBodyError);
410
- const ok = status >= 200 && status < 300;
514
+ const dataBody = ok && fileHint?.kind === "byteField" ? fileFromByteField(responseBody, fileHint) ?? responseBody : responseBody;
411
515
  return InvocationResult.make({
412
516
  status,
413
517
  headers: responseHeaders,
414
- data: ok ? responseBody : null,
518
+ data: ok ? dataBody : null,
415
519
  error: ok ? null : responseBody
416
520
  });
417
521
  });
@@ -539,6 +643,7 @@ import {
539
643
  IntegrationNotFoundError,
540
644
  IntegrationSlug,
541
645
  ToolName,
646
+ ToolFileJsonSchema,
542
647
  ToolResult,
543
648
  authToolFailure,
544
649
  definePlugin,
@@ -987,7 +1092,8 @@ var toBinding = (def) => OperationBinding.make({
987
1092
  servers: def.operation.servers,
988
1093
  pathTemplate: def.operation.pathTemplate,
989
1094
  parameters: [...def.operation.parameters],
990
- requestBody: def.operation.requestBody
1095
+ requestBody: def.operation.requestBody,
1096
+ responseBody: def.operation.responseBody
991
1097
  });
992
1098
  var descriptionFor = (def) => {
993
1099
  const op = def.operation;
@@ -1049,7 +1155,10 @@ var toolDefsFromCompiled = (compiled) => compiled.definitions.map(
1049
1155
  // The output schema is the upstream response body only — transport
1050
1156
  // status/headers live in the ToolResult `http` side channel, not the
1051
1157
  // payload (see the invoke handler).
1052
- outputSchema: normalizeOpenApiRefs(Option5.getOrUndefined(def.operation.outputSchema)),
1158
+ outputSchema: Option5.match(def.operation.responseBody, {
1159
+ onNone: () => normalizeOpenApiRefs(Option5.getOrUndefined(def.operation.outputSchema)),
1160
+ onSome: (responseBody) => Option5.isSome(responseBody.fileHint) ? ToolFileJsonSchema : normalizeOpenApiRefs(Option5.getOrUndefined(def.operation.outputSchema))
1161
+ }),
1053
1162
  annotations: annotationsForOperation(def.operation.method, def.operation.pathTemplate)
1054
1163
  })
1055
1164
  );
@@ -1380,15 +1489,18 @@ var openApiPlugin = definePlugin((options) => {
1380
1489
  const httpClientLayer = options?.httpClientLayer ?? invokeCtx.httpClientLayer;
1381
1490
  const integration = toolRow.integration;
1382
1491
  const config = decodeOpenApiIntegrationConfig(credential.config);
1383
- let binding = (yield* invokeCtx.storage.getOperation(integration, toolRow.name))?.binding;
1384
- if (!binding && config) {
1492
+ const bindingFromSpec = config ? Effect3.gen(function* () {
1385
1493
  const specText = yield* loadSpecText(invokeCtx.storage, config).pipe(
1386
1494
  Effect3.catch(() => Effect3.succeed(null))
1387
1495
  );
1388
1496
  const compiled = specText == null ? null : yield* compileSpec(specText).pipe(Effect3.catch(() => Effect3.succeed(null)));
1389
- binding = compiled ? storedOperationsFromCompiled(integration, compiled).find(
1497
+ return compiled ? storedOperationsFromCompiled(integration, compiled).find(
1390
1498
  (op) => op.toolName === toolRow.name
1391
1499
  )?.binding : void 0;
1500
+ }) : Effect3.succeed(void 0);
1501
+ let binding = (yield* invokeCtx.storage.getOperation(integration, toolRow.name))?.binding;
1502
+ if ((!binding || Option5.isNone(binding.responseBody)) && config) {
1503
+ binding = (yield* bindingFromSpec) ?? binding;
1392
1504
  }
1393
1505
  if (!binding) {
1394
1506
  return yield* new OpenApiExtractionError({
@@ -1539,4 +1651,4 @@ export {
1539
1651
  makeDefaultOpenapiStore,
1540
1652
  openApiPlugin
1541
1653
  };
1542
- //# sourceMappingURL=chunk-PNOEE3ET.js.map
1654
+ //# sourceMappingURL=chunk-ZTOOUP67.js.map