{"version":3,"sources":["../../src/tools/openapi.ts"],"names":["OpenAPIToolOutput","StringToolOutput","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 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\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"]}