@executor-js/plugin-openapi 0.0.1-beta.6 → 0.0.1

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.
@@ -26,6 +26,7 @@ declare const OpenApiGroup_base: HttpApiGroup.HttpApiGroup<"openapi", HttpApiEnd
26
26
  readonly scopeId: string & import("effect/Brand").Brand<"ScopeId">;
27
27
  readonly namespace: string;
28
28
  }, never, {
29
+ readonly name?: string | undefined;
29
30
  readonly headers?: {
30
31
  readonly [x: string]: unknown;
31
32
  } | undefined;
@@ -566,7 +566,16 @@ var makeOpenApiInvoker = (opts) => ({
566
566
  cause: void 0
567
567
  });
568
568
  }
569
- const { binding, config } = entry;
569
+ const source = yield* opts.operationStore.getSource(entry.namespace);
570
+ if (!source) {
571
+ return yield* new ToolInvocationError({
572
+ toolId,
573
+ message: `No source found for namespace "${entry.namespace}"`,
574
+ cause: void 0
575
+ });
576
+ }
577
+ const { binding } = entry;
578
+ const { invocationConfig: config } = source;
570
579
  const baseUrl = config.baseUrl;
571
580
  const resolvedHeaders = yield* resolveHeaders(config.headers, opts.secrets, opts.scopeId);
572
581
  const clientWithBaseUrl = baseUrl ? Layer.effect(
@@ -617,36 +626,63 @@ var StoredSourceSchema = class extends Schema3.Class("OpenApiStoredSource")({
617
626
  baseUrl: Schema3.optional(Schema3.String),
618
627
  namespace: Schema3.optional(Schema3.String),
619
628
  headers: Schema3.optional(Schema3.Record({ key: Schema3.String, value: HeaderValue }))
620
- })
629
+ }),
630
+ // TODO(migration): make required once all rows have been migrated to
631
+ // carry invocationConfig. Left optional for decode compat with rows
632
+ // written before the source-level invocationConfig refactor.
633
+ invocationConfig: Schema3.optional(InvocationConfig)
621
634
  }) {
622
635
  };
623
636
 
624
637
  // src/sdk/kv-operation-store.ts
625
638
  var StoredEntry = class extends Schema4.Class("StoredEntry")({
626
639
  namespace: Schema4.String,
627
- binding: OperationBinding,
628
- config: InvocationConfig
640
+ binding: OperationBinding
629
641
  }) {
630
642
  };
631
643
  var encodeEntry = Schema4.encodeSync(Schema4.parseJson(StoredEntry));
632
644
  var decodeEntry = Schema4.decodeUnknownSync(Schema4.parseJson(StoredEntry));
645
+ var LegacyStoredEntry = class extends Schema4.Class("LegacyStoredEntry")({
646
+ namespace: Schema4.String,
647
+ binding: OperationBinding,
648
+ config: Schema4.optional(InvocationConfig)
649
+ }) {
650
+ };
651
+ var decodeLegacyEntry = Schema4.decodeUnknownSync(Schema4.parseJson(LegacyStoredEntry));
633
652
  var encodeSource = Schema4.encodeSync(Schema4.parseJson(StoredSourceSchema));
634
653
  var decodeSource = Schema4.decodeUnknownSync(Schema4.parseJson(StoredSourceSchema));
635
654
  var makeStore = (bindings, sources) => {
636
655
  const withKvTransaction = (kv, effect) => kv.withTransaction?.(effect) ?? effect;
656
+ const rehydrateInvocationConfig = (source) => Effect4.gen(function* () {
657
+ if (source.invocationConfig) return source;
658
+ let recovered = null;
659
+ const entries = yield* bindings.list();
660
+ for (const e of entries) {
661
+ const legacy = decodeLegacyEntry(e.value);
662
+ if (legacy.namespace === source.namespace && legacy.config) {
663
+ recovered = legacy.config;
664
+ break;
665
+ }
666
+ }
667
+ const invocationConfig = recovered ?? new InvocationConfig({
668
+ baseUrl: source.config.baseUrl ?? "",
669
+ headers: source.config.headers ?? {}
670
+ });
671
+ return { ...source, invocationConfig };
672
+ });
637
673
  return {
638
674
  get: (toolId) => Effect4.gen(function* () {
639
675
  const raw = yield* bindings.get(toolId);
640
676
  if (!raw) return null;
641
677
  const entry = decodeEntry(raw);
642
- return { binding: entry.binding, config: entry.config };
678
+ return { binding: entry.binding, namespace: entry.namespace };
643
679
  }),
644
680
  put: (entries) => withKvTransaction(
645
681
  bindings,
646
682
  bindings.set(
647
- entries.map(({ toolId, namespace, binding, config }) => ({
683
+ entries.map(({ toolId, namespace, binding }) => ({
648
684
  key: toolId,
649
- value: encodeEntry(new StoredEntry({ namespace, binding, config }))
685
+ value: encodeEntry(new StoredEntry({ namespace, binding }))
650
686
  }))
651
687
  )
652
688
  ),
@@ -674,12 +710,23 @@ var makeStore = (bindings, sources) => {
674
710
  removeSource: (namespace) => sources.delete([namespace]).pipe(Effect4.asVoid),
675
711
  listSources: () => Effect4.gen(function* () {
676
712
  const entries = yield* sources.list();
677
- return entries.map((e) => decodeSource(e.value));
713
+ const out = [];
714
+ for (const e of entries) {
715
+ const raw = decodeSource(e.value);
716
+ out.push(
717
+ raw.invocationConfig ? raw : yield* rehydrateInvocationConfig(raw)
718
+ );
719
+ }
720
+ return out;
678
721
  }),
679
722
  getSource: (namespace) => Effect4.gen(function* () {
680
723
  const raw = yield* sources.get(namespace);
681
724
  if (!raw) return null;
682
- return decodeSource(raw);
725
+ const source = decodeSource(raw);
726
+ if (source.invocationConfig) return source;
727
+ const healed = yield* rehydrateInvocationConfig(source);
728
+ yield* sources.set([{ key: namespace, value: encodeSource(healed) }]);
729
+ return healed;
683
730
  }),
684
731
  getSourceConfig: (namespace) => Effect4.gen(function* () {
685
732
  const raw = yield* sources.get(namespace);
@@ -723,12 +770,23 @@ var HeaderPreset = class extends Schema5.Class("HeaderPreset")({
723
770
  secretHeaders: Schema5.Array(Schema5.String)
724
771
  }) {
725
772
  };
773
+ var PreviewOperation = class extends Schema5.Class("PreviewOperation")({
774
+ operationId: Schema5.String,
775
+ method: HttpMethod,
776
+ path: Schema5.String,
777
+ summary: Schema5.optionalWith(Schema5.String, { as: "Option" }),
778
+ tags: Schema5.Array(Schema5.String),
779
+ deprecated: Schema5.Boolean
780
+ }) {
781
+ };
726
782
  var SpecPreview = class extends Schema5.Class("SpecPreview")({
727
783
  title: Schema5.optionalWith(Schema5.String, { as: "Option" }),
728
784
  version: Schema5.optionalWith(Schema5.String, { as: "Option" }),
729
785
  /** Reuses ServerInfo from extraction */
730
786
  servers: Schema5.Array(Schema5.Unknown),
731
787
  operationCount: Schema5.Number,
788
+ /** Lightweight operation list for the add-source UI */
789
+ operations: Schema5.Array(PreviewOperation),
732
790
  tags: Schema5.Array(Schema5.String),
733
791
  securitySchemes: Schema5.Array(SecurityScheme),
734
792
  /** Valid auth strategies (each is a set of schemes used together) */
@@ -808,6 +866,16 @@ var previewSpec = Effect5.fn("OpenApi.previewSpec")(function* (specText) {
808
866
  version: result.version,
809
867
  servers: result.servers,
810
868
  operationCount: result.operations.length,
869
+ operations: result.operations.map(
870
+ (op) => new PreviewOperation({
871
+ operationId: op.operationId,
872
+ method: op.method,
873
+ path: op.pathTemplate,
874
+ summary: op.summary,
875
+ tags: op.tags,
876
+ deprecated: op.deprecated
877
+ })
878
+ ),
811
879
  tags: collectTags(result),
812
880
  securitySchemes,
813
881
  authStrategies,
@@ -1036,6 +1104,7 @@ var openApiPlugin = (options) => {
1036
1104
  id: s.namespace,
1037
1105
  name: s.name,
1038
1106
  kind: "openapi",
1107
+ url: s.config.baseUrl,
1039
1108
  runtime: false,
1040
1109
  canRemove: true,
1041
1110
  canRefresh: false,
@@ -1091,8 +1160,7 @@ var openApiPlugin = (options) => {
1091
1160
  definitions.map((def) => ({
1092
1161
  toolId: ToolId.make(`${namespace}.${def.toolPath}`),
1093
1162
  namespace,
1094
- binding: toBinding(def),
1095
- config: invocationConfig
1163
+ binding: toBinding(def)
1096
1164
  }))
1097
1165
  );
1098
1166
  yield* ctx.tools.register(registrations);
@@ -1105,7 +1173,8 @@ var openApiPlugin = (options) => {
1105
1173
  baseUrl: config.baseUrl,
1106
1174
  namespace: config.namespace,
1107
1175
  headers: config.headers
1108
- }
1176
+ },
1177
+ invocationConfig
1109
1178
  });
1110
1179
  return { sourceId: namespace, toolCount: registrations.length };
1111
1180
  });
@@ -1150,37 +1219,22 @@ var openApiPlugin = (options) => {
1150
1219
  }),
1151
1220
  getSource: (namespace) => operationStore.getSource(namespace),
1152
1221
  updateSource: (namespace, input) => Effect6.gen(function* () {
1153
- const existingSource = yield* operationStore.getSourceConfig(namespace);
1154
- if (!existingSource) return;
1222
+ const existing = yield* operationStore.getSource(namespace);
1223
+ if (!existing) return;
1155
1224
  const updatedConfig = {
1156
- ...existingSource,
1225
+ ...existing.config,
1157
1226
  ...input.baseUrl !== void 0 ? { baseUrl: input.baseUrl } : {},
1158
1227
  ...input.headers !== void 0 ? { headers: input.headers } : {}
1159
1228
  };
1160
1229
  const newInvocationConfig = new InvocationConfig({
1161
- baseUrl: updatedConfig.baseUrl ?? resolveBaseUrl([]),
1230
+ baseUrl: updatedConfig.baseUrl ?? existing.invocationConfig.baseUrl,
1162
1231
  headers: updatedConfig.headers ?? {}
1163
1232
  });
1164
- const toolIds = yield* operationStore.listByNamespace(namespace);
1165
- for (const toolId of toolIds) {
1166
- const entry = yield* operationStore.get(toolId);
1167
- if (entry) {
1168
- yield* operationStore.put([
1169
- {
1170
- toolId,
1171
- namespace,
1172
- binding: entry.binding,
1173
- config: newInvocationConfig
1174
- }
1175
- ]);
1176
- }
1177
- }
1178
- const sources = yield* operationStore.listSources();
1179
- const existingMeta = sources.find((s) => s.namespace === namespace);
1180
1233
  yield* operationStore.putSource({
1181
1234
  namespace,
1182
- name: existingMeta?.name ?? namespace,
1183
- config: updatedConfig
1235
+ name: input.name?.trim() || existing.name,
1236
+ config: updatedConfig,
1237
+ invocationConfig: newInvocationConfig
1184
1238
  });
1185
1239
  })
1186
1240
  },
@@ -1217,8 +1271,9 @@ export {
1217
1271
  SecurityScheme,
1218
1272
  AuthStrategy,
1219
1273
  HeaderPreset,
1274
+ PreviewOperation,
1220
1275
  SpecPreview,
1221
1276
  previewSpec,
1222
1277
  openApiPlugin
1223
1278
  };
1224
- //# sourceMappingURL=chunk-V3D5A6HA.js.map
1279
+ //# sourceMappingURL=chunk-KPGROAQO.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/invoke.ts","../src/sdk/kv-operation-store.ts","../src/sdk/stored-source.ts","../src/sdk/preview.ts","../src/sdk/plugin.ts","../src/sdk/definitions.ts"],"sourcesContent":["import { Data, Schema } from \"effect\";\nimport type { Option } from \"effect\";\n\nexport class OpenApiParseError extends Schema.TaggedError<OpenApiParseError>()(\n \"OpenApiParseError\",\n {\n message: Schema.String,\n },\n) {}\n\nexport class OpenApiExtractionError extends Schema.TaggedError<OpenApiExtractionError>()(\n \"OpenApiExtractionError\",\n {\n message: Schema.String,\n },\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","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport type { OpenAPI, OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport { Effect } from \"effect\";\n\nimport { OpenApiParseError } from \"./errors\";\n\nexport type ParsedDocument = OpenAPIV3.Document | OpenAPIV3_1.Document;\n\n/** Parse, validate, and bundle an OpenAPI document from text or URL */\nexport const parse = Effect.fn(\"OpenApi.parse\")(function* (input: string) {\n const api: OpenAPI.Document = yield* Effect.tryPromise({\n try: async () => {\n const source =\n input.startsWith(\"http://\") || input.startsWith(\"https://\")\n ? input\n : parseTextToObject(input);\n\n // Try full bundle first (resolves $refs cleanly)\n try {\n return await SwaggerParser.bundle(source);\n } catch {\n // Bundle failed (broken $refs) — parse without ref resolution,\n // then manually resolve valid refs and strip broken ones\n const parsed = (await SwaggerParser.parse(source)) as OpenAPI.Document;\n resolveRefsInPlace(parsed);\n return parsed;\n }\n },\n catch: (error) =>\n new OpenApiParseError({\n message: `Failed to parse OpenAPI document: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n\n // Ensure it's OpenAPI 3.x (not Swagger 2)\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\nimport YAML from \"yaml\";\nimport { OpenApiExtractionError } from \"./errors\";\n\n// swagger-parser's dereference needs a tagged error for this path\nclass OpenApiExtractionErrorFromParse extends OpenApiExtractionError {}\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): OpenAPI.Document => {\n const trimmed = text.trim();\n if (trimmed.length === 0) throw new Error(\"OpenAPI document is empty\");\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n parsed = YAML.parse(trimmed);\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"OpenAPI document must parse to an object\");\n }\n\n return parsed as OpenAPI.Document;\n};\n\n// ---------------------------------------------------------------------------\n// Manual $ref resolver — resolves valid refs in-place, strips broken ones\n// ---------------------------------------------------------------------------\n\n/**\n * Walk the document tree and resolve `$ref` pointers that point to\n * `#/components/...` paths. Valid refs are inlined (deep-cloned to\n * avoid shared references). Broken refs are replaced with a\n * placeholder. Circular `$ref`s (a schema referencing itself) are\n * left as-is to avoid creating circular object graphs.\n */\nconst resolveRefsInPlace = (doc: OpenAPI.Document): void => {\n const lookup = (pointer: string): unknown | undefined => {\n if (!pointer.startsWith(\"#/\")) return undefined;\n const parts = pointer.slice(2).split(\"/\");\n let current: unknown = doc;\n for (const part of parts) {\n if (typeof current !== \"object\" || current === null) return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n };\n\n // Track which $ref pointers are currently being resolved to detect cycles\n const resolving = new Set<string>();\n\n const resolveRef = (pointer: string): unknown | undefined => {\n if (resolving.has(pointer)) return undefined; // circular — leave as $ref\n const target = lookup(pointer);\n if (!target) return undefined;\n resolving.add(pointer);\n const cloned = deepClone(target);\n walk(cloned);\n resolving.delete(pointer);\n return cloned;\n };\n\n const deepClone = (obj: unknown): unknown => {\n if (!obj || typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(deepClone);\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n result[k] = deepClone(v);\n }\n return result;\n };\n\n const walk = (obj: unknown): void => {\n if (!obj || typeof obj !== \"object\") return;\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n const item = obj[i];\n if (isRef(item)) {\n const resolved = resolveRef(item.$ref);\n if (resolved) obj[i] = resolved;\n else obj[i] = { description: `Unresolved: ${item.$ref}` };\n } else {\n walk(item);\n }\n }\n return;\n }\n\n const record = obj as Record<string, unknown>;\n for (const [k, v] of Object.entries(record)) {\n if (k === \"$ref\") continue;\n if (isRef(v)) {\n const resolved = resolveRef(v.$ref);\n if (resolved) record[k] = resolved;\n else record[k] = { description: `Unresolved: ${v.$ref}` };\n } else {\n walk(v);\n }\n }\n };\n\n walk(doc);\n};\n\nconst isRef = (v: unknown): v is { $ref: string } =>\n typeof v === \"object\" &&\n v !== null &&\n \"$ref\" in v &&\n typeof (v as Record<string, unknown>).$ref === \"string\";\n","// ---------------------------------------------------------------------------\n// OpenAPI type aliases and $ref resolution\n//\n// Wraps the openapi-types V3/V3_1 union mess and provides clean ref resolution.\n// ---------------------------------------------------------------------------\n\nimport { Option } from \"effect\";\nimport type { OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport type { ParsedDocument } from \"./parse\";\n\n// ---------------------------------------------------------------------------\n// Type aliases — collapse V3 / V3_1 unions into single names\n// ---------------------------------------------------------------------------\n\nexport type ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\nexport type OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\nexport type PathItemObject = OpenAPIV3.PathItemObject | OpenAPIV3_1.PathItemObject;\nexport type RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\nexport type ResponseObject = OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject;\nexport type MediaTypeObject = OpenAPIV3.MediaTypeObject | OpenAPIV3_1.MediaTypeObject;\n\n// ---------------------------------------------------------------------------\n// DocResolver — wraps a parsed document for clean $ref resolution\n// ---------------------------------------------------------------------------\n\nexport class DocResolver {\n constructor(readonly doc: ParsedDocument) {}\n\n /** Resolve a value that might be a $ref, returning the resolved object */\n resolve<T>(value: T | OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject): T | null {\n if (isRef(value)) {\n const resolved = this.resolvePointer(value.$ref);\n return resolved as T | null;\n }\n return value as T;\n }\n\n private resolvePointer(ref: string): unknown {\n if (!ref.startsWith(\"#/\")) return null;\n const segments = ref.slice(2).split(\"/\");\n let current: unknown = this.doc;\n for (const segment of segments) {\n if (typeof current !== \"object\" || current === null) return null;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n }\n}\n\nconst isRef = (value: unknown): value is { $ref: string } =>\n typeof value === \"object\" && value !== null && \"$ref\" in value;\n\n// ---------------------------------------------------------------------------\n// Server URL resolution\n// ---------------------------------------------------------------------------\n\nexport const resolveBaseUrl = (\n servers: readonly {\n url: string;\n variables: import(\"effect/Option\").Option<Record<string, string>>;\n }[],\n): string => {\n const server = servers[0];\n if (!server) return \"\";\n\n let url = server.url;\n if (Option.isSome(server.variables)) {\n for (const [name, value] of Object.entries(server.variables.value)) {\n url = url.replaceAll(`{${name}}`, value);\n }\n }\n return url;\n};\n\n// ---------------------------------------------------------------------------\n// Content negotiation\n// ---------------------------------------------------------------------------\n\n/** Pick the preferred media type entry (prefer application/json) */\nexport const preferredContent = (\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\";\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.Literal(\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.Literal(\"path\", \"query\", \"header\", \"cookie\");\nexport type ParameterLocation = typeof ParameterLocation.Type;\n\n// ---------------------------------------------------------------------------\n// Extracted operation\n// ---------------------------------------------------------------------------\n\nexport class OperationParameter extends Schema.Class<OperationParameter>(\"OperationParameter\")({\n name: Schema.String,\n location: ParameterLocation,\n required: Schema.Boolean,\n schema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n style: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n explode: Schema.optionalWith(Schema.Boolean, { as: \"Option\" }),\n allowReserved: Schema.optionalWith(Schema.Boolean, { as: \"Option\" }),\n description: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n}) {}\n\nexport class OperationRequestBody extends Schema.Class<OperationRequestBody>(\n \"OperationRequestBody\",\n)({\n required: Schema.Boolean,\n contentType: Schema.String,\n schema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n}) {}\n\nexport class ExtractedOperation extends Schema.Class<ExtractedOperation>(\"ExtractedOperation\")({\n operationId: OperationId,\n method: HttpMethod,\n pathTemplate: Schema.String,\n summary: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n description: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n tags: Schema.Array(Schema.String),\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.optionalWith(OperationRequestBody, { as: \"Option\" }),\n inputSchema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n outputSchema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n deprecated: Schema.optionalWith(Schema.Boolean, { default: () => false }),\n}) {}\n\nexport class ServerInfo extends Schema.Class<ServerInfo>(\"ServerInfo\")({\n url: Schema.String,\n variables: Schema.optionalWith(Schema.Record({ key: Schema.String, value: Schema.String }), {\n as: \"Option\",\n }),\n}) {}\n\nexport class ExtractionResult extends Schema.Class<ExtractionResult>(\"ExtractionResult\")({\n title: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n version: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n servers: Schema.Array(ServerInfo),\n operations: Schema.Array(ExtractedOperation),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Operation binding — minimal invocation data (no schemas/metadata)\n// ---------------------------------------------------------------------------\n\nexport class OperationBinding extends Schema.Class<OperationBinding>(\"OperationBinding\")({\n method: HttpMethod,\n pathTemplate: Schema.String,\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.optionalWith(OperationRequestBody, { as: \"Option\" }),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Invocation\n// ---------------------------------------------------------------------------\n\n/**\n * A header value — either a static string or a reference to a secret.\n * Stored as JSON-serializable data.\n */\nexport const HeaderValue = Schema.Union(\n Schema.String,\n Schema.Struct({\n secretId: Schema.String,\n prefix: Schema.optional(Schema.String),\n }),\n);\nexport type HeaderValue = typeof HeaderValue.Type;\n\nexport class InvocationConfig extends Schema.Class<InvocationConfig>(\"InvocationConfig\")({\n baseUrl: Schema.String,\n /** Headers applied to every request. Values can reference secrets. */\n headers: Schema.optionalWith(Schema.Record({ key: Schema.String, value: HeaderValue }), {\n default: () => ({}),\n }),\n}) {}\n\nexport class InvocationResult extends Schema.Class<InvocationResult>(\"InvocationResult\")({\n status: Schema.Number,\n headers: Schema.Record({ key: Schema.String, value: Schema.String }),\n data: Schema.NullOr(Schema.Unknown),\n error: Schema.NullOr(Schema.Unknown),\n}) {}\n","import { Effect, Option } from \"effect\";\n\nimport { OpenApiExtractionError } from \"./errors\";\nimport type { ParsedDocument } from \"./parse\";\nimport {\n DocResolver,\n preferredContent,\n type OperationObject,\n type ParameterObject,\n type PathItemObject,\n type RequestBodyObject,\n type ResponseObject,\n} from \"./openapi-utils\";\nimport {\n ExtractedOperation,\n ExtractionResult,\n type HttpMethod,\n OperationId,\n OperationParameter,\n OperationRequestBody,\n type ParameterLocation,\n ServerInfo,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst HTTP_METHODS: readonly HttpMethod[] = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n];\n\nconst VALID_PARAM_LOCATIONS = new Set<string>([\"path\", \"query\", \"header\", \"cookie\"]);\n\n// ---------------------------------------------------------------------------\n// Parameter extraction\n// ---------------------------------------------------------------------------\n\nconst extractParameters = (\n pathItem: PathItemObject,\n operation: OperationObject,\n r: DocResolver,\n): OperationParameter[] => {\n const merged = new Map<string, ParameterObject>();\n\n for (const raw of pathItem.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n for (const raw of operation.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n\n return [...merged.values()]\n .filter((p) => VALID_PARAM_LOCATIONS.has(p.in))\n .map(\n (p) =>\n new OperationParameter({\n name: p.name,\n location: p.in as ParameterLocation,\n required: p.in === \"path\" ? true : p.required === true,\n schema: Option.fromNullable(p.schema),\n style: Option.fromNullable(p.style),\n explode: Option.fromNullable(p.explode),\n allowReserved: Option.fromNullable(\"allowReserved\" in p ? p.allowReserved : undefined),\n description: Option.fromNullable(p.description),\n }),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Request body extraction\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 content = preferredContent(body.content);\n if (!content) return undefined;\n\n return new OperationRequestBody({\n required: body.required === true,\n contentType: content.mediaType,\n schema: Option.fromNullable(content.media.schema),\n });\n};\n\n// ---------------------------------------------------------------------------\n// Response schema extraction\n// ---------------------------------------------------------------------------\n\nconst extractOutputSchema = (operation: OperationObject, r: DocResolver): unknown | undefined => {\n if (!operation.responses) return undefined;\n\n const entries = Object.entries(operation.responses);\n const preferred = [\n ...entries.filter(([s]) => /^2\\d\\d$/.test(s)).sort(([a], [b]) => a.localeCompare(b)),\n ...entries.filter(([s]) => s === \"default\"),\n ];\n\n for (const [, ref] of preferred) {\n const resp = r.resolve<ResponseObject>(ref);\n if (!resp) continue;\n const content = preferredContent(resp.content);\n if (content?.media.schema) return content.media.schema;\n }\n\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Input schema builder\n// ---------------------------------------------------------------------------\n\nconst buildInputSchema = (\n parameters: readonly OperationParameter[],\n requestBody: OperationRequestBody | undefined,\n): Record<string, unknown> | undefined => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const param of parameters) {\n properties[param.name] = Option.getOrElse(param.schema, () => ({ type: \"string\" }));\n if (param.required) required.push(param.name);\n }\n\n if (requestBody) {\n properties.body = Option.getOrElse(requestBody.schema, () => ({ type: \"object\" }));\n if (requestBody.required) required.push(\"body\");\n }\n\n if (Object.keys(properties).length === 0) return undefined;\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Operation ID derivation\n// ---------------------------------------------------------------------------\n\nconst deriveOperationId = (\n method: HttpMethod,\n pathTemplate: string,\n operation: OperationObject,\n): string =>\n operation.operationId ??\n (`${method}_${pathTemplate.replace(/[^a-zA-Z0-9]+/g, \"_\")}`.replace(/^_+|_+$/g, \"\") ||\n `${method}_operation`);\n\n// ---------------------------------------------------------------------------\n// Server extraction\n// ---------------------------------------------------------------------------\n\nconst extractServers = (doc: ParsedDocument): ServerInfo[] =>\n (doc.servers ?? []).flatMap((server) => {\n if (!server.url) return [];\n const vars = server.variables\n ? Object.fromEntries(\n Object.entries(server.variables).flatMap(([name, v]) =>\n v.default ? [[name, v.default]] : [],\n ),\n )\n : undefined;\n return [\n new ServerInfo({\n url: server.url,\n variables: vars && Object.keys(vars).length > 0 ? Option.some(vars) : Option.none(),\n }),\n ];\n });\n\n// ---------------------------------------------------------------------------\n// Main extraction\n// ---------------------------------------------------------------------------\n\n/** Extract all operations from a bundled OpenAPI 3.x document */\nexport const extract = Effect.fn(\"OpenApi.extract\")(function* (doc: ParsedDocument) {\n const paths = doc.paths;\n if (!paths) {\n return yield* new OpenApiExtractionError({\n message: \"OpenAPI document has no paths defined\",\n });\n }\n\n const r = new DocResolver(doc);\n const operations: ExtractedOperation[] = [];\n\n for (const [pathTemplate, pathItem] of Object.entries(paths).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n if (!pathItem) continue;\n\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const parameters = extractParameters(pathItem, operation, r);\n const requestBody = extractRequestBody(operation, r);\n const inputSchema = buildInputSchema(parameters, requestBody);\n const outputSchema = extractOutputSchema(operation, r);\n const tags = (operation.tags ?? []).filter((t) => t.trim().length > 0);\n\n operations.push(\n new ExtractedOperation({\n operationId: OperationId.make(deriveOperationId(method, pathTemplate, operation)),\n method,\n pathTemplate,\n summary: Option.fromNullable(operation.summary),\n description: Option.fromNullable(operation.description),\n tags,\n parameters,\n requestBody: Option.fromNullable(requestBody),\n inputSchema: Option.fromNullable(inputSchema),\n outputSchema: Option.fromNullable(outputSchema),\n deprecated: operation.deprecated === true,\n }),\n );\n }\n }\n\n return new ExtractionResult({\n title: Option.fromNullable(doc.info?.title),\n version: Option.fromNullable(doc.info?.version),\n servers: extractServers(doc),\n operations,\n });\n});\n","import { Effect, Layer, Option } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"@effect/platform\";\n\nimport {\n type ToolId,\n type ToolInvoker,\n ToolInvocationResult,\n ToolInvocationError,\n type ScopeId,\n type SecretId,\n} from \"@executor/sdk\";\n\nimport { OpenApiInvocationError } from \"./errors\";\nimport type { OpenApiOperationStore } from \"./operation-store\";\nimport {\n type HeaderValue,\n type OperationBinding,\n InvocationConfig,\n InvocationResult,\n type OperationParameter,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Parameter reading\n// ---------------------------------------------------------------------------\n\nconst CONTAINER_KEYS: Record<string, readonly string[]> = {\n path: [\"path\", \"pathParams\", \"params\"],\n query: [\"query\", \"queryParams\", \"params\"],\n header: [\"headers\", \"header\"],\n cookie: [\"cookies\", \"cookie\"],\n};\n\nconst readParamValue = (args: Record<string, unknown>, param: OperationParameter): unknown => {\n const direct = args[param.name];\n if (direct !== undefined) return direct;\n\n for (const key of CONTAINER_KEYS[param.location] ?? []) {\n const container = args[key];\n if (typeof container === \"object\" && container !== null && !Array.isArray(container)) {\n const nested = (container as Record<string, unknown>)[param.name];\n if (nested !== undefined) return nested;\n }\n }\n\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Path resolution\n// ---------------------------------------------------------------------------\n\nconst resolvePath = Effect.fn(\"OpenApi.resolvePath\")(function* (\n pathTemplate: string,\n args: Record<string, unknown>,\n parameters: readonly OperationParameter[],\n) {\n let resolved = pathTemplate;\n\n // Resolve declared path parameters\n for (const param of parameters) {\n if (param.location !== \"path\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) {\n if (param.required) {\n return yield* new OpenApiInvocationError({\n message: `Missing required path parameter: ${param.name}`,\n statusCode: Option.none(),\n });\n }\n continue;\n }\n resolved = resolved.replaceAll(`{${param.name}}`, encodeURIComponent(String(value)));\n }\n\n // Resolve remaining placeholders from raw args (handles specs that\n // don't explicitly list path parameters)\n const remaining = [...resolved.matchAll(/\\{([^{}]+)\\}/g)]\n .map((m) => m[1])\n .filter((v): v is string => typeof v === \"string\");\n\n for (const name of remaining) {\n const value = args[name];\n if (value !== undefined && value !== null) {\n resolved = resolved.replaceAll(`{${name}}`, encodeURIComponent(String(value)));\n }\n }\n\n const unresolved = [...resolved.matchAll(/\\{([^{}]+)\\}/g)]\n .map((m) => m[1])\n .filter((v): v is string => typeof v === \"string\");\n\n if (unresolved.length > 0) {\n return yield* new OpenApiInvocationError({\n message: `Unresolved path parameters: ${[...new Set(unresolved)].join(\", \")}`,\n statusCode: Option.none(),\n });\n }\n\n return resolved;\n});\n\n// ---------------------------------------------------------------------------\n// Header resolution — resolves secret refs at invocation time\n// ---------------------------------------------------------------------------\n\nconst resolveHeaders = (\n headers: Record<string, HeaderValue>,\n secrets: {\n readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown>;\n },\n scopeId: ScopeId,\n): Effect.Effect<Record<string, string>, ToolInvocationError> =>\n Effect.gen(function* () {\n const resolved: Record<string, string> = {};\n for (const [name, value] of Object.entries(headers)) {\n if (typeof value === \"string\") {\n resolved[name] = value;\n } else {\n const secret = yield* secrets.resolve(value.secretId as SecretId, scopeId).pipe(\n Effect.mapError(\n () =>\n new ToolInvocationError({\n toolId: \"\" as ToolId,\n message: `Failed to resolve secret \"${value.secretId}\" for header \"${name}\"`,\n cause: undefined,\n }),\n ),\n );\n resolved[name] = value.prefix ? `${value.prefix}${secret}` : secret;\n }\n }\n return resolved;\n });\n\nconst applyHeaders = (\n request: HttpClientRequest.HttpClientRequest,\n headers: Record<string, string>,\n): HttpClientRequest.HttpClientRequest => {\n let req = request;\n for (const [name, value] of Object.entries(headers)) {\n req = HttpClientRequest.setHeader(req, name, value);\n }\n return req;\n};\n\n// ---------------------------------------------------------------------------\n// Response helpers\n// ---------------------------------------------------------------------------\n\nconst isJsonContentType = (ct: string | null | undefined): boolean => {\n if (!ct) return false;\n const normalized = ct.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n return (\n normalized === \"application/json\" || normalized.includes(\"+json\") || normalized.includes(\"json\")\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Invoke an OpenAPI operation binding. Requires HttpClient in the context. */\nexport const invoke = Effect.fn(\"OpenApi.invoke\")(function* (\n operation: OperationBinding,\n args: Record<string, unknown>,\n config: InvocationConfig,\n /** Pre-resolved headers (secrets already resolved) */\n resolvedHeaders?: Record<string, string>,\n) {\n const client = yield* HttpClient.HttpClient;\n\n const resolvedPath = yield* resolvePath(operation.pathTemplate, args, operation.parameters);\n\n const path = resolvedPath.startsWith(\"/\") ? resolvedPath : `/${resolvedPath}`;\n\n // Build the base request — use just the path; baseUrl is applied to the client\n let request = HttpClientRequest.make(operation.method.toUpperCase() as \"GET\")(path);\n\n // Query parameters\n for (const param of operation.parameters) {\n if (param.location !== \"query\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) continue;\n request = HttpClientRequest.setUrlParam(request, param.name, String(value));\n }\n\n // Header parameters\n for (const param of operation.parameters) {\n if (param.location !== \"header\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) continue;\n request = HttpClientRequest.setHeader(request, param.name, String(value));\n }\n\n // Request body\n if (Option.isSome(operation.requestBody)) {\n const rb = operation.requestBody.value;\n const bodyValue = args.body ?? args.input;\n if (bodyValue !== undefined) {\n if (isJsonContentType(rb.contentType)) {\n request = HttpClientRequest.bodyUnsafeJson(request, bodyValue);\n } else {\n request = HttpClientRequest.bodyText(request, String(bodyValue), rb.contentType);\n }\n }\n }\n\n // Static headers (auth, custom headers, etc.) — use pre-resolved if available\n request = applyHeaders(request, resolvedHeaders ?? {});\n\n // Execute\n const response = yield* client.execute(request).pipe(\n Effect.mapError(\n (err) =>\n new OpenApiInvocationError({\n message: `HTTP request failed: ${err.message}`,\n statusCode: Option.none(),\n cause: err,\n }),\n ),\n );\n\n const status = response.status;\n const responseHeaders: Record<string, string> = { ...response.headers };\n\n // Decode body\n const contentType = response.headers[\"content-type\"] ?? null;\n const responseBody: unknown =\n status === 204\n ? null\n : isJsonContentType(contentType)\n ? yield* response.json.pipe(Effect.catchAll(() => response.text))\n : yield* response.text;\n\n const ok = status >= 200 && status < 300;\n\n return new InvocationResult({\n status,\n headers: responseHeaders,\n data: ok ? responseBody : null,\n error: ok ? null : responseBody,\n });\n});\n\n// ---------------------------------------------------------------------------\n// ToolInvoker — bridges operation store + HTTP client into SDK invoker\n// ---------------------------------------------------------------------------\n\nconst SAFE_METHODS = new Set([\"get\", \"head\", \"options\"]);\n\n/**\n * Derive tool annotations from the HTTP method and path.\n */\nexport const annotationsForOperation = (\n method: string,\n pathTemplate: string,\n): {\n requiresApproval?: boolean;\n approvalDescription?: string;\n} => {\n if (SAFE_METHODS.has(method.toLowerCase())) return {};\n return {\n requiresApproval: true,\n approvalDescription: `${method.toUpperCase()} ${pathTemplate}`,\n };\n};\n\nexport const makeOpenApiInvoker = (opts: {\n readonly operationStore: OpenApiOperationStore;\n readonly httpClientLayer: Layer.Layer<HttpClient.HttpClient>;\n readonly secrets: {\n readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown>;\n };\n readonly scopeId: ScopeId;\n}): ToolInvoker => ({\n resolveAnnotations: (toolId: ToolId) =>\n Effect.gen(function* () {\n const entry = yield* opts.operationStore.get(toolId);\n if (!entry) return undefined;\n return annotationsForOperation(entry.binding.method, entry.binding.pathTemplate);\n }),\n\n invoke: (toolId: ToolId, args: unknown) =>\n Effect.gen(function* () {\n const entry = yield* opts.operationStore.get(toolId);\n if (!entry) {\n return yield* new ToolInvocationError({\n toolId,\n message: `No operation found for tool \"${toolId}\"`,\n cause: undefined,\n });\n }\n\n const source = yield* opts.operationStore.getSource(entry.namespace);\n if (!source) {\n return yield* new ToolInvocationError({\n toolId,\n message: `No source found for namespace \"${entry.namespace}\"`,\n cause: undefined,\n });\n }\n\n const { binding } = entry;\n const { invocationConfig: config } = source;\n const baseUrl = config.baseUrl;\n\n // Resolve secret-backed headers\n const resolvedHeaders = yield* resolveHeaders(config.headers, opts.secrets, opts.scopeId);\n\n const clientWithBaseUrl = baseUrl\n ? Layer.effect(\n HttpClient.HttpClient,\n Effect.map(\n HttpClient.HttpClient,\n HttpClient.mapRequest(HttpClientRequest.prependUrl(baseUrl)),\n ),\n ).pipe(Layer.provide(opts.httpClientLayer))\n : opts.httpClientLayer;\n\n const result = yield* invoke(\n binding,\n (args ?? {}) as Record<string, unknown>,\n config,\n resolvedHeaders,\n ).pipe(Effect.provide(clientWithBaseUrl));\n\n return new ToolInvocationResult({\n data: result.data,\n error: result.error,\n status: result.status,\n });\n }).pipe(\n Effect.catchAll((err) => {\n if (\n typeof err === \"object\" &&\n err !== null &&\n \"_tag\" in err &&\n (err as { _tag: string })._tag === \"ToolInvocationError\"\n ) {\n return Effect.fail(err as ToolInvocationError);\n }\n return Effect.fail(\n new ToolInvocationError({\n toolId,\n message: `OpenAPI invocation failed: ${err instanceof Error ? err.message : String(err)}`,\n cause: err,\n }),\n );\n }),\n ),\n});\n","// ---------------------------------------------------------------------------\n// KV-backed OpenApiOperationStore\n//\n// Uses two KV namespaces — one for bindings, one for sources (meta + config).\n// ---------------------------------------------------------------------------\n\nimport { Effect, Schema } from \"effect\";\nimport { scopeKv, makeInMemoryScopedKv, type Kv, type ToolId, type ScopedKv } from \"@executor/sdk\";\n\nimport type { OpenApiOperationStore, StoredOperation, StoredSource } from \"./operation-store\";\nimport { InvocationConfig, OperationBinding } from \"./types\";\nimport { StoredSourceSchema } from \"./stored-source\";\n\n// ---------------------------------------------------------------------------\n// Stored schemas\n// ---------------------------------------------------------------------------\n\nclass StoredEntry extends Schema.Class<StoredEntry>(\"StoredEntry\")({\n namespace: Schema.String,\n binding: OperationBinding,\n}) {}\n\nconst encodeEntry = Schema.encodeSync(Schema.parseJson(StoredEntry));\nconst decodeEntry = Schema.decodeUnknownSync(Schema.parseJson(StoredEntry));\n\n// TODO(migration): remove LegacyStoredEntry + rehydrateInvocationConfig\n// once all source rows have been migrated off the pre-refactor schema.\n// Old binding rows inlined the resolved InvocationConfig, which is the\n// only place the server-derived baseUrl was persisted.\nclass LegacyStoredEntry extends Schema.Class<LegacyStoredEntry>(\"LegacyStoredEntry\")({\n namespace: Schema.String,\n binding: OperationBinding,\n config: Schema.optional(InvocationConfig),\n}) {}\n\nconst decodeLegacyEntry = Schema.decodeUnknownSync(Schema.parseJson(LegacyStoredEntry));\n\nconst encodeSource = Schema.encodeSync(Schema.parseJson(StoredSourceSchema));\nconst decodeSource = Schema.decodeUnknownSync(Schema.parseJson(StoredSourceSchema));\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nconst makeStore = (bindings: ScopedKv, sources: ScopedKv): OpenApiOperationStore => {\n const withKvTransaction = <A, E>(\n kv: ScopedKv,\n effect: Effect.Effect<A, E, never>,\n ): Effect.Effect<A, E, never> => kv.withTransaction?.(effect) ?? effect;\n\n // TODO(migration): remove along with LegacyStoredEntry.\n // Rebuild invocationConfig for a source row that predates the refactor.\n // We try to recover the resolved baseUrl from any legacy binding row\n // (old rows inlined the full InvocationConfig); if none is found, fall\n // back to the user-provided baseUrl from the source config.\n type DecodedSource = Omit<StoredSource, \"invocationConfig\"> & {\n invocationConfig?: InvocationConfig;\n };\n const rehydrateInvocationConfig = (\n source: DecodedSource,\n ): Effect.Effect<StoredSource> =>\n Effect.gen(function* () {\n if (source.invocationConfig) return source as StoredSource;\n let recovered: InvocationConfig | null = null;\n const entries = yield* bindings.list();\n for (const e of entries) {\n const legacy = decodeLegacyEntry(e.value);\n if (legacy.namespace === source.namespace && legacy.config) {\n recovered = legacy.config;\n break;\n }\n }\n const invocationConfig =\n recovered ??\n new InvocationConfig({\n baseUrl: source.config.baseUrl ?? \"\",\n headers: source.config.headers ?? {},\n });\n return { ...source, invocationConfig };\n });\n\n return {\n get: (toolId) =>\n Effect.gen(function* () {\n const raw = yield* bindings.get(toolId);\n if (!raw) return null;\n const entry = decodeEntry(raw);\n return { binding: entry.binding, namespace: entry.namespace };\n }),\n\n put: (entries: readonly StoredOperation[]) =>\n withKvTransaction(\n bindings,\n bindings.set(\n entries.map(({ toolId, namespace, binding }) => ({\n key: toolId,\n value: encodeEntry(new StoredEntry({ namespace, binding })),\n })),\n ),\n ),\n\n remove: (toolId) => bindings.delete([toolId]).pipe(Effect.asVoid),\n\n listByNamespace: (namespace) =>\n Effect.gen(function* () {\n const entries = yield* bindings.list();\n const ids: ToolId[] = [];\n for (const e of entries) {\n const entry = decodeEntry(e.value);\n if (entry.namespace === namespace) ids.push(e.key as ToolId);\n }\n return ids;\n }),\n\n removeByNamespace: (namespace) =>\n Effect.gen(function* () {\n const entries = yield* bindings.list();\n const ids: ToolId[] = [];\n for (const e of entries) {\n const entry = decodeEntry(e.value);\n if (entry.namespace === namespace) ids.push(e.key as ToolId);\n }\n if (ids.length > 0) yield* bindings.delete(ids);\n return ids;\n }),\n\n putSource: (source) => sources.set([{ key: source.namespace, value: encodeSource(source) }]),\n\n removeSource: (namespace) => sources.delete([namespace]).pipe(Effect.asVoid),\n\n listSources: () =>\n Effect.gen(function* () {\n const entries = yield* sources.list();\n const out: StoredSource[] = [];\n for (const e of entries) {\n const raw = decodeSource(e.value) as DecodedSource;\n // TODO(migration): rehydrate in memory only — avoid N writes per list.\n out.push(\n raw.invocationConfig\n ? (raw as StoredSource)\n : yield* rehydrateInvocationConfig(raw),\n );\n }\n return out;\n }),\n\n getSource: (namespace) =>\n Effect.gen(function* () {\n const raw = yield* sources.get(namespace);\n if (!raw) return null;\n const source = decodeSource(raw) as DecodedSource;\n if (source.invocationConfig) return source as StoredSource;\n // TODO(migration): self-heal — rehydrate and write back once.\n const healed = yield* rehydrateInvocationConfig(source);\n yield* sources.set([{ key: namespace, value: encodeSource(healed) }]);\n return healed;\n }),\n\n getSourceConfig: (namespace) =>\n Effect.gen(function* () {\n const raw = yield* sources.get(namespace);\n if (!raw) return null;\n const source = decodeSource(raw) as StoredSource;\n return source.config;\n }),\n };\n};\n\n// ---------------------------------------------------------------------------\n// Factory from global Kv\n// ---------------------------------------------------------------------------\n\nexport const makeKvOperationStore = (kv: Kv, namespace: string): OpenApiOperationStore =>\n makeStore(scopeKv(kv, `${namespace}.bindings`), scopeKv(kv, `${namespace}.sources`));\n\nexport const makeInMemoryOperationStore = (): OpenApiOperationStore =>\n makeStore(makeInMemoryScopedKv(), makeInMemoryScopedKv());\n","import { Schema } from \"effect\";\n\nimport { HeaderValue, InvocationConfig } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Stored source — the shape persisted by the operation store and exposed\n// via the getSource HTTP endpoint.\n// ---------------------------------------------------------------------------\n\nexport class StoredSourceSchema extends Schema.Class<StoredSourceSchema>(\"OpenApiStoredSource\")({\n namespace: Schema.String,\n name: Schema.String,\n config: Schema.Struct({\n spec: Schema.String,\n baseUrl: Schema.optional(Schema.String),\n namespace: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record({ key: Schema.String, value: HeaderValue })),\n }),\n // TODO(migration): make required once all rows have been migrated to\n // carry invocationConfig. Left optional for decode compat with rows\n // written before the source-level invocationConfig refactor.\n invocationConfig: Schema.optional(InvocationConfig),\n}) {}\n\nexport type StoredSourceSchemaType = typeof StoredSourceSchema.Type;\n","import { Effect, Option } from \"effect\";\nimport { Schema } from \"effect\";\n\nimport { parse } from \"./parse\";\nimport { extract } from \"./extract\";\nimport { HttpMethod, type ExtractionResult } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Security scheme — what the spec declares it needs\n// ---------------------------------------------------------------------------\n\nexport class SecurityScheme extends Schema.Class<SecurityScheme>(\"SecurityScheme\")({\n /** Key name in components.securitySchemes (e.g. \"api_token\") */\n name: Schema.String,\n /** OpenAPI security scheme type */\n type: Schema.Literal(\"http\", \"apiKey\", \"oauth2\", \"openIdConnect\"),\n /** For type: \"http\" — e.g. \"bearer\", \"basic\" */\n scheme: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n /** For type: \"apiKey\" — where the key goes */\n in: Schema.optionalWith(Schema.Literal(\"header\", \"query\", \"cookie\"), { as: \"Option\" }),\n /** For type: \"apiKey\" — the header/query/cookie name */\n headerName: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n description: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Auth strategy — a valid combination of security schemes\n// ---------------------------------------------------------------------------\n\nexport class AuthStrategy extends Schema.Class<AuthStrategy>(\"AuthStrategy\")({\n /** The security schemes required together for this strategy */\n schemes: Schema.Array(Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Header preset — derived from an auth strategy\n// ---------------------------------------------------------------------------\n\nexport class HeaderPreset extends Schema.Class<HeaderPreset>(\"HeaderPreset\")({\n /** Human-readable label for the UI (e.g. \"Bearer Token\", \"API Key + Email\") */\n label: Schema.String,\n /** Headers this strategy needs. Value is null when the user must provide it. */\n headers: Schema.Record({ key: Schema.String, value: Schema.NullOr(Schema.String) }),\n /** Which headers should be stored as secrets */\n secretHeaders: Schema.Array(Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Preview operation — lightweight shape for the add-source UI list\n// ---------------------------------------------------------------------------\n\nexport class PreviewOperation extends Schema.Class<PreviewOperation>(\"PreviewOperation\")({\n operationId: Schema.String,\n method: HttpMethod,\n path: Schema.String,\n summary: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n tags: Schema.Array(Schema.String),\n deprecated: Schema.Boolean,\n}) {}\n\n// ---------------------------------------------------------------------------\n// Spec preview — everything the frontend needs\n// ---------------------------------------------------------------------------\n\nexport class SpecPreview extends Schema.Class<SpecPreview>(\"SpecPreview\")({\n title: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n version: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n /** Reuses ServerInfo from extraction */\n servers: Schema.Array(Schema.Unknown),\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}) {}\n\n// ---------------------------------------------------------------------------\n// Security scheme extraction\n// ---------------------------------------------------------------------------\n\nconst extractSecuritySchemes = (rawSchemes: Record<string, unknown>): SecurityScheme[] =>\n Object.entries(rawSchemes).flatMap(([name, schemeOrRef]) => {\n if (!schemeOrRef || typeof schemeOrRef !== \"object\") return [];\n const scheme = schemeOrRef as Record<string, unknown>;\n if (\"$ref\" in scheme) return [];\n\n const type = scheme.type as string;\n if (![\"http\", \"apiKey\", \"oauth2\", \"openIdConnect\"].includes(type)) return [];\n\n return [\n new SecurityScheme({\n name,\n type: type as \"http\" | \"apiKey\" | \"oauth2\" | \"openIdConnect\",\n scheme: Option.fromNullable(scheme.scheme as string | undefined),\n in: Option.fromNullable(scheme.in as \"header\" | \"query\" | \"cookie\" | undefined),\n headerName: Option.fromNullable(scheme.name as string | undefined),\n description: Option.fromNullable(scheme.description as string | undefined),\n }),\n ];\n });\n\n// ---------------------------------------------------------------------------\n// Header preset builder\n// ---------------------------------------------------------------------------\n\nconst buildHeaderPresets = (\n schemes: readonly SecurityScheme[],\n strategies: readonly AuthStrategy[],\n): HeaderPreset[] => {\n const schemeMap = new Map(schemes.map((s) => [s.name, s]));\n\n return strategies.flatMap((strategy) => {\n const resolved = strategy.schemes\n .map((name) => schemeMap.get(name))\n .filter((s): s is SecurityScheme => s !== undefined);\n\n if (resolved.length === 0) return [];\n\n const headers: Record<string, string | null> = {};\n const secretHeaders: string[] = [];\n const labelParts: string[] = [];\n\n for (const scheme of resolved) {\n if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"bearer\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Bearer Token\");\n } else if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"basic\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Basic Auth\");\n } else if (scheme.type === \"apiKey\" && Option.getOrElse(scheme.in, () => \"\") === \"header\") {\n const headerName = Option.getOrElse(scheme.headerName, () => scheme.name);\n headers[headerName] = null;\n secretHeaders.push(headerName);\n labelParts.push(scheme.name);\n } else if (scheme.type === \"apiKey\") {\n labelParts.push(`${scheme.name} (${Option.getOrElse(scheme.in, () => \"unknown\")})`);\n } else {\n labelParts.push(scheme.name);\n }\n }\n\n if (Object.keys(headers).length === 0 && resolved.length > 0) {\n return [new HeaderPreset({ label: labelParts.join(\" + \"), headers: {}, secretHeaders: [] })];\n }\n\n return [new HeaderPreset({ label: labelParts.join(\" + \"), headers, secretHeaders })];\n });\n};\n\n// ---------------------------------------------------------------------------\n// Collect unique tags from extraction result\n// ---------------------------------------------------------------------------\n\nconst collectTags = (result: ExtractionResult): string[] => {\n const tagSet = new Set<string>();\n for (const op of result.operations) {\n for (const tag of op.tags) tagSet.add(tag);\n }\n return [...tagSet].sort();\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Preview an OpenAPI spec — extract metadata without registering anything.\n * Reuses parse() + extract() for the heavy lifting. */\nexport const previewSpec = Effect.fn(\"OpenApi.previewSpec\")(function* (specText: string) {\n const doc = yield* parse(specText);\n const result = yield* extract(doc);\n\n const securitySchemes = extractSecuritySchemes(doc.components?.securitySchemes ?? {});\n\n const rawSecurity = (doc.security ?? []) as Array<Record<string, unknown>>;\n const authStrategies = rawSecurity.map(\n (entry) => new AuthStrategy({ schemes: Object.keys(entry) }),\n );\n\n return new SpecPreview({\n title: result.title,\n version: result.version,\n servers: result.servers as unknown as readonly unknown[],\n operationCount: result.operations.length,\n operations: result.operations.map(\n (op) =>\n new PreviewOperation({\n operationId: op.operationId,\n method: op.method,\n path: op.pathTemplate,\n summary: op.summary,\n tags: op.tags,\n deprecated: op.deprecated,\n }),\n ),\n tags: collectTags(result),\n securitySchemes,\n authStrategies,\n headerPresets: buildHeaderPresets(securitySchemes, authStrategies),\n });\n});\n","import { Effect, Option, Schema } from \"effect\";\nimport { FetchHttpClient, HttpClient } from \"@effect/platform\";\nimport type { Layer } from \"effect\";\n\nimport {\n Source,\n SourceDetectionResult,\n definePlugin,\n registerRuntimeTools,\n runtimeTool,\n type ExecutorPlugin,\n type PluginContext,\n ToolId,\n type ToolRegistration,\n} from \"@executor/sdk\";\n\nimport { parse } from \"./parse\";\nimport { extract } from \"./extract\";\nimport { compileToolDefinitions, type ToolDefinition } from \"./definitions\";\nimport { makeOpenApiInvoker } from \"./invoke\";\nimport { resolveBaseUrl } from \"./openapi-utils\";\nimport type { OpenApiOperationStore, StoredSource } from \"./operation-store\";\nimport { makeInMemoryOperationStore } from \"./kv-operation-store\";\nimport { previewSpec, SpecPreview } from \"./preview\";\nimport {\n HeaderValue as HeaderValueSchema,\n InvocationConfig,\n OperationBinding,\n type HeaderValue as HeaderValueValue,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Plugin config\n// ---------------------------------------------------------------------------\n\n/** A header value — either a static string or a reference to a secret */\nexport type HeaderValue = HeaderValueValue;\n\nexport interface OpenApiSpecConfig {\n readonly spec: string;\n readonly name?: string;\n readonly baseUrl?: string;\n readonly namespace?: string;\n /** Headers applied to every request. Values can reference secrets. */\n readonly headers?: Record<string, HeaderValue>;\n}\n\n// ---------------------------------------------------------------------------\n// Plugin extension\n// ---------------------------------------------------------------------------\n\nexport interface OpenApiUpdateSourceInput {\n readonly name?: string;\n readonly baseUrl?: string;\n readonly headers?: Record<string, HeaderValue>;\n}\n\nexport interface OpenApiPluginExtension {\n /** Preview a spec without registering — returns metadata, auth strategies, header presets */\n readonly previewSpec: (specText: string) => Effect.Effect<SpecPreview, Error>;\n\n /** Add an OpenAPI spec and register its operations as tools */\n readonly addSpec: (\n config: OpenApiSpecConfig,\n ) => Effect.Effect<{ readonly toolCount: number }, Error>;\n\n /** Remove all tools from a previously added spec by namespace */\n readonly removeSpec: (namespace: string) => Effect.Effect<void>;\n\n /** Fetch the full stored source by namespace (or null if missing) */\n readonly getSource: (namespace: string) => Effect.Effect<StoredSource | null>;\n\n /** Update config (baseUrl, headers) for an existing OpenAPI source */\n readonly updateSource: (\n namespace: string,\n input: OpenApiUpdateSourceInput,\n ) => Effect.Effect<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst PreviewSpecInputSchema = Schema.Struct({\n spec: Schema.String,\n});\ntype PreviewSpecInput = typeof PreviewSpecInputSchema.Type;\n\nconst AddSourceInputSchema = Schema.Struct({\n spec: Schema.String,\n baseUrl: Schema.optional(Schema.String),\n namespace: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record({ key: Schema.String, value: HeaderValueSchema })),\n});\ntype AddSourceInput = typeof AddSourceInputSchema.Type;\n\nconst AddSourceOutputSchema = Schema.Struct({\n sourceId: Schema.String,\n toolCount: Schema.Number,\n});\n\n/** Rewrite OpenAPI `#/components/schemas/X` refs to standard `#/$defs/X`. */\nconst normalizeOpenApiRefs = (node: unknown): unknown => {\n if (node == null || typeof node !== \"object\") return node;\n if (Array.isArray(node)) {\n let changed = false;\n const out = node.map((item) => {\n const n = normalizeOpenApiRefs(item);\n if (n !== item) changed = true;\n return n;\n });\n return changed ? out : node;\n }\n\n const obj = node as Record<string, unknown>;\n\n if (typeof obj.$ref === \"string\") {\n const match = obj.$ref.match(/^#\\/components\\/schemas\\/(.+)$/);\n if (match) return { ...obj, $ref: `#/$defs/${match[1]}` };\n return obj;\n }\n\n let changed = false;\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const n = normalizeOpenApiRefs(v);\n if (n !== v) changed = true;\n result[k] = n;\n }\n return changed ? result : obj;\n};\n\nconst toRegistration = (def: ToolDefinition, namespace: string): ToolRegistration => {\n const op = def.operation;\n const description = Option.getOrElse(op.description, () =>\n Option.getOrElse(op.summary, () => `${op.method.toUpperCase()} ${op.pathTemplate}`),\n );\n return {\n id: ToolId.make(`${namespace}.${def.toolPath}`),\n pluginKey: \"openapi\",\n sourceId: namespace,\n name: def.toolPath,\n description,\n inputSchema: normalizeOpenApiRefs(Option.getOrUndefined(op.inputSchema)),\n outputSchema: normalizeOpenApiRefs(Option.getOrUndefined(op.outputSchema)),\n };\n};\n\nconst toBinding = (def: ToolDefinition): OperationBinding =>\n new OperationBinding({\n method: def.operation.method,\n pathTemplate: def.operation.pathTemplate,\n parameters: [...def.operation.parameters],\n requestBody: def.operation.requestBody,\n });\n\n// ---------------------------------------------------------------------------\n// Plugin factory\n// ---------------------------------------------------------------------------\n\nexport const openApiPlugin = (options?: {\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>;\n readonly operationStore?: OpenApiOperationStore;\n}): ExecutorPlugin<\"openapi\", OpenApiPluginExtension> => {\n const httpClientLayer = options?.httpClientLayer ?? FetchHttpClient.layer;\n const operationStore = options?.operationStore ?? makeInMemoryOperationStore();\n\n return definePlugin({\n key: \"openapi\",\n init: (ctx: PluginContext) =>\n Effect.gen(function* () {\n yield* ctx.tools.registerInvoker(\n \"openapi\",\n makeOpenApiInvoker({\n operationStore,\n httpClientLayer,\n secrets: ctx.secrets,\n scopeId: ctx.scope.id,\n }),\n );\n\n // Tools are already persisted in the KV tool registry — no need to\n // re-register them. We only need the source list and the invoker.\n // Register source manager so the core can list/remove/refresh our sources\n yield* ctx.sources.addManager({\n kind: \"openapi\",\n\n list: () =>\n operationStore.listSources().pipe(\n Effect.map((metas) =>\n metas.map(\n (s) =>\n new Source({\n id: s.namespace,\n name: s.name,\n kind: \"openapi\",\n url: s.config.baseUrl,\n runtime: false,\n canRemove: true,\n canRefresh: false,\n canEdit: true,\n }),\n ),\n ),\n ),\n\n remove: (sourceId: string) =>\n Effect.gen(function* () {\n yield* operationStore.removeByNamespace(sourceId);\n yield* operationStore.removeSource(sourceId);\n yield* ctx.tools.unregisterBySource(sourceId);\n }),\n\n detect: (url: string) =>\n Effect.gen(function* () {\n const trimmed = url.trim();\n if (!trimmed) return null;\n const parsed = yield* Effect.try(() => new URL(trimmed)).pipe(Effect.option);\n if (parsed._tag === \"None\") return null;\n\n // Try fetching the URL and parsing as OpenAPI spec\n // parse() handles both URLs directly and spec text\n const doc = yield* parse(trimmed).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!doc) return null;\n\n const result = yield* extract(doc).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!result) return null;\n\n const namespace = Option.getOrElse(result.title, () => \"api\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\");\n const name = Option.getOrElse(result.title, () => namespace);\n\n return new SourceDetectionResult({\n kind: \"openapi\",\n confidence: \"high\",\n endpoint: trimmed,\n name,\n namespace,\n });\n }),\n });\n\n const addSpecInternal = (config: OpenApiSpecConfig) =>\n Effect.gen(function* () {\n const doc = yield* parse(config.spec);\n const result = yield* extract(doc);\n\n const namespace =\n config.namespace ??\n Option.getOrElse(result.title, () => \"api\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\");\n\n if (doc.components?.schemas) {\n // Normalize OpenAPI $ref format to standard JSON Schema $defs\n const defs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(doc.components.schemas)) {\n defs[k] = normalizeOpenApiRefs(v);\n }\n yield* ctx.tools.registerDefinitions(defs);\n }\n\n const baseUrl = config.baseUrl ?? resolveBaseUrl(result.servers);\n const invocationConfig = new InvocationConfig({\n baseUrl,\n headers: config.headers ?? {},\n });\n\n const definitions = compileToolDefinitions(result.operations);\n\n const registrations = definitions.map((def) => toRegistration(def, namespace));\n\n yield* operationStore.put(\n definitions.map((def) => ({\n toolId: ToolId.make(`${namespace}.${def.toolPath}`),\n namespace,\n binding: toBinding(def),\n })),\n );\n\n yield* ctx.tools.register(registrations);\n\n const sourceName = config.name ?? Option.getOrElse(result.title, () => namespace);\n yield* operationStore.putSource({\n namespace,\n name: sourceName,\n config: {\n spec: config.spec,\n baseUrl: config.baseUrl,\n namespace: config.namespace,\n headers: config.headers,\n },\n invocationConfig,\n });\n\n return { sourceId: namespace, toolCount: registrations.length };\n });\n\n const runtimeTools = yield* registerRuntimeTools({\n registry: ctx.tools,\n sources: ctx.sources,\n pluginKey: \"openapi\",\n source: {\n id: \"built-in\",\n name: \"Built In\",\n kind: \"built-in\",\n },\n tools: [\n runtimeTool({\n id: \"openapi.previewSpec\",\n name: \"openapi.previewSpec\",\n description: \"Preview an OpenAPI document before adding it as a source\",\n inputSchema: PreviewSpecInputSchema,\n outputSchema: SpecPreview,\n handler: ({ spec }: PreviewSpecInput) => previewSpec(spec),\n }),\n runtimeTool({\n id: \"openapi.addSource\",\n name: \"openapi.addSource\",\n description: \"Add an OpenAPI source and register its operations as tools\",\n inputSchema: AddSourceInputSchema,\n outputSchema: AddSourceOutputSchema,\n handler: (input: AddSourceInput) => addSpecInternal(input),\n }),\n ],\n });\n\n return {\n extension: {\n previewSpec: (specText: string) => previewSpec(specText),\n\n addSpec: (config: OpenApiSpecConfig) =>\n addSpecInternal(config).pipe(Effect.map(({ toolCount }) => ({ toolCount }))),\n\n removeSpec: (namespace: string) =>\n Effect.gen(function* () {\n const toolIds = yield* operationStore.removeByNamespace(namespace);\n if (toolIds.length > 0) {\n yield* ctx.tools.unregister(toolIds);\n }\n yield* operationStore.removeSource(namespace);\n }),\n\n getSource: (namespace: string) => operationStore.getSource(namespace),\n\n updateSource: (namespace: string, input: OpenApiUpdateSourceInput) =>\n Effect.gen(function* () {\n const existing = yield* operationStore.getSource(namespace);\n if (!existing) return;\n\n const updatedConfig = {\n ...existing.config,\n ...(input.baseUrl !== undefined ? { baseUrl: input.baseUrl } : {}),\n ...(input.headers !== undefined\n ? { headers: input.headers as Record<string, HeaderValueValue> }\n : {}),\n };\n\n const newInvocationConfig = new InvocationConfig({\n baseUrl: updatedConfig.baseUrl ?? existing.invocationConfig.baseUrl,\n headers: (updatedConfig.headers ?? {}) as Record<string, HeaderValueValue>,\n });\n\n yield* operationStore.putSource({\n namespace,\n name: input.name?.trim() || existing.name,\n config: updatedConfig,\n invocationConfig: newInvocationConfig,\n });\n }),\n },\n\n close: () => runtimeTools.close(),\n };\n }),\n });\n};\n","/**\n * Derives structured `group.leaf` tool paths from extracted OpenAPI operations.\n *\n * Ported from the v3 executor's `definitions.ts`. Turns flat operation IDs like\n * `zones_listZones` into nested paths like `zones.listZones` that the tree UI\n * can render with proper nesting.\n */\n\nimport type { ExtractedOperation } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Word / case utilities\n// ---------------------------------------------------------------------------\n\nconst splitWords = (value: string): string[] =>\n value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, \"$1 $2\")\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter((part) => part.length > 0);\n\nconst normalizeWord = (value: string): string => value.toLowerCase();\n\nconst toCamelCase = (value: string): string => {\n const words = splitWords(value).map(normalizeWord);\n if (words.length === 0) return \"tool\";\n const [first, ...rest] = words;\n return `${first}${rest.map((p) => `${p[0]?.toUpperCase() ?? \"\"}${p.slice(1)}`).join(\"\")}`;\n};\n\nconst toPascalCase = (value: string): string => {\n const camel = toCamelCase(value);\n return `${camel[0]?.toUpperCase() ?? \"\"}${camel.slice(1)}`;\n};\n\n// ---------------------------------------------------------------------------\n// Path utilities\n// ---------------------------------------------------------------------------\n\nconst VERSION_SEGMENT_REGEX = /^v\\d+(?:[._-]\\d+)?$/i;\nconst IGNORED_PATH_SEGMENTS = new Set([\"api\"]);\n\nconst pathSegmentsFromTemplate = (pathTemplate: string): string[] =>\n pathTemplate\n .split(\"/\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\nconst isPathParameterSegment = (segment: string): boolean =>\n segment.startsWith(\"{\") && segment.endsWith(\"}\");\n\nconst normalizeGroupSegment = (value: string | undefined): string | null => {\n const candidate = value?.trim();\n if (!candidate) return null;\n return toCamelCase(candidate);\n};\n\n// ---------------------------------------------------------------------------\n// Derivation\n// ---------------------------------------------------------------------------\n\nconst deriveVersionSegment = (pathTemplate: string): string | undefined =>\n pathSegmentsFromTemplate(pathTemplate)\n .map((s) => s.toLowerCase())\n .find((s) => VERSION_SEGMENT_REGEX.test(s));\n\nconst derivePathGroup = (pathTemplate: string): string => {\n for (const segment of pathSegmentsFromTemplate(pathTemplate)) {\n const lower = segment.toLowerCase();\n if (VERSION_SEGMENT_REGEX.test(lower)) continue;\n if (IGNORED_PATH_SEGMENTS.has(lower)) continue;\n if (isPathParameterSegment(segment)) continue;\n return normalizeGroupSegment(segment) ?? \"root\";\n }\n return \"root\";\n};\n\nconst splitOperationIdSegments = (value: string): string[] =>\n value\n .split(/[/.]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\nconst deriveLeafSeed = (operationId: string, group: string): string => {\n const segments = splitOperationIdSegments(operationId);\n if (segments.length > 1) {\n const [first, ...rest] = segments;\n if ((normalizeGroupSegment(first) ?? first) === group && rest.length > 0) {\n return rest.join(\" \");\n }\n }\n return operationId;\n};\n\nconst fallbackLeafSeed = (method: string, pathTemplate: string, group: string): string => {\n const relevantSegments = pathSegmentsFromTemplate(pathTemplate)\n .filter((s) => !VERSION_SEGMENT_REGEX.test(s.toLowerCase()))\n .filter((s) => !IGNORED_PATH_SEGMENTS.has(s.toLowerCase()))\n .filter((s) => !isPathParameterSegment(s))\n .map((s) => normalizeGroupSegment(s) ?? s)\n .filter((s) => s !== group);\n\n const segmentSuffix = relevantSegments.map((s) => toPascalCase(s)).join(\"\");\n return `${method}${segmentSuffix || \"Operation\"}`;\n};\n\nconst deriveLeaf = (\n operationId: string,\n method: string,\n pathTemplate: string,\n group: string,\n): string => {\n const preferred = toCamelCase(deriveLeafSeed(operationId, group));\n if (preferred.length > 0 && preferred !== group) return preferred;\n return toCamelCase(fallbackLeafSeed(method, pathTemplate, group));\n};\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ToolDefinition {\n /** Dot-separated path like `zones.listZones` */\n readonly toolPath: string;\n /** The group segment */\n readonly group: string;\n /** The leaf segment */\n readonly leaf: string;\n /** Index into the original operations array */\n readonly operationIndex: number;\n /** The original operation */\n readonly operation: ExtractedOperation;\n}\n\n// ---------------------------------------------------------------------------\n// Collision resolution\n// ---------------------------------------------------------------------------\n\nconst resolveCollisions = (\n definitions: {\n toolPath: string;\n group: string;\n leaf: string;\n versionSegment: string | undefined;\n method: string;\n operationHash: string;\n operationIndex: number;\n operation: ExtractedOperation;\n }[],\n): ToolDefinition[] => {\n // Mutable — we progressively refine toolPath on collision\n const staged = definitions.map((d) => ({ ...d }));\n\n const applyFactory = (items: typeof staged, factory: (d: (typeof staged)[number]) => string) => {\n const byPath = new Map<string, typeof staged>();\n for (const item of items) {\n const bucket = byPath.get(item.toolPath) ?? [];\n bucket.push(item);\n byPath.set(item.toolPath, bucket);\n }\n for (const bucket of byPath.values()) {\n if (bucket.length < 2) continue;\n for (const d of bucket) {\n d.toolPath = factory(d);\n }\n }\n };\n\n // Round 1: add version segment\n applyFactory(staged, (d) =>\n d.versionSegment ? `${d.group}.${d.versionSegment}.${d.leaf}` : d.toolPath,\n );\n\n // Round 2: add method suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment ? `${d.group}.${d.versionSegment}` : d.group;\n return `${prefix}.${d.leaf}${toPascalCase(d.method)}`;\n });\n\n // Round 3: add hash suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment ? `${d.group}.${d.versionSegment}` : d.group;\n return `${prefix}.${d.leaf}${toPascalCase(d.method)}${d.operationHash.slice(0, 8)}`;\n });\n\n return staged.map((d) => ({\n toolPath: d.toolPath,\n group: d.group,\n leaf: d.leaf,\n operationIndex: d.operationIndex,\n operation: d.operation,\n }));\n};\n\n// ---------------------------------------------------------------------------\n// Stable hash (simple, deterministic)\n// ---------------------------------------------------------------------------\n\nconst stableHash = (value: unknown): string => {\n const str = JSON.stringify(value, Object.keys(value as Record<string, unknown>).sort());\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash).toString(36).padStart(8, \"0\");\n};\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Compile extracted operations into tool definitions with structured\n * `group.leaf` paths suitable for tree rendering.\n */\nexport const compileToolDefinitions = (\n operations: readonly ExtractedOperation[],\n): ToolDefinition[] => {\n const raw = operations.map((op, index) => {\n const operationId = op.operationId as string;\n const group = normalizeGroupSegment(op.tags[0]) ?? derivePathGroup(op.pathTemplate);\n const leaf = deriveLeaf(operationId, op.method, op.pathTemplate, group);\n const versionSegment = deriveVersionSegment(op.pathTemplate);\n const operationHash = stableHash({\n method: op.method,\n path: op.pathTemplate,\n operationId,\n });\n\n return {\n toolPath: `${group}.${leaf}`,\n group,\n leaf,\n versionSegment,\n method: op.method,\n operationHash,\n operationIndex: index,\n operation: op,\n };\n });\n\n return resolveCollisions(raw).sort((a, b) => a.toolPath.localeCompare(b.toolPath));\n};\n"],"mappings":"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","names":["isRef","Schema","Effect","Option","Option","Effect","Effect","Option","Effect","Option","Effect","Schema","Schema","Schema","Schema","Effect","Effect","Option","Schema","Schema","Option","Effect","Effect","Option","Schema","Schema","changed","Option","Effect"]}
package/dist/core.js CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  OperationParameter,
16
16
  OperationRequestBody,
17
17
  ParameterLocation,
18
+ PreviewOperation,
18
19
  SecurityScheme,
19
20
  ServerInfo,
20
21
  SpecPreview,
@@ -28,7 +29,7 @@ import {
28
29
  preferredContent,
29
30
  previewSpec,
30
31
  resolveBaseUrl
31
- } from "./chunk-V3D5A6HA.js";
32
+ } from "./chunk-KPGROAQO.js";
32
33
 
33
34
  // src/sdk/config-file-store.ts
34
35
  import { Effect } from "effect";
@@ -87,6 +88,7 @@ export {
87
88
  OperationParameter,
88
89
  OperationRequestBody,
89
90
  ParameterLocation,
91
+ PreviewOperation,
90
92
  SecurityScheme,
91
93
  ServerInfo,
92
94
  SpecPreview,
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk/config-file-store.ts"],"sourcesContent":["/**\n * Config-file wrapper for OpenApiOperationStore.\n *\n * Decorates an underlying store so that `putSource` and `removeSource` also\n * write to executor.jsonc.\n */\n\nimport { Effect } from \"effect\";\nimport { FileSystem } from \"@effect/platform\";\nimport type { Layer } from \"effect\";\n\nimport { addSourceToConfig, removeSourceFromConfig, SECRET_REF_PREFIX } from \"@executor/config\";\nimport type { SourceConfig as ConfigFileSourceConfig, ConfigHeaderValue } from \"@executor/config\";\n\nimport type { OpenApiOperationStore, StoredSource } from \"./operation-store\";\n\ntype PluginHeaderValue = string | { readonly secretId: string; readonly prefix?: string };\n\nconst translateSecretHeaders = (\n headers: Readonly<Record<string, PluginHeaderValue>> | undefined,\n): Record<string, ConfigHeaderValue> | undefined => {\n if (!headers) return undefined;\n const result: Record<string, ConfigHeaderValue> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === \"string\") {\n result[key] = value;\n continue;\n }\n const ref = `${SECRET_REF_PREFIX}${value.secretId}`;\n result[key] = value.prefix ? { value: ref, prefix: value.prefix } : ref;\n }\n return result;\n};\n\nconst toSourceConfig = (source: StoredSource): ConfigFileSourceConfig => ({\n kind: \"openapi\",\n spec: source.config.spec,\n baseUrl: source.config.baseUrl,\n namespace: source.namespace,\n headers: translateSecretHeaders(source.config.headers),\n});\n\nexport const withConfigFile = (\n inner: OpenApiOperationStore,\n configPath: string,\n fsLayer: Layer.Layer<FileSystem.FileSystem>,\n): OpenApiOperationStore => ({\n ...inner,\n putSource: (source) =>\n Effect.gen(function* () {\n yield* inner.putSource(source);\n yield* addSourceToConfig(configPath, toSourceConfig(source)).pipe(\n Effect.provide(fsLayer),\n Effect.catchAll(() => Effect.void),\n );\n }),\n removeSource: (namespace) =>\n Effect.gen(function* () {\n yield* inner.removeSource(namespace);\n yield* removeSourceFromConfig(configPath, namespace).pipe(\n Effect.provide(fsLayer),\n Effect.catchAll(() => Effect.void),\n );\n }),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,cAAc;AAIvB,SAAS,mBAAmB,wBAAwB,yBAAyB;AAO7E,IAAM,yBAAyB,CAC7B,YACkD;AAClD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAA4C,CAAC;AACnD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,GAAG,IAAI;AACd;AAAA,IACF;AACA,UAAM,MAAM,GAAG,iBAAiB,GAAG,MAAM,QAAQ;AACjD,WAAO,GAAG,IAAI,MAAM,SAAS,EAAE,OAAO,KAAK,QAAQ,MAAM,OAAO,IAAI;AAAA,EACtE;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,YAAkD;AAAA,EACxE,MAAM;AAAA,EACN,MAAM,OAAO,OAAO;AAAA,EACpB,SAAS,OAAO,OAAO;AAAA,EACvB,WAAW,OAAO;AAAA,EAClB,SAAS,uBAAuB,OAAO,OAAO,OAAO;AACvD;AAEO,IAAM,iBAAiB,CAC5B,OACA,YACA,aAC2B;AAAA,EAC3B,GAAG;AAAA,EACH,WAAW,CAAC,WACV,OAAO,IAAI,aAAa;AACtB,WAAO,MAAM,UAAU,MAAM;AAC7B,WAAO,kBAAkB,YAAY,eAAe,MAAM,CAAC,EAAE;AAAA,MAC3D,OAAO,QAAQ,OAAO;AAAA,MACtB,OAAO,SAAS,MAAM,OAAO,IAAI;AAAA,IACnC;AAAA,EACF,CAAC;AAAA,EACH,cAAc,CAAC,cACb,OAAO,IAAI,aAAa;AACtB,WAAO,MAAM,aAAa,SAAS;AACnC,WAAO,uBAAuB,YAAY,SAAS,EAAE;AAAA,MACnD,OAAO,QAAQ,OAAO;AAAA,MACtB,OAAO,SAAS,MAAM,OAAO,IAAI;AAAA,IACnC;AAAA,EACF,CAAC;AACL;","names":[]}
1
+ {"version":3,"sources":["../src/sdk/config-file-store.ts"],"sourcesContent":["/**\n * Config-file wrapper for OpenApiOperationStore.\n *\n * Decorates an underlying store so that `putSource` and `removeSource` also\n * write to executor.jsonc.\n */\n\nimport { Effect } from \"effect\";\nimport { FileSystem } from \"@effect/platform\";\nimport type { Layer } from \"effect\";\n\nimport { addSourceToConfig, removeSourceFromConfig, SECRET_REF_PREFIX } from \"@executor/config\";\nimport type { SourceConfig as ConfigFileSourceConfig, ConfigHeaderValue } from \"@executor/config\";\n\nimport type { OpenApiOperationStore, StoredSource } from \"./operation-store\";\n\ntype PluginHeaderValue = string | { readonly secretId: string; readonly prefix?: string };\n\nconst translateSecretHeaders = (\n headers: Readonly<Record<string, PluginHeaderValue>> | undefined,\n): Record<string, ConfigHeaderValue> | undefined => {\n if (!headers) return undefined;\n const result: Record<string, ConfigHeaderValue> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === \"string\") {\n result[key] = value;\n continue;\n }\n const ref = `${SECRET_REF_PREFIX}${value.secretId}`;\n result[key] = value.prefix ? { value: ref, prefix: value.prefix } : ref;\n }\n return result;\n};\n\nconst toSourceConfig = (source: StoredSource): ConfigFileSourceConfig => ({\n kind: \"openapi\",\n spec: source.config.spec,\n baseUrl: source.config.baseUrl,\n namespace: source.namespace,\n headers: translateSecretHeaders(source.config.headers),\n});\n\nexport const withConfigFile = (\n inner: OpenApiOperationStore,\n configPath: string,\n fsLayer: Layer.Layer<FileSystem.FileSystem>,\n): OpenApiOperationStore => ({\n ...inner,\n putSource: (source) =>\n Effect.gen(function* () {\n yield* inner.putSource(source);\n yield* addSourceToConfig(configPath, toSourceConfig(source)).pipe(\n Effect.provide(fsLayer),\n Effect.catchAll(() => Effect.void),\n );\n }),\n removeSource: (namespace) =>\n Effect.gen(function* () {\n yield* inner.removeSource(namespace);\n yield* removeSourceFromConfig(configPath, namespace).pipe(\n Effect.provide(fsLayer),\n Effect.catchAll(() => Effect.void),\n );\n }),\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,cAAc;AAIvB,SAAS,mBAAmB,wBAAwB,yBAAyB;AAO7E,IAAM,yBAAyB,CAC7B,YACkD;AAClD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAA4C,CAAC;AACnD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,GAAG,IAAI;AACd;AAAA,IACF;AACA,UAAM,MAAM,GAAG,iBAAiB,GAAG,MAAM,QAAQ;AACjD,WAAO,GAAG,IAAI,MAAM,SAAS,EAAE,OAAO,KAAK,QAAQ,MAAM,OAAO,IAAI;AAAA,EACtE;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,YAAkD;AAAA,EACxE,MAAM;AAAA,EACN,MAAM,OAAO,OAAO;AAAA,EACpB,SAAS,OAAO,OAAO;AAAA,EACvB,WAAW,OAAO;AAAA,EAClB,SAAS,uBAAuB,OAAO,OAAO,OAAO;AACvD;AAEO,IAAM,iBAAiB,CAC5B,OACA,YACA,aAC2B;AAAA,EAC3B,GAAG;AAAA,EACH,WAAW,CAAC,WACV,OAAO,IAAI,aAAa;AACtB,WAAO,MAAM,UAAU,MAAM;AAC7B,WAAO,kBAAkB,YAAY,eAAe,MAAM,CAAC,EAAE;AAAA,MAC3D,OAAO,QAAQ,OAAO;AAAA,MACtB,OAAO,SAAS,MAAM,OAAO,IAAI;AAAA,IACnC;AAAA,EACF,CAAC;AAAA,EACH,cAAc,CAAC,cACb,OAAO,IAAI,aAAa;AACtB,WAAO,MAAM,aAAa,SAAS;AACnC,WAAO,uBAAuB,YAAY,SAAS,EAAE;AAAA,MACnD,OAAO,QAAQ,OAAO;AAAA,MACtB,OAAO,SAAS,MAAM,OAAO,IAAI;AAAA,IACnC;AAAA,EACF,CAAC;AACL;","names":[]}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  openApiPlugin
3
- } from "./chunk-V3D5A6HA.js";
3
+ } from "./chunk-KPGROAQO.js";
4
4
 
5
5
  // src/promise.ts
6
6
  var openApiPlugin2 = (options) => openApiPlugin(options);
@@ -5,7 +5,7 @@ export { openApiPlugin, type OpenApiSpecConfig, type OpenApiPluginExtension } fr
5
5
  export { type OpenApiOperationStore, type StoredOperation, type StoredSource, type SourceConfig, } from "./operation-store";
6
6
  export { makeKvOperationStore, makeInMemoryOperationStore } from "./kv-operation-store";
7
7
  export { withConfigFile } from "./config-file-store";
8
- export { previewSpec, SecurityScheme, AuthStrategy, HeaderPreset, SpecPreview } from "./preview";
8
+ export { previewSpec, SecurityScheme, AuthStrategy, HeaderPreset, PreviewOperation, SpecPreview, } from "./preview";
9
9
  export { DocResolver, resolveBaseUrl, preferredContent } from "./openapi-utils";
10
10
  export { OpenApiParseError, OpenApiExtractionError, OpenApiInvocationError } from "./errors";
11
11
  export { ExtractedOperation, ExtractionResult, InvocationConfig, InvocationResult, OperationBinding, OperationParameter, OperationRequestBody, ServerInfo, OperationId, HttpMethod, ParameterLocation, } from "./types";
@@ -11,17 +11,18 @@ export interface StoredSource {
11
11
  readonly namespace: string;
12
12
  readonly name: string;
13
13
  readonly config: SourceConfig;
14
+ /** Pre-resolved runtime invocation config (baseUrl resolved from servers, headers). */
15
+ readonly invocationConfig: InvocationConfig;
14
16
  }
15
17
  export interface StoredOperation {
16
18
  readonly toolId: ToolId;
17
19
  readonly namespace: string;
18
20
  readonly binding: OperationBinding;
19
- readonly config: InvocationConfig;
20
21
  }
21
22
  export interface OpenApiOperationStore {
22
23
  readonly get: (toolId: ToolId) => Effect.Effect<{
23
24
  binding: OperationBinding;
24
- config: InvocationConfig;
25
+ namespace: string;
25
26
  } | null>;
26
27
  readonly put: (entries: readonly StoredOperation[]) => Effect.Effect<void>;
27
28
  readonly remove: (toolId: ToolId) => Effect.Effect<void>;
@@ -16,6 +16,7 @@ export interface OpenApiSpecConfig {
16
16
  readonly headers?: Record<string, HeaderValue>;
17
17
  }
18
18
  export interface OpenApiUpdateSourceInput {
19
+ readonly name?: string;
19
20
  readonly baseUrl?: string;
20
21
  readonly headers?: Record<string, HeaderValue>;
21
22
  }
@@ -91,6 +91,39 @@ declare const HeaderPreset_base: Schema.Class<HeaderPreset, {
91
91
  }, {}, {}>;
92
92
  export declare class HeaderPreset extends HeaderPreset_base {
93
93
  }
94
+ declare const PreviewOperation_base: Schema.Class<PreviewOperation, {
95
+ operationId: typeof Schema.String;
96
+ method: Schema.Literal<["get", "put", "post", "delete", "patch", "head", "options", "trace"]>;
97
+ path: typeof Schema.String;
98
+ summary: Schema.optionalWith<typeof Schema.String, {
99
+ as: "Option";
100
+ }>;
101
+ tags: Schema.Array$<typeof Schema.String>;
102
+ deprecated: typeof Schema.Boolean;
103
+ }, Schema.Struct.Encoded<{
104
+ operationId: typeof Schema.String;
105
+ method: Schema.Literal<["get", "put", "post", "delete", "patch", "head", "options", "trace"]>;
106
+ path: typeof Schema.String;
107
+ summary: Schema.optionalWith<typeof Schema.String, {
108
+ as: "Option";
109
+ }>;
110
+ tags: Schema.Array$<typeof Schema.String>;
111
+ deprecated: typeof Schema.Boolean;
112
+ }>, never, {
113
+ readonly tags: readonly string[];
114
+ } & {
115
+ readonly summary: Option.Option<string>;
116
+ } & {
117
+ readonly operationId: string;
118
+ } & {
119
+ readonly deprecated: boolean;
120
+ } & {
121
+ readonly path: string;
122
+ } & {
123
+ readonly method: "delete" | "get" | "put" | "post" | "options" | "head" | "patch" | "trace";
124
+ }, {}, {}>;
125
+ export declare class PreviewOperation extends PreviewOperation_base {
126
+ }
94
127
  declare const SpecPreview_base: Schema.Class<SpecPreview, {
95
128
  title: Schema.optionalWith<typeof Schema.String, {
96
129
  as: "Option";
@@ -101,6 +134,8 @@ declare const SpecPreview_base: Schema.Class<SpecPreview, {
101
134
  /** Reuses ServerInfo from extraction */
102
135
  servers: Schema.Array$<typeof Schema.Unknown>;
103
136
  operationCount: typeof Schema.Number;
137
+ /** Lightweight operation list for the add-source UI */
138
+ operations: Schema.Array$<typeof PreviewOperation>;
104
139
  tags: Schema.Array$<typeof Schema.String>;
105
140
  securitySchemes: Schema.Array$<typeof SecurityScheme>;
106
141
  /** Valid auth strategies (each is a set of schemes used together) */
@@ -117,6 +152,8 @@ declare const SpecPreview_base: Schema.Class<SpecPreview, {
117
152
  /** Reuses ServerInfo from extraction */
118
153
  servers: Schema.Array$<typeof Schema.Unknown>;
119
154
  operationCount: typeof Schema.Number;
155
+ /** Lightweight operation list for the add-source UI */
156
+ operations: Schema.Array$<typeof PreviewOperation>;
120
157
  tags: Schema.Array$<typeof Schema.String>;
121
158
  securitySchemes: Schema.Array$<typeof SecurityScheme>;
122
159
  /** Valid auth strategies (each is a set of schemes used together) */
@@ -133,6 +170,8 @@ declare const SpecPreview_base: Schema.Class<SpecPreview, {
133
170
  readonly version: Option.Option<string>;
134
171
  } & {
135
172
  readonly securitySchemes: readonly SecurityScheme[];
173
+ } & {
174
+ readonly operations: readonly PreviewOperation[];
136
175
  } & {
137
176
  readonly operationCount: number;
138
177
  } & {
@@ -1,4 +1,5 @@
1
1
  import { Schema } from "effect";
2
+ import { InvocationConfig } from "./types";
2
3
  declare const StoredSourceSchema_base: Schema.Class<StoredSourceSchema, {
3
4
  namespace: typeof Schema.String;
4
5
  name: typeof Schema.String;
@@ -11,6 +12,7 @@ declare const StoredSourceSchema_base: Schema.Class<StoredSourceSchema, {
11
12
  prefix: Schema.optional<typeof Schema.String>;
12
13
  }>]>>>;
13
14
  }>;
15
+ invocationConfig: Schema.optional<typeof InvocationConfig>;
14
16
  }, Schema.Struct.Encoded<{
15
17
  namespace: typeof Schema.String;
16
18
  name: typeof Schema.String;
@@ -23,10 +25,13 @@ declare const StoredSourceSchema_base: Schema.Class<StoredSourceSchema, {
23
25
  prefix: Schema.optional<typeof Schema.String>;
24
26
  }>]>>>;
25
27
  }>;
28
+ invocationConfig: Schema.optional<typeof InvocationConfig>;
26
29
  }>, never, {
27
30
  readonly name: string;
28
31
  } & {
29
32
  readonly namespace: string;
33
+ } & {
34
+ readonly invocationConfig?: InvocationConfig | undefined;
30
35
  } & {
31
36
  readonly config: {
32
37
  readonly namespace?: string | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@executor-js/plugin-openapi",
3
- "version": "0.0.1-beta.6",
3
+ "version": "0.0.1",
4
4
  "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/openapi",
5
5
  "bugs": {
6
6
  "url": "https://github.com/RhysSullivan/executor/issues"
@@ -43,8 +43,8 @@
43
43
  "@apidevtools/swagger-parser": "^12.1.0",
44
44
  "@effect/platform": "^0.96.0",
45
45
  "@effect/platform-node": "^0.106.0",
46
- "@executor/config": "1.4.3-beta.0",
47
- "@executor-js/sdk": "0.0.1-beta.6",
46
+ "@executor/config": "1.4.3",
47
+ "@executor-js/sdk": "0.0.1",
48
48
  "effect": "^3.21.0",
49
49
  "openapi-types": "^12.1.3",
50
50
  "yaml": "^2.7.1"
@@ -52,8 +52,8 @@
52
52
  "devDependencies": {
53
53
  "@effect-atom/atom-react": "^0.5.0",
54
54
  "@effect/vitest": "^0.29.0",
55
- "@executor/api": "1.4.3-beta.0",
56
- "@executor/react": "1.4.3-beta.0",
55
+ "@executor/api": "1.4.3",
56
+ "@executor/react": "1.4.3",
57
57
  "@types/node": "^24.3.1",
58
58
  "@types/react": "^19.1.0",
59
59
  "bun-types": "^1.2.22",
@@ -63,8 +63,8 @@
63
63
  },
64
64
  "peerDependencies": {
65
65
  "@effect-atom/atom-react": "^0.5.0",
66
- "@executor/api": "1.4.3-beta.0",
67
- "@executor/react": "1.4.3-beta.0",
66
+ "@executor/api": "1.4.3",
67
+ "@executor/react": "1.4.3",
68
68
  "@tanstack/react-router": "^1.168.10",
69
69
  "react": "^19.1.0"
70
70
  },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sdk/errors.ts","../src/sdk/parse.ts","../src/sdk/openapi-utils.ts","../src/sdk/types.ts","../src/sdk/extract.ts","../src/sdk/invoke.ts","../src/sdk/kv-operation-store.ts","../src/sdk/stored-source.ts","../src/sdk/preview.ts","../src/sdk/plugin.ts","../src/sdk/definitions.ts"],"sourcesContent":["import { Data, Schema } from \"effect\";\nimport type { Option } from \"effect\";\n\nexport class OpenApiParseError extends Schema.TaggedError<OpenApiParseError>()(\n \"OpenApiParseError\",\n {\n message: Schema.String,\n },\n) {}\n\nexport class OpenApiExtractionError extends Schema.TaggedError<OpenApiExtractionError>()(\n \"OpenApiExtractionError\",\n {\n message: Schema.String,\n },\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","import SwaggerParser from \"@apidevtools/swagger-parser\";\nimport type { OpenAPI, OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport { Effect } from \"effect\";\n\nimport { OpenApiParseError } from \"./errors\";\n\nexport type ParsedDocument = OpenAPIV3.Document | OpenAPIV3_1.Document;\n\n/** Parse, validate, and bundle an OpenAPI document from text or URL */\nexport const parse = Effect.fn(\"OpenApi.parse\")(function* (input: string) {\n const api: OpenAPI.Document = yield* Effect.tryPromise({\n try: async () => {\n const source =\n input.startsWith(\"http://\") || input.startsWith(\"https://\")\n ? input\n : parseTextToObject(input);\n\n // Try full bundle first (resolves $refs cleanly)\n try {\n return await SwaggerParser.bundle(source);\n } catch {\n // Bundle failed (broken $refs) — parse without ref resolution,\n // then manually resolve valid refs and strip broken ones\n const parsed = (await SwaggerParser.parse(source)) as OpenAPI.Document;\n resolveRefsInPlace(parsed);\n return parsed;\n }\n },\n catch: (error) =>\n new OpenApiParseError({\n message: `Failed to parse OpenAPI document: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n\n // Ensure it's OpenAPI 3.x (not Swagger 2)\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\nimport YAML from \"yaml\";\nimport { OpenApiExtractionError } from \"./errors\";\n\n// swagger-parser's dereference needs a tagged error for this path\nclass OpenApiExtractionErrorFromParse extends OpenApiExtractionError {}\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): OpenAPI.Document => {\n const trimmed = text.trim();\n if (trimmed.length === 0) throw new Error(\"OpenAPI document is empty\");\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n parsed = YAML.parse(trimmed);\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"OpenAPI document must parse to an object\");\n }\n\n return parsed as OpenAPI.Document;\n};\n\n// ---------------------------------------------------------------------------\n// Manual $ref resolver — resolves valid refs in-place, strips broken ones\n// ---------------------------------------------------------------------------\n\n/**\n * Walk the document tree and resolve `$ref` pointers that point to\n * `#/components/...` paths. Valid refs are inlined (deep-cloned to\n * avoid shared references). Broken refs are replaced with a\n * placeholder. Circular `$ref`s (a schema referencing itself) are\n * left as-is to avoid creating circular object graphs.\n */\nconst resolveRefsInPlace = (doc: OpenAPI.Document): void => {\n const lookup = (pointer: string): unknown | undefined => {\n if (!pointer.startsWith(\"#/\")) return undefined;\n const parts = pointer.slice(2).split(\"/\");\n let current: unknown = doc;\n for (const part of parts) {\n if (typeof current !== \"object\" || current === null) return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n };\n\n // Track which $ref pointers are currently being resolved to detect cycles\n const resolving = new Set<string>();\n\n const resolveRef = (pointer: string): unknown | undefined => {\n if (resolving.has(pointer)) return undefined; // circular — leave as $ref\n const target = lookup(pointer);\n if (!target) return undefined;\n resolving.add(pointer);\n const cloned = deepClone(target);\n walk(cloned);\n resolving.delete(pointer);\n return cloned;\n };\n\n const deepClone = (obj: unknown): unknown => {\n if (!obj || typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) return obj.map(deepClone);\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n result[k] = deepClone(v);\n }\n return result;\n };\n\n const walk = (obj: unknown): void => {\n if (!obj || typeof obj !== \"object\") return;\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n const item = obj[i];\n if (isRef(item)) {\n const resolved = resolveRef(item.$ref);\n if (resolved) obj[i] = resolved;\n else obj[i] = { description: `Unresolved: ${item.$ref}` };\n } else {\n walk(item);\n }\n }\n return;\n }\n\n const record = obj as Record<string, unknown>;\n for (const [k, v] of Object.entries(record)) {\n if (k === \"$ref\") continue;\n if (isRef(v)) {\n const resolved = resolveRef(v.$ref);\n if (resolved) record[k] = resolved;\n else record[k] = { description: `Unresolved: ${v.$ref}` };\n } else {\n walk(v);\n }\n }\n };\n\n walk(doc);\n};\n\nconst isRef = (v: unknown): v is { $ref: string } =>\n typeof v === \"object\" &&\n v !== null &&\n \"$ref\" in v &&\n typeof (v as Record<string, unknown>).$ref === \"string\";\n","// ---------------------------------------------------------------------------\n// OpenAPI type aliases and $ref resolution\n//\n// Wraps the openapi-types V3/V3_1 union mess and provides clean ref resolution.\n// ---------------------------------------------------------------------------\n\nimport { Option } from \"effect\";\nimport type { OpenAPIV3, OpenAPIV3_1 } from \"openapi-types\";\nimport type { ParsedDocument } from \"./parse\";\n\n// ---------------------------------------------------------------------------\n// Type aliases — collapse V3 / V3_1 unions into single names\n// ---------------------------------------------------------------------------\n\nexport type ParameterObject = OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\nexport type OperationObject = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject;\nexport type PathItemObject = OpenAPIV3.PathItemObject | OpenAPIV3_1.PathItemObject;\nexport type RequestBodyObject = OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject;\nexport type ResponseObject = OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject;\nexport type MediaTypeObject = OpenAPIV3.MediaTypeObject | OpenAPIV3_1.MediaTypeObject;\n\n// ---------------------------------------------------------------------------\n// DocResolver — wraps a parsed document for clean $ref resolution\n// ---------------------------------------------------------------------------\n\nexport class DocResolver {\n constructor(readonly doc: ParsedDocument) {}\n\n /** Resolve a value that might be a $ref, returning the resolved object */\n resolve<T>(value: T | OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject): T | null {\n if (isRef(value)) {\n const resolved = this.resolvePointer(value.$ref);\n return resolved as T | null;\n }\n return value as T;\n }\n\n private resolvePointer(ref: string): unknown {\n if (!ref.startsWith(\"#/\")) return null;\n const segments = ref.slice(2).split(\"/\");\n let current: unknown = this.doc;\n for (const segment of segments) {\n if (typeof current !== \"object\" || current === null) return null;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n }\n}\n\nconst isRef = (value: unknown): value is { $ref: string } =>\n typeof value === \"object\" && value !== null && \"$ref\" in value;\n\n// ---------------------------------------------------------------------------\n// Server URL resolution\n// ---------------------------------------------------------------------------\n\nexport const resolveBaseUrl = (\n servers: readonly {\n url: string;\n variables: import(\"effect/Option\").Option<Record<string, string>>;\n }[],\n): string => {\n const server = servers[0];\n if (!server) return \"\";\n\n let url = server.url;\n if (Option.isSome(server.variables)) {\n for (const [name, value] of Object.entries(server.variables.value)) {\n url = url.replaceAll(`{${name}}`, value);\n }\n }\n return url;\n};\n\n// ---------------------------------------------------------------------------\n// Content negotiation\n// ---------------------------------------------------------------------------\n\n/** Pick the preferred media type entry (prefer application/json) */\nexport const preferredContent = (\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\";\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.Literal(\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.Literal(\"path\", \"query\", \"header\", \"cookie\");\nexport type ParameterLocation = typeof ParameterLocation.Type;\n\n// ---------------------------------------------------------------------------\n// Extracted operation\n// ---------------------------------------------------------------------------\n\nexport class OperationParameter extends Schema.Class<OperationParameter>(\"OperationParameter\")({\n name: Schema.String,\n location: ParameterLocation,\n required: Schema.Boolean,\n schema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n style: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n explode: Schema.optionalWith(Schema.Boolean, { as: \"Option\" }),\n allowReserved: Schema.optionalWith(Schema.Boolean, { as: \"Option\" }),\n description: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n}) {}\n\nexport class OperationRequestBody extends Schema.Class<OperationRequestBody>(\n \"OperationRequestBody\",\n)({\n required: Schema.Boolean,\n contentType: Schema.String,\n schema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n}) {}\n\nexport class ExtractedOperation extends Schema.Class<ExtractedOperation>(\"ExtractedOperation\")({\n operationId: OperationId,\n method: HttpMethod,\n pathTemplate: Schema.String,\n summary: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n description: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n tags: Schema.Array(Schema.String),\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.optionalWith(OperationRequestBody, { as: \"Option\" }),\n inputSchema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n outputSchema: Schema.optionalWith(Schema.Unknown, { as: \"Option\" }),\n deprecated: Schema.optionalWith(Schema.Boolean, { default: () => false }),\n}) {}\n\nexport class ServerInfo extends Schema.Class<ServerInfo>(\"ServerInfo\")({\n url: Schema.String,\n variables: Schema.optionalWith(Schema.Record({ key: Schema.String, value: Schema.String }), {\n as: \"Option\",\n }),\n}) {}\n\nexport class ExtractionResult extends Schema.Class<ExtractionResult>(\"ExtractionResult\")({\n title: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n version: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n servers: Schema.Array(ServerInfo),\n operations: Schema.Array(ExtractedOperation),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Operation binding — minimal invocation data (no schemas/metadata)\n// ---------------------------------------------------------------------------\n\nexport class OperationBinding extends Schema.Class<OperationBinding>(\"OperationBinding\")({\n method: HttpMethod,\n pathTemplate: Schema.String,\n parameters: Schema.Array(OperationParameter),\n requestBody: Schema.optionalWith(OperationRequestBody, { as: \"Option\" }),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Invocation\n// ---------------------------------------------------------------------------\n\n/**\n * A header value — either a static string or a reference to a secret.\n * Stored as JSON-serializable data.\n */\nexport const HeaderValue = Schema.Union(\n Schema.String,\n Schema.Struct({\n secretId: Schema.String,\n prefix: Schema.optional(Schema.String),\n }),\n);\nexport type HeaderValue = typeof HeaderValue.Type;\n\nexport class InvocationConfig extends Schema.Class<InvocationConfig>(\"InvocationConfig\")({\n baseUrl: Schema.String,\n /** Headers applied to every request. Values can reference secrets. */\n headers: Schema.optionalWith(Schema.Record({ key: Schema.String, value: HeaderValue }), {\n default: () => ({}),\n }),\n}) {}\n\nexport class InvocationResult extends Schema.Class<InvocationResult>(\"InvocationResult\")({\n status: Schema.Number,\n headers: Schema.Record({ key: Schema.String, value: Schema.String }),\n data: Schema.NullOr(Schema.Unknown),\n error: Schema.NullOr(Schema.Unknown),\n}) {}\n","import { Effect, Option } from \"effect\";\n\nimport { OpenApiExtractionError } from \"./errors\";\nimport type { ParsedDocument } from \"./parse\";\nimport {\n DocResolver,\n preferredContent,\n type OperationObject,\n type ParameterObject,\n type PathItemObject,\n type RequestBodyObject,\n type ResponseObject,\n} from \"./openapi-utils\";\nimport {\n ExtractedOperation,\n ExtractionResult,\n type HttpMethod,\n OperationId,\n OperationParameter,\n OperationRequestBody,\n type ParameterLocation,\n ServerInfo,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst HTTP_METHODS: readonly HttpMethod[] = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"patch\",\n \"head\",\n \"options\",\n \"trace\",\n];\n\nconst VALID_PARAM_LOCATIONS = new Set<string>([\"path\", \"query\", \"header\", \"cookie\"]);\n\n// ---------------------------------------------------------------------------\n// Parameter extraction\n// ---------------------------------------------------------------------------\n\nconst extractParameters = (\n pathItem: PathItemObject,\n operation: OperationObject,\n r: DocResolver,\n): OperationParameter[] => {\n const merged = new Map<string, ParameterObject>();\n\n for (const raw of pathItem.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n for (const raw of operation.parameters ?? []) {\n const p = r.resolve<ParameterObject>(raw);\n if (!p) continue;\n merged.set(`${p.in}:${p.name}`, p);\n }\n\n return [...merged.values()]\n .filter((p) => VALID_PARAM_LOCATIONS.has(p.in))\n .map(\n (p) =>\n new OperationParameter({\n name: p.name,\n location: p.in as ParameterLocation,\n required: p.in === \"path\" ? true : p.required === true,\n schema: Option.fromNullable(p.schema),\n style: Option.fromNullable(p.style),\n explode: Option.fromNullable(p.explode),\n allowReserved: Option.fromNullable(\"allowReserved\" in p ? p.allowReserved : undefined),\n description: Option.fromNullable(p.description),\n }),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Request body extraction\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 content = preferredContent(body.content);\n if (!content) return undefined;\n\n return new OperationRequestBody({\n required: body.required === true,\n contentType: content.mediaType,\n schema: Option.fromNullable(content.media.schema),\n });\n};\n\n// ---------------------------------------------------------------------------\n// Response schema extraction\n// ---------------------------------------------------------------------------\n\nconst extractOutputSchema = (operation: OperationObject, r: DocResolver): unknown | undefined => {\n if (!operation.responses) return undefined;\n\n const entries = Object.entries(operation.responses);\n const preferred = [\n ...entries.filter(([s]) => /^2\\d\\d$/.test(s)).sort(([a], [b]) => a.localeCompare(b)),\n ...entries.filter(([s]) => s === \"default\"),\n ];\n\n for (const [, ref] of preferred) {\n const resp = r.resolve<ResponseObject>(ref);\n if (!resp) continue;\n const content = preferredContent(resp.content);\n if (content?.media.schema) return content.media.schema;\n }\n\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Input schema builder\n// ---------------------------------------------------------------------------\n\nconst buildInputSchema = (\n parameters: readonly OperationParameter[],\n requestBody: OperationRequestBody | undefined,\n): Record<string, unknown> | undefined => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const param of parameters) {\n properties[param.name] = Option.getOrElse(param.schema, () => ({ type: \"string\" }));\n if (param.required) required.push(param.name);\n }\n\n if (requestBody) {\n properties.body = Option.getOrElse(requestBody.schema, () => ({ type: \"object\" }));\n if (requestBody.required) required.push(\"body\");\n }\n\n if (Object.keys(properties).length === 0) return undefined;\n\n return {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n };\n};\n\n// ---------------------------------------------------------------------------\n// Operation ID derivation\n// ---------------------------------------------------------------------------\n\nconst deriveOperationId = (\n method: HttpMethod,\n pathTemplate: string,\n operation: OperationObject,\n): string =>\n operation.operationId ??\n (`${method}_${pathTemplate.replace(/[^a-zA-Z0-9]+/g, \"_\")}`.replace(/^_+|_+$/g, \"\") ||\n `${method}_operation`);\n\n// ---------------------------------------------------------------------------\n// Server extraction\n// ---------------------------------------------------------------------------\n\nconst extractServers = (doc: ParsedDocument): ServerInfo[] =>\n (doc.servers ?? []).flatMap((server) => {\n if (!server.url) return [];\n const vars = server.variables\n ? Object.fromEntries(\n Object.entries(server.variables).flatMap(([name, v]) =>\n v.default ? [[name, v.default]] : [],\n ),\n )\n : undefined;\n return [\n new ServerInfo({\n url: server.url,\n variables: vars && Object.keys(vars).length > 0 ? Option.some(vars) : Option.none(),\n }),\n ];\n });\n\n// ---------------------------------------------------------------------------\n// Main extraction\n// ---------------------------------------------------------------------------\n\n/** Extract all operations from a bundled OpenAPI 3.x document */\nexport const extract = Effect.fn(\"OpenApi.extract\")(function* (doc: ParsedDocument) {\n const paths = doc.paths;\n if (!paths) {\n return yield* new OpenApiExtractionError({\n message: \"OpenAPI document has no paths defined\",\n });\n }\n\n const r = new DocResolver(doc);\n const operations: ExtractedOperation[] = [];\n\n for (const [pathTemplate, pathItem] of Object.entries(paths).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n if (!pathItem) continue;\n\n for (const method of HTTP_METHODS) {\n const operation = pathItem[method];\n if (!operation) continue;\n\n const parameters = extractParameters(pathItem, operation, r);\n const requestBody = extractRequestBody(operation, r);\n const inputSchema = buildInputSchema(parameters, requestBody);\n const outputSchema = extractOutputSchema(operation, r);\n const tags = (operation.tags ?? []).filter((t) => t.trim().length > 0);\n\n operations.push(\n new ExtractedOperation({\n operationId: OperationId.make(deriveOperationId(method, pathTemplate, operation)),\n method,\n pathTemplate,\n summary: Option.fromNullable(operation.summary),\n description: Option.fromNullable(operation.description),\n tags,\n parameters,\n requestBody: Option.fromNullable(requestBody),\n inputSchema: Option.fromNullable(inputSchema),\n outputSchema: Option.fromNullable(outputSchema),\n deprecated: operation.deprecated === true,\n }),\n );\n }\n }\n\n return new ExtractionResult({\n title: Option.fromNullable(doc.info?.title),\n version: Option.fromNullable(doc.info?.version),\n servers: extractServers(doc),\n operations,\n });\n});\n","import { Effect, Layer, Option } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"@effect/platform\";\n\nimport {\n type ToolId,\n type ToolInvoker,\n ToolInvocationResult,\n ToolInvocationError,\n type ScopeId,\n type SecretId,\n} from \"@executor/sdk\";\n\nimport { OpenApiInvocationError } from \"./errors\";\nimport type { OpenApiOperationStore } from \"./operation-store\";\nimport {\n type HeaderValue,\n type OperationBinding,\n InvocationConfig,\n InvocationResult,\n type OperationParameter,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Parameter reading\n// ---------------------------------------------------------------------------\n\nconst CONTAINER_KEYS: Record<string, readonly string[]> = {\n path: [\"path\", \"pathParams\", \"params\"],\n query: [\"query\", \"queryParams\", \"params\"],\n header: [\"headers\", \"header\"],\n cookie: [\"cookies\", \"cookie\"],\n};\n\nconst readParamValue = (args: Record<string, unknown>, param: OperationParameter): unknown => {\n const direct = args[param.name];\n if (direct !== undefined) return direct;\n\n for (const key of CONTAINER_KEYS[param.location] ?? []) {\n const container = args[key];\n if (typeof container === \"object\" && container !== null && !Array.isArray(container)) {\n const nested = (container as Record<string, unknown>)[param.name];\n if (nested !== undefined) return nested;\n }\n }\n\n return undefined;\n};\n\n// ---------------------------------------------------------------------------\n// Path resolution\n// ---------------------------------------------------------------------------\n\nconst resolvePath = Effect.fn(\"OpenApi.resolvePath\")(function* (\n pathTemplate: string,\n args: Record<string, unknown>,\n parameters: readonly OperationParameter[],\n) {\n let resolved = pathTemplate;\n\n // Resolve declared path parameters\n for (const param of parameters) {\n if (param.location !== \"path\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) {\n if (param.required) {\n return yield* new OpenApiInvocationError({\n message: `Missing required path parameter: ${param.name}`,\n statusCode: Option.none(),\n });\n }\n continue;\n }\n resolved = resolved.replaceAll(`{${param.name}}`, encodeURIComponent(String(value)));\n }\n\n // Resolve remaining placeholders from raw args (handles specs that\n // don't explicitly list path parameters)\n const remaining = [...resolved.matchAll(/\\{([^{}]+)\\}/g)]\n .map((m) => m[1])\n .filter((v): v is string => typeof v === \"string\");\n\n for (const name of remaining) {\n const value = args[name];\n if (value !== undefined && value !== null) {\n resolved = resolved.replaceAll(`{${name}}`, encodeURIComponent(String(value)));\n }\n }\n\n const unresolved = [...resolved.matchAll(/\\{([^{}]+)\\}/g)]\n .map((m) => m[1])\n .filter((v): v is string => typeof v === \"string\");\n\n if (unresolved.length > 0) {\n return yield* new OpenApiInvocationError({\n message: `Unresolved path parameters: ${[...new Set(unresolved)].join(\", \")}`,\n statusCode: Option.none(),\n });\n }\n\n return resolved;\n});\n\n// ---------------------------------------------------------------------------\n// Header resolution — resolves secret refs at invocation time\n// ---------------------------------------------------------------------------\n\nconst resolveHeaders = (\n headers: Record<string, HeaderValue>,\n secrets: {\n readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown>;\n },\n scopeId: ScopeId,\n): Effect.Effect<Record<string, string>, ToolInvocationError> =>\n Effect.gen(function* () {\n const resolved: Record<string, string> = {};\n for (const [name, value] of Object.entries(headers)) {\n if (typeof value === \"string\") {\n resolved[name] = value;\n } else {\n const secret = yield* secrets.resolve(value.secretId as SecretId, scopeId).pipe(\n Effect.mapError(\n () =>\n new ToolInvocationError({\n toolId: \"\" as ToolId,\n message: `Failed to resolve secret \"${value.secretId}\" for header \"${name}\"`,\n cause: undefined,\n }),\n ),\n );\n resolved[name] = value.prefix ? `${value.prefix}${secret}` : secret;\n }\n }\n return resolved;\n });\n\nconst applyHeaders = (\n request: HttpClientRequest.HttpClientRequest,\n headers: Record<string, string>,\n): HttpClientRequest.HttpClientRequest => {\n let req = request;\n for (const [name, value] of Object.entries(headers)) {\n req = HttpClientRequest.setHeader(req, name, value);\n }\n return req;\n};\n\n// ---------------------------------------------------------------------------\n// Response helpers\n// ---------------------------------------------------------------------------\n\nconst isJsonContentType = (ct: string | null | undefined): boolean => {\n if (!ct) return false;\n const normalized = ct.split(\";\")[0]?.trim().toLowerCase() ?? \"\";\n return (\n normalized === \"application/json\" || normalized.includes(\"+json\") || normalized.includes(\"json\")\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Invoke an OpenAPI operation binding. Requires HttpClient in the context. */\nexport const invoke = Effect.fn(\"OpenApi.invoke\")(function* (\n operation: OperationBinding,\n args: Record<string, unknown>,\n config: InvocationConfig,\n /** Pre-resolved headers (secrets already resolved) */\n resolvedHeaders?: Record<string, string>,\n) {\n const client = yield* HttpClient.HttpClient;\n\n const resolvedPath = yield* resolvePath(operation.pathTemplate, args, operation.parameters);\n\n const path = resolvedPath.startsWith(\"/\") ? resolvedPath : `/${resolvedPath}`;\n\n // Build the base request — use just the path; baseUrl is applied to the client\n let request = HttpClientRequest.make(operation.method.toUpperCase() as \"GET\")(path);\n\n // Query parameters\n for (const param of operation.parameters) {\n if (param.location !== \"query\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) continue;\n request = HttpClientRequest.setUrlParam(request, param.name, String(value));\n }\n\n // Header parameters\n for (const param of operation.parameters) {\n if (param.location !== \"header\") continue;\n const value = readParamValue(args, param);\n if (value === undefined || value === null) continue;\n request = HttpClientRequest.setHeader(request, param.name, String(value));\n }\n\n // Request body\n if (Option.isSome(operation.requestBody)) {\n const rb = operation.requestBody.value;\n const bodyValue = args.body ?? args.input;\n if (bodyValue !== undefined) {\n if (isJsonContentType(rb.contentType)) {\n request = HttpClientRequest.bodyUnsafeJson(request, bodyValue);\n } else {\n request = HttpClientRequest.bodyText(request, String(bodyValue), rb.contentType);\n }\n }\n }\n\n // Static headers (auth, custom headers, etc.) — use pre-resolved if available\n request = applyHeaders(request, resolvedHeaders ?? {});\n\n // Execute\n const response = yield* client.execute(request).pipe(\n Effect.mapError(\n (err) =>\n new OpenApiInvocationError({\n message: `HTTP request failed: ${err.message}`,\n statusCode: Option.none(),\n cause: err,\n }),\n ),\n );\n\n const status = response.status;\n const responseHeaders: Record<string, string> = { ...response.headers };\n\n // Decode body\n const contentType = response.headers[\"content-type\"] ?? null;\n const responseBody: unknown =\n status === 204\n ? null\n : isJsonContentType(contentType)\n ? yield* response.json.pipe(Effect.catchAll(() => response.text))\n : yield* response.text;\n\n const ok = status >= 200 && status < 300;\n\n return new InvocationResult({\n status,\n headers: responseHeaders,\n data: ok ? responseBody : null,\n error: ok ? null : responseBody,\n });\n});\n\n// ---------------------------------------------------------------------------\n// ToolInvoker — bridges operation store + HTTP client into SDK invoker\n// ---------------------------------------------------------------------------\n\nconst SAFE_METHODS = new Set([\"get\", \"head\", \"options\"]);\n\n/**\n * Derive tool annotations from the HTTP method and path.\n */\nexport const annotationsForOperation = (\n method: string,\n pathTemplate: string,\n): {\n requiresApproval?: boolean;\n approvalDescription?: string;\n} => {\n if (SAFE_METHODS.has(method.toLowerCase())) return {};\n return {\n requiresApproval: true,\n approvalDescription: `${method.toUpperCase()} ${pathTemplate}`,\n };\n};\n\nexport const makeOpenApiInvoker = (opts: {\n readonly operationStore: OpenApiOperationStore;\n readonly httpClientLayer: Layer.Layer<HttpClient.HttpClient>;\n readonly secrets: {\n readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown>;\n };\n readonly scopeId: ScopeId;\n}): ToolInvoker => ({\n resolveAnnotations: (toolId: ToolId) =>\n Effect.gen(function* () {\n const entry = yield* opts.operationStore.get(toolId);\n if (!entry) return undefined;\n return annotationsForOperation(entry.binding.method, entry.binding.pathTemplate);\n }),\n\n invoke: (toolId: ToolId, args: unknown) =>\n Effect.gen(function* () {\n const entry = yield* opts.operationStore.get(toolId);\n if (!entry) {\n return yield* new ToolInvocationError({\n toolId,\n message: `No operation found for tool \"${toolId}\"`,\n cause: undefined,\n });\n }\n\n const { binding, config } = entry;\n const baseUrl = config.baseUrl;\n\n // Resolve secret-backed headers\n const resolvedHeaders = yield* resolveHeaders(config.headers, opts.secrets, opts.scopeId);\n\n const clientWithBaseUrl = baseUrl\n ? Layer.effect(\n HttpClient.HttpClient,\n Effect.map(\n HttpClient.HttpClient,\n HttpClient.mapRequest(HttpClientRequest.prependUrl(baseUrl)),\n ),\n ).pipe(Layer.provide(opts.httpClientLayer))\n : opts.httpClientLayer;\n\n const result = yield* invoke(\n binding,\n (args ?? {}) as Record<string, unknown>,\n config,\n resolvedHeaders,\n ).pipe(Effect.provide(clientWithBaseUrl));\n\n return new ToolInvocationResult({\n data: result.data,\n error: result.error,\n status: result.status,\n });\n }).pipe(\n Effect.catchAll((err) => {\n if (\n typeof err === \"object\" &&\n err !== null &&\n \"_tag\" in err &&\n (err as { _tag: string })._tag === \"ToolInvocationError\"\n ) {\n return Effect.fail(err as ToolInvocationError);\n }\n return Effect.fail(\n new ToolInvocationError({\n toolId,\n message: `OpenAPI invocation failed: ${err instanceof Error ? err.message : String(err)}`,\n cause: err,\n }),\n );\n }),\n ),\n});\n","// ---------------------------------------------------------------------------\n// KV-backed OpenApiOperationStore\n//\n// Uses two KV namespaces — one for bindings, one for sources (meta + config).\n// ---------------------------------------------------------------------------\n\nimport { Effect, Schema } from \"effect\";\nimport { scopeKv, makeInMemoryScopedKv, type Kv, type ToolId, type ScopedKv } from \"@executor/sdk\";\n\nimport type { OpenApiOperationStore, StoredOperation, StoredSource } from \"./operation-store\";\nimport { OperationBinding, InvocationConfig } from \"./types\";\nimport { StoredSourceSchema } from \"./stored-source\";\n\n// ---------------------------------------------------------------------------\n// Stored schemas\n// ---------------------------------------------------------------------------\n\nclass StoredEntry extends Schema.Class<StoredEntry>(\"StoredEntry\")({\n namespace: Schema.String,\n binding: OperationBinding,\n config: InvocationConfig,\n}) {}\n\nconst encodeEntry = Schema.encodeSync(Schema.parseJson(StoredEntry));\nconst decodeEntry = Schema.decodeUnknownSync(Schema.parseJson(StoredEntry));\n\nconst encodeSource = Schema.encodeSync(Schema.parseJson(StoredSourceSchema));\nconst decodeSource = Schema.decodeUnknownSync(Schema.parseJson(StoredSourceSchema));\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nconst makeStore = (bindings: ScopedKv, sources: ScopedKv): OpenApiOperationStore => {\n const withKvTransaction = <A, E>(\n kv: ScopedKv,\n effect: Effect.Effect<A, E, never>,\n ): Effect.Effect<A, E, never> => kv.withTransaction?.(effect) ?? effect;\n\n return {\n get: (toolId) =>\n Effect.gen(function* () {\n const raw = yield* bindings.get(toolId);\n if (!raw) return null;\n const entry = decodeEntry(raw);\n return { binding: entry.binding, config: entry.config };\n }),\n\n put: (entries: readonly StoredOperation[]) =>\n withKvTransaction(\n bindings,\n bindings.set(\n entries.map(({ toolId, namespace, binding, config }) => ({\n key: toolId,\n value: encodeEntry(new StoredEntry({ namespace, binding, config })),\n })),\n ),\n ),\n\n remove: (toolId) => bindings.delete([toolId]).pipe(Effect.asVoid),\n\n listByNamespace: (namespace) =>\n Effect.gen(function* () {\n const entries = yield* bindings.list();\n const ids: ToolId[] = [];\n for (const e of entries) {\n const entry = decodeEntry(e.value);\n if (entry.namespace === namespace) ids.push(e.key as ToolId);\n }\n return ids;\n }),\n\n removeByNamespace: (namespace) =>\n Effect.gen(function* () {\n const entries = yield* bindings.list();\n const ids: ToolId[] = [];\n for (const e of entries) {\n const entry = decodeEntry(e.value);\n if (entry.namespace === namespace) ids.push(e.key as ToolId);\n }\n if (ids.length > 0) yield* bindings.delete(ids);\n return ids;\n }),\n\n putSource: (source) => sources.set([{ key: source.namespace, value: encodeSource(source) }]),\n\n removeSource: (namespace) => sources.delete([namespace]).pipe(Effect.asVoid),\n\n listSources: () =>\n Effect.gen(function* () {\n const entries = yield* sources.list();\n return entries.map((e) => decodeSource(e.value) as StoredSource);\n }),\n\n getSource: (namespace) =>\n Effect.gen(function* () {\n const raw = yield* sources.get(namespace);\n if (!raw) return null;\n return decodeSource(raw) as StoredSource;\n }),\n\n getSourceConfig: (namespace) =>\n Effect.gen(function* () {\n const raw = yield* sources.get(namespace);\n if (!raw) return null;\n const source = decodeSource(raw) as StoredSource;\n return source.config;\n }),\n };\n};\n\n// ---------------------------------------------------------------------------\n// Factory from global Kv\n// ---------------------------------------------------------------------------\n\nexport const makeKvOperationStore = (kv: Kv, namespace: string): OpenApiOperationStore =>\n makeStore(scopeKv(kv, `${namespace}.bindings`), scopeKv(kv, `${namespace}.sources`));\n\nexport const makeInMemoryOperationStore = (): OpenApiOperationStore =>\n makeStore(makeInMemoryScopedKv(), makeInMemoryScopedKv());\n","import { Schema } from \"effect\";\n\nimport { HeaderValue } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Stored source — the shape persisted by the operation store and exposed\n// via the getSource HTTP endpoint.\n// ---------------------------------------------------------------------------\n\nexport class StoredSourceSchema extends Schema.Class<StoredSourceSchema>(\"OpenApiStoredSource\")({\n namespace: Schema.String,\n name: Schema.String,\n config: Schema.Struct({\n spec: Schema.String,\n baseUrl: Schema.optional(Schema.String),\n namespace: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record({ key: Schema.String, value: HeaderValue })),\n }),\n}) {}\n\nexport type StoredSourceSchemaType = typeof StoredSourceSchema.Type;\n","import { Effect, Option } from \"effect\";\nimport { Schema } from \"effect\";\n\nimport { parse } from \"./parse\";\nimport { extract } from \"./extract\";\nimport type { ExtractionResult } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Security scheme — what the spec declares it needs\n// ---------------------------------------------------------------------------\n\nexport class SecurityScheme extends Schema.Class<SecurityScheme>(\"SecurityScheme\")({\n /** Key name in components.securitySchemes (e.g. \"api_token\") */\n name: Schema.String,\n /** OpenAPI security scheme type */\n type: Schema.Literal(\"http\", \"apiKey\", \"oauth2\", \"openIdConnect\"),\n /** For type: \"http\" — e.g. \"bearer\", \"basic\" */\n scheme: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n /** For type: \"apiKey\" — where the key goes */\n in: Schema.optionalWith(Schema.Literal(\"header\", \"query\", \"cookie\"), { as: \"Option\" }),\n /** For type: \"apiKey\" — the header/query/cookie name */\n headerName: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n description: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Auth strategy — a valid combination of security schemes\n// ---------------------------------------------------------------------------\n\nexport class AuthStrategy extends Schema.Class<AuthStrategy>(\"AuthStrategy\")({\n /** The security schemes required together for this strategy */\n schemes: Schema.Array(Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Header preset — derived from an auth strategy\n// ---------------------------------------------------------------------------\n\nexport class HeaderPreset extends Schema.Class<HeaderPreset>(\"HeaderPreset\")({\n /** Human-readable label for the UI (e.g. \"Bearer Token\", \"API Key + Email\") */\n label: Schema.String,\n /** Headers this strategy needs. Value is null when the user must provide it. */\n headers: Schema.Record({ key: Schema.String, value: Schema.NullOr(Schema.String) }),\n /** Which headers should be stored as secrets */\n secretHeaders: Schema.Array(Schema.String),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Spec preview — everything the frontend needs\n// ---------------------------------------------------------------------------\n\nexport class SpecPreview extends Schema.Class<SpecPreview>(\"SpecPreview\")({\n title: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n version: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n /** Reuses ServerInfo from extraction */\n servers: Schema.Array(Schema.Unknown),\n operationCount: Schema.Number,\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}) {}\n\n// ---------------------------------------------------------------------------\n// Security scheme extraction\n// ---------------------------------------------------------------------------\n\nconst extractSecuritySchemes = (rawSchemes: Record<string, unknown>): SecurityScheme[] =>\n Object.entries(rawSchemes).flatMap(([name, schemeOrRef]) => {\n if (!schemeOrRef || typeof schemeOrRef !== \"object\") return [];\n const scheme = schemeOrRef as Record<string, unknown>;\n if (\"$ref\" in scheme) return [];\n\n const type = scheme.type as string;\n if (![\"http\", \"apiKey\", \"oauth2\", \"openIdConnect\"].includes(type)) return [];\n\n return [\n new SecurityScheme({\n name,\n type: type as \"http\" | \"apiKey\" | \"oauth2\" | \"openIdConnect\",\n scheme: Option.fromNullable(scheme.scheme as string | undefined),\n in: Option.fromNullable(scheme.in as \"header\" | \"query\" | \"cookie\" | undefined),\n headerName: Option.fromNullable(scheme.name as string | undefined),\n description: Option.fromNullable(scheme.description as string | undefined),\n }),\n ];\n });\n\n// ---------------------------------------------------------------------------\n// Header preset builder\n// ---------------------------------------------------------------------------\n\nconst buildHeaderPresets = (\n schemes: readonly SecurityScheme[],\n strategies: readonly AuthStrategy[],\n): HeaderPreset[] => {\n const schemeMap = new Map(schemes.map((s) => [s.name, s]));\n\n return strategies.flatMap((strategy) => {\n const resolved = strategy.schemes\n .map((name) => schemeMap.get(name))\n .filter((s): s is SecurityScheme => s !== undefined);\n\n if (resolved.length === 0) return [];\n\n const headers: Record<string, string | null> = {};\n const secretHeaders: string[] = [];\n const labelParts: string[] = [];\n\n for (const scheme of resolved) {\n if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"bearer\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Bearer Token\");\n } else if (scheme.type === \"http\" && Option.getOrElse(scheme.scheme, () => \"\") === \"basic\") {\n headers[\"Authorization\"] = null;\n secretHeaders.push(\"Authorization\");\n labelParts.push(\"Basic Auth\");\n } else if (scheme.type === \"apiKey\" && Option.getOrElse(scheme.in, () => \"\") === \"header\") {\n const headerName = Option.getOrElse(scheme.headerName, () => scheme.name);\n headers[headerName] = null;\n secretHeaders.push(headerName);\n labelParts.push(scheme.name);\n } else if (scheme.type === \"apiKey\") {\n labelParts.push(`${scheme.name} (${Option.getOrElse(scheme.in, () => \"unknown\")})`);\n } else {\n labelParts.push(scheme.name);\n }\n }\n\n if (Object.keys(headers).length === 0 && resolved.length > 0) {\n return [new HeaderPreset({ label: labelParts.join(\" + \"), headers: {}, secretHeaders: [] })];\n }\n\n return [new HeaderPreset({ label: labelParts.join(\" + \"), headers, secretHeaders })];\n });\n};\n\n// ---------------------------------------------------------------------------\n// Collect unique tags from extraction result\n// ---------------------------------------------------------------------------\n\nconst collectTags = (result: ExtractionResult): string[] => {\n const tagSet = new Set<string>();\n for (const op of result.operations) {\n for (const tag of op.tags) tagSet.add(tag);\n }\n return [...tagSet].sort();\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Preview an OpenAPI spec — extract metadata without registering anything.\n * Reuses parse() + extract() for the heavy lifting. */\nexport const previewSpec = Effect.fn(\"OpenApi.previewSpec\")(function* (specText: string) {\n const doc = yield* parse(specText);\n const result = yield* extract(doc);\n\n const securitySchemes = extractSecuritySchemes(doc.components?.securitySchemes ?? {});\n\n const rawSecurity = (doc.security ?? []) as Array<Record<string, unknown>>;\n const authStrategies = rawSecurity.map(\n (entry) => new AuthStrategy({ schemes: Object.keys(entry) }),\n );\n\n return new SpecPreview({\n title: result.title,\n version: result.version,\n servers: result.servers as unknown as readonly unknown[],\n operationCount: result.operations.length,\n tags: collectTags(result),\n securitySchemes,\n authStrategies,\n headerPresets: buildHeaderPresets(securitySchemes, authStrategies),\n });\n});\n","import { Effect, Option, Schema } from \"effect\";\nimport { FetchHttpClient, HttpClient } from \"@effect/platform\";\nimport type { Layer } from \"effect\";\n\nimport {\n Source,\n SourceDetectionResult,\n definePlugin,\n registerRuntimeTools,\n runtimeTool,\n type ExecutorPlugin,\n type PluginContext,\n ToolId,\n type ToolRegistration,\n} from \"@executor/sdk\";\n\nimport { parse } from \"./parse\";\nimport { extract } from \"./extract\";\nimport { compileToolDefinitions, type ToolDefinition } from \"./definitions\";\nimport { makeOpenApiInvoker } from \"./invoke\";\nimport { resolveBaseUrl } from \"./openapi-utils\";\nimport type { OpenApiOperationStore, StoredSource } from \"./operation-store\";\nimport { makeInMemoryOperationStore } from \"./kv-operation-store\";\nimport { previewSpec, SpecPreview } from \"./preview\";\nimport {\n HeaderValue as HeaderValueSchema,\n InvocationConfig,\n OperationBinding,\n type HeaderValue as HeaderValueValue,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Plugin config\n// ---------------------------------------------------------------------------\n\n/** A header value — either a static string or a reference to a secret */\nexport type HeaderValue = HeaderValueValue;\n\nexport interface OpenApiSpecConfig {\n readonly spec: string;\n readonly name?: string;\n readonly baseUrl?: string;\n readonly namespace?: string;\n /** Headers applied to every request. Values can reference secrets. */\n readonly headers?: Record<string, HeaderValue>;\n}\n\n// ---------------------------------------------------------------------------\n// Plugin extension\n// ---------------------------------------------------------------------------\n\nexport interface OpenApiUpdateSourceInput {\n readonly baseUrl?: string;\n readonly headers?: Record<string, HeaderValue>;\n}\n\nexport interface OpenApiPluginExtension {\n /** Preview a spec without registering — returns metadata, auth strategies, header presets */\n readonly previewSpec: (specText: string) => Effect.Effect<SpecPreview, Error>;\n\n /** Add an OpenAPI spec and register its operations as tools */\n readonly addSpec: (\n config: OpenApiSpecConfig,\n ) => Effect.Effect<{ readonly toolCount: number }, Error>;\n\n /** Remove all tools from a previously added spec by namespace */\n readonly removeSpec: (namespace: string) => Effect.Effect<void>;\n\n /** Fetch the full stored source by namespace (or null if missing) */\n readonly getSource: (namespace: string) => Effect.Effect<StoredSource | null>;\n\n /** Update config (baseUrl, headers) for an existing OpenAPI source */\n readonly updateSource: (\n namespace: string,\n input: OpenApiUpdateSourceInput,\n ) => Effect.Effect<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst PreviewSpecInputSchema = Schema.Struct({\n spec: Schema.String,\n});\ntype PreviewSpecInput = typeof PreviewSpecInputSchema.Type;\n\nconst AddSourceInputSchema = Schema.Struct({\n spec: Schema.String,\n baseUrl: Schema.optional(Schema.String),\n namespace: Schema.optional(Schema.String),\n headers: Schema.optional(Schema.Record({ key: Schema.String, value: HeaderValueSchema })),\n});\ntype AddSourceInput = typeof AddSourceInputSchema.Type;\n\nconst AddSourceOutputSchema = Schema.Struct({\n sourceId: Schema.String,\n toolCount: Schema.Number,\n});\n\n/** Rewrite OpenAPI `#/components/schemas/X` refs to standard `#/$defs/X`. */\nconst normalizeOpenApiRefs = (node: unknown): unknown => {\n if (node == null || typeof node !== \"object\") return node;\n if (Array.isArray(node)) {\n let changed = false;\n const out = node.map((item) => {\n const n = normalizeOpenApiRefs(item);\n if (n !== item) changed = true;\n return n;\n });\n return changed ? out : node;\n }\n\n const obj = node as Record<string, unknown>;\n\n if (typeof obj.$ref === \"string\") {\n const match = obj.$ref.match(/^#\\/components\\/schemas\\/(.+)$/);\n if (match) return { ...obj, $ref: `#/$defs/${match[1]}` };\n return obj;\n }\n\n let changed = false;\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const n = normalizeOpenApiRefs(v);\n if (n !== v) changed = true;\n result[k] = n;\n }\n return changed ? result : obj;\n};\n\nconst toRegistration = (def: ToolDefinition, namespace: string): ToolRegistration => {\n const op = def.operation;\n const description = Option.getOrElse(op.description, () =>\n Option.getOrElse(op.summary, () => `${op.method.toUpperCase()} ${op.pathTemplate}`),\n );\n return {\n id: ToolId.make(`${namespace}.${def.toolPath}`),\n pluginKey: \"openapi\",\n sourceId: namespace,\n name: def.toolPath,\n description,\n inputSchema: normalizeOpenApiRefs(Option.getOrUndefined(op.inputSchema)),\n outputSchema: normalizeOpenApiRefs(Option.getOrUndefined(op.outputSchema)),\n };\n};\n\nconst toBinding = (def: ToolDefinition): OperationBinding =>\n new OperationBinding({\n method: def.operation.method,\n pathTemplate: def.operation.pathTemplate,\n parameters: [...def.operation.parameters],\n requestBody: def.operation.requestBody,\n });\n\n// ---------------------------------------------------------------------------\n// Plugin factory\n// ---------------------------------------------------------------------------\n\nexport const openApiPlugin = (options?: {\n readonly httpClientLayer?: Layer.Layer<HttpClient.HttpClient>;\n readonly operationStore?: OpenApiOperationStore;\n}): ExecutorPlugin<\"openapi\", OpenApiPluginExtension> => {\n const httpClientLayer = options?.httpClientLayer ?? FetchHttpClient.layer;\n const operationStore = options?.operationStore ?? makeInMemoryOperationStore();\n\n return definePlugin({\n key: \"openapi\",\n init: (ctx: PluginContext) =>\n Effect.gen(function* () {\n yield* ctx.tools.registerInvoker(\n \"openapi\",\n makeOpenApiInvoker({\n operationStore,\n httpClientLayer,\n secrets: ctx.secrets,\n scopeId: ctx.scope.id,\n }),\n );\n\n // Tools are already persisted in the KV tool registry — no need to\n // re-register them. We only need the source list and the invoker.\n // Register source manager so the core can list/remove/refresh our sources\n yield* ctx.sources.addManager({\n kind: \"openapi\",\n\n list: () =>\n operationStore.listSources().pipe(\n Effect.map((metas) =>\n metas.map(\n (s) =>\n new Source({\n id: s.namespace,\n name: s.name,\n kind: \"openapi\",\n runtime: false,\n canRemove: true,\n canRefresh: false,\n canEdit: true,\n }),\n ),\n ),\n ),\n\n remove: (sourceId: string) =>\n Effect.gen(function* () {\n yield* operationStore.removeByNamespace(sourceId);\n yield* operationStore.removeSource(sourceId);\n yield* ctx.tools.unregisterBySource(sourceId);\n }),\n\n detect: (url: string) =>\n Effect.gen(function* () {\n const trimmed = url.trim();\n if (!trimmed) return null;\n const parsed = yield* Effect.try(() => new URL(trimmed)).pipe(Effect.option);\n if (parsed._tag === \"None\") return null;\n\n // Try fetching the URL and parsing as OpenAPI spec\n // parse() handles both URLs directly and spec text\n const doc = yield* parse(trimmed).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!doc) return null;\n\n const result = yield* extract(doc).pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (!result) return null;\n\n const namespace = Option.getOrElse(result.title, () => \"api\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\");\n const name = Option.getOrElse(result.title, () => namespace);\n\n return new SourceDetectionResult({\n kind: \"openapi\",\n confidence: \"high\",\n endpoint: trimmed,\n name,\n namespace,\n });\n }),\n });\n\n const addSpecInternal = (config: OpenApiSpecConfig) =>\n Effect.gen(function* () {\n const doc = yield* parse(config.spec);\n const result = yield* extract(doc);\n\n const namespace =\n config.namespace ??\n Option.getOrElse(result.title, () => \"api\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\");\n\n if (doc.components?.schemas) {\n // Normalize OpenAPI $ref format to standard JSON Schema $defs\n const defs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(doc.components.schemas)) {\n defs[k] = normalizeOpenApiRefs(v);\n }\n yield* ctx.tools.registerDefinitions(defs);\n }\n\n const baseUrl = config.baseUrl ?? resolveBaseUrl(result.servers);\n const invocationConfig = new InvocationConfig({\n baseUrl,\n headers: config.headers ?? {},\n });\n\n const definitions = compileToolDefinitions(result.operations);\n\n const registrations = definitions.map((def) => toRegistration(def, namespace));\n\n yield* operationStore.put(\n definitions.map((def) => ({\n toolId: ToolId.make(`${namespace}.${def.toolPath}`),\n namespace,\n binding: toBinding(def),\n config: invocationConfig,\n })),\n );\n\n yield* ctx.tools.register(registrations);\n\n const sourceName = config.name ?? Option.getOrElse(result.title, () => namespace);\n yield* operationStore.putSource({\n namespace,\n name: sourceName,\n config: {\n spec: config.spec,\n baseUrl: config.baseUrl,\n namespace: config.namespace,\n headers: config.headers,\n },\n });\n\n return { sourceId: namespace, toolCount: registrations.length };\n });\n\n const runtimeTools = yield* registerRuntimeTools({\n registry: ctx.tools,\n sources: ctx.sources,\n pluginKey: \"openapi\",\n source: {\n id: \"built-in\",\n name: \"Built In\",\n kind: \"built-in\",\n },\n tools: [\n runtimeTool({\n id: \"openapi.previewSpec\",\n name: \"openapi.previewSpec\",\n description: \"Preview an OpenAPI document before adding it as a source\",\n inputSchema: PreviewSpecInputSchema,\n outputSchema: SpecPreview,\n handler: ({ spec }: PreviewSpecInput) => previewSpec(spec),\n }),\n runtimeTool({\n id: \"openapi.addSource\",\n name: \"openapi.addSource\",\n description: \"Add an OpenAPI source and register its operations as tools\",\n inputSchema: AddSourceInputSchema,\n outputSchema: AddSourceOutputSchema,\n handler: (input: AddSourceInput) => addSpecInternal(input),\n }),\n ],\n });\n\n return {\n extension: {\n previewSpec: (specText: string) => previewSpec(specText),\n\n addSpec: (config: OpenApiSpecConfig) =>\n addSpecInternal(config).pipe(Effect.map(({ toolCount }) => ({ toolCount }))),\n\n removeSpec: (namespace: string) =>\n Effect.gen(function* () {\n const toolIds = yield* operationStore.removeByNamespace(namespace);\n if (toolIds.length > 0) {\n yield* ctx.tools.unregister(toolIds);\n }\n yield* operationStore.removeSource(namespace);\n }),\n\n getSource: (namespace: string) => operationStore.getSource(namespace),\n\n updateSource: (namespace: string, input: OpenApiUpdateSourceInput) =>\n Effect.gen(function* () {\n const existingSource = yield* operationStore.getSourceConfig(namespace);\n if (!existingSource) return;\n\n const updatedConfig = {\n ...existingSource,\n ...(input.baseUrl !== undefined ? { baseUrl: input.baseUrl } : {}),\n ...(input.headers !== undefined\n ? { headers: input.headers as Record<string, HeaderValueValue> }\n : {}),\n };\n\n const newInvocationConfig = new InvocationConfig({\n baseUrl: updatedConfig.baseUrl ?? resolveBaseUrl([]),\n headers: (updatedConfig.headers ?? {}) as Record<string, HeaderValueValue>,\n });\n\n const toolIds = yield* operationStore.listByNamespace(namespace);\n for (const toolId of toolIds) {\n const entry = yield* operationStore.get(toolId);\n if (entry) {\n yield* operationStore.put([\n {\n toolId,\n namespace,\n binding: entry.binding,\n config: newInvocationConfig,\n },\n ]);\n }\n }\n\n const sources = yield* operationStore.listSources();\n const existingMeta = sources.find((s) => s.namespace === namespace);\n\n yield* operationStore.putSource({\n namespace,\n name: existingMeta?.name ?? namespace,\n config: updatedConfig,\n });\n }),\n },\n\n close: () => runtimeTools.close(),\n };\n }),\n });\n};\n","/**\n * Derives structured `group.leaf` tool paths from extracted OpenAPI operations.\n *\n * Ported from the v3 executor's `definitions.ts`. Turns flat operation IDs like\n * `zones_listZones` into nested paths like `zones.listZones` that the tree UI\n * can render with proper nesting.\n */\n\nimport type { ExtractedOperation } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Word / case utilities\n// ---------------------------------------------------------------------------\n\nconst splitWords = (value: string): string[] =>\n value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, \"$1 $2\")\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .split(/\\s+/)\n .filter((part) => part.length > 0);\n\nconst normalizeWord = (value: string): string => value.toLowerCase();\n\nconst toCamelCase = (value: string): string => {\n const words = splitWords(value).map(normalizeWord);\n if (words.length === 0) return \"tool\";\n const [first, ...rest] = words;\n return `${first}${rest.map((p) => `${p[0]?.toUpperCase() ?? \"\"}${p.slice(1)}`).join(\"\")}`;\n};\n\nconst toPascalCase = (value: string): string => {\n const camel = toCamelCase(value);\n return `${camel[0]?.toUpperCase() ?? \"\"}${camel.slice(1)}`;\n};\n\n// ---------------------------------------------------------------------------\n// Path utilities\n// ---------------------------------------------------------------------------\n\nconst VERSION_SEGMENT_REGEX = /^v\\d+(?:[._-]\\d+)?$/i;\nconst IGNORED_PATH_SEGMENTS = new Set([\"api\"]);\n\nconst pathSegmentsFromTemplate = (pathTemplate: string): string[] =>\n pathTemplate\n .split(\"/\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\nconst isPathParameterSegment = (segment: string): boolean =>\n segment.startsWith(\"{\") && segment.endsWith(\"}\");\n\nconst normalizeGroupSegment = (value: string | undefined): string | null => {\n const candidate = value?.trim();\n if (!candidate) return null;\n return toCamelCase(candidate);\n};\n\n// ---------------------------------------------------------------------------\n// Derivation\n// ---------------------------------------------------------------------------\n\nconst deriveVersionSegment = (pathTemplate: string): string | undefined =>\n pathSegmentsFromTemplate(pathTemplate)\n .map((s) => s.toLowerCase())\n .find((s) => VERSION_SEGMENT_REGEX.test(s));\n\nconst derivePathGroup = (pathTemplate: string): string => {\n for (const segment of pathSegmentsFromTemplate(pathTemplate)) {\n const lower = segment.toLowerCase();\n if (VERSION_SEGMENT_REGEX.test(lower)) continue;\n if (IGNORED_PATH_SEGMENTS.has(lower)) continue;\n if (isPathParameterSegment(segment)) continue;\n return normalizeGroupSegment(segment) ?? \"root\";\n }\n return \"root\";\n};\n\nconst splitOperationIdSegments = (value: string): string[] =>\n value\n .split(/[/.]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\nconst deriveLeafSeed = (operationId: string, group: string): string => {\n const segments = splitOperationIdSegments(operationId);\n if (segments.length > 1) {\n const [first, ...rest] = segments;\n if ((normalizeGroupSegment(first) ?? first) === group && rest.length > 0) {\n return rest.join(\" \");\n }\n }\n return operationId;\n};\n\nconst fallbackLeafSeed = (method: string, pathTemplate: string, group: string): string => {\n const relevantSegments = pathSegmentsFromTemplate(pathTemplate)\n .filter((s) => !VERSION_SEGMENT_REGEX.test(s.toLowerCase()))\n .filter((s) => !IGNORED_PATH_SEGMENTS.has(s.toLowerCase()))\n .filter((s) => !isPathParameterSegment(s))\n .map((s) => normalizeGroupSegment(s) ?? s)\n .filter((s) => s !== group);\n\n const segmentSuffix = relevantSegments.map((s) => toPascalCase(s)).join(\"\");\n return `${method}${segmentSuffix || \"Operation\"}`;\n};\n\nconst deriveLeaf = (\n operationId: string,\n method: string,\n pathTemplate: string,\n group: string,\n): string => {\n const preferred = toCamelCase(deriveLeafSeed(operationId, group));\n if (preferred.length > 0 && preferred !== group) return preferred;\n return toCamelCase(fallbackLeafSeed(method, pathTemplate, group));\n};\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ToolDefinition {\n /** Dot-separated path like `zones.listZones` */\n readonly toolPath: string;\n /** The group segment */\n readonly group: string;\n /** The leaf segment */\n readonly leaf: string;\n /** Index into the original operations array */\n readonly operationIndex: number;\n /** The original operation */\n readonly operation: ExtractedOperation;\n}\n\n// ---------------------------------------------------------------------------\n// Collision resolution\n// ---------------------------------------------------------------------------\n\nconst resolveCollisions = (\n definitions: {\n toolPath: string;\n group: string;\n leaf: string;\n versionSegment: string | undefined;\n method: string;\n operationHash: string;\n operationIndex: number;\n operation: ExtractedOperation;\n }[],\n): ToolDefinition[] => {\n // Mutable — we progressively refine toolPath on collision\n const staged = definitions.map((d) => ({ ...d }));\n\n const applyFactory = (items: typeof staged, factory: (d: (typeof staged)[number]) => string) => {\n const byPath = new Map<string, typeof staged>();\n for (const item of items) {\n const bucket = byPath.get(item.toolPath) ?? [];\n bucket.push(item);\n byPath.set(item.toolPath, bucket);\n }\n for (const bucket of byPath.values()) {\n if (bucket.length < 2) continue;\n for (const d of bucket) {\n d.toolPath = factory(d);\n }\n }\n };\n\n // Round 1: add version segment\n applyFactory(staged, (d) =>\n d.versionSegment ? `${d.group}.${d.versionSegment}.${d.leaf}` : d.toolPath,\n );\n\n // Round 2: add method suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment ? `${d.group}.${d.versionSegment}` : d.group;\n return `${prefix}.${d.leaf}${toPascalCase(d.method)}`;\n });\n\n // Round 3: add hash suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment ? `${d.group}.${d.versionSegment}` : d.group;\n return `${prefix}.${d.leaf}${toPascalCase(d.method)}${d.operationHash.slice(0, 8)}`;\n });\n\n return staged.map((d) => ({\n toolPath: d.toolPath,\n group: d.group,\n leaf: d.leaf,\n operationIndex: d.operationIndex,\n operation: d.operation,\n }));\n};\n\n// ---------------------------------------------------------------------------\n// Stable hash (simple, deterministic)\n// ---------------------------------------------------------------------------\n\nconst stableHash = (value: unknown): string => {\n const str = JSON.stringify(value, Object.keys(value as Record<string, unknown>).sort());\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return Math.abs(hash).toString(36).padStart(8, \"0\");\n};\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Compile extracted operations into tool definitions with structured\n * `group.leaf` paths suitable for tree rendering.\n */\nexport const compileToolDefinitions = (\n operations: readonly ExtractedOperation[],\n): ToolDefinition[] => {\n const raw = operations.map((op, index) => {\n const operationId = op.operationId as string;\n const group = normalizeGroupSegment(op.tags[0]) ?? derivePathGroup(op.pathTemplate);\n const leaf = deriveLeaf(operationId, op.method, op.pathTemplate, group);\n const versionSegment = deriveVersionSegment(op.pathTemplate);\n const operationHash = stableHash({\n method: op.method,\n path: op.pathTemplate,\n operationId,\n });\n\n return {\n toolPath: `${group}.${leaf}`,\n group,\n leaf,\n versionSegment,\n method: op.method,\n operationHash,\n operationIndex: index,\n operation: op,\n };\n });\n\n return resolveCollisions(raw).sort((a, b) => a.toolPath.localeCompare(b.toolPath));\n};\n"],"mappings":"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","names":["isRef","Schema","Effect","Option","Option","Effect","Effect","Option","Effect","Option","Effect","Schema","Schema","Schema","Schema","Effect","Effect","Option","Schema","Schema","Option","Effect","Effect","Option","Schema","Schema","changed","Option","Effect"]}