@smythos/sre 1.5.64 → 1.5.65

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 path from"path";import os from"os";import"process";import mime from"mime";import{encodeChat,encode}from"gpt-tokenizer";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,UpdateFunctionConfigurationCommand}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{StreamableHTTPClientTransport}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import"ses";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,FunctionCallingMode}from"@google/generative-ai";import{GoogleAIFileManager,FileState}from"@google/generative-ai/server";import{GoogleGenAI}from"@google/genai";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*as chokidar from"chokidar";import chokidar__default 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.64",pkg={version};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 path from"path";import os from"os";import"process";import mime from"mime";import{encodeChat,encode}from"gpt-tokenizer";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,UpdateFunctionConfigurationCommand}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{StreamableHTTPClientTransport}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import"ses";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,FunctionCallingMode}from"@google/generative-ai";import{GoogleAIFileManager,FileState}from"@google/generative-ai/server";import{GoogleGenAI}from"@google/genai";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*as chokidar from"chokidar";import chokidar__default 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.65",pkg={version};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.
@@ -34,7 +34,7 @@ ${this.systemPrompt}`),this.patchSpec(spec2)}const agentDataConnector=ConnectorS
34
34
 
35
35
  ${this.systemPrompt}`),this._toolStatusMap=agentData?.data?.components?.filter(component=>component.name==="APIEndpoint").reduce((map,component)=>(component?.data?.endpoint&&(map[component.data.endpoint]=component?.data?.status_message||`Calling ${component?.data?.endpointLabel||component.data.endpoint}`),map),{});const spec=await agentDataConnector.getOpenAPIJSON(agentData,"http://localhost/",this._agentVersion,!0).catch(error=>null);return this.patchSpec(spec)}getFunctionDeclarations(spec){const paths=spec?.paths,reqMethods=OpenAPIParser.mapReqMethods(paths);let declarations=[];for(const path2 in paths){const pathData=paths[path2];for(const key in pathData){const data=pathData[key];if(!data?.operationId)continue;const method=reqMethods.get(data?.operationId)||"get";let properties={},requiredFields=[];if(method.toLowerCase()==="get"){const params=data?.parameters||[];for(const prop of params)properties[prop.name]={...prop.schema,description:prop.description},prop.required===!0&&requiredFields.push(prop?.name||"")}else{properties=data?.requestBody?.content?.["application/json"]?.schema?.properties,requiredFields=data?.requestBody?.content?.["application/json"]?.schema?.required;for(const prop in properties)delete properties[prop]?.required}properties||(properties={}),requiredFields||(requiredFields=[]);const declaration={name:data?.operationId,description:data?.description||data?.summary||"",properties,requiredFields};declarations.push(declaration)}}return declarations}async assignTeamIdFromAgentId(agentId){if(agentId){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(AccessCandidate.agent(agentId))?.catch(()=>"");this._teamId=teamId||""}}extractArgsAsOpenAPI(fn){const params=acorn.parse(`(${fn.toString()})`,{ecmaVersion:"latest"}).body[0].expression.params;let counter=0;function handleParam(param){if(param.type==="Identifier")return{name:param.name,in:"query",required:!0,schema:{type:"string",name:param.name,required:!0}};if(param.type==="AssignmentPattern"&&param.left.type==="Identifier")return{name:param.left.name,in:"query",required:!1,schema:{type:"string",name:param.left.name,required:!1}};if(param.type==="RestElement"&&param.argument.type==="Identifier")return{name:param.argument.name,in:"query",required:!1,schema:{type:"array",items:{type:"string"}}};if(param.type==="ObjectPattern"){const name2=`object___${counter++}`;return{name:name2,in:"query",required:!0,schema:{type:"object",required:!0,name:name2,properties:Object.fromEntries(param.properties.map(prop=>[prop.key.name||"[unknown]",{type:"string"}]))}}}const name=`unknown___${counter++}`;return{name,in:"query",required:!0,schema:{type:"string",name,required:!0}}}return params.map(handleParam)}}__decorateClass$l([hookAsyncWithContext("Conversation.prompt",async instance=>(await instance.ready,{teamId:instance._teamId,agentId:instance._agentId,model:instance._model}))],Conversation.prototype,"prompt"),__decorateClass$l([hookAsyncWithContext("Conversation.streamPrompt",async instance=>(await instance.ready,{teamId:instance._teamId,agentId:instance._agentId,model:instance._model}))],Conversation.prototype,"streamPrompt");const inputErrMsg=(type,name)=>`Invalid ${type} value for Input: ${name}`,logger$b=Logger("TypeChecker.helper"),InferenceStrategies={any:inferAnyType,string:inferStringType,number:inferNumberType,integer:inferIntegerType,boolean:inferBooleanType,array:inferArrayType,object:inferObjectType,date:inferDateType,binary:inferBinaryType,text:inferStringType,image:inferBinaryType,audio:inferBinaryType,video:inferBinaryType};async function performTypeInference(inputs,inputConfig,agent){try{if(!inputConfig||Object.keys(inputConfig)?.length===0)return inputs;const _inputs={...inputs},_inputConfig={};for(const input of inputConfig)input?.name&&(_inputConfig[input.name]={...input});for(const[key,config2]of Object.entries(_inputConfig)){let value=inputs?.[key]||"";if(!value)continue;const type=config2?.type?.toLowerCase()||"any";if(!InferenceStrategies[type]){logger$b.warn(`Unsupported type: ${type} for Input: ${key} for agent: ${agent?.id} input: ${key}`);continue}_inputs[key]=await InferenceStrategies[type](value,key,agent)}return _inputs}catch(error){throw error}}async function inferStringType(value,key,agent){if(value==null||value==="null"||value==="undefined")return"";if(isBase64(value)||isBase64DataUrl(value))return value;if(isSmythFileObject(value)){const file=await _createBinaryInput(value,key),base64=(await file.getBuffer()).toString("base64");return file.mimetype?`data:${file.mimetype};base64,${base64}`:base64}else return typeof value=="object"||Array.isArray(value)?JSON.stringify(value):String(value)}async function inferNumberType(value,key,agent){const floatVal=parseFloat(value);if(isNaN(floatVal))throw new Error("Invalid Number value");return floatVal}async function inferIntegerType(value,key,agent){const intVal=parseInt(value);if(isNaN(intVal))throw new Error("Invalid Integer value");return intVal}async function inferBooleanType(value,key,agent){if(typeof value=="boolean")return value;if(typeof value=="string"||typeof value=="number"){const lowerCaseValue=String(value).toLowerCase();if(["true","1"].includes(lowerCaseValue))return!0;if(["false","0"].includes(lowerCaseValue))return!1;throw new Error("Invalid Boolean value")}else throw new Error("Invalid Boolean value")}async function inferArrayType(value,key,agent){try{if(Array.isArray(value))return value;if(typeof value!="string")throw new Error("Invalid Array value");try{return value.trim().startsWith("[")?JSONContent(value).tryParse():value.split(",")}catch{throw new Error("Invalid Array value")}}catch{throw new Error("Invalid Array value")}}async function inferObjectType(value,key,agent){try{const obj=isPlainObject(value)?value:JSONContent(value).tryParse();if(!isPlainObject(obj))throw new Error("Invalid Object value");return obj}catch{throw new Error("Invalid Object value")}}function extractSmythFsAgentId(url){if(!url?.startsWith("smythfs://"))return null;try{const segments=url.split("/");return segments.length<4?null:segments[3]}catch{return null}}async function _createBinaryInput(value,key,agent){if(value instanceof BinaryInput)return value;let candidate,agentId="",data,mimetype="",fileName=`${uid()}-${key}`;if(value&&typeof value=="object"&&value?.url&&value?.mimetype){const url=value?.url;mimetype=value?.mimetype,value?.name&&(fileName=value?.name),url?.startsWith("smythfs://")?(data=value,agentId=extractSmythFsAgentId(url)):data=url}else typeof value=="string"&&value.startsWith("smythfs://")&&(agentId=extractSmythFsAgentId(value)),data=value;agentId&&(candidate=AccessCandidate.agent(agentId));const binaryInput=BinaryInput.from(data,fileName,mimetype,candidate);return await binaryInput.ready(),binaryInput}async function inferBinaryType(value,key,agent){try{let binarySource=value;if(typeof value=="string"){const normalizedValue=value.trim();if(isUrl(normalizedValue)||isSmythFsUrl(normalizedValue)||isBase64(value)||isBase64DataUrl(value))binarySource=normalizedValue;else{const extractedUrls=_extractUrls(value);extractedUrls.length>0&&(binarySource=extractedUrls)}}return Array.isArray(binarySource)?await Promise.all(binarySource.map(item=>_createBinaryInput(item,key,agent))):await _createBinaryInput(binarySource,key,agent)}catch(error){return logger$b.warn("Error processing binary input",{key,error:error.message}),null}}async function inferDateType(value,key,agent){const errMsg=`Invalid Date value
36
36
  The date string is expected to be in a format commonly used in English-speaking countries.`;if(typeof value!="string"&&typeof value!="number")throw new Error(errMsg);let date;if(typeof value=="string"&&isNaN(Number(value)))date=dayjs(value).locale("en");else{const timestamp=typeof value=="number"?value:Number(value);date=dayjs.unix(timestamp/1e3)}if(!date.isValid())throw new Error(errMsg);return date.toISOString()}async function inferAnyType(value){return value}function _extractUrls(value){if(typeof value!="string")return[];try{const parsedValue=JSONContent(value).tryParse();if(typeof parsedValue=="object")return Object.values(parsedValue).map(val=>String(val).trim()).filter(val=>isUrl(val)||isSmythFsUrl(val));const urls=new Set([...value.split(",").map(val=>val.trim()).filter(val=>val&&(isUrl(val)||isSmythFsUrl(val))),...value.split(`
37
- `).map(val=>val.trim()).filter(val=>val&&(isUrl(val)||isSmythFsUrl(val)))]);return Array.from(urls)}catch(error){return logger$b.warn("Error extracting URLs from value",{error}),[]}}var __defProp$1o=Object.defineProperty,__getOwnPropDesc$k=Object.getOwnPropertyDescriptor,__defNormalProp$1o=(obj,key,value)=>key in obj?__defProp$1o(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$k=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$k(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$1o(target,key,result),result},__publicField$1o=(obj,key,value)=>__defNormalProp$1o(obj,typeof key!="symbol"?key+"":key,value);class Component{constructor(){__publicField$1o(this,"hasReadOutput",!1),__publicField$1o(this,"hasPostProcess",!0),__publicField$1o(this,"alwaysActive",!1),__publicField$1o(this,"exclusive",!1),__publicField$1o(this,"schema",{name:"Component",settings:{},inputs:{}}),__publicField$1o(this,"configSchema")}init(){}createComponentLogger(agent,configuration){const logger2=Logger((configuration.name||this.constructor.name)+`,agent<${agent.id}>`,agent?.agentRuntime?.debug);return logger2.on("logged",info=>{agent.sse&&configuration.eventId&&agent.sse.send("component",{eventId:configuration.eventId,action:"log",name:configuration.name||this.constructor.name,title:configuration.title,logs:[{level:info.level,message:info.message}]})}),logger2}filterConfigBySchema(data,schema){if(!schema||!data)return data;const schemaDescription=schema.describe();if(schemaDescription.type!=="object"||!schemaDescription.keys)return data;const allowedKeys=Object.keys(schemaDescription.keys),filteredData={};for(const key of allowedKeys)key in data&&(filteredData[key]=data[key]);return data._templateVars&&(filteredData._templateVars=data._templateVars),filteredData}async validateConfig(config2){if(!this.configSchema)return{};let workingSchema=this.configSchema;if(config2.data._templateVars)for(let tplVar in config2.data._templateVars)workingSchema=workingSchema.append({[tplVar]:Joi.any()});const filteredData=this.filterConfigBySchema(config2.data,workingSchema),valid=await workingSchema.validate(filteredData);return valid.error?{id:config2.id,name:config2.name,_error:`Schema Validation error: ${valid?.error?.message} on component ${config2.displayName}:${config2.title}`,_debug:`Schema Validation error: ${valid?.error?.message} on component ${config2.displayName}:${config2.title}`}:{}}async process(input,config2,agent){if(agent.isKilled())throw new Error("Agent killed");const _input=await performTypeInference(input,config2?.inputs,agent);for(const[key,value]of Object.entries(_input))input[key]=value}async postProcess(output,config2,agent){return output?.result&&(delete output?.result?._debug,output?.result?._error||delete output?.result?._error),output}async enable(config2,agent){}async disable(config2,agent){}readOutput(id,config2,agent){return null}hasOutput(id,config2,agent){return!1}}__decorateClass$k([hookAsync("Component.process")],Component.prototype,"process");var __defProp$1n=Object.defineProperty,__defNormalProp$1n=(obj,key,value)=>key in obj?__defProp$1n(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1n=(obj,key,value)=>__defNormalProp$1n(obj,key+"",value);class AgentPlugin extends Component{constructor(){super(),__publicField$1n(this,"configSchema",Joi.object({agentId:Joi.string().max(200).required(),openAiModel:Joi.string().max(200).optional(),model:Joi.string().max(200).optional(),descForModel:Joi.string().max(5e3).allow("").label("Description for Model"),id:Joi.string().max(200),name:Joi.string().max(500),desc:Joi.string().max(5e3).allow("").label("Description"),logoUrl:Joi.string().max(8192).allow(""),version:Joi.string().max(100).allow(""),domain:Joi.string().max(253).allow("")}))}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Agent Plugin Log ===");try{const subAgentId=config2.data?.agentId;if(!subAgentId)return{_error:"Agent Component ID is required!",_debug:logger2.output};const reqTag=agent.agentRuntime?.reqTag,model=config2?.data?.model||config2?.data?.openAiModel,descForModel=TemplateString(config2?.data?.descForModel).parse(input).result,prompt=typeof input?.Prompt=="string"?input?.Prompt:JSON.stringify(input?.Prompt),agentDataConnector=ConnectorService.getAgentDataConnector(),isSubAgentDeployed=await agentDataConnector.isDeployed(subAgentId);let version2=config2.data?.version||"";if(logger2.debug("Version: ",version2),version2==="same-as-parent")if(await agentDataConnector.isDeployed(agent?.id))if(isSubAgentDeployed)version2="latest";else return{_error:`Call failed, Agent '${config2.data?.name}' (${subAgentId}) is not deployed. Please deploy the agent and try again.`,_debug:logger2.output};else version2="";else if(version2==="dev-latest")version2="";else if(version2==="prod-latest")if(isSubAgentDeployed)version2="latest";else return{_error:`Call failed, Agent '${config2.data?.name}' (${subAgentId}) is not deployed. Please deploy the agent and try again.`,_debug:logger2.output};const result=await new Conversation(model,subAgentId,{systemPrompt:descForModel,agentVersion:version2}).prompt(prompt,{"X-AGENT-ID":subAgentId,"X-AGENT-VERSION":version2,"X-REQUEST-TAG":reqTag,"x-caller-session-id":agent.callerSessionId});return logger2.debug(`Response:
37
+ `).map(val=>val.trim()).filter(val=>val&&(isUrl(val)||isSmythFsUrl(val)))]);return Array.from(urls)}catch(error){return logger$b.warn("Error extracting URLs from value",{error}),[]}}var __defProp$1o=Object.defineProperty,__getOwnPropDesc$k=Object.getOwnPropertyDescriptor,__defNormalProp$1o=(obj,key,value)=>key in obj?__defProp$1o(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$k=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$k(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$1o(target,key,result),result},__publicField$1o=(obj,key,value)=>__defNormalProp$1o(obj,typeof key!="symbol"?key+"":key,value);class Component{constructor(){__publicField$1o(this,"hasReadOutput",!1),__publicField$1o(this,"hasPostProcess",!0),__publicField$1o(this,"alwaysActive",!1),__publicField$1o(this,"exclusive",!1),__publicField$1o(this,"schema",{name:"Component",settings:{},inputs:{}}),__publicField$1o(this,"configSchema")}init(){}createComponentLogger(agent,configuration){const logger2=Logger((configuration.name||this.constructor.name)+`,agent<${agent.id}>`,agent?.agentRuntime?.debug);return logger2.on("logged",info=>{agent.sse&&configuration.eventId&&agent.sse.send("component",{eventId:configuration.eventId,action:"log",name:configuration.name||this.constructor.name,title:configuration.title,logs:[{level:info.level,message:info.message}]})}),logger2}filterConfigBySchema(data,schema){if(!schema||!data)return data;const schemaDescription=schema.describe();if(schemaDescription.type!=="object"||!schemaDescription.keys)return data;const allowedKeys=Object.keys(schemaDescription.keys),filteredData={};for(const key of allowedKeys)key in data&&(filteredData[key]=data[key]);return data._templateVars&&(filteredData._templateVars=data._templateVars),filteredData}async validateConfig(config2){if(!this.configSchema)return{};let workingSchema=this.configSchema;if(config2.data._templateVars)for(let tplVar in config2.data._templateVars)workingSchema=workingSchema.append({[tplVar]:Joi.any()});const filteredData=this.filterConfigBySchema(config2.data,workingSchema),valid=await workingSchema.validate(filteredData);return valid.error?{id:config2.id,name:config2.name,_error:`Schema Validation error: ${valid?.error?.message} on component ${config2.displayName}:${config2.title}`,_debug:`Schema Validation error: ${valid?.error?.message} on component ${config2.displayName}:${config2.title}`}:{}}async process(input,config2,agent){if(agent.isKilled())throw new Error("Agent killed");const _input=await performTypeInference(input,config2?.inputs,agent);for(const[key,value]of Object.entries(_input))input[key]=value}async postProcess(output,config2,agent){return output?.result&&(agent.agentRuntime?.debug||delete output?.result?._debug,output?.result?._error||delete output?.result?._error),output}async enable(config2,agent){}async disable(config2,agent){}readOutput(id,config2,agent){return null}hasOutput(id,config2,agent){return!1}}__decorateClass$k([hookAsync("Component.process")],Component.prototype,"process");var __defProp$1n=Object.defineProperty,__defNormalProp$1n=(obj,key,value)=>key in obj?__defProp$1n(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1n=(obj,key,value)=>__defNormalProp$1n(obj,key+"",value);class AgentPlugin extends Component{constructor(){super(),__publicField$1n(this,"configSchema",Joi.object({agentId:Joi.string().max(200).required(),openAiModel:Joi.string().max(200).optional(),model:Joi.string().max(200).optional(),descForModel:Joi.string().max(5e3).allow("").label("Description for Model"),id:Joi.string().max(200),name:Joi.string().max(500),desc:Joi.string().max(5e3).allow("").label("Description"),logoUrl:Joi.string().max(8192).allow(""),version:Joi.string().max(100).allow(""),domain:Joi.string().max(253).allow("")}))}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Agent Plugin Log ===");try{const subAgentId=config2.data?.agentId;if(!subAgentId)return{_error:"Agent Component ID is required!",_debug:logger2.output};const reqTag=agent.agentRuntime?.reqTag,model=config2?.data?.model||config2?.data?.openAiModel,descForModel=TemplateString(config2?.data?.descForModel).parse(input).result,prompt=typeof input?.Prompt=="string"?input?.Prompt:JSON.stringify(input?.Prompt),agentDataConnector=ConnectorService.getAgentDataConnector(),isSubAgentDeployed=await agentDataConnector.isDeployed(subAgentId);let version2=config2.data?.version||"";if(logger2.debug("Version: ",version2),version2==="same-as-parent")if(await agentDataConnector.isDeployed(agent?.id))if(isSubAgentDeployed)version2="latest";else return{_error:`Call failed, Agent '${config2.data?.name}' (${subAgentId}) is not deployed. Please deploy the agent and try again.`,_debug:logger2.output};else version2="";else if(version2==="dev-latest")version2="";else if(version2==="prod-latest")if(isSubAgentDeployed)version2="latest";else return{_error:`Call failed, Agent '${config2.data?.name}' (${subAgentId}) is not deployed. Please deploy the agent and try again.`,_debug:logger2.output};const result=await new Conversation(model,subAgentId,{systemPrompt:descForModel,agentVersion:version2}).prompt(prompt,{"X-AGENT-ID":subAgentId,"X-AGENT-VERSION":version2,"X-REQUEST-TAG":reqTag,"x-caller-session-id":agent.callerSessionId});return logger2.debug(`Response:
38
38
  `,result,`
39
39
  `),{Response:result,_debug:logger2.output}}catch(error){return console.error("Error on running Agent Component: ",error),{_error:`Error on running Agent Component!
40
40
  ${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var __defProp$1m=Object.defineProperty,__defNormalProp$1m=(obj,key,value)=>key in obj?__defProp$1m(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1m=(obj,key,value)=>__defNormalProp$1m(obj,key+"",value);function isEmpty(value){return value==null||typeof value=="string"&&value.trim()===""||Array.isArray(value)&&value.length===0||typeof value=="object"&&value!==null&&Object.keys(value).length===0}function isTemplateVar(str=""){return!str||typeof str!="string"?!1:(str?.match(/{{(.*?)}}/g)??[]).length>0}function isKeyTemplateVar(str=""){return!str||typeof str!="string"?!1:(str?.match(/{{KEY\((.*?)\)}}/g)??[]).length>0}function parseKey(str="",teamId){return str.replace(/{{KEY\((.*?)\)}}/g,(match,key)=>key==="teamid"?teamId:"")}class APIEndpoint extends Component{constructor(){super(),__publicField$1m(this,"configSchema",Joi.object({endpoint:Joi.string().pattern(/^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*$/).max(50).required(),method:Joi.string().valid("POST","GET").allow(""),description:Joi.string().max(5e3).allow(""),summary:Joi.string().max(1e3).allow(""),doc:Joi.string().max(1e3).allow(""),ai_exposed:Joi.boolean().default(!0),advancedModeEnabled:Joi.boolean().optional(),endpointLabel:Joi.string().max(100).allow("").optional()}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const req=agent.agentRequest,logger2=this.createComponentLogger(agent,config2),headers=req?req.headers:{};let body=req?req.body:input;const params=req?req.params:{};let query=req?req.query:{};const _authInfo=req?req._agent_authinfo:void 0;for(const[key,value]of Object.entries(body))isKeyTemplateVar(value)?body[key]=await parseKey(value,agent?.teamId):isTemplateVar(value)&&(body[key]=TemplateString(value).parse(input).result);for(const[key,value]of Object.entries(query))isKeyTemplateVar(value)?query[key]=await parseKey(value,agent?.teamId):isTemplateVar(value)&&(query[key]=TemplateString(value).parse(input).result);const inputsWithDefaultValue=config2.inputs.filter(input2=>input2.defaultVal!==void 0&&input2.defaultVal!==""&&input2.defaultVal!==null),bodyInputNames=[],queryInputNames=[];for(const output of config2.outputs){const outputName=output?.expression||output?.name,inputName=outputName?.split(".")[1];inputName&&(outputName?.includes("body")&&bodyInputNames.push(inputName),outputName?.includes("query")&&queryInputNames.push(inputName))}for(const _inputWithDefaultValue of inputsWithDefaultValue){const inputName=_inputWithDefaultValue?.name;let inputValue=input[inputName];bodyInputNames.includes(inputName)&&isEmpty(body[inputName])&&(body[inputName]=inputValue),queryInputNames.includes(inputName)&&isEmpty(query[inputName])&&(query[inputName]=inputValue)}if(req.header("X-Debug-Inj")!==void 0&&agent.agentRuntime.debug&&Object.values(input).length>0)switch(config2.data.method){case"GET":for(const[key,value]of Object.entries(input))value instanceof BinaryInput?logger2.debug("[WARNING] Binary files are not supported for GET requests. Key:",key):query[key]=value;break;case"POST":default:body=input;break}body=await performTypeInference(body,config2.inputs,agent),query=await performTypeInference(query,config2.inputs,agent),logger2.debug("Parsing inputs"),logger2.debug(" Headers",headers),logger2.debug(" Body",body),logger2.debug(" Params",params),logger2.debug(" Query",query),logger2.debug("Parsing body json input");for(let key in body){const value=body[key];if(typeof value=="string"&&value.trim().startsWith("{")&&value.trim().endsWith("}"))try{const obj=JSON.parse(jsonrepair(body[key]));body[key]=obj}catch{}}logger2.debug("Parsed body json input",body),logger2.debug("Parsing query json input");for(let key in query){const value=query[key];if(typeof value=="string"&&value.trim().startsWith("{")&&value.trim().endsWith("}"))try{const obj=JSON.parse(jsonrepair(query[key]));query[key]=obj}catch{}}logger2.debug("Parsed query json input",query);for(let input2 of config2.inputs){if(!input2.isFile&&!["image","audio","video","binary"].includes(input2?.type?.toLowerCase()))continue;const fieldname=input2.name;logger2.debug("Parsing file input ",fieldname);let binaryInputs=body[fieldname];Array.isArray(binaryInputs)||(binaryInputs=[binaryInputs]);const validResults=(await Promise.all(binaryInputs.map(async binaryInput=>{if(!(binaryInput instanceof BinaryInput)&&req.files?.length>0){const file=req.files.find(file2=>file2.fieldname===fieldname);if(!file)return null;binaryInput=new BinaryInput(file.buffer,uid()+"-"+file.originalname,file.mimetype)}return binaryInput instanceof BinaryInput?await binaryInput.getJsonData(AccessCandidate.agent(agent.id)):null}))).filter(result=>result!==null);validResults.length>0&&(body[fieldname]=validResults.length===1?validResults[0]:validResults)}return{headers,body,query,params,_authInfo,_debug:logger2.output}}}var __defProp$1l=Object.defineProperty,__defNormalProp$1l=(obj,key,value)=>key in obj?__defProp$1l(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1l=(obj,key,value)=>__defNormalProp$1l(obj,typeof key!="symbol"?key+"":key,value);class APIOutput extends Component{constructor(){super(),__publicField$1l(this,"configSchema",Joi.object({format:Joi.string().valid("full","minimal","raw").label("Output Format").required(),contentType:Joi.string().valid("application/json","text/plain","text/html","application/xml").optional().allow("").label("Content Type")})),__publicField$1l(this,"hasPostProcess",!0)}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2),_error=void 0;let Output={};logger2.debug(" Processing outputs ");for(let key in input)config2.inputs.find(i=>i.name==key)&&(Output[key]=input[key]);if(config2.data.format==="raw"){let rawOutput="";for(let key in input)config2.inputs.find(i=>i.name==key)&&(rawOutput+=input[key]);Output=rawOutput}return{Output,_error,_debug:logger2.output}}async postProcess(output,config2,agent){let contentType=config2.data.contentType||"application/json";for(let agentVar in agent.agentVariables)delete output?.result?.Output?.[agentVar];if(config2?.data?.format=="minimal"||contentType!=="application/json"){if(output?.result?.Output)return output?.result?.Output;if(output?.result?._error)return output?.result?._error;delete output.id,delete output.name}return output}}var __defProp$1k=Object.defineProperty,__defNormalProp$1k=(obj,key,value)=>key in obj?__defProp$1k(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1k=(obj,key,value)=>__defNormalProp$1k(obj,key+"",value);Logger("ForkedAgent");class ForkedAgent{constructor(parent,componentId){this.parent=parent,__publicField$1k(this,"agent");const data=fork(this.parent.data,componentId);data.variables=JSON.parse(JSON.stringify(this.parent?.data?.variables||{})),data.teamId=this.parent.teamId,data.planInfo=this.parent.data?.planInfo||{};const content={name:this.parent.name,data,teamId:this.parent.teamId,debugSessionEnabled:!1,version:this.parent.version},agentRequest=new AgentRequest(this.parent.agentRequest.req);agentRequest.headers=[],this.agent=new Agent(this.parent.id,content,this.parent.agentSettings,agentRequest);const JobID=componentId+"-"+uid();this.agent.jobID=JobID}get agentRequest(){return this.agent.agentRequest}get components(){return this.agent.components}get agentRuntime(){return this.agent.agentRuntime}get jobID(){return this.agent.jobID}process(path2,input){return this.agent.process(path2,input)}}function cloneComponent(component){const newComponent=JSON.parse(JSON.stringify(component));return newComponent.id=component.id,newComponent}function cloneRecursively(componentData,currentID,newIDMap,clonedComponents,clonedConnections){const componentToClone=componentData.components.find(c=>c.id===currentID);if(!componentToClone)return;const clonedComponent=cloneComponent(componentToClone);newIDMap[currentID]=clonedComponent.id,clonedComponents.push(clonedComponent),componentData.connections.filter(conn=>conn.sourceId===currentID).forEach(conn=>{const clonedConnection=JSON.parse(JSON.stringify(conn));clonedConnection.sourceId=clonedComponent.id,newIDMap[conn.targetId]||cloneRecursively(componentData,conn.targetId,newIDMap,clonedComponents,clonedConnections),clonedConnection.targetId=newIDMap[conn.targetId],clonedConnections.push(clonedConnection)})}function fork(componentData,componentID){const clonedComponents=[],clonedConnections=[];cloneRecursively(componentData,componentID,{},clonedComponents,clonedConnections);const rootComponentData=clonedComponents.find(e=>e.id==componentID);if(rootComponentData&&rootComponentData.name!=="APIEndpoint"){const APIEndpointData={id:`${componentID}_ENDPOINT`,name:"APIEndpoint",outputs:[{name:"headers",index:0,default:!0},{name:"body",index:1,default:!0},{name:"query",index:2,default:!0}],inputs:[],data:{endpoint:componentID,description:"",method:"POST"},displayName:"APIEndpoint",title:"APIEndpoint",description:""};clonedComponents.push(APIEndpointData);const incomingConnections=componentData.connections.filter(conn=>conn.targetId===componentID);let i=3;for(let con of incomingConnections){const input=rootComponentData.inputs.find(e=>e.index==con.targetIndex),epInput=JSON.parse(JSON.stringify(input));APIEndpointData.inputs.push(epInput);const epOutput={name:input.name,expression:`body.${input.name}`,optional:!1,index:i++,default:!1};APIEndpointData.outputs.push(epOutput),clonedConnections.push({sourceId:APIEndpointData.id,targetId:rootComponentData.id,sourceIndex:epOutput.index,targetIndex:input.index})}}return{components:clonedComponents,connections:clonedConnections}}var __defProp$1j=Object.defineProperty,__defNormalProp$1j=(obj,key,value)=>key in obj?__defProp$1j(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1j=(obj,key,value)=>__defNormalProp$1j(obj,typeof key!="symbol"?key+"":key,value);const _Async=class _Async2 extends Component{constructor(){super(),__publicField$1j(this,"configSchema",null)}init(){}async process(input,config2,agent){await super.process(input,config2,agent),this.createComponentLogger(agent,config2);const forked=config2.data.forked;try{if(forked){let result={JobID:agent.jobID};for(let key in input)result[key]=input[key];return result}else{const forkedAgent=new ForkedAgent(agent,config2.id),JobID=forkedAgent.jobID;forkedAgent.agent.async=!0,forkedAgent.agent.jobID=JobID,this.cleanJobIDBranch(forkedAgent.agent);const componentData=forkedAgent.components[config2.id];if(componentData.data.forked=!0,forkedAgent.agentRequest.body={...input},_Async2.JOBS[agent.id]||(_Async2.JOBS[agent.id]={}),_Async2.JOBS[agent.id][JobID]={status:"pending"},agent.debugSessionEnabled){const _job_components=Object.keys(forkedAgent.components);agent.agentRuntime.updateComponent(config2.id,{_job_components})}return forkedAgent.process(`/api/${config2.id}`,input).then(result=>{_Async2.JOBS[agent.id][JobID].result=result,_Async2.JOBS[agent.id][JobID].status="done"}).finally(async()=>{_Async2.JOBS[agent.id][JobID].status!=="done"&&(_Async2.JOBS[agent.id][JobID].status="failed"),agent.debugSessionEnabled&&(await delay(1e3),agent.agentRuntime.reloadCtxData(),agent.agentRuntime.updateComponent(config2.id,{_job_components:[]}))}),{JobID}}}catch{}return{}}cleanJobIDBranch(agent){const AsyncComponent=Object.values(agent.components).find(c=>c.name==="Async");if(!AsyncComponent)return;const jobIDOutputIndex=AsyncComponent.outputs.findIndex(o=>o.name==="JobID");jobIDOutputIndex!==-1&&(agent.connections=agent.connections.filter(c=>!(c.sourceId===AsyncComponent.id&&c.sourceIndex===jobIDOutputIndex&&!agent.components[c.targetId].async)),this.removeOrphanedBranches(agent))}removeOrphanedBranches(agent){const toDelete=[];for(let componentId in agent.components){const component=agent.components[componentId];component.name!=="APIEndpoint"&&(agent.connections.some(c=>c.targetId===component.id)||toDelete.push(component.id))}for(let id of toDelete)this.removeComponent(agent,id)}removeComponent(agent,componentId){agent.components[componentId],delete agent.components[componentId],agent.connections=agent.connections.filter(c=>c.sourceId!==componentId),this.removeOrphanedBranches(agent)}};__publicField$1j(_Async,"JOBS",{}),__publicField$1j(_Async,"ForkedAgent");let Async=_Async;var __defProp$1i=Object.defineProperty,__defNormalProp$1i=(obj,key,value)=>key in obj?__defProp$1i(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1i=(obj,key,value)=>__defNormalProp$1i(obj,typeof key!="symbol"?key+"":key,value);const _Await=class _Await2 extends Component{constructor(){super(),__publicField$1i(this,"configSchema",Joi.object({jobs_count:Joi.number().min(1).max(100).default(1).label("Jobs Count"),max_time:Joi.number().min(1).max(21600).default(1).label("Max time")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{let Results={},jobs_count=parseInt(config2.data.jobs_count||1),max_time=parseInt(config2.data.max_time||1);const jobs=Array.isArray(input.Jobs)?input.Jobs:[input.Jobs];_Await2.WAITS[agent.id]||(_Await2.WAITS[agent.id]={}),_Await2.WAITS[agent.id][config2.id]||(_Await2.WAITS[agent.id][config2.id]={}),_Await2.WAITS[agent.id][config2.id][agent.agentRuntime.workflowReqId]||(_Await2.WAITS[agent.id][config2.id][agent.agentRuntime.workflowReqId]=[]);for(let jobID of jobs)_Await2.WAITS[agent.id][config2.id][agent.agentRuntime.workflowReqId].push(jobID);logger2.debug("Jobs",jobs),logger2.debug("Waiting for jobs to finish"),await new Promise((resolve,reject)=>{let interval=setInterval(()=>{if(max_time<0)return clearInterval(interval),resolve(!0);let done=!0,completed=0;for(let jobID of jobs)if(Async.JOBS?.[agent.id]?.[jobID]?.status=="pending"){done=!1;break}else completed++;if(completed>=jobs_count&&(done=!0),done)return clearInterval(interval),resolve(!0);max_time-=1},1e3)}),logger2.debug("Jobs finished, collecting results");for(let jobID of jobs)Results[jobID]={output:Async.JOBS?.[agent.id]?.[jobID]?.result,status:Async.JOBS?.[agent.id]?.[jobID]?.status||"unknown_job"};return delete _Await2.WAITS[agent.id][config2.id][agent.agentRuntime.workflowReqId],logger2.debug("Results",Results),{Results,_error:null,_debug:logger2.output,_debug_time:logger2.elapsedTime}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error running code