@executor-js/plugin-openapi 0.0.1-beta.3 → 0.0.1-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/dist/{chunk-3XUIDNQ2.js → chunk-C57CSNPZ.js} +9 -18
- package/dist/chunk-C57CSNPZ.js.map +1 -0
- package/dist/core.js +1 -1
- package/dist/index.js +1 -1
- package/dist/sdk/errors.d.ts +9 -11
- package/package.json +2 -2
- package/dist/chunk-3XUIDNQ2.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
# @executor
|
|
1
|
+
# @executor/plugin-openapi
|
|
2
2
|
|
|
3
3
|
Load [OpenAPI](https://www.openapis.org/) specifications into an executor. Every operation in the spec becomes an invokable tool with a JSON-Schema input, automatic request building, and optional secret-backed auth.
|
|
4
4
|
|
|
5
|
-
Pairs with [`@executor
|
|
5
|
+
Pairs with [`@executor/sdk`](https://www.npmjs.com/package/@executor/sdk) (promise-based) or [`@executor/core`](https://www.npmjs.com/package/@executor/core) (Effect-based).
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
|
-
bun add @executor
|
|
10
|
+
bun add @executor/sdk @executor/plugin-openapi
|
|
11
11
|
# or
|
|
12
|
-
npm install @executor
|
|
12
|
+
npm install @executor/sdk @executor/plugin-openapi
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## Usage
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
-
import { createExecutor } from "@executor
|
|
19
|
-
import { openApiPlugin } from "@executor
|
|
18
|
+
import { createExecutor } from "@executor/sdk";
|
|
19
|
+
import { openApiPlugin } from "@executor/plugin-openapi";
|
|
20
20
|
|
|
21
21
|
const executor = await createExecutor({
|
|
22
22
|
scope: { name: "my-app" },
|
|
@@ -64,15 +64,15 @@ await executor.openapi.addSpec({
|
|
|
64
64
|
Common public APIs are available as presets from the `/presets` subpath:
|
|
65
65
|
|
|
66
66
|
```ts
|
|
67
|
-
import { openApiPresets } from "@executor
|
|
67
|
+
import { openApiPresets } from "@executor/plugin-openapi/presets";
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
## Effect entry point
|
|
71
71
|
|
|
72
|
-
If you're using `@executor
|
|
72
|
+
If you're using `@executor/core` directly, import from the `/core` subpath:
|
|
73
73
|
|
|
74
74
|
```ts
|
|
75
|
-
import { openApiPlugin } from "@executor
|
|
75
|
+
import { openApiPlugin } from "@executor/plugin-openapi/core";
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
## Status
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
// src/sdk/errors.ts
|
|
2
|
-
import { Schema } from "effect";
|
|
2
|
+
import { Data, Schema } from "effect";
|
|
3
3
|
var OpenApiParseError = class extends Schema.TaggedError()(
|
|
4
4
|
"OpenApiParseError",
|
|
5
5
|
{
|
|
6
|
-
message: Schema.String
|
|
7
|
-
error: Schema.Defect
|
|
6
|
+
message: Schema.String
|
|
8
7
|
}
|
|
9
8
|
) {
|
|
10
9
|
};
|
|
@@ -15,13 +14,8 @@ var OpenApiExtractionError = class extends Schema.TaggedError()(
|
|
|
15
14
|
}
|
|
16
15
|
) {
|
|
17
16
|
};
|
|
18
|
-
var OpenApiInvocationError = class extends
|
|
19
|
-
"OpenApiInvocationError"
|
|
20
|
-
{
|
|
21
|
-
message: Schema.String,
|
|
22
|
-
statusCode: Schema.optionalWith(Schema.Number, { as: "Option" }),
|
|
23
|
-
error: Schema.Defect
|
|
24
|
-
}
|
|
17
|
+
var OpenApiInvocationError = class extends Data.TaggedError(
|
|
18
|
+
"OpenApiInvocationError"
|
|
25
19
|
) {
|
|
26
20
|
};
|
|
27
21
|
|
|
@@ -38,8 +32,7 @@ var parse = Effect.fn("OpenApi.parse")(function* (input) {
|
|
|
38
32
|
return SwaggerParser.bundle(parseTextToObject(input));
|
|
39
33
|
},
|
|
40
34
|
catch: (error) => new OpenApiParseError({
|
|
41
|
-
message: `Failed to parse OpenAPI document: ${error instanceof Error ? error.message : String(error)}
|
|
42
|
-
error
|
|
35
|
+
message: `Failed to parse OpenAPI document: ${error instanceof Error ? error.message : String(error)}`
|
|
43
36
|
})
|
|
44
37
|
});
|
|
45
38
|
if (!isOpenApi3(api)) {
|
|
@@ -406,8 +399,7 @@ var resolvePath = Effect3.fn("OpenApi.resolvePath")(function* (pathTemplate, arg
|
|
|
406
399
|
if (param.required) {
|
|
407
400
|
return yield* new OpenApiInvocationError({
|
|
408
401
|
message: `Missing required path parameter: ${param.name}`,
|
|
409
|
-
statusCode: Option3.none()
|
|
410
|
-
error: void 0
|
|
402
|
+
statusCode: Option3.none()
|
|
411
403
|
});
|
|
412
404
|
}
|
|
413
405
|
continue;
|
|
@@ -431,8 +423,7 @@ var resolvePath = Effect3.fn("OpenApi.resolvePath")(function* (pathTemplate, arg
|
|
|
431
423
|
if (unresolved.length > 0) {
|
|
432
424
|
return yield* new OpenApiInvocationError({
|
|
433
425
|
message: `Unresolved path parameters: ${[...new Set(unresolved)].join(", ")}`,
|
|
434
|
-
statusCode: Option3.none()
|
|
435
|
-
error: void 0
|
|
426
|
+
statusCode: Option3.none()
|
|
436
427
|
});
|
|
437
428
|
}
|
|
438
429
|
return resolved;
|
|
@@ -515,7 +506,7 @@ var invoke = Effect3.fn("OpenApi.invoke")(function* (operation, args, config, re
|
|
|
515
506
|
(err) => new OpenApiInvocationError({
|
|
516
507
|
message: `HTTP request failed: ${err.message}`,
|
|
517
508
|
statusCode: Option3.none(),
|
|
518
|
-
|
|
509
|
+
cause: err
|
|
519
510
|
})
|
|
520
511
|
)
|
|
521
512
|
);
|
|
@@ -1199,4 +1190,4 @@ export {
|
|
|
1199
1190
|
previewSpec,
|
|
1200
1191
|
openApiPlugin
|
|
1201
1192
|
};
|
|
1202
|
-
//# sourceMappingURL=chunk-
|
|
1193
|
+
//# sourceMappingURL=chunk-C57CSNPZ.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/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(\n \"OpenApiInvocationError\",\n)<{\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: () => {\n // If it looks like a URL, parse from URL; otherwise parse inline\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n return SwaggerParser.bundle(input);\n }\n // Parse from string: swagger-parser needs an object, so JSON/YAML parse first\n return SwaggerParser.bundle(parseTextToObject(input));\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 = (\n doc: OpenAPI.Document,\n): 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// 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 { url: string; variables: import(\"effect/Option\").Option<Record<string, string>> }[],\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\", \"put\", \"post\", \"delete\", \"patch\", \"head\", \"options\", \"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>(\n \"OperationParameter\",\n)({\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>(\n \"ExtractedOperation\",\n)({\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(\n Schema.Record({ key: Schema.String, value: Schema.String }),\n { as: \"Option\" },\n ),\n}) {}\n\nexport class ExtractionResult extends Schema.Class<ExtractionResult>(\n \"ExtractionResult\",\n)({\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>(\n \"OperationBinding\",\n)({\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>(\n \"InvocationConfig\",\n)({\n baseUrl: Schema.String,\n /** Headers applied to every request. Values can reference secrets. */\n headers: Schema.optionalWith(\n Schema.Record({ key: Schema.String, value: HeaderValue }),\n { default: () => ({}) },\n ),\n}) {}\n\nexport class InvocationResult extends Schema.Class<InvocationResult>(\n \"InvocationResult\",\n)({\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\", \"put\", \"post\", \"delete\", \"patch\", \"head\", \"options\", \"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(\n \"allowReserved\" in p ? p.allowReserved : undefined,\n ),\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 = (\n operation: OperationObject,\n r: DocResolver,\n): 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(\n /^_+|_+$/g,\n \"\",\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:\n vars && Object.keys(vars).length > 0\n ? Option.some(vars)\n : 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* (\n doc: ParsedDocument,\n) {\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(\n ([a], [b]) => 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(\n deriveOperationId(method, pathTemplate, operation),\n ),\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 {\n HttpClient,\n HttpClientRequest,\n} 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/core\";\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 = (\n args: Record<string, unknown>,\n param: OperationParameter,\n): 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 (\n typeof container === \"object\" &&\n container !== null &&\n !Array.isArray(container)\n ) {\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(\n `{${param.name}}`,\n encodeURIComponent(String(value)),\n );\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(\n `{${name}}`,\n encodeURIComponent(String(value)),\n );\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: { readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown> },\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 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\" ||\n normalized.includes(\"+json\") ||\n 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(\n operation.pathTemplate,\n args,\n operation.parameters,\n );\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(\n request,\n param.name,\n String(value),\n );\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(\n request,\n param.name,\n String(value),\n );\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(\n Effect.catchAll(() => response.text),\n )\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 = (method: string, pathTemplate: string): {\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: { readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown> };\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(\n config.headers,\n opts.secrets,\n opts.scopeId,\n );\n\n const clientWithBaseUrl = baseUrl\n ? Layer.effect(\n HttpClient.HttpClient,\n Effect.map(\n HttpClient.HttpClient,\n HttpClient.mapRequest(\n HttpClientRequest.prependUrl(baseUrl),\n ),\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/core\";\n\nimport type { OpenApiOperationStore, StoredOperation, StoredSource } from \"./operation-store\";\nimport { OperationBinding, InvocationConfig, HeaderValue } from \"./types\";\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 StoredSourceSchema = Schema.Struct({\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(\n Schema.Record({ key: Schema.String, value: HeaderValue }),\n ),\n }),\n});\nconst encodeSource = Schema.encodeSync(Schema.parseJson(StoredSourceSchema));\nconst decodeSource = Schema.decodeUnknownSync(Schema.parseJson(StoredSourceSchema));\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nconst makeStore = (\n bindings: ScopedKv,\n sources: ScopedKv,\n): 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 Effect.forEach(\n entries,\n ({ toolId, namespace, binding, config }) =>\n bindings.set(\n toolId,\n encodeEntry(new StoredEntry({ namespace, binding, config })),\n ),\n { discard: true },\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) {\n ids.push(e.key as ToolId);\n yield* bindings.delete(e.key);\n }\n }\n return ids;\n }),\n\n putSource: (source) =>\n sources.set(source.namespace, encodeSource(source)),\n\n removeSource: (namespace) =>\n 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};\n\n// ---------------------------------------------------------------------------\n// Factory from global Kv\n// ---------------------------------------------------------------------------\n\nexport const makeKvOperationStore = (\n kv: Kv,\n namespace: string,\n): OpenApiOperationStore =>\n makeStore(\n scopeKv(kv, `${namespace}.bindings`),\n scopeKv(kv, `${namespace}.sources`),\n );\n\nexport const makeInMemoryOperationStore = (): OpenApiOperationStore =>\n makeStore(\n makeInMemoryScopedKv(),\n makeInMemoryScopedKv(),\n );\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 = (\n rawSchemes: Record<string, unknown>,\n): 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(\n scheme.in as \"header\" | \"query\" | \"cookie\" | undefined,\n ),\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 [\n new HeaderPreset({ label: labelParts.join(\" + \"), headers: {}, secretHeaders: [] }),\n ];\n }\n\n return [\n new HeaderPreset({ label: labelParts.join(\" + \"), headers, secretHeaders }),\n ];\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* (\n specText: string,\n) {\n const doc = yield* parse(specText);\n const result = yield* extract(doc);\n\n const securitySchemes = extractSecuritySchemes(\n doc.components?.securitySchemes ?? {},\n );\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/core\";\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 } 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 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 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\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(\n Schema.Record({ key: Schema.String, value: HeaderValueSchema }),\n ),\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 = (\n def: ToolDefinition,\n namespace: string,\n): ToolRegistration => {\n const op = def.operation;\n const description = Option.getOrElse(op.description, () =>\n Option.getOrElse(\n op.summary,\n () => `${op.method.toUpperCase()} ${op.pathTemplate}`,\n ),\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 =\n 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 }),\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(\n Effect.catchAll(() => Effect.succeed(null)),\n );\n if (!doc) return null;\n\n const result = yield* extract(doc).pipe(\n Effect.catchAll(() => Effect.succeed(null)),\n );\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) =>\n toRegistration(def, namespace),\n );\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 = 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:\n \"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:\n \"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(\n Effect.map(({ toolCount }) => ({ toolCount })),\n ),\n\n removeSpec: (namespace: string) =>\n Effect.gen(function* () {\n const toolIds =\n yield* operationStore.removeByNamespace(namespace);\n if (toolIds.length > 0) {\n yield* ctx.tools.unregister(toolIds);\n }\n yield* operationStore.removeSource(namespace);\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 = (\n operationId: string,\n group: string,\n): 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 = (\n method: string,\n pathTemplate: string,\n group: string,\n): 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: { toolPath: string; group: string; leaf: string; versionSegment: string | undefined; method: string; operationHash: string; operationIndex: number; operation: ExtractedOperation }[],\n): ToolDefinition[] => {\n // Mutable — we progressively refine toolPath on collision\n const staged = definitions.map((d) => ({ ...d }));\n\n const applyFactory = (\n items: typeof staged,\n factory: (d: (typeof staged)[number]) => string,\n ) => {\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\n ? `${d.group}.${d.versionSegment}.${d.leaf}`\n : d.toolPath,\n );\n\n // Round 2: add method suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment\n ? `${d.group}.${d.versionSegment}`\n : 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\n ? `${d.group}.${d.versionSegment}`\n : 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 =\n 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) =>\n a.toolPath.localeCompare(b.toolPath),\n );\n};\n"],"mappings":"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","names":["Schema","Effect","Option","Option","Effect","Effect","Option","Effect","Option","Effect","Schema","Schema","Effect","Effect","Option","Schema","Schema","Option","Effect","Effect","Option","Schema","Schema","changed","Option","Effect"]}
|
package/dist/core.js
CHANGED
package/dist/index.js
CHANGED
package/dist/sdk/errors.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
+
import type { Option } from "effect";
|
|
2
3
|
declare const OpenApiParseError_base: Schema.TaggedErrorClass<OpenApiParseError, "OpenApiParseError", {
|
|
3
4
|
readonly _tag: Schema.tag<"OpenApiParseError">;
|
|
4
5
|
} & {
|
|
5
6
|
message: typeof Schema.String;
|
|
6
|
-
error: typeof Schema.Defect;
|
|
7
7
|
}>;
|
|
8
8
|
export declare class OpenApiParseError extends OpenApiParseError_base {
|
|
9
9
|
}
|
|
@@ -14,15 +14,13 @@ declare const OpenApiExtractionError_base: Schema.TaggedErrorClass<OpenApiExtrac
|
|
|
14
14
|
}>;
|
|
15
15
|
export declare class OpenApiExtractionError extends OpenApiExtractionError_base {
|
|
16
16
|
}
|
|
17
|
-
declare const OpenApiInvocationError_base:
|
|
18
|
-
readonly _tag:
|
|
19
|
-
} &
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}>;
|
|
26
|
-
export declare class OpenApiInvocationError extends OpenApiInvocationError_base {
|
|
17
|
+
declare const OpenApiInvocationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
18
|
+
readonly _tag: "OpenApiInvocationError";
|
|
19
|
+
} & Readonly<A>;
|
|
20
|
+
export declare class OpenApiInvocationError extends OpenApiInvocationError_base<{
|
|
21
|
+
readonly message: string;
|
|
22
|
+
readonly statusCode: Option.Option<number>;
|
|
23
|
+
readonly cause?: unknown;
|
|
24
|
+
}> {
|
|
27
25
|
}
|
|
28
26
|
export {};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@executor-js/plugin-openapi",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.1-beta.
|
|
4
|
+
"version": "0.0.1-beta.4",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@apidevtools/swagger-parser": "^12.1.0",
|
|
37
37
|
"@effect/platform": "^0.96.0",
|
|
38
38
|
"@effect/platform-node": "^0.106.0",
|
|
39
|
-
"@executor-js/sdk": "0.0.1-beta.
|
|
39
|
+
"@executor-js/sdk": "0.0.1-beta.4",
|
|
40
40
|
"effect": "^3.21.0",
|
|
41
41
|
"openapi-types": "^12.1.3",
|
|
42
42
|
"yaml": "^2.7.1"
|
|
@@ -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/preview.ts","../src/sdk/plugin.ts","../src/sdk/definitions.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nexport class OpenApiParseError extends Schema.TaggedError<OpenApiParseError>()(\n \"OpenApiParseError\",\n {\n message: Schema.String,\n error: Schema.Defect,\n },\n) {}\n\nexport class OpenApiExtractionError extends Schema.TaggedError<OpenApiExtractionError>()(\n \"OpenApiExtractionError\",\n {\n message: Schema.String,\n },\n) {}\n\nexport class OpenApiInvocationError extends Schema.TaggedError<OpenApiInvocationError>()(\n \"OpenApiInvocationError\",\n {\n message: Schema.String,\n statusCode: Schema.optionalWith(Schema.Number, { as: \"Option\" }),\n error: Schema.Defect,\n },\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: () => {\n // If it looks like a URL, parse from URL; otherwise parse inline\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n return SwaggerParser.bundle(input);\n }\n // Parse from string: swagger-parser needs an object, so JSON/YAML parse first\n return SwaggerParser.bundle(parseTextToObject(input));\n },\n catch: (error) =>\n new OpenApiParseError({\n message: `Failed to parse OpenAPI document: ${error instanceof Error ? error.message : String(error)}`,\n 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 = (\n doc: OpenAPI.Document,\n): 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// 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 { url: string; variables: import(\"effect/Option\").Option<Record<string, string>> }[],\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\", \"put\", \"post\", \"delete\", \"patch\", \"head\", \"options\", \"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>(\n \"OperationParameter\",\n)({\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>(\n \"ExtractedOperation\",\n)({\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(\n Schema.Record({ key: Schema.String, value: Schema.String }),\n { as: \"Option\" },\n ),\n}) {}\n\nexport class ExtractionResult extends Schema.Class<ExtractionResult>(\n \"ExtractionResult\",\n)({\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>(\n \"OperationBinding\",\n)({\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>(\n \"InvocationConfig\",\n)({\n baseUrl: Schema.String,\n /** Headers applied to every request. Values can reference secrets. */\n headers: Schema.optionalWith(\n Schema.Record({ key: Schema.String, value: HeaderValue }),\n { default: () => ({}) },\n ),\n}) {}\n\nexport class InvocationResult extends Schema.Class<InvocationResult>(\n \"InvocationResult\",\n)({\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\", \"put\", \"post\", \"delete\", \"patch\", \"head\", \"options\", \"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(\n \"allowReserved\" in p ? p.allowReserved : undefined,\n ),\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 = (\n operation: OperationObject,\n r: DocResolver,\n): 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(\n /^_+|_+$/g,\n \"\",\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:\n vars && Object.keys(vars).length > 0\n ? Option.some(vars)\n : 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* (\n doc: ParsedDocument,\n) {\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(\n ([a], [b]) => 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(\n deriveOperationId(method, pathTemplate, operation),\n ),\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 {\n HttpClient,\n HttpClientRequest,\n} from \"@effect/platform\";\n\nimport {\n type ToolId,\n type ToolInvoker,\n ToolInvocationResult,\n ToolInvocationError,\n type ScopeId,\n type SecretId,\n} from \"@executor-js/sdk/core\";\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 = (\n args: Record<string, unknown>,\n param: OperationParameter,\n): 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 (\n typeof container === \"object\" &&\n container !== null &&\n !Array.isArray(container)\n ) {\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 error: undefined,\n });\n }\n continue;\n }\n resolved = resolved.replaceAll(\n `{${param.name}}`,\n encodeURIComponent(String(value)),\n );\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(\n `{${name}}`,\n encodeURIComponent(String(value)),\n );\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 error: undefined,\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: { readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown> },\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 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\" ||\n normalized.includes(\"+json\") ||\n 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(\n operation.pathTemplate,\n args,\n operation.parameters,\n );\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(\n request,\n param.name,\n String(value),\n );\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(\n request,\n param.name,\n String(value),\n );\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 error: 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(\n Effect.catchAll(() => response.text),\n )\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 = (method: string, pathTemplate: string): {\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: { readonly resolve: (secretId: SecretId, scopeId: ScopeId) => Effect.Effect<string, unknown> };\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(\n config.headers,\n opts.secrets,\n opts.scopeId,\n );\n\n const clientWithBaseUrl = baseUrl\n ? Layer.effect(\n HttpClient.HttpClient,\n Effect.map(\n HttpClient.HttpClient,\n HttpClient.mapRequest(\n HttpClientRequest.prependUrl(baseUrl),\n ),\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-js/sdk/core\";\n\nimport type { OpenApiOperationStore, StoredOperation, StoredSource } from \"./operation-store\";\nimport { OperationBinding, InvocationConfig, HeaderValue } from \"./types\";\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 StoredSourceSchema = Schema.Struct({\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(\n Schema.Record({ key: Schema.String, value: HeaderValue }),\n ),\n }),\n});\nconst encodeSource = Schema.encodeSync(Schema.parseJson(StoredSourceSchema));\nconst decodeSource = Schema.decodeUnknownSync(Schema.parseJson(StoredSourceSchema));\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nconst makeStore = (\n bindings: ScopedKv,\n sources: ScopedKv,\n): 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 Effect.forEach(\n entries,\n ({ toolId, namespace, binding, config }) =>\n bindings.set(\n toolId,\n encodeEntry(new StoredEntry({ namespace, binding, config })),\n ),\n { discard: true },\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) {\n ids.push(e.key as ToolId);\n yield* bindings.delete(e.key);\n }\n }\n return ids;\n }),\n\n putSource: (source) =>\n sources.set(source.namespace, encodeSource(source)),\n\n removeSource: (namespace) =>\n 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};\n\n// ---------------------------------------------------------------------------\n// Factory from global Kv\n// ---------------------------------------------------------------------------\n\nexport const makeKvOperationStore = (\n kv: Kv,\n namespace: string,\n): OpenApiOperationStore =>\n makeStore(\n scopeKv(kv, `${namespace}.bindings`),\n scopeKv(kv, `${namespace}.sources`),\n );\n\nexport const makeInMemoryOperationStore = (): OpenApiOperationStore =>\n makeStore(\n makeInMemoryScopedKv(),\n makeInMemoryScopedKv(),\n );\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 = (\n rawSchemes: Record<string, unknown>,\n): 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(\n scheme.in as \"header\" | \"query\" | \"cookie\" | undefined,\n ),\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 [\n new HeaderPreset({ label: labelParts.join(\" + \"), headers: {}, secretHeaders: [] }),\n ];\n }\n\n return [\n new HeaderPreset({ label: labelParts.join(\" + \"), headers, secretHeaders }),\n ];\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* (\n specText: string,\n) {\n const doc = yield* parse(specText);\n const result = yield* extract(doc);\n\n const securitySchemes = extractSecuritySchemes(\n doc.components?.securitySchemes ?? {},\n );\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-js/sdk/core\";\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 } 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 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 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\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(\n Schema.Record({ key: Schema.String, value: HeaderValueSchema }),\n ),\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 = (\n def: ToolDefinition,\n namespace: string,\n): ToolRegistration => {\n const op = def.operation;\n const description = Option.getOrElse(op.description, () =>\n Option.getOrElse(\n op.summary,\n () => `${op.method.toUpperCase()} ${op.pathTemplate}`,\n ),\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 =\n 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 }),\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(\n Effect.catchAll(() => Effect.succeed(null)),\n );\n if (!doc) return null;\n\n const result = yield* extract(doc).pipe(\n Effect.catchAll(() => Effect.succeed(null)),\n );\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) =>\n toRegistration(def, namespace),\n );\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 = 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:\n \"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:\n \"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(\n Effect.map(({ toolCount }) => ({ toolCount })),\n ),\n\n removeSpec: (namespace: string) =>\n Effect.gen(function* () {\n const toolIds =\n yield* operationStore.removeByNamespace(namespace);\n if (toolIds.length > 0) {\n yield* ctx.tools.unregister(toolIds);\n }\n yield* operationStore.removeSource(namespace);\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 = (\n operationId: string,\n group: string,\n): 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 = (\n method: string,\n pathTemplate: string,\n group: string,\n): 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: { toolPath: string; group: string; leaf: string; versionSegment: string | undefined; method: string; operationHash: string; operationIndex: number; operation: ExtractedOperation }[],\n): ToolDefinition[] => {\n // Mutable — we progressively refine toolPath on collision\n const staged = definitions.map((d) => ({ ...d }));\n\n const applyFactory = (\n items: typeof staged,\n factory: (d: (typeof staged)[number]) => string,\n ) => {\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\n ? `${d.group}.${d.versionSegment}.${d.leaf}`\n : d.toolPath,\n );\n\n // Round 2: add method suffix\n applyFactory(staged, (d) => {\n const prefix = d.versionSegment\n ? `${d.group}.${d.versionSegment}`\n : 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\n ? `${d.group}.${d.versionSegment}`\n : 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 =\n 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) =>\n a.toolPath.localeCompare(b.toolPath),\n );\n};\n"],"mappings":";AAAA,SAAS,cAAc;AAEhB,IAAM,oBAAN,cAAgC,OAAO,YAA+B;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,EAChB;AACF,EAAE;AAAC;AAEI,IAAM,yBAAN,cAAqC,OAAO,YAAoC;AAAA,EACrF;AAAA,EACA;AAAA,IACE,SAAS,OAAO;AAAA,EAClB;AACF,EAAE;AAAC;AAEI,IAAM,yBAAN,cAAqC,OAAO,YAAoC;AAAA,EACrF;AAAA,EACA;AAAA,IACE,SAAS,OAAO;AAAA,IAChB,YAAY,OAAO,aAAa,OAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,IAC/D,OAAO,OAAO;AAAA,EAChB;AACF,EAAE;AAAC;;;ACxBH,OAAO,mBAAmB;AAE1B,SAAS,cAAc;AAuCvB,OAAO,UAAU;AAhCV,IAAM,QAAQ,OAAO,GAAG,eAAe,EAAE,WAAW,OAAe;AACxE,QAAM,MAAwB,OAAO,OAAO,WAAW;AAAA,IACrD,KAAK,MAAM;AAET,UAAI,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,UAAU,GAAG;AAC/D,eAAO,cAAc,OAAO,KAAK;AAAA,MACnC;AAEA,aAAO,cAAc,OAAO,kBAAkB,KAAK,CAAC;AAAA,IACtD;AAAA,IACA,OAAO,CAAC,UACN,IAAI,kBAAkB;AAAA,MACpB,SAAS,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACpG;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AAGD,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,WAAO,OAAO,IAAI,gCAAgC;AAAA,MAChD,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,SAAO;AACT,CAAC;AAUD,IAAM,kCAAN,cAA8C,uBAAuB;AAAC;AAEtE,IAAM,aAAa,CACjB,QAEA,aAAa,OAAO,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,WAAW,IAAI;AAEpF,IAAM,oBAAoB,CAAC,SAAmC;AAC5D,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,QAAQ,WAAW,EAAG,OAAM,IAAI,MAAM,2BAA2B;AAErE,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,OAAO;AAAA,EAC7B,QAAQ;AACN,aAAS,KAAK,MAAM,OAAO;AAAA,EAC7B;AAEA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,SAAO;AACT;;;AC9DA,SAAS,cAAc;AAmBhB,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAqB,KAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA;AAAA,EAGrB,QAAW,OAA8E;AACvF,QAAI,MAAM,KAAK,GAAG;AAChB,YAAM,WAAW,KAAK,eAAe,MAAM,IAAI;AAC/C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,KAAsB;AAC3C,QAAI,CAAC,IAAI,WAAW,IAAI,EAAG,QAAO;AAClC,UAAM,WAAW,IAAI,MAAM,CAAC,EAAE,MAAM,GAAG;AACvC,QAAI,UAAmB,KAAK;AAC5B,eAAW,WAAW,UAAU;AAC9B,UAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO;AAC5D,gBAAW,QAAoC,OAAO;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,QAAQ,CAAC,UACb,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU;AAMpD,IAAM,iBAAiB,CAC5B,YACW;AACX,QAAM,SAAS,QAAQ,CAAC;AACxB,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,MAAM,OAAO;AACjB,MAAI,OAAO,OAAO,OAAO,SAAS,GAAG;AACnC,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,UAAU,KAAK,GAAG;AAClE,YAAM,IAAI,WAAW,IAAI,IAAI,KAAK,KAAK;AAAA,IACzC;AAAA,EACF;AACA,SAAO;AACT;AAOO,IAAM,mBAAmB,CAC9B,YAC8D;AAC9D,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,OAAO,QAAQ,OAAO;AACtC,QAAM,OACJ,QAAQ,KAAK,CAAC,CAAC,EAAE,MAAM,OAAO,kBAAkB,KAChD,QAAQ,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,SAAS,OAAO,CAAC,KACzD,QAAQ,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,SAAS,MAAM,CAAC,KACxD,QAAQ,CAAC;AACX,SAAO,OAAO,EAAE,WAAW,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,IAAI;AACzD;;;ACvFA,SAAS,UAAAA,eAAc;AAMhB,IAAM,cAAcA,QAAO,OAAO,KAAKA,QAAO,MAAM,aAAa,CAAC;AAOlE,IAAM,aAAaA,QAAO;AAAA,EAC/B;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAW;AAC9D;AAGO,IAAM,oBAAoBA,QAAO,QAAQ,QAAQ,SAAS,UAAU,QAAQ;AAO5E,IAAM,qBAAN,cAAiCA,QAAO;AAAA,EAC7C;AACF,EAAE;AAAA,EACA,MAAMA,QAAO;AAAA,EACb,UAAU;AAAA,EACV,UAAUA,QAAO;AAAA,EACjB,QAAQA,QAAO,aAAaA,QAAO,SAAS,EAAE,IAAI,SAAS,CAAC;AAAA,EAC5D,OAAOA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,EAC1D,SAASA,QAAO,aAAaA,QAAO,SAAS,EAAE,IAAI,SAAS,CAAC;AAAA,EAC7D,eAAeA,QAAO,aAAaA,QAAO,SAAS,EAAE,IAAI,SAAS,CAAC;AAAA,EACnE,aAAaA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAClE,CAAC,EAAE;AAAC;AAEG,IAAM,uBAAN,cAAmCA,QAAO;AAAA,EAC/C;AACF,EAAE;AAAA,EACA,UAAUA,QAAO;AAAA,EACjB,aAAaA,QAAO;AAAA,EACpB,QAAQA,QAAO,aAAaA,QAAO,SAAS,EAAE,IAAI,SAAS,CAAC;AAC9D,CAAC,EAAE;AAAC;AAEG,IAAM,qBAAN,cAAiCA,QAAO;AAAA,EAC7C;AACF,EAAE;AAAA,EACA,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,cAAcA,QAAO;AAAA,EACrB,SAASA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,EAC5D,aAAaA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,EAChE,MAAMA,QAAO,MAAMA,QAAO,MAAM;AAAA,EAChC,YAAYA,QAAO,MAAM,kBAAkB;AAAA,EAC3C,aAAaA,QAAO,aAAa,sBAAsB,EAAE,IAAI,SAAS,CAAC;AAAA,EACvE,aAAaA,QAAO,aAAaA,QAAO,SAAS,EAAE,IAAI,SAAS,CAAC;AAAA,EACjE,cAAcA,QAAO,aAAaA,QAAO,SAAS,EAAE,IAAI,SAAS,CAAC;AAAA,EAClE,YAAYA,QAAO,aAAaA,QAAO,SAAS,EAAE,SAAS,MAAM,MAAM,CAAC;AAC1E,CAAC,EAAE;AAAC;AAEG,IAAM,aAAN,cAAyBA,QAAO,MAAkB,YAAY,EAAE;AAAA,EACrE,KAAKA,QAAO;AAAA,EACZ,WAAWA,QAAO;AAAA,IAChBA,QAAO,OAAO,EAAE,KAAKA,QAAO,QAAQ,OAAOA,QAAO,OAAO,CAAC;AAAA,IAC1D,EAAE,IAAI,SAAS;AAAA,EACjB;AACF,CAAC,EAAE;AAAC;AAEG,IAAM,mBAAN,cAA+BA,QAAO;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,OAAOA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,EAC1D,SAASA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,EAC5D,SAASA,QAAO,MAAM,UAAU;AAAA,EAChC,YAAYA,QAAO,MAAM,kBAAkB;AAC7C,CAAC,EAAE;AAAC;AAMG,IAAM,mBAAN,cAA+BA,QAAO;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,QAAQ;AAAA,EACR,cAAcA,QAAO;AAAA,EACrB,YAAYA,QAAO,MAAM,kBAAkB;AAAA,EAC3C,aAAaA,QAAO,aAAa,sBAAsB,EAAE,IAAI,SAAS,CAAC;AACzE,CAAC,EAAE;AAAC;AAUG,IAAM,cAAcA,QAAO;AAAA,EAChCA,QAAO;AAAA,EACPA,QAAO,OAAO;AAAA,IACZ,UAAUA,QAAO;AAAA,IACjB,QAAQA,QAAO,SAASA,QAAO,MAAM;AAAA,EACvC,CAAC;AACH;AAGO,IAAM,mBAAN,cAA+BA,QAAO;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,SAASA,QAAO;AAAA;AAAA,EAEhB,SAASA,QAAO;AAAA,IACdA,QAAO,OAAO,EAAE,KAAKA,QAAO,QAAQ,OAAO,YAAY,CAAC;AAAA,IACxD,EAAE,SAAS,OAAO,CAAC,GAAG;AAAA,EACxB;AACF,CAAC,EAAE;AAAC;AAEG,IAAM,mBAAN,cAA+BA,QAAO;AAAA,EAC3C;AACF,EAAE;AAAA,EACA,QAAQA,QAAO;AAAA,EACf,SAASA,QAAO,OAAO,EAAE,KAAKA,QAAO,QAAQ,OAAOA,QAAO,OAAO,CAAC;AAAA,EACnE,MAAMA,QAAO,OAAOA,QAAO,OAAO;AAAA,EAClC,OAAOA,QAAO,OAAOA,QAAO,OAAO;AACrC,CAAC,EAAE;AAAC;;;AC/HJ,SAAS,UAAAC,SAAQ,UAAAC,eAAc;AA4B/B,IAAM,eAAsC;AAAA,EAC1C;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAW;AAC9D;AAEA,IAAM,wBAAwB,oBAAI,IAAY,CAAC,QAAQ,SAAS,UAAU,QAAQ,CAAC;AAMnF,IAAM,oBAAoB,CACxB,UACA,WACA,MACyB;AACzB,QAAM,SAAS,oBAAI,IAA6B;AAEhD,aAAW,OAAO,SAAS,cAAc,CAAC,GAAG;AAC3C,UAAM,IAAI,EAAE,QAAyB,GAAG;AACxC,QAAI,CAAC,EAAG;AACR,WAAO,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,EACnC;AACA,aAAW,OAAO,UAAU,cAAc,CAAC,GAAG;AAC5C,UAAM,IAAI,EAAE,QAAyB,GAAG;AACxC,QAAI,CAAC,EAAG;AACR,WAAO,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,EACnC;AAEA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EACvB,OAAO,CAAC,MAAM,sBAAsB,IAAI,EAAE,EAAE,CAAC,EAC7C;AAAA,IACC,CAAC,MACC,IAAI,mBAAmB;AAAA,MACrB,MAAM,EAAE;AAAA,MACR,UAAU,EAAE;AAAA,MACZ,UAAU,EAAE,OAAO,SAAS,OAAO,EAAE,aAAa;AAAA,MAClD,QAAQC,QAAO,aAAa,EAAE,MAAM;AAAA,MACpC,OAAOA,QAAO,aAAa,EAAE,KAAK;AAAA,MAClC,SAASA,QAAO,aAAa,EAAE,OAAO;AAAA,MACtC,eAAeA,QAAO;AAAA,QACpB,mBAAmB,IAAI,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,aAAaA,QAAO,aAAa,EAAE,WAAW;AAAA,IAChD,CAAC;AAAA,EACL;AACJ;AAMA,IAAM,qBAAqB,CACzB,WACA,MACqC;AACrC,MAAI,CAAC,UAAU,YAAa,QAAO;AAEnC,QAAM,OAAO,EAAE,QAA2B,UAAU,WAAW;AAC/D,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,UAAU,iBAAiB,KAAK,OAAO;AAC7C,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO,IAAI,qBAAqB;AAAA,IAC9B,UAAU,KAAK,aAAa;AAAA,IAC5B,aAAa,QAAQ;AAAA,IACrB,QAAQA,QAAO,aAAa,QAAQ,MAAM,MAAM;AAAA,EAClD,CAAC;AACH;AAMA,IAAM,sBAAsB,CAC1B,WACA,MACwB;AACxB,MAAI,CAAC,UAAU,UAAW,QAAO;AAEjC,QAAM,UAAU,OAAO,QAAQ,UAAU,SAAS;AAClD,QAAM,YAAY;AAAA,IAChB,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,IACnF,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,SAAS;AAAA,EAC5C;AAEA,aAAW,CAAC,EAAE,GAAG,KAAK,WAAW;AAC/B,UAAM,OAAO,EAAE,QAAwB,GAAG;AAC1C,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,iBAAiB,KAAK,OAAO;AAC7C,QAAI,SAAS,MAAM,OAAQ,QAAO,QAAQ,MAAM;AAAA,EAClD;AAEA,SAAO;AACT;AAMA,IAAM,mBAAmB,CACvB,YACA,gBACwC;AACxC,QAAM,aAAsC,CAAC;AAC7C,QAAM,WAAqB,CAAC;AAE5B,aAAW,SAAS,YAAY;AAC9B,eAAW,MAAM,IAAI,IAAIA,QAAO,UAAU,MAAM,QAAQ,OAAO,EAAE,MAAM,SAAS,EAAE;AAClF,QAAI,MAAM,SAAU,UAAS,KAAK,MAAM,IAAI;AAAA,EAC9C;AAEA,MAAI,aAAa;AACf,eAAW,OAAOA,QAAO,UAAU,YAAY,QAAQ,OAAO,EAAE,MAAM,SAAS,EAAE;AACjF,QAAI,YAAY,SAAU,UAAS,KAAK,MAAM;AAAA,EAChD;AAEA,MAAI,OAAO,KAAK,UAAU,EAAE,WAAW,EAAG,QAAO;AAEjD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,GAAI,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IAC1C,sBAAsB;AAAA,EACxB;AACF;AAMA,IAAM,oBAAoB,CACxB,QACA,cACA,cAEA,UAAU,gBACT,GAAG,MAAM,IAAI,aAAa,QAAQ,kBAAkB,GAAG,CAAC,GAAG;AAAA,EAC1D;AAAA,EACA;AACF,KAAK,GAAG,MAAM;AAMhB,IAAM,iBAAiB,CAAC,SACrB,IAAI,WAAW,CAAC,GAAG,QAAQ,CAAC,WAAW;AACtC,MAAI,CAAC,OAAO,IAAK,QAAO,CAAC;AACzB,QAAM,OAAO,OAAO,YAChB,OAAO;AAAA,IACL,OAAO,QAAQ,OAAO,SAAS,EAAE;AAAA,MAAQ,CAAC,CAAC,MAAM,CAAC,MAChD,EAAE,UAAU,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;AAAA,IACrC;AAAA,EACF,IACA;AACJ,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,WACE,QAAQ,OAAO,KAAK,IAAI,EAAE,SAAS,IAC/BA,QAAO,KAAK,IAAI,IAChBA,QAAO,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AACF,CAAC;AAOI,IAAM,UAAUC,QAAO,GAAG,iBAAiB,EAAE,WAClD,KACA;AACA,QAAM,QAAQ,IAAI;AAClB,MAAI,CAAC,OAAO;AACV,WAAO,OAAO,IAAI,uBAAuB;AAAA,MACvC,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,IAAI,IAAI,YAAY,GAAG;AAC7B,QAAM,aAAmC,CAAC;AAE1C,aAAW,CAAC,cAAc,QAAQ,KAAK,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC3D,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC;AAAA,EACjC,GAAG;AACD,QAAI,CAAC,SAAU;AAEf,eAAW,UAAU,cAAc;AACjC,YAAM,YAAY,SAAS,MAAM;AACjC,UAAI,CAAC,UAAW;AAEhB,YAAM,aAAa,kBAAkB,UAAU,WAAW,CAAC;AAC3D,YAAM,cAAc,mBAAmB,WAAW,CAAC;AACnD,YAAM,cAAc,iBAAiB,YAAY,WAAW;AAC5D,YAAM,eAAe,oBAAoB,WAAW,CAAC;AACrD,YAAM,QAAQ,UAAU,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AAErE,iBAAW;AAAA,QACT,IAAI,mBAAmB;AAAA,UACrB,aAAa,YAAY;AAAA,YACvB,kBAAkB,QAAQ,cAAc,SAAS;AAAA,UACnD;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAASD,QAAO,aAAa,UAAU,OAAO;AAAA,UAC9C,aAAaA,QAAO,aAAa,UAAU,WAAW;AAAA,UACtD;AAAA,UACA;AAAA,UACA,aAAaA,QAAO,aAAa,WAAW;AAAA,UAC5C,aAAaA,QAAO,aAAa,WAAW;AAAA,UAC5C,cAAcA,QAAO,aAAa,YAAY;AAAA,UAC9C,YAAY,UAAU,eAAe;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,iBAAiB;AAAA,IAC1B,OAAOA,QAAO,aAAa,IAAI,MAAM,KAAK;AAAA,IAC1C,SAASA,QAAO,aAAa,IAAI,MAAM,OAAO;AAAA,IAC9C,SAAS,eAAe,GAAG;AAAA,IAC3B;AAAA,EACF,CAAC;AACH,CAAC;;;AC9PD,SAAS,UAAAE,SAAQ,OAAO,UAAAC,eAAc;AACtC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EAGE;AAAA,EACA;AAAA,OAGK;AAgBP,IAAM,iBAAoD;AAAA,EACxD,MAAM,CAAC,QAAQ,cAAc,QAAQ;AAAA,EACrC,OAAO,CAAC,SAAS,eAAe,QAAQ;AAAA,EACxC,QAAQ,CAAC,WAAW,QAAQ;AAAA,EAC5B,QAAQ,CAAC,WAAW,QAAQ;AAC9B;AAEA,IAAM,iBAAiB,CACrB,MACA,UACY;AACZ,QAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,WAAW,OAAW,QAAO;AAEjC,aAAW,OAAO,eAAe,MAAM,QAAQ,KAAK,CAAC,GAAG;AACtD,UAAM,YAAY,KAAK,GAAG;AAC1B,QACE,OAAO,cAAc,YACrB,cAAc,QACd,CAAC,MAAM,QAAQ,SAAS,GACxB;AACA,YAAM,SAAU,UAAsC,MAAM,IAAI;AAChE,UAAI,WAAW,OAAW,QAAO;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;AAMA,IAAM,cAAcC,QAAO,GAAG,qBAAqB,EAAE,WACnD,cACA,MACA,YACA;AACA,MAAI,WAAW;AAGf,aAAW,SAAS,YAAY;AAC9B,QAAI,MAAM,aAAa,OAAQ;AAC/B,UAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UAAI,MAAM,UAAU;AAClB,eAAO,OAAO,IAAI,uBAAuB;AAAA,UACvC,SAAS,oCAAoC,MAAM,IAAI;AAAA,UACvD,YAAYC,QAAO,KAAK;AAAA,UACxB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,eAAW,SAAS;AAAA,MAClB,IAAI,MAAM,IAAI;AAAA,MACd,mBAAmB,OAAO,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AAIA,QAAM,YAAY,CAAC,GAAG,SAAS,SAAS,eAAe,CAAC,EACrD,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAEnD,aAAW,QAAQ,WAAW;AAC5B,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,iBAAW,SAAS;AAAA,QAClB,IAAI,IAAI;AAAA,QACR,mBAAmB,OAAO,KAAK,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,GAAG,SAAS,SAAS,eAAe,CAAC,EACtD,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EACf,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAEnD,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO,OAAO,IAAI,uBAAuB;AAAA,MACvC,SAAS,+BAA+B,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAC3E,YAAYA,QAAO,KAAK;AAAA,MACxB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT,CAAC;AAMD,IAAM,iBAAiB,CACrB,SACA,SACA,YAEAD,QAAO,IAAI,aAAa;AACtB,QAAM,WAAmC,CAAC;AAC1C,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,QAAI,OAAO,UAAU,UAAU;AAC7B,eAAS,IAAI,IAAI;AAAA,IACnB,OAAO;AACL,YAAM,SAAS,OAAO,QAAQ,QAAQ,MAAM,UAAsB,OAAO,EAAE;AAAA,QACzEA,QAAO;AAAA,UAAS,MACd,IAAI,oBAAoB;AAAA,YACtB,QAAQ;AAAA,YACR,SAAS,6BAA6B,MAAM,QAAQ,iBAAiB,IAAI;AAAA,YACzE,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AACA,eAAS,IAAI,IAAI,MAAM,SAAS,GAAG,MAAM,MAAM,GAAG,MAAM,KAAK;AAAA,IAC/D;AAAA,EACF;AACA,SAAO;AACT,CAAC;AAEH,IAAM,eAAe,CACnB,SACA,YACwC;AACxC,MAAI,MAAM;AACV,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,UAAM,kBAAkB,UAAU,KAAK,MAAM,KAAK;AAAA,EACpD;AACA,SAAO;AACT;AAMA,IAAM,oBAAoB,CAAC,OAA2C;AACpE,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,aAAa,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,EAAE,YAAY,KAAK;AAC7D,SACE,eAAe,sBACf,WAAW,SAAS,OAAO,KAC3B,WAAW,SAAS,MAAM;AAE9B;AAOO,IAAM,SAASA,QAAO,GAAG,gBAAgB,EAAE,WAChD,WACA,MACA,QAEA,iBACA;AACA,QAAM,SAAS,OAAO,WAAW;AAEjC,QAAM,eAAe,OAAO;AAAA,IAC1B,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,EACZ;AAEA,QAAM,OAAO,aAAa,WAAW,GAAG,IAAI,eAAe,IAAI,YAAY;AAG3E,MAAI,UAAU,kBAAkB,KAAK,UAAU,OAAO,YAAY,CAAU,EAAE,IAAI;AAGlF,aAAW,SAAS,UAAU,YAAY;AACxC,QAAI,MAAM,aAAa,QAAS;AAChC,UAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,QAAI,UAAU,UAAa,UAAU,KAAM;AAC3C,cAAU,kBAAkB;AAAA,MAC1B;AAAA,MACA,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAGA,aAAW,SAAS,UAAU,YAAY;AACxC,QAAI,MAAM,aAAa,SAAU;AACjC,UAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,QAAI,UAAU,UAAa,UAAU,KAAM;AAC3C,cAAU,kBAAkB;AAAA,MAC1B;AAAA,MACA,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAGA,MAAIC,QAAO,OAAO,UAAU,WAAW,GAAG;AACxC,UAAM,KAAK,UAAU,YAAY;AACjC,UAAM,YAAY,KAAK,QAAQ,KAAK;AACpC,QAAI,cAAc,QAAW;AAC3B,UAAI,kBAAkB,GAAG,WAAW,GAAG;AACrC,kBAAU,kBAAkB,eAAe,SAAS,SAAS;AAAA,MAC/D,OAAO;AACL,kBAAU,kBAAkB,SAAS,SAAS,OAAO,SAAS,GAAG,GAAG,WAAW;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAGA,YAAU,aAAa,SAAS,mBAAmB,CAAC,CAAC;AAGrD,QAAM,WAAW,OAAO,OAAO,QAAQ,OAAO,EAAE;AAAA,IAC9CD,QAAO;AAAA,MACL,CAAC,QACC,IAAI,uBAAuB;AAAA,QACzB,SAAS,wBAAwB,IAAI,OAAO;AAAA,QAC5C,YAAYC,QAAO,KAAK;AAAA,QACxB,OAAO;AAAA,MACT,CAAC;AAAA,IACL;AAAA,EACF;AAEA,QAAM,SAAS,SAAS;AACxB,QAAM,kBAA0C,EAAE,GAAG,SAAS,QAAQ;AAGtE,QAAM,cAAc,SAAS,QAAQ,cAAc,KAAK;AACxD,QAAM,eACJ,WAAW,MACP,OACA,kBAAkB,WAAW,IAC3B,OAAO,SAAS,KAAK;AAAA,IACnBD,QAAO,SAAS,MAAM,SAAS,IAAI;AAAA,EACrC,IACA,OAAO,SAAS;AAExB,QAAM,KAAK,UAAU,OAAO,SAAS;AAErC,SAAO,IAAI,iBAAiB;AAAA,IAC1B;AAAA,IACA,SAAS;AAAA,IACT,MAAM,KAAK,eAAe;AAAA,IAC1B,OAAO,KAAK,OAAO;AAAA,EACrB,CAAC;AACH,CAAC;AAMD,IAAM,eAAe,oBAAI,IAAI,CAAC,OAAO,QAAQ,SAAS,CAAC;AAKhD,IAAM,0BAA0B,CAAC,QAAgB,iBAGnD;AACH,MAAI,aAAa,IAAI,OAAO,YAAY,CAAC,EAAG,QAAO,CAAC;AACpD,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,qBAAqB,GAAG,OAAO,YAAY,CAAC,IAAI,YAAY;AAAA,EAC9D;AACF;AAEO,IAAM,qBAAqB,CAAC,UAKf;AAAA,EAClB,oBAAoB,CAAC,WACnBA,QAAO,IAAI,aAAa;AACtB,UAAM,QAAQ,OAAO,KAAK,eAAe,IAAI,MAAM;AACnD,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,wBAAwB,MAAM,QAAQ,QAAQ,MAAM,QAAQ,YAAY;AAAA,EACjF,CAAC;AAAA,EAEH,QAAQ,CAAC,QAAgB,SACvBA,QAAO,IAAI,aAAa;AACtB,UAAM,QAAQ,OAAO,KAAK,eAAe,IAAI,MAAM;AACnD,QAAI,CAAC,OAAO;AACV,aAAO,OAAO,IAAI,oBAAoB;AAAA,QACpC;AAAA,QACA,SAAS,gCAAgC,MAAM;AAAA,QAC/C,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,UAAM,EAAE,SAAS,OAAO,IAAI;AAC5B,UAAM,UAAU,OAAO;AAGvB,UAAM,kBAAkB,OAAO;AAAA,MAC7B,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,UAAM,oBAAoB,UACtB,MAAM;AAAA,MACJ,WAAW;AAAA,MACXA,QAAO;AAAA,QACL,WAAW;AAAA,QACX,WAAW;AAAA,UACT,kBAAkB,WAAW,OAAO;AAAA,QACtC;AAAA,MACF;AAAA,IACF,EAAE,KAAK,MAAM,QAAQ,KAAK,eAAe,CAAC,IAC1C,KAAK;AAET,UAAM,SAAS,OAAO;AAAA,MACpB;AAAA,MACC,QAAQ,CAAC;AAAA,MACV;AAAA,MACA;AAAA,IACF,EAAE,KAAKA,QAAO,QAAQ,iBAAiB,CAAC;AAExC,WAAO,IAAI,qBAAqB;AAAA,MAC9B,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH,CAAC,EAAE;AAAA,IACDA,QAAO,SAAS,CAAC,QAAQ;AACvB,UACE,OAAO,QAAQ,YACf,QAAQ,QACR,UAAU,OACT,IAAyB,SAAS,uBACnC;AACA,eAAOA,QAAO,KAAK,GAA0B;AAAA,MAC/C;AACA,aAAOA,QAAO;AAAA,QACZ,IAAI,oBAAoB;AAAA,UACtB;AAAA,UACA,SAAS,8BAA8B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,UACvF,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACJ;;;AC/WA,SAAS,UAAAE,SAAQ,UAAAC,eAAc;AAC/B,SAAS,SAAS,4BAAiE;AASnF,IAAM,cAAN,cAA0BC,QAAO,MAAmB,aAAa,EAAE;AAAA,EACjE,WAAWA,QAAO;AAAA,EAClB,SAAS;AAAA,EACT,QAAQ;AACV,CAAC,EAAE;AAAC;AAEJ,IAAM,cAAcA,QAAO,WAAWA,QAAO,UAAU,WAAW,CAAC;AACnE,IAAM,cAAcA,QAAO,kBAAkBA,QAAO,UAAU,WAAW,CAAC;AAE1E,IAAM,qBAAqBA,QAAO,OAAO;AAAA,EACvC,WAAWA,QAAO;AAAA,EAClB,MAAMA,QAAO;AAAA,EACb,QAAQA,QAAO,OAAO;AAAA,IACpB,MAAMA,QAAO;AAAA,IACb,SAASA,QAAO,SAASA,QAAO,MAAM;AAAA,IACtC,WAAWA,QAAO,SAASA,QAAO,MAAM;AAAA,IACxC,SAASA,QAAO;AAAA,MACdA,QAAO,OAAO,EAAE,KAAKA,QAAO,QAAQ,OAAO,YAAY,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AACH,CAAC;AACD,IAAM,eAAeA,QAAO,WAAWA,QAAO,UAAU,kBAAkB,CAAC;AAC3E,IAAM,eAAeA,QAAO,kBAAkBA,QAAO,UAAU,kBAAkB,CAAC;AAMlF,IAAM,YAAY,CAChB,UACA,YAC0B;AAC1B,QAAM,oBAAoB,CACxB,IACA,WAC+B,GAAG,kBAAkB,MAAM,KAAK;AAEjE,SAAQ;AAAA,IACR,KAAK,CAAC,WACJC,QAAO,IAAI,aAAa;AACtB,YAAM,MAAM,OAAO,SAAS,IAAI,MAAM;AACtC,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,QAAQ,YAAY,GAAG;AAC7B,aAAO,EAAE,SAAS,MAAM,SAAS,QAAQ,MAAM,OAAO;AAAA,IACxD,CAAC;AAAA,IAEH,KAAK,CAAC,YACJ;AAAA,MACE;AAAA,MACAA,QAAO;AAAA,QACL;AAAA,QACA,CAAC,EAAE,QAAQ,WAAW,SAAS,OAAO,MACpC,SAAS;AAAA,UACP;AAAA,UACA,YAAY,IAAI,YAAY,EAAE,WAAW,SAAS,OAAO,CAAC,CAAC;AAAA,QAC7D;AAAA,QACF,EAAE,SAAS,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IAEF,QAAQ,CAAC,WAAW,SAAS,OAAO,MAAM,EAAE,KAAKA,QAAO,MAAM;AAAA,IAE9D,iBAAiB,CAAC,cAChBA,QAAO,IAAI,aAAa;AACtB,YAAM,UAAU,OAAO,SAAS,KAAK;AACrC,YAAM,MAAgB,CAAC;AACvB,iBAAW,KAAK,SAAS;AACvB,cAAM,QAAQ,YAAY,EAAE,KAAK;AACjC,YAAI,MAAM,cAAc,UAAW,KAAI,KAAK,EAAE,GAAa;AAAA,MAC7D;AACA,aAAO;AAAA,IACT,CAAC;AAAA,IAEH,mBAAmB,CAAC,cAClBA,QAAO,IAAI,aAAa;AACtB,YAAM,UAAU,OAAO,SAAS,KAAK;AACrC,YAAM,MAAgB,CAAC;AACvB,iBAAW,KAAK,SAAS;AACvB,cAAM,QAAQ,YAAY,EAAE,KAAK;AACjC,YAAI,MAAM,cAAc,WAAW;AACjC,cAAI,KAAK,EAAE,GAAa;AACxB,iBAAO,SAAS,OAAO,EAAE,GAAG;AAAA,QAC9B;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,IAEH,WAAW,CAAC,WACV,QAAQ,IAAI,OAAO,WAAW,aAAa,MAAM,CAAC;AAAA,IAEpD,cAAc,CAAC,cACb,QAAQ,OAAO,SAAS,EAAE,KAAKA,QAAO,MAAM;AAAA,IAE9C,aAAa,MACXA,QAAO,IAAI,aAAa;AACtB,YAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,aAAO,QAAQ,IAAI,CAAC,MAAM,aAAa,EAAE,KAAK,CAAiB;AAAA,IACjE,CAAC;AAAA,EACH;AACF;AAMO,IAAM,uBAAuB,CAClC,IACA,cAEA;AAAA,EACE,QAAQ,IAAI,GAAG,SAAS,WAAW;AAAA,EACnC,QAAQ,IAAI,GAAG,SAAS,UAAU;AACpC;AAEK,IAAM,6BAA6B,MACxC;AAAA,EACE,qBAAqB;AAAA,EACrB,qBAAqB;AACvB;;;ACtIF,SAAS,UAAAC,SAAQ,UAAAC,eAAc;AAC/B,SAAS,UAAAC,eAAc;AAUhB,IAAM,iBAAN,cAA6BC,QAAO,MAAsB,gBAAgB,EAAE;AAAA;AAAA,EAEjF,MAAMA,QAAO;AAAA;AAAA,EAEb,MAAMA,QAAO,QAAQ,QAAQ,UAAU,UAAU,eAAe;AAAA;AAAA,EAEhE,QAAQA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA;AAAA,EAE3D,IAAIA,QAAO,aAAaA,QAAO,QAAQ,UAAU,SAAS,QAAQ,GAAG,EAAE,IAAI,SAAS,CAAC;AAAA;AAAA,EAErF,YAAYA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,EAC/D,aAAaA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAClE,CAAC,EAAE;AAAC;AAMG,IAAM,eAAN,cAA2BA,QAAO,MAAoB,cAAc,EAAE;AAAA;AAAA,EAE3E,SAASA,QAAO,MAAMA,QAAO,MAAM;AACrC,CAAC,EAAE;AAAC;AAMG,IAAM,eAAN,cAA2BA,QAAO,MAAoB,cAAc,EAAE;AAAA;AAAA,EAE3E,OAAOA,QAAO;AAAA;AAAA,EAEd,SAASA,QAAO,OAAO,EAAE,KAAKA,QAAO,QAAQ,OAAOA,QAAO,OAAOA,QAAO,MAAM,EAAE,CAAC;AAAA;AAAA,EAElF,eAAeA,QAAO,MAAMA,QAAO,MAAM;AAC3C,CAAC,EAAE;AAAC;AAMG,IAAM,cAAN,cAA0BA,QAAO,MAAmB,aAAa,EAAE;AAAA,EACxE,OAAOA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA,EAC1D,SAASA,QAAO,aAAaA,QAAO,QAAQ,EAAE,IAAI,SAAS,CAAC;AAAA;AAAA,EAE5D,SAASA,QAAO,MAAMA,QAAO,OAAO;AAAA,EACpC,gBAAgBA,QAAO;AAAA,EACvB,MAAMA,QAAO,MAAMA,QAAO,MAAM;AAAA,EAChC,iBAAiBA,QAAO,MAAM,cAAc;AAAA;AAAA,EAE5C,gBAAgBA,QAAO,MAAM,YAAY;AAAA;AAAA,EAEzC,eAAeA,QAAO,MAAM,YAAY;AAC1C,CAAC,EAAE;AAAC;AAMJ,IAAM,yBAAyB,CAC7B,eAEA,OAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,MAAM,WAAW,MAAM;AAC1D,MAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO,CAAC;AAC7D,QAAM,SAAS;AACf,MAAI,UAAU,OAAQ,QAAO,CAAC;AAE9B,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,CAAC,QAAQ,UAAU,UAAU,eAAe,EAAE,SAAS,IAAI,EAAG,QAAO,CAAC;AAE3E,SAAO;AAAA,IACL,IAAI,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA,QAAQC,QAAO,aAAa,OAAO,MAA4B;AAAA,MAC/D,IAAIA,QAAO;AAAA,QACT,OAAO;AAAA,MACT;AAAA,MACA,YAAYA,QAAO,aAAa,OAAO,IAA0B;AAAA,MACjE,aAAaA,QAAO,aAAa,OAAO,WAAiC;AAAA,IAC3E,CAAC;AAAA,EACH;AACF,CAAC;AAMH,IAAM,qBAAqB,CACzB,SACA,eACmB;AACnB,QAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzD,SAAO,WAAW,QAAQ,CAAC,aAAa;AACtC,UAAM,WAAW,SAAS,QACvB,IAAI,CAAC,SAAS,UAAU,IAAI,IAAI,CAAC,EACjC,OAAO,CAAC,MAA2B,MAAM,MAAS;AAErD,QAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,UAAM,UAAyC,CAAC;AAChD,UAAM,gBAA0B,CAAC;AACjC,UAAM,aAAuB,CAAC;AAE9B,eAAW,UAAU,UAAU;AAC7B,UAAI,OAAO,SAAS,UAAUA,QAAO,UAAU,OAAO,QAAQ,MAAM,EAAE,MAAM,UAAU;AACpF,gBAAQ,eAAe,IAAI;AAC3B,sBAAc,KAAK,eAAe;AAClC,mBAAW,KAAK,cAAc;AAAA,MAChC,WAAW,OAAO,SAAS,UAAUA,QAAO,UAAU,OAAO,QAAQ,MAAM,EAAE,MAAM,SAAS;AAC1F,gBAAQ,eAAe,IAAI;AAC3B,sBAAc,KAAK,eAAe;AAClC,mBAAW,KAAK,YAAY;AAAA,MAC9B,WAAW,OAAO,SAAS,YAAYA,QAAO,UAAU,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU;AACzF,cAAM,aAAaA,QAAO,UAAU,OAAO,YAAY,MAAM,OAAO,IAAI;AACxE,gBAAQ,UAAU,IAAI;AACtB,sBAAc,KAAK,UAAU;AAC7B,mBAAW,KAAK,OAAO,IAAI;AAAA,MAC7B,WAAW,OAAO,SAAS,UAAU;AACnC,mBAAW,KAAK,GAAG,OAAO,IAAI,KAAKA,QAAO,UAAU,OAAO,IAAI,MAAM,SAAS,CAAC,GAAG;AAAA,MACpF,OAAO;AACL,mBAAW,KAAK,OAAO,IAAI;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,KAAK,SAAS,SAAS,GAAG;AAC5D,aAAO;AAAA,QACL,IAAI,aAAa,EAAE,OAAO,WAAW,KAAK,KAAK,GAAG,SAAS,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC;AAAA,MACpF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI,aAAa,EAAE,OAAO,WAAW,KAAK,KAAK,GAAG,SAAS,cAAc,CAAC;AAAA,IAC5E;AAAA,EACF,CAAC;AACH;AAMA,IAAM,cAAc,CAAC,WAAuC;AAC1D,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,MAAM,OAAO,YAAY;AAClC,eAAW,OAAO,GAAG,KAAM,QAAO,IAAI,GAAG;AAAA,EAC3C;AACA,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK;AAC1B;AAQO,IAAM,cAAcC,QAAO,GAAG,qBAAqB,EAAE,WAC1D,UACA;AACA,QAAM,MAAM,OAAO,MAAM,QAAQ;AACjC,QAAM,SAAS,OAAO,QAAQ,GAAG;AAEjC,QAAM,kBAAkB;AAAA,IACtB,IAAI,YAAY,mBAAmB,CAAC;AAAA,EACtC;AAEA,QAAM,cAAe,IAAI,YAAY,CAAC;AACtC,QAAM,iBAAiB,YAAY;AAAA,IACjC,CAAC,UAAU,IAAI,aAAa,EAAE,SAAS,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,EAC7D;AAEA,SAAO,IAAI,YAAY;AAAA,IACrB,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,gBAAgB,OAAO,WAAW;AAAA,IAClC,MAAM,YAAY,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA,eAAe,mBAAmB,iBAAiB,cAAc;AAAA,EACnE,CAAC;AACH,CAAC;;;AC/LD,SAAS,UAAAC,SAAQ,UAAAC,SAAQ,UAAAC,eAAc;AACvC,SAAS,uBAAmC;AAG5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,OAEK;;;ACAP,IAAM,aAAa,CAAC,UAClB,MACG,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,6BAA6B,OAAO,EAC5C,QAAQ,kBAAkB,GAAG,EAC7B,KAAK,EACL,MAAM,KAAK,EACX,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAErC,IAAM,gBAAgB,CAAC,UAA0B,MAAM,YAAY;AAEnE,IAAM,cAAc,CAAC,UAA0B;AAC7C,QAAM,QAAQ,WAAW,KAAK,EAAE,IAAI,aAAa;AACjD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,SAAO,GAAG,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AACzF;AAEA,IAAM,eAAe,CAAC,UAA0B;AAC9C,QAAM,QAAQ,YAAY,KAAK;AAC/B,SAAO,GAAG,MAAM,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC;AAC1D;AAMA,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB,oBAAI,IAAI,CAAC,KAAK,CAAC;AAE7C,IAAM,2BAA2B,CAAC,iBAChC,aACG,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE/B,IAAM,yBAAyB,CAAC,YAC9B,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AAEjD,IAAM,wBAAwB,CAAC,UAA6C;AAC1E,QAAM,YAAY,OAAO,KAAK;AAC9B,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,YAAY,SAAS;AAC9B;AAMA,IAAM,uBAAuB,CAAC,iBAC5B,yBAAyB,YAAY,EAClC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1B,KAAK,CAAC,MAAM,sBAAsB,KAAK,CAAC,CAAC;AAE9C,IAAM,kBAAkB,CAAC,iBAAiC;AACxD,aAAW,WAAW,yBAAyB,YAAY,GAAG;AAC5D,UAAM,QAAQ,QAAQ,YAAY;AAClC,QAAI,sBAAsB,KAAK,KAAK,EAAG;AACvC,QAAI,sBAAsB,IAAI,KAAK,EAAG;AACtC,QAAI,uBAAuB,OAAO,EAAG;AACrC,WAAO,sBAAsB,OAAO,KAAK;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,IAAM,2BAA2B,CAAC,UAChC,MACG,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE/B,IAAM,iBAAiB,CACrB,aACA,UACW;AACX,QAAM,WAAW,yBAAyB,WAAW;AACrD,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,SAAK,sBAAsB,KAAK,KAAK,WAAW,SAAS,KAAK,SAAS,GAAG;AACxE,aAAO,KAAK,KAAK,GAAG;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,mBAAmB,CACvB,QACA,cACA,UACW;AACX,QAAM,mBAAmB,yBAAyB,YAAY,EAC3D,OAAO,CAAC,MAAM,CAAC,sBAAsB,KAAK,EAAE,YAAY,CAAC,CAAC,EAC1D,OAAO,CAAC,MAAM,CAAC,sBAAsB,IAAI,EAAE,YAAY,CAAC,CAAC,EACzD,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,EACxC,IAAI,CAAC,MAAM,sBAAsB,CAAC,KAAK,CAAC,EACxC,OAAO,CAAC,MAAM,MAAM,KAAK;AAE5B,QAAM,gBAAgB,iBAAiB,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE;AAC1E,SAAO,GAAG,MAAM,GAAG,iBAAiB,WAAW;AACjD;AAEA,IAAM,aAAa,CACjB,aACA,QACA,cACA,UACW;AACX,QAAM,YAAY,YAAY,eAAe,aAAa,KAAK,CAAC;AAChE,MAAI,UAAU,SAAS,KAAK,cAAc,MAAO,QAAO;AACxD,SAAO,YAAY,iBAAiB,QAAQ,cAAc,KAAK,CAAC;AAClE;AAuBA,IAAM,oBAAoB,CACxB,gBACqB;AAErB,QAAM,SAAS,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAEhD,QAAM,eAAe,CACnB,OACA,YACG;AACH,UAAM,SAAS,oBAAI,IAA2B;AAC9C,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC7C,aAAO,KAAK,IAAI;AAChB,aAAO,IAAI,KAAK,UAAU,MAAM;AAAA,IAClC;AACA,eAAW,UAAU,OAAO,OAAO,GAAG;AACpC,UAAI,OAAO,SAAS,EAAG;AACvB,iBAAW,KAAK,QAAQ;AACtB,UAAE,WAAW,QAAQ,CAAC;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAGA;AAAA,IAAa;AAAA,IAAQ,CAAC,MACpB,EAAE,iBACE,GAAG,EAAE,KAAK,IAAI,EAAE,cAAc,IAAI,EAAE,IAAI,KACxC,EAAE;AAAA,EACR;AAGA,eAAa,QAAQ,CAAC,MAAM;AAC1B,UAAM,SAAS,EAAE,iBACb,GAAG,EAAE,KAAK,IAAI,EAAE,cAAc,KAC9B,EAAE;AACN,WAAO,GAAG,MAAM,IAAI,EAAE,IAAI,GAAG,aAAa,EAAE,MAAM,CAAC;AAAA,EACrD,CAAC;AAGD,eAAa,QAAQ,CAAC,MAAM;AAC1B,UAAM,SAAS,EAAE,iBACb,GAAG,EAAE,KAAK,IAAI,EAAE,cAAc,KAC9B,EAAE;AACN,WAAO,GAAG,MAAM,IAAI,EAAE,IAAI,GAAG,aAAa,EAAE,MAAM,CAAC,GAAG,EAAE,cAAc,MAAM,GAAG,CAAC,CAAC;AAAA,EACnF,CAAC;AAED,SAAO,OAAO,IAAI,CAAC,OAAO;AAAA,IACxB,UAAU,EAAE;AAAA,IACZ,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,IACR,gBAAgB,EAAE;AAAA,IAClB,WAAW,EAAE;AAAA,EACf,EAAE;AACJ;AAMA,IAAM,aAAa,CAAC,UAA2B;AAC7C,QAAM,MAAM,KAAK,UAAU,OAAO,OAAO,KAAK,KAAgC,EAAE,KAAK,CAAC;AACtF,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAS,QAAQ,KAAK,OAAO,IAAI,WAAW,CAAC,IAAK;AAAA,EACpD;AACA,SAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACpD;AAUO,IAAM,yBAAyB,CACpC,eACqB;AACrB,QAAM,MAAM,WAAW,IAAI,CAAC,IAAI,UAAU;AACxC,UAAM,cAAc,GAAG;AACvB,UAAM,QACJ,sBAAsB,GAAG,KAAK,CAAC,CAAC,KAAK,gBAAgB,GAAG,YAAY;AACtE,UAAM,OAAO,WAAW,aAAa,GAAG,QAAQ,GAAG,cAAc,KAAK;AACtE,UAAM,iBAAiB,qBAAqB,GAAG,YAAY;AAC3D,UAAM,gBAAgB,WAAW;AAAA,MAC/B,QAAQ,GAAG;AAAA,MACX,MAAM,GAAG;AAAA,MACT;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,UAAU,GAAG,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,GAAG;AAAA,MACX;AAAA,MACA,gBAAgB;AAAA,MAChB,WAAW;AAAA,IACb;AAAA,EACF,CAAC;AAED,SAAO,kBAAkB,GAAG,EAAE;AAAA,IAAK,CAAC,GAAG,MACrC,EAAE,SAAS,cAAc,EAAE,QAAQ;AAAA,EACrC;AACF;;;AD3LA,IAAM,yBAAyBC,QAAO,OAAO;AAAA,EAC3C,MAAMA,QAAO;AACf,CAAC;AAGD,IAAM,uBAAuBA,QAAO,OAAO;AAAA,EACzC,MAAMA,QAAO;AAAA,EACb,SAASA,QAAO,SAASA,QAAO,MAAM;AAAA,EACtC,WAAWA,QAAO,SAASA,QAAO,MAAM;AAAA,EACxC,SAASA,QAAO;AAAA,IACdA,QAAO,OAAO,EAAE,KAAKA,QAAO,QAAQ,OAAO,YAAkB,CAAC;AAAA,EAChE;AACF,CAAC;AAGD,IAAM,wBAAwBA,QAAO,OAAO;AAAA,EAC1C,UAAUA,QAAO;AAAA,EACjB,WAAWA,QAAO;AACpB,CAAC;AAGD,IAAM,uBAAuB,CAAC,SAA2B;AACvD,MAAI,QAAQ,QAAQ,OAAO,SAAS,SAAU,QAAO;AACrD,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,QAAIC,WAAU;AACd,UAAM,MAAM,KAAK,IAAI,CAAC,SAAS;AAC7B,YAAM,IAAI,qBAAqB,IAAI;AACnC,UAAI,MAAM,KAAM,CAAAA,WAAU;AAC1B,aAAO;AAAA,IACT,CAAC;AACD,WAAOA,WAAU,MAAM;AAAA,EACzB;AAEA,QAAM,MAAM;AAEZ,MAAI,OAAO,IAAI,SAAS,UAAU;AAChC,UAAM,QAAQ,IAAI,KAAK,MAAM,gCAAgC;AAC7D,QAAI,MAAO,QAAO,EAAE,GAAG,KAAK,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACd,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,UAAM,IAAI,qBAAqB,CAAC;AAChC,QAAI,MAAM,EAAG,WAAU;AACvB,WAAO,CAAC,IAAI;AAAA,EACd;AACA,SAAO,UAAU,SAAS;AAC5B;AAEA,IAAM,iBAAiB,CACrB,KACA,cACqB;AACrB,QAAM,KAAK,IAAI;AACf,QAAM,cAAcC,QAAO;AAAA,IAAU,GAAG;AAAA,IAAa,MACnDA,QAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,GAAG,GAAG,OAAO,YAAY,CAAC,IAAI,GAAG,YAAY;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI,OAAO,KAAK,GAAG,SAAS,IAAI,IAAI,QAAQ,EAAE;AAAA,IAC9C,WAAW;AAAA,IACX,UAAU;AAAA,IACV,MAAM,IAAI;AAAA,IACV;AAAA,IACA,aAAa,qBAAqBA,QAAO,eAAe,GAAG,WAAW,CAAC;AAAA,IACvE,cAAc,qBAAqBA,QAAO,eAAe,GAAG,YAAY,CAAC;AAAA,EAC3E;AACF;AAEA,IAAM,YAAY,CAAC,QACjB,IAAI,iBAAiB;AAAA,EACnB,QAAQ,IAAI,UAAU;AAAA,EACtB,cAAc,IAAI,UAAU;AAAA,EAC5B,YAAY,CAAC,GAAG,IAAI,UAAU,UAAU;AAAA,EACxC,aAAa,IAAI,UAAU;AAC7B,CAAC;AAMI,IAAM,gBAAgB,CAAC,YAG2B;AACvD,QAAM,kBAAkB,SAAS,mBAAmB,gBAAgB;AACpE,QAAM,iBACJ,SAAS,kBAAkB,2BAA2B;AAExD,SAAO,aAAa;AAAA,IAClB,KAAK;AAAA,IACL,MAAM,CAAC,QACLC,QAAO,IAAI,aAAa;AACtB,aAAO,IAAI,MAAM;AAAA,QACf;AAAA,QACA,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA,SAAS,IAAI;AAAA,UACb,SAAS,IAAI,MAAM;AAAA,QACrB,CAAC;AAAA,MACH;AAKA,aAAO,IAAI,QAAQ,WAAW;AAAA,QAC5B,MAAM;AAAA,QAEN,MAAM,MACJ,eAAe,YAAY,EAAE;AAAA,UAC3BA,QAAO;AAAA,YAAI,CAAC,UACV,MAAM;AAAA,cACJ,CAAC,MACC,IAAI,OAAO;AAAA,gBACT,IAAI,EAAE;AAAA,gBACN,MAAM,EAAE;AAAA,gBACR,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,YAAY;AAAA,cACd,CAAC;AAAA,YACL;AAAA,UACF;AAAA,QACF;AAAA,QAEF,QAAQ,CAAC,aACPA,QAAO,IAAI,aAAa;AACtB,iBAAO,eAAe,kBAAkB,QAAQ;AAChD,iBAAO,eAAe,aAAa,QAAQ;AAC3C,iBAAO,IAAI,MAAM,mBAAmB,QAAQ;AAAA,QAC9C,CAAC;AAAA,QAEH,QAAQ,CAAC,QACPA,QAAO,IAAI,aAAa;AACtB,gBAAM,UAAU,IAAI,KAAK;AACzB,cAAI,CAAC,QAAS,QAAO;AACrB,gBAAM,SAAS,OAAOA,QAAO,IAAI,MAAM,IAAI,IAAI,OAAO,CAAC,EAAE,KAAKA,QAAO,MAAM;AAC3E,cAAI,OAAO,SAAS,OAAQ,QAAO;AAInC,gBAAM,MAAM,OAAO,MAAM,OAAO,EAAE;AAAA,YAChCA,QAAO,SAAS,MAAMA,QAAO,QAAQ,IAAI,CAAC;AAAA,UAC5C;AACA,cAAI,CAAC,IAAK,QAAO;AAEjB,gBAAM,SAAS,OAAO,QAAQ,GAAG,EAAE;AAAA,YACjCA,QAAO,SAAS,MAAMA,QAAO,QAAQ,IAAI,CAAC;AAAA,UAC5C;AACA,cAAI,CAAC,OAAQ,QAAO;AAEpB,gBAAM,YAAYD,QAAO,UAAU,OAAO,OAAO,MAAM,KAAK,EACzD,YAAY,EACZ,QAAQ,eAAe,GAAG;AAC7B,gBAAM,OAAOA,QAAO,UAAU,OAAO,OAAO,MAAM,SAAS;AAE3D,iBAAO,IAAI,sBAAsB;AAAA,YAC/B,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,UAAU;AAAA,YACV;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACL,CAAC;AAED,YAAM,kBAAkB,CAAC,WACvBC,QAAO,IAAI,aAAa;AACtB,cAAM,MAAM,OAAO,MAAM,OAAO,IAAI;AACpC,cAAM,SAAS,OAAO,QAAQ,GAAG;AAEjC,cAAM,YACJ,OAAO,aACPD,QAAO,UAAU,OAAO,OAAO,MAAM,KAAK,EACvC,YAAY,EACZ,QAAQ,eAAe,GAAG;AAE/B,YAAI,IAAI,YAAY,SAAS;AAE3B,gBAAM,OAAgC,CAAC;AACvC,qBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,WAAW,OAAO,GAAG;AAC3D,iBAAK,CAAC,IAAI,qBAAqB,CAAC;AAAA,UAClC;AACA,iBAAO,IAAI,MAAM,oBAAoB,IAAI;AAAA,QAC3C;AAEA,cAAM,UAAU,OAAO,WAAW,eAAe,OAAO,OAAO;AAC/D,cAAM,mBAAmB,IAAI,iBAAiB;AAAA,UAC5C;AAAA,UACA,SAAS,OAAO,WAAW,CAAC;AAAA,QAC9B,CAAC;AAED,cAAM,cAAc,uBAAuB,OAAO,UAAU;AAE5D,cAAM,gBAAgB,YAAY;AAAA,UAAI,CAAC,QACrC,eAAe,KAAK,SAAS;AAAA,QAC/B;AAEA,eAAO,eAAe;AAAA,UACpB,YAAY,IAAI,CAAC,SAAS;AAAA,YACxB,QAAQ,OAAO,KAAK,GAAG,SAAS,IAAI,IAAI,QAAQ,EAAE;AAAA,YAClD;AAAA,YACA,SAAS,UAAU,GAAG;AAAA,YACtB,QAAQ;AAAA,UACV,EAAE;AAAA,QACJ;AAEA,eAAO,IAAI,MAAM,SAAS,aAAa;AAEvC,cAAM,aAAaA,QAAO,UAAU,OAAO,OAAO,MAAM,SAAS;AACjE,eAAO,eAAe,UAAU;AAAA,UAC9B;AAAA,UACA,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM,OAAO;AAAA,YACb,SAAS,OAAO;AAAA,YAChB,WAAW,OAAO;AAAA,YAClB,SAAS,OAAO;AAAA,UAClB;AAAA,QACF,CAAC;AAED,eAAO,EAAE,UAAU,WAAW,WAAW,cAAc,OAAO;AAAA,MAChE,CAAC;AAEH,YAAM,eAAe,OAAO,qBAAqB;AAAA,QAC/C,UAAU,IAAI;AAAA,QACd,SAAS,IAAI;AAAA,QACb,WAAW;AAAA,QACX,QAAQ;AAAA,UACN,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,QACA,OAAO;AAAA,UACL,YAAY;AAAA,YACV,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,aACE;AAAA,YACF,aAAa;AAAA,YACb,cAAc;AAAA,YACd,SAAS,CAAC,EAAE,KAAK,MAAwB,YAAY,IAAI;AAAA,UAC3D,CAAC;AAAA,UACD,YAAY;AAAA,YACV,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,aACE;AAAA,YACF,aAAa;AAAA,YACb,cAAc;AAAA,YACd,SAAS,CAAC,UAA0B,gBAAgB,KAAK;AAAA,UAC3D,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,WAAW;AAAA,UACT,aAAa,CAAC,aAAqB,YAAY,QAAQ;AAAA,UAEvD,SAAS,CAAC,WACR,gBAAgB,MAAM,EAAE;AAAA,YACtBC,QAAO,IAAI,CAAC,EAAE,UAAU,OAAO,EAAE,UAAU,EAAE;AAAA,UAC/C;AAAA,UAEF,YAAY,CAAC,cACXA,QAAO,IAAI,aAAa;AACtB,kBAAM,UACJ,OAAO,eAAe,kBAAkB,SAAS;AACnD,gBAAI,QAAQ,SAAS,GAAG;AACtB,qBAAO,IAAI,MAAM,WAAW,OAAO;AAAA,YACrC;AACA,mBAAO,eAAe,aAAa,SAAS;AAAA,UAC9C,CAAC;AAAA,QACL;AAAA,QAEA,OAAO,MAAM,aAAa,MAAM;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;","names":["Schema","Effect","Option","Option","Effect","Effect","Option","Effect","Option","Effect","Schema","Schema","Effect","Effect","Option","Schema","Schema","Option","Effect","Effect","Option","Schema","Schema","changed","Option","Effect"]}
|