@smythos/sre 1.5.25 → 1.5.26

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/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import dotenv from"dotenv";import Joi from"joi";import"dotenv/config";import winston from"winston";import Transport from"winston-transport";import pLimit from"p-limit";import axios,{AxiosHeaders}from"axios";import*as fs from"fs";import fs__default,{existsSync,mkdirSync,writeFileSync,readFileSync,unlinkSync}from"fs";import*as FileType from"file-type";import{fileTypeFromBuffer}from"file-type";import{isBinaryFileSync}from"isbinaryfile";import EventEmitter$1,{EventEmitter}from"events";import crypto$1,{createHash,randomUUID}from"crypto";import{encode,encodeChat}from"gpt-tokenizer";import path from"path";import os from"os";import"process";import mime from"mime";import{Readable}from"stream";import xxhash from"xxhashjs";import{jsonrepair}from"jsonrepair";import yaml from"js-yaml";import{EventSource}from"eventsource";import*as acorn from"acorn";import dayjs from"dayjs";import querystring from"querystring";import{HfInference}from"@huggingface/inference";import{Runware}from"@runware/sdk-js";import FormData from"form-data";import{SocksProxyAgent}from"socks-proxy-agent";import OAuth from"oauth-1.0a";import zl from"zip-lib";import{LambdaClient,GetFunctionCommand,UpdateFunctionCodeCommand,Runtime,CreateFunctionCommand,InvokeCommand}from"@aws-sdk/client-lambda";import{IAMClient,GetRoleCommand,CreateRoleCommand}from"@aws-sdk/client-iam";import{Client}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport}from"@modelcontextprotocol/sdk/client/sse.js";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import imageSize from"image-size";import{execSync}from"child_process";import{Pinecone}from"@pinecone-database/pinecone";import OpenAI,{toFile,OpenAI as OpenAI$1}from"openai";import{MilvusClient,DataType,ErrorCode}from"@zilliz/milvus2-sdk-node";import{GoogleGenerativeAI}from"@google/generative-ai";import{GoogleAIFileManager,FileState}from"@google/generative-ai/server";import Anthropic from"@anthropic-ai/sdk";import Groq from"groq-sdk";import{BedrockRuntimeClient,ConverseCommand,ConverseStreamCommand}from"@aws-sdk/client-bedrock-runtime";import{VertexAI}from"@google-cloud/vertexai";import chokidar from"chokidar";import fs$1 from"fs/promises";import IORedis from"ioredis";import mysql from"mysql2/promise";import{SecretsManagerClient,ListSecretsCommand,GetSecretValueCommand,PutSecretValueCommand,CreateSecretCommand,DeleteSecretCommand}from"@aws-sdk/client-secrets-manager";import*as readlineSync from"readline-sync";var version="1.5.25";dotenv.config();const config={env:{LOG_LEVEL:process.env.LOG_LEVEL||"none",LOG_FILTER:process.env.LOG_FILTER||"",NODE_ENV:process.env?.NODE_ENV}},REQUEST_METHODS=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],REQUEST_CONTENT_TYPES={none:"none",urlEncodedFormData:"application/x-www-form-urlencoded",multipartFormData:"multipart/form-data",json:"application/json",text:"text/plain",xml:"application/xml",binary:"binary"};var EMBODIMENT_TYPES=(EMBODIMENT_TYPES2=>(EMBODIMENT_TYPES2.ChatBot="chatBot",EMBODIMENT_TYPES2.ChatGPT="chatGPT",EMBODIMENT_TYPES2))(EMBODIMENT_TYPES||{});const ERR_MSG_INVALID_IMAGE_SOURCE="Please provide a valid Image Source. Supported image sources are: HTTP(S) URL, Base64 string, Data URL, Output Image from other component(s).",ERR_MSG_INVALID_BINARY="Please provide a valid data that is either a Blob, SmythFileObject (Binary Output from any Component), ArrayBuffer, Buffer, Base64 string, Data URL, or HTTP(s) URL",ERR_MSG_MAX_DEPTH="The maximum depth has been exceeded for the provided array or object.",ERR_MSG_MAX_ARRAY_SIZE="The maximum array size has been exceeded for the provided array.",ERR_MSG_MAX_OBJECT_SIZE="The maximum object size has been exceeded for the provided object.",MAX_DEPTH=10,MAX_OBJECT_SIZE=1e3,MAX_ARRAY_SIZE=1e3,MAX_FILE_SIZE=10*1024*1024,MAX_FILE_COUNT=10,DEFAULT_MAX_TOKENS_FOR_LLM=2048,S3_DAILY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteDaily",S3_WEEKLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteWeekly",S3_MONTHLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteMonthly",TOOL_USE_DEFAULT_MODEL="gpt-4o-mini",COMP_NAMES={apiCall:"APICall",code:"Code",llmPrompt:"PromptGenerator",visionLLM:"VisionLLM"},JSON_RESPONSE_INSTRUCTION=`
1
+ import dotenv from"dotenv";import Joi from"joi";import"dotenv/config";import winston from"winston";import Transport from"winston-transport";import pLimit from"p-limit";import axios,{AxiosHeaders}from"axios";import*as fs from"fs";import fs__default,{existsSync,mkdirSync,writeFileSync,readFileSync,unlinkSync}from"fs";import*as FileType from"file-type";import{fileTypeFromBuffer}from"file-type";import{isBinaryFileSync}from"isbinaryfile";import EventEmitter$1,{EventEmitter}from"events";import crypto$1,{createHash,randomUUID}from"crypto";import{encode,encodeChat}from"gpt-tokenizer";import path from"path";import os from"os";import"process";import mime from"mime";import{Readable}from"stream";import xxhash from"xxhashjs";import{jsonrepair}from"jsonrepair";import yaml from"js-yaml";import{EventSource}from"eventsource";import*as acorn from"acorn";import dayjs from"dayjs";import querystring from"querystring";import{HfInference}from"@huggingface/inference";import{Runware}from"@runware/sdk-js";import FormData from"form-data";import{SocksProxyAgent}from"socks-proxy-agent";import OAuth from"oauth-1.0a";import zl from"zip-lib";import{LambdaClient,GetFunctionCommand,UpdateFunctionCodeCommand,Runtime,CreateFunctionCommand,InvokeCommand}from"@aws-sdk/client-lambda";import{IAMClient,GetRoleCommand,CreateRoleCommand}from"@aws-sdk/client-iam";import{Client}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport}from"@modelcontextprotocol/sdk/client/sse.js";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import imageSize from"image-size";import{execSync}from"child_process";import{Pinecone}from"@pinecone-database/pinecone";import OpenAI,{toFile,OpenAI as OpenAI$1}from"openai";import{MilvusClient,DataType,ErrorCode}from"@zilliz/milvus2-sdk-node";import{GoogleGenerativeAI}from"@google/generative-ai";import{GoogleAIFileManager,FileState}from"@google/generative-ai/server";import Anthropic from"@anthropic-ai/sdk";import Groq from"groq-sdk";import{BedrockRuntimeClient,ConverseCommand,ConverseStreamCommand}from"@aws-sdk/client-bedrock-runtime";import{VertexAI}from"@google-cloud/vertexai";import chokidar from"chokidar";import fs$1 from"fs/promises";import IORedis from"ioredis";import mysql from"mysql2/promise";import{SecretsManagerClient,ListSecretsCommand,GetSecretValueCommand,PutSecretValueCommand,CreateSecretCommand,DeleteSecretCommand}from"@aws-sdk/client-secrets-manager";import*as readlineSync from"readline-sync";var version="1.5.26";dotenv.config();const config={env:{LOG_LEVEL:process.env.LOG_LEVEL||"none",LOG_FILTER:process.env.LOG_FILTER||"",NODE_ENV:process.env?.NODE_ENV}},REQUEST_METHODS=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],REQUEST_CONTENT_TYPES={none:"none",urlEncodedFormData:"application/x-www-form-urlencoded",multipartFormData:"multipart/form-data",json:"application/json",text:"text/plain",xml:"application/xml",binary:"binary"};var EMBODIMENT_TYPES=(EMBODIMENT_TYPES2=>(EMBODIMENT_TYPES2.ChatBot="chatBot",EMBODIMENT_TYPES2.ChatGPT="chatGPT",EMBODIMENT_TYPES2))(EMBODIMENT_TYPES||{});const ERR_MSG_INVALID_IMAGE_SOURCE="Please provide a valid Image Source. Supported image sources are: HTTP(S) URL, Base64 string, Data URL, Output Image from other component(s).",ERR_MSG_INVALID_BINARY="Please provide a valid data that is either a Blob, SmythFileObject (Binary Output from any Component), ArrayBuffer, Buffer, Base64 string, Data URL, or HTTP(s) URL",ERR_MSG_MAX_DEPTH="The maximum depth has been exceeded for the provided array or object.",ERR_MSG_MAX_ARRAY_SIZE="The maximum array size has been exceeded for the provided array.",ERR_MSG_MAX_OBJECT_SIZE="The maximum object size has been exceeded for the provided object.",MAX_DEPTH=10,MAX_OBJECT_SIZE=1e3,MAX_ARRAY_SIZE=1e3,MAX_FILE_SIZE=10*1024*1024,MAX_FILE_COUNT=10,DEFAULT_MAX_TOKENS_FOR_LLM=2048,S3_DAILY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteDaily",S3_WEEKLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteWeekly",S3_MONTHLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteMonthly",TOOL_USE_DEFAULT_MODEL="gpt-4o-mini",COMP_NAMES={apiCall:"APICall",code:"Code",llmPrompt:"PromptGenerator",visionLLM:"VisionLLM"},JSON_RESPONSE_INSTRUCTION=`
2
2
  Respond ONLY with a valid, parsable JSON object. Follow these strict guidelines:
3
3
  1. The response must begin with '{' and end with '}'.
4
4
  2. Use double quotes for all keys and string values.
@@ -108,7 +108,7 @@ ${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var translati
108
108
  ${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}const ImageSettingsConfig={model:Joi.string().max(100).required(),positivePrompt:Joi.string().required().min(2).max(2e3).label("Positive Prompt"),negativePrompt:Joi.string().optional().allow("").min(2).max(2e3).label("Negative Prompt"),width:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),height:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),outputFormat:Joi.string().valid("JPG","PNG","WEBP").optional(),outputQuality:Joi.number().min(20).max(99).optional().label("Output Quality"),numberResults:Joi.number().min(1).max(20).optional().label("Number of Results"),steps:Joi.number().min(0).max(100).optional().label("Strength"),backgroundColor:Joi.array().items(Joi.number().when("$index",{is:3,then:Joi.number().min(0).max(1),otherwise:Joi.number().min(0).max(255).integer()}).required()).length(4).optional().allow("").label("Background Color").description("RGBA color array [red, green, blue, alpha]. RGB values must be between 0-255, alpha must be between 0-1"),strength:Joi.number().min(0).max(1).optional().label("Strength"),upscaleFactor:Joi.number().min(2).max(4).optional().label("Upscale Factor"),confidence:Joi.number().min(0).max(1).optional().label("Confidence"),maxDetections:Joi.number().min(1).max(20).optional().label("Max Detections"),maskPadding:Joi.number().min(0).max(100).optional().label("Mask Padding"),maskBlur:Joi.number().min(0).max(100).optional().label("Mask Blur"),preProcessorType:Joi.string().valid("canny","depth","mlsd","normalbae","openpose","tile","seg","lineart","lineart_anime","shuffle","scribble","softedge").optional().label("Pre-Processor Type"),ipAdapters:Joi.array().items(Joi.object({model:Joi.string().required().label("IP Adapter Model"),guideImage:Joi.string().required().min(2).max(10485760).label("Guide Image"),weight:Joi.number().required().min(0).max(1).label("IP Adapter Weight")})).optional().label("IP Adapters")};async function getCredentials(candidate,credentialsRequest){typeof credentialsRequest=="string"&&(credentialsRequest={vaultProvider:"",keyName:credentialsRequest});const credentials=await ConnectorService.getVaultConnector(credentialsRequest.vaultProvider||"").requester(candidate).get(credentialsRequest.keyName);if(!credentialsRequest.mapping)return credentials;const mappedCredentials={};for(const[key,value]of Object.entries(credentialsRequest.mapping))mappedCredentials[key]=JSONExpression(credentials,value);return mappedCredentials}function JSONExpression(obj,propertyString){const properties=propertyString.split(/\.|\[|\]\.|\]\[|\]/).filter(Boolean);let currentProperty=obj;for(let property of properties){if(currentProperty==null)return;currentProperty=currentProperty[property]}return currentProperty}var __defProp$Z=Object.defineProperty,__defNormalProp$Z=(obj,key,value)=>key in obj?__defProp$Z(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Z=(obj,key,value)=>__defNormalProp$Z(obj,key+"",value);const IMAGE_GEN_COST_MAP={"dall-e-3":{standard:{"1024x1024":.04,"1024x1792":.08,"1792x1024":.08},hd:{"1024x1024":.08,"1024x1792":.12,"1792x1024":.12}},"dall-e-2":{"256x256":.016,"512x512":.018,"1024x1024":.02}};class ImageGenerator extends Component{constructor(){super(),__publicField$Z(this,"configSchema",Joi.object({model:Joi.string().max(100).required(),prompt:Joi.string().optional().min(2).max(2e3).label("Prompt"),sizeDalle2:Joi.string().valid("256x256","512x512","1024x1024").optional(),sizeDalle3:Joi.string().valid("1024x1024","1792x1024","1024x1792").optional(),quality:Joi.string().valid("standard","hd","auto","high","medium","low").allow("").optional(),style:Joi.string().valid("vivid","natural").optional(),isRawInputPrompt:Joi.boolean().strict().optional(),negativePrompt:Joi.string().optional().allow("").min(2).max(2e3).label("Negative Prompt"),width:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),height:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),outputFormat:Joi.string().valid("PNG","JPEG","WEBP","auto","jpeg","png","webp").optional(),strength:ImageSettingsConfig.strength,size:Joi.string().optional().allow("").max(100).label("Size")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Image Generator Log ===");let model=config2?.data?.model;if(!model)return{_error:"Model Not Found: ",_debug:logger2.output};logger2.debug(`Model: ${model}`);let prompt=config2.data?.prompt||input?.Prompt;if(prompt=typeof prompt=="string"?prompt:JSON.stringify(prompt),prompt=TemplateString(prompt).parse(input).result,!prompt)return{_error:"Please provide a prompt or Image",_debug:logger2.output};logger2.debug(`Prompt:
109
109
  `,prompt);const modelFamily=await getModelFamily(model,agent);if(typeof imageGenerator[modelFamily]!="function")return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};try{const{output}=await imageGenerator[modelFamily]({model,config:config2,input,logger:logger2,agent,prompt});return logger2.debug("Output: ",output),{Output:output,_debug:logger2.output}}catch(error){return{_error:`Generating Image(s)
110
110
  ${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}const imageGenerator={gpt:async({model,prompt,config:config2,logger:logger2,agent,input})=>{let args={model,size:config2?.data?.size||"auto",quality:config2?.data?.quality||"auto"};try{const llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};const provider=await agent.modelsProvider.getProvider(model),files=parseFiles(input,config2),validFiles=files.filter(file=>imageGenerator.isValidImageFile(provider,file.mimetype));if(files.length>0&&validFiles.length===0)throw new Error("Supported image file types are: "+SUPPORTED_MIME_TYPES_MAP[provider]?.imageGen?.join(", "));let response;validFiles.length>0?response=await llmInference.imageEditRequest({query:prompt,files:validFiles,params:{...args,agentId:agent.id}}):response=await llmInference.imageGenRequest({query:prompt,params:{...args,agentId:agent.id}}),response?.usage&&imageGenerator.reportTokenUsage(response.usage,{modelEntryName:model,keySource:model.startsWith(BUILT_IN_MODEL_PREFIX)?APIKeySource.Smyth:APIKeySource.User,agentId:agent.id,teamId:agent.teamId});let output=response?.data?.[0]?.b64_json;const binaryInput=BinaryInput.from(output),agentId=typeof agent=="object"&&agent.id?agent.id:agent;return{output:await binaryInput.getJsonData(AccessCandidate.agent(agentId))}}catch(error){throw new Error(`OpenAI Image Generation Error: ${error?.message||JSON.stringify(error)}`)}},"dall-e":async({model,prompt,config:config2,logger:logger2,agent,input})=>{let _finalPrompt=prompt;if(parseFiles(input,config2).length>0)throw new Error("OpenAI Image Generation Error: DALL-E models do not support image editing or variations. Please use a different model.");const responseFormat=config2?.data?.responseFormat||"url";let args={responseFormat,model},cost=0;if(model==="dall-e-3"){const size=config2?.data?.sizeDalle3||"1024x1024",quality=config2?.data?.quality||"standard",style=config2?.data?.style||"vivid";args.size=size,args.quality=quality,args.style=style,config2?.data?.isRawInputPrompt&&(_finalPrompt=`I NEED to test how the tool works with extremely simple prompts. DO NOT add any detail, just use it AS-IS: ${prompt}`),cost=IMAGE_GEN_COST_MAP[model][quality][size]}else if(model==="dall-e-2"){const size=config2?.data?.sizeDalle2||"256x256",numberOfImages=parseInt(config2?.data?.numberOfImages)||1;args.size=size,args.n=numberOfImages,cost=IMAGE_GEN_COST_MAP[model][size]}const llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};const response=await llmInference.imageGenRequest({query:_finalPrompt,params:{...args,agentId:agent.id}});let output=response?.data?.[0]?.[responseFormat];const revised_prompt=response?.data?.[0]?.revised_prompt;return revised_prompt&&prompt!==revised_prompt&&logger2.debug(`Revised Prompt:
111
- ${revised_prompt}`),imageGenerator.reportUsage({cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}},runware:async({model,prompt,config:config2,agent,input})=>{const teamId=agent.teamId,apiKey=await getCredentials(AccessCandidate.team(teamId),"runware"),runware=new Runware({apiKey});await runware.ensureConnection();const negativePrompt=config2?.data?.negativePrompt||"",files=parseFiles(input,config2);let seedImage=Array.isArray(files)?files[0]:files;seedImage=await normalizeImageInput(seedImage);const imageRequestArgs={model:await agent.modelsProvider.getModelId(model),positivePrompt:prompt,width:+config2?.data?.width||1024,height:+config2?.data?.height||1024,numberResults:1,outputType:"URL",outputFormat:config2?.data?.outputFormat||"JPEG",includeCost:!0};seedImage&&(imageRequestArgs.seedImage=seedImage,imageRequestArgs.strength=+config2?.data?.strength||.5),negativePrompt&&(imageRequestArgs.negativePrompt=negativePrompt);try{const firstImage=(await runware.requestImages(imageRequestArgs))[0];let output=firstImage.imageURL;return imageGenerator.reportUsage({cost:firstImage.cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}}catch(error){throw new Error(`Runware Image Generation Error: ${error?.message||JSON.stringify(error)}`)}finally{await runware.disconnect()}},reportTokenUsage(usage,metadata){const usageData={sourceId:`api:imagegen.${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,keySource:metadata.keySource,input_tokens_txt:usage?.input_tokens_details?.text_tokens||0,input_tokens_img:usage?.input_tokens_details?.image_tokens||0,output_tokens:usage?.output_tokens,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},reportUsage(usage,metadata){const usageData={sourceId:"api:imagegen.smyth",keySource:metadata.keySource,cost:usage?.cost,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},isValidImageFile(provider,mimetype){return SUPPORTED_MIME_TYPES_MAP[provider]?.imageGen?.includes(mimetype)}};async function getModelFamily(model,agent){return await isGPTModel(model)?"gpt":await isRunwareModel(model,agent)?"runware":await isDallEModel(model)?"dall-e":null}function isGPTModel(model){return model?.replace(BUILT_IN_MODEL_PREFIX,"")?.startsWith("gpt")}async function isRunwareModel(model,agent){const provider=await agent.modelsProvider.getProvider(model);return provider==="Runware"||provider.toLowerCase()==="Runware".toLowerCase()}function isDallEModel(model){return model?.replace(BUILT_IN_MODEL_PREFIX,"")?.startsWith("dall-e")}function parseFiles(input,config2){const mediaTypes=["Image","Audio","Video","Binary"];return config2.inputs?.filter(_input=>mediaTypes.includes(_input.type))?.flatMap(_input=>{const value=input[_input.name];return Array.isArray(value)?value.map(item=>TemplateString(item).parseRaw(input).result):TemplateString(value).parseRaw(input).result})?.filter(file=>file)||[]}var __defProp$Y=Object.defineProperty,__defNormalProp$Y=(obj,key,value)=>key in obj?__defProp$Y(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Y=(obj,key,value)=>__defNormalProp$Y(obj,key+"",value);class PromptGenerator extends Component{constructor(){super(),__publicField$Y(this,"configSchema",Joi.object({model:Joi.string().max(200).required(),prompt:Joi.string().required().max(8e6).label("Prompt"),temperature:Joi.number().min(0).max(5).label("Temperature"),maxTokens:Joi.number().min(1).label("Maximum Tokens"),stopSequences:Joi.string().allow("").max(400).label("Stop Sequences"),topP:Joi.number().min(0).max(1).label("Top P"),topK:Joi.number().min(0).max(500).label("Top K"),frequencyPenalty:Joi.number().min(0).max(2).label("Frequency Penalty"),presencePenalty:Joi.number().min(0).max(2).label("Presence Penalty"),responseFormat:Joi.string().valid("json","text").optional().label("Response Format"),passthrough:Joi.boolean().optional().label("Passthrough")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== LLM Prompt Log ===");let teamId=agent?.teamId;const passThrough=config2.data.passthrough||!1,model=config2.data.model||"echo",llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};const modelId=await agent.modelsProvider.getModelId(model);logger2.debug(` Model : ${modelId||model}`);let prompt=TemplateString(config2.data.prompt).parse(input).result;logger2.debug(` Prompt
111
+ ${revised_prompt}`),imageGenerator.reportUsage({cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}},runware:async({model,prompt,config:config2,agent,input})=>{const teamId=agent.teamId,apiKey=await getCredentials(AccessCandidate.team(teamId),"runware");if(!apiKey)throw new Error("Runware API key is missing. Please provide a valid key to continue.");const runware=new Runware({apiKey});await runware.ensureConnection();const negativePrompt=config2?.data?.negativePrompt||"",files=parseFiles(input,config2);let seedImage=Array.isArray(files)?files[0]:files;seedImage=await normalizeImageInput(seedImage);const imageRequestArgs={model:await agent.modelsProvider.getModelId(model),positivePrompt:prompt,width:+config2?.data?.width||1024,height:+config2?.data?.height||1024,numberResults:1,outputType:"URL",outputFormat:config2?.data?.outputFormat||"JPEG",includeCost:!0};seedImage&&(imageRequestArgs.seedImage=seedImage,imageRequestArgs.strength=+config2?.data?.strength||.5),negativePrompt&&(imageRequestArgs.negativePrompt=negativePrompt);try{const firstImage=(await runware.requestImages(imageRequestArgs))[0];let output=firstImage.imageURL;return imageGenerator.reportUsage({cost:firstImage.cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}}catch(error){throw new Error(`Runware Image Generation Error: ${error?.message||JSON.stringify(error)}`)}finally{await runware.disconnect()}},reportTokenUsage(usage,metadata){const usageData={sourceId:`api:imagegen.${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,keySource:metadata.keySource,input_tokens_txt:usage?.input_tokens_details?.text_tokens||0,input_tokens_img:usage?.input_tokens_details?.image_tokens||0,output_tokens:usage?.output_tokens,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},reportUsage(usage,metadata){const usageData={sourceId:"api:imagegen.smyth",keySource:metadata.keySource,cost:usage?.cost,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},isValidImageFile(provider,mimetype){return SUPPORTED_MIME_TYPES_MAP[provider]?.imageGen?.includes(mimetype)}};async function getModelFamily(model,agent){return await isGPTModel(model)?"gpt":await isRunwareModel(model,agent)?"runware":await isDallEModel(model)?"dall-e":null}function isGPTModel(model){return model?.replace(BUILT_IN_MODEL_PREFIX,"")?.startsWith("gpt")}async function isRunwareModel(model,agent){const provider=await agent.modelsProvider.getProvider(model);return provider==="Runware"||provider.toLowerCase()==="Runware".toLowerCase()}function isDallEModel(model){return model?.replace(BUILT_IN_MODEL_PREFIX,"")?.startsWith("dall-e")}function parseFiles(input,config2){const mediaTypes=["Image","Audio","Video","Binary"];return config2.inputs?.filter(_input=>mediaTypes.includes(_input.type))?.flatMap(_input=>{const value=input[_input.name];return Array.isArray(value)?value.map(item=>TemplateString(item).parseRaw(input).result):TemplateString(value).parseRaw(input).result})?.filter(file=>file)||[]}var __defProp$Y=Object.defineProperty,__defNormalProp$Y=(obj,key,value)=>key in obj?__defProp$Y(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Y=(obj,key,value)=>__defNormalProp$Y(obj,key+"",value);class PromptGenerator extends Component{constructor(){super(),__publicField$Y(this,"configSchema",Joi.object({model:Joi.string().max(200).required(),prompt:Joi.string().required().max(8e6).label("Prompt"),temperature:Joi.number().min(0).max(5).label("Temperature"),maxTokens:Joi.number().min(1).label("Maximum Tokens"),stopSequences:Joi.string().allow("").max(400).label("Stop Sequences"),topP:Joi.number().min(0).max(1).label("Top P"),topK:Joi.number().min(0).max(500).label("Top K"),frequencyPenalty:Joi.number().min(0).max(2).label("Frequency Penalty"),presencePenalty:Joi.number().min(0).max(2).label("Presence Penalty"),responseFormat:Joi.string().valid("json","text").optional().label("Response Format"),passthrough:Joi.boolean().optional().label("Passthrough")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== LLM Prompt Log ===");let teamId=agent?.teamId;const passThrough=config2.data.passthrough||!1,model=config2.data.model||"echo",llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};const modelId=await agent.modelsProvider.getModelId(model);logger2.debug(` Model : ${modelId||model}`);let prompt=TemplateString(config2.data.prompt).parse(input).result;logger2.debug(` Prompt
112
112
  `,prompt,`
113
113
  `),config2.data.responseFormat=config2.data?.responseFormat||"json";let response;if(passThrough?response=await new Promise(async(resolve,reject)=>{let _content="";const eventEmitter=await llmInference.promptStream({query:prompt,params:{...config2,model,agentId:agent.id}}).catch(error=>{console.error("Error on promptStream: ",error),reject(error)});eventEmitter.on("content",content=>{typeof agent.callback=="function"&&agent.callback({content}),agent.sse.send("llm/passthrough/content",content),_content+=content}),eventEmitter.on("thinking",thinking=>{typeof agent.callback=="function"&&agent.callback({thinking}),agent.sse.send("llm/passthrough/thinking",thinking)}),eventEmitter.on("end",()=>{console.log("end"),resolve(_content)})}):response=await llmInference.prompt({query:prompt,params:{...config2,agentId:agent.id}}).catch(error=>({error})),!response)return{_error:" LLM Error = Empty Response!",_debug:logger2.output};if(response?.error){const error=response?.error+" "+(response?.details||"");return logger2.error(" LLM Error=",error),{Reply:response?.data,_error:error,_debug:logger2.output}}logger2.debug(` Response
114
114
  `,response);const result={Reply:response};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}async function parseHeaders(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{},contentType=config2?.data?.contentType||REQUEST_CONTENT_TYPES.none;let headers=typeof config2?.data?.headers=="object"?JSON.stringify(config2?.data?.headers):config2?.data?.headers||"{}";config2.data._templateVars&&templateSettings&&(headers=await TemplateString(headers).parseComponentTemplateVarsAsync(templateSettings).asyncResult,headers=await TemplateString(headers).parse(config2.data._templateVars).result),headers=await TemplateString(headers).parseTeamKeysAsync(teamId).asyncResult,headers=TemplateString(headers).parse(input).clean().result;let jsonHeaders=JSONContent(headers).tryParse();return typeof jsonHeaders!="object"&&(jsonHeaders={"x-smyth-error":"Error parsing headers"}),jsonHeaders=Object.fromEntries(Object.entries(jsonHeaders).map(([key,value])=>[key.toLowerCase(),value])),!jsonHeaders["content-type"]&&contentType!=="none"&&(jsonHeaders["content-type"]=contentType),new AxiosHeaders(jsonHeaders)}async function parseUrl(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{};let url=config2?.data?.url.replace(/\+/g,"%20");return config2.data._templateVars&&templateSettings&&(url=await TemplateString(url).parseComponentTemplateVarsAsync(templateSettings).asyncResult,url=await TemplateString(url).parse(config2.data._templateVars).result),url=await TemplateString(url).parseTeamKeysAsync(teamId).asyncResult,url=TemplateString(url).parse(input).clean().result,new URL(url).href}async function parseSmythFsUrl(url,agent){const urlObj=new URL(url),searchParams=urlObj.searchParams,publicUrls=[];for(const[key,value]of searchParams.entries())if(value.startsWith("smythfs://")){const pubUrl=await SmythFS.Instance.genTempUrl(value,AccessCandidate.agent(agent.id));publicUrls.push(pubUrl),searchParams.set(key,pubUrl)}return{url:urlObj.href,publicUrls}}async function destroyPublicUrls(publicUrls){try{await Promise.all(publicUrls.map(url=>SmythFS.Instance.destroyTempUrl(url))),console.log("Successfully cleaned up all temp urls for API Call Component")}catch(error){console.warn("Failed to clean up temp urls for API Call Component:",error)}return!0}async function parseData(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{},contentType=config2?.data?.contentType||REQUEST_CONTENT_TYPES.none;let body=typeof config2?.data?.body=="string"?config2?.data?.body?.trim():config2?.data?.body;if(!body)return{data:null,headers:{}};config2.data._templateVars&&templateSettings&&(body=await TemplateString(body).parseComponentTemplateVarsAsync(templateSettings).asyncResult),body=await TemplateString(body).parseTeamKeysAsync(teamId).asyncResult;const handler={[REQUEST_CONTENT_TYPES.json]:handleJson,[REQUEST_CONTENT_TYPES.urlEncodedFormData]:handleUrlEncoded,[REQUEST_CONTENT_TYPES.multipartFormData]:handleMultipartFormData,[REQUEST_CONTENT_TYPES.binary]:handleBinary,[REQUEST_CONTENT_TYPES.text]:handleText,[REQUEST_CONTENT_TYPES.none]:handleNone}[contentType]||handleNone,{data=null,headers={}}=await handler(body,input,config2,agent);return{data,headers}}async function handleJson(body,input,config2,agent){const data=TemplateString(body).parse(config2.data._templateVars).parse(input).clean().result;return{data:JSONContent(data).tryParse()}}async function handleUrlEncoded(body,input,config2,agent){const data=TemplateString(body).parse(config2.data._templateVars).parse(input).clean().result,jsonData=JSONContent(data).tryParse();if(typeof jsonData=="object"){const params=new URLSearchParams;for(const key in jsonData)params.append(key,String(jsonData[key]));return{data:params.toString()}}return{data:jsonData}}async function handleMultipartFormData(body,input,config2,agent){const formData=new FormData,_body=typeof body=="string"?JSON.parse(body):body;for(const key in _body){let value=_body[key];if(value=typeof value=="boolean"?String(value):value,value=TemplateString(value).parseRaw(input).result,value instanceof BinaryInput){const buffer=await value.getBuffer(),bufferStream=new Readable;bufferStream.push(buffer||null),bufferStream.push(null);const filename=await value.getName()||key;formData.append(key,bufferStream,{filename,contentType:value.mimetype})}else if(value&&typeof value=="object"&&value?.url){const binaryInput=await BinaryInput.from(value.url,"",value?.mimetype),buffer=await binaryInput.getBuffer(),bufferStream=new Readable;bufferStream.push(buffer||null),bufferStream.push(null);const filename=await binaryInput.getName()||key;formData.append(key,bufferStream,{filename,contentType:binaryInput.mimetype})}else value=TemplateString(value).parse(config2.data._templateVars).parse(input).clean().result,value&&formData.append(key,value)}return{data:formData,headers:formData.getHeaders()}}async function handleBinary(body,input,config2,agent){const value=TemplateString(body).parseRaw(input).result;if(value&&value instanceof BinaryInput)return{data:await value.getBuffer(),headers:{"Content-Type":value.mimetype}};if(value&&typeof value=="object"&&value?.url){const binaryInput=await BinaryInput.from(value.url,"",value?.mimetype);return{data:await binaryInput.getBuffer(),headers:{"Content-Type":binaryInput.mimetype}}}return{data:Buffer.from([]),headers:{}}}async function handleNone(body,input,config2,agent){return{data:typeof body=="string"?body:JSON.stringify(body),headers:{}}}function handleText(body,input,config2,agent){return{data:TemplateString(body).parse(config2.data._templateVars).parse(input).clean().result}}async function parseProxy(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{};let proxy=config2?.data?.proxy;if(!proxy)return!1;proxy=decodeURIComponent(proxy),config2.data._templateVars&&templateSettings&&(proxy=await TemplateString(proxy).parseComponentTemplateVarsAsync(templateSettings).parse(config2.data._templateVars).asyncResult),proxy=await TemplateString(proxy).parseTeamKeysAsync(teamId).asyncResult,proxy=TemplateString(proxy).parse(input).clean().result;const proxyList=proxy.split(/\n|\\n/).filter(p=>p)||[],randomIdx=Math.floor(Math.random()*proxyList?.length),proxyUrl=proxyList[randomIdx]?.trim(),urlObj=new URL(proxyUrl),protocol=urlObj.protocol.replace(":","");let proxyConfig;if(urlObj.protocol.startsWith("socks")){let proxyUrlString=`${protocol}://${urlObj.hostname}:${urlObj.port}`;(protocol==="socks4"||protocol==="socks4a")&&urlObj.username?proxyUrlString=`${protocol}://${urlObj.username}@${urlObj.hostname}:${urlObj.port}`:protocol==="socks5"&&urlObj.username&&(proxyUrlString=`${protocol}://${urlObj.username}:${urlObj.password}@${urlObj.hostname}:${urlObj.port}`),proxyConfig=new SocksProxyAgent(proxyUrlString)}else proxyConfig={protocol,host:urlObj.hostname,port:parseInt(urlObj.port),auth:urlObj.username?{username:urlObj.username,password:urlObj.password}:void 0};return proxyConfig}const mimeTypeCategories={binary:["image/","multipart/form-data","video/","application/msword","application/octet-stream","application/pdf","application/vnd.ms-excel","application/vnd.ms-powerpoint","application/vnd.oasis.opendocument.text","application/vnd.openxmlformats-officedocument","application/zip","application/x-7z-compressed","application/x-rar-compressed","application/x-tar","application/x-bzip","application/x-bzip2","application/x-gzip","application/vnd.android.package-archive","application/vnd.visio","application/x-deb","application/x-rpm","application/x-executable","font/ttf","font/otf","font/woff","font/woff2","model/"],json:["application/graphql","application/json","application/ld+json","application/vnd.api+json"],text:["text/","application/xml","application/xhtml+xml","application/csv","application/x-www-form-urlencoded","application/x-yaml","application/yaml","application/javascript","application/sql","application/rtf"]},contentHandlers={json:parseJson,text:parseText,binary:parseBinary};function parseJson(data){return JSON.parse(Buffer.from(data).toString("utf8")||"{}")}function parseText(data){return Buffer.from(data).toString("utf8")}async function parseBinary(data,contentType,agentId){return await BinaryInput.from(data,null,contentType).getJsonData(AccessCandidate.agent(agentId))}async function parseArrayBufferResponse(response,agent){if(!response?.data)return null;const data=response.data,contentType=response.headers["content-type"],cleanContentType=contentType?.split(";")[0];let handlerType=Object.keys(mimeTypeCategories).find(type=>mimeTypeCategories[type].includes(cleanContentType));handlerType||(handlerType=Object.keys(mimeTypeCategories).find(type=>mimeTypeCategories[type].some(prefix=>cleanContentType?.startsWith(prefix))));const handler=contentHandlers[handlerType];return handler?handler(data,contentType,agent.id):isBinaryMimeType(contentType)||isBinaryData(data)?parseBinary(data,contentType,agent.id):parseText(data)}var __defProp$X=Object.defineProperty,__defNormalProp$X=(obj,key,value)=>key in obj?__defProp$X(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$X=(obj,key,value)=>__defNormalProp$X(obj,typeof key!="symbol"?key+"":key,value);const console$p=Logger("AccessTokenManager");let managedVault$1;SystemEvents.on("SRE:Booted",()=>{managedVault$1=ConnectorService.getManagedVaultConnector()});class AccessTokenManager{constructor(clientId,clientSecret,secondaryToken,tokenUrl,expires_in,primaryToken,data,keyId,logger2,agent){__publicField$X(this,"clientId"),__publicField$X(this,"clientSecret"),__publicField$X(this,"primaryToken"),__publicField$X(this,"secondaryToken"),__publicField$X(this,"tokenUrl"),__publicField$X(this,"expires_in"),__publicField$X(this,"data"),__publicField$X(this,"keyId"),__publicField$X(this,"logger"),__publicField$X(this,"agent"),this.clientId=clientId,this.clientSecret=clientSecret,this.primaryToken=primaryToken,this.secondaryToken=secondaryToken,this.tokenUrl=tokenUrl,this.expires_in=expires_in,this.data=data,this.keyId=keyId,this.logger=logger2,this.agent=agent}async getAccessToken(){try{const currentTime=new Date().getTime();if(!this.secondaryToken&&!this.expires_in)return console$p.log("Using long-lived access token"),this.logger.debug("Using long-lived access token. If authentication failes, please re-authenticate and try again"),this.primaryToken;if(!this.expires_in||currentTime>=Number(this.expires_in)){if(!this.secondaryToken)throw this.logger.debug("Refresh token is missing. Please re authenticate"),console$p.log("Refresh token is missing. Please re authenticate..."),new Error("Reauthentication required");return this.logger.debug("Access token is expired or missing. Refreshing access token..."),console$p.log("Access token is expired or missing. Refreshing access token..."),await this.refreshAccessToken()}else return console$p.log("Access token is still valid"),this.logger.debug("Access token is still valid."),this.primaryToken}catch(error){throw console$p.error("Error fetching access token:",error),this.logger.debug("Error fetching access token"),error}}async refreshAccessToken(){try{const response=await axios.post(this.tokenUrl,new URLSearchParams({client_id:this.clientId,client_secret:this.clientSecret,refresh_token:this.secondaryToken,grant_type:"refresh_token"}).toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}}),newAccessToken=response?.data?.access_token;console$p.log("Access token refreshed successfully."),this.logger.debug("Access token refreshed successfully.");const expiresInMilliseconds=response?.data?.expires_in?response?.data?.expires_in*1e3:response?.data?.expires_in,expirationTimestamp=expiresInMilliseconds&&new Date().getTime()+expiresInMilliseconds;this.data.primary=newAccessToken,this.data.expires_in=expirationTimestamp&&expirationTimestamp?.toString();const save=await managedVault$1.user(AccessCandidate.agent(this.agent.id)).set(this.keyId,JSON.stringify(this.data));return save&&save.status===200?(console$p.log("Access token value is updated successfully."),this.logger.debug("Access token value is updated successfully.")):(console$p.log("Warning: new access token value is not updated."),this.logger.debug("Warning: new access token value is not updated.")),newAccessToken}catch(error){throw console$p.error("Failed to refresh access token:",error),this.logger.debug(`Failed to refresh access token: ${error}`),new Error("Failed to refresh access token.")}}}const console$o=Logger("OAuth.helper");let managedVault;SystemEvents.on("SRE:Booted",()=>{try{managedVault=ConnectorService.getManagedVaultConnector()}catch{console$o.warn("Could not find a compatible ManagedVault connector, OAuth APICalls will not work")}});function extractAdditionalParamsForOAuth1(reqConfig={}){let additionalParams={};const searchParams=new URL(reqConfig.url).searchParams;additionalParams=Object.fromEntries(searchParams.entries());const contentType=reqConfig.headers?.["Content-Type"]||"";if(contentType===REQUEST_CONTENT_TYPES.urlEncodedFormData){if(typeof reqConfig.data=="string"){const formData=new URLSearchParams(reqConfig.data);additionalParams={...additionalParams,...Object.fromEntries(formData)}}}else if(contentType===REQUEST_CONTENT_TYPES.json){if(reqConfig.data){const hash=crypto$1.createHash("sha1").update(JSON.stringify(reqConfig.data)).digest("base64");additionalParams.oauth_body_hash=hash}}else if(contentType===REQUEST_CONTENT_TYPES.multipartFormData){const formData=reqConfig.data;for(const[key,value]of formData.entries())typeof value=="object"&&value!==null&&"size"in value&&"type"in value||(additionalParams[key]=value)}return additionalParams}const buildOAuth1Header=(url,method,oauth1Credentials,additionalParams={})=>{const oauth=new OAuth({consumer:{key:oauth1Credentials.consumerKey,secret:oauth1Credentials.consumerSecret},signature_method:"HMAC-SHA1",hash_function(base_string,key){return crypto$1.createHmac("sha1",key).update(base_string).digest("base64")}}),requestData={url,method,...additionalParams},signedRequest=oauth.authorize(requestData,{key:oauth1Credentials.token,secret:oauth1Credentials.tokenSecret});return oauth.toHeader(signedRequest)},retrieveOAuthTokens=async(agent,config2)=>{let tokenKey=null;try{tokenKey=`OAUTH_${config2.componentId??config2.id}_TOKENS`;try{const result=await managedVault.user(AccessCandidate.agent(agent.id)).get(tokenKey),tokensData=typeof result=="object"?result:JSON.parse(result||"{}");if(!tokensData)throw new Error("Failed to retrieve OAuth tokens from vault. Please authenticate ...");const primaryToken=tokensData.primary,secondaryToken=tokensData.secondary,type=tokensData.type;if(type==="oauth2"&&config2.data.oauthService!=="OAuth2 Client Credentials"&&(secondaryToken||console$o.warn("Warning: refresh_token is missing for OAuth2"),tokensData.expires_in||console$o.warn("Warning: expires_in is missing for OAuth2.")),config2.data.oauthService!=="OAuth2 Client Credentials"&&!primaryToken)throw new Error("Retrieved OAuth tokens do not exist, invalid OR incomplete. Please authenticate ...");const responseData={primaryToken,secondaryToken,type};return type==="oauth"?("consumerKey"in tokensData&&(responseData.consumerKey=tokensData.consumerKey),"consumerSecret"in tokensData&&(responseData.consumerSecret=tokensData.consumerSecret),responseData.team=tokensData.team):type==="oauth2"&&(responseData.tokenURL=tokensData.tokenURL,"clientID"in tokensData&&(responseData.clientID=tokensData.clientID),"clientSecret"in tokensData&&(responseData.clientSecret=tokensData.clientSecret),responseData.expiresIn=tokensData.expires_in??0,responseData.team=tokensData.team),{responseData,data:tokensData,keyId:tokenKey}}catch(error){throw new Error(`Failed to parse retrieved tokens: ${error}`)}}catch(error){throw console$o.error("Error retrieving OAuth tokens:",error),error}},handleOAuthHeaders=async(agent,config2,reqConfig,logger2,additionalParams={},rootUrl)=>{let headers={};const{responseData:oauthTokens,data,keyId}=await retrieveOAuthTokens(agent,config2);try{const keys=["consumerKey","consumerSecret","clientID","clientSecret"];let oAuthConfigString=JSON.stringify({consumerKey:config2.data.consumerKey,consumerSecret:config2.data.consumerSecret,clientID:config2.data.clientID,clientSecret:config2.data.clientSecret,tokenURL:config2.data.tokenURL});oAuthConfigString=await TemplateString(oAuthConfigString).parseTeamKeysAsync(oauthTokens.team||agent.teamId).asyncResult;const oAuthConfig=JSON.parse(oAuthConfigString);if(oAuthConfig.oauthService==="OAuth2 Client Credentials"){const accessToken=await getClientCredentialToken(data,logger2,keyId,oauthTokens,config2,agent);headers.Authorization=`Bearer ${accessToken}`}else if(oauthTokens.type==="oauth"){const oauthHeader=buildOAuth1Header(rootUrl,reqConfig.method,{consumerKey:oAuthConfig.consumerKey,consumerSecret:oAuthConfig.consumerSecret,token:oauthTokens.primaryToken,tokenSecret:oauthTokens.secondaryToken},additionalParams);headers={...reqConfig.headers,...oauthHeader},logger2.debug("OAuth1 access token check success.")}else if(oauthTokens.type==="oauth2"){const accessToken=await new AccessTokenManager(oAuthConfig.clientID,oAuthConfig.clientSecret,oauthTokens.secondaryToken,oAuthConfig.tokenURL,oauthTokens.expiresIn,oauthTokens.primaryToken,data,keyId,logger2,agent).getAccessToken();headers.Authorization=`Bearer ${accessToken}`}return headers}catch(error){throw logger2.error(`Access token check failed: ${error}`),error}};async function getClientCredentialToken(data,logger2,keyId,oauthTokens,config2,agent){const logAndThrowError=message=>{throw logger2.debug(message),new Error(message)};try{data=data[keyId]||{};const{clientID,clientSecret,tokenURL}=config2.data,currentTime=new Date().getTime();if(!oauthTokens.expiresIn||currentTime>=Number(oauthTokens.expiresIn)){(!clientID||!clientSecret||!tokenURL)&&logAndThrowError("Missing client_id, client_secret OR token_url");const params=new URLSearchParams({grant_type:"client_credentials",client_id:clientID,client_secret:clientSecret}),response=await axios.post(tokenURL,params.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}});console$o.log("Access token refreshed successfully."),logger2.debug("Access token refreshed successfully.");const newAccessToken=response.data.access_token,expiresInMilliseconds=response.data.expires_in*1e3,expirationTimestamp=currentTime+expiresInMilliseconds;return Object.keys(data).length===0&&(data={primary:"",secondary:"",type:"oauth2",tokenURL,expires_in:"",team:agent.teamId,oauth_info:{oauth_keys_prefix:`OAUTH_${config2.componentId??config2.id}`,service:"oauth2_client_credentials",tokenURL,clientID,clientSecret}}),data.primary=newAccessToken,data.expires_in=expirationTimestamp.toString(),await managedVault.user(AccessCandidate.agent(agent.id)).set(keyId,data),newAccessToken}else return console$o.log("Access token value is still valid."),logger2.debug("Access token value is still valid."),oauthTokens.primaryToken}catch(error){logAndThrowError(`Failed to refresh access token: ${error}`)}}var __defProp$W=Object.defineProperty,__defNormalProp$W=(obj,key,value)=>key in obj?__defProp$W(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$W=(obj,key,value)=>__defNormalProp$W(obj,typeof key!="symbol"?key+"":key,value);class APICall extends Component{constructor(){super(),__publicField$W(this,"schema",{name:"APICall",description:"Use this component to make an API call",inputs:{},outputs:{Headers:{description:"The headers of the API call response",default:!0},Response:{description:"The response of the API call",default:!0}}}),__publicField$W(this,"configSchema",Joi.object({method:Joi.string().valid("GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS").required().label("Method"),url:Joi.string().max(8192).required().label("URL"),headers:Joi.any().allow("").label("Headers"),contentType:Joi.string().valid("none","application/json","multipart/form-data","binary","application/x-www-form-urlencoded","text/plain","application/xml").label("Content-Type"),body:Joi.any().allow("").label("Body"),_templateSettings:Joi.object().allow(null).label("Template Settings"),_templateVars:Joi.object().allow(null).label("Template Variables"),proxy:Joi.string().allow("").label("Proxy"),oauthService:Joi.string().allow("").label("OAuth Service"),scope:Joi.string().allow("").label("Scope"),authorizationURL:Joi.string().allow("").label("Authorization URL"),tokenURL:Joi.string().allow("").label("Token URL"),clientID:Joi.string().allow("").label("Client ID"),clientSecret:Joi.string().allow("").label("Client Secret"),oauth2CallbackURL:Joi.string().allow("").label("OAuth2 Callback URL"),callbackURL:Joi.string().allow("").label("Callback URL"),requestTokenURL:Joi.string().allow("").label("Request Token URL"),accessTokenURL:Joi.string().allow("").label("Access Token URL"),userAuthorizationURL:Joi.string().allow("").label("User Authorization URL"),consumerKey:Joi.string().allow("").label("Consumer Key"),consumerSecret:Joi.string().allow("").label("Consumer Secret"),oauth1CallbackURL:Joi.string().allow("").label("OAuth1 Callback URL"),authenticate:Joi.string().allow("").label("Authenticate")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);let publicUrls=[];try{logger2.debug("=== API Call Log ===");const method=config2?.data?.method||"get",reqConfig={};reqConfig.method=method,reqConfig.url=await parseUrl(input,config2,agent),{url:reqConfig.url,publicUrls}=await parseSmythFsUrl(reqConfig.url,agent);const{data,headers}=await parseData(input,config2,agent);let dataForDebug;data&&(reqConfig.data=data,dataForDebug=await formatDataForDebug(data)),reqConfig.headers=(await parseHeaders(input,config2,agent)).concat({...headers});const proxyConfig=await parseProxy(input,config2,agent);if(proxyConfig)if(proxyConfig instanceof SocksProxyAgent){const isSecureEndpoint=reqConfig.url?.startsWith("https://");reqConfig[isSecureEndpoint?"httpsAgent":"httpAgent"]=proxyConfig}else reqConfig.proxy=proxyConfig;let Response={},Headers={},_error;try{if(config2?.data?.oauthService&&config2?.data?.oauthService!=="None"){const rootUrl=new URL(reqConfig.url).origin,additionalParams=extractAdditionalParamsForOAuth1(reqConfig),oauthHeaders=await handleOAuthHeaders(agent,config2,reqConfig,logger2,additionalParams,rootUrl);reqConfig.headers=reqConfig.headers.concat({...oauthHeaders})}reqConfig.responseType="arraybuffer",logger2.debug("Making API call",{...reqConfig,data:dataForDebug});const response=await axios.request(reqConfig),parsedRes=await parseArrayBufferResponse(response,agent);logger2.debug("API call Response Headers",response.headers),Response=parsedRes,logger2.debug(`API call Response