{"version":3,"sources":["../../src/tools/openapi.ts"],"names":["OpenAPIToolOutput","StringToolOutput","constructor","status","statusText","result","OpenAPITool","Tool","name","description","url","openApiSchema","inputSchema","getReferencedObject","json","refPath","pathSegments","split","currentObject","segment","type","required","oneOf","Object","entries","paths","flatMap","path","pathSpec","map","method","methodSpec","additionalProperties","properties","const","summary","requestBody","content","schema","body","parameters","filter","p","reduce","acc","$ref","emitter","register","options","parse","servers","find","s","ValueError","info","title","trim","Emitter","root","child","namespace","toCamelCase","creator","_run","input","_options","run","URL","keys","forEach","key","value","newPath","replace","searchParams","append","pathname","join","fetchOptions","signal","AbortSignal","any","isTruthy","isEmpty","undefined","toLowerCase","headers","Accept","emit","response","fetch","toString","text","output","data","err","ToolError","createSnapshot","clone"],"mappings":"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","file":"openapi.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { join } from \"path\";\n\nimport {\n  BaseToolOptions,\n  BaseToolRunOptions,\n  StringToolOutput,\n  Tool,\n  ToolError,\n  ToolEmitter,\n} from \"@/tools/base.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { GetRunContext } from \"@/context.js\";\nimport { ValueError } from \"@/errors.js\";\nimport { SchemaObject } from \"ajv\";\nimport { parse } from \"yaml\";\nimport { isEmpty, isTruthy, clone, toCamelCase } from \"remeda\";\n\nexport interface OpenAPIToolOptions extends BaseToolOptions {\n  name?: string;\n  description?: string;\n  openApiSchema: any;\n  url?: string;\n  fetchOptions?: RequestInit;\n}\n\nexport interface OpenAPIEvents {\n  beforeFetch: Callback<{ options: RequestInit; url: URL }>;\n  afterFetch: Callback<{ data: OpenAPIToolOutput; url: URL }>;\n}\n\nexport class OpenAPIToolOutput extends StringToolOutput {\n  constructor(\n    public readonly status: number,\n    public readonly statusText: string,\n    public readonly result = \"\",\n  ) {\n    super();\n    this.status = status;\n    this.statusText = statusText;\n    this.result = result ?? \"\";\n  }\n}\n\nexport class OpenAPITool extends Tool<OpenAPIToolOutput, OpenAPIToolOptions> {\n  public readonly name: string;\n  public readonly description: string;\n  public readonly url: string;\n\n  public readonly openApiSchema: any;\n\n  inputSchema(): SchemaObject {\n    const getReferencedObject = (json: any, refPath: string) => {\n      const pathSegments = refPath.split(\"/\");\n      let currentObject = json;\n      for (const segment of pathSegments) {\n        if (segment === \"#\") {\n          continue;\n        }\n        currentObject = currentObject[segment];\n      }\n      return currentObject;\n    };\n\n    return {\n      type: \"object\",\n      required: [\"path\", \"method\"],\n      oneOf: Object.entries(this.openApiSchema.paths).flatMap(([path, pathSpec]: [string, any]) =>\n        Object.entries(pathSpec).map(([method, methodSpec]: [string, any]) => ({\n          additionalProperties: false,\n          properties: {\n            path: {\n              const: path,\n              description:\n                \"Do not replace variables in path, instead of, put them to the parameters object.\",\n            },\n            method: { const: method, description: methodSpec.summary || methodSpec.description },\n            ...(methodSpec.requestBody?.content?.[\"application/json\"]?.schema\n              ? {\n                  body: methodSpec.requestBody?.content?.[\"application/json\"]?.schema,\n                }\n              : {}),\n            ...(methodSpec.parameters\n              ? {\n                  parameters: {\n                    type: \"object\",\n                    additionalProperties: false,\n                    required: methodSpec.parameters\n                      .filter((p: any) => p.required === true)\n                      .map((p: any) => p.name),\n                    properties: methodSpec.parameters.reduce(\n                      (acc: any, p: any) =>\n                        !p.$ref\n                          ? { ...acc, [p.name]: { ...p.schema, description: p.name } }\n                          : {\n                              ...acc,\n                              [getReferencedObject(this.openApiSchema, p.$ref)?.name]: {\n                                ...getReferencedObject(this.openApiSchema, p.$ref)?.schema,\n                                description: getReferencedObject(this.openApiSchema, p.$ref)?.name,\n                              },\n                            },\n                      {},\n                    ),\n                  },\n                }\n              : {}),\n          },\n        })),\n      ),\n    } as const satisfies SchemaObject;\n  }\n\n  public readonly emitter: ToolEmitter<Record<string, any>, OpenAPIToolOutput, OpenAPIEvents>;\n\n  static {\n    this.register();\n  }\n\n  public constructor(options: OpenAPIToolOptions) {\n    super(options);\n\n    this.openApiSchema = parse(options.openApiSchema);\n\n    this.url = this.options.url || this.openApiSchema.servers?.find((s: any) => s?.url)?.url;\n    if (!this.url) {\n      throw new ValueError(\n        \"OpenAPI schema hasn't any server with url specified. Pass it manually.\",\n      );\n    }\n\n    this.name = options.name ?? this.openApiSchema?.info?.title?.trim();\n    if (!this.name) {\n      throw new ValueError(\"OpenAPI schema hasn't 'name' specified. Pass it manually.\");\n    }\n    this.emitter = Emitter.root.child({\n      namespace: [\"tool\", \"web\", \"openAPI\", toCamelCase(this.name)],\n      creator: this,\n    });\n\n    this.description =\n      options.description ||\n      this.openApiSchema?.info?.description ||\n      \"Performs REST API requests to the servers and retrieves the response. The server API interfaces are defined in OpenAPI schema. \\n\" +\n        \"Only use the OpenAPI tool if you need to communicate to external servers.\";\n\n    if (!this.description) {\n      throw new ValueError(\"OpenAPI schema hasn't 'description' specified. Pass it manually.\");\n    }\n  }\n\n  protected async _run(\n    input: Record<string, any>,\n    _options: Partial<BaseToolRunOptions>,\n    run: GetRunContext<typeof this>,\n  ) {\n    let path: string = input.path || \"\";\n    const url = new URL(this.url);\n    Object.keys(input.parameters ?? {}).forEach((key) => {\n      const value = input.parameters[key];\n      const newPath = path.replace(`{${key}}`, value);\n      if (newPath == path) {\n        url.searchParams.append(key, value);\n      } else {\n        path = newPath;\n      }\n    });\n    url.pathname = join(url.pathname, path);\n    const options: RequestInit = {\n      ...this.options.fetchOptions,\n      signal: AbortSignal.any([run.signal, this.options.fetchOptions?.signal].filter(isTruthy)),\n      body: !isEmpty(input.body) ? input.body : undefined,\n      method: input.method.toLowerCase(),\n      headers: { Accept: \"application/json\", ...this.options.fetchOptions?.headers },\n    };\n    await run.emitter.emit(\"beforeFetch\", { options: options, url: url });\n    try {\n      const response = await fetch(url.toString(), options);\n      const text = await response.text();\n      const output = new OpenAPIToolOutput(response.status, response.statusText, text);\n      await run.emitter.emit(\"afterFetch\", { data: output, url });\n      return output;\n    } catch (err) {\n      throw new ToolError(`Request to ${url} has failed.`, [err]);\n    }\n  }\n  createSnapshot() {\n    return {\n      ...super.createSnapshot(),\n      openApiSchema: clone(this.openApiSchema),\n      name: this.name,\n      description: this.description,\n      url: this.url,\n    };\n  }\n}\n"]}