@smythos/sre 1.7.20 → 1.7.40
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 +114 -76
- package/dist/index.js.map +1 -1
- package/dist/types/Components/DataSourceIndexer.class.d.ts +4 -12
- package/dist/types/Components/GenAILLM.class.d.ts +5 -5
- package/dist/types/Components/index.d.ts +3 -3
- package/dist/types/index.d.ts +3 -3
- package/dist/types/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.d.ts +1 -0
- package/dist/types/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.d.ts +11 -4
- package/dist/types/subsystems/IO/VectorDB.service/embed/index.d.ts +5 -0
- package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.d.ts +35 -0
- package/dist/types/subsystems/Security/Account.service/AccountConnector.d.ts +2 -2
- package/dist/types/subsystems/Security/Vault.service/connectors/SecretsManager.class.d.ts +2 -3
- package/dist/types/types/VectorDB.types.d.ts +4 -0
- package/dist/types/utils/string.utils.d.ts +1 -0
- package/package.json +3 -3
- package/src/Components/APIEndpoint.class.ts +1 -6
- package/src/Components/Component.class.ts +14 -1
- package/src/Components/DataSourceIndexer.class.ts +148 -34
- package/src/Components/GenAILLM.class.ts +21 -11
- package/src/Components/RAG/DataSourceCleaner.class.ts +178 -0
- package/src/Components/RAG/DataSourceComponent.class.ts +111 -0
- package/src/Components/RAG/DataSourceIndexer.class.ts +254 -0
- package/src/Components/{DataSourceLookup.class.ts → RAG/DataSourceLookup.class.ts} +92 -3
- package/src/Components/ServerlessCode.class.ts +1 -4
- package/src/Components/index.ts +3 -3
- package/src/helpers/S3Cache.helper.ts +2 -1
- package/src/index.ts +212 -212
- package/src/index.ts.bak +212 -212
- package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +3 -1
- package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +145 -19
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +56 -22
- package/src/subsystems/IO/VectorDB.service/embed/GoogleEmbedding.ts +1 -0
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +2 -1
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +18 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +35 -10
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +12 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +4 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +13 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +17 -5
- package/src/subsystems/LLMManager/LLM.service/connectors/Ollama.class.ts +18 -3
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +14 -5
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +6 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +5 -5
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +8 -3
- package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +9 -8
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +92 -1
- package/src/subsystems/ObservabilityManager/Telemetry.service/connectors/OTel/OTel.class.ts +32 -6
- package/src/subsystems/Security/Account.service/AccountConnector.ts +3 -3
- package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +8 -63
- package/src/types/VectorDB.types.ts +4 -0
- package/src/utils/array.utils.ts +11 -0
- package/src/utils/base64.utils.ts +1 -1
- package/src/utils/string.utils.ts +3 -192
- package/src/Components/DataSourceCleaner.class.ts +0 -92
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import dotenv from"dotenv";import Joi from"joi";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*as readlineSync from"readline-sync";import{stdin,stdout}from"process";import"dotenv/config";import winston from"winston";import Transport from"winston-transport";import EventEmitter$1,{EventEmitter}from"events";import crypto$1,{createHash,randomUUID,createHmac,timingSafeEqual}from"crypto";import path from"path";import os from"os";import mime from"mime";import{encodeChat,encode}from"gpt-tokenizer";import{Readable}from"stream";import{jsonrepair}from"jsonrepair";import xxhash from"xxhashjs";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{GetFunctionCommand,UpdateFunctionCodeCommand,Runtime,InvokeCommand,LambdaClient,UpdateFunctionConfigurationCommand,CreateFunctionCommand}from"@aws-sdk/client-lambda";import{GetRoleCommand,CreateRoleCommand,IAMClient}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{findAll,isTag,removeElement,innerText}from"domutils";import{parseDocument}from"htmlparser2";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import{createServer}from"http";import{WebSocketServer}from"ws";import"ses";import imageSize from"image-size";import{execSync}from"child_process";import{Pinecone}from"@pinecone-database/pinecone";import
|
|
1
|
+
import dotenv from"dotenv";import Joi from"joi";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*as readlineSync from"readline-sync";import{stdin,stdout}from"process";import"dotenv/config";import winston from"winston";import Transport from"winston-transport";import EventEmitter$1,{EventEmitter}from"events";import crypto$1,{createHash,randomUUID,createHmac,timingSafeEqual}from"crypto";import path from"path";import os from"os";import mime from"mime";import{encodeChat,encode}from"gpt-tokenizer";import{Readable}from"stream";import{jsonrepair}from"jsonrepair";import xxhash from"xxhashjs";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 OpenAI$1,{OpenAI,toFile}from"openai";import{GoogleGenAI}from"@google/genai";import zl from"zip-lib";import{GetFunctionCommand,UpdateFunctionCodeCommand,Runtime,InvokeCommand,LambdaClient,UpdateFunctionConfigurationCommand,CreateFunctionCommand}from"@aws-sdk/client-lambda";import{GetRoleCommand,CreateRoleCommand,IAMClient}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{findAll,isTag,removeElement,innerText}from"domutils";import{parseDocument}from"htmlparser2";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import{createServer}from"http";import{WebSocketServer}from"ws";import"ses";import imageSize from"image-size";import{execSync}from"child_process";import{Pinecone}from"@pinecone-database/pinecone";import{MilvusClient,DataType,ErrorCode}from"@zilliz/milvus2-sdk-node";import{GoogleGenAI as GoogleGenAI$1,FunctionCallingConfigMode,FileState}from"@google/genai/node";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{Ollama}from"ollama";import*as chokidar from"chokidar";import chokidar__default from"chokidar";import fs$1 from"fs/promises";import IORedis from"ioredis";import{trace,context,SpanStatusCode}from"@opentelemetry/api";import{logs,SeverityNumber}from"@opentelemetry/api-logs";import{resourceFromAttributes}from"@opentelemetry/resources";import{ATTR_SERVICE_VERSION,ATTR_SERVICE_NAME}from"@opentelemetry/semantic-conventions";import{BatchSpanProcessor,NodeTracerProvider}from"@opentelemetry/sdk-trace-node";import{OTLPTraceExporter}from"@opentelemetry/exporter-trace-otlp-http";import{BatchLogRecordProcessor,LoggerProvider}from"@opentelemetry/sdk-logs";import{OTLPLogExporter}from"@opentelemetry/exporter-logs-otlp-http";import mysql from"mysql2/promise";import{SecretsManagerClient,ListSecretsCommand,GetSecretValueCommand,PutSecretValueCommand,CreateSecretCommand,DescribeSecretCommand,RestoreSecretCommand,DeleteSecretCommand}from"@aws-sdk/client-secrets-manager";var version="1.7.40",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.
|
|
@@ -9,19 +9,19 @@ Respond ONLY with a valid, parsable JSON object. Follow these strict guidelines:
|
|
|
9
9
|
|
|
10
10
|
Example of a valid response:
|
|
11
11
|
{"result": "This is a valid JSON response without any extra text."}
|
|
12
|
-
`,SUPPORTED_MIME_TYPES_MAP={OpenAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"],imageGen:["image/png","image/jpeg","image/jpg","image/webp"],document:["application/pdf"]},TogetherAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},Anthropic:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},GoogleAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/heic","image/heif"],imageGen:["image/png","image/jpeg","image/jpg","image/webp"],video:["video/mp4","video/mpeg","video/mov","video/avi","video/x-msvideo","video/x-flv","video/mpg","video/webm","video/wmv","video/3gpp"],audio:["audio/wav","audio/mp3","audio/mpeg","audio/aiff","audio/aac","audio/ogg","audio/flac"],document:["application/pdf","application/x-javascript","application/x-typescript","application/x-python-code","application/json","application/rtf","text/plain","text/html","text/css","text/javascript","text/x-typescript","text/csv","text/markdown","text/x-python","text/xml","text/rtf"]},Groq:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]}},DEFAULT_SMYTHOS_LLM_PROVIDERS_SETTINGS={openai:{enabled:!0},anthropic:{enabled:!0},googleai:{enabled:!0},togetherai:{enabled:!0},groq:{enabled:!0},xai:{enabled:!0}},BUILT_IN_MODEL_PREFIX="smythos/",ENTERPRISE_MODELS_SETTING_KEY="custom-llm",USER_CUSTOM_MODELS_SETTING_KEY="user-custom-llm";var TConnectorService=(TConnectorService2=>(TConnectorService2.Storage="Storage",TConnectorService2.VectorDB="VectorDB",TConnectorService2.Cache="Cache",TConnectorService2.LLM="LLM",TConnectorService2.Vault="Vault",TConnectorService2.Account="Account",TConnectorService2.AgentData="AgentData",TConnectorService2.CLI="CLI",TConnectorService2.NKV="NKV",TConnectorService2.Router="Router",TConnectorService2.ManagedVault="ManagedVault",TConnectorService2.Log="Log",TConnectorService2.Component="Component",TConnectorService2.ModelsProvider="ModelsProvider",TConnectorService2.Code="Code",TConnectorService2.Scheduler="Scheduler",TConnectorService2.Telemetry="Telemetry",TConnectorService2))(TConnectorService||{}),__defProp$
|
|
12
|
+
`,SUPPORTED_MIME_TYPES_MAP={OpenAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"],imageGen:["image/png","image/jpeg","image/jpg","image/webp"],document:["application/pdf"]},TogetherAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},Anthropic:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},GoogleAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/heic","image/heif"],imageGen:["image/png","image/jpeg","image/jpg","image/webp"],video:["video/mp4","video/mpeg","video/mov","video/avi","video/x-msvideo","video/x-flv","video/mpg","video/webm","video/wmv","video/3gpp"],audio:["audio/wav","audio/mp3","audio/mpeg","audio/aiff","audio/aac","audio/ogg","audio/flac"],document:["application/pdf","application/x-javascript","application/x-typescript","application/x-python-code","application/json","application/rtf","text/plain","text/html","text/css","text/javascript","text/x-typescript","text/csv","text/markdown","text/x-python","text/xml","text/rtf"]},Groq:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]}},DEFAULT_SMYTHOS_LLM_PROVIDERS_SETTINGS={openai:{enabled:!0},anthropic:{enabled:!0},googleai:{enabled:!0},togetherai:{enabled:!0},groq:{enabled:!0},xai:{enabled:!0}},BUILT_IN_MODEL_PREFIX="smythos/",ENTERPRISE_MODELS_SETTING_KEY="custom-llm",USER_CUSTOM_MODELS_SETTING_KEY="user-custom-llm";var TConnectorService=(TConnectorService2=>(TConnectorService2.Storage="Storage",TConnectorService2.VectorDB="VectorDB",TConnectorService2.Cache="Cache",TConnectorService2.LLM="LLM",TConnectorService2.Vault="Vault",TConnectorService2.Account="Account",TConnectorService2.AgentData="AgentData",TConnectorService2.CLI="CLI",TConnectorService2.NKV="NKV",TConnectorService2.Router="Router",TConnectorService2.ManagedVault="ManagedVault",TConnectorService2.Log="Log",TConnectorService2.Component="Component",TConnectorService2.ModelsProvider="ModelsProvider",TConnectorService2.Code="Code",TConnectorService2.Scheduler="Scheduler",TConnectorService2.Telemetry="Telemetry",TConnectorService2))(TConnectorService||{}),__defProp$1Y=Object.defineProperty,__defNormalProp$1Y=(obj,key,value)=>key in obj?__defProp$1Y(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1Y=(obj,key,value)=>__defNormalProp$1Y(obj,typeof key!="symbol"?key+"":key,value);function uid(){return(Date.now()+Math.random()).toString(36).replace(".","").toUpperCase()}function isSubclassOf(subClass,superClass){if(typeof subClass!="function"||typeof superClass!="function")return!1;let prototype=Object.getPrototypeOf(subClass.prototype),depth=10;for(;prototype&&depth>=0;){if(prototype===superClass.prototype)return!0;prototype=Object.getPrototypeOf(prototype),depth++}return!1}async function processWithConcurrencyLimit(tasks,maxConcurrentTasks=10){const limit=pLimit(maxConcurrentTasks),limitedTasks=tasks.map(task=>limit(task));return(await Promise.allSettled(limitedTasks)).flatMap(result=>result.status==="fulfilled"?[result.value]:[]).filter(Boolean)}const isJSONString=str=>{try{return typeof str=="string"&&!!JSON.parse(str)}catch{return!1}};class ControlledPromise extends Promise{constructor(executor){let internalResolve,internalReject,_isSettled=!1;super((resolve,reject)=>{internalResolve=value=>{_isSettled||(_isSettled=!0,resolve(value))},internalReject=reason=>{_isSettled||(_isSettled=!0,reject(reason))}}),__publicField$1Y(this,"_isSettled",!1),__publicField$1Y(this,"isSettled"),__publicField$1Y(this,"resolve"),__publicField$1Y(this,"reject"),this.resolve=internalResolve,this.reject=internalReject,this.isSettled=()=>_isSettled,executor(this.resolve,this.reject,this.isSettled)}}function debounce(func,wait,options){let timeout=null,lastCall=0;return function(...args){const now=Date.now(),later=()=>{timeout=null,lastCall=now,func.apply(this,args)};timeout&&clearTimeout(timeout),options.leading&&!timeout&&(func.apply(this,args),lastCall=now),options.maxWait&&now-lastCall>=options.maxWait&&(func.apply(this,args),lastCall=now),timeout=setTimeout(later,wait)}}function getFormattedStackTrace(limit=3,skip=0){const stack=new Error().stack;if(!stack)return[];const relevantLines=stack.split(`
|
|
13
13
|
`).slice(3+skip),formattedCalls=[],length=Math.min(limit,relevantLines.length);for(let i=0;i<length;i++){const line=relevantLines[i].trim();if(!line)continue;let match=line.match(/at\s+(.+?)\s+\((.+?):(\d+):(\d+)\)/);if(match){const[,functionName,filePath,lineNum]=match,fileName=filePath.split(/[/\\]/).pop()||filePath,cleanFunctionName=functionName.includes(".")?functionName.split(".").pop():functionName;formattedCalls.push(`${i<length-1?"\u251C":"\u2514"} ${cleanFunctionName}() in ${fileName} (${filePath}:${lineNum})`)}else if(match=line.match(/at\s+(.+?):(\d+):(\d+)/),match){const[,filePath,lineNum]=match,fileName=filePath.split(/[/\\]/).pop()||filePath;formattedCalls.push(` ${fileName}:${lineNum}`)}if(!match&&line.includes("at ")){const cleanLine=line.replace("at ","").trim();formattedCalls.push(` ${cleanLine}`)}}return formattedCalls}function printStackTrace(logger2,limit=3,skip=0){const stackTrace=getFormattedStackTrace(limit,skip);stackTrace.length>0&&(logger2.debug("Call trace:"),stackTrace.forEach((call,index)=>{logger2.debug(` ${call}`)}))}function getCurrentFormattedDate(){const date=new Date,year=date.getFullYear(),month=String(date.getMonth()+1).padStart(2,"0"),day=String(date.getDate()).padStart(2,"0"),hours=String(date.getHours()).padStart(2,"0"),minutes=String(date.getMinutes()).padStart(2,"0"),seconds=String(date.getSeconds()).padStart(2,"0");return`${year}-${month}-${day}-${hours}-${minutes}-${seconds}`}function getDayFormattedDate(){const date=new Date,year=date.getFullYear(),month=String(date.getMonth()+1).padStart(2,"0"),day=String(date.getDate()).padStart(2,"0");return`${year}-${month}-${day}`}function delay(ms){return new Promise(r=>setTimeout(r,ms))}function isValidString(str){return str&&typeof str=="string"}const isValidNumber=str=>{const num=parseFloat(str);return!isNaN(num)&&num<=Number.MAX_SAFE_INTEGER&&num>=Number.MIN_SAFE_INTEGER&&num.toString()===str.trim()};function convertStringToRespectiveType(data){if(data==null)return data;if(typeof data!="object"){if(typeof data=="string"){if(data.toLowerCase()==="true")return!0;if(data.toLowerCase()==="false")return!1;if(isValidNumber(data))return Number(data);if(data.toLowerCase()==="null")return null;if(data.toLowerCase()==="undefined")return}return data}return Array.isArray(data)?data.map(item=>convertStringToRespectiveType(item)):Object.fromEntries(Object.entries(data).map(([key,value])=>[key,convertStringToRespectiveType(value)]))}const kebabToCamel=input=>!input||typeof input!="string"?input:input.replace(/-([a-z])/g,function(match,group){return group.toUpperCase()}),kebabToCapitalize=input=>!input||typeof input!="string"?input:input.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" "),identifyMimetypeFromString=input=>{if(typeof input!="string"||!input.trim())return"";const trimmedInput=input.trim();if(trimmedInput.startsWith("{")&&trimmedInput.endsWith("}")||trimmedInput.startsWith("[")&&trimmedInput.endsWith("]"))try{return JSON.parse(trimmedInput),"application/json"}catch{}if(trimmedInput.startsWith("<")&&trimmedInput.endsWith(">"))return trimmedInput.match(/^<\?xml\s/i)||trimmedInput.match(/^<[a-zA-Z][^>]*>.*<\/[a-zA-Z][^>]*>$/s)?"application/xml":trimmedInput.match(/^<!DOCTYPE\s+html/i)||trimmedInput.match(/<html[^>]*>/i)||trimmedInput.match(/<head[^>]*>/i)||trimmedInput.match(/<body[^>]*>/i)||trimmedInput.match(/<div[^>]*>/i)||trimmedInput.match(/<p[^>]*>/i)?"text/html":trimmedInput.match(/<svg[^>]*>/i)?"image/svg+xml":"application/xml";if(trimmedInput.match(/^[^{]*\{[^}]*\}/s)||trimmedInput.match(/@(import|media|charset|keyframes|font-face)/i))return"text/css";if(trimmedInput.match(/^(function\s+\w+|var\s+\w+|let\s+\w+|const\s+\w+|class\s+\w+)/i)||trimmedInput.match(/(console\.log|document\.|window\.|require\(|import\s+)/i)||trimmedInput.match(/=>\s*{|function\s*\(/))return"application/javascript";if(trimmedInput.match(/^---\s*$/m)||trimmedInput.match(/^[a-zA-Z_][a-zA-Z0-9_]*:\s*[^\n]+$/m)||trimmedInput.match(/^\s*-\s+[^\n]+$/m))return"application/yaml";const lines=trimmedInput.split(`
|
|
14
|
-
`);if(lines.length>1){const firstLine=lines[0],hasCommas=firstLine.includes(","),hasSemicolons=firstLine.includes(";"),hasTabs=firstLine.includes(" ");if(hasCommas||hasSemicolons||hasTabs){const delimiter=hasCommas?",":hasSemicolons?";":" ",firstLineFields=firstLine.split(delimiter).length;let csvLikeLines=0;for(let i=0;i<Math.min(lines.length,5);i++){const fieldsCount=lines[i].split(delimiter).length;fieldsCount===firstLineFields&&fieldsCount>1&&csvLikeLines++}if(csvLikeLines>=Math.min(lines.length,3))return"text/csv"}}return trimmedInput.match(/^#+\s+/m)||trimmedInput.match(/^\*\s+/m)||trimmedInput.match(/^-\s+/m)||trimmedInput.match(/\*\*[^*]+\*\*/g)||trimmedInput.match(/\[[^\]]+\]\([^)]+\)/g)?"text/markdown":trimmedInput.match(/^\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER|GRANT|REVOKE)\s+/i)?"application/sql":"text/plain"},isBase64FileUrl=url=>{if(typeof url!="string")return!1;const regex=/^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/,match=url.match(regex);if(!match)return!1;const[,,base64Data]=match;return isBase64(base64Data)},getMimetypeFromBase64Data=async data=>{try{data=_cleanUpBase64Data(data);const imageBuffer=Buffer.from(data,"base64");return(await fileTypeFromBuffer(imageBuffer))?.mime||""}catch(error){return console.error("Error getting mimetype from base64 data: ",error),""}};async function getBase64FileInfo(data){if(isBase64FileUrl(data)){const regex=/^data:([^;]+);base64,(.*)$/,match=data.match(regex);if(!match)return{data:"",mimetype:"",size:0};const[,mimetype,base64Data]=match,cleanData=_cleanUpBase64Data(base64Data),buffer=Buffer.from(cleanData,"base64");return{data:cleanData,mimetype,size:buffer.byteLength}}else if(isBase64(data)){const cleanData=_cleanUpBase64Data(data),buffer=Buffer.from(cleanData,"base64");return{data:cleanData,mimetype:await getMimetypeFromBase64Data(cleanData),size:buffer.byteLength}}return null}function cleanBase64(str){return str.replace(/\s|\\n|\\s/g,"")}function isBase64DataUrl(input){return/^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/.test(input)}function isBase64(str){if(!isValidString(str))return!1;const cleanedBase64Data=cleanBase64(str);
|
|
14
|
+
`);if(lines.length>1){const firstLine=lines[0],hasCommas=firstLine.includes(","),hasSemicolons=firstLine.includes(";"),hasTabs=firstLine.includes(" ");if(hasCommas||hasSemicolons||hasTabs){const delimiter=hasCommas?",":hasSemicolons?";":" ",firstLineFields=firstLine.split(delimiter).length;let csvLikeLines=0;for(let i=0;i<Math.min(lines.length,5);i++){const fieldsCount=lines[i].split(delimiter).length;fieldsCount===firstLineFields&&fieldsCount>1&&csvLikeLines++}if(csvLikeLines>=Math.min(lines.length,3))return"text/csv"}}return trimmedInput.match(/^#+\s+/m)||trimmedInput.match(/^\*\s+/m)||trimmedInput.match(/^-\s+/m)||trimmedInput.match(/\*\*[^*]+\*\*/g)||trimmedInput.match(/\[[^\]]+\]\([^)]+\)/g)?"text/markdown":trimmedInput.match(/^\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER|GRANT|REVOKE)\s+/i)?"application/sql":"text/plain"};function calcSizeMb(text){return Buffer.byteLength(text,"utf-8")/1024/1024}const isBase64FileUrl=url=>{if(typeof url!="string")return!1;const regex=/^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/,match=url.match(regex);if(!match)return!1;const[,,base64Data]=match;return isBase64(base64Data)},getMimetypeFromBase64Data=async data=>{try{data=_cleanUpBase64Data(data);const imageBuffer=Buffer.from(data,"base64");return(await fileTypeFromBuffer(imageBuffer))?.mime||""}catch(error){return console.error("Error getting mimetype from base64 data: ",error),""}};async function getBase64FileInfo(data){if(isBase64FileUrl(data)){const regex=/^data:([^;]+);base64,(.*)$/,match=data.match(regex);if(!match)return{data:"",mimetype:"",size:0};const[,mimetype,base64Data]=match,cleanData=_cleanUpBase64Data(base64Data),buffer=Buffer.from(cleanData,"base64");return{data:cleanData,mimetype,size:buffer.byteLength}}else if(isBase64(data)){const cleanData=_cleanUpBase64Data(data),buffer=Buffer.from(cleanData,"base64");return{data:cleanData,mimetype:await getMimetypeFromBase64Data(cleanData),size:buffer.byteLength}}return null}function cleanBase64(str){return str.replace(/\s|\\n|\\s/g,"")}function isBase64DataUrl(input){return/^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/.test(input)}function isBase64(str){if(!isValidString(str))return!1;const cleanedBase64Data=cleanBase64(str);try{return Buffer.from(cleanedBase64Data,"base64").toString("base64").replace(/=+$/,"")===cleanedBase64Data.replace(/=+$/,"")}catch{return!1}}function parseBase64DataUrl(input){const pattern=/^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/,matches=input.match(pattern);if(!matches)throw new Error("Invalid data URL!");const[,mimetype,data]=matches;if(!isBase64(data))throw new Error("Invalid base64 data!");return{mimetype,data:cleanBase64(data)}}async function identifyMimetypeFromBase64(data){try{const cleanedData=cleanBase64(data),buffer=Buffer.from(cleanedData,"base64");return(await fileTypeFromBuffer(buffer))?.mime||""}catch(error){throw new Error(`Error identifying MIME type from base64 data: ${error?.message}`)}}async function identifyMimeTypeFromBase64DataUrl(input){try{const{data}=await parseBase64DataUrl(input),buffer=Buffer.from(data,"base64");return(await fileTypeFromBuffer(buffer))?.mime||""}catch(error){throw new Error(`Error identifying MIME type from base64 data: ${error?.message}`)}}const _cleanUpBase64Data=str=>{if(typeof str!="string"||str.length>MAX_FILE_SIZE)throw new Error("Invalid input");return str.replace(/\s|\\n|\\s/g,"")};async function streamToBuffer(stream){const chunks=[];for await(const chunk of stream)chunks.push(typeof chunk=="string"?Buffer.from(chunk):chunk);return Buffer.concat(chunks)}const binaryMimeTypes=["image/","audio/","video/","application/pdf","application/zip","application/octet-stream"];function dataToBuffer(data){let bufferData;switch(!0){case data instanceof ArrayBuffer:bufferData=Buffer.from(new Uint8Array(data));break;case(ArrayBuffer.isView(data)&&!(data instanceof DataView)):bufferData=Buffer.from(new Uint8Array(data.buffer));break;case data instanceof DataView:bufferData=Buffer.from(new Uint8Array(data.buffer,data.byteOffset,data.byteLength));break;case Buffer.isBuffer(data):bufferData=data;break;case typeof data=="string":bufferData=Buffer.from(data,"utf-8");break;default:return null}return bufferData}const getSizeFromBinary=data=>{const buffer=dataToBuffer(data);return buffer?buffer.byteLength:0};function getBase64FileSize(base64String){const base64Data=base64String.includes(";base64,")?base64String.split(";base64,")[1]:base64String,padding=base64Data.endsWith("==")?2:base64Data.endsWith("=")?1:0;return Math.floor(base64Data.length*3/4)-padding}const isPlainObject=data=>typeof data=="object"&&data!==null&&!Array.isArray(data)&&Object.prototype.toString.call(data)==="[object Object]"&&data.constructor===Object,isBuffer=data=>{try{return Buffer.isBuffer(data)}catch{return!1}},isBinaryMimeType=mimetype=>mimetype?binaryMimeTypes.some(type=>mimetype.startsWith(type)):!1,isBinaryData=data=>{if(typeof data=="string")return!1;try{const buffer=dataToBuffer(data);return buffer?isBinaryFileSync(buffer,buffer.byteLength):!1}catch{return!1}};function isUrl(str){return typeof str!="string"?!1:/^([a-zA-Z0-9]+:\/\/)([^\s.]+\.[^\s]{2,})(:[0-9]{1,5})?(\/[^\s]*)?(\?[^\s]*)?$/i.test(str)}function isSmythFsUrl(str){return typeof str!="string"?!1:/^smythfs:\/\/([^\s.]+\.[^\s]{2,})(:[0-9]{1,5})?(\/[^\s]*)?(\?[^\s]*)?$/i.test(str)}const isSmythFileObject=data=>!!(typeof data=="object"&&data!==null&&data?.url&&isUrl(data?.url)&&"size"in data&&"mimetype"in data);async function getMimeType(data){const mimeTypeGetters={blob:()=>data.type,buffer:async()=>{try{return(await fileTypeFromBuffer(data))?.mime??""}catch{return console.warn("Failed to get mime type from buffer"),""}},url:async()=>{try{return(await axios.get(data)).headers["content-type"]}catch{return console.warn("Failed to get mime type from URL"),""}},smythFile:()=>data.mimetype,base64DataUrl:()=>identifyMimeTypeFromBase64DataUrl(data),base64:()=>identifyMimetypeFromBase64(data),string:()=>identifyMimetypeFromString(data)},typeChecks={blob:data instanceof Blob,buffer:isBuffer(data),url:isUrl(data),smythFile:isSmythFileObject(data),base64DataUrl:isBase64FileUrl(data),base64:isBase64(data),string:typeof data=="string"},[matchedType=""]=Object.entries(typeChecks).find(([,value])=>value)||[];return matchedType?await mimeTypeGetters?.[matchedType]?.():""}async function formatDataForDebug(data,candidate){let dataForDebug;if(!data)return data;try{data.constructor?.name==="BinaryInput"?dataForDebug=`[BinaryInput size=${(await data.getJsonData(candidate))?.size}]`:isBuffer(data)?dataForDebug=`[Buffer size=${data.byteLength}]`:data.constructor?.name==="FormData"?dataForDebug="[FormData]":isBase64(data)||isBase64DataUrl(data)?dataForDebug=`[Base64 size=${getBase64FileSize(data)}]`:dataForDebug=data}catch{dataForDebug="[Binary]"}return dataForDebug}async function normalizeImageInput(inputImage){if(!inputImage)return"";if(typeof inputImage=="string"){if(isBase64(inputImage))return`data:${await getMimeType(inputImage)||"image/png"};base64,${inputImage}`;if(isBase64DataUrl(inputImage)||isUrl(inputImage))return inputImage;throw new Error("Invalid string input: must be base64, data URL, or HTTP(S) URL")}if(inputImage.constructor?.name==="BinaryInput")try{const buffer=await inputImage.getBuffer(),mimeType=await getMimeType(buffer)||"image/png",base64Data=buffer.toString("base64");return`data:${mimeType};base64,${base64Data}`}catch(error){throw new Error(`Failed to process BinaryInput: ${error.message}`)}throw new Error("Unsupported input type")}function parseCLIArgs(argList,argv){argv||(argv=process.argv);const args=argv,result={};return(Array.isArray(argList)?argList:[argList]).forEach(mainArg=>{const mainArgIndex=args.indexOf(`--${mainArg}`);if(mainArgIndex!==-1){const values=[];for(let i=mainArgIndex+1;i<args.length&&!args[i].startsWith("--");i++)values.push(args[i]);if(values.length===1&&values[0].includes("=")){const keyValuePairs={},[key,...valParts]=values[0].split("="),val=valParts.join("=").replace(/^"|"$/g,"");keyValuePairs[key]=val,result[mainArg]=keyValuePairs}else if(values.length===1)result[mainArg]=values[0];else if(values.length>1){const keyValuePairs={};values.forEach(value=>{const[key,...valParts]=value.split("="),val=valParts.join("=").replace(/^"|"$/g,"");keyValuePairs[key]=val}),result[mainArg]=keyValuePairs}}}),result}function getMainArgs(argv){argv||(argv=process.argv);const args=argv,result=[];for(let i=2;i<args.length;i++)args[i].startsWith("--")&&result.push(args[i].replace(/^--/,""));return result}const colors={reset:"\x1B[0m",bright:"\x1B[1m",red:"\x1B[31m",green:"\x1B[32m"};function askForValues(message,prompts,options={}){console.log(message);const result={},wasRaw=stdin.isRaw;for(const[key,label]of Object.entries(prompts)){stdout.write(`${label} `),stdin.setRawMode(!0),stdin.resume();let value="",cancelled=!1;const promptLength=label.length+1;for(;;){const buffer=Buffer.alloc(1);if(fs__default.readSync(stdin.fd,buffer,0,1,null)===0)break;const char=buffer.toString("utf8"),code=buffer[0];if(code===3){cancelled=!0;break}if(code===13||code===10){stdout.write(`
|
|
15
15
|
`);break}if(code===127||code===8){if(value.length>0){const oldValue=value;value=value.slice(0,-1);const terminalWidth=stdout.columns||80,oldTotalLength=promptLength+oldValue.length;promptLength+value.length;const oldLines=Math.ceil(oldTotalLength/terminalWidth);for(let i=1;i<oldLines;i++)stdout.write("\x1B[1A");stdout.write("\r");for(let i=0;i<oldLines;i++)stdout.write("\x1B[K"),i<oldLines-1&&stdout.write(`
|
|
16
16
|
`);for(let i=1;i<oldLines;i++)stdout.write("\x1B[1A");stdout.write("\r"),stdout.write(`${label} ${value}`)}continue}code>=32&&code<=126&&(value+=char,stdout.write(char))}stdin.setRawMode(wasRaw),stdin.pause(),cancelled&&(console.log(`
|
|
17
|
-
\u274C Operation cancelled by user.`),process.exit(130)),value.trim()&&(result[key]=value.trim())}return result}function isDigits(str){return typeof str=="number"?!0:typeof str!="string"?!1:/^-?\d+(\.\d+)?$/.test(str.trim())}function isSafeNumber(str){const num=parseFloat(str);return!isNaN(num)&&num<=Number.MAX_SAFE_INTEGER&&num>=Number.MIN_SAFE_INTEGER&&num.toString()===str.trim()}function validateCharacterSet(value){if(value==="")return!0;const parts=value.split(/(\{\{[^}]+\}\})/).filter(Boolean);for(const part of parts)if(part.startsWith("{{")&&part.endsWith("}}")){if(part.slice(2,-2).trim()==="")return!1}else if(!/^[a-zA-Z0-9\-_.]+$/.test(part))return!1;return!0}const validateInteger$2=args=>(value,helpers)=>{const numValue=Number(value),fieldName=helpers.schema._flags.label||helpers.state.path[helpers.state.path.length-1];if(isNaN(numValue))throw new Error(`The value for '${fieldName}' must be a number`);if(args.min!==void 0&&args.max!==void 0){if(numValue<args.min||numValue>args.max)throw new Error(`The value for '${fieldName}' must be from ${args.min} to ${args.max}`)}else if(args.min!==void 0){if(numValue<args.min)throw new Error(`The value for '${fieldName}' must be greater or equal to ${args.min}`)}else if(args.max!==void 0&&numValue>args.max)throw new Error(`The value for '${fieldName}' must be less or equal to ${args.max}`);return value},DEFAULT_TEAM_ID="default";var TAccessLevel=(TAccessLevel2=>(TAccessLevel2.None="none",TAccessLevel2.Owner="owner",TAccessLevel2.Read="read",TAccessLevel2.Write="write",TAccessLevel2))(TAccessLevel||{}),TAccessRole=(TAccessRole2=>(TAccessRole2.Agent="agent",TAccessRole2.User="user",TAccessRole2.Team="team",TAccessRole2.Public="public",TAccessRole2))(TAccessRole||{});const RoleMap={user:"u",agent:"a",team:"t",public:"p"},LevelMap={none:"n",owner:"o",read:"r",write:"w"},ReverseRoleMap=Object.fromEntries(Object.entries(RoleMap).map(([k,v])=>[v,k])),ReverseLevelMap=Object.fromEntries(Object.entries(LevelMap).map(([k,v])=>[v,k]));var TAccessResult=(TAccessResult2=>(TAccessResult2.Granted="granted",TAccessResult2.Denied="denied",TAccessResult2))(TAccessResult||{});class ACLAccessDeniedError extends Error{constructor(message){super(message),this.name="ACLAccessDeniedError"}}var __defProp$
|
|
17
|
+
\u274C Operation cancelled by user.`),process.exit(130)),value.trim()&&(result[key]=value.trim())}return result}function isDigits(str){return typeof str=="number"?!0:typeof str!="string"?!1:/^-?\d+(\.\d+)?$/.test(str.trim())}function isSafeNumber(str){const num=parseFloat(str);return!isNaN(num)&&num<=Number.MAX_SAFE_INTEGER&&num>=Number.MIN_SAFE_INTEGER&&num.toString()===str.trim()}function validateCharacterSet(value){if(value==="")return!0;const parts=value.split(/(\{\{[^}]+\}\})/).filter(Boolean);for(const part of parts)if(part.startsWith("{{")&&part.endsWith("}}")){if(part.slice(2,-2).trim()==="")return!1}else if(!/^[a-zA-Z0-9\-_.]+$/.test(part))return!1;return!0}const validateInteger$2=args=>(value,helpers)=>{const numValue=Number(value),fieldName=helpers.schema._flags.label||helpers.state.path[helpers.state.path.length-1];if(isNaN(numValue))throw new Error(`The value for '${fieldName}' must be a number`);if(args.min!==void 0&&args.max!==void 0){if(numValue<args.min||numValue>args.max)throw new Error(`The value for '${fieldName}' must be from ${args.min} to ${args.max}`)}else if(args.min!==void 0){if(numValue<args.min)throw new Error(`The value for '${fieldName}' must be greater or equal to ${args.min}`)}else if(args.max!==void 0&&numValue>args.max)throw new Error(`The value for '${fieldName}' must be less or equal to ${args.max}`);return value},DEFAULT_TEAM_ID="default";var TAccessLevel=(TAccessLevel2=>(TAccessLevel2.None="none",TAccessLevel2.Owner="owner",TAccessLevel2.Read="read",TAccessLevel2.Write="write",TAccessLevel2))(TAccessLevel||{}),TAccessRole=(TAccessRole2=>(TAccessRole2.Agent="agent",TAccessRole2.User="user",TAccessRole2.Team="team",TAccessRole2.Public="public",TAccessRole2))(TAccessRole||{});const RoleMap={user:"u",agent:"a",team:"t",public:"p"},LevelMap={none:"n",owner:"o",read:"r",write:"w"},ReverseRoleMap=Object.fromEntries(Object.entries(RoleMap).map(([k,v])=>[v,k])),ReverseLevelMap=Object.fromEntries(Object.entries(LevelMap).map(([k,v])=>[v,k]));var TAccessResult=(TAccessResult2=>(TAccessResult2.Granted="granted",TAccessResult2.Denied="denied",TAccessResult2))(TAccessResult||{});class ACLAccessDeniedError extends Error{constructor(message){super(message),this.name="ACLAccessDeniedError"}}var __defProp$1X=Object.defineProperty,__defNormalProp$1X=(obj,key,value)=>key in obj?__defProp$1X(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1X=(obj,key,value)=>__defNormalProp$1X(obj,typeof key!="symbol"?key+"":key,value);class AccessRequest{constructor(object){if(__publicField$1X(this,"id"),__publicField$1X(this,"resourceId"),__publicField$1X(this,"level",[]),__publicField$1X(this,"candidate"),object||(this.id="aclR:"+uid()),["role","id"].every(k=>k in object))this.id="aclR:"+uid(),this.candidate=object;else{const acReq=object;this.id=acReq.id,this.level=acReq.level,this.candidate=acReq.candidate}this.resourceId=void 0}static clone(request){return new AccessRequest(request)}setLevel(level){return this.level=Array.isArray(level)?level:[level],this}addLevel(level){return this.level=[...this.level,...Array.isArray(level)?level:[level]],this}resource(resourceId){return this.resourceId=resourceId,this}setCandidate(candidate){return this.candidate=candidate,this}}var __defProp$1W=Object.defineProperty,__defNormalProp$1W=(obj,key,value)=>key in obj?__defProp$1W(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1W=(obj,key,value)=>__defNormalProp$1W(obj,typeof key!="symbol"?key+"":key,value);class AccessCandidate{constructor(candidate){__publicField$1W(this,"role"),__publicField$1W(this,"id"),this.role=candidate?candidate.role:TAccessRole.Public,this.id=candidate?this._validateId(candidate.id):""}_validateId(id){if(/[^a-zA-Z0-9-]/.test(id))throw new Error(`Access Candidate ID can only contain alphanumeric characters and hyphens, invalid id: ${id}`);return id}toString(){return`AC:R[${this.role}]:ID[${this.id}]`}get request(){return new AccessRequest(this)}get readRequest(){return new AccessRequest(this).setLevel(TAccessLevel.Read)}get writeRequest(){return new AccessRequest(this).setLevel(TAccessLevel.Write)}get ownerRequest(){return new AccessRequest(this).setLevel(TAccessLevel.Owner)}static clone(candidate){return new AccessCandidate(candidate)}team(teamId){return this.role=TAccessRole.Team,this.id=teamId,this}static team(teamId){return new AccessCandidate({role:TAccessRole.Team,id:teamId})}agent(agentId){return this.role=TAccessRole.Agent,this.id=agentId,this}static agent(agentId){return new AccessCandidate({role:TAccessRole.Agent,id:agentId})}user(userId){return this.role=TAccessRole.User,this.id=userId,this}static user(userId){return new AccessCandidate({role:TAccessRole.User,id:userId})}public(){return this.role=TAccessRole.Public,this.id=TAccessRole.Public,this}static public(){return new AccessCandidate({role:TAccessRole.Public,id:""})}}var __defProp$1V=Object.defineProperty,__defNormalProp$1V=(obj,key,value)=>key in obj?__defProp$1V(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1V=(obj,key,value)=>__defNormalProp$1V(obj,typeof key!="symbol"?key+"":key,value);winston.addColors({error:"red",warn:"yellow",info:"green",debug:"blue"});const logLevelMap={min:"info",full:"debug"};let logLevel=()=>{let val=parseCLIArgs("debug")?.debug||config?.env?.LOG_LEVEL;return logLevelMap[val]&&(val=logLevelMap[val]),["none","error","warn","info","debug"].includes(val)?val:"none"};const namespaces=(config.env.LOG_FILTER||"").split(","),namespaceFilter=winston.format(info=>!config.env.LOG_FILTER||namespaces.some(ns=>info.module?.includes(ns))?info:!1)();class ArrayTransport extends Transport{constructor(opts){super(opts),__publicField$1V(this,"logs"),this.logs=opts.logs}log(info,callback){setImmediate(()=>{this.emit("logged",info)}),this.logs.push(`${info.level}: ${info.message}`),callback()}}class LogHelper extends EventEmitter{constructor(_logger,data,labels){super(),this._logger=_logger,this.data=data,this.labels=labels,__publicField$1V(this,"startTime",Date.now())}get output(){return Array.isArray(this.data)?this.data.join(`
|
|
18
18
|
`):void 0}get elapsedTime(){return Date.now()-this.startTime}log(...args){let module=this.labels?.module;const lastArg=args[args.length-1];lastArg instanceof AccessCandidate&&(module+=`,${lastArg.role}<${lastArg.id}>`,args.pop()),this._logger.log("info",formatLogMessage(...args),{...this.labels,module}),this.emit("logged",{level:"info",message:formatLogMessage(...args)})}warn(...args){let module=this.labels?.module;const lastArg=args[args.length-1];lastArg instanceof AccessCandidate&&(module+=`,${lastArg.role}<${lastArg.id}>`,args.pop()),this._logger.log("warn",formatLogMessage(...args),{...this.labels,module}),this.emit("logged",{level:"warn",message:formatLogMessage(...args)})}debug(...args){let module=this.labels?.module;const lastArg=args[args.length-1];lastArg instanceof AccessCandidate&&(module+=`,${lastArg.role}<${lastArg.id}>`,args.pop()),this._logger.log("debug",formatLogMessage(...args),{...this.labels,module}),this.emit("logged",{level:"debug",message:formatLogMessage(...args)})}info(...args){let module=this.labels?.module;const lastArg=args[args.length-1];lastArg instanceof AccessCandidate&&(module+=`,${lastArg.role}<${lastArg.id}>`,args.pop()),this._logger.log("info",formatLogMessage(...args),{...this.labels,module}),this.emit("logged",{level:"info",message:formatLogMessage(...args)})}verbose(...args){let module=this.labels?.module;const lastArg=args[args.length-1];lastArg instanceof AccessCandidate&&(module+=`,${lastArg.role}<${lastArg.id}>`,args.pop()),this._logger.log("verbose",formatLogMessage(...args),{...this.labels,module}),this.emit("logged",{level:"verbose",message:formatLogMessage(...args)})}error(...args){let module=this.labels?.module;const lastArg=args[args.length-1];lastArg instanceof AccessCandidate&&(module+=`,${lastArg.role}<${lastArg.id}>`,args.pop());const stack=`
|
|
19
19
|
Call Stack:
|
|
20
20
|
`+getFormattedStackTrace(10).join(`
|
|
21
|
-
`);this._logger.log("error",formatLogMessage(...args),{...this.labels,stack,module}),this.emit("logged",{level:"error",message:formatLogMessage(...args)})}close(){this._logger.clear(),this._logger.close()}}winston.format.printf(info=>`${info.timestamp} ${winston.format.colorize().colorize(info.level,`${info.level}: ${info.message}`)}`);const MAX_LOG_MESSAGE_LENGTH=500;function redactLogMessage(logMessage){if(config.env.NODE_ENV!=="PROD"||logMessage.length>500)return logMessage;const sensitiveWords=["password","eyJ","token","email","secret","key","apikey","api_key","auth","credential"],obfuscatedString=" [!! SmythOS::REDACTED_DATA !!] ";for(const sensitiveWord of sensitiveWords){const regex=new RegExp(`(${sensitiveWord})((?:[^\\n]{0,29}(?=\\n))|(?:[^\\n]{30}\\S*))`,"gmi");logMessage=logMessage.replace(regex,`$1${obfuscatedString}`)}return logMessage}function createBaseLogger(memoryStore){const logger2=winston.createLogger({format:winston.format.combine(winston.format(info=>config.env.LOG_LEVEL=="none"||logLevel()=="none"||logLevel()==""?!1:(info.message=redactLogMessage(info.message),info))(),winston.format.timestamp(),winston.format.errors({stack:!0}),winston.format.splat(),winston.format.json()),transports:[new winston.transports.Console({level:"error",format:winston.format.combine(winston.format.printf(info=>{let message=info.message;return message=message?.length>MAX_LOG_MESSAGE_LENGTH?message.substring(0,MAX_LOG_MESSAGE_LENGTH)+"...":message,`${info.level}:${info.module||""} ${message} ${info.stack||""}`})),stderrLevels:["error"]}),new winston.transports.Console({level:logLevel(),format:winston.format.combine(namespaceFilter,winston.format.printf(info=>{const module=info.module?winston.format.colorize().colorize(info.level,` [${info.module}]`):"",ns=winston.format.colorize().colorize(info.level,`${info.level}${module}`);let message=info.message;return message=message?.length>MAX_LOG_MESSAGE_LENGTH?message.substring(0,MAX_LOG_MESSAGE_LENGTH)+"...":message,`${ns} - ${message}`}))})]});return Array.isArray(memoryStore)&&logger2.add(new ArrayTransport({level:"debug",logs:memoryStore})),logger2}function formatLogMessage(...args){return args.map(arg=>{if(typeof arg=="object"&&arg!==null&&!(arg instanceof Error))try{return JSON.stringify(arg,null,2)}catch{return String(arg)}return String(arg)}).join(" ")}function createLabeledLogger(labels,memoryStore){const _logger=createBaseLogger(memoryStore);return _logger.defaultMeta=labels,new LogHelper(_logger,memoryStore,labels)}function Logger(module,withMemoryStore=!1){return createLabeledLogger(typeof module=="string"?{module}:module,withMemoryStore?[]:void 0)}var __defProp$1T=Object.defineProperty,__defNormalProp$1T=(obj,key,value)=>key in obj?__defProp$1T(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1T=(obj,key,value)=>__defNormalProp$1T(obj,typeof key!="symbol"?key+"":key,value);class LocalCache{constructor(defaultTTL=60*60*1e3){__publicField$1T(this,"cache"),__publicField$1T(this,"expiryMap"),__publicField$1T(this,"timeouts"),__publicField$1T(this,"defaultTTL",60*60*1e3),this.defaultTTL=defaultTTL,this.cache=new Map,this.expiryMap=new Map,this.timeouts=new Map}set(key,value,ttlMs=this.defaultTTL){this.cache.set(key,value);const expiry=Date.now()+ttlMs;this.expiryMap.set(key,expiry),this.clearTimeout(key);const timeout=setTimeout(()=>{this.delete(key)},ttlMs);this.timeouts.set(key,timeout),timeout.unref()}updateTTL(key,ttlMs=this.defaultTTL){if(!this.has(key))return;const expiry=Date.now()+ttlMs;this.expiryMap.set(key,expiry),this.clearTimeout(key);const timeout=setTimeout(()=>{this.delete(key)},ttlMs);this.timeouts.set(key,timeout),timeout.unref()}get(key,ttlMs){if(!this.has(key))return;const value=this.cache.get(key);if(value!==void 0)return this.updateTTL(key,ttlMs),value}has(key){if(!this.cache.has(key))return!1;const expiry=this.expiryMap.get(key);return expiry&&Date.now()>expiry?(this.delete(key),!1):!0}delete(key){return this.clearTimeout(key),this.expiryMap.delete(key),this.cache.delete(key)}clear(){for(const key of this.cache.keys())this.clearTimeout(key);this.cache.clear(),this.expiryMap.clear(),this.timeouts.clear()}clearTimeout(key){const timeout=this.timeouts.get(key);timeout&&(clearTimeout(timeout),this.timeouts.delete(key))}}var __defProp$1S=Object.defineProperty,__defNormalProp$1S=(obj,key,value)=>key in obj?__defProp$1S(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1S=(obj,key,value)=>__defNormalProp$1S(obj,typeof key!="symbol"?key+"":key,value);const logger$m=Logger("Connector"),_Connector=class _Connector2{constructor(_settings){this._settings=_settings,__publicField$1S(this,"name"),__publicField$1S(this,"started",!1),__publicField$1S(this,"_interactionHandler"),__publicField$1S(this,"_readyPromise")}get settings(){return this._settings}get interactionHandler(){return this._interactionHandler}get valid(){return!0}setInteraction(handler){this._interactionHandler=handler}instance(settings){const configHash=createHash("sha256").update(JSON.stringify(settings||{})).digest("hex"),key=`${this.name}-${configHash}`;if(_Connector2.lCache.has(key))return _Connector2.lCache.get(key);const constructor=this.constructor,instance=new constructor(settings);return _Connector2.lCache.set(key,instance,60*60*1e3),instance}static isValid(connector){return connector.name!==void 0&&connector.name!==null&&connector.name!==""}async start(){logger$m.info(`Starting ${this.name} connector ...`),this.started=!0}async stop(){logger$m.info(`Stopping ${this.name} connector ...`)}ready(){return this._readyPromise||(this._readyPromise=new Promise(resolve=>{let maxWait=6e4;const tick=100;if(this.started)resolve(!0);else{const interval=setInterval(()=>{this.started&&(clearInterval(interval),resolve(!0)),maxWait-=tick,maxWait<=0&&(clearInterval(interval),resolve(!1))},tick)}})),this._readyPromise}requester(candidate){return null}user(candidate){return typeof candidate=="string"?this.requester(AccessCandidate.user(candidate)):this.requester(candidate)}team(teamId){return this.requester(AccessCandidate.team(teamId))}agent(agentId){return this.requester(AccessCandidate.agent(agentId))}handleEvent(eventName,data){logger$m.debug(`Connector ${this.name} received event ${eventName} `)}};__publicField$1S(_Connector,"lCache",new LocalCache);let Connector=_Connector;const DummyConnector=name=>{const logger2=Logger(`DummyConnector<${name}>`);return new Proxy({},{get:function(target,prop,receiver){return prop==="valid"?!1:typeof target[prop]=="function"?target[prop]:function(...args){const argsString=args.length>0?args.map(arg=>typeof arg=="object"?JSON.stringify(arg,null,0).slice(0,50)+"...":typeof arg=="string"?`"${arg.slice(0,50)}..."`:typeof arg=="number"||typeof arg=="boolean"||typeof arg=="function"||typeof arg=="symbol"?arg.toString():typeof arg>"u"?"undefined":String(arg)).join(", "):"(no arguments)";logger2.warn(`[!!] Unimplemented Connector tried to call: ${name}.${prop.toString()}(${argsString})`),printStackTrace(logger2,3,1)}}})};Logger("SystemEvents");const SystemEvents=new EventEmitter,console$s=Logger("ConnectorService"),SRE_CONNECTORS_INSTANCE_SYMBOL=Symbol.for("SRE:ConnectorInstances"),SRE_CONNECTORS_SYMBOL=Symbol.for("SRE:Connector");let ServiceRegistry={},_ready=!1;SystemEvents.on("SRE:Booted",services=>{ServiceRegistry=services,_ready=!0});class ConnectorService{static get Connectors(){return global[SRE_CONNECTORS_SYMBOL]||(global[SRE_CONNECTORS_SYMBOL]={}),global[SRE_CONNECTORS_SYMBOL]}static get ConnectorInstances(){return global[SRE_CONNECTORS_INSTANCE_SYMBOL]||(global[SRE_CONNECTORS_INSTANCE_SYMBOL]={}),global[SRE_CONNECTORS_INSTANCE_SYMBOL]}static get ready(){return _ready}static get service(){return ServiceRegistry}static register(connectorType,connectorName,connectorConstructor){if(typeof connectorConstructor!="function"||!isSubclassOf(connectorConstructor,Connector)){console$s.error(`Invalid Connector ${connectorType}:${connectorName}`);return}if(ConnectorService.Connectors[connectorType]||(ConnectorService.Connectors[connectorType]={}),ConnectorService.Connectors[connectorType][connectorName]){console$s.warn(`Connector ${connectorType}:${connectorName} already registered ... skipping`);return}ConnectorService.Connectors[connectorType][connectorName]=connectorConstructor}static init(connectorType,connectorName,connectorId,settings={},isDefault=!1){if(ConnectorService.ConnectorInstances[connectorType]?.[connectorName])return console$s.warn(`Connector ${connectorType}:${connectorName} already initialized ... skipping`),ConnectorService.ConnectorInstances[connectorType]?.[connectorName];const entry=ConnectorService.Connectors[connectorType];if(!entry)return;const connectorConstructor=entry[connectorName];if(connectorConstructor){const connector=new connectorConstructor(settings);connector.interactionHandler&&connector.interactionHandler(),connector.start(),ConnectorService.ConnectorInstances[connectorType]||(ConnectorService.ConnectorInstances[connectorType]={});const id=connectorId||connectorName;return ConnectorService.ConnectorInstances[connectorType][id]=connector,!ConnectorService.ConnectorInstances[connectorType].default&&isDefault&&(ConnectorService.ConnectorInstances[connectorType].default=connector),connector}}static async _stop(){for(let connectorName in ConnectorService.ConnectorInstances){let allConnectors=Object.values(ConnectorService.ConnectorInstances[connectorName]);allConnectors=allConnectors.filter((value,index,self)=>self.indexOf(value)===index);for(let connector of allConnectors)connector.stop()}delete global[SRE_CONNECTORS_INSTANCE_SYMBOL],delete global[SRE_CONNECTORS_SYMBOL]}static getInstance(connectorType,connectorName="default"){return ConnectorService.ConnectorInstances[connectorType]?.[connectorName||"default"]||(console$s.warn(`Connector ${connectorType}:${typeof connectorName=="string"?connectorName:JSON.stringify(connectorName)} not initialized returning DummyConnector`),printStackTrace(console$s,10),DummyConnector(connectorType))}static getStorageConnector(name){return ConnectorService.getInstance(TConnectorService.Storage,name)}static getCacheConnector(name){return ConnectorService.getInstance(TConnectorService.Cache,name)}static getVectorDBConnector(name){return ConnectorService.getInstance(TConnectorService.VectorDB,name)}static getNKVConnector(name){return ConnectorService.getInstance(TConnectorService.NKV,name)}static getLLMConnector(name){return ConnectorService.getInstance(TConnectorService.LLM,name)}static getVaultConnector(name){return ConnectorService.getInstance(TConnectorService.Vault,name)}static getManagedVaultConnector(name){return ConnectorService.getInstance(TConnectorService.ManagedVault,name)}static getAccountConnector(name){return ConnectorService.getInstance(TConnectorService.Account,name)}static getAgentDataConnector(name){return ConnectorService.getInstance(TConnectorService.AgentData,name)}static getCLIConnector(name){return ConnectorService.getInstance(TConnectorService.CLI,name)}static getLogConnector(name){return ConnectorService.getInstance(TConnectorService.Log,name)}static getComponentConnector(name){return ConnectorService.getInstance(TConnectorService.Component,name)}static getModelsProviderConnector(name){return ConnectorService.getInstance(TConnectorService.ModelsProvider,name)}static hasInstance(connectorType,connectorName="default"){const instance=ConnectorService.ConnectorInstances[connectorType]?.[connectorName];return instance&&instance.valid}static getRouterConnector(name){return ConnectorService.getInstance(TConnectorService.Router,name)}static getCodeConnector(name){return ConnectorService.getInstance(TConnectorService.Code,name)}static getSchedulerConnector(name){return ConnectorService.getInstance(TConnectorService.Scheduler,name)}static getTelemetryConnector(name){return ConnectorService.getInstance(TConnectorService.Telemetry,name)}}class ConnectorServiceProvider{init(){}constructor(){this.register()}}class VaultHelper{static async getTeamKey(key,teamId){return await ConnectorService.getVaultConnector().requester(AccessCandidate.team(teamId)).get(key)}static async getUserKey(key,userId){const vaultConnector=ConnectorService.getVaultConnector(),teamId=await ConnectorService.getAccountConnector().getCandidateTeam(AccessCandidate.user(userId));return await vaultConnector.requester(AccessCandidate.team(teamId)).get(key)}static async getAgentKey(key,agentId){const vaultConnector=ConnectorService.getVaultConnector(),teamId=await ConnectorService.getAccountConnector().getCandidateTeam(AccessCandidate.agent(agentId));return await vaultConnector.requester(AccessCandidate.team(teamId)).get(key)}}var __defProp$1R=Object.defineProperty,__defNormalProp$1R=(obj,key,value)=>key in obj?__defProp$1R(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1R=(obj,key,value)=>__defNormalProp$1R(obj,typeof key!="symbol"?key+"":key,value);const Match={default:/{{(.*?)}}/g,doubleCurly:/{{(.*?)}}/g,singleCurly:/{(.*?)}/g,doubleCurlyForSingleMatch:/{{(.*?)}}/,templateVariables:/{{([A-Z]+):([\w\s]+):[\[{](.*?)[\]}]}}/gm,prefix(prefix){return new RegExp(`{{${prefix}(.*?)}}`,"g")},suffix(suffix){return new RegExp(`{{(.*?)${suffix}}}`,"g")},prefSuf(prefix,suffix){return new RegExp(`{{${prefix}(.*?)${suffix}}}`,"g")},fn(name){return new RegExp(`{{${name}\\((.*?)\\)}}`,"g")}},TPLProcessor={vaultTeam(teamId){return async token=>{try{return await VaultHelper.getTeamKey(token,teamId)}catch{return token}}},componentTemplateVar(templateSettings){return async(token,matches)=>{try{const label=matches[2];if(!label)return token;const entry=Object.values(templateSettings).find(o=>o.label==label);return entry?`{{${entry.id}}}`:token}catch{return token}}}};class TemplateStringHelper{constructor(templateString){this.templateString=templateString,__publicField$1R(this,"_current"),__publicField$1R(this,"_promiseQueue",[]),this._current=templateString}get result(){if(this._promiseQueue.length<=0)return this._current;throw new Error("This template object has async results, you should use .asyncResult with await instead of .result")}get asyncResult(){return new Promise(async(resolve,reject)=>{await Promise.all(this._promiseQueue),resolve(this._current)})}static create(templateString){return new TemplateStringHelper(templateString)}parse(data,regex=Match.default,maxDepth=5){if(typeof this._current!="string"||typeof data!="object")return this;for(let i=0;i<maxDepth;i++){const previous=this._current;if(this._current=this._current.replace(regex,(match,token)=>{let val=data?.[token]??match;return data?.[token]||(val=JSONExpression$1(data,token)||`{{${token}}}`),typeof val=="object"?JSON.stringify(val):escapeJsonField(val)}),previous===this._current)break}return this}parseRaw(data,regex=Match.doubleCurlyForSingleMatch){if(typeof this._current!="string"||typeof data!="object")return this;const match=this._current.match(regex),key=match?match[1]:"";if(key){const value=data?.[key];this._current=value}return this}parseTeamKeysAsync(teamId){return this.process(TPLProcessor.vaultTeam(teamId),Match.fn("KEY"))}parseComponentTemplateVarsAsync(templateSettings){return this.process(TPLProcessor.componentTemplateVar(templateSettings),Match.templateVariables)}process(processor,regex=Match.default){if(typeof this._current!="string")return this;let tokens={},match;const prosessorPromises=[];for(;(match=regex.exec(this._current))!==null;){const token=match[1];tokens[token]=match[0];const _processor=processor(token,match);_processor instanceof Promise?(_processor.then(result=>{if(result===void 0)return match?.[0];tokens[token]=result}),prosessorPromises.push(_processor)):tokens[token]=_processor}return prosessorPromises.length>0?(new Promise(async(resolve,reject)=>{await Promise.all(prosessorPromises),this.parse(tokens,regex),resolve(!0)}),this._promiseQueue.push(Promise.all(prosessorPromises))):this.parse(tokens,regex),this}clean(regex=Match.default,replaceWith=""){return typeof this._current!="string"?this:(this._current=this._current.replace(regex,replaceWith),this)}}function JSONExpression$1(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}function escapeString(str){return str&&str.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function escapeJsonField(str){return typeof str!="string"?str:str.replace(/\\"/g,'"').replace(/"/g,'\\"')}function TemplateString(templateString){return TemplateStringHelper.create(templateString)}var __defProp$1Q=Object.defineProperty,__defNormalProp$1Q=(obj,key,value)=>key in obj?__defProp$1Q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1Q=(obj,key,value)=>__defNormalProp$1Q(obj,typeof key!="symbol"?key+"":key,value);const console$r=Logger("AgentLogger.class");class LogTransaction{constructor(agent,trId){this.agent=agent,this.trId=trId,__publicField$1Q(this,"_callId",""),__publicField$1Q(this,"queue",[]),__publicField$1Q(this,"_isProcessing",!1),__publicField$1Q(this,"_lastPush",0),__publicField$1Q(this,"storage"),this.storage=ConnectorService.getStorageConnector()}async getCallId(){return this._callId}push(logData){ConnectorService.getLogConnector().valid&&(this.queue.push(logData),this._lastPush=Date.now(),this.processQueue())}formatData(data,maxLength=1e3){if(!data)return;let result=typeof data=="string"?data:JSON.stringify(data);return result.length>maxLength&&(result=result.substr(0,maxLength)+"..."),result}getDataFilePath(data,maxLength=1e3){if(data){if((typeof data=="string"?data:JSON.stringify(data)).length>maxLength){const dayFolder=getDayFormattedDate(),trId="L"+uid().toUpperCase();return`${dayFolder}/${trId}`}return null}}prepareData(firstData){let sourceId=firstData.sourceId,componentId=firstData.componentId,input=firstData.input?{preview:this.formatData(firstData.input),full:this.getDataFilePath(firstData.input),action:firstData.input.__action,status:firstData.input.__status}:void 0,output=firstData.output?{preview:this.formatData(firstData.output),full:this.getDataFilePath(firstData.output)}:void 0,domain=firstData.domain,inputTimestamp=firstData.inputTimestamp,outputTimestamp=firstData.outputTimestamp,result=firstData.result?JSON.stringify({preview:this.formatData(firstData.result),full:this.getDataFilePath(firstData.result)}):void 0,sessionID=firstData.sessionID;const sourceData=this.agent.components[sourceId],componentData=this.agent.components[componentId],sourceCptName=sourceData?.name,componentCptName=componentData?.name,sourceName=sourceData?.displayName||sourceData?.name||sourceId,componentName=componentData?.displayName||componentData?.name||componentId,curStepOrder=firstData.step||this.agent?.agentRuntime?.curStep||"",nextStepOrder=curStepOrder+1;sourceCptName&&(sourceId+=`@${sourceCptName}@${curStepOrder}`),componentCptName&&(componentId+=`@${componentCptName}@${nextStepOrder}`);const inputTokens=void 0,outputTokens=void 0,tags=firstData.tags||"";let raw_error=firstData.error||firstData?.output?.error||firstData?.output?._error||firstData?.result?.error||firstData?.result?.result?.error||firstData?.result?._error||firstData?.result?.result?._error;const error=raw_error?JSON.stringify({preview:this.formatData(raw_error),full:this.getDataFilePath(raw_error)}):void 0;return{sourceId,componentId,domain,input,output,inputTimestamp,outputTimestamp,result,error,sourceName,componentName,sessionID,inputTokens,outputTokens,tags,workflowID:firstData.workflowID,processID:firstData.processID,raw_input:firstData.input,raw_output:firstData.output,raw_result:firstData.result,raw_error}}async storeLogData(filePath,content){const logConnector=ConnectorService.getLogConnector();if(!(!logConnector.valid||logConnector.name=="ConsoleLog")&&filePath)try{const body=typeof content=="string"?content:JSON.stringify(content),storagePath=path.posix.join("teams",this.agent.teamId,`logs/${this.agent.id}/${filePath}`),metadata={teamid:this.agent.teamId,agentid:this.agent.id,ContentType:"text/plain"};await this.storage.requester(AccessCandidate.agent(this.agent.id)).write(storagePath,body,void 0,metadata)}catch(error){console$r.error("Error storing Log File : ",filePath,error)}}async processQueue(){const logConnector=ConnectorService.getLogConnector();if(!(!logConnector.valid||this.queue.length<=0||this._isProcessing)){this._isProcessing=!0;try{if(this._callId)for(;this.queue.length>0;){const logData=this.queue.shift(),data=this.prepareData(logData);Object.keys(data).forEach(key=>{data[key]||delete data[key]});const raw_input=data.raw_input,raw_output=data.raw_output,raw_result=data.raw_result,raw_error=data.raw_error;delete data.raw_input,delete data.raw_output,delete data.raw_result,delete data.raw_error;const resultObj=data.result?JSON.parse(data.result):void 0,errorObj=data.error?JSON.parse(data.error):void 0;await this.storeLogData(data?.input?.full,raw_input),await this.storeLogData(data?.output?.full,raw_output),await this.storeLogData(resultObj?.full,raw_result),await this.storeLogData(errorObj?.full,raw_error),await logConnector.requester(AccessCandidate.agent(this.agent.id)).log(data,this._callId)}else{const firstData=this.queue.shift(),data=this.prepareData(firstData),raw_input=data.raw_input,raw_output=data.raw_output,raw_result=data.raw_result,raw_error=data.raw_error;delete data.raw_input,delete data.raw_output,delete data.raw_result,delete data.raw_error;const resultObj=data.result?JSON.parse(data.result):void 0,errorObj=data.error?JSON.parse(data.error):void 0;await this.storeLogData(data?.input?.full,raw_input),await this.storeLogData(data?.output?.full,raw_output),await this.storeLogData(resultObj?.full,raw_result),await this.storeLogData(errorObj?.full,raw_error);const logResult=await logConnector.requester(AccessCandidate.agent(this.agent.id)).log(data);this._callId=logResult?.data?.log?.id}}catch(error){console$r.error("Error processing log queue:",error?.response?.data?.message||error)}this._isProcessing=!1,debounce(this.processQueue.bind(this),1e3,{leading:!0,maxWait:1e4}),await delay(1e3),this.processQueue()}}canDelete(){return this.queue.length>0?(this.processQueue(),!1):this._lastPush!=0&&this._lastPush+1e3*60*60*1<Date.now()}}const _AgentLogger=class _AgentLogger2{constructor(agent){this.agent=agent}static async cleanup(){if(!ConnectorService.getLogConnector().valid)return;const trIds=Object.keys(_AgentLogger2.transactions);for(const trId of trIds)_AgentLogger2.transactions[trId].canDelete()&&delete _AgentLogger2.transactions[trId]}static log(agent,trId,logData){if(ConnectorService.getLogConnector().valid)return(agent?.agentRuntime?.debug||agent?.debugSessionEnabled)&&(logData.tags="DEBUG "),trId||(trId="log-"+uid()),this.transactions[trId]||(this.transactions[trId]=new LogTransaction(agent,trId)),this.transactions[trId].push(logData),debounce(this.cleanup.bind(this),1e3,{leading:!0,maxWait:1e4*1}),trId}static async logTask(agent,tasks){const logConnector=ConnectorService.getLogConnector();logConnector.valid&&(agent.usingTestDomain||await logConnector.requester(AccessCandidate.agent(agent.id)).logTask(tasks,agent.usingTestDomain),debounce(this.cleanup.bind(this),1e3,{leading:!0,maxWait:1e4*1}))}};__publicField$1Q(_AgentLogger,"transactions",{}),__publicField$1Q(_AgentLogger,"cleanupInterval");let AgentLogger=_AgentLogger;var __defProp$1P=Object.defineProperty,__defNormalProp$1P=(obj,key,value)=>key in obj?__defProp$1P(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1P=(obj,key,value)=>__defNormalProp$1P(obj,typeof key!="symbol"?key+"":key,value);class LLMCache{constructor(candidate,cacheId,ttl=1*60*60){__publicField$1P(this,"_cacheConnector"),__publicField$1P(this,"_cacheId"),__publicField$1P(this,"_ttl"),__publicField$1P(this,"_candidate"),this._cacheConnector=ConnectorService.getCacheConnector(),this._cacheId=cacheId||"llm_cache_"+uid(),this._ttl=ttl,this._candidate=candidate}get id(){return this._cacheId}async set(key,data){this._cacheConnector.valid&&await this._cacheConnector.requester(this._candidate).set(`${this._cacheId}:${key}`,typeof data=="object"?JSON.stringify(data):data,null,null,this._ttl)}async get(key,format="json"){if(!this._cacheConnector.valid)return;const obj=await this._cacheConnector.requester(this._candidate).get(`${this._cacheId}:${key}`);let result;if(format==="json")try{result=JSON.parse(obj)}catch{console.warn(`Invalid JSON data for key ${key}`),result=null}else result=obj;return result}async delete(key){this._cacheConnector.valid&&await this._cacheConnector.requester(this._candidate).delete(`${this._cacheId}:${key}`)}async clear(){this._cacheConnector.valid&&await this._cacheConnector.requester(this._candidate).delete(this._cacheId)}}var __defProp$1O=Object.defineProperty,__defNormalProp$1O=(obj,key,value)=>key in obj?__defProp$1O(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1O=(obj,key,value)=>__defNormalProp$1O(obj,typeof key!="symbol"?key+"":key,value);const console$q=Logger("RuntimeContext");class RuntimeContext extends EventEmitter$1{constructor(runtime){super(),this.runtime=runtime,__publicField$1O(this,"circularLimitReached",!1),__publicField$1O(this,"step",0),__publicField$1O(this,"sessionResult",!1),__publicField$1O(this,"sessionResults"),__publicField$1O(this,"components",{}),__publicField$1O(this,"checkRuntimeContext",null),__publicField$1O(this,"ctxFile",""),__publicField$1O(this,"_runtimeFileReady"),__publicField$1O(this,"_cacheConnector"),__publicField$1O(this,"_readyPromise"),__publicField$1O(this,"_lastCtxLength",0),__publicField$1O(this,"_syncQueue",Promise.resolve());const agent=runtime.agent;this._cacheConnector=ConnectorService.getCacheConnector();const reqId=(runtime.processID?.split(":")[0]||"")==runtime.xDebugId?"":"."+uid()+runtime.reqTag;this.ctxFile=`${runtime.xDebugId}${reqId}${agent.jobID?`-job-${agent.jobID}`:""}`,this._readyPromise=new Promise((resolve,reject)=>{let resolved=!1;this.on("ready",()=>{resolved=!0,resolve(!0)}),setTimeout(()=>{resolved||reject(new Error("Agent Runtime context initialization timeout"))},5*60*1e3).unref()}),this.initRuntimeContext()}serialize(){return{step:this.step,sessionResult:this.sessionResult,sessionResults:this.sessionResults,components:this.components}}deserialize(data){this.step=data.step,this.sessionResult=data.sessionResult,this.sessionResults=data.sessionResults,this.components=data.components}reset(){this.step=0,this.sessionResult=!1,this.sessionResults=null,this.components={}}initRuntimeContext(){if(this._runtimeFileReady)return;console$q.debug("Init Agent Context",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id));const agent=this.runtime.agent;let ctxData={};this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).get(this.ctxFile).then(async data=>{if(data)ctxData=JSON.parse(data),ctxData.step||(ctxData.step=0);else{ctxData=JSON.parse(JSON.stringify({components:agent.components,connections:agent.connections,timestamp:Date.now()})),ctxData.step||(ctxData.step=0);for(let cptId in ctxData.components)ctxData.components[cptId]={id:cptId,name:ctxData.components[cptId].name,ctx:{active:!1,name:ctxData.components[cptId].name}};await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).set(this.ctxFile,JSON.stringify(ctxData),null,null,1*60*60)}this.deserialize(ctxData),this._runtimeFileReady=!0,this.emit("ready")})}async ready(){return this._runtimeFileReady?!0:this._readyPromise}async sync(){if(!this.ctxFile)return;this.emit("syncing");const deleteSession=this.runtime.sessionClosed,data=this.serialize();if(data){let serializedData=JSON.stringify(data);serializedData.length!=this._lastCtxLength&&(console$q.debug("Agent Context Size",this.ctxFile,serializedData.length,AccessCandidate.agent(this.runtime.agent.id)),this._lastCtxLength=serializedData.length),await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).set(this.ctxFile,serializedData,null,null,3*60*60);const cooldown=serializedData.length/1024/1024/10*1e3;serializedData=null,await delay(cooldown)}deleteSession&&await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).exists(this.ctxFile)&&(console$q.debug("Agent Context Delete",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),this.runtime.debug?this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).updateTTL(this.ctxFile,5*60):this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).delete(this.ctxFile),this.ctxFile=null)}enqueueSync(){this.ctxFile&&(this._syncQueue=this._syncQueue.then(()=>this.sync()).catch(err=>{console$q.error("Error syncing context",err)}))}incStep(){this.step++}updateComponent(componentId,data){const ctxData=this;if(!ctxData)return;const component=ctxData.components[componentId];component||(console$q.debug(">>>>>>> updateComponent Component debug data not found",componentId,component,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxFile",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxData",ctxData,AccessCandidate.agent(this.runtime.agent.id))),component.ctx||(component.ctx={active:!1,name:"",step:0}),Object.assign(component.ctx,data),component.ctx.step=this.step,this.enqueueSync()}resetComponent(componentId){const ctxData=this,component=ctxData.components[componentId];component||(console$q.debug(">>>>>>> resetComponent Component debug data not found",componentId,component,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxFile",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxData",ctxData,AccessCandidate.agent(this.runtime.agent.id))),component.ctx.runtimeData={},component.ctx.active=!1,this.runtime.debug||(component.ctx.input=void 0,component.ctx.output=void 0),this.enqueueSync()}getComponentData(componentId){const ctxData=this;if(!ctxData)return null;const component=ctxData.components[componentId];return component||(console$q.debug(">>>>>>> getComponentData Component debug data not found",componentId,component,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxFile",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxData",ctxData,AccessCandidate.agent(this.runtime.agent.id))),component.ctx}}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,typeof key!="symbol"?key+"":key,value);const logger$l=Logger("AgentRuntime"),AgentRuntimeUnavailable=new Proxy({},{get:function(target,prop,receiver){return typeof target[prop]=="function"?target[prop]:function(){logger$l.warn(`AgentRuntime Unavailable tried to call : ${prop.toString()}`)}}}),_AgentRuntime=class _AgentRuntime2{constructor(agent){this.agent=agent,__publicField$1N(this,"agentContext"),__publicField$1N(this,"llmCache"),__publicField$1N(this,"xDebugRun",""),__publicField$1N(this,"xDebugInject",""),__publicField$1N(this,"xDebugRead",""),__publicField$1N(this,"xDebugStop",""),__publicField$1N(this,"xDebugPendingInject",null),__publicField$1N(this,"xMockDataInject",null),__publicField$1N(this,"xDebugId",""),__publicField$1N(this,"xDebugCmd",""),__publicField$1N(this,"_debugActive",!1),__publicField$1N(this,"_runtimeFileReady",!1),__publicField$1N(this,"sessionClosed",!1),__publicField$1N(this,"reqTagOwner",!1),__publicField$1N(this,"reqTag"),__publicField$1N(this,"processID"),__publicField$1N(this,"workflowReqId"),__publicField$1N(this,"alwaysActiveComponents",{}),__publicField$1N(this,"exclusiveComponents",{}),__publicField$1N(this,"checkRuntimeContext",null),this.reqTag=agent.agentRequest.header("X-REQUEST-TAG");const isNestedProcess=!!this.reqTag;this.reqTag?(this.xDebugStop=void 0,this.xDebugRun=void 0,this.xDebugInject=void 0,this.xDebugRead=void 0):(this.xDebugStop=agent.agentRequest.header("X-DEBUG-STOP"),this.xDebugRun=agent.agentRequest.header("X-DEBUG-RUN"),this.xDebugInject=agent.agentRequest.header("X-DEBUG-INJ"),this.xDebugRead=agent.agentRequest.header("X-DEBUG-READ"),this.reqTag="xTAG-"+uid(),this.reqTagOwner=!0),this.agent.conversationId=agent.agentRequest.header("X-CONVERSATION-ID"),this.xDebugId=this.xDebugStop||this.xDebugRun||this.xDebugRead,!this.xDebugId&&agent.agentRequest.body&&(this.xDebugInject!=null&&this.xDebugInject!=null?(this.xDebugPendingInject=agent.agentRequest.body,this.xDebugRun=this.xDebugInject||"inj-"+uid()):this.xDebugRun==""&&(this.xDebugRun="dbg-"+uid()),this.xDebugId=this.xDebugRun),agent.agentRequest.header("X-MOCK-DATA-INJ")!==void 0&&(this.xMockDataInject=agent.agentRequest.body),this.processID=this.xDebugId,this.xDebugId||(this.xDebugId=agent.sessionId,this.processID=this.reqTag),isNestedProcess&&(this.processID+=`:${Math.floor(1e3+Math.random()*9e3)}`),this.workflowReqId=this.xDebugRun||this.xDebugStop||this.reqTag,_AgentRuntime2.tagsData[this.reqTag]||(_AgentRuntime2.tagsData[this.reqTag]={}),_AgentRuntime2.processResults[this.processID]||(_AgentRuntime2.processResults[this.processID]={timestamp:Date.now(),errorResults:[],sessionResults:[]}),this.agentContext=new RuntimeContext(this),this.agentContext.on("ready",()=>{let method=(agent.agentRequest.method||"POST").toUpperCase();const endpoint=agent.endpoints?.[agent.agentRequest.path]?.[method],trigger=agent.triggers?.[agent.agentRequest.path],endpointDBGCall=this.xDebugId?.startsWith("dbg-");this.alwaysActiveComponents={},this.exclusiveComponents={};for(let component of this.agent.data.components){const cpt=this.agent.ComponentInstances[component.name];if(!cpt){logger$l.warn(`Component ${component.name} Exists in agent but has no implementation`,AccessCandidate.agent(this.agent.id));continue}if(trigger&&trigger.id!=null&&component.id==trigger.id&&this.xDebugId?.startsWith("dbg-")&&this.updateComponent(component.id,{active:!0}),endpoint&&endpoint.id!=null&&component.id==endpoint.id&&endpointDBGCall&&this.updateComponent(component.id,{active:!0}),cpt.alwaysActive){this.alwaysActiveComponents[component.id]=cpt,this.updateComponent(component.id,{active:!0,alwaysActive:!0});const runtimeData={...this.getRuntimeData(component.id)};this.saveRuntimeComponentData(component.id,runtimeData)}if(cpt.exclusive){this.exclusiveComponents[component.id]=cpt,this.updateComponent(component.id,{exclusive:!0});const runtimeData={...this.getRuntimeData(component.id)};this.saveRuntimeComponentData(component.id,runtimeData)}}}),this._debugActive=this.xDebugId!=agent.sessionId;const xCacheId=agent.agentRequest.header("X-CACHE-ID")||"";this.llmCache=new LLMCache(AccessCandidate.agent(this.agent.id),xCacheId)}get circularLimitReached(){return this.agentContext?.circularLimitReached||!1}set circularLimitReached(value){this.agentContext&&(this.agentContext.circularLimitReached=value)}get debug(){return this._debugActive}get curStep(){return this.agentContext?.step||0}async ready(){return this.agentContext.ready()}destroy(){this.sessionClosed=!0,this.sync()}incTag(componentId){_AgentRuntime2.tagsData[this.reqTag][componentId]||(_AgentRuntime2.tagsData[this.reqTag][componentId]=0),_AgentRuntime2.tagsData[this.reqTag][componentId]++}async sync(){(this.reqTagOwner&&this.sessionClosed||this.circularLimitReached)&&delete _AgentRuntime2.tagsData[this.reqTag],this.agentContext.enqueueSync()}getWaitingComponents(){const ctxData=this.agentContext;return Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0).filter(c=>c?.ctx?.status&&typeof c?.ctx?.output!==void 0)}getExclusiveActiveComponents(){const ctxData=this.agentContext;return Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0).filter(c=>c?.ctx?.exclusive==!0)}readState(stateId,deltaOnly=!1){if(!this._debugActive||!stateId)return null;const runtime=this,agent=this.agent,ctxData=runtime.agentContext,dbgAllComponents=runtime.xDebugPendingInject||Object.values(ctxData?.components||[]);let dbgActiveComponents;dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.exclusive==!0),(!dbgActiveComponents||dbgActiveComponents.length==0)&&(dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0||!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0)),dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.status&&typeof c?.ctx?.output!==void 0),dbgAllComponents.filter(c=>c?.ctx?.active==!0&&!c?.ctx?.status);let state={};for(let dbgComponent of dbgAllComponents)state[dbgComponent.id]=dbgComponent.ctx;let dbgSession=stateId;(!dbgActiveComponents||dbgActiveComponents.length==0)&&(dbgSession=null,runtime.sessionClosed=!0);const remainingActiveComponents=Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0&&!c?.ctx?.alwaysActive),activeAsyncComponents=Object.values(ctxData?.components||[]).filter(c=>!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0);if(remainingActiveComponents.length==0&&activeAsyncComponents.length==0&&(runtime.sessionClosed=!0),runtime.circularLimitReached){const error=`Circular Calls Limit Reached on ${runtime.checkCircularLimit()}. Current agent circular limit is ${agent.circularLimit}`;return runtime.sessionClosed=!0,{state,dbgSession,sessionClosed:runtime.sessionClosed,error}}const step=this.curStep>=1?this.curStep-1:0;if(deltaOnly){const delta={};for(let cptId in state){const cpt=state[cptId];cpt.step>=step&&(delta[cptId]=cpt)}state=delta}return{state,dbgSession,sessionClosed:runtime.sessionClosed,step}}async runCycle(){logger$l.debug(`runCycle agentId=${this.agent.id} wfReqId=${this.workflowReqId} reqTag=${this.reqTag} session=${this.xDebugRun} cycleId=${this.processID}`,AccessCandidate.agent(this.agent.id));const runtime=this,agent=this.agent,ctxData=runtime.agentContext,dbgAllComponents=runtime.xDebugPendingInject||Object.values(ctxData?.components||[]);let dbgActiveComponents;dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.exclusive==!0),(!dbgActiveComponents||dbgActiveComponents.length==0)&&(dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0||!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0));const dbgActiveWaitingComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.status&&typeof c?.ctx?.output!==void 0),dbgActiveReadyComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&!c?.ctx?.status||!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0);let step;if((!dbgActiveComponents||dbgActiveComponents.length==0)&&(runtime.sessionClosed=!0,step={state:{sessionClosed:!0},dbgSession:null,expiredDbgSession:runtime.xDebugId,sessionClosed:!0}),!step&&dbgActiveComponents.length==dbgActiveWaitingComponents.length&&ctxData.sessionResult&&(runtime.sessionClosed=!0,step={state:{sessionClosed:!0},dbgSession:null,expiredDbgSession:runtime.xDebugId,sessionClosed:!0}),!step&&dbgActiveReadyComponents.length>0){const promises=[];for(let dbgComponent of dbgActiveReadyComponents){const injectInput=runtime.xDebugPendingInject?dbgComponent.ctx.input:void 0;promises.push(agent.callComponent(dbgComponent.ctx.sourceId,dbgComponent.id,injectInput))}const dbgResults=await Promise.all(promises),state=dbgResults.length==1?dbgResults[0]:dbgResults;runtime.xDebugPendingInject=null;const remainingActiveComponents=Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0),activeAsyncComponents=Object.values(ctxData?.components||[]).filter(c=>!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0);dbgAllComponents.filter(c=>c?.ctx?.status&&typeof c?.ctx?.output!==void 0).length==remainingActiveComponents.length&&(ctxData.sessionResult=!0);const triggers=Object.values(agent.triggers);let triggersResults=dbgResults.flat().filter(e=>e.id&&e.result&&!e.result._missing_inputs&&!e.result._in_progress&&triggers.find(t=>t.id==e.id)),sessionResults=dbgResults.flat().filter(e=>e.id&&e.result&&!e.result._missing_inputs&&!agent.connections.find(c=>c.sourceId==e.id));sessionResults=sessionResults.concat(triggersResults);let errorResults=dbgResults.flat().filter(e=>e.id&&(e.error||e.result?._error));errorResults=errorResults.filter(e=>!ctxData?.components?.[e.id]?.ctx?.runtimeData?._ChildLoopData),ctxData.sessionResult&&sessionResults.length==0&&runtime.sessionClosed&&(sessionResults=errorResults),ctxData.sessionResults=sessionResults,step={state,dbgSession:runtime.xDebugRun,sessionResult:runtime.agentContext.sessionResult,sessionResults:runtime.agentContext.sessionResults,errorResults,sessionClosed:remainingActiveComponents.length==0&&activeAsyncComponents.length==0}}else runtime.sessionClosed=!0,step={state:{sessionClosed:!0},dbgSession:null,expiredDbgSession:runtime.xDebugId,sessionClosed:!0};if(this.checkCircularLimit(),step.sessionResults&&_AgentRuntime2.processResults[this.processID].sessionResults.push(step.sessionResults),step.errorResults&&_AgentRuntime2.processResults[this.processID].errorResults.push(step.errorResults),step?.sessionClosed||this.circularLimitReached){const finalResult=this.processResults();step.finalResult=finalResult,runtime.sessionClosed=!0}return this.incStep(),this.sync(),step}processResults(){let result={error:"Error processing results"};const sessionResults=_AgentRuntime2.processResults[this.processID].sessionResults,errorResults=_AgentRuntime2.processResults[this.processID].errorResults;if(this.circularLimitReached)result={error:`Circular Calls Limit Reached on ${this.circularLimitReached}. Current circular limit is ${this.agent.circularLimit}`};else{let _state=[sessionResults,errorResults].flat(1/0);(!_state||_state.length==0)&&(_state=errorResults.flat(1/0)),result=_state.reduce((acc,current)=>(acc.seen[current.id]||(acc.result.push(current),acc.seen[current.id]=!0),acc),{seen:{},result:[]}).result.filter(e=>!e.result?._exclude)}return delete _AgentRuntime2.processResults[this.processID],this.sync(),result}checkCircularLimit(){if(this.circularLimitReached)return this.agentContext.circularLimitReached;for(let componentId in _AgentRuntime2.tagsData[this.reqTag])if(_AgentRuntime2.tagsData[this.reqTag][componentId]>this.agent.circularLimit)return this.sessionClosed=!0,this.agentContext.circularLimitReached=componentId,componentId;return!1}async injectDebugOutput(componentId){let component={};if(this.xDebugPendingInject?component=this.xDebugPendingInject?.find(c=>c.id==componentId):this.xMockDataInject&&(component=this.xMockDataInject?.find(c=>c.id==componentId)),component?.ctx?.output){let allEmpty=!0;for(let key in component.ctx.output)if(component.ctx.output[key]!=""){allEmpty=!1;break}return allEmpty?null:component.ctx.output}}getRuntimeData(componentId){const componentData=this.getComponentData(componentId);return componentData?componentData.runtimeData||{}:{}}updateRuntimeData(componentId,data){const componentData=this.getComponentData(componentId);componentData&&(componentData.runtimeData={...componentData.runtimeData,...data},this.sync())}saveRuntimeComponentData(componentId,data){this.updateComponent(componentId,{runtimeData:data})}incStep(){this.agentContext.incStep()}updateComponent(componentId,data){this.agentContext.updateComponent(componentId,data)}resetComponent(componentId){this.agentContext.resetComponent(componentId)}getComponentData(componentId){return this.agentContext.getComponentData(componentId)}};__publicField$1N(_AgentRuntime,"processResults",{}),__publicField$1N(_AgentRuntime,"tagsData",{}),__publicField$1N(_AgentRuntime,"dummy",AgentRuntimeUnavailable);let AgentRuntime=_AgentRuntime,previousCpuTimes=null;const monitorData={mem:getMemoryUsage(),cpu:getCpuUsage()},itv=setInterval(()=>{monitorData.mem=getMemoryUsage(),monitorData.cpu=getCpuUsage()},5e3);itv.unref();const OSResourceMonitor={get mem(){return monitorData.mem},get cpu(){return monitorData.cpu}};function getCpuUsage(){const cpus=os.cpus();let user=0,nice=0,sys=0,idle=0,irq=0;for(let cpu of cpus)user+=cpu.times.user,nice+=cpu.times.nice,sys+=cpu.times.sys,idle+=cpu.times.idle,irq+=cpu.times.irq;const currentTimes={user,nice,sys,idle,irq};if(!previousCpuTimes)return previousCpuTimes=currentTimes,{user:0,sys:0,idle:100,load:0};const userDelta=currentTimes.user-previousCpuTimes.user,niceDelta=currentTimes.nice-previousCpuTimes.nice,sysDelta=currentTimes.sys-previousCpuTimes.sys,idleDelta=currentTimes.idle-previousCpuTimes.idle,irqDelta=currentTimes.irq-previousCpuTimes.irq,totalDelta=userDelta+niceDelta+sysDelta+idleDelta+irqDelta;if(previousCpuTimes=currentTimes,totalDelta===0)return{user:0,sys:0,idle:100,load:0};const userPercent=userDelta/totalDelta*100,sysPercent=sysDelta/totalDelta*100,idlePercent=idleDelta/totalDelta*100,loadPercent=100-idlePercent;return{user:Math.round(userPercent*100)/100,sys:Math.round(sysPercent*100)/100,idle:Math.round(idlePercent*100)/100,load:Math.round(loadPercent*100)/100}}function getMemoryUsage(){const totalMemory=os.totalmem(),freeMemory=os.freemem(),usedMemory=totalMemory-freeMemory;return{totalMemory:(totalMemory/1024**3).toFixed(2)+" GB",freeMemory:(freeMemory/1024**3).toFixed(2)+" GB",usedMemory:(usedMemory/1024**3).toFixed(2)+" GB",memoryUsagePercentage:(usedMemory/totalMemory*100).toFixed(2)}}var THook=(THook2=>(THook2.Blocking="blocking",THook2.NonBlocking="non-blocking",THook2))(THook||{});const blockingHooks={},nonBlockingHooks={},blockingAfterHooks={},nonBlockingAfterHooks={};class HookService{static register(hookName,callback,mode="blocking"){if(typeof callback!="function")throw new Error("Hook callback must be a function");mode==="non-blocking"?(nonBlockingHooks[hookName]||(nonBlockingHooks[hookName]=[]),nonBlockingHooks[hookName].push(callback)):(blockingHooks[hookName]||(blockingHooks[hookName]=[]),blockingHooks[hookName].push(callback))}static registerAfter(hookName,callback,mode="blocking"){if(typeof callback!="function")throw new Error("After-hook callback must be a function");mode==="non-blocking"?(nonBlockingAfterHooks[hookName]||(nonBlockingAfterHooks[hookName]=[]),nonBlockingAfterHooks[hookName].push(callback)):(blockingAfterHooks[hookName]||(blockingAfterHooks[hookName]=[]),blockingAfterHooks[hookName].push(callback))}static trigger(hookName,...args){blockingHooks[hookName]&&blockingHooks[hookName].forEach(callback=>callback(...args)),nonBlockingHooks[hookName]&&nonBlockingHooks[hookName].forEach(callback=>callback(...args))}static triggerAfter(hookName,result,args,error){const params={result,args,error};blockingAfterHooks[hookName]&&blockingAfterHooks[hookName].forEach(callback=>callback(params)),nonBlockingAfterHooks[hookName]&&nonBlockingAfterHooks[hookName].forEach(callback=>callback(params))}}function hook(hookName){return function(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=function(...args){return nonBlockingHooks[hookName]&&Promise.allSettled(nonBlockingHooks[hookName].map(callback=>Promise.resolve().then(()=>callback.apply(this,args)))),blockingHooks[hookName]&&blockingHooks[hookName].forEach(callback=>callback.apply(this,args)),originalMethod.apply(this,args)},descriptor}}const hookableMethodsMetadata=new WeakMap;function hookableClass(constructor){return class extends constructor{constructor(...args){super(...args);const metadataMap=hookableMethodsMetadata.get(constructor);if(!metadataMap)return;const childPrototype=Object.getPrototypeOf(this),parentPrototype=constructor.prototype;childPrototype!==parentPrototype&&metadataMap.forEach((metadata,methodName)=>{const childMethod=childPrototype[methodName],parentMethod=parentPrototype[methodName];if(childMethod&&typeof childMethod=="function"&&childMethod!==parentMethod){let descriptor=Object.getOwnPropertyDescriptor(childPrototype,methodName);descriptor||(descriptor={value:childMethod,writable:!0,enumerable:!1,configurable:!0});const modifiedDescriptor=hookAsync(metadata.hookName,metadata.customContext)(childPrototype,methodName,descriptor);modifiedDescriptor&&modifiedDescriptor.value&&Object.defineProperty(childPrototype,methodName,{value:modifiedDescriptor.value,writable:!0,enumerable:!1,configurable:!0})}})}}}function hookAsync(hookName,customContext){return function(target,propertyKey,descriptor){const originalMethod=descriptor.value;return hookableMethodsMetadata.has(target.constructor)||hookableMethodsMetadata.set(target.constructor,new Map),hookableMethodsMetadata.get(target.constructor).set(propertyKey,{hookName,customContext}),descriptor.value=async function(...args){const instanceMethod=this[propertyKey];if(instanceMethod!==descriptor.value&&instanceMethod!==originalMethod)return await originalMethod.apply(this,args);let _context;typeof customContext=="function"?_context={instance:this,args,context:await customContext(this)}:typeof customContext=="object"?_context={instance:this,args,context:customContext}:_context={instance:this,args,context:{}},nonBlockingHooks[hookName]&&Promise.allSettled(nonBlockingHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,args)))).catch(err=>console.error(`Non-blocking hook ${hookName} error:`,err));let result,error;try{blockingHooks[hookName]&&await Promise.all(blockingHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,args)))),result=await originalMethod.apply(this,args)}catch(err){error=err instanceof Error?err:new Error(String(err))}try{nonBlockingAfterHooks[hookName]&&Promise.allSettled(nonBlockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}])))).catch(err=>console.error(`Non-blocking after-hook ${hookName} error:`,err)),blockingAfterHooks[hookName]&&await Promise.all(blockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}]))))}catch(afterHookError){console.error("Error in after-hooks:",afterHookError)}if(error)throw error;return result},descriptor}}function hookAsyncWithContext(hookName,contextFn){return function(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){const additionalContext=typeof contextFn=="function"?await contextFn(this):{},contextualArgs=[additionalContext,...args],_context={instance:this,args,context:additionalContext};nonBlockingHooks[hookName]&&Promise.allSettled(nonBlockingHooks[hookName].map(callback=>Promise.resolve().then(()=>callback.apply(_context,contextualArgs))));let result,error;try{blockingHooks[hookName]&&await Promise.all(blockingHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,contextualArgs)))),result=await originalMethod.apply(this,args)}catch(err){error=err instanceof Error?err:new Error(String(err))}try{nonBlockingAfterHooks[hookName]&&Promise.allSettled(nonBlockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}])))).catch(err=>console.error(`Non-blocking after-hook ${hookName} error:`,err)),blockingAfterHooks[hookName]&&await Promise.all(blockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}]))))}catch(afterHookError){console.error("Error in after-hooks:",afterHookError)}if(error)throw error;return result},descriptor}}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);class AgentSSE{constructor(agent){this.agent=agent,__publicField$1M(this,"connections",new Map)}add(res,monitorId){this.connections.set(monitorId,res)}[Symbol.iterator](){return this.connections.entries()}async send(_type,_data){if(!_type||!_data)return;const data=typeof _data=="string"?_data:JSON.stringify(_data),message=`event: ${_type}
|
|
21
|
+
`);this._logger.log("error",formatLogMessage(...args),{...this.labels,stack,module}),this.emit("logged",{level:"error",message:formatLogMessage(...args)})}close(){this._logger.clear(),this._logger.close()}}winston.format.printf(info=>`${info.timestamp} ${winston.format.colorize().colorize(info.level,`${info.level}: ${info.message}`)}`);const MAX_LOG_MESSAGE_LENGTH=500;function redactLogMessage(logMessage){if(config.env.NODE_ENV!=="PROD"||logMessage.length>500)return logMessage;const sensitiveWords=["password","eyJ","token","email","secret","key","apikey","api_key","auth","credential"],obfuscatedString=" [!! SmythOS::REDACTED_DATA !!] ";for(const sensitiveWord of sensitiveWords){const regex=new RegExp(`(${sensitiveWord})((?:[^\\n]{0,29}(?=\\n))|(?:[^\\n]{30}\\S*))`,"gmi");logMessage=logMessage.replace(regex,`$1${obfuscatedString}`)}return logMessage}function createBaseLogger(memoryStore){const logger2=winston.createLogger({format:winston.format.combine(winston.format(info=>config.env.LOG_LEVEL=="none"||logLevel()=="none"||logLevel()==""?!1:(info.message=redactLogMessage(info.message),info))(),winston.format.timestamp(),winston.format.errors({stack:!0}),winston.format.splat(),winston.format.json()),transports:[new winston.transports.Console({level:"error",format:winston.format.combine(winston.format.printf(info=>{let message=info.message;return message=message?.length>MAX_LOG_MESSAGE_LENGTH?message.substring(0,MAX_LOG_MESSAGE_LENGTH)+"...":message,`${info.level}:${info.module||""} ${message} ${info.stack||""}`})),stderrLevels:["error"]}),new winston.transports.Console({level:logLevel(),format:winston.format.combine(namespaceFilter,winston.format.printf(info=>{const module=info.module?winston.format.colorize().colorize(info.level,` [${info.module}]`):"",ns=winston.format.colorize().colorize(info.level,`${info.level}${module}`);let message=info.message;return message=message?.length>MAX_LOG_MESSAGE_LENGTH?message.substring(0,MAX_LOG_MESSAGE_LENGTH)+"...":message,`${ns} - ${message}`}))})]});return Array.isArray(memoryStore)&&logger2.add(new ArrayTransport({level:"debug",logs:memoryStore})),logger2}function formatLogMessage(...args){return args.map(arg=>{if(typeof arg=="object"&&arg!==null&&!(arg instanceof Error))try{return JSON.stringify(arg,null,2)}catch{return String(arg)}return String(arg)}).join(" ")}function createLabeledLogger(labels,memoryStore){const _logger=createBaseLogger(memoryStore);return _logger.defaultMeta=labels,new LogHelper(_logger,memoryStore,labels)}function Logger(module,withMemoryStore=!1){return createLabeledLogger(typeof module=="string"?{module}:module,withMemoryStore?[]:void 0)}var __defProp$1U=Object.defineProperty,__defNormalProp$1U=(obj,key,value)=>key in obj?__defProp$1U(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1U=(obj,key,value)=>__defNormalProp$1U(obj,typeof key!="symbol"?key+"":key,value);class LocalCache{constructor(defaultTTL=60*60*1e3){__publicField$1U(this,"cache"),__publicField$1U(this,"expiryMap"),__publicField$1U(this,"timeouts"),__publicField$1U(this,"defaultTTL",60*60*1e3),this.defaultTTL=defaultTTL,this.cache=new Map,this.expiryMap=new Map,this.timeouts=new Map}set(key,value,ttlMs=this.defaultTTL){this.cache.set(key,value);const expiry=Date.now()+ttlMs;this.expiryMap.set(key,expiry),this.clearTimeout(key);const timeout=setTimeout(()=>{this.delete(key)},ttlMs);this.timeouts.set(key,timeout),timeout.unref()}updateTTL(key,ttlMs=this.defaultTTL){if(!this.has(key))return;const expiry=Date.now()+ttlMs;this.expiryMap.set(key,expiry),this.clearTimeout(key);const timeout=setTimeout(()=>{this.delete(key)},ttlMs);this.timeouts.set(key,timeout),timeout.unref()}get(key,ttlMs){if(!this.has(key))return;const value=this.cache.get(key);if(value!==void 0)return this.updateTTL(key,ttlMs),value}has(key){if(!this.cache.has(key))return!1;const expiry=this.expiryMap.get(key);return expiry&&Date.now()>expiry?(this.delete(key),!1):!0}delete(key){return this.clearTimeout(key),this.expiryMap.delete(key),this.cache.delete(key)}clear(){for(const key of this.cache.keys())this.clearTimeout(key);this.cache.clear(),this.expiryMap.clear(),this.timeouts.clear()}clearTimeout(key){const timeout=this.timeouts.get(key);timeout&&(clearTimeout(timeout),this.timeouts.delete(key))}}var __defProp$1T=Object.defineProperty,__defNormalProp$1T=(obj,key,value)=>key in obj?__defProp$1T(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1T=(obj,key,value)=>__defNormalProp$1T(obj,typeof key!="symbol"?key+"":key,value);const logger$m=Logger("Connector"),_Connector=class _Connector2{constructor(_settings){this._settings=_settings,__publicField$1T(this,"name"),__publicField$1T(this,"started",!1),__publicField$1T(this,"_interactionHandler"),__publicField$1T(this,"_readyPromise")}get settings(){return this._settings}get interactionHandler(){return this._interactionHandler}get valid(){return!0}setInteraction(handler){this._interactionHandler=handler}instance(settings){const configHash=createHash("sha256").update(JSON.stringify(settings||{})).digest("hex"),key=`${this.name}-${configHash}`;if(_Connector2.lCache.has(key))return _Connector2.lCache.get(key);const constructor=this.constructor,instance=new constructor(settings);return _Connector2.lCache.set(key,instance,60*60*1e3),instance}static isValid(connector){return connector.name!==void 0&&connector.name!==null&&connector.name!==""}async start(){logger$m.info(`Starting ${this.name} connector ...`),this.started=!0}async stop(){logger$m.info(`Stopping ${this.name} connector ...`)}ready(){return this._readyPromise||(this._readyPromise=new Promise(resolve=>{let maxWait=6e4;const tick=100;if(this.started)resolve(!0);else{const interval=setInterval(()=>{this.started&&(clearInterval(interval),resolve(!0)),maxWait-=tick,maxWait<=0&&(clearInterval(interval),resolve(!1))},tick)}})),this._readyPromise}requester(candidate){return null}user(candidate){return typeof candidate=="string"?this.requester(AccessCandidate.user(candidate)):this.requester(candidate)}team(teamId){return this.requester(AccessCandidate.team(teamId))}agent(agentId){return this.requester(AccessCandidate.agent(agentId))}handleEvent(eventName,data){logger$m.debug(`Connector ${this.name} received event ${eventName} `)}};__publicField$1T(_Connector,"lCache",new LocalCache);let Connector=_Connector;const DummyConnector=name=>{const logger2=Logger(`DummyConnector<${name}>`);return new Proxy({},{get:function(target,prop,receiver){return prop==="valid"?!1:typeof target[prop]=="function"?target[prop]:function(...args){const argsString=args.length>0?args.map(arg=>typeof arg=="object"?JSON.stringify(arg,null,0).slice(0,50)+"...":typeof arg=="string"?`"${arg.slice(0,50)}..."`:typeof arg=="number"||typeof arg=="boolean"||typeof arg=="function"||typeof arg=="symbol"?arg.toString():typeof arg>"u"?"undefined":String(arg)).join(", "):"(no arguments)";logger2.warn(`[!!] Unimplemented Connector tried to call: ${name}.${prop.toString()}(${argsString})`),printStackTrace(logger2,3,1)}}})};Logger("SystemEvents");const SystemEvents=new EventEmitter,console$s=Logger("ConnectorService"),SRE_CONNECTORS_INSTANCE_SYMBOL=Symbol.for("SRE:ConnectorInstances"),SRE_CONNECTORS_SYMBOL=Symbol.for("SRE:Connector");let ServiceRegistry={},_ready=!1;SystemEvents.on("SRE:Booted",services=>{ServiceRegistry=services,_ready=!0});class ConnectorService{static get Connectors(){return global[SRE_CONNECTORS_SYMBOL]||(global[SRE_CONNECTORS_SYMBOL]={}),global[SRE_CONNECTORS_SYMBOL]}static get ConnectorInstances(){return global[SRE_CONNECTORS_INSTANCE_SYMBOL]||(global[SRE_CONNECTORS_INSTANCE_SYMBOL]={}),global[SRE_CONNECTORS_INSTANCE_SYMBOL]}static get ready(){return _ready}static get service(){return ServiceRegistry}static register(connectorType,connectorName,connectorConstructor){if(typeof connectorConstructor!="function"||!isSubclassOf(connectorConstructor,Connector)){console$s.error(`Invalid Connector ${connectorType}:${connectorName}`);return}if(ConnectorService.Connectors[connectorType]||(ConnectorService.Connectors[connectorType]={}),ConnectorService.Connectors[connectorType][connectorName]){console$s.warn(`Connector ${connectorType}:${connectorName} already registered ... skipping`);return}ConnectorService.Connectors[connectorType][connectorName]=connectorConstructor}static init(connectorType,connectorName,connectorId,settings={},isDefault=!1){if(ConnectorService.ConnectorInstances[connectorType]?.[connectorName])return console$s.warn(`Connector ${connectorType}:${connectorName} already initialized ... skipping`),ConnectorService.ConnectorInstances[connectorType]?.[connectorName];const entry=ConnectorService.Connectors[connectorType];if(!entry)return;const connectorConstructor=entry[connectorName];if(connectorConstructor){const connector=new connectorConstructor(settings);connector.interactionHandler&&connector.interactionHandler(),connector.start(),ConnectorService.ConnectorInstances[connectorType]||(ConnectorService.ConnectorInstances[connectorType]={});const id=connectorId||connectorName;return ConnectorService.ConnectorInstances[connectorType][id]=connector,!ConnectorService.ConnectorInstances[connectorType].default&&isDefault&&(ConnectorService.ConnectorInstances[connectorType].default=connector),connector}}static async _stop(){for(let connectorName in ConnectorService.ConnectorInstances){let allConnectors=Object.values(ConnectorService.ConnectorInstances[connectorName]);allConnectors=allConnectors.filter((value,index,self)=>self.indexOf(value)===index);for(let connector of allConnectors)connector.stop()}delete global[SRE_CONNECTORS_INSTANCE_SYMBOL],delete global[SRE_CONNECTORS_SYMBOL]}static getInstance(connectorType,connectorName="default"){return ConnectorService.ConnectorInstances[connectorType]?.[connectorName||"default"]||(console$s.warn(`Connector ${connectorType}:${typeof connectorName=="string"?connectorName:JSON.stringify(connectorName)} not initialized returning DummyConnector`),printStackTrace(console$s,10),DummyConnector(connectorType))}static getStorageConnector(name){return ConnectorService.getInstance(TConnectorService.Storage,name)}static getCacheConnector(name){return ConnectorService.getInstance(TConnectorService.Cache,name)}static getVectorDBConnector(name){return ConnectorService.getInstance(TConnectorService.VectorDB,name)}static getNKVConnector(name){return ConnectorService.getInstance(TConnectorService.NKV,name)}static getLLMConnector(name){return ConnectorService.getInstance(TConnectorService.LLM,name)}static getVaultConnector(name){return ConnectorService.getInstance(TConnectorService.Vault,name)}static getManagedVaultConnector(name){return ConnectorService.getInstance(TConnectorService.ManagedVault,name)}static getAccountConnector(name){return ConnectorService.getInstance(TConnectorService.Account,name)}static getAgentDataConnector(name){return ConnectorService.getInstance(TConnectorService.AgentData,name)}static getCLIConnector(name){return ConnectorService.getInstance(TConnectorService.CLI,name)}static getLogConnector(name){return ConnectorService.getInstance(TConnectorService.Log,name)}static getComponentConnector(name){return ConnectorService.getInstance(TConnectorService.Component,name)}static getModelsProviderConnector(name){return ConnectorService.getInstance(TConnectorService.ModelsProvider,name)}static hasInstance(connectorType,connectorName="default"){const instance=ConnectorService.ConnectorInstances[connectorType]?.[connectorName];return instance&&instance.valid}static getRouterConnector(name){return ConnectorService.getInstance(TConnectorService.Router,name)}static getCodeConnector(name){return ConnectorService.getInstance(TConnectorService.Code,name)}static getSchedulerConnector(name){return ConnectorService.getInstance(TConnectorService.Scheduler,name)}static getTelemetryConnector(name){return ConnectorService.getInstance(TConnectorService.Telemetry,name)}}class ConnectorServiceProvider{init(){}constructor(){this.register()}}class VaultHelper{static async getTeamKey(key,teamId){return await ConnectorService.getVaultConnector().requester(AccessCandidate.team(teamId)).get(key)}static async getUserKey(key,userId){const vaultConnector=ConnectorService.getVaultConnector(),teamId=await ConnectorService.getAccountConnector().getCandidateTeam(AccessCandidate.user(userId));return await vaultConnector.requester(AccessCandidate.team(teamId)).get(key)}static async getAgentKey(key,agentId){const vaultConnector=ConnectorService.getVaultConnector(),teamId=await ConnectorService.getAccountConnector().getCandidateTeam(AccessCandidate.agent(agentId));return await vaultConnector.requester(AccessCandidate.team(teamId)).get(key)}}var __defProp$1S=Object.defineProperty,__defNormalProp$1S=(obj,key,value)=>key in obj?__defProp$1S(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1S=(obj,key,value)=>__defNormalProp$1S(obj,typeof key!="symbol"?key+"":key,value);const Match={default:/{{(.*?)}}/g,doubleCurly:/{{(.*?)}}/g,singleCurly:/{(.*?)}/g,doubleCurlyForSingleMatch:/{{(.*?)}}/,templateVariables:/{{([A-Z]+):([\w\s]+):[\[{](.*?)[\]}]}}/gm,prefix(prefix){return new RegExp(`{{${prefix}(.*?)}}`,"g")},suffix(suffix){return new RegExp(`{{(.*?)${suffix}}}`,"g")},prefSuf(prefix,suffix){return new RegExp(`{{${prefix}(.*?)${suffix}}}`,"g")},fn(name){return new RegExp(`{{${name}\\((.*?)\\)}}`,"g")}},TPLProcessor={vaultTeam(teamId){return async token=>{try{return await VaultHelper.getTeamKey(token,teamId)}catch{return token}}},componentTemplateVar(templateSettings){return async(token,matches)=>{try{const label=matches[2];if(!label)return token;const entry=Object.values(templateSettings).find(o=>o.label==label);return entry?`{{${entry.id}}}`:token}catch{return token}}}};class TemplateStringHelper{constructor(templateString){this.templateString=templateString,__publicField$1S(this,"_current"),__publicField$1S(this,"_promiseQueue",[]),this._current=templateString}get result(){if(this._promiseQueue.length<=0)return this._current;throw new Error("This template object has async results, you should use .asyncResult with await instead of .result")}get asyncResult(){return new Promise(async(resolve,reject)=>{await Promise.all(this._promiseQueue),resolve(this._current)})}static create(templateString){return new TemplateStringHelper(templateString)}parse(data,regex=Match.default,maxDepth=5){if(typeof this._current!="string"||typeof data!="object")return this;for(let i=0;i<maxDepth;i++){const previous=this._current;if(this._current=this._current.replace(regex,(match,token)=>{let val=data?.[token]??match;return data?.[token]||(val=JSONExpression$1(data,token)||`{{${token}}}`),typeof val=="object"?JSON.stringify(val):escapeJsonField(val)}),previous===this._current)break}return this}parseRaw(data,regex=Match.doubleCurlyForSingleMatch){if(typeof this._current!="string"||typeof data!="object")return this;const match=this._current.match(regex),key=match?match[1]:"";if(key){const value=data?.[key];this._current=value}return this}parseTeamKeysAsync(teamId){return this.process(TPLProcessor.vaultTeam(teamId),Match.fn("KEY"))}parseComponentTemplateVarsAsync(templateSettings){return this.process(TPLProcessor.componentTemplateVar(templateSettings),Match.templateVariables)}process(processor,regex=Match.default){if(typeof this._current!="string")return this;let tokens={},match;const prosessorPromises=[];for(;(match=regex.exec(this._current))!==null;){const token=match[1];tokens[token]=match[0];const _processor=processor(token,match);_processor instanceof Promise?(_processor.then(result=>{if(result===void 0)return match?.[0];tokens[token]=result}),prosessorPromises.push(_processor)):tokens[token]=_processor}return prosessorPromises.length>0?(new Promise(async(resolve,reject)=>{await Promise.all(prosessorPromises),this.parse(tokens,regex),resolve(!0)}),this._promiseQueue.push(Promise.all(prosessorPromises))):this.parse(tokens,regex),this}clean(regex=Match.default,replaceWith=""){return typeof this._current!="string"?this:(this._current=this._current.replace(regex,replaceWith),this)}}function JSONExpression$1(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}function escapeString(str){return str&&str.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}function escapeJsonField(str){return typeof str!="string"?str:str.replace(/\\"/g,'"').replace(/"/g,'\\"')}function TemplateString(templateString){return TemplateStringHelper.create(templateString)}var __defProp$1R=Object.defineProperty,__defNormalProp$1R=(obj,key,value)=>key in obj?__defProp$1R(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1R=(obj,key,value)=>__defNormalProp$1R(obj,typeof key!="symbol"?key+"":key,value);const console$r=Logger("AgentLogger.class");class LogTransaction{constructor(agent,trId){this.agent=agent,this.trId=trId,__publicField$1R(this,"_callId",""),__publicField$1R(this,"queue",[]),__publicField$1R(this,"_isProcessing",!1),__publicField$1R(this,"_lastPush",0),__publicField$1R(this,"storage"),this.storage=ConnectorService.getStorageConnector()}async getCallId(){return this._callId}push(logData){ConnectorService.getLogConnector().valid&&(this.queue.push(logData),this._lastPush=Date.now(),this.processQueue())}formatData(data,maxLength=1e3){if(!data)return;let result=typeof data=="string"?data:JSON.stringify(data);return result.length>maxLength&&(result=result.substr(0,maxLength)+"..."),result}getDataFilePath(data,maxLength=1e3){if(data){if((typeof data=="string"?data:JSON.stringify(data)).length>maxLength){const dayFolder=getDayFormattedDate(),trId="L"+uid().toUpperCase();return`${dayFolder}/${trId}`}return null}}prepareData(firstData){let sourceId=firstData.sourceId,componentId=firstData.componentId,input=firstData.input?{preview:this.formatData(firstData.input),full:this.getDataFilePath(firstData.input),action:firstData.input.__action,status:firstData.input.__status}:void 0,output=firstData.output?{preview:this.formatData(firstData.output),full:this.getDataFilePath(firstData.output)}:void 0,domain=firstData.domain,inputTimestamp=firstData.inputTimestamp,outputTimestamp=firstData.outputTimestamp,result=firstData.result?JSON.stringify({preview:this.formatData(firstData.result),full:this.getDataFilePath(firstData.result)}):void 0,sessionID=firstData.sessionID;const sourceData=this.agent.components[sourceId],componentData=this.agent.components[componentId],sourceCptName=sourceData?.name,componentCptName=componentData?.name,sourceName=sourceData?.displayName||sourceData?.name||sourceId,componentName=componentData?.displayName||componentData?.name||componentId,curStepOrder=firstData.step||this.agent?.agentRuntime?.curStep||"",nextStepOrder=curStepOrder+1;sourceCptName&&(sourceId+=`@${sourceCptName}@${curStepOrder}`),componentCptName&&(componentId+=`@${componentCptName}@${nextStepOrder}`);const inputTokens=void 0,outputTokens=void 0,tags=firstData.tags||"";let raw_error=firstData.error||firstData?.output?.error||firstData?.output?._error||firstData?.result?.error||firstData?.result?.result?.error||firstData?.result?._error||firstData?.result?.result?._error;const error=raw_error?JSON.stringify({preview:this.formatData(raw_error),full:this.getDataFilePath(raw_error)}):void 0;return{sourceId,componentId,domain,input,output,inputTimestamp,outputTimestamp,result,error,sourceName,componentName,sessionID,inputTokens,outputTokens,tags,workflowID:firstData.workflowID,processID:firstData.processID,raw_input:firstData.input,raw_output:firstData.output,raw_result:firstData.result,raw_error}}async storeLogData(filePath,content){const logConnector=ConnectorService.getLogConnector();if(!(!logConnector.valid||logConnector.name=="ConsoleLog")&&filePath)try{const body=typeof content=="string"?content:JSON.stringify(content),storagePath=path.posix.join("teams",this.agent.teamId,`logs/${this.agent.id}/${filePath}`),metadata={teamid:this.agent.teamId,agentid:this.agent.id,ContentType:"text/plain"};await this.storage.requester(AccessCandidate.agent(this.agent.id)).write(storagePath,body,void 0,metadata)}catch(error){console$r.error("Error storing Log File : ",filePath,error)}}async processQueue(){const logConnector=ConnectorService.getLogConnector();if(!(!logConnector.valid||this.queue.length<=0||this._isProcessing)){this._isProcessing=!0;try{if(this._callId)for(;this.queue.length>0;){const logData=this.queue.shift(),data=this.prepareData(logData);Object.keys(data).forEach(key=>{data[key]||delete data[key]});const raw_input=data.raw_input,raw_output=data.raw_output,raw_result=data.raw_result,raw_error=data.raw_error;delete data.raw_input,delete data.raw_output,delete data.raw_result,delete data.raw_error;const resultObj=data.result?JSON.parse(data.result):void 0,errorObj=data.error?JSON.parse(data.error):void 0;await this.storeLogData(data?.input?.full,raw_input),await this.storeLogData(data?.output?.full,raw_output),await this.storeLogData(resultObj?.full,raw_result),await this.storeLogData(errorObj?.full,raw_error),await logConnector.requester(AccessCandidate.agent(this.agent.id)).log(data,this._callId)}else{const firstData=this.queue.shift(),data=this.prepareData(firstData),raw_input=data.raw_input,raw_output=data.raw_output,raw_result=data.raw_result,raw_error=data.raw_error;delete data.raw_input,delete data.raw_output,delete data.raw_result,delete data.raw_error;const resultObj=data.result?JSON.parse(data.result):void 0,errorObj=data.error?JSON.parse(data.error):void 0;await this.storeLogData(data?.input?.full,raw_input),await this.storeLogData(data?.output?.full,raw_output),await this.storeLogData(resultObj?.full,raw_result),await this.storeLogData(errorObj?.full,raw_error);const logResult=await logConnector.requester(AccessCandidate.agent(this.agent.id)).log(data);this._callId=logResult?.data?.log?.id}}catch(error){console$r.error("Error processing log queue:",error?.response?.data?.message||error)}this._isProcessing=!1,debounce(this.processQueue.bind(this),1e3,{leading:!0,maxWait:1e4}),await delay(1e3),this.processQueue()}}canDelete(){return this.queue.length>0?(this.processQueue(),!1):this._lastPush!=0&&this._lastPush+1e3*60*60*1<Date.now()}}const _AgentLogger=class _AgentLogger2{constructor(agent){this.agent=agent}static async cleanup(){if(!ConnectorService.getLogConnector().valid)return;const trIds=Object.keys(_AgentLogger2.transactions);for(const trId of trIds)_AgentLogger2.transactions[trId].canDelete()&&delete _AgentLogger2.transactions[trId]}static log(agent,trId,logData){if(ConnectorService.getLogConnector().valid)return(agent?.agentRuntime?.debug||agent?.debugSessionEnabled)&&(logData.tags="DEBUG "),trId||(trId="log-"+uid()),this.transactions[trId]||(this.transactions[trId]=new LogTransaction(agent,trId)),this.transactions[trId].push(logData),debounce(this.cleanup.bind(this),1e3,{leading:!0,maxWait:1e4*1}),trId}static async logTask(agent,tasks){const logConnector=ConnectorService.getLogConnector();logConnector.valid&&(agent.usingTestDomain||await logConnector.requester(AccessCandidate.agent(agent.id)).logTask(tasks,agent.usingTestDomain),debounce(this.cleanup.bind(this),1e3,{leading:!0,maxWait:1e4*1}))}};__publicField$1R(_AgentLogger,"transactions",{}),__publicField$1R(_AgentLogger,"cleanupInterval");let AgentLogger=_AgentLogger;var __defProp$1Q=Object.defineProperty,__defNormalProp$1Q=(obj,key,value)=>key in obj?__defProp$1Q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1Q=(obj,key,value)=>__defNormalProp$1Q(obj,typeof key!="symbol"?key+"":key,value);class LLMCache{constructor(candidate,cacheId,ttl=1*60*60){__publicField$1Q(this,"_cacheConnector"),__publicField$1Q(this,"_cacheId"),__publicField$1Q(this,"_ttl"),__publicField$1Q(this,"_candidate"),this._cacheConnector=ConnectorService.getCacheConnector(),this._cacheId=cacheId||"llm_cache_"+uid(),this._ttl=ttl,this._candidate=candidate}get id(){return this._cacheId}async set(key,data){this._cacheConnector.valid&&await this._cacheConnector.requester(this._candidate).set(`${this._cacheId}:${key}`,typeof data=="object"?JSON.stringify(data):data,null,null,this._ttl)}async get(key,format="json"){if(!this._cacheConnector.valid)return;const obj=await this._cacheConnector.requester(this._candidate).get(`${this._cacheId}:${key}`);let result;if(format==="json")try{result=JSON.parse(obj)}catch{console.warn(`Invalid JSON data for key ${key}`),result=null}else result=obj;return result}async delete(key){this._cacheConnector.valid&&await this._cacheConnector.requester(this._candidate).delete(`${this._cacheId}:${key}`)}async clear(){this._cacheConnector.valid&&await this._cacheConnector.requester(this._candidate).delete(this._cacheId)}}var __defProp$1P=Object.defineProperty,__defNormalProp$1P=(obj,key,value)=>key in obj?__defProp$1P(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1P=(obj,key,value)=>__defNormalProp$1P(obj,typeof key!="symbol"?key+"":key,value);const console$q=Logger("RuntimeContext");class RuntimeContext extends EventEmitter$1{constructor(runtime){super(),this.runtime=runtime,__publicField$1P(this,"circularLimitReached",!1),__publicField$1P(this,"step",0),__publicField$1P(this,"sessionResult",!1),__publicField$1P(this,"sessionResults"),__publicField$1P(this,"components",{}),__publicField$1P(this,"checkRuntimeContext",null),__publicField$1P(this,"ctxFile",""),__publicField$1P(this,"_runtimeFileReady"),__publicField$1P(this,"_cacheConnector"),__publicField$1P(this,"_readyPromise"),__publicField$1P(this,"_lastCtxLength",0),__publicField$1P(this,"_syncQueue",Promise.resolve());const agent=runtime.agent;this._cacheConnector=ConnectorService.getCacheConnector();const reqId=(runtime.processID?.split(":")[0]||"")==runtime.xDebugId?"":"."+uid()+runtime.reqTag;this.ctxFile=`${runtime.xDebugId}${reqId}${agent.jobID?`-job-${agent.jobID}`:""}`,this._readyPromise=new Promise((resolve,reject)=>{let resolved=!1;this.on("ready",()=>{resolved=!0,resolve(!0)}),setTimeout(()=>{resolved||reject(new Error("Agent Runtime context initialization timeout"))},5*60*1e3).unref()}),this.initRuntimeContext()}serialize(){return{step:this.step,sessionResult:this.sessionResult,sessionResults:this.sessionResults,components:this.components}}deserialize(data){this.step=data.step,this.sessionResult=data.sessionResult,this.sessionResults=data.sessionResults,this.components=data.components}reset(){this.step=0,this.sessionResult=!1,this.sessionResults=null,this.components={}}initRuntimeContext(){if(this._runtimeFileReady)return;console$q.debug("Init Agent Context",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id));const agent=this.runtime.agent;let ctxData={};this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).get(this.ctxFile).then(async data=>{if(data)ctxData=JSON.parse(data),ctxData.step||(ctxData.step=0);else{ctxData=JSON.parse(JSON.stringify({components:agent.components,connections:agent.connections,timestamp:Date.now()})),ctxData.step||(ctxData.step=0);for(let cptId in ctxData.components)ctxData.components[cptId]={id:cptId,name:ctxData.components[cptId].name,ctx:{active:!1,name:ctxData.components[cptId].name}};await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).set(this.ctxFile,JSON.stringify(ctxData),null,null,1*60*60)}this.deserialize(ctxData),this._runtimeFileReady=!0,this.emit("ready")})}async ready(){return this._runtimeFileReady?!0:this._readyPromise}async sync(){if(!this.ctxFile)return;this.emit("syncing");const deleteSession=this.runtime.sessionClosed,data=this.serialize();if(data){let serializedData=JSON.stringify(data);serializedData.length!=this._lastCtxLength&&(console$q.debug("Agent Context Size",this.ctxFile,serializedData.length,AccessCandidate.agent(this.runtime.agent.id)),this._lastCtxLength=serializedData.length),await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).set(this.ctxFile,serializedData,null,null,3*60*60);const cooldown=serializedData.length/1024/1024/10*1e3;serializedData=null,await delay(cooldown)}deleteSession&&await this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).exists(this.ctxFile)&&(console$q.debug("Agent Context Delete",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),this.runtime.debug?this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).updateTTL(this.ctxFile,5*60):this._cacheConnector.requester(AccessCandidate.agent(this.runtime.agent.id)).delete(this.ctxFile),this.ctxFile=null)}enqueueSync(){this.ctxFile&&(this._syncQueue=this._syncQueue.then(()=>this.sync()).catch(err=>{console$q.error("Error syncing context",err)}))}incStep(){this.step++}updateComponent(componentId,data){const ctxData=this;if(!ctxData)return;const component=ctxData.components[componentId];component||(console$q.debug(">>>>>>> updateComponent Component debug data not found",componentId,component,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxFile",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxData",ctxData,AccessCandidate.agent(this.runtime.agent.id))),component.ctx||(component.ctx={active:!1,name:"",step:0}),Object.assign(component.ctx,data),component.ctx.step=this.step,this.enqueueSync()}resetComponent(componentId){const ctxData=this,component=ctxData.components[componentId];component||(console$q.debug(">>>>>>> resetComponent Component debug data not found",componentId,component,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxFile",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxData",ctxData,AccessCandidate.agent(this.runtime.agent.id))),component.ctx.runtimeData={},component.ctx.active=!1,this.runtime.debug||(component.ctx.input=void 0,component.ctx.output=void 0),this.enqueueSync()}getComponentData(componentId){const ctxData=this;if(!ctxData)return null;const component=ctxData.components[componentId];return component||(console$q.debug(">>>>>>> getComponentData Component debug data not found",componentId,component,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxFile",this.ctxFile,AccessCandidate.agent(this.runtime.agent.id)),console$q.debug(">>> ctxData",ctxData,AccessCandidate.agent(this.runtime.agent.id))),component.ctx}}var __defProp$1O=Object.defineProperty,__defNormalProp$1O=(obj,key,value)=>key in obj?__defProp$1O(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1O=(obj,key,value)=>__defNormalProp$1O(obj,typeof key!="symbol"?key+"":key,value);const logger$l=Logger("AgentRuntime"),AgentRuntimeUnavailable=new Proxy({},{get:function(target,prop,receiver){return typeof target[prop]=="function"?target[prop]:function(){logger$l.warn(`AgentRuntime Unavailable tried to call : ${prop.toString()}`)}}}),_AgentRuntime=class _AgentRuntime2{constructor(agent){this.agent=agent,__publicField$1O(this,"agentContext"),__publicField$1O(this,"llmCache"),__publicField$1O(this,"xDebugRun",""),__publicField$1O(this,"xDebugInject",""),__publicField$1O(this,"xDebugRead",""),__publicField$1O(this,"xDebugStop",""),__publicField$1O(this,"xDebugPendingInject",null),__publicField$1O(this,"xMockDataInject",null),__publicField$1O(this,"xDebugId",""),__publicField$1O(this,"xDebugCmd",""),__publicField$1O(this,"_debugActive",!1),__publicField$1O(this,"_runtimeFileReady",!1),__publicField$1O(this,"sessionClosed",!1),__publicField$1O(this,"reqTagOwner",!1),__publicField$1O(this,"reqTag"),__publicField$1O(this,"processID"),__publicField$1O(this,"workflowReqId"),__publicField$1O(this,"alwaysActiveComponents",{}),__publicField$1O(this,"exclusiveComponents",{}),__publicField$1O(this,"checkRuntimeContext",null),this.reqTag=agent.agentRequest.header("X-REQUEST-TAG");const isNestedProcess=!!this.reqTag;this.reqTag?(this.xDebugStop=void 0,this.xDebugRun=void 0,this.xDebugInject=void 0,this.xDebugRead=void 0):(this.xDebugStop=agent.agentRequest.header("X-DEBUG-STOP"),this.xDebugRun=agent.agentRequest.header("X-DEBUG-RUN"),this.xDebugInject=agent.agentRequest.header("X-DEBUG-INJ"),this.xDebugRead=agent.agentRequest.header("X-DEBUG-READ"),this.reqTag="xTAG-"+uid(),this.reqTagOwner=!0),this.agent.conversationId=agent.agentRequest.header("X-CONVERSATION-ID"),this.xDebugId=this.xDebugStop||this.xDebugRun||this.xDebugRead,!this.xDebugId&&agent.agentRequest.body&&(this.xDebugInject!=null&&this.xDebugInject!=null?(this.xDebugPendingInject=agent.agentRequest.body,this.xDebugRun=this.xDebugInject||"inj-"+uid()):this.xDebugRun==""&&(this.xDebugRun="dbg-"+uid()),this.xDebugId=this.xDebugRun),agent.agentRequest.header("X-MOCK-DATA-INJ")!==void 0&&(this.xMockDataInject=agent.agentRequest.body),this.processID=this.xDebugId,this.xDebugId||(this.xDebugId=agent.sessionId,this.processID=this.reqTag),isNestedProcess&&(this.processID+=`:${Math.floor(1e3+Math.random()*9e3)}`),this.workflowReqId=this.xDebugRun||this.xDebugStop||this.reqTag,_AgentRuntime2.tagsData[this.reqTag]||(_AgentRuntime2.tagsData[this.reqTag]={}),_AgentRuntime2.processResults[this.processID]||(_AgentRuntime2.processResults[this.processID]={timestamp:Date.now(),errorResults:[],sessionResults:[]}),this.agentContext=new RuntimeContext(this),this.agentContext.on("ready",()=>{let method=(agent.agentRequest.method||"POST").toUpperCase();const endpoint=agent.endpoints?.[agent.agentRequest.path]?.[method],trigger=agent.triggers?.[agent.agentRequest.path],endpointDBGCall=this.xDebugId?.startsWith("dbg-");this.alwaysActiveComponents={},this.exclusiveComponents={};for(let component of this.agent.data.components){const cpt=this.agent.ComponentInstances[component.name];if(!cpt){logger$l.warn(`Component ${component.name} Exists in agent but has no implementation`,AccessCandidate.agent(this.agent.id));continue}if(trigger&&trigger.id!=null&&component.id==trigger.id&&this.xDebugId?.startsWith("dbg-")&&this.updateComponent(component.id,{active:!0}),endpoint&&endpoint.id!=null&&component.id==endpoint.id&&endpointDBGCall&&this.updateComponent(component.id,{active:!0}),cpt.alwaysActive){this.alwaysActiveComponents[component.id]=cpt,this.updateComponent(component.id,{active:!0,alwaysActive:!0});const runtimeData={...this.getRuntimeData(component.id)};this.saveRuntimeComponentData(component.id,runtimeData)}if(cpt.exclusive){this.exclusiveComponents[component.id]=cpt,this.updateComponent(component.id,{exclusive:!0});const runtimeData={...this.getRuntimeData(component.id)};this.saveRuntimeComponentData(component.id,runtimeData)}}}),this._debugActive=this.xDebugId!=agent.sessionId;const xCacheId=agent.agentRequest.header("X-CACHE-ID")||"";this.llmCache=new LLMCache(AccessCandidate.agent(this.agent.id),xCacheId)}get circularLimitReached(){return this.agentContext?.circularLimitReached||!1}set circularLimitReached(value){this.agentContext&&(this.agentContext.circularLimitReached=value)}get debug(){return this._debugActive}get curStep(){return this.agentContext?.step||0}async ready(){return this.agentContext.ready()}destroy(){this.sessionClosed=!0,this.sync()}incTag(componentId){_AgentRuntime2.tagsData[this.reqTag][componentId]||(_AgentRuntime2.tagsData[this.reqTag][componentId]=0),_AgentRuntime2.tagsData[this.reqTag][componentId]++}async sync(){(this.reqTagOwner&&this.sessionClosed||this.circularLimitReached)&&delete _AgentRuntime2.tagsData[this.reqTag],this.agentContext.enqueueSync()}getWaitingComponents(){const ctxData=this.agentContext;return Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0).filter(c=>c?.ctx?.status&&typeof c?.ctx?.output!==void 0)}getExclusiveActiveComponents(){const ctxData=this.agentContext;return Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0).filter(c=>c?.ctx?.exclusive==!0)}readState(stateId,deltaOnly=!1){if(!this._debugActive||!stateId)return null;const runtime=this,agent=this.agent,ctxData=runtime.agentContext,dbgAllComponents=runtime.xDebugPendingInject||Object.values(ctxData?.components||[]);let dbgActiveComponents;dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.exclusive==!0),(!dbgActiveComponents||dbgActiveComponents.length==0)&&(dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0||!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0)),dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.status&&typeof c?.ctx?.output!==void 0),dbgAllComponents.filter(c=>c?.ctx?.active==!0&&!c?.ctx?.status);let state={};for(let dbgComponent of dbgAllComponents)state[dbgComponent.id]=dbgComponent.ctx;let dbgSession=stateId;(!dbgActiveComponents||dbgActiveComponents.length==0)&&(dbgSession=null,runtime.sessionClosed=!0);const remainingActiveComponents=Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0&&!c?.ctx?.alwaysActive),activeAsyncComponents=Object.values(ctxData?.components||[]).filter(c=>!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0);if(remainingActiveComponents.length==0&&activeAsyncComponents.length==0&&(runtime.sessionClosed=!0),runtime.circularLimitReached){const error=`Circular Calls Limit Reached on ${runtime.checkCircularLimit()}. Current agent circular limit is ${agent.circularLimit}`;return runtime.sessionClosed=!0,{state,dbgSession,sessionClosed:runtime.sessionClosed,error}}const step=this.curStep>=1?this.curStep-1:0;if(deltaOnly){const delta={};for(let cptId in state){const cpt=state[cptId];cpt.step>=step&&(delta[cptId]=cpt)}state=delta}return{state,dbgSession,sessionClosed:runtime.sessionClosed,step}}async runCycle(){logger$l.debug(`runCycle agentId=${this.agent.id} wfReqId=${this.workflowReqId} reqTag=${this.reqTag} session=${this.xDebugRun} cycleId=${this.processID}`,AccessCandidate.agent(this.agent.id));const runtime=this,agent=this.agent,ctxData=runtime.agentContext,dbgAllComponents=runtime.xDebugPendingInject||Object.values(ctxData?.components||[]);let dbgActiveComponents;dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.exclusive==!0),(!dbgActiveComponents||dbgActiveComponents.length==0)&&(dbgActiveComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0||!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0));const dbgActiveWaitingComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&c?.ctx?.status&&typeof c?.ctx?.output!==void 0),dbgActiveReadyComponents=dbgAllComponents.filter(c=>c?.ctx?.active==!0&&!c?.ctx?.status||!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0);let step;if((!dbgActiveComponents||dbgActiveComponents.length==0)&&(runtime.sessionClosed=!0,step={state:{sessionClosed:!0},dbgSession:null,expiredDbgSession:runtime.xDebugId,sessionClosed:!0}),!step&&dbgActiveComponents.length==dbgActiveWaitingComponents.length&&ctxData.sessionResult&&(runtime.sessionClosed=!0,step={state:{sessionClosed:!0},dbgSession:null,expiredDbgSession:runtime.xDebugId,sessionClosed:!0}),!step&&dbgActiveReadyComponents.length>0){const promises=[];for(let dbgComponent of dbgActiveReadyComponents){const injectInput=runtime.xDebugPendingInject?dbgComponent.ctx.input:void 0;promises.push(agent.callComponent(dbgComponent.ctx.sourceId,dbgComponent.id,injectInput))}const dbgResults=await Promise.all(promises),state=dbgResults.length==1?dbgResults[0]:dbgResults;runtime.xDebugPendingInject=null;const remainingActiveComponents=Object.values(ctxData?.components||[]).filter(c=>c?.ctx?.active==!0),activeAsyncComponents=Object.values(ctxData?.components||[]).filter(c=>!c?.ctx?.output?._error&&Array.isArray(c?.ctx?._job_components)&&c?.ctx?._job_components.length>0);dbgAllComponents.filter(c=>c?.ctx?.status&&typeof c?.ctx?.output!==void 0).length==remainingActiveComponents.length&&(ctxData.sessionResult=!0);const triggers=Object.values(agent.triggers);let triggersResults=dbgResults.flat().filter(e=>e.id&&e.result&&!e.result._missing_inputs&&!e.result._in_progress&&triggers.find(t=>t.id==e.id)),sessionResults=dbgResults.flat().filter(e=>e.id&&e.result&&!e.result._missing_inputs&&!agent.connections.find(c=>c.sourceId==e.id));sessionResults=sessionResults.concat(triggersResults);let errorResults=dbgResults.flat().filter(e=>e.id&&(e.error||e.result?._error));errorResults=errorResults.filter(e=>!ctxData?.components?.[e.id]?.ctx?.runtimeData?._ChildLoopData),ctxData.sessionResult&&sessionResults.length==0&&runtime.sessionClosed&&(sessionResults=errorResults),ctxData.sessionResults=sessionResults,step={state,dbgSession:runtime.xDebugRun,sessionResult:runtime.agentContext.sessionResult,sessionResults:runtime.agentContext.sessionResults,errorResults,sessionClosed:remainingActiveComponents.length==0&&activeAsyncComponents.length==0}}else runtime.sessionClosed=!0,step={state:{sessionClosed:!0},dbgSession:null,expiredDbgSession:runtime.xDebugId,sessionClosed:!0};if(this.checkCircularLimit(),step.sessionResults&&_AgentRuntime2.processResults[this.processID].sessionResults.push(step.sessionResults),step.errorResults&&_AgentRuntime2.processResults[this.processID].errorResults.push(step.errorResults),step?.sessionClosed||this.circularLimitReached){const finalResult=this.processResults();step.finalResult=finalResult,runtime.sessionClosed=!0}return this.incStep(),this.sync(),step}processResults(){let result={error:"Error processing results"};const sessionResults=_AgentRuntime2.processResults[this.processID].sessionResults,errorResults=_AgentRuntime2.processResults[this.processID].errorResults;if(this.circularLimitReached)result={error:`Circular Calls Limit Reached on ${this.circularLimitReached}. Current circular limit is ${this.agent.circularLimit}`};else{let _state=[sessionResults,errorResults].flat(1/0);(!_state||_state.length==0)&&(_state=errorResults.flat(1/0)),result=_state.reduce((acc,current)=>(acc.seen[current.id]||(acc.result.push(current),acc.seen[current.id]=!0),acc),{seen:{},result:[]}).result.filter(e=>!e.result?._exclude)}return delete _AgentRuntime2.processResults[this.processID],this.sync(),result}checkCircularLimit(){if(this.circularLimitReached)return this.agentContext.circularLimitReached;for(let componentId in _AgentRuntime2.tagsData[this.reqTag])if(_AgentRuntime2.tagsData[this.reqTag][componentId]>this.agent.circularLimit)return this.sessionClosed=!0,this.agentContext.circularLimitReached=componentId,componentId;return!1}async injectDebugOutput(componentId){let component={};if(this.xDebugPendingInject?component=this.xDebugPendingInject?.find(c=>c.id==componentId):this.xMockDataInject&&(component=this.xMockDataInject?.find(c=>c.id==componentId)),component?.ctx?.output){let allEmpty=!0;for(let key in component.ctx.output)if(component.ctx.output[key]!=""){allEmpty=!1;break}return allEmpty?null:component.ctx.output}}getRuntimeData(componentId){const componentData=this.getComponentData(componentId);return componentData?componentData.runtimeData||{}:{}}updateRuntimeData(componentId,data){const componentData=this.getComponentData(componentId);componentData&&(componentData.runtimeData={...componentData.runtimeData,...data},this.sync())}saveRuntimeComponentData(componentId,data){this.updateComponent(componentId,{runtimeData:data})}incStep(){this.agentContext.incStep()}updateComponent(componentId,data){this.agentContext.updateComponent(componentId,data)}resetComponent(componentId){this.agentContext.resetComponent(componentId)}getComponentData(componentId){return this.agentContext.getComponentData(componentId)}};__publicField$1O(_AgentRuntime,"processResults",{}),__publicField$1O(_AgentRuntime,"tagsData",{}),__publicField$1O(_AgentRuntime,"dummy",AgentRuntimeUnavailable);let AgentRuntime=_AgentRuntime,previousCpuTimes=null;const monitorData={mem:getMemoryUsage(),cpu:getCpuUsage()},itv=setInterval(()=>{monitorData.mem=getMemoryUsage(),monitorData.cpu=getCpuUsage()},5e3);itv.unref();const OSResourceMonitor={get mem(){return monitorData.mem},get cpu(){return monitorData.cpu}};function getCpuUsage(){const cpus=os.cpus();let user=0,nice=0,sys=0,idle=0,irq=0;for(let cpu of cpus)user+=cpu.times.user,nice+=cpu.times.nice,sys+=cpu.times.sys,idle+=cpu.times.idle,irq+=cpu.times.irq;const currentTimes={user,nice,sys,idle,irq};if(!previousCpuTimes)return previousCpuTimes=currentTimes,{user:0,sys:0,idle:100,load:0};const userDelta=currentTimes.user-previousCpuTimes.user,niceDelta=currentTimes.nice-previousCpuTimes.nice,sysDelta=currentTimes.sys-previousCpuTimes.sys,idleDelta=currentTimes.idle-previousCpuTimes.idle,irqDelta=currentTimes.irq-previousCpuTimes.irq,totalDelta=userDelta+niceDelta+sysDelta+idleDelta+irqDelta;if(previousCpuTimes=currentTimes,totalDelta===0)return{user:0,sys:0,idle:100,load:0};const userPercent=userDelta/totalDelta*100,sysPercent=sysDelta/totalDelta*100,idlePercent=idleDelta/totalDelta*100,loadPercent=100-idlePercent;return{user:Math.round(userPercent*100)/100,sys:Math.round(sysPercent*100)/100,idle:Math.round(idlePercent*100)/100,load:Math.round(loadPercent*100)/100}}function getMemoryUsage(){const totalMemory=os.totalmem(),freeMemory=os.freemem(),usedMemory=totalMemory-freeMemory;return{totalMemory:(totalMemory/1024**3).toFixed(2)+" GB",freeMemory:(freeMemory/1024**3).toFixed(2)+" GB",usedMemory:(usedMemory/1024**3).toFixed(2)+" GB",memoryUsagePercentage:(usedMemory/totalMemory*100).toFixed(2)}}var THook=(THook2=>(THook2.Blocking="blocking",THook2.NonBlocking="non-blocking",THook2))(THook||{});const blockingHooks={},nonBlockingHooks={},blockingAfterHooks={},nonBlockingAfterHooks={};class HookService{static register(hookName,callback,mode="blocking"){if(typeof callback!="function")throw new Error("Hook callback must be a function");mode==="non-blocking"?(nonBlockingHooks[hookName]||(nonBlockingHooks[hookName]=[]),nonBlockingHooks[hookName].push(callback)):(blockingHooks[hookName]||(blockingHooks[hookName]=[]),blockingHooks[hookName].push(callback))}static registerAfter(hookName,callback,mode="blocking"){if(typeof callback!="function")throw new Error("After-hook callback must be a function");mode==="non-blocking"?(nonBlockingAfterHooks[hookName]||(nonBlockingAfterHooks[hookName]=[]),nonBlockingAfterHooks[hookName].push(callback)):(blockingAfterHooks[hookName]||(blockingAfterHooks[hookName]=[]),blockingAfterHooks[hookName].push(callback))}static trigger(hookName,...args){blockingHooks[hookName]&&blockingHooks[hookName].forEach(callback=>callback(...args)),nonBlockingHooks[hookName]&&nonBlockingHooks[hookName].forEach(callback=>callback(...args))}static triggerAfter(hookName,result,args,error){const params={result,args,error};blockingAfterHooks[hookName]&&blockingAfterHooks[hookName].forEach(callback=>callback(params)),nonBlockingAfterHooks[hookName]&&nonBlockingAfterHooks[hookName].forEach(callback=>callback(params))}}function hook(hookName){return function(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=function(...args){return nonBlockingHooks[hookName]&&Promise.allSettled(nonBlockingHooks[hookName].map(callback=>Promise.resolve().then(()=>callback.apply(this,args)))),blockingHooks[hookName]&&blockingHooks[hookName].forEach(callback=>callback.apply(this,args)),originalMethod.apply(this,args)},descriptor}}const hookableMethodsMetadata=new WeakMap;function hookableClass(constructor){return class extends constructor{constructor(...args){super(...args);const metadataMap=hookableMethodsMetadata.get(constructor);if(!metadataMap)return;const childPrototype=Object.getPrototypeOf(this),parentPrototype=constructor.prototype;childPrototype!==parentPrototype&&metadataMap.forEach((metadata,methodName)=>{const childMethod=childPrototype[methodName],parentMethod=parentPrototype[methodName];if(childMethod&&typeof childMethod=="function"&&childMethod!==parentMethod){let descriptor=Object.getOwnPropertyDescriptor(childPrototype,methodName);descriptor||(descriptor={value:childMethod,writable:!0,enumerable:!1,configurable:!0});const modifiedDescriptor=hookAsync(metadata.hookName,metadata.customContext)(childPrototype,methodName,descriptor);modifiedDescriptor&&modifiedDescriptor.value&&Object.defineProperty(childPrototype,methodName,{value:modifiedDescriptor.value,writable:!0,enumerable:!1,configurable:!0})}})}}}function hookAsync(hookName,customContext){return function(target,propertyKey,descriptor){const originalMethod=descriptor.value;return hookableMethodsMetadata.has(target.constructor)||hookableMethodsMetadata.set(target.constructor,new Map),hookableMethodsMetadata.get(target.constructor).set(propertyKey,{hookName,customContext}),descriptor.value=async function(...args){const instanceMethod=this[propertyKey];if(instanceMethod!==descriptor.value&&instanceMethod!==originalMethod)return await originalMethod.apply(this,args);let _context;typeof customContext=="function"?_context={instance:this,args,context:await customContext(this)}:typeof customContext=="object"?_context={instance:this,args,context:customContext}:_context={instance:this,args,context:{}},nonBlockingHooks[hookName]&&Promise.allSettled(nonBlockingHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,args)))).catch(err=>console.error(`Non-blocking hook ${hookName} error:`,err));let result,error;try{blockingHooks[hookName]&&await Promise.all(blockingHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,args)))),result=await originalMethod.apply(this,args)}catch(err){error=err instanceof Error?err:new Error(String(err))}try{nonBlockingAfterHooks[hookName]&&Promise.allSettled(nonBlockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}])))).catch(err=>console.error(`Non-blocking after-hook ${hookName} error:`,err)),blockingAfterHooks[hookName]&&await Promise.all(blockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}]))))}catch(afterHookError){console.error("Error in after-hooks:",afterHookError)}if(error)throw error;return result},descriptor}}function hookAsyncWithContext(hookName,contextFn){return function(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){const additionalContext=typeof contextFn=="function"?await contextFn(this):{},contextualArgs=[additionalContext,...args],_context={instance:this,args,context:additionalContext};nonBlockingHooks[hookName]&&Promise.allSettled(nonBlockingHooks[hookName].map(callback=>Promise.resolve().then(()=>callback.apply(_context,contextualArgs))));let result,error;try{blockingHooks[hookName]&&await Promise.all(blockingHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,contextualArgs)))),result=await originalMethod.apply(this,args)}catch(err){error=err instanceof Error?err:new Error(String(err))}try{nonBlockingAfterHooks[hookName]&&Promise.allSettled(nonBlockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}])))).catch(err=>console.error(`Non-blocking after-hook ${hookName} error:`,err)),blockingAfterHooks[hookName]&&await Promise.all(blockingAfterHooks[hookName].map(callback=>Promise.resolve(callback.apply(_context,[{result,args,error}]))))}catch(afterHookError){console.error("Error in after-hooks:",afterHookError)}if(error)throw error;return result},descriptor}}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 AgentSSE{constructor(agent){this.agent=agent,__publicField$1N(this,"connections",new Map)}add(res,monitorId){this.connections.set(monitorId,res)}[Symbol.iterator](){return this.connections.entries()}async send(_type,_data){if(!_type||!_data)return;const data=typeof _data=="string"?_data:JSON.stringify(_data),message=`event: ${_type}
|
|
22
22
|
data: ${data}
|
|
23
23
|
|
|
24
|
-
`;for(const[id,connection]of this.connections.entries())try{connection&&!connection.finished?connection.write(message):this.connections.delete(id)}catch(error){console.error(`Error sending SSE to connection ${id}:`,error),this.connections.delete(id)}}remove(connectionId){const connection=this.connections.get(connectionId);if(connection){try{connection&&!connection.finished&&connection.end()}catch(error){console.error(`Error closing connection ${connectionId}:`,error)}return this.connections.delete(connectionId)}return!1}async close(){for(const[id,connection]of this.connections.entries())try{connection&&!connection.finished&&(connection.end(),console.log("Delibertly shutting down sse connection with id: ",id))}catch(error){console.error(`Error closing connection ${id}:`,error)}this.connections.clear()}getConnectionCount(){return this.connections.size}}var __defProp$1L=Object.defineProperty,__getOwnPropDesc$z=Object.getOwnPropertyDescriptor,__defNormalProp$1L=(obj,key,value)=>key in obj?__defProp$1L(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$z=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$z(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$1L(target,key,result),result},__publicField$1L=(obj,key,value)=>__defNormalProp$1L(obj,typeof key!="symbol"?key+"":key,value);const logger$k=Logger("Agent"),idPromise=id=>id,MAX_LATENCY=50;class Agent{constructor(id,agentData,agentSettings,agentRequest){this.id=id,this.agentSettings=agentSettings,__publicField$1L(this,"name"),__publicField$1L(this,"data"),__publicField$1L(this,"teamId"),__publicField$1L(this,"conversationId"),__publicField$1L(this,"components"),__publicField$1L(this,"connections"),__publicField$1L(this,"endpoints",{}),__publicField$1L(this,"triggers",{}),__publicField$1L(this,"sessionId"),__publicField$1L(this,"sessionTag",""),__publicField$1L(this,"callerSessionId"),__publicField$1L(this,"apiBasePath","/api"),__publicField$1L(this,"triggerBasePath","/trigger"),__publicField$1L(this,"agentRuntime"),__publicField$1L(this,"usingTestDomain",!1),__publicField$1L(this,"domain",""),__publicField$1L(this,"debugSessionEnabled",!1),__publicField$1L(this,"circularLimit",100),__publicField$1L(this,"version",""),__publicField$1L(this,"agentVariables",{}),__publicField$1L(this,"_killReason",""),__publicField$1L(this,"async",!1),__publicField$1L(this,"jobID",""),__publicField$1L(this,"planInfo",{}),__publicField$1L(this,"callback"),__publicField$1L(this,"agentRequest"),__publicField$1L(this,"sse"),__publicField$1L(this,"modelsProvider"),__publicField$1L(this,"_componentInstance",{}),__publicField$1L(this,"_componentInstancesLoader",new ControlledPromise(()=>{}));const json=typeof agentData=="string"?JSON.parse(agentData):agentData;this.data=json.connections&&json.components?json:json.data,this.data||(this.data={name:"",connections:[],components:[]}),this.name=this.data.name,this.version=this.data.agentVersion||"",this.teamId=this.data.teamId,this.connections=this.data.connections,this.debugSessionEnabled=this.data.debugSessionEnabled,this.usingTestDomain=this.data.usingTestDomain,this.agentVariables=this.data.variables||{};const endpoints=this.data.components.filter(c=>c.name=="APIEndpoint");for(let endpoint of endpoints){let method=endpoint.data.method||"POST";method=method.toUpperCase(),this.endpoints[`${this.apiBasePath}/${endpoint.data.endpoint}`]||(this.endpoints[`${this.apiBasePath}/${endpoint.data.endpoint}`]={}),this.endpoints[`${this.apiBasePath}/${endpoint.data.endpoint}`][method]=endpoint}const triggers=this.data.components.filter(c=>typeof c.data?.triggerEndpoint=="string");for(let trigger of triggers)this.triggers[`${this.triggerBasePath}/${trigger.data.triggerEndpoint}`]=trigger;this.components={};for(let component of this.data.components)this.components[component.id]=component;for(let connection of this.data.connections){const sourceComponent=this.components[connection.sourceId],targetComponent=this.components[connection.targetId],sourceIndex=typeof connection.sourceIndex=="number"?connection.sourceIndex:sourceComponent.outputs.findIndex(o=>o.name==connection.sourceIndex),targetIndex=typeof connection.targetIndex=="number"?connection.targetIndex:targetComponent.inputs.findIndex(i=>i.name==connection.targetIndex);connection.sourceIndex=sourceIndex,connection.targetIndex=targetIndex;const output=sourceComponent.outputs[sourceIndex];if(output.index=sourceIndex,output.next||(output.next=[]),output.next.push(targetComponent.id),targetIndex>=0){const input=targetComponent.inputs[targetIndex];input&&(input.index=targetIndex,input.prev||(input.prev=[]),input.prev.push(sourceComponent.id))}else for(let input of targetComponent.inputs)input.prev||(input.prev=[]),input.prev.push(sourceComponent.id)}this.tagAsyncComponents(),agentRequest&&this.setRequest(agentRequest),this.sse=new AgentSSE(this);try{ConnectorService.getComponentConnector().requester(AccessCandidate.agent(id)).getAll().then(customComponents=>{this._componentInstance={...this._componentInstance,...customComponents},this._componentInstancesLoader.resolve(!0)})}catch{logger$k.warn("Could not load custom components",AccessCandidate.agent(this.id)),this._componentInstancesLoader.reject("Could not load custom components")}const modelsProvider=ConnectorService.getModelsProviderConnector();modelsProvider.valid&&(this.modelsProvider=modelsProvider.agent(id))}get ComponentInstances(){return this._componentInstance}addSSE(sseSource,monitorId){if(sseSource instanceof AgentSSE)for(const[monitorId2,res]of sseSource)this.sse.add(res,monitorId2);else{const id=monitorId||Math.random().toString(36).substring(2,15);this.sse.add(sseSource,id)}}setRequest(agentRequest){if(this.agentRequest)return;this.agentRequest=agentRequest,this.agentRequest=agentRequest;const dateTime=getCurrentFormattedDate();this.sessionId="rt-"+(this.agentRequest.sessionID||dateTime+"."+uid());const sessionTags=this?.agentRequest?.headers["x-session-tag"];sessionTags&&(this.sessionTag+=this.sessionTag?`,${sessionTags}`:sessionTags);var regex=new RegExp(`^/v[0-9]+(.[0-9]+)?(${this.apiBasePath}|${this.triggerBasePath})/(.*)`);this.agentRequest?.path?.startsWith(`${this.apiBasePath}/`)||this.agentRequest?.path?.startsWith(`${this.triggerBasePath}/`)||this.agentRequest?.path?.match(regex)?(this.agentRuntime=new AgentRuntime(this),this.callerSessionId=this?.agentRequest?.headers["x-caller-session-id"]?.substring(0,256)||this.agentRuntime.workflowReqId||this.sessionId):this.agentRuntime=AgentRuntime.dummy}setCallback(callback){this.callback=callback}kill(reason="kill"){this._killReason=reason}isKilled(){return!!this._killReason}async parseVariables(){if(typeof this.agentVariables=="object")for(let key in this.agentVariables){const value=this.agentVariables[key];value.startsWith("{{")&&value.endsWith("}}")&&(this.agentVariables[key]=await TemplateString(value).parseTeamKeysAsync(this.teamId).asyncResult)}}async process(endpointPath,input){await this.agentRuntime.ready();let result,dbgSession=null,sessionClosed=!1;const eventId="e-"+uid(),startTime=Date.now();this.sse.send("agent",{eventId,action:"callStart",endpointPath,id:this.id,name:this.name,startTime,input});const logId=AgentLogger.log(this,null,{sourceId:endpointPath,componentId:"AGENT",domain:this.domain,input,workflowID:this.agentRuntime.workflowReqId,processID:this.agentRuntime.processID,inputTimestamp:new Date().toISOString(),sessionID:this.callerSessionId,tags:this.sessionTag}),method=this.agentRequest.method.toUpperCase(),endpoint=this.endpoints[endpointPath]?.[method]||this.triggers[endpointPath];if(this.agentRuntime.debug){if(!endpoint&&this.agentRequest.path!="/api/")throw logId&&AgentLogger.log(this,logId,{error:`Endpoint ${method} ${endpointPath} Not Found`}),new Error(`Endpoint ${method} ${endpointPath} Not Found`);let dbgResult;if(dbgResult||(dbgResult=await this.agentRuntime.runCycle()),dbgResult&&typeof dbgResult?.state<"u")return this.agentRuntime.sync(),dbgResult?.finalResult&&(dbgResult.finalResult=await this.postProcess(dbgResult.finalResult).catch(error=>({error}))),dbgResult}if(!endpoint){logId&&AgentLogger.log(this,logId,{error:`Endpoint ${method} ${endpointPath} Not Found`});const endTime2=Date.now(),duration2=endTime2-startTime;throw this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime:endTime2,duration:duration2,input,error:`Endpoint ${method} ${endpointPath} Not Found`}),new Error(`Endpoint ${method} ${endpointPath} Not Found`)}this.agentRuntime.updateComponent(endpoint.id,{active:!0,input,sourceId:null});let step;do{step=await this.agentRuntime.runCycle();const qosLatency=Math.floor(OSResourceMonitor.cpu.load/100*MAX_LATENCY||0);await delay(qosLatency),await new Promise(resolve=>setImmediate(resolve))}while(!step?.finalResult&&!this._killReason);if(this._killReason){const endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime:endTime2,duration:duration2,input,error:"Agent killed"}),logger$k.warn(`Agent ${this.id} was killed`,AccessCandidate.agent(this.id)),{error:"AGENT_KILLED",reason:this._killReason}}if(result=await this.postProcess(step?.finalResult).catch(error=>({error})),this.agentRuntime.circularLimitReached){const circularLimitData=this.agentRuntime.circularLimitReached;result={error:`Circular Calls Limit Reached on ${circularLimitData}. Current circular limit is ${this.circularLimit}`};const endTime2=Date.now(),duration2=endTime2-startTime;throw this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime:endTime2,duration:duration2,input,error:result.error}),new Error(`Circular Calls Limit Reached on ${circularLimitData}. Current circular limit is ${this.circularLimit}`)}logId&&AgentLogger.log(this,logId,{outputTimestamp:""+Date.now(),result}),this.updateTasksCount();const endTime=Date.now(),duration=endTime-startTime;return this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime,duration,input,result}),this.agentRuntime.debug?{state:result,dbgSession,sessionClosed}:result}async updateTasksCount(){}async postProcess(_result){let result=JSON.parse(JSON.stringify(_result));Array.isArray(result)&&(result=result.flat(1/0)),Array.isArray(result)||(result=[result]),result=result.filter(r=>!(r?.result?._error&&r?.result?._error_handled));for(let i=0;i<result.length;i++){const _result2=result[i];if(!_result2)continue;_result2._debug&&delete _result2._debug,_result2._debug_time&&delete _result2._debug_time,_result2.result?._debug&&delete _result2.result._debug,_result2.result?._debug_time&&delete _result2.result._debug_time;const _componentData=this.components[_result2.id];if(!_componentData)continue;const _component=this._componentInstance[_componentData.name];if(!_component)continue;const postProcessResult=await _component.postProcess(_result2,_componentData,this).catch(error=>({error}));result[i]=postProcessResult}return result.length==1&&(result=result[0]),result}hasLoopAncestor(inputEntry){if(!inputEntry.prev)return!1;for(let prevId of inputEntry.prev){const prevComponentData=this.components[prevId];if(this.agentRuntime.getRuntimeData(prevId)?._LoopData)return!0;for(let inputEntry2 of prevComponentData.inputs)if(this.hasLoopAncestor(inputEntry2))return!0}return!1}clearChildLoopRuntimeComponentData(componentId){const componentData=this.components[componentId],runtimeData=this.agentRuntime.getRuntimeData(componentId);if(runtimeData._ChildLoopData)for(let inputEntry of componentData.inputs)this.hasLoopAncestor(inputEntry)&&delete runtimeData.input[inputEntry.name]}getComponentMissingInputs(componentId,_input){let missingInputs=[];const componentData=this.components[componentId];if(this._componentInstance[componentData.name].alwaysActive)return missingInputs;const readablePredecessors=this.findReadablePredecessors(componentId),readableInputNames={};for(let pred of readablePredecessors)pred&&(readableInputNames[pred.input.name]=pred);const allInputIndexes=this.connections.filter(c=>c.targetId==componentId).map(e=>e.targetIndex),allInputs=componentData.inputs.filter(r=>allInputIndexes.includes(r.index));if(Array.isArray(allInputs)&&allInputs.length>0){for(let input of allInputs)if(!input.optional){if(readableInputNames[input.name]){const pred=readableInputNames[input.name],component2=pred.component,predComponentData=this.components[pred.id];if(component2.hasOutput(pred.output.name,predComponentData,this))continue}typeof _input[input.name]>"u"&&missingInputs.push(input.name)}}return missingInputs}findReadablePredecessors(componentId){const componentData=this.components[componentId];return this._componentInstance[componentData.name],this.connections.filter(c=>c.targetId==componentId).map(c=>{const sourceComponentData=this.components[c.sourceId],sourceComponent=this._componentInstance[sourceComponentData.name],output=sourceComponentData.outputs[c.sourceIndex],input=componentData.inputs[c.targetIndex];return sourceComponent.hasReadOutput?{output,input,component:sourceComponent,id:c.sourceId}:null}).filter(e=>e!=null)}updateStep(sourceId,componentId){const agentRuntime=this.agentRuntime,step=agentRuntime.curStep;agentRuntime.updateComponent(componentId,{step})}async callComponent(sourceId,componentId,input){const startTime=Date.now(),agentRuntime=this.agentRuntime,componentData=this.components[componentId],component=this._componentInstance[componentData.name],eventId="e-"+uid();if(this.sse.send("component",{eventId,action:"callStart",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,input}),this._killReason){logger$k.warn(`Agent ${this.id} was killed, skipping component ${componentData.name}`,AccessCandidate.agent(this.id));const output2={id:componentData.id,name:componentData.displayName,result:null,error:"Agent killed"},endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:output2}),output2}if(!component){const endTime2=Date.now(),duration2=endTime2-startTime;throw this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:{error:"Component not found"}}),new Error(`Component ${componentData.name} not found`)}if(this.agentRuntime.incTag(componentId),this.agentRuntime.checkCircularLimit(),this.agentRuntime.circularLimitReached){const endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:{error:"Circular Calls Reached"}}),{error:"Circular Calls Reached"}}agentRuntime.getComponentData(componentId)?.output?._missing_inputs&&agentRuntime.updateComponent(componentId,{output:{}});const _input=this.prepareComponentInput(componentId,input),logId=AgentLogger.log(this,null,{sourceId:sourceId||"AGENT",componentId,domain:this.domain,workflowID:this.agentRuntime.workflowReqId,processID:this.agentRuntime.processID,input:componentData.name=="APIEndpoint"?this.agentRequest.method=="GET"?this.agentRequest.query:this.agentRequest.body:_input,inputTimestamp:new Date().toISOString(),sessionID:this.callerSessionId,tags:this.sessionTag});let output=null,missingInputs=[];if(this.updateStep(sourceId,componentId),agentRuntime.debug&&(output=await agentRuntime.injectDebugOutput(componentId)),!output){if(missingInputs=this.getComponentMissingInputs(componentId,_input),missingInputs.length>0){agentRuntime.updateComponent(componentId,{active:!0,status:"waiting"});const connections=this.connections.filter(c=>c.sourceId==componentId)||[];for(let connection of connections)if(componentData.outputs[connection.sourceIndex].name=="_error")break;output={_error:"Missing inputs : "+JSON.stringify(missingInputs),_missing_inputs:missingInputs}}if(!output){const validationResult=await component.validateConfig(componentData);if(validationResult._error)output=validationResult;else try{await this.parseVariables(),output=await component.process({...this.agentVariables,..._input},{...componentData,eventId},this),logger$k.debug(output,AccessCandidate.agent(this.id))}catch(error){logger$k.error("Error on component process: ",{componentId,name:componentData.name,input:_input},error,AccessCandidate.agent(this.id)),error?.message?output={Response:void 0,_error:error.message,_debug:error.message}:output={Response:void 0,_error:error.toString(),_debug:error.toString()}}}}const runtimeData=this.agentRuntime.getRuntimeData(componentId);if(agentRuntime.updateComponent(componentId,{output}),output._in_progress&&agentRuntime.updateComponent(componentId,{active:!0,status:"in_progress"}),(output.error||output._error)&&(runtimeData?._ChildLoopData?._in_progress||this.agentRuntime.resetComponent(componentId),logId&&AgentLogger.log(this,logId,{error:output.error||output._error}),output.error)){const endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:{error:output.error||output._error}}),[{id:componentData.id,name:componentData.displayName,result:null,error:output.error||output._error,_debug:output.error||output._error}]}let results=[];if(output&&!output._missing_inputs){if(AgentLogger.logTask(this,1),results=await this.callNextComponents(componentId,output).catch(error=>({error,id:componentData.id,name:componentData.displayName})),runtimeData._LoopData&&output._in_progress&&runtimeData._LoopData.branches==null){const branches=Array.isArray(results)?results.length:1;output._in_progress&&(runtimeData._LoopData.branches=branches,agentRuntime.updateRuntimeData(componentId,{_LoopData:runtimeData._LoopData}))}if(results._is_leaf){delete results._is_leaf;const _ChildLoopData=runtimeData._ChildLoopData;if(_ChildLoopData&&_ChildLoopData.parentId){const parentId=_ChildLoopData.parentId,_LoopData=this.agentRuntime.getRuntimeData(parentId)._LoopData;if(_LoopData){_LoopData.result||(_LoopData.result=[]);let resultsCopy=JSON.parse(JSON.stringify(results));results.result&&(results.result._exclude=!0),resultsCopy=await component.postProcess(resultsCopy,componentData,this),_LoopData.result.push(resultsCopy),_LoopData.branches--,_LoopData.branches<=0&&agentRuntime.updateComponent(parentId,{active:!0,status:""}),agentRuntime.updateRuntimeData(parentId,{_LoopData})}}else{const _LoopData=this.agentRuntime.getRuntimeData(componentId)._LoopData;_LoopData&&_LoopData.loopIndex==1&&(_LoopData._in_progress=!1,output._in_progress=!1,agentRuntime.updateComponent(componentId,{active:!0,status:""}),agentRuntime.updateRuntimeData(componentId,{_LoopData}))}}}!output._missing_inputs&&!output._in_progress&&(runtimeData?._ChildLoopData?._in_progress&&runtimeData._ChildLoopData?.loopIndex<runtimeData._ChildLoopData?.loopLength?(this.clearChildLoopRuntimeComponentData(componentId),agentRuntime.updateComponent(componentId,{active:!0,status:"waiting"})):this.agentRuntime.resetComponent(componentId)),Array.isArray(results)&&(results=results.flat(1/0).filter(r=>r.result!=null)),logId&&AgentLogger.log(this,logId,{output,outputTimestamp:""+Date.now()});const endTime=Date.now(),duration=endTime-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime,duration,output}),[results,{id:componentData.id,name:componentData.displayName,result:output}]}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}async callNextComponents(componentId,output){const agentRuntime=this.agentRuntime,componentData=this.components[componentId];this._componentInstance[componentData.name];let connections=this.connections.filter(c=>c.sourceId==componentId).map(c=>({...c,output,componentData}));const waitingComponents=agentRuntime.getWaitingComponents(),waitingComponentIds=waitingComponents.map(e=>e.id),alwaysActiveIds=Object.keys(this.agentRuntime.alwaysActiveComponents),alwaysActiveConnections=this.connections.filter(c=>alwaysActiveIds.includes(c.sourceId)&&waitingComponentIds.includes(c.targetId)).map(c=>{const output2={};waitingComponents.find(e=>e.id==c.targetId);const prevComponentData=this.components[c.sourceId],prevComponent=this._componentInstance[prevComponentData.name],outputEndpoint=prevComponentData.outputs[c.sourceIndex];return output2[outputEndpoint.name]=prevComponent.readOutput(outputEndpoint.name,prevComponentData,this),{...c,output:output2,componentData:this.components[c.sourceId]}});if(connections=[...connections,...alwaysActiveConnections],!Array.isArray(connections)||connections.length==0)return{id:componentData.id,name:componentData.name,result:output,_is_leaf:!0};const targetComponents=connections.reduce((acc,obj)=>{let key=obj.targetId;return acc[key]||(acc[key]=[]),acc[key].push(obj),acc},{}),promises=[];for(let targetId in targetComponents){const targetComponentData=this.components[targetId];if(!this.async&&targetComponentData.async&&targetComponentData.name!=="Async")continue;this._componentInstance[targetComponentData.name];const connections2=targetComponents[targetId];let _isErrorHandler=!1;if(Array.isArray(connections2)&&connections2.length>0){const nextInput={};for(let connection of connections2){const output2=connection.output,componentData2=connection.componentData,outputEndpoint=componentData2.outputs[connection.sourceIndex],inputEndpoint=targetComponentData.inputs[connection.targetIndex],outputExpression=outputEndpoint.expression||outputEndpoint.name,outputParts=outputExpression.split("."),defaultOutputs=componentData2.outputs.find(c=>c.default);let value;if(outputEndpoint.name=="_error"&&(_isErrorHandler=!0),outputEndpoint.default?value=output2[outputEndpoint.name]:defaultOutputs&&(value=output2[defaultOutputs.name]?.[outputEndpoint.name]),value===void 0&&outputParts.length>=1){let val=this.JSONExpression(output2,outputExpression);val!==void 0&&(value=val)}if(value!==void 0){let combinedInput=_mergeInputs(nextInput[inputEndpoint.name],value).filter(e=>e!==void 0);nextInput[inputEndpoint.name]=combinedInput.length===1?combinedInput[0]:combinedInput}}if(!nextInput||JSON.stringify(nextInput)=="{}")continue;const input=this.prepareComponentInput(targetId,nextInput),targetComponent2=this.components[targetId];_isErrorHandler&&targetComponent2&&(output._error_handled=!0);const status=this.getComponentMissingInputs(targetId,input).length>0?"waiting":void 0,sourceRuntimeData=this.agentRuntime.getRuntimeData(componentId);let _ChildLoopData=sourceRuntimeData._LoopData;(!_ChildLoopData||!_ChildLoopData._in_progress)&&(_ChildLoopData=sourceRuntimeData._ChildLoopData),agentRuntime.updateComponent(targetId,{active:!0,input:nextInput,sourceId:componentId,status}),agentRuntime.updateRuntimeData(targetId,{_ChildLoopData,_LoopData:null}),promises.push(idPromise({id:targetId,name:targetComponent2.name,inputs:nextInput})),status&&AgentLogger.log(this,null,{sourceId:componentId,componentId:targetId,step:this.agentRuntime.curStep+1,domain:this.domain,workflowID:this.agentRuntime.workflowReqId,processID:this.agentRuntime.processID,input:{__action:"status_update",__status:status,data:nextInput},inputTimestamp:new Date().toISOString(),sessionID:this.callerSessionId,tags:this.sessionTag})}}if(promises.length==0)return{id:componentData.id,name:componentData.name,result:output,_is_leaf:!0};const results=await Promise.all(promises);return results.length==1?results[0]:results}prepareComponentInput(targetId,inputs){const rData=this.agentRuntime.getRuntimeData(targetId),componentData=this.components[targetId],rDataInput=rData?.input||{};let _input={...rDataInput};if(inputs)for(let key in inputs){let value=inputs[key];_input[key]=_mergeInputs(rDataInput[key],value).filter(e=>e!==void 0),_input[key].length==1&&(_input[key]=_input[key][0])}const readablePredecessors=this.findReadablePredecessors(targetId);for(let c of readablePredecessors)if(c){const predComponentData=this.components[c.id],value=c.component.readOutput(c.output.name,predComponentData,this);value&&c.input?.name&&(_input||(_input={}),_input[c.input.name]=value)}this.agentRuntime.updateRuntimeData(targetId,{input:_input});for(let input of componentData.inputs)input.defaultVal&&_input[input.name]===void 0&&(_input[input.name]=TemplateString(input.defaultVal).parse(this.agentVariables).result);return _input}getConnectionSource(connection){return this.components[connection.sourceId].inputs.find(e=>e.index===connection.sourceIndex)}getConnectionTarget(connection){return this.components[connection.targetId].inputs.find(e=>e.index===connection.targetIndex)}recursiveTagAsyncComponents(component){const agent=this;for(let output of component.outputs){if(component.name=="Async"&&output.name==="JobID")continue;const connected=agent.connections.filter(c=>c.sourceId===component.id&&c.sourceIndex===output.index);if(connected)for(let con of connected){const targetComponent=agent.components[con.targetId];targetComponent&&(targetComponent.async=!0,this.recursiveTagAsyncComponents(targetComponent))}}}tagAsyncComponents(){const AsyncComponents=Object.values(this.components).filter(c=>c.name==="Async");if(!(!AsyncComponents||AsyncComponents.length==0))for(let AsyncComponent of AsyncComponents)AsyncComponent.async=!0,this.recursiveTagAsyncComponents(AsyncComponent)}}__decorateClass$z([hookAsync("SREAgent.process")],Agent.prototype,"process"),__decorateClass$z([hookAsync("SREAgent.postProcess")],Agent.prototype,"postProcess"),__decorateClass$z([hookAsync("SREAgent.callComponent")],Agent.prototype,"callComponent"),__decorateClass$z([hookAsync("SREAgent.callNextComponents")],Agent.prototype,"callNextComponents");function _mergeInputs(existing,newValue){return existing===void 0?[newValue]:(Array.isArray(existing)||(existing=[existing]),[...existing,newValue])}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,typeof key!="symbol"?key+"":key,value);class AgentRequest{constructor(req){if(__publicField$1K(this,"headers"),__publicField$1K(this,"body"),__publicField$1K(this,"query"),__publicField$1K(this,"params"),__publicField$1K(this,"method","GET"),__publicField$1K(this,"path",""),__publicField$1K(this,"sessionID",""),__publicField$1K(this,"res",null),__publicField$1K(this,"req",null),__publicField$1K(this,"files",[]),__publicField$1K(this,"_agent_authinfo"),!req)return;this.headers=JSON.parse(JSON.stringify(req.headers||{})),this.body=JSON.parse(JSON.stringify(req.body||req.data||{})),this.query=JSON.parse(JSON.stringify(req.query||{})),this.params=JSON.parse(JSON.stringify(req.params||{}));const lowerCaseHeaders=Object.fromEntries(Object.entries(this.headers).map(([key,value])=>[key.toLowerCase(),value]));if(this.headers={...lowerCaseHeaders,...this.headers},req?.url)try{const url=new URL(req.url);this.path=url.pathname,this.query={...this.query,...Object.fromEntries(url.searchParams)}}catch{}req?.path&&(this.path=req.path),this.method=req.method,this.sessionID=req.sessionID,this.files=req.files||[],this._agent_authinfo=req._agent_authinfo,this.req=req instanceof AgentRequest?req?.req:req,this.res=req?.res||null}header(name){return this.headers[name.toLowerCase()]}}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);Logger("EmbodimentSettings");class EmbodimentSettings{constructor(agentId){__publicField$1J(this,"_embodiments"),__publicField$1J(this,"_ready",!1),this.init(agentId)}async init(agentId){const agentDataConnector=ConnectorService.getAgentDataConnector();this._embodiments=await agentDataConnector.getAgentEmbodiments(agentId).catch(error=>[]),this._ready=!0}ready(maxWait=1e4){return new Promise((resolve,reject)=>{const interval=setInterval(()=>{this._ready&&(clearInterval(interval),resolve(!0)),maxWait-=100},100);setTimeout(()=>{clearInterval(interval),reject(!1)},maxWait)})}get(embodimentType,key){if(!this._embodiments)return;const _embodiment=this._embodiments.find(embodiment=>embodiment.type?.toLowerCase()===embodimentType.toLowerCase());return key?_embodiment?.properties?.[key]:_embodiment?.properties}getAll(){const obj={};return this._embodiments.forEach(embodiment=>{obj[embodiment.type.toLowerCase()]=embodiment.properties}),obj}}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);Logger("AgentSettings");class AgentSettings{constructor(agentId){__publicField$1I(this,"_settings"),__publicField$1I(this,"embodiments"),__publicField$1I(this,"_ready",!1),agentId&&this.init(agentId)}async init(agentId){this.embodiments=new EmbodimentSettings(agentId);const agentDataConnector=ConnectorService.getAgentDataConnector();this._settings=await agentDataConnector.getAgentSettings(agentId).catch(e=>{})||{},this._ready=!0}ready(maxWait=1e4){return new Promise((resolve,reject)=>{const interval=setInterval(()=>{this._ready&&(clearInterval(interval),resolve(!0)),maxWait-=100},100);setTimeout(()=>{clearInterval(interval),reject(!1)},maxWait)})}get(key){return this._settings?.[key]||""}set(key,value){this._settings[key]=value}has(key){return this._settings[key]}}var __defProp$1H=Object.defineProperty,__defNormalProp$1H=(obj,key,value)=>key in obj?__defProp$1H(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1H=(obj,key,value)=>__defNormalProp$1H(obj,typeof key!="symbol"?key+"":key,value);class AgentProcess{constructor(agentData,agentVersion){this.agentData=agentData,this.agentVersion=agentVersion,__publicField$1H(this,"agent"),__publicField$1H(this,"_loadPromise"),this.initAgent(agentData,agentVersion)}async initAgent(agentData,agentVersion){let data,agentId;if(typeof agentData=="object")data=agentData,data.components&&data.connections&&(data={data,version:"1.0"}),agentId=data.data.id||"tmp-"+uid();else{const jsonRegex=/^{.*}$/g,jsonData=agentData.match(jsonRegex)?.[0],idRegex=/^[a-zA-Z0-9\-]+$/g;agentId=agentData.match(idRegex)?.[0],agentId&&(data=await ConnectorService.getAgentDataConnector().getAgentData(agentId,agentVersion)),!data&&jsonData&&(data=JSON.parse(jsonData),agentId=data.id||"tmp-"+uid(),data.components&&data.connections&&(data={data,version:"1.0"}))}const agentSettings=new AgentSettings(agentId);this.agent=new Agent(agentId,data,agentSettings)}async ready(){return this._loadPromise?this._loadPromise:this._loadPromise=new Promise(resolve=>{let maxWait=1e4;const itv2=setInterval(()=>{this.agent&&(clearInterval(itv2),resolve(!0)),maxWait-=100,maxWait<=0&&(clearInterval(itv2),resolve(!1))},100)})}static load(agentData,agentVersion){return new AgentProcess(agentData,agentVersion)}async run(reqConfig,callback){if(await this.ready(),!this.agent)throw new Error("Failed to load agent");let request=this.parseReqConfig(reqConfig);this.agent.setRequest(request),typeof callback=="function"&&this.agent.setCallback(callback);const pathMatches=request.path.match(/(^\/v[0-9]+\.[0-9]+?)?(\/(api|trigger)\/(.+)?)/);if(!pathMatches||!pathMatches[2])return{status:404,data:{error:"Endpoint not found"}};const endpointPath=pathMatches[2],input=request.method=="GET"?request.query:request.body;return{data:await this.agent.process(endpointPath,input).catch(error=>({error:error.message}))}}reset(){this.initAgent(this.agentData)}parseReqConfig(reqConfig){return reqConfig instanceof AgentRequest?reqConfig:Array.isArray(reqConfig)?this.parseCLI(reqConfig):new AgentRequest(reqConfig)}parseCLI(argList){const cliConnector=ConnectorService.getCLIConnector(),methods=["get","post","put","delete","patch","head","options"],cli=cliConnector.parse(argList,["endpoint","post","get","put","delete","patch","head","options","headers","session"]),usedMethod=methods.find(method=>cli[method]),req=new AgentRequest;switch(req.method=usedMethod?.toUpperCase()||"GET",req.body={},req.query={},usedMethod){case"get":case"delete":case"head":case"options":req.query=cli[usedMethod];break;case"post":case"put":case"patch":req.body=cli[usedMethod];break}req.path=`/api/${cli.endpoint}`,req.params=cli.endpoint?.split("/"),req.headers=cli.headers||{};for(let key in req.headers)req.headers[key.toLowerCase()]=req.headers[key],delete req.headers[key];if(req.sessionID=cli.session||uid(),req.files=[],req.body)for(let entry in req.body){let value=req.body[entry];const filePath=path.join(process.cwd(),value),fileName=path.basename(filePath);if(fs__default.existsSync(filePath))try{const fileBuffer=fs__default.readFileSync(filePath),ext=fileName.split(".").pop(),fileObj={fieldname:entry,originalname:fileName,buffer:fileBuffer,mimetype:mime.getType(ext)||"application/octet-stream"};delete req.body[entry],req.files.push(fileObj),FileType.fileTypeFromBuffer(fileBuffer).then(fileType=>{fileType&&(fileObj.mimetype=fileType.mime)})}catch(error){console.warn("Coud not read file",filePath,error.message)}}return req}async post(path2,input,headers){return this.run({method:"POST",path:path2,body:input||{},headers})}async get(path2,query,headers){return this.run({method:"GET",path:path2,query,headers})}async readDebugState(stateId,reqConfig){if(await this.ready(),!this.agent)throw new Error("Failed to load agent");let request=this.parseReqConfig(reqConfig);return this.agent.setRequest(request),await this.agent.agentRuntime.ready(),this.agent.agentRuntime.readState(stateId,!0)}}function isAgent(agent){return typeof agent=="object"&&agent.id&&typeof agent.callComponent=="function"}var __defProp$1G=Object.defineProperty,__defNormalProp$1G=(obj,key,value)=>key in obj?__defProp$1G(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1G=(obj,key,value)=>__defNormalProp$1G(obj,key+"",value);class JSONContentHelper{constructor(dataString){this.dataString=dataString,__publicField$1G(this,"_current"),this._current=dataString}get result(){return this._current}static create(dataString){return new JSONContentHelper(dataString)}tryParse(){const strInput=this._current;if(!isValidString(strInput)||isDigits(strInput)||isSafeNumber(strInput))return strInput;let str=strInput.trim();if(str.startsWith("{")&&str.endsWith("}")||str.startsWith("[")&&str.endsWith("]"))try{return JSON.parse(str)}catch{try{const repairedJson=jsonrepair(str);return JSON.parse(repairedJson)}catch{}}if(str=(this.extractJsonFromString(strInput)||strInput).trim(),isDigits(str)&&!isSafeNumber(str)||!str.startsWith("{")&&!str.startsWith("["))return str;try{return JSON.parse(str)}catch{try{const repairedJson=jsonrepair(str);return JSON.parse(repairedJson)}catch{return strInput}}}tryFullParse(){const str=this._current;if(!str||isDigits(str)&&!isSafeNumber(str)||!str.startsWith("{")&&!str.startsWith("["))return str;try{return JSON.parse(str)}catch{try{return JSON.parse(jsonrepair(str))}catch(e2){return console.warn("Error on parseJson: ",e2.toString()),console.warn(" Tried to parse: ",str),{result:str,error:e2.toString()}}}}extractJsonFromString(str){try{const regex=/(\{.*\})/s;return str.match(regex)?.[1]}catch{return null}}}function JSONContent(dataString){return JSONContentHelper.create(dataString)}const console$p=Logger("SecureConnector");class SecureConnector extends Connector{async start(){console$p.info(`Starting ${this.name} connector ...`)}async stop(){console$p.info(`Stopping ${this.name} connector ...`)}async hasAccess(acRequest){const aclHelper=await this.getResourceACL(acRequest.resourceId,acRequest.candidate).catch(error=>(console$p.error(`Error getting ACL for ${acRequest.resourceId}: ${error}`),null));if(!aclHelper)return!1;if(aclHelper.checkExactAccess(acRequest))return!0;const ownerRequest=AccessRequest.clone(acRequest).setLevel(TAccessLevel.Owner);if(aclHelper.checkExactAccess(ownerRequest))return!0;const publicRequest=AccessRequest.clone(acRequest).setCandidate(AccessCandidate.public());if(aclHelper.checkExactAccess(publicRequest))return!0;const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),teamRequest=AccessRequest.clone(acRequest).setCandidate(AccessCandidate.team(teamId));if(aclHelper.checkExactAccess(teamRequest))return!0;const teamOwnerRequest=AccessRequest.clone(teamRequest).setLevel(TAccessLevel.Owner);return!!aclHelper.checkExactAccess(teamOwnerRequest)}async getAccessTicket(resourceId,request){const sysAcRequest=AccessRequest.clone(request).resource(resourceId);return{request,access:await this.hasAccess(sysAcRequest)?TAccessResult.Granted:TAccessResult.Denied}}static AccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){const[acRequest,resourceId]=args;if(resourceId!==void 0&&(await this.getAccessTicket(resourceId,acRequest)).access!==TAccessResult.Granted)throw console$p.error(`Access denied for ${acRequest.candidate.id} on ${resourceId}`),new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}}class CacheConnector extends SecureConnector{requester(candidate){return{get:async key=>await this.get(candidate.readRequest,key),set:async(key,data,acl,metadata,ttl)=>await this.set(candidate.writeRequest,key,data,acl,metadata,ttl),delete:async key=>{await this.delete(candidate.writeRequest,key)},exists:async key=>await this.exists(candidate.readRequest,key),getMetadata:async key=>await this.getMetadata(candidate.readRequest,key),setMetadata:async(key,metadata)=>{await this.setMetadata(candidate.writeRequest,key,metadata)},updateTTL:async(key,ttl)=>{await this.updateTTL(candidate.writeRequest,key,ttl)},getTTL:async key=>await this.getTTL(candidate.readRequest,key),getACL:async key=>await this.getACL(candidate.readRequest,key),setACL:async(key,acl)=>{await this.setACL(candidate.writeRequest,key,acl)}}}}var __defProp$1F=Object.defineProperty,__defNormalProp$1F=(obj,key,value)=>key in obj?__defProp$1F(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1F=(obj,key,value)=>__defNormalProp$1F(obj,typeof key!="symbol"?key+"":key,value);const ACLHashAlgo={none:source=>source,xxh3:source=>{const h64=xxhash.h64();return source?h64.update(source.toString()).digest().toString(16):null}};class ACL{constructor(acl){__publicField$1F(this,"hashAlgorithm"),__publicField$1F(this,"entries"),__publicField$1F(this,"migrated"),typeof acl=="string"?this.deserializeACL(acl):(this.hashAlgorithm=acl?.hashAlgorithm,this.entries=acl?.entries?JSON.parse(JSON.stringify(acl?.entries)):{},this.migrated=acl?.migrated),this.hashAlgorithm||(this.hashAlgorithm="xxh3"),this.entries||(this.entries={})}get ACL(){return{hashAlgorithm:this.hashAlgorithm,entries:JSON.parse(JSON.stringify(this.entries)),migrated:this.migrated}}get serializedACL(){return this.serializeACL(this)}static from(acl){return new ACL(acl)}checkExactAccess(acRequest){if(!this?.entries)return!1;const role=this?.entries[acRequest.candidate.role];if(!role)return!1;let entryId=acRequest.candidate.id;if(!ACLHashAlgo[this.hashAlgorithm])throw new Error(`Hash algorithm ${this.hashAlgorithm} not supported`);entryId=ACLHashAlgo[this.hashAlgorithm](entryId);const access=role[entryId];return access?(Array.isArray(acRequest.level)?acRequest.level:[acRequest.level]).every(level=>access.includes(level)):!1}addPublicAccess(level){if(this?.entries[TAccessRole.Public]||(this.entries[TAccessRole.Public]={}),!ACLHashAlgo[this.hashAlgorithm])throw new Error(`Hash algorithm ${this.hashAlgorithm} not supported`);const ownerId=TAccessRole.Public,hashedOwner=ACLHashAlgo[this.hashAlgorithm](ownerId);this?.entries[TAccessRole.Public][hashedOwner]||(this.entries[TAccessRole.Public][hashedOwner]=[]);const curLevel=this.entries[TAccessRole.Public][hashedOwner];return this.entries[TAccessRole.Public][hashedOwner]=[...curLevel,...level],this}removePublicAccess(level){if(!this?.entries[TAccessRole.Public])return this;const ownerId=TAccessRole.Public,hashedOwner=ACLHashAlgo[this.hashAlgorithm](ownerId),curLevel=this[TAccessRole.Public][hashedOwner];return this[TAccessRole.Public][hashedOwner]=curLevel.filter(l=>!level.includes(l)),this}addAccess(role,ownerId,level){if(role===TAccessRole.Public)throw new Error("Adding public access using addAccess method is not allowed. Use addPublicAccess method instead.");const _level=Array.isArray(level)?level:[level];if(this?.entries[role]||(this.entries[role]={}),!ACLHashAlgo[this.hashAlgorithm])throw new Error(`Hash algorithm ${this.hashAlgorithm} not supported`);const hashedOwner=ACLHashAlgo[this.hashAlgorithm](ownerId);if(!hashedOwner)throw new Error(`Invalid ownerId: ${role}:${ownerId}`);this?.entries[role][hashedOwner]||(this.entries[role][hashedOwner]=[]);const curLevel=this.entries[role][hashedOwner];return this.entries[role][hashedOwner]=[...curLevel,..._level],this}static addAccess(role,ownerId,level){return ACL.from().addAccess(role,ownerId,level)}removeAccess(role,ownerId,level){const _level=Array.isArray(level)?level:[level];if(!this[role])return this;if(!this[role][ownerId])return this;const curLevel=this[role][ownerId];return this[role][ownerId]=curLevel.filter(l=>!_level.includes(l)),this}serializeACL(tacl){let compressed="";if(tacl.hashAlgorithm&&(compressed+=`h:${tacl.hashAlgorithm}|`),tacl.entries)for(const[role,entries]of Object.entries(tacl.entries)){const roleShort=RoleMap[role],entriesArray=[];for(const[hashedOwnerKey,accessLevels]of Object.entries(entries||{}))if(accessLevels){const accessLevelsShort=accessLevels.map(level=>LevelMap[level]).join("");entriesArray.push(`${hashedOwnerKey}/${accessLevelsShort}`)}entriesArray.length>0&&(compressed+=`${roleShort}:${entriesArray.join(",")}|`)}return compressed.endsWith("|")&&(compressed=compressed.slice(0,-1)),compressed}deserializeACL(compressed){const parts=compressed.split("|");this.hashAlgorithm="",this.entries={};for(const part of parts)if(part.startsWith("h:"))this.hashAlgorithm=part.substring(2);else{const[roleShort,entries]=part.split(":"),role=ReverseRoleMap[roleShort];if(role){const entriesObj={},entriesArray=entries.split(",");for(const entry of entriesArray){const[hashedOwnerKey,accessLevelsShort]=entry.split("/"),accessLevels=accessLevelsShort.split("").map(short=>ReverseLevelMap[short]);entriesObj[hashedOwnerKey]=accessLevels}this.entries[role]=entriesObj}}}}class StorageConnector extends SecureConnector{requester(candidate){return{write:async(resourceId,value,acl,metadata)=>await this.write(candidate.writeRequest,resourceId,value,acl,metadata),read:async resourceId=>await this.read(candidate.readRequest,resourceId),delete:async resourceId=>{await this.delete(candidate.readRequest,resourceId)},exists:async resourceId=>await this.exists(candidate.readRequest,resourceId),getMetadata:async resourceId=>await this.getMetadata(candidate.readRequest,resourceId),setMetadata:async(resourceId,metadata)=>{await this.setMetadata(candidate.writeRequest,resourceId,metadata)},getACL:async resourceId=>await this.getACL(candidate.readRequest,resourceId),setACL:async(resourceId,acl)=>await this.setACL(candidate.writeRequest,resourceId,acl),expire:async(resourceId,ttl)=>await this.expire(candidate.writeRequest,resourceId,ttl)}}}var __defProp$1E=Object.defineProperty,__defNormalProp$1E=(obj,key,value)=>key in obj?__defProp$1E(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1E=(obj,key,value)=>__defNormalProp$1E(obj,typeof key!="symbol"?key+"":key,value);const _SmythFS=class _SmythFS2{constructor(storage,cache){this.storage=storage,this.cache=cache,__publicField$1E(this,"hash"),this.hash=_SmythFS2.generateInstanceHash(this.storage.name,this.cache.name)}static generateInstanceHash(storageName,cacheName){const instanceProps=`${storageName}:${cacheName}`;return crypto$1.createHash("sha256").update(instanceProps).digest("hex").substring(0,6)}static get Instance(){return _SmythFS2.getInstance()}static getInstance(storageProvider="",cacheProvider=""){const storage=storageProvider instanceof StorageConnector?storageProvider:ConnectorService.getStorageConnector(storageProvider),cache=cacheProvider instanceof CacheConnector?cacheProvider:ConnectorService.getCacheConnector(cacheProvider),hash=_SmythFS2.generateInstanceHash(storage.name,cache.name);if(_SmythFS2.instances[hash])return _SmythFS2.instances[hash];const instance=new _SmythFS2(storage,cache),router=ConnectorService.getRouterConnector();return router&&router?.get instanceof Function&&(router.get(`/_temp/${hash}/:uid`,instance.serveTempContent.bind(instance)),router.get(`/storage/${hash}/:file_id`,instance.serveResource.bind(instance))),_SmythFS2.instances[hash]=instance,instance}getBaseUri(candidate){return`smythfs://${candidate.id}.${candidate.role}`}async read(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate),data=await this.storage.requester(_candidate).read(resourceId);return data?this.toBuffer(data):null}async getMetadata(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);return await this.storage.requester(_candidate).getMetadata(resourceId)}async write(uri,data,candidate,metadata,ttl){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);let acl;if(smythURI.team&&smythURI.team!==DEFAULT_TEAM_ID&&(acl=new ACL().addAccess(TAccessRole.Team,smythURI.team,TAccessLevel.Read).ACL),metadata||(metadata={}),!metadata?.ContentType&&(metadata.ContentType=await getMimeType(data),!metadata.ContentType)){const ext=uri.split(".").pop();ext&&(metadata.ContentType=mime.getType(ext)||"application/octet-stream")}await this.storage.requester(_candidate).write(resourceId,data,acl,metadata),ttl&&await this.storage.requester(_candidate).expire(resourceId,ttl)}async delete(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);await this.storage.requester(_candidate).delete(resourceId)}async exists(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);return await this.storage.requester(_candidate).exists(resourceId)}async genTempUrl(uri,candidate,ttlSeconds=3600){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");if(!await this.exists(uri,candidate))throw new Error("Resource does not exist");const _candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate),resourceId=`teams/${smythURI.team}${smythURI.path}`,resourceMetadata=await this.storage.requester(_candidate).getMetadata(resourceId),uid2=crypto$1.randomUUID(),tempUserCandidate=AccessCandidate.user(`system-${uid2}`);return await this.cache.requester(tempUserCandidate).set(`pub_url:${uid2}`,JSON.stringify({accessCandidate:_candidate,uri,contentType:resourceMetadata?.ContentType}),void 0,void 0,ttlSeconds),`${ConnectorService.getRouterConnector().baseUrl}/_temp/${this.hash}/${uid2}`}async destroyTempUrl(url,{delResource}={delResource:!1}){const tempPath=url.split("/_temp/")[1];if(!tempPath)throw new Error("Invalid Temp URL format");const uid2=tempPath.split("/")[1]?.split("?")[0];if(!uid2)throw new Error("Invalid Temp URL format");let cacheVal=await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).get(`pub_url:${uid2}`);if(!cacheVal)throw new Error("Invalid Temp URL");cacheVal=JSONContentHelper.create(cacheVal).tryParse(),await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).delete(`pub_url:${uid2}`),delResource&&await this.delete(cacheVal.uri,AccessCandidate.clone(cacheVal.accessCandidate))}async serveTempContent(req,res){try{const{uid:uid2}=req.params;let cacheVal=await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).get(`pub_url:${uid2}`);if(!cacheVal){res.writeHead(404,{"Content-Type":"text/plain"}),res.end("Invalid Temp URL");return}cacheVal=JSONContentHelper.create(cacheVal).tryParse();const content=await this.read(cacheVal.uri,AccessCandidate.clone(cacheVal.accessCandidate)),contentBuffer=Buffer.isBuffer(content)?content:Buffer.from(content,"binary"),contentType=cacheVal.contentType||"application/octet-stream";res.writeHead(200,{"Content-Type":contentType,"Content-Disposition":"inline","Content-Length":contentBuffer.length}),res.end(contentBuffer)}catch(error){console.error("Error serving temp content:",error),res.writeHead(500,{"Content-Type":"text/plain"}),res.end("Internal Server Error")}}async genResourceUrl(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");if(!await this.exists(uri,candidate))throw new Error("Resource does not exist");const _candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);if(_candidate.role!==TAccessRole.Agent)throw new Error("Only agents can generate resource urls");const agentId=_candidate.id,resourceId=`teams/${smythURI.team}${smythURI.path}`,resourceMetadata=await this.storage.requester(_candidate).getMetadata(resourceId),uid2=crypto$1.randomUUID(),tempUserCandidate=AccessCandidate.user(`system-${uid2}`);await this.cache.requester(tempUserCandidate).set(`storage_url-${uid2}`,JSON.stringify({accessCandidate:_candidate,uri,contentType:resourceMetadata?.ContentType}),void 0,void 0);const contentType=resourceMetadata?.ContentType,ext=contentType?mime.getExtension(contentType):void 0,agentDataConnector=ConnectorService.getAgentDataConnector(),baseUrl=ConnectorService.getRouterConnector().baseUrl;return`${agentDataConnector.getAgentConfig(agentId)?.agentStageDomain?`https://${agentDataConnector.getAgentConfig(agentId).agentStageDomain}`:baseUrl}/storage/${this.hash}/${uid2}${ext?`.${ext}`:""}`}async destroyResourceUrl(url,{delResource}={delResource:!1}){}async serveResource(req,res){try{const{file_id}=req.params,[uid2,extention]=file_id.split(".");let cacheVal=await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).get(`storage_url-${uid2}`);if(!cacheVal){res.writeHead(404,{"Content-Type":"text/plain"}),res.end("Invalid Resource URL");return}cacheVal=JSONContentHelper.create(cacheVal).tryParse();const content=await this.read(cacheVal.uri,AccessCandidate.clone(cacheVal.accessCandidate)),contentBuffer=Buffer.isBuffer(content)?content:Buffer.from(content,"binary"),contentType=cacheVal.contentType||"application/octet-stream";res.writeHead(200,{"Content-Type":contentType,"Content-Disposition":"inline","Content-Length":contentBuffer.length}),res.end(contentBuffer)}catch(error){console.error("Error serving storage resource content:",error),res.writeHead(500,{"Content-Type":"text/plain"}),res.end("Internal Server Error")}}async URIParser(uri){const parts=uri.split("://");if(parts.length!==2||parts[0].toLowerCase()!=="smythfs")return;const parsed=this.CaseSensitiveURL(`http://${parts[1]}`),tld=parsed.hostname.split(".").pop();if(tld!=="team"&&tld!=="user"&&tld!=="agent"&&tld!=="smyth")throw new Error("Invalid Resource URI");let team=tld==="team"?parsed.hostname.replace(`.${tld}`,""):void 0;const user=tld==="user"?parsed.hostname.replace(`.${tld}`,""):void 0,agent=tld==="agent"?parsed.hostname.replace(`.${tld}`,""):void 0,smyth=tld==="smyth"?parsed.hostname.replace(`.${tld}`,""):void 0;let basePath="";if(!team){let candidate;user?(candidate=AccessCandidate.user(user),basePath=".user/"+user):agent&&(candidate=AccessCandidate.agent(agent),basePath=".agent/"+agent),candidate&&(team=await ConnectorService.getAccountConnector().getCandidateTeam(candidate))}let defaultCandidate;return team?defaultCandidate=AccessCandidate.team(team):user?defaultCandidate=AccessCandidate.user(user):agent&&(defaultCandidate=AccessCandidate.agent(agent)),{hash:parsed.hash,team,user,agent,smyth,defaultCandidate,path:basePath+parsed.pathname}}CaseSensitiveURL(urlString){const parts=urlString.split("://");if(parts.length!==2)return null;const afterProtocol=parts[1],hostnameEnd=Math.min(...[afterProtocol.indexOf("/"),afterProtocol.indexOf("?"),afterProtocol.indexOf("#"),afterProtocol.length].filter(i=>i>=0)),originalHostnamePart=afterProtocol.substring(0,hostnameEnd),[originalHostname,originalPort]=originalHostnamePart.split(":"),parsed=new URL(urlString);return{protocol:parsed.protocol,hostname:originalHostname,port:parsed.port,pathname:parsed.pathname,search:parsed.search,searchParams:parsed.searchParams,hash:parsed.hash,href:parsed.href,origin:parsed.origin,host:originalHostname+(parsed.port?`:${parsed.port}`:""),originalPort:originalPort||null}}async toBuffer(data){if(Buffer.isBuffer(data))return data;if(typeof data=="string")return Buffer.from(data,"utf-8");if(data instanceof Uint8Array)return Buffer.from(data);if(data instanceof Readable)return new Promise((resolve,reject)=>{const chunks=[];data.on("data",chunk=>{chunks.push(Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk))}),data.on("end",()=>{resolve(Buffer.concat(chunks))}),data.on("error",err=>{reject(err)})});throw new Error("Unsupported data type")}};__publicField$1E(_SmythFS,"instances",{});let SmythFS=_SmythFS;var __defProp$1D=Object.defineProperty,__defNormalProp$1D=(obj,key,value)=>key in obj?__defProp$1D(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1D=(obj,key,value)=>__defNormalProp$1D(obj,typeof key!="symbol"?key+"":key,value);class BinaryInput{constructor(data,_name,mimetype,candidate){this._name=_name,this.mimetype=mimetype,this.candidate=candidate,__publicField$1D(this,"size"),__publicField$1D(this,"url"),__publicField$1D(this,"_ready"),__publicField$1D(this,"_readyPromise"),__publicField$1D(this,"_source"),__publicField$1D(this,"_uploading",!1),_name||(_name=uid()),this._name=_name,this.load(data,_name,mimetype,candidate)}async ready(){return this._ready?!0:(this._readyPromise||(this._readyPromise=new Promise(resolve=>{const interval=setInterval(()=>{this._ready&&(clearInterval(interval),resolve(!0))},100)})),this._readyPromise)}async load(data,name,mimetype,candidate){const ext=name.split(".")?.length>1?name.split(".").pop():"";if(this.mimetype=mimetype||mime.getType(ext)||"",this.url="",typeof data=="object"&&data.url&&data.mimetype&&data.size){this.mimetype=data.mimetype,this.size=data.size,this.url=data.url;const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`),candidate?this._source=await SmythFS.Instance.read(this.url,candidate).finally(()=>{this._ready=!0}):this._ready=!0;return}if(typeof data=="string"&&data.startsWith("smythfs://")){if(this.url=data,candidate)try{this._source=await SmythFS.Instance.read(this.url,candidate),this.mimetype=await getMimeType(this._source),this.size=this._source.byteLength,this.mimetype||(this.mimetype=mime.getType(this.url)||mime.getType(this._name)||"");const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`)}finally{this._ready=!0}else{const ext2=this.url.split(".").pop();this.mimetype=mime.getType(ext2)||"",this._ready=!0}return}if(isUrl(data)){try{const response=await axios({method:"get",url:data,responseType:"arraybuffer"});this.size=response.data.byteLength,this._source=Buffer.from(response.data,"binary");let mimetype2=response.headers?.["content-type"]||"";const urlPath=new URL(data).pathname;let extension=urlPath.split(".")?.length>1?urlPath.split(".").pop():"";(!mimetype2||mimetype2.startsWith("binary/octet-stream"))&&(mimetype2=extension?mime.getType(extension):""),mimetype2||(mimetype2=(await fileTypeFromBuffer(this._source))?.mime||""),this.mimetype=mimetype2,extension=extension||mime.getExtension(this.mimetype),this._name.endsWith(`.${extension}`)||(this._name+=`.${extension}`)}catch(error){console.error("Error loading binary data from url:",data.url,error)}this._ready=!0;return}const base64FileInfo=await getBase64FileInfo(data);if(base64FileInfo){this.mimetype||(this.mimetype=base64FileInfo.mimetype),this.size=base64FileInfo.size,this._source=Buffer.from(base64FileInfo.data,"base64");const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`),this._ready=!0;return}if(typeof data=="string"){this._source=Buffer.from(data),this.size=data.length,this.mimetype="text/plain",this._name.endsWith(".txt")||(this._name+=".txt"),this._ready=!0;return}if(Buffer.isBuffer(data)){this._source=data,this.size=getSizeFromBinary(data),this.mimetype||(this.mimetype=await getMimeType(data));const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`),this._ready=!0;return}if(data instanceof Blob){this._source=Buffer.from(await data.arrayBuffer()),this.size=data.size,this.mimetype=data.type,this._ready=!0;return}}async getUrlInfo(url){try{const response=await axios.get(url),contentType=response.headers["content-type"],contentLength=response.headers["content-length"];return{contentType,contentLength}}catch{return{contentType:"",contentLength:0}}}static from(source,name,mimetype,candidate){return source instanceof BinaryInput?source:new BinaryInput(source,name,mimetype,candidate)}async upload(candidate,ttl){if(await this.ready(),!this._uploading)try{if(this._uploading=!0,this.url)this._uploading=!1;else{const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate);this.url=`smythfs://${teamId}.team/${candidate.id}/_temp/${this._name}`,await SmythFS.Instance.write(this.url,this._source,candidate,void 0,ttl),this._uploading=!1}}catch(error){console.error("Error uploading binary data:",error),this._uploading=!1}}async getJsonData(candidate,ttl){return await this.upload(candidate,ttl),{mimetype:this.mimetype,size:this.size,url:this.url,name:this._name}}async readData(candidate){if(await this.ready(),!this.url)throw new Error("Binary data not ready");return await SmythFS.Instance.read(this.url,candidate)}async getName(){return await this.ready(),this._name}async getBuffer(){return await this.ready(),this._source}async getReadStream(){return await this.ready(),Readable.from(this._source)}}var TLLMCredentials=(TLLMCredentials2=>(TLLMCredentials2.Vault="vault",TLLMCredentials2.Internal="internal",TLLMCredentials2.BedrockVault="bedrock_vault",TLLMCredentials2.VertexAIVault="vertexai_vault",TLLMCredentials2.None="none",TLLMCredentials2))(TLLMCredentials||{}),LLMInterface=(LLMInterface2=>(LLMInterface2.ChatCompletions="chat.completions",LLMInterface2.Responses="responses",LLMInterface2.GenerateContent="generateContent",LLMInterface2.GenerateImages="generateImages",LLMInterface2))(LLMInterface||{});const BuiltinLLMProviders={Echo:"Echo",OpenAI:"OpenAI",DeepSeek:"DeepSeek",GoogleAI:"GoogleAI",Anthropic:"Anthropic",Groq:"Groq",TogetherAI:"TogetherAI",Bedrock:"Bedrock",VertexAI:"VertexAI",xAI:"xAI",Perplexity:"Perplexity",Ollama:"Ollama"},TLLMProvider=BuiltinLLMProviders;var TLLMMessageRole=(TLLMMessageRole2=>(TLLMMessageRole2.User="user",TLLMMessageRole2.Assistant="assistant",TLLMMessageRole2.System="system",TLLMMessageRole2.Model="model",TLLMMessageRole2.Tool="tool",TLLMMessageRole2.Function="function",TLLMMessageRole2))(TLLMMessageRole||{}),APIKeySource=(APIKeySource2=>(APIKeySource2.Smyth="smyth-managed",APIKeySource2.User="user-managed",APIKeySource2.Custom="custom",APIKeySource2))(APIKeySource||{}),TLLMEvent=(TLLMEvent2=>(TLLMEvent2.Data="data",TLLMEvent2.Content="content",TLLMEvent2.Thinking="thinking",TLLMEvent2.End="end",TLLMEvent2.Error="error",TLLMEvent2.ToolInfo="toolInfo",TLLMEvent2.ToolCall="toolCall",TLLMEvent2.ToolResult="toolResult",TLLMEvent2.Usage="usage",TLLMEvent2.Interrupted="interrupted",TLLMEvent2.Fallback="fallback",TLLMEvent2.Requested="requested",TLLMEvent2))(TLLMEvent||{}),__defProp$1C=Object.defineProperty,__defNormalProp$1C=(obj,key,value)=>key in obj?__defProp$1C(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1C=(obj,key,value)=>__defNormalProp$1C(obj,typeof key!="symbol"?key+"":key,value);const logger$j=Logger("LLMInference");let LLMInference$1=class LLMInference{constructor(){__publicField$1C(this,"_model"),__publicField$1C(this,"_llmConnector"),__publicField$1C(this,"_modelProviderReq"),__publicField$1C(this,"_llmProviderName"),__publicField$1C(this,"teamId")}get model(){return this._model}get modelId(){return typeof this._model=="string"?this._model:this._model?.modelId}get llmConnector(){return this._llmConnector}get modelProviderReq(){return this._modelProviderReq}get llmProviderName(){return this._llmProviderName}static async getInstance(model,candidate){const modelsProvider=ConnectorService.getModelsProviderConnector();if(!modelsProvider.valid)throw new Error("Model provider Not available, cannot create LLM instance");const teamId=await ConnectorService.getAccountConnector().requester(candidate).getTeam(),llmInference=new LLMInference;return llmInference.teamId=teamId,llmInference._modelProviderReq=modelsProvider.requester(candidate),llmInference._llmProviderName=await llmInference._modelProviderReq.getProvider(model),llmInference._llmProviderName&&(llmInference._llmConnector=ConnectorService.getLLMConnector(llmInference._llmProviderName)),llmInference._llmConnector||logger$j.warn(`Model ${model} unavailable for team ${teamId}`),llmInference._model=model,llmInference}static user(candidate){}get connector(){return this._llmConnector}async prompt({query,contextWindow,files,params,onFallback=()=>{}},isInFallback=!1){let messages=contextWindow||[];if(query){const content=this._llmConnector.enhancePrompt(query,params);messages.push({role:TLLMMessageRole.User,content})}params.model=this._model,params.messages=messages,params.files=files,isInFallback&&typeof onFallback=="function"&&onFallback({model:this._model});try{let response=await this._llmConnector.requester(AccessCandidate.agent(params.agentId)).request(params);const result=this._llmConnector.postProcess(response?.content);if(result.error)throw response.finishReason!=="stop"?new Error("The model stopped before completing the response, this is usually due to output token limit reached."):new Error(result.error);return result}catch(error){if(!isInFallback)try{const fallbackParams=await this.getSafeFallbackParams(params),fallbackResult=await this.executeFallback("prompt",{query,contextWindow,files,params:fallbackParams,onFallback});if(fallbackResult!==null)return fallbackResult}catch(fallbackError){logger$j.warn("Fallback also failed:",fallbackError)}throw logger$j.error("Error in chatRequest: ",error),error}}async promptStream({query,contextWindow,files,params,onFallback=()=>{}},isInFallback=!1){let messages=contextWindow||[];if(query){const content=this._llmConnector.enhancePrompt(query,params);messages.push({role:TLLMMessageRole.User,content})}params.model=this._model,params.messages=messages,params.files=files,isInFallback&&typeof onFallback=="function"&&onFallback({model:this._model});try{return await this._llmConnector.user(AccessCandidate.agent(params.agentId)).streamRequest(params)}catch(error){if(!isInFallback)try{const fallbackParams=await this.getSafeFallbackParams(params),fallbackResult=await this.executeFallback("promptStream",{query,contextWindow,files,params:fallbackParams,onFallback});if(fallbackResult!==null)return fallbackResult}catch(fallbackError){logger$j.warn("Fallback also failed:",fallbackError)}logger$j.error("Error in streamRequest:",error);const dummyEmitter=new EventEmitter;return process.nextTick(()=>{dummyEmitter.emit("error",error),dummyEmitter.emit("end")}),dummyEmitter}}async getSafeFallbackParams(params){return{agentId:params.agentId,model:params.model,maxContextWindowLength:params.maxContextWindowLength,maxTokens:params.maxTokens,messages:params.messages,passthrough:params.passthrough,useContextWindow:params.useContextWindow}}async executeFallback(methodName,args){const isCustomModel=await this._modelProviderReq.isUserCustomLLM(this._model),fallbackModel=await this._modelProviderReq.getFallbackLLM(this._model);if(!isCustomModel||!fallbackModel)return null;logger$j.info(`Attempting fallback from ${this._model} to ${fallbackModel}`),this._model=fallbackModel;const llmProvider=await this._modelProviderReq.getProvider(fallbackModel);return llmProvider&&(this._llmConnector=ConnectorService.getLLMConnector(llmProvider)),methodName==="prompt"?await this.prompt(args,!0):await this.promptStream(args,!0)}async imageGenRequest({query,files,params}){return params.prompt=query,this._llmConnector.user(AccessCandidate.agent(params.agentId)).imageGenRequest(params)}async imageEditRequest({query,files,params}){return params.prompt=query,params.files=files,this._llmConnector.user(AccessCandidate.agent(params.agentId)).imageEditRequest(params)}async streamRequest(params,agent){const agentId=isAgent(agent)?agent.id:agent;try{if(!params.messages||!params.messages?.length)throw new Error("Input messages are required.");const model=params.model||this._model;return await this._llmConnector.user(AccessCandidate.agent(agentId)).streamRequest({...params,model})}catch(error){logger$j.error("Error in streamRequest:",error);const dummyEmitter=new EventEmitter;return process.nextTick(()=>{dummyEmitter.emit("error",error),dummyEmitter.emit("end")}),dummyEmitter}}async multimodalStreamRequest(params,fileSources,agent){const agentId=isAgent(agent)?agent.id:agent,promises=[],_fileSources=[];for(let file of fileSources){const binaryInput=BinaryInput.from(file);_fileSources.push(binaryInput),promises.push(binaryInput.upload(AccessCandidate.agent(agentId)))}await Promise.all(promises),params.fileSources=_fileSources;try{const prompt=(Array.isArray(params.messages)?params.messages.pop():{})?.content||"",model=params.model||this._model;return await this._llmConnector.user(AccessCandidate.agent(agentId)).multimodalStreamRequest(prompt,{...params,model})}catch(error){throw logger$j.error("Error in multimodalRequest: ",error),error}}async multimodalStreamRequestLegacy(prompt,files,config2={},agent){const agentId=isAgent(agent)?agent.id:agent,promises=[],_files=[];for(let file of files){const binaryInput=BinaryInput.from(file);_files.push(binaryInput),promises.push(binaryInput.upload(AccessCandidate.agent(agentId)))}await Promise.all(promises);const params=config2.data;params.files=_files;try{prompt=this._llmConnector.enhancePrompt(prompt,config2);const model=params.model||this._model;return await this._llmConnector.user(AccessCandidate.agent(agentId)).multimodalStreamRequest(prompt,{...params,model})}catch(error){throw logger$j.error("Error in multimodalRequest: ",error),error}}async getContextWindow(systemPrompt,_messages,maxTokens,maxOutputTokens=1024){const modelInfo=await this._modelProviderReq.getModelInfo(this._model,!0);let maxModelContext=modelInfo?.tokens,maxModelOutputTokens=modelInfo?.completionTokens||modelInfo?.tokens,maxInputContext=Math.min(maxTokens,maxModelContext),maxOutputContext=Math.min(maxOutputTokens,maxModelOutputTokens||0);maxInputContext+maxOutputContext>maxModelContext&&(maxInputContext-=maxInputContext+maxOutputContext-maxModelContext),maxInputContext<=0&&logger$j.warn("Max input context is 0, returning empty context window, This usually indicates a wrong model configuration"),logger$j.debug(`Context Window Configuration: Max Input Tokens: ${maxInputContext}, Max Output Tokens: ${maxOutputContext}, Max Model Tokens: ${maxModelContext}`);const systemMessage={role:"system",content:systemPrompt};let smythContextWindow=[],tokensCount=encodeChat([systemMessage],"gpt-4o").length;for(let i=_messages?.length-1;i>=0;i--){const curMessage=_messages[i];if(curMessage.role!=="system"){if(tokensCount=0,curMessage?.content&&(tokensCount+=countTokens(curMessage.content)),curMessage?.messageBlock?.content&&(tokensCount+=countTokens(curMessage.messageBlock.content)),curMessage.toolsData)for(let tool of curMessage.toolsData)tokensCount+=countTokens(tool.result);if(tokensCount>maxInputContext)break;smythContextWindow.unshift(curMessage)}}smythContextWindow.unshift(systemMessage);let modelContextWindow=[];for(let message of smythContextWindow)if(message.role&&message.content&&modelContextWindow.push({role:message.role,content:message.content}),message.messageBlock&&message.toolsData){const internal_message=this.connector.transformToolMessageBlocks({messageBlock:message?.messageBlock,toolsData:message?.toolsData});modelContextWindow.push(...internal_message)}return modelContextWindow=this.connector.getConsistentMessages(modelContextWindow),modelContextWindow}};function countTokens(content,model="gpt-4o"){try{const _stringifiedContent=typeof content=="string"?content:JSON.stringify(content);return encodeChat([{role:"user",content:_stringifiedContent}],model).length}catch(error){return logger$j.warn("Error in countTokens: ",error),0}}var __defProp$1B=Object.defineProperty,__defNormalProp$1B=(obj,key,value)=>key in obj?__defProp$1B(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1B=(obj,key,value)=>__defNormalProp$1B(obj,typeof key!="symbol"?key+"":key,value);class LLMContext{constructor(llmInference,_systemPrompt="",llmContextStore){this.llmInference=llmInference,__publicField$1B(this,"_systemPrompt",""),__publicField$1B(this,"_llmContextStore"),__publicField$1B(this,"_llmCache"),__publicField$1B(this,"contextLength"),__publicField$1B(this,"_messages",[]),this._llmCache=new LLMCache(AccessCandidate.team(this.llmInference.teamId)),this.systemPrompt=_systemPrompt,llmContextStore&&(this._llmContextStore=llmContextStore,this._llmContextStore.load().then(messages=>{this._messages=messages,this._llmCache.set("messages",this._messages)}))}get systemPrompt(){return this._systemPrompt}set systemPrompt(systemPrompt){this._systemPrompt=systemPrompt,this._llmCache?.set("systemPrompt",this.systemPrompt)}get llmCache(){return this._llmCache}get messages(){return this._messages}get model(){return this.llmInference.model}push(...message){this._messages.push(...message),this._llmContextStore&&this._llmContextStore.save(this._messages),this._llmCache.set("messages",this._messages)}addUserMessage(content,message_id,metadata){const lastMessage=this._messages[this._messages.length-1];lastMessage&&(lastMessage.__smyth_data__?.next||(lastMessage.__smyth_data__.next=[]),lastMessage.__smyth_data__.next.push(message_id));const prev=lastMessage?.__smyth_data__?.message_id,next=[];this.push({role:"user",content,__smyth_data__:{message_id,...metadata,prev,next}})}addAssistantMessage(content,message_id,metadata){const lastMessage=this._messages[this._messages.length-1];lastMessage&&(lastMessage.__smyth_data__?.next||(lastMessage.__smyth_data__.next=[]),lastMessage.__smyth_data__.next.push(message_id));const prev=lastMessage?.__smyth_data__?.message_id,next=[];this.push({role:"assistant",content,__smyth_data__:{message_id,...metadata,prev,next}})}addToolMessage(messageBlock,toolsData,message_id,metadata){const lastMessage=this._messages[this._messages.length-1];lastMessage&&(lastMessage.__smyth_data__?.next||(lastMessage.__smyth_data__.next=[]),lastMessage.__smyth_data__.next.push(message_id));const prev=lastMessage?.__smyth_data__?.message_id,next=[];this.push({messageBlock,toolsData,__smyth_data__:{message_id,...metadata,prev,next}})}async getContextWindow(maxTokens,maxOutputTokens=1024){const messages=JSON.parse(JSON.stringify(this._messages));return this.llmInference.getContextWindow(this.systemPrompt,messages,maxTokens,maxOutputTokens)}}const dereferenceSchema=async(schema,root=schema)=>{if(typeof schema!="object"||schema===null)return schema;if(schema.$ref){const ref=schema.$ref,path2=ref.replace(/^#\//,"").split("/");let resolved=root;for(const segment of path2){if(resolved[segment]===void 0)throw new Error(`Could not resolve $ref: ${ref}`);resolved=resolved[segment]}return dereferenceSchema(resolved,root)}if(Array.isArray(schema))return Promise.all(schema.map(item=>dereferenceSchema(item,root)));const result={};for(const key of Object.keys(schema))result[key]=await dereferenceSchema(schema[key],root);return result};class OpenAPIParser{static mapReqMethods(paths){const methods=new Map;for(const path2 in paths){const pathData=paths[path2];for(const method in pathData){const data=pathData[method];REQUEST_METHODS.includes(method.toUpperCase())&&methods.set(data?.operationId,method)}}return methods}static mapEndpoints(paths){const operationIds=new Map;for(const path2 in paths){const pathData=paths[path2];for(const method in pathData){const data=pathData[method];REQUEST_METHODS.includes(method.toUpperCase())&&operationIds.set(data?.operationId,path2)}}return operationIds}static async yamlToJson(yamlData){const data=yaml.load(yamlData);return await dereferenceSchema(data)}static async getJson(data){try{let parsedData=data;return typeof data=="string"&&(parsedData=JSON.parse(data)),await dereferenceSchema(parsedData)}catch{try{return await OpenAPIParser.yamlToJson(data)}catch{throw new Error("Invalid OpenAPI specification or JSON data format")}}}static async getJsonFromUrl(url){const data=(await axios.get(url)).data;return OpenAPIParser.getJson(data)}static isValidOpenAPI(data){return data?.openapi&&data?.paths&&data?.servers}}var __defProp$1A=Object.defineProperty,__getOwnPropDesc$y=Object.getOwnPropertyDescriptor,__defNormalProp$1A=(obj,key,value)=>key in obj?__defProp$1A(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$y=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$y(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$1A(target,key,result),result},__publicField$1A=(obj,key,value)=>__defNormalProp$1A(obj,typeof key!="symbol"?key+"":key,value);const console$o=Logger("ConversationHelper");class Conversation extends EventEmitter$1{constructor(_model,_specSource,_settings){super(),this._model=_model,this._specSource=_specSource,this._settings=_settings,__publicField$1A(this,"_agentId",""),__publicField$1A(this,"_systemPrompt"),__publicField$1A(this,"userDefinedSystemPrompt",""),__publicField$1A(this,"toolChoice","auto"),__publicField$1A(this,"assistantName"),__publicField$1A(this,"_reqMethods"),__publicField$1A(this,"_toolsConfig"),__publicField$1A(this,"_toolStatusMap",{}),__publicField$1A(this,"_endpoints"),__publicField$1A(this,"_baseUrl"),__publicField$1A(this,"_status",""),__publicField$1A(this,"_currentWaitPromise"),__publicField$1A(this,"_llmContextStore"),__publicField$1A(this,"_context"),__publicField$1A(this,"_maxContextSize",1024*128),__publicField$1A(this,"_maxOutputTokens",1024*8),__publicField$1A(this,"_teamId"),__publicField$1A(this,"_agentVersion"),__publicField$1A(this,"agentData"),__publicField$1A(this,"_id",""),__publicField$1A(this,"_lastError"),__publicField$1A(this,"_spec"),__publicField$1A(this,"_customToolsDeclarations",[]),__publicField$1A(this,"_customToolsHandlers",{}),__publicField$1A(this,"stop",!1),__publicField$1A(this,"_llmInference"),this._id="conv_"+randomUUID(),this.on("error",error=>{this._lastError=error,console$o.warn("Conversation Error: ",error?.message)}),this._maxContextSize=_settings?.maxContextSize||this._model.tokens||this._model.keyOptions?.tokens||this._maxContextSize,this._maxOutputTokens=_settings?.maxOutputTokens||this._model.completionTokens||this._model.keyOptions?.completionTokens||this._maxOutputTokens,_settings?.systemPrompt&&(this.userDefinedSystemPrompt=_settings.systemPrompt),_settings?.toolChoice&&(this.toolChoice=_settings.toolChoice),_settings?.store&&(this._llmContextStore=_settings.store),this._baseUrl=_settings?.baseUrl,this._agentVersion=_settings?.agentVersion,(async()=>_specSource?this.loadSpecFromSource(_specSource).then(async spec=>{if(!spec)throw this._status="error",this.emit("error","Unable to parse OpenAPI specifications"),new Error("Invalid OpenAPI specification data format");this._spec=spec,!this._agentId&&_settings?.agentId&&(this._agentId=_settings.agentId),this._agentId||(this._agentId="FAKE-AGENT-ID"),await this.assignTeamIdFromAgentId(this._agentId),await this.updateModel(this._model),this._status="ready"}).catch(error=>{this._status="error",this.emit("error",error)}):(await this.updateModel(this._model),this._status="ready"))()}get agentId(){return this._agentId}get systemPrompt(){return this._systemPrompt}set systemPrompt(systemPrompt){this._systemPrompt=systemPrompt,this._context&&(this._context.systemPrompt=systemPrompt)}get id(){return this._id}get context(){return this._context}set spec(specSource){this.ready.then(()=>{this._status="",this._currentWaitPromise=void 0,this.loadSpecFromSource(specSource).then(async spec=>{if(!spec)throw this._status="error",this.emit("error","Invalid OpenAPI specification data format"),new Error("Invalid OpenAPI specification data format");this._spec=spec,await this.assignTeamIdFromAgentId(this._agentId),await this.updateModel(this._model),this._status="ready"})})}set model(model){this.ready.then(async()=>{this._status="",await this.updateModel(model),this._status="ready"})}get model(){return this._model}get llmInference(){return this._llmInference}get ready(){return this._currentWaitPromise?this._currentWaitPromise:(this._currentWaitPromise=new Promise((resolve,reject)=>{if(this._status)return resolve(this._status);const maxWaitTime=3e4;let waitTime=0;const interval=100,wait=setInterval(()=>{if(this._status)return clearInterval(wait),resolve(this._status);if(waitTime+=interval,waitTime>=maxWaitTime)return clearInterval(wait),reject("Timeout: Failed to prepare data")},interval)}),this._currentWaitPromise)}async prompt(message,toolHeaders={},concurrentToolCalls=4,abortSignal){let error=null;const errListener=err=>error=err;this.once("error",errListener);const result=await this.streamPrompt(message,toolHeaders,concurrentToolCalls,abortSignal);if(error)throw error;return this.removeListener("error",errListener),result}async streamPrompt(message,toolHeaders={},concurrentToolCalls=4,abortSignal){let options=typeof message=="object"?message:{message};message=options?.message;const files=options?.files;if(message&&(this.stop=!1),this.stop){this.emit("interrupted","interrupted"),this.emit("end");return}await this.ready,abortSignal&&abortSignal.addEventListener("abort",()=>{this.emit("aborted","Aborted by user!")});const passThroughtContinueMessage="Continue with the next tool call if there are any, or just inform the user that you are done";let _content="";const reqMethods=this._reqMethods,toolsConfig=this._toolsConfig,endpoints=this._endpoints,baseUrl=this._baseUrl,message_id="msg_"+randomUUID();toolHeaders["X-DEBUG"],message&&this._context.addUserMessage(message,message_id);const contextWindow=await this._context.getContextWindow(this._maxContextSize,this._maxOutputTokens);let maxTokens=this._maxOutputTokens;typeof this.model=="object"&&this.model?.params?.maxTokens&&(maxTokens=this.model.params.maxTokens);const llmReqUid=randomUUID();this.emit(TLLMEvent.Requested,{model:typeof this.model=="string"?this.model:this.model?.modelId,contextWindow,files,maxTokens,agentId:this._agentId,requestId:llmReqUid});const eventEmitter=await this.llmInference.promptStream({contextWindow,files,params:{model:this.model,toolsConfig:this._settings?.toolsStrategy?this._settings.toolsStrategy(toolsConfig):toolsConfig,maxTokens,cache:this._settings?.experimentalCache,agentId:this._agentId,abortSignal}}).catch(error=>{console$o.error("Error on promptStream: ",error),this.emit(TLLMEvent.Error,error,{requestId:llmReqUid})});if(abortSignal&&abortSignal.addEventListener("abort",()=>{eventEmitter.removeAllListeners()}),!eventEmitter||eventEmitter.error)throw new Error("[LLM Request Error]");message&&this.emit("start",{requestId:llmReqUid}),eventEmitter.on(TLLMEvent.Thinking,thinking=>{this.stop||this.emit(TLLMEvent.Thinking,thinking,{requestId:llmReqUid})}),eventEmitter.on(TLLMEvent.Data,data=>{this.stop||this.emit(TLLMEvent.Data,data,{contextWindow,requestId:llmReqUid,model:typeof this.model=="string"?this.model:this.model?.modelId})}),eventEmitter.on(TLLMEvent.Content,content=>{this.stop||(_content+=content,this.emit(TLLMEvent.Content,content,{requestId:llmReqUid}))});let finishReason="stop";const toolsContent=await new Promise((resolve,reject)=>{let hasTools=!1,hasError=!1,passThroughContent="";eventEmitter.on(TLLMEvent.Error,error=>{hasError=!0,reject(error)}),eventEmitter.on(TLLMEvent.ToolInfo,async(toolsData,thinkingBlocks=[])=>{if(this.stop)return;hasTools=!0;let llmMessage={role:"assistant",content:_content,tool_calls:[]};thinkingBlocks?.length>0&&(this.emit("thoughtProcess",thinkingBlocks.filter(block=>block.type==="thinking").map(block=>block.thinking||"").join(`
|
|
24
|
+
`;for(const[id,connection]of this.connections.entries())try{connection&&!connection.finished?connection.write(message):this.connections.delete(id)}catch(error){console.error(`Error sending SSE to connection ${id}:`,error),this.connections.delete(id)}}remove(connectionId){const connection=this.connections.get(connectionId);if(connection){try{connection&&!connection.finished&&connection.end()}catch(error){console.error(`Error closing connection ${connectionId}:`,error)}return this.connections.delete(connectionId)}return!1}async close(){for(const[id,connection]of this.connections.entries())try{connection&&!connection.finished&&(connection.end(),console.log("Delibertly shutting down sse connection with id: ",id))}catch(error){console.error(`Error closing connection ${id}:`,error)}this.connections.clear()}getConnectionCount(){return this.connections.size}}var __defProp$1M=Object.defineProperty,__getOwnPropDesc$z=Object.getOwnPropertyDescriptor,__defNormalProp$1M=(obj,key,value)=>key in obj?__defProp$1M(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$z=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$z(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$1M(target,key,result),result},__publicField$1M=(obj,key,value)=>__defNormalProp$1M(obj,typeof key!="symbol"?key+"":key,value);const logger$k=Logger("Agent"),idPromise=id=>id,MAX_LATENCY=50;class Agent{constructor(id,agentData,agentSettings,agentRequest){this.id=id,this.agentSettings=agentSettings,__publicField$1M(this,"name"),__publicField$1M(this,"data"),__publicField$1M(this,"teamId"),__publicField$1M(this,"conversationId"),__publicField$1M(this,"components"),__publicField$1M(this,"connections"),__publicField$1M(this,"endpoints",{}),__publicField$1M(this,"triggers",{}),__publicField$1M(this,"sessionId"),__publicField$1M(this,"sessionTag",""),__publicField$1M(this,"callerSessionId"),__publicField$1M(this,"apiBasePath","/api"),__publicField$1M(this,"triggerBasePath","/trigger"),__publicField$1M(this,"agentRuntime"),__publicField$1M(this,"usingTestDomain",!1),__publicField$1M(this,"domain",""),__publicField$1M(this,"debugSessionEnabled",!1),__publicField$1M(this,"circularLimit",100),__publicField$1M(this,"version",""),__publicField$1M(this,"agentVariables",{}),__publicField$1M(this,"_killReason",""),__publicField$1M(this,"async",!1),__publicField$1M(this,"jobID",""),__publicField$1M(this,"planInfo",{}),__publicField$1M(this,"callback"),__publicField$1M(this,"agentRequest"),__publicField$1M(this,"sse"),__publicField$1M(this,"modelsProvider"),__publicField$1M(this,"_componentInstance",{}),__publicField$1M(this,"_componentInstancesLoader",new ControlledPromise(()=>{}));const json=typeof agentData=="string"?JSON.parse(agentData):agentData;this.data=json.connections&&json.components?json:json.data,this.data||(this.data={name:"",connections:[],components:[]}),this.name=this.data.name,this.version=this.data.agentVersion||"",this.teamId=this.data.teamId,this.connections=this.data.connections,this.debugSessionEnabled=this.data.debugSessionEnabled,this.usingTestDomain=this.data.usingTestDomain,this.agentVariables=this.data.variables||{};const endpoints=this.data.components.filter(c=>c.name=="APIEndpoint");for(let endpoint of endpoints){let method=endpoint.data.method||"POST";method=method.toUpperCase(),this.endpoints[`${this.apiBasePath}/${endpoint.data.endpoint}`]||(this.endpoints[`${this.apiBasePath}/${endpoint.data.endpoint}`]={}),this.endpoints[`${this.apiBasePath}/${endpoint.data.endpoint}`][method]=endpoint}const triggers=this.data.components.filter(c=>typeof c.data?.triggerEndpoint=="string");for(let trigger of triggers)this.triggers[`${this.triggerBasePath}/${trigger.data.triggerEndpoint}`]=trigger;this.components={};for(let component of this.data.components)this.components[component.id]=component;for(let connection of this.data.connections){const sourceComponent=this.components[connection.sourceId],targetComponent=this.components[connection.targetId],sourceIndex=typeof connection.sourceIndex=="number"?connection.sourceIndex:sourceComponent.outputs.findIndex(o=>o.name==connection.sourceIndex),targetIndex=typeof connection.targetIndex=="number"?connection.targetIndex:targetComponent.inputs.findIndex(i=>i.name==connection.targetIndex);connection.sourceIndex=sourceIndex,connection.targetIndex=targetIndex;const output=sourceComponent.outputs[sourceIndex];if(output.index=sourceIndex,output.next||(output.next=[]),output.next.push(targetComponent.id),targetIndex>=0){const input=targetComponent.inputs[targetIndex];input&&(input.index=targetIndex,input.prev||(input.prev=[]),input.prev.push(sourceComponent.id))}else for(let input of targetComponent.inputs)input.prev||(input.prev=[]),input.prev.push(sourceComponent.id)}this.tagAsyncComponents(),agentRequest&&this.setRequest(agentRequest),this.sse=new AgentSSE(this);try{ConnectorService.getComponentConnector().requester(AccessCandidate.agent(id)).getAll().then(customComponents=>{this._componentInstance={...this._componentInstance,...customComponents},this._componentInstancesLoader.resolve(!0)})}catch{logger$k.warn("Could not load custom components",AccessCandidate.agent(this.id)),this._componentInstancesLoader.reject("Could not load custom components")}const modelsProvider=ConnectorService.getModelsProviderConnector();modelsProvider.valid&&(this.modelsProvider=modelsProvider.agent(id))}get ComponentInstances(){return this._componentInstance}addSSE(sseSource,monitorId){if(sseSource instanceof AgentSSE)for(const[monitorId2,res]of sseSource)this.sse.add(res,monitorId2);else{const id=monitorId||Math.random().toString(36).substring(2,15);this.sse.add(sseSource,id)}}setRequest(agentRequest){if(this.agentRequest)return;this.agentRequest=agentRequest,this.agentRequest=agentRequest;const dateTime=getCurrentFormattedDate();this.sessionId="rt-"+(this.agentRequest.sessionID||dateTime+"."+uid());const sessionTags=this?.agentRequest?.headers["x-session-tag"];sessionTags&&(this.sessionTag+=this.sessionTag?`,${sessionTags}`:sessionTags);var regex=new RegExp(`^/v[0-9]+(.[0-9]+)?(${this.apiBasePath}|${this.triggerBasePath})/(.*)`);this.agentRequest?.path?.startsWith(`${this.apiBasePath}/`)||this.agentRequest?.path?.startsWith(`${this.triggerBasePath}/`)||this.agentRequest?.path?.match(regex)?(this.agentRuntime=new AgentRuntime(this),this.callerSessionId=this?.agentRequest?.headers["x-caller-session-id"]?.substring(0,256)||this.agentRuntime.workflowReqId||this.sessionId):this.agentRuntime=AgentRuntime.dummy}setCallback(callback){this.callback=callback}kill(reason="kill"){this._killReason=reason}isKilled(){return!!this._killReason}async parseVariables(){if(typeof this.agentVariables=="object")for(let key in this.agentVariables){const value=this.agentVariables[key];value.startsWith("{{")&&value.endsWith("}}")&&(this.agentVariables[key]=await TemplateString(value).parseTeamKeysAsync(this.teamId).asyncResult)}}async process(endpointPath,input){await this.agentRuntime.ready();let result,dbgSession=null,sessionClosed=!1;const eventId="e-"+uid(),startTime=Date.now();this.sse.send("agent",{eventId,action:"callStart",endpointPath,id:this.id,name:this.name,startTime,input});const logId=AgentLogger.log(this,null,{sourceId:endpointPath,componentId:"AGENT",domain:this.domain,input,workflowID:this.agentRuntime.workflowReqId,processID:this.agentRuntime.processID,inputTimestamp:new Date().toISOString(),sessionID:this.callerSessionId,tags:this.sessionTag}),method=this.agentRequest.method.toUpperCase(),endpoint=this.endpoints[endpointPath]?.[method]||this.triggers[endpointPath];if(this.agentRuntime.debug){if(!endpoint&&this.agentRequest.path!="/api/")throw logId&&AgentLogger.log(this,logId,{error:`Endpoint ${method} ${endpointPath} Not Found`}),new Error(`Endpoint ${method} ${endpointPath} Not Found`);let dbgResult;if(dbgResult||(dbgResult=await this.agentRuntime.runCycle()),dbgResult&&typeof dbgResult?.state<"u")return this.agentRuntime.sync(),dbgResult?.finalResult&&(dbgResult.finalResult=await this.postProcess(dbgResult.finalResult).catch(error=>({error}))),dbgResult}if(!endpoint){logId&&AgentLogger.log(this,logId,{error:`Endpoint ${method} ${endpointPath} Not Found`});const endTime2=Date.now(),duration2=endTime2-startTime;throw this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime:endTime2,duration:duration2,input,error:`Endpoint ${method} ${endpointPath} Not Found`}),new Error(`Endpoint ${method} ${endpointPath} Not Found`)}this.agentRuntime.updateComponent(endpoint.id,{active:!0,input,sourceId:null});let step;do{step=await this.agentRuntime.runCycle();const qosLatency=Math.floor(OSResourceMonitor.cpu.load/100*MAX_LATENCY||0);await delay(qosLatency),await new Promise(resolve=>setImmediate(resolve))}while(!step?.finalResult&&!this._killReason);if(this._killReason){const endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime:endTime2,duration:duration2,input,error:"Agent killed"}),logger$k.warn(`Agent ${this.id} was killed`,AccessCandidate.agent(this.id)),{error:"AGENT_KILLED",reason:this._killReason}}if(result=await this.postProcess(step?.finalResult).catch(error=>({error})),this.agentRuntime.circularLimitReached){const circularLimitData=this.agentRuntime.circularLimitReached;result={error:`Circular Calls Limit Reached on ${circularLimitData}. Current circular limit is ${this.circularLimit}`};const endTime2=Date.now(),duration2=endTime2-startTime;throw this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime:endTime2,duration:duration2,input,error:result.error}),new Error(`Circular Calls Limit Reached on ${circularLimitData}. Current circular limit is ${this.circularLimit}`)}logId&&AgentLogger.log(this,logId,{outputTimestamp:""+Date.now(),result}),this.updateTasksCount();const endTime=Date.now(),duration=endTime-startTime;return this.sse.send("agent",{eventId,action:"callStop",endpointPath,id:this.id,name:this.name,startTime,endTime,duration,input,result}),this.agentRuntime.debug?{state:result,dbgSession,sessionClosed}:result}async updateTasksCount(){}async postProcess(_result){let result=JSON.parse(JSON.stringify(_result));Array.isArray(result)&&(result=result.flat(1/0)),Array.isArray(result)||(result=[result]),result=result.filter(r=>!(r?.result?._error&&r?.result?._error_handled));for(let i=0;i<result.length;i++){const _result2=result[i];if(!_result2)continue;_result2._debug&&delete _result2._debug,_result2._debug_time&&delete _result2._debug_time,_result2.result?._debug&&delete _result2.result._debug,_result2.result?._debug_time&&delete _result2.result._debug_time;const _componentData=this.components[_result2.id];if(!_componentData)continue;const _component=this._componentInstance[_componentData.name];if(!_component)continue;const postProcessResult=await _component.postProcess(_result2,_componentData,this).catch(error=>({error}));result[i]=postProcessResult}return result.length==1&&(result=result[0]),result}hasLoopAncestor(inputEntry){if(!inputEntry.prev)return!1;for(let prevId of inputEntry.prev){const prevComponentData=this.components[prevId];if(this.agentRuntime.getRuntimeData(prevId)?._LoopData)return!0;for(let inputEntry2 of prevComponentData.inputs)if(this.hasLoopAncestor(inputEntry2))return!0}return!1}clearChildLoopRuntimeComponentData(componentId){const componentData=this.components[componentId],runtimeData=this.agentRuntime.getRuntimeData(componentId);if(runtimeData._ChildLoopData)for(let inputEntry of componentData.inputs)this.hasLoopAncestor(inputEntry)&&delete runtimeData.input[inputEntry.name]}getComponentMissingInputs(componentId,_input){let missingInputs=[];const componentData=this.components[componentId];if(this._componentInstance[componentData.name].alwaysActive)return missingInputs;const readablePredecessors=this.findReadablePredecessors(componentId),readableInputNames={};for(let pred of readablePredecessors)pred&&(readableInputNames[pred.input.name]=pred);const allInputIndexes=this.connections.filter(c=>c.targetId==componentId).map(e=>e.targetIndex),allInputs=componentData.inputs.filter(r=>allInputIndexes.includes(r.index));if(Array.isArray(allInputs)&&allInputs.length>0){for(let input of allInputs)if(!input.optional){if(readableInputNames[input.name]){const pred=readableInputNames[input.name],component2=pred.component,predComponentData=this.components[pred.id];if(component2.hasOutput(pred.output.name,predComponentData,this))continue}typeof _input[input.name]>"u"&&missingInputs.push(input.name)}}return missingInputs}findReadablePredecessors(componentId){const componentData=this.components[componentId];return this._componentInstance[componentData.name],this.connections.filter(c=>c.targetId==componentId).map(c=>{const sourceComponentData=this.components[c.sourceId],sourceComponent=this._componentInstance[sourceComponentData.name],output=sourceComponentData.outputs[c.sourceIndex],input=componentData.inputs[c.targetIndex];return sourceComponent.hasReadOutput?{output,input,component:sourceComponent,id:c.sourceId}:null}).filter(e=>e!=null)}updateStep(sourceId,componentId){const agentRuntime=this.agentRuntime,step=agentRuntime.curStep;agentRuntime.updateComponent(componentId,{step})}async callComponent(sourceId,componentId,input){const startTime=Date.now(),agentRuntime=this.agentRuntime,componentData=this.components[componentId],component=this._componentInstance[componentData.name],eventId="e-"+uid();if(this.sse.send("component",{eventId,action:"callStart",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,input}),this._killReason){logger$k.warn(`Agent ${this.id} was killed, skipping component ${componentData.name}`,AccessCandidate.agent(this.id));const output2={id:componentData.id,name:componentData.displayName,result:null,error:"Agent killed"},endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:output2}),output2}if(!component){const endTime2=Date.now(),duration2=endTime2-startTime;throw this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:{error:"Component not found"}}),new Error(`Component ${componentData.name} not found`)}if(this.agentRuntime.incTag(componentId),this.agentRuntime.checkCircularLimit(),this.agentRuntime.circularLimitReached){const endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:{error:"Circular Calls Reached"}}),{error:"Circular Calls Reached"}}agentRuntime.getComponentData(componentId)?.output?._missing_inputs&&agentRuntime.updateComponent(componentId,{output:{}});const _input=this.prepareComponentInput(componentId,input),logId=AgentLogger.log(this,null,{sourceId:sourceId||"AGENT",componentId,domain:this.domain,workflowID:this.agentRuntime.workflowReqId,processID:this.agentRuntime.processID,input:componentData.name=="APIEndpoint"?this.agentRequest.method=="GET"?this.agentRequest.query:this.agentRequest.body:_input,inputTimestamp:new Date().toISOString(),sessionID:this.callerSessionId,tags:this.sessionTag});let output=null,missingInputs=[];if(this.updateStep(sourceId,componentId),agentRuntime.debug&&(output=await agentRuntime.injectDebugOutput(componentId)),!output){if(missingInputs=this.getComponentMissingInputs(componentId,_input),missingInputs.length>0){agentRuntime.updateComponent(componentId,{active:!0,status:"waiting"});const connections=this.connections.filter(c=>c.sourceId==componentId)||[];for(let connection of connections)if(componentData.outputs[connection.sourceIndex].name=="_error")break;output={_error:"Missing inputs : "+JSON.stringify(missingInputs),_missing_inputs:missingInputs}}if(!output){const validationResult=await component.validateConfig(componentData);if(validationResult._error)output=validationResult;else try{await this.parseVariables(),output=await component.process({...this.agentVariables,..._input},{...componentData,eventId},this),logger$k.debug(output,AccessCandidate.agent(this.id))}catch(error){logger$k.error("Error on component process: ",{componentId,name:componentData.name,input:_input},error,AccessCandidate.agent(this.id)),error?.message?output={Response:void 0,_error:error.message,_debug:error.message}:output={Response:void 0,_error:error.toString(),_debug:error.toString()}}}}const runtimeData=this.agentRuntime.getRuntimeData(componentId);if(agentRuntime.updateComponent(componentId,{output}),output._in_progress&&agentRuntime.updateComponent(componentId,{active:!0,status:"in_progress"}),(output.error||output._error)&&(runtimeData?._ChildLoopData?._in_progress||this.agentRuntime.resetComponent(componentId),logId&&AgentLogger.log(this,logId,{error:output.error||output._error}),output.error)){const endTime2=Date.now(),duration2=endTime2-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime:endTime2,duration:duration2,output:{error:output.error||output._error}}),[{id:componentData.id,name:componentData.displayName,result:null,error:output.error||output._error,_debug:output.error||output._error}]}let results=[];if(output&&!output._missing_inputs){if(AgentLogger.logTask(this,1),results=await this.callNextComponents(componentId,output).catch(error=>({error,id:componentData.id,name:componentData.displayName})),runtimeData._LoopData&&output._in_progress&&runtimeData._LoopData.branches==null){const branches=Array.isArray(results)?results.length:1;output._in_progress&&(runtimeData._LoopData.branches=branches,agentRuntime.updateRuntimeData(componentId,{_LoopData:runtimeData._LoopData}))}if(results._is_leaf){delete results._is_leaf;const _ChildLoopData=runtimeData._ChildLoopData;if(_ChildLoopData&&_ChildLoopData.parentId){const parentId=_ChildLoopData.parentId,_LoopData=this.agentRuntime.getRuntimeData(parentId)._LoopData;if(_LoopData){_LoopData.result||(_LoopData.result=[]);let resultsCopy=JSON.parse(JSON.stringify(results));results.result&&(results.result._exclude=!0),resultsCopy=await component.postProcess(resultsCopy,componentData,this),_LoopData.result.push(resultsCopy),_LoopData.branches--,_LoopData.branches<=0&&agentRuntime.updateComponent(parentId,{active:!0,status:""}),agentRuntime.updateRuntimeData(parentId,{_LoopData})}}else{const _LoopData=this.agentRuntime.getRuntimeData(componentId)._LoopData;_LoopData&&_LoopData.loopIndex==1&&(_LoopData._in_progress=!1,output._in_progress=!1,agentRuntime.updateComponent(componentId,{active:!0,status:""}),agentRuntime.updateRuntimeData(componentId,{_LoopData}))}}}!output._missing_inputs&&!output._in_progress&&(runtimeData?._ChildLoopData?._in_progress&&runtimeData._ChildLoopData?.loopIndex<runtimeData._ChildLoopData?.loopLength?(this.clearChildLoopRuntimeComponentData(componentId),agentRuntime.updateComponent(componentId,{active:!0,status:"waiting"})):this.agentRuntime.resetComponent(componentId)),Array.isArray(results)&&(results=results.flat(1/0).filter(r=>r.result!=null)),logId&&AgentLogger.log(this,logId,{output,outputTimestamp:""+Date.now()});const endTime=Date.now(),duration=endTime-startTime;return this.sse.send("component",{eventId,action:"callStop",sourceId,id:componentId,name:componentData.displayName,title:componentData.title,startTime,endTime,duration,output}),[results,{id:componentData.id,name:componentData.displayName,result:output}]}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}async callNextComponents(componentId,output){const agentRuntime=this.agentRuntime,componentData=this.components[componentId];this._componentInstance[componentData.name];let connections=this.connections.filter(c=>c.sourceId==componentId).map(c=>({...c,output,componentData}));const waitingComponents=agentRuntime.getWaitingComponents(),waitingComponentIds=waitingComponents.map(e=>e.id),alwaysActiveIds=Object.keys(this.agentRuntime.alwaysActiveComponents),alwaysActiveConnections=this.connections.filter(c=>alwaysActiveIds.includes(c.sourceId)&&waitingComponentIds.includes(c.targetId)).map(c=>{const output2={};waitingComponents.find(e=>e.id==c.targetId);const prevComponentData=this.components[c.sourceId],prevComponent=this._componentInstance[prevComponentData.name],outputEndpoint=prevComponentData.outputs[c.sourceIndex];return output2[outputEndpoint.name]=prevComponent.readOutput(outputEndpoint.name,prevComponentData,this),{...c,output:output2,componentData:this.components[c.sourceId]}});if(connections=[...connections,...alwaysActiveConnections],!Array.isArray(connections)||connections.length==0)return{id:componentData.id,name:componentData.name,result:output,_is_leaf:!0};const targetComponents=connections.reduce((acc,obj)=>{let key=obj.targetId;return acc[key]||(acc[key]=[]),acc[key].push(obj),acc},{}),promises=[];for(let targetId in targetComponents){const targetComponentData=this.components[targetId];if(!this.async&&targetComponentData.async&&targetComponentData.name!=="Async")continue;this._componentInstance[targetComponentData.name];const connections2=targetComponents[targetId];let _isErrorHandler=!1;if(Array.isArray(connections2)&&connections2.length>0){const nextInput={};for(let connection of connections2){const output2=connection.output,componentData2=connection.componentData,outputEndpoint=componentData2.outputs[connection.sourceIndex],inputEndpoint=targetComponentData.inputs[connection.targetIndex],outputExpression=outputEndpoint.expression||outputEndpoint.name,outputParts=outputExpression.split("."),defaultOutputs=componentData2.outputs.find(c=>c.default);let value;if(outputEndpoint.name=="_error"&&(_isErrorHandler=!0),outputEndpoint.default?value=output2[outputEndpoint.name]:defaultOutputs&&(value=output2[defaultOutputs.name]?.[outputEndpoint.name]),value===void 0&&outputParts.length>=1){let val=this.JSONExpression(output2,outputExpression);val!==void 0&&(value=val)}if(value!==void 0){let combinedInput=_mergeInputs(nextInput[inputEndpoint.name],value).filter(e=>e!==void 0);nextInput[inputEndpoint.name]=combinedInput.length===1?combinedInput[0]:combinedInput}}if(!nextInput||JSON.stringify(nextInput)=="{}")continue;const input=this.prepareComponentInput(targetId,nextInput),targetComponent2=this.components[targetId];_isErrorHandler&&targetComponent2&&(output._error_handled=!0);const status=this.getComponentMissingInputs(targetId,input).length>0?"waiting":void 0,sourceRuntimeData=this.agentRuntime.getRuntimeData(componentId);let _ChildLoopData=sourceRuntimeData._LoopData;(!_ChildLoopData||!_ChildLoopData._in_progress)&&(_ChildLoopData=sourceRuntimeData._ChildLoopData),agentRuntime.updateComponent(targetId,{active:!0,input:nextInput,sourceId:componentId,status}),agentRuntime.updateRuntimeData(targetId,{_ChildLoopData,_LoopData:null}),promises.push(idPromise({id:targetId,name:targetComponent2.name,inputs:nextInput})),status&&AgentLogger.log(this,null,{sourceId:componentId,componentId:targetId,step:this.agentRuntime.curStep+1,domain:this.domain,workflowID:this.agentRuntime.workflowReqId,processID:this.agentRuntime.processID,input:{__action:"status_update",__status:status,data:nextInput},inputTimestamp:new Date().toISOString(),sessionID:this.callerSessionId,tags:this.sessionTag})}}if(promises.length==0)return{id:componentData.id,name:componentData.name,result:output,_is_leaf:!0};const results=await Promise.all(promises);return results.length==1?results[0]:results}prepareComponentInput(targetId,inputs){const rData=this.agentRuntime.getRuntimeData(targetId),componentData=this.components[targetId],rDataInput=rData?.input||{};let _input={...rDataInput};if(inputs)for(let key in inputs){let value=inputs[key];_input[key]=_mergeInputs(rDataInput[key],value).filter(e=>e!==void 0),_input[key].length==1&&(_input[key]=_input[key][0])}const readablePredecessors=this.findReadablePredecessors(targetId);for(let c of readablePredecessors)if(c){const predComponentData=this.components[c.id],value=c.component.readOutput(c.output.name,predComponentData,this);value&&c.input?.name&&(_input||(_input={}),_input[c.input.name]=value)}this.agentRuntime.updateRuntimeData(targetId,{input:_input});for(let input of componentData.inputs)input.defaultVal&&_input[input.name]===void 0&&(_input[input.name]=TemplateString(input.defaultVal).parse(this.agentVariables).result);return _input}getConnectionSource(connection){return this.components[connection.sourceId].inputs.find(e=>e.index===connection.sourceIndex)}getConnectionTarget(connection){return this.components[connection.targetId].inputs.find(e=>e.index===connection.targetIndex)}recursiveTagAsyncComponents(component){const agent=this;for(let output of component.outputs){if(component.name=="Async"&&output.name==="JobID")continue;const connected=agent.connections.filter(c=>c.sourceId===component.id&&c.sourceIndex===output.index);if(connected)for(let con of connected){const targetComponent=agent.components[con.targetId];targetComponent&&(targetComponent.async=!0,this.recursiveTagAsyncComponents(targetComponent))}}}tagAsyncComponents(){const AsyncComponents=Object.values(this.components).filter(c=>c.name==="Async");if(!(!AsyncComponents||AsyncComponents.length==0))for(let AsyncComponent of AsyncComponents)AsyncComponent.async=!0,this.recursiveTagAsyncComponents(AsyncComponent)}}__decorateClass$z([hookAsync("SREAgent.process")],Agent.prototype,"process"),__decorateClass$z([hookAsync("SREAgent.postProcess")],Agent.prototype,"postProcess"),__decorateClass$z([hookAsync("SREAgent.callComponent")],Agent.prototype,"callComponent"),__decorateClass$z([hookAsync("SREAgent.callNextComponents")],Agent.prototype,"callNextComponents");function _mergeInputs(existing,newValue){return existing===void 0?[newValue]:(Array.isArray(existing)||(existing=[existing]),[...existing,newValue])}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 AgentRequest{constructor(req){if(__publicField$1L(this,"headers"),__publicField$1L(this,"body"),__publicField$1L(this,"query"),__publicField$1L(this,"params"),__publicField$1L(this,"method","GET"),__publicField$1L(this,"path",""),__publicField$1L(this,"sessionID",""),__publicField$1L(this,"res",null),__publicField$1L(this,"req",null),__publicField$1L(this,"files",[]),__publicField$1L(this,"_agent_authinfo"),!req)return;this.headers=JSON.parse(JSON.stringify(req.headers||{})),this.body=JSON.parse(JSON.stringify(req.body||req.data||{})),this.query=JSON.parse(JSON.stringify(req.query||{})),this.params=JSON.parse(JSON.stringify(req.params||{}));const lowerCaseHeaders=Object.fromEntries(Object.entries(this.headers).map(([key,value])=>[key.toLowerCase(),value]));if(this.headers={...lowerCaseHeaders,...this.headers},req?.url)try{const url=new URL(req.url);this.path=url.pathname,this.query={...this.query,...Object.fromEntries(url.searchParams)}}catch{}req?.path&&(this.path=req.path),this.method=req.method,this.sessionID=req.sessionID,this.files=req.files||[],this._agent_authinfo=req._agent_authinfo,this.req=req instanceof AgentRequest?req?.req:req,this.res=req?.res||null}header(name){return this.headers[name.toLowerCase()]}}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,typeof key!="symbol"?key+"":key,value);Logger("EmbodimentSettings");class EmbodimentSettings{constructor(agentId){__publicField$1K(this,"_embodiments"),__publicField$1K(this,"_ready",!1),this.init(agentId)}async init(agentId){const agentDataConnector=ConnectorService.getAgentDataConnector();this._embodiments=await agentDataConnector.getAgentEmbodiments(agentId).catch(error=>[]),this._ready=!0}ready(maxWait=1e4){return new Promise((resolve,reject)=>{const interval=setInterval(()=>{this._ready&&(clearInterval(interval),resolve(!0)),maxWait-=100},100);setTimeout(()=>{clearInterval(interval),reject(!1)},maxWait)})}get(embodimentType,key){if(!this._embodiments)return;const _embodiment=this._embodiments.find(embodiment=>embodiment.type?.toLowerCase()===embodimentType.toLowerCase());return key?_embodiment?.properties?.[key]:_embodiment?.properties}getAll(){const obj={};return this._embodiments.forEach(embodiment=>{obj[embodiment.type.toLowerCase()]=embodiment.properties}),obj}}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);Logger("AgentSettings");class AgentSettings{constructor(agentId){__publicField$1J(this,"_settings"),__publicField$1J(this,"embodiments"),__publicField$1J(this,"_ready",!1),agentId&&this.init(agentId)}async init(agentId){this.embodiments=new EmbodimentSettings(agentId);const agentDataConnector=ConnectorService.getAgentDataConnector();this._settings=await agentDataConnector.getAgentSettings(agentId).catch(e=>{})||{},this._ready=!0}ready(maxWait=1e4){return new Promise((resolve,reject)=>{const interval=setInterval(()=>{this._ready&&(clearInterval(interval),resolve(!0)),maxWait-=100},100);setTimeout(()=>{clearInterval(interval),reject(!1)},maxWait)})}get(key){return this._settings?.[key]||""}set(key,value){this._settings[key]=value}has(key){return this._settings[key]}}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);class AgentProcess{constructor(agentData,agentVersion){this.agentData=agentData,this.agentVersion=agentVersion,__publicField$1I(this,"agent"),__publicField$1I(this,"_loadPromise"),this.initAgent(agentData,agentVersion)}async initAgent(agentData,agentVersion){let data,agentId;if(typeof agentData=="object")data=agentData,data.components&&data.connections&&(data={data,version:"1.0"}),agentId=data.data.id||"tmp-"+uid();else{const jsonRegex=/^{.*}$/g,jsonData=agentData.match(jsonRegex)?.[0],idRegex=/^[a-zA-Z0-9\-]+$/g;agentId=agentData.match(idRegex)?.[0],agentId&&(data=await ConnectorService.getAgentDataConnector().getAgentData(agentId,agentVersion)),!data&&jsonData&&(data=JSON.parse(jsonData),agentId=data.id||"tmp-"+uid(),data.components&&data.connections&&(data={data,version:"1.0"}))}const agentSettings=new AgentSettings(agentId);this.agent=new Agent(agentId,data,agentSettings)}async ready(){return this._loadPromise?this._loadPromise:this._loadPromise=new Promise(resolve=>{let maxWait=1e4;const itv2=setInterval(()=>{this.agent&&(clearInterval(itv2),resolve(!0)),maxWait-=100,maxWait<=0&&(clearInterval(itv2),resolve(!1))},100)})}static load(agentData,agentVersion){return new AgentProcess(agentData,agentVersion)}async run(reqConfig,callback){if(await this.ready(),!this.agent)throw new Error("Failed to load agent");let request=this.parseReqConfig(reqConfig);this.agent.setRequest(request),typeof callback=="function"&&this.agent.setCallback(callback);const pathMatches=request.path.match(/(^\/v[0-9]+\.[0-9]+?)?(\/(api|trigger)\/(.+)?)/);if(!pathMatches||!pathMatches[2])return{status:404,data:{error:"Endpoint not found"}};const endpointPath=pathMatches[2],input=request.method=="GET"?request.query:request.body;return{data:await this.agent.process(endpointPath,input).catch(error=>({error:error.message}))}}reset(){this.initAgent(this.agentData)}parseReqConfig(reqConfig){return reqConfig instanceof AgentRequest?reqConfig:Array.isArray(reqConfig)?this.parseCLI(reqConfig):new AgentRequest(reqConfig)}parseCLI(argList){const cliConnector=ConnectorService.getCLIConnector(),methods=["get","post","put","delete","patch","head","options"],cli=cliConnector.parse(argList,["endpoint","post","get","put","delete","patch","head","options","headers","session"]),usedMethod=methods.find(method=>cli[method]),req=new AgentRequest;switch(req.method=usedMethod?.toUpperCase()||"GET",req.body={},req.query={},usedMethod){case"get":case"delete":case"head":case"options":req.query=cli[usedMethod];break;case"post":case"put":case"patch":req.body=cli[usedMethod];break}req.path=`/api/${cli.endpoint}`,req.params=cli.endpoint?.split("/"),req.headers=cli.headers||{};for(let key in req.headers)req.headers[key.toLowerCase()]=req.headers[key],delete req.headers[key];if(req.sessionID=cli.session||uid(),req.files=[],req.body)for(let entry in req.body){let value=req.body[entry];const filePath=path.join(process.cwd(),value),fileName=path.basename(filePath);if(fs__default.existsSync(filePath))try{const fileBuffer=fs__default.readFileSync(filePath),ext=fileName.split(".").pop(),fileObj={fieldname:entry,originalname:fileName,buffer:fileBuffer,mimetype:mime.getType(ext)||"application/octet-stream"};delete req.body[entry],req.files.push(fileObj),FileType.fileTypeFromBuffer(fileBuffer).then(fileType=>{fileType&&(fileObj.mimetype=fileType.mime)})}catch(error){console.warn("Coud not read file",filePath,error.message)}}return req}async post(path2,input,headers){return this.run({method:"POST",path:path2,body:input||{},headers})}async get(path2,query,headers){return this.run({method:"GET",path:path2,query,headers})}async readDebugState(stateId,reqConfig){if(await this.ready(),!this.agent)throw new Error("Failed to load agent");let request=this.parseReqConfig(reqConfig);return this.agent.setRequest(request),await this.agent.agentRuntime.ready(),this.agent.agentRuntime.readState(stateId,!0)}}function isAgent(agent){return typeof agent=="object"&&agent.id&&typeof agent.callComponent=="function"}var __defProp$1H=Object.defineProperty,__defNormalProp$1H=(obj,key,value)=>key in obj?__defProp$1H(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1H=(obj,key,value)=>__defNormalProp$1H(obj,key+"",value);class JSONContentHelper{constructor(dataString){this.dataString=dataString,__publicField$1H(this,"_current"),this._current=dataString}get result(){return this._current}static create(dataString){return new JSONContentHelper(dataString)}tryParse(){const strInput=this._current;if(!isValidString(strInput)||isDigits(strInput)||isSafeNumber(strInput))return strInput;let str=strInput.trim();if(str.startsWith("{")&&str.endsWith("}")||str.startsWith("[")&&str.endsWith("]"))try{return JSON.parse(str)}catch{try{const repairedJson=jsonrepair(str);return JSON.parse(repairedJson)}catch{}}if(str=(this.extractJsonFromString(strInput)||strInput).trim(),isDigits(str)&&!isSafeNumber(str)||!str.startsWith("{")&&!str.startsWith("["))return str;try{return JSON.parse(str)}catch{try{const repairedJson=jsonrepair(str);return JSON.parse(repairedJson)}catch{return strInput}}}tryFullParse(){const str=this._current;if(!str||isDigits(str)&&!isSafeNumber(str)||!str.startsWith("{")&&!str.startsWith("["))return str;try{return JSON.parse(str)}catch{try{return JSON.parse(jsonrepair(str))}catch(e2){return console.warn("Error on parseJson: ",e2.toString()),console.warn(" Tried to parse: ",str),{result:str,error:e2.toString()}}}}extractJsonFromString(str){try{const regex=/(\{.*\})/s;return str.match(regex)?.[1]}catch{return null}}}function JSONContent(dataString){return JSONContentHelper.create(dataString)}const console$p=Logger("SecureConnector");class SecureConnector extends Connector{async start(){console$p.info(`Starting ${this.name} connector ...`)}async stop(){console$p.info(`Stopping ${this.name} connector ...`)}async hasAccess(acRequest){const aclHelper=await this.getResourceACL(acRequest.resourceId,acRequest.candidate).catch(error=>(console$p.error(`Error getting ACL for ${acRequest.resourceId}: ${error}`),null));if(!aclHelper)return!1;if(aclHelper.checkExactAccess(acRequest))return!0;const ownerRequest=AccessRequest.clone(acRequest).setLevel(TAccessLevel.Owner);if(aclHelper.checkExactAccess(ownerRequest))return!0;const publicRequest=AccessRequest.clone(acRequest).setCandidate(AccessCandidate.public());if(aclHelper.checkExactAccess(publicRequest))return!0;const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),teamRequest=AccessRequest.clone(acRequest).setCandidate(AccessCandidate.team(teamId));if(aclHelper.checkExactAccess(teamRequest))return!0;const teamOwnerRequest=AccessRequest.clone(teamRequest).setLevel(TAccessLevel.Owner);return!!aclHelper.checkExactAccess(teamOwnerRequest)}async getAccessTicket(resourceId,request){const sysAcRequest=AccessRequest.clone(request).resource(resourceId);return{request,access:await this.hasAccess(sysAcRequest)?TAccessResult.Granted:TAccessResult.Denied}}static AccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){const[acRequest,resourceId]=args;if(resourceId!==void 0&&(await this.getAccessTicket(resourceId,acRequest)).access!==TAccessResult.Granted)throw console$p.error(`Access denied for ${acRequest.candidate.id} on ${resourceId}`),new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}}class CacheConnector extends SecureConnector{requester(candidate){return{get:async key=>await this.get(candidate.readRequest,key),set:async(key,data,acl,metadata,ttl)=>await this.set(candidate.writeRequest,key,data,acl,metadata,ttl),delete:async key=>{await this.delete(candidate.writeRequest,key)},exists:async key=>await this.exists(candidate.readRequest,key),getMetadata:async key=>await this.getMetadata(candidate.readRequest,key),setMetadata:async(key,metadata)=>{await this.setMetadata(candidate.writeRequest,key,metadata)},updateTTL:async(key,ttl)=>{await this.updateTTL(candidate.writeRequest,key,ttl)},getTTL:async key=>await this.getTTL(candidate.readRequest,key),getACL:async key=>await this.getACL(candidate.readRequest,key),setACL:async(key,acl)=>{await this.setACL(candidate.writeRequest,key,acl)}}}}var __defProp$1G=Object.defineProperty,__defNormalProp$1G=(obj,key,value)=>key in obj?__defProp$1G(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1G=(obj,key,value)=>__defNormalProp$1G(obj,typeof key!="symbol"?key+"":key,value);const ACLHashAlgo={none:source=>source,xxh3:source=>{const h64=xxhash.h64();return source?h64.update(source.toString()).digest().toString(16):null}};class ACL{constructor(acl){__publicField$1G(this,"hashAlgorithm"),__publicField$1G(this,"entries"),__publicField$1G(this,"migrated"),typeof acl=="string"?this.deserializeACL(acl):(this.hashAlgorithm=acl?.hashAlgorithm,this.entries=acl?.entries?JSON.parse(JSON.stringify(acl?.entries)):{},this.migrated=acl?.migrated),this.hashAlgorithm||(this.hashAlgorithm="xxh3"),this.entries||(this.entries={})}get ACL(){return{hashAlgorithm:this.hashAlgorithm,entries:JSON.parse(JSON.stringify(this.entries)),migrated:this.migrated}}get serializedACL(){return this.serializeACL(this)}static from(acl){return new ACL(acl)}checkExactAccess(acRequest){if(!this?.entries)return!1;const role=this?.entries[acRequest.candidate.role];if(!role)return!1;let entryId=acRequest.candidate.id;if(!ACLHashAlgo[this.hashAlgorithm])throw new Error(`Hash algorithm ${this.hashAlgorithm} not supported`);entryId=ACLHashAlgo[this.hashAlgorithm](entryId);const access=role[entryId];return access?(Array.isArray(acRequest.level)?acRequest.level:[acRequest.level]).every(level=>access.includes(level)):!1}addPublicAccess(level){if(this?.entries[TAccessRole.Public]||(this.entries[TAccessRole.Public]={}),!ACLHashAlgo[this.hashAlgorithm])throw new Error(`Hash algorithm ${this.hashAlgorithm} not supported`);const ownerId=TAccessRole.Public,hashedOwner=ACLHashAlgo[this.hashAlgorithm](ownerId);this?.entries[TAccessRole.Public][hashedOwner]||(this.entries[TAccessRole.Public][hashedOwner]=[]);const curLevel=this.entries[TAccessRole.Public][hashedOwner];return this.entries[TAccessRole.Public][hashedOwner]=[...curLevel,...level],this}removePublicAccess(level){if(!this?.entries[TAccessRole.Public])return this;const ownerId=TAccessRole.Public,hashedOwner=ACLHashAlgo[this.hashAlgorithm](ownerId),curLevel=this[TAccessRole.Public][hashedOwner];return this[TAccessRole.Public][hashedOwner]=curLevel.filter(l=>!level.includes(l)),this}addAccess(role,ownerId,level){if(role===TAccessRole.Public)throw new Error("Adding public access using addAccess method is not allowed. Use addPublicAccess method instead.");const _level=Array.isArray(level)?level:[level];if(this?.entries[role]||(this.entries[role]={}),!ACLHashAlgo[this.hashAlgorithm])throw new Error(`Hash algorithm ${this.hashAlgorithm} not supported`);const hashedOwner=ACLHashAlgo[this.hashAlgorithm](ownerId);if(!hashedOwner)throw new Error(`Invalid ownerId: ${role}:${ownerId}`);this?.entries[role][hashedOwner]||(this.entries[role][hashedOwner]=[]);const curLevel=this.entries[role][hashedOwner];return this.entries[role][hashedOwner]=[...curLevel,..._level],this}static addAccess(role,ownerId,level){return ACL.from().addAccess(role,ownerId,level)}removeAccess(role,ownerId,level){const _level=Array.isArray(level)?level:[level];if(!this[role])return this;if(!this[role][ownerId])return this;const curLevel=this[role][ownerId];return this[role][ownerId]=curLevel.filter(l=>!_level.includes(l)),this}serializeACL(tacl){let compressed="";if(tacl.hashAlgorithm&&(compressed+=`h:${tacl.hashAlgorithm}|`),tacl.entries)for(const[role,entries]of Object.entries(tacl.entries)){const roleShort=RoleMap[role],entriesArray=[];for(const[hashedOwnerKey,accessLevels]of Object.entries(entries||{}))if(accessLevels){const accessLevelsShort=accessLevels.map(level=>LevelMap[level]).join("");entriesArray.push(`${hashedOwnerKey}/${accessLevelsShort}`)}entriesArray.length>0&&(compressed+=`${roleShort}:${entriesArray.join(",")}|`)}return compressed.endsWith("|")&&(compressed=compressed.slice(0,-1)),compressed}deserializeACL(compressed){const parts=compressed.split("|");this.hashAlgorithm="",this.entries={};for(const part of parts)if(part.startsWith("h:"))this.hashAlgorithm=part.substring(2);else{const[roleShort,entries]=part.split(":"),role=ReverseRoleMap[roleShort];if(role){const entriesObj={},entriesArray=entries.split(",");for(const entry of entriesArray){const[hashedOwnerKey,accessLevelsShort]=entry.split("/"),accessLevels=accessLevelsShort.split("").map(short=>ReverseLevelMap[short]);entriesObj[hashedOwnerKey]=accessLevels}this.entries[role]=entriesObj}}}}class StorageConnector extends SecureConnector{requester(candidate){return{write:async(resourceId,value,acl,metadata)=>await this.write(candidate.writeRequest,resourceId,value,acl,metadata),read:async resourceId=>await this.read(candidate.readRequest,resourceId),delete:async resourceId=>{await this.delete(candidate.readRequest,resourceId)},exists:async resourceId=>await this.exists(candidate.readRequest,resourceId),getMetadata:async resourceId=>await this.getMetadata(candidate.readRequest,resourceId),setMetadata:async(resourceId,metadata)=>{await this.setMetadata(candidate.writeRequest,resourceId,metadata)},getACL:async resourceId=>await this.getACL(candidate.readRequest,resourceId),setACL:async(resourceId,acl)=>await this.setACL(candidate.writeRequest,resourceId,acl),expire:async(resourceId,ttl)=>await this.expire(candidate.writeRequest,resourceId,ttl)}}}var __defProp$1F=Object.defineProperty,__defNormalProp$1F=(obj,key,value)=>key in obj?__defProp$1F(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1F=(obj,key,value)=>__defNormalProp$1F(obj,typeof key!="symbol"?key+"":key,value);const _SmythFS=class _SmythFS2{constructor(storage,cache){this.storage=storage,this.cache=cache,__publicField$1F(this,"hash"),this.hash=_SmythFS2.generateInstanceHash(this.storage.name,this.cache.name)}static generateInstanceHash(storageName,cacheName){const instanceProps=`${storageName}:${cacheName}`;return crypto$1.createHash("sha256").update(instanceProps).digest("hex").substring(0,6)}static get Instance(){return _SmythFS2.getInstance()}static getInstance(storageProvider="",cacheProvider=""){const storage=storageProvider instanceof StorageConnector?storageProvider:ConnectorService.getStorageConnector(storageProvider),cache=cacheProvider instanceof CacheConnector?cacheProvider:ConnectorService.getCacheConnector(cacheProvider),hash=_SmythFS2.generateInstanceHash(storage.name,cache.name);if(_SmythFS2.instances[hash])return _SmythFS2.instances[hash];const instance=new _SmythFS2(storage,cache),router=ConnectorService.getRouterConnector();return router&&router?.get instanceof Function&&(router.get(`/_temp/${hash}/:uid`,instance.serveTempContent.bind(instance)),router.get(`/storage/${hash}/:file_id`,instance.serveResource.bind(instance))),_SmythFS2.instances[hash]=instance,instance}getBaseUri(candidate){return`smythfs://${candidate.id}.${candidate.role}`}async read(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate),data=await this.storage.requester(_candidate).read(resourceId);return data?this.toBuffer(data):null}async getMetadata(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);return await this.storage.requester(_candidate).getMetadata(resourceId)}async write(uri,data,candidate,metadata,ttl){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);let acl;if(smythURI.team&&smythURI.team!==DEFAULT_TEAM_ID&&(acl=new ACL().addAccess(TAccessRole.Team,smythURI.team,TAccessLevel.Read).ACL),metadata||(metadata={}),!metadata?.ContentType&&(metadata.ContentType=await getMimeType(data),!metadata.ContentType)){const ext=uri.split(".").pop();ext&&(metadata.ContentType=mime.getType(ext)||"application/octet-stream")}await this.storage.requester(_candidate).write(resourceId,data,acl,metadata),ttl&&await this.storage.requester(_candidate).expire(resourceId,ttl)}async delete(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);await this.storage.requester(_candidate).delete(resourceId)}async exists(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");const resourceId=`teams/${smythURI.team}${smythURI.path}`,_candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);return await this.storage.requester(_candidate).exists(resourceId)}async genTempUrl(uri,candidate,ttlSeconds=3600){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");if(!await this.exists(uri,candidate))throw new Error("Resource does not exist");const _candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate),resourceId=`teams/${smythURI.team}${smythURI.path}`,resourceMetadata=await this.storage.requester(_candidate).getMetadata(resourceId),uid2=crypto$1.randomUUID(),tempUserCandidate=AccessCandidate.user(`system-${uid2}`);return await this.cache.requester(tempUserCandidate).set(`pub_url:${uid2}`,JSON.stringify({accessCandidate:_candidate,uri,contentType:resourceMetadata?.ContentType}),void 0,void 0,ttlSeconds),`${ConnectorService.getRouterConnector().baseUrl}/_temp/${this.hash}/${uid2}`}async destroyTempUrl(url,{delResource}={delResource:!1}){const tempPath=url.split("/_temp/")[1];if(!tempPath)throw new Error("Invalid Temp URL format");const uid2=tempPath.split("/")[1]?.split("?")[0];if(!uid2)throw new Error("Invalid Temp URL format");let cacheVal=await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).get(`pub_url:${uid2}`);if(!cacheVal)throw new Error("Invalid Temp URL");cacheVal=JSONContentHelper.create(cacheVal).tryParse(),await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).delete(`pub_url:${uid2}`),delResource&&await this.delete(cacheVal.uri,AccessCandidate.clone(cacheVal.accessCandidate))}async serveTempContent(req,res){try{const{uid:uid2}=req.params;let cacheVal=await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).get(`pub_url:${uid2}`);if(!cacheVal){res.writeHead(404,{"Content-Type":"text/plain"}),res.end("Invalid Temp URL");return}cacheVal=JSONContentHelper.create(cacheVal).tryParse();const content=await this.read(cacheVal.uri,AccessCandidate.clone(cacheVal.accessCandidate)),contentBuffer=Buffer.isBuffer(content)?content:Buffer.from(content,"binary"),contentType=cacheVal.contentType||"application/octet-stream";res.writeHead(200,{"Content-Type":contentType,"Content-Disposition":"inline","Content-Length":contentBuffer.length}),res.end(contentBuffer)}catch(error){console.error("Error serving temp content:",error),res.writeHead(500,{"Content-Type":"text/plain"}),res.end("Internal Server Error")}}async genResourceUrl(uri,candidate){const smythURI=await this.URIParser(uri);if(!smythURI)throw new Error("Invalid Resource URI");if(candidate=candidate||smythURI.defaultCandidate,!await ConnectorService.getAccountConnector().isTeamMember(smythURI.team,candidate))throw new Error("Access Denied");if(!await this.exists(uri,candidate))throw new Error("Resource does not exist");const _candidate=candidate instanceof AccessCandidate?candidate:new AccessCandidate(candidate);if(_candidate.role!==TAccessRole.Agent)throw new Error("Only agents can generate resource urls");const agentId=_candidate.id,resourceId=`teams/${smythURI.team}${smythURI.path}`,resourceMetadata=await this.storage.requester(_candidate).getMetadata(resourceId),uid2=crypto$1.randomUUID(),tempUserCandidate=AccessCandidate.user(`system-${uid2}`);await this.cache.requester(tempUserCandidate).set(`storage_url-${uid2}`,JSON.stringify({accessCandidate:_candidate,uri,contentType:resourceMetadata?.ContentType}),void 0,void 0);const contentType=resourceMetadata?.ContentType,ext=contentType?mime.getExtension(contentType):void 0,agentDataConnector=ConnectorService.getAgentDataConnector(),baseUrl=ConnectorService.getRouterConnector().baseUrl;return`${agentDataConnector.getAgentConfig(agentId)?.agentStageDomain?`https://${agentDataConnector.getAgentConfig(agentId).agentStageDomain}`:baseUrl}/storage/${this.hash}/${uid2}${ext?`.${ext}`:""}`}async destroyResourceUrl(url,{delResource}={delResource:!1}){}async serveResource(req,res){try{const{file_id}=req.params,[uid2,extention]=file_id.split(".");let cacheVal=await this.cache.requester(AccessCandidate.user(`system-${uid2}`)).get(`storage_url-${uid2}`);if(!cacheVal){res.writeHead(404,{"Content-Type":"text/plain"}),res.end("Invalid Resource URL");return}cacheVal=JSONContentHelper.create(cacheVal).tryParse();const content=await this.read(cacheVal.uri,AccessCandidate.clone(cacheVal.accessCandidate)),contentBuffer=Buffer.isBuffer(content)?content:Buffer.from(content,"binary"),contentType=cacheVal.contentType||"application/octet-stream";res.writeHead(200,{"Content-Type":contentType,"Content-Disposition":"inline","Content-Length":contentBuffer.length}),res.end(contentBuffer)}catch(error){console.error("Error serving storage resource content:",error),res.writeHead(500,{"Content-Type":"text/plain"}),res.end("Internal Server Error")}}async URIParser(uri){const parts=uri.split("://");if(parts.length!==2||parts[0].toLowerCase()!=="smythfs")return;const parsed=this.CaseSensitiveURL(`http://${parts[1]}`),tld=parsed.hostname.split(".").pop();if(tld!=="team"&&tld!=="user"&&tld!=="agent"&&tld!=="smyth")throw new Error("Invalid Resource URI");let team=tld==="team"?parsed.hostname.replace(`.${tld}`,""):void 0;const user=tld==="user"?parsed.hostname.replace(`.${tld}`,""):void 0,agent=tld==="agent"?parsed.hostname.replace(`.${tld}`,""):void 0,smyth=tld==="smyth"?parsed.hostname.replace(`.${tld}`,""):void 0;let basePath="";if(!team){let candidate;user?(candidate=AccessCandidate.user(user),basePath=".user/"+user):agent&&(candidate=AccessCandidate.agent(agent),basePath=".agent/"+agent),candidate&&(team=await ConnectorService.getAccountConnector().getCandidateTeam(candidate))}let defaultCandidate;return team?defaultCandidate=AccessCandidate.team(team):user?defaultCandidate=AccessCandidate.user(user):agent&&(defaultCandidate=AccessCandidate.agent(agent)),{hash:parsed.hash,team,user,agent,smyth,defaultCandidate,path:basePath+parsed.pathname}}CaseSensitiveURL(urlString){const parts=urlString.split("://");if(parts.length!==2)return null;const afterProtocol=parts[1],hostnameEnd=Math.min(...[afterProtocol.indexOf("/"),afterProtocol.indexOf("?"),afterProtocol.indexOf("#"),afterProtocol.length].filter(i=>i>=0)),originalHostnamePart=afterProtocol.substring(0,hostnameEnd),[originalHostname,originalPort]=originalHostnamePart.split(":"),parsed=new URL(urlString);return{protocol:parsed.protocol,hostname:originalHostname,port:parsed.port,pathname:parsed.pathname,search:parsed.search,searchParams:parsed.searchParams,hash:parsed.hash,href:parsed.href,origin:parsed.origin,host:originalHostname+(parsed.port?`:${parsed.port}`:""),originalPort:originalPort||null}}async toBuffer(data){if(Buffer.isBuffer(data))return data;if(typeof data=="string")return Buffer.from(data,"utf-8");if(data instanceof Uint8Array)return Buffer.from(data);if(data instanceof Readable)return new Promise((resolve,reject)=>{const chunks=[];data.on("data",chunk=>{chunks.push(Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk))}),data.on("end",()=>{resolve(Buffer.concat(chunks))}),data.on("error",err=>{reject(err)})});throw new Error("Unsupported data type")}};__publicField$1F(_SmythFS,"instances",{});let SmythFS=_SmythFS;var __defProp$1E=Object.defineProperty,__defNormalProp$1E=(obj,key,value)=>key in obj?__defProp$1E(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1E=(obj,key,value)=>__defNormalProp$1E(obj,typeof key!="symbol"?key+"":key,value);class BinaryInput{constructor(data,_name,mimetype,candidate){this._name=_name,this.mimetype=mimetype,this.candidate=candidate,__publicField$1E(this,"size"),__publicField$1E(this,"url"),__publicField$1E(this,"_ready"),__publicField$1E(this,"_readyPromise"),__publicField$1E(this,"_source"),__publicField$1E(this,"_uploading",!1),_name||(_name=uid()),this._name=_name,this.load(data,_name,mimetype,candidate)}async ready(){return this._ready?!0:(this._readyPromise||(this._readyPromise=new Promise(resolve=>{const interval=setInterval(()=>{this._ready&&(clearInterval(interval),resolve(!0))},100)})),this._readyPromise)}async load(data,name,mimetype,candidate){const ext=name.split(".")?.length>1?name.split(".").pop():"";if(this.mimetype=mimetype||mime.getType(ext)||"",this.url="",typeof data=="object"&&data.url&&data.mimetype&&data.size){this.mimetype=data.mimetype,this.size=data.size,this.url=data.url;const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`),candidate?this._source=await SmythFS.Instance.read(this.url,candidate).finally(()=>{this._ready=!0}):this._ready=!0;return}if(typeof data=="string"&&data.startsWith("smythfs://")){if(this.url=data,candidate)try{this._source=await SmythFS.Instance.read(this.url,candidate),this.mimetype=await getMimeType(this._source),this.size=this._source.byteLength,this.mimetype||(this.mimetype=mime.getType(this.url)||mime.getType(this._name)||"");const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`)}finally{this._ready=!0}else{const ext2=this.url.split(".").pop();this.mimetype=mime.getType(ext2)||"",this._ready=!0}return}if(isUrl(data)){try{const response=await axios({method:"get",url:data,responseType:"arraybuffer"});this.size=response.data.byteLength,this._source=Buffer.from(response.data,"binary");let mimetype2=response.headers?.["content-type"]||"";const urlPath=new URL(data).pathname;let extension=urlPath.split(".")?.length>1?urlPath.split(".").pop():"";(!mimetype2||mimetype2.startsWith("binary/octet-stream"))&&(mimetype2=extension?mime.getType(extension):""),mimetype2||(mimetype2=(await fileTypeFromBuffer(this._source))?.mime||""),this.mimetype=mimetype2,extension=extension||mime.getExtension(this.mimetype),this._name.endsWith(`.${extension}`)||(this._name+=`.${extension}`)}catch(error){console.error("Error loading binary data from url:",data.url,error)}this._ready=!0;return}const base64FileInfo=await getBase64FileInfo(data);if(base64FileInfo){this.mimetype||(this.mimetype=base64FileInfo.mimetype),this.size=base64FileInfo.size,this._source=Buffer.from(base64FileInfo.data,"base64");const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`),this._ready=!0;return}if(typeof data=="string"){this._source=Buffer.from(data),this.size=data.length,this.mimetype="text/plain",this._name.endsWith(".txt")||(this._name+=".txt"),this._ready=!0;return}if(Buffer.isBuffer(data)){this._source=data,this.size=getSizeFromBinary(data),this.mimetype||(this.mimetype=await getMimeType(data));const ext2=mime.getExtension(this.mimetype);this._name.endsWith(`.${ext2}`)||(this._name+=`.${ext2}`),this._ready=!0;return}if(data instanceof Blob){this._source=Buffer.from(await data.arrayBuffer()),this.size=data.size,this.mimetype=data.type,this._ready=!0;return}}async getUrlInfo(url){try{const response=await axios.get(url),contentType=response.headers["content-type"],contentLength=response.headers["content-length"];return{contentType,contentLength}}catch{return{contentType:"",contentLength:0}}}static from(source,name,mimetype,candidate){return source instanceof BinaryInput?source:new BinaryInput(source,name,mimetype,candidate)}async upload(candidate,ttl){if(await this.ready(),!this._uploading)try{if(this._uploading=!0,this.url)this._uploading=!1;else{const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate);this.url=`smythfs://${teamId}.team/${candidate.id}/_temp/${this._name}`,await SmythFS.Instance.write(this.url,this._source,candidate,void 0,ttl),this._uploading=!1}}catch(error){console.error("Error uploading binary data:",error),this._uploading=!1}}async getJsonData(candidate,ttl){return await this.upload(candidate,ttl),{mimetype:this.mimetype,size:this.size,url:this.url,name:this._name}}async readData(candidate){if(await this.ready(),!this.url)throw new Error("Binary data not ready");return await SmythFS.Instance.read(this.url,candidate)}async getName(){return await this.ready(),this._name}async getBuffer(){return await this.ready(),this._source}async getReadStream(){return await this.ready(),Readable.from(this._source)}}var TLLMCredentials=(TLLMCredentials2=>(TLLMCredentials2.Vault="vault",TLLMCredentials2.Internal="internal",TLLMCredentials2.BedrockVault="bedrock_vault",TLLMCredentials2.VertexAIVault="vertexai_vault",TLLMCredentials2.None="none",TLLMCredentials2))(TLLMCredentials||{}),LLMInterface=(LLMInterface2=>(LLMInterface2.ChatCompletions="chat.completions",LLMInterface2.Responses="responses",LLMInterface2.GenerateContent="generateContent",LLMInterface2.GenerateImages="generateImages",LLMInterface2))(LLMInterface||{});const BuiltinLLMProviders={Echo:"Echo",OpenAI:"OpenAI",DeepSeek:"DeepSeek",GoogleAI:"GoogleAI",Anthropic:"Anthropic",Groq:"Groq",TogetherAI:"TogetherAI",Bedrock:"Bedrock",VertexAI:"VertexAI",xAI:"xAI",Perplexity:"Perplexity",Ollama:"Ollama"},TLLMProvider=BuiltinLLMProviders;var TLLMMessageRole=(TLLMMessageRole2=>(TLLMMessageRole2.User="user",TLLMMessageRole2.Assistant="assistant",TLLMMessageRole2.System="system",TLLMMessageRole2.Model="model",TLLMMessageRole2.Tool="tool",TLLMMessageRole2.Function="function",TLLMMessageRole2))(TLLMMessageRole||{}),APIKeySource=(APIKeySource2=>(APIKeySource2.Smyth="smyth-managed",APIKeySource2.User="user-managed",APIKeySource2.Custom="custom",APIKeySource2))(APIKeySource||{}),TLLMEvent=(TLLMEvent2=>(TLLMEvent2.Data="data",TLLMEvent2.Content="content",TLLMEvent2.Thinking="thinking",TLLMEvent2.End="end",TLLMEvent2.Error="error",TLLMEvent2.ToolInfo="toolInfo",TLLMEvent2.ToolCall="toolCall",TLLMEvent2.ToolResult="toolResult",TLLMEvent2.Usage="usage",TLLMEvent2.Interrupted="interrupted",TLLMEvent2.Fallback="fallback",TLLMEvent2.Requested="requested",TLLMEvent2))(TLLMEvent||{}),__defProp$1D=Object.defineProperty,__defNormalProp$1D=(obj,key,value)=>key in obj?__defProp$1D(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1D=(obj,key,value)=>__defNormalProp$1D(obj,typeof key!="symbol"?key+"":key,value);const logger$j=Logger("LLMInference");let LLMInference$1=class LLMInference{constructor(){__publicField$1D(this,"_model"),__publicField$1D(this,"_llmConnector"),__publicField$1D(this,"_modelProviderReq"),__publicField$1D(this,"_llmProviderName"),__publicField$1D(this,"teamId")}get model(){return this._model}get modelId(){return typeof this._model=="string"?this._model:this._model?.modelId}get llmConnector(){return this._llmConnector}get modelProviderReq(){return this._modelProviderReq}get llmProviderName(){return this._llmProviderName}static async getInstance(model,candidate){const modelsProvider=ConnectorService.getModelsProviderConnector();if(!modelsProvider.valid)throw new Error("Model provider Not available, cannot create LLM instance");const teamId=await ConnectorService.getAccountConnector().requester(candidate).getTeam(),llmInference=new LLMInference;return llmInference.teamId=teamId,llmInference._modelProviderReq=modelsProvider.requester(candidate),llmInference._llmProviderName=await llmInference._modelProviderReq.getProvider(model),llmInference._llmProviderName&&(llmInference._llmConnector=ConnectorService.getLLMConnector(llmInference._llmProviderName)),llmInference._llmConnector||logger$j.warn(`Model ${model} unavailable for team ${teamId}`),llmInference._model=model,llmInference}static user(candidate){}get connector(){return this._llmConnector}async prompt({query,contextWindow,files,params,onFallback=()=>{}},isInFallback=!1){let messages=contextWindow||[];if(query){const content=this._llmConnector.enhancePrompt(query,params);messages.push({role:TLLMMessageRole.User,content})}params.model=this._model,params.messages=messages,params.files=files,isInFallback&&typeof onFallback=="function"&&onFallback({model:this._model});try{let response=await this._llmConnector.requester(AccessCandidate.agent(params.agentId)).request(params);const result=this._llmConnector.postProcess(response?.content);if(result.error)throw response.finishReason!=="stop"?new Error("The model stopped before completing the response, this is usually due to output token limit reached."):new Error(result.error);return result}catch(error){if(!isInFallback)try{const fallbackParams=await this.getSafeFallbackParams(params),fallbackResult=await this.executeFallback("prompt",{query,contextWindow,files,params:fallbackParams,onFallback});if(fallbackResult!==null)return fallbackResult}catch(fallbackError){logger$j.warn("Fallback also failed:",fallbackError)}throw logger$j.error("Error in chatRequest: ",error),error}}async promptStream({query,contextWindow,files,params,onFallback=()=>{}},isInFallback=!1){let messages=contextWindow||[];if(query){const content=this._llmConnector.enhancePrompt(query,params);messages.push({role:TLLMMessageRole.User,content})}params.model=this._model,params.messages=messages,params.files=files,isInFallback&&typeof onFallback=="function"&&onFallback({model:this._model});try{return await this._llmConnector.user(AccessCandidate.agent(params.agentId)).streamRequest(params)}catch(error){if(!isInFallback)try{const fallbackParams=await this.getSafeFallbackParams(params),fallbackResult=await this.executeFallback("promptStream",{query,contextWindow,files,params:fallbackParams,onFallback});if(fallbackResult!==null)return fallbackResult}catch(fallbackError){logger$j.warn("Fallback also failed:",fallbackError)}logger$j.error("Error in streamRequest:",error);const dummyEmitter=new EventEmitter;return process.nextTick(()=>{dummyEmitter.emit("error",error),dummyEmitter.emit("end")}),dummyEmitter}}async getSafeFallbackParams(params){return{agentId:params.agentId,model:params.model,maxContextWindowLength:params.maxContextWindowLength,maxTokens:params.maxTokens,messages:params.messages,passthrough:params.passthrough,useContextWindow:params.useContextWindow}}async executeFallback(methodName,args){const isCustomModel=await this._modelProviderReq.isUserCustomLLM(this._model),fallbackModel=await this._modelProviderReq.getFallbackLLM(this._model);if(!isCustomModel||!fallbackModel)return null;logger$j.info(`Attempting fallback from ${this._model} to ${fallbackModel}`),this._model=fallbackModel;const llmProvider=await this._modelProviderReq.getProvider(fallbackModel);return llmProvider&&(this._llmConnector=ConnectorService.getLLMConnector(llmProvider)),methodName==="prompt"?await this.prompt(args,!0):await this.promptStream(args,!0)}async imageGenRequest({query,files,params}){return params.prompt=query,this._llmConnector.user(AccessCandidate.agent(params.agentId)).imageGenRequest(params)}async imageEditRequest({query,files,params}){return params.prompt=query,params.files=files,this._llmConnector.user(AccessCandidate.agent(params.agentId)).imageEditRequest(params)}async streamRequest(params,agent){const agentId=isAgent(agent)?agent.id:agent;try{if(!params.messages||!params.messages?.length)throw new Error("Input messages are required.");const model=params.model||this._model;return await this._llmConnector.user(AccessCandidate.agent(agentId)).streamRequest({...params,model})}catch(error){logger$j.error("Error in streamRequest:",error);const dummyEmitter=new EventEmitter;return process.nextTick(()=>{dummyEmitter.emit("error",error),dummyEmitter.emit("end")}),dummyEmitter}}async multimodalStreamRequest(params,fileSources,agent){const agentId=isAgent(agent)?agent.id:agent,promises=[],_fileSources=[];for(let file of fileSources){const binaryInput=BinaryInput.from(file);_fileSources.push(binaryInput),promises.push(binaryInput.upload(AccessCandidate.agent(agentId)))}await Promise.all(promises),params.fileSources=_fileSources;try{const prompt=(Array.isArray(params.messages)?params.messages.pop():{})?.content||"",model=params.model||this._model;return await this._llmConnector.user(AccessCandidate.agent(agentId)).multimodalStreamRequest(prompt,{...params,model})}catch(error){throw logger$j.error("Error in multimodalRequest: ",error),error}}async multimodalStreamRequestLegacy(prompt,files,config2={},agent){const agentId=isAgent(agent)?agent.id:agent,promises=[],_files=[];for(let file of files){const binaryInput=BinaryInput.from(file);_files.push(binaryInput),promises.push(binaryInput.upload(AccessCandidate.agent(agentId)))}await Promise.all(promises);const params=config2.data;params.files=_files;try{prompt=this._llmConnector.enhancePrompt(prompt,config2);const model=params.model||this._model;return await this._llmConnector.user(AccessCandidate.agent(agentId)).multimodalStreamRequest(prompt,{...params,model})}catch(error){throw logger$j.error("Error in multimodalRequest: ",error),error}}async getContextWindow(systemPrompt,_messages,maxTokens,maxOutputTokens=1024){const modelInfo=await this._modelProviderReq.getModelInfo(this._model,!0);let maxModelContext=modelInfo?.tokens,maxModelOutputTokens=modelInfo?.completionTokens||modelInfo?.tokens,maxInputContext=Math.min(maxTokens,maxModelContext),maxOutputContext=Math.min(maxOutputTokens,maxModelOutputTokens||0);maxInputContext+maxOutputContext>maxModelContext&&(maxInputContext-=maxInputContext+maxOutputContext-maxModelContext),maxInputContext<=0&&logger$j.warn("Max input context is 0, returning empty context window, This usually indicates a wrong model configuration"),logger$j.debug(`Context Window Configuration: Max Input Tokens: ${maxInputContext}, Max Output Tokens: ${maxOutputContext}, Max Model Tokens: ${maxModelContext}`);const systemMessage={role:"system",content:systemPrompt};let smythContextWindow=[],tokensCount=encodeChat([systemMessage],"gpt-4o").length;for(let i=_messages?.length-1;i>=0;i--){const curMessage=_messages[i];if(curMessage.role!=="system"){if(tokensCount=0,curMessage?.content&&(tokensCount+=countTokens(curMessage.content)),curMessage?.messageBlock?.content&&(tokensCount+=countTokens(curMessage.messageBlock.content)),curMessage.toolsData)for(let tool of curMessage.toolsData)tokensCount+=countTokens(tool.result);if(tokensCount>maxInputContext)break;smythContextWindow.unshift(curMessage)}}smythContextWindow.unshift(systemMessage);let modelContextWindow=[];for(let message of smythContextWindow)if(message.role&&message.content&&modelContextWindow.push({role:message.role,content:message.content}),message.messageBlock&&message.toolsData){const internal_message=this.connector.transformToolMessageBlocks({messageBlock:message?.messageBlock,toolsData:message?.toolsData});modelContextWindow.push(...internal_message)}return modelContextWindow=this.connector.getConsistentMessages(modelContextWindow),modelContextWindow}};function countTokens(content,model="gpt-4o"){try{const _stringifiedContent=typeof content=="string"?content:JSON.stringify(content);return encodeChat([{role:"user",content:_stringifiedContent}],model).length}catch(error){return logger$j.warn("Error in countTokens: ",error),0}}var __defProp$1C=Object.defineProperty,__defNormalProp$1C=(obj,key,value)=>key in obj?__defProp$1C(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1C=(obj,key,value)=>__defNormalProp$1C(obj,typeof key!="symbol"?key+"":key,value);class LLMContext{constructor(llmInference,_systemPrompt="",llmContextStore){this.llmInference=llmInference,__publicField$1C(this,"_systemPrompt",""),__publicField$1C(this,"_llmContextStore"),__publicField$1C(this,"_llmCache"),__publicField$1C(this,"contextLength"),__publicField$1C(this,"_messages",[]),this._llmCache=new LLMCache(AccessCandidate.team(this.llmInference.teamId)),this.systemPrompt=_systemPrompt,llmContextStore&&(this._llmContextStore=llmContextStore,this._llmContextStore.load().then(messages=>{this._messages=messages,this._llmCache.set("messages",this._messages)}))}get systemPrompt(){return this._systemPrompt}set systemPrompt(systemPrompt){this._systemPrompt=systemPrompt,this._llmCache?.set("systemPrompt",this.systemPrompt)}get llmCache(){return this._llmCache}get messages(){return this._messages}get model(){return this.llmInference.model}push(...message){this._messages.push(...message),this._llmContextStore&&this._llmContextStore.save(this._messages),this._llmCache.set("messages",this._messages)}addUserMessage(content,message_id,metadata){const lastMessage=this._messages[this._messages.length-1];lastMessage&&(lastMessage.__smyth_data__?.next||(lastMessage.__smyth_data__.next=[]),lastMessage.__smyth_data__.next.push(message_id));const prev=lastMessage?.__smyth_data__?.message_id,next=[];this.push({role:"user",content,__smyth_data__:{message_id,...metadata,prev,next}})}addAssistantMessage(content,message_id,metadata){const lastMessage=this._messages[this._messages.length-1];lastMessage&&(lastMessage.__smyth_data__?.next||(lastMessage.__smyth_data__.next=[]),lastMessage.__smyth_data__.next.push(message_id));const prev=lastMessage?.__smyth_data__?.message_id,next=[];this.push({role:"assistant",content,__smyth_data__:{message_id,...metadata,prev,next}})}addToolMessage(messageBlock,toolsData,message_id,metadata){const lastMessage=this._messages[this._messages.length-1];lastMessage&&(lastMessage.__smyth_data__?.next||(lastMessage.__smyth_data__.next=[]),lastMessage.__smyth_data__.next.push(message_id));const prev=lastMessage?.__smyth_data__?.message_id,next=[];this.push({messageBlock,toolsData,__smyth_data__:{message_id,...metadata,prev,next}})}async getContextWindow(maxTokens,maxOutputTokens=1024){const messages=JSON.parse(JSON.stringify(this._messages));return this.llmInference.getContextWindow(this.systemPrompt,messages,maxTokens,maxOutputTokens)}}const dereferenceSchema=async(schema,root=schema)=>{if(typeof schema!="object"||schema===null)return schema;if(schema.$ref){const ref=schema.$ref,path2=ref.replace(/^#\//,"").split("/");let resolved=root;for(const segment of path2){if(resolved[segment]===void 0)throw new Error(`Could not resolve $ref: ${ref}`);resolved=resolved[segment]}return dereferenceSchema(resolved,root)}if(Array.isArray(schema))return Promise.all(schema.map(item=>dereferenceSchema(item,root)));const result={};for(const key of Object.keys(schema))result[key]=await dereferenceSchema(schema[key],root);return result};class OpenAPIParser{static mapReqMethods(paths){const methods=new Map;for(const path2 in paths){const pathData=paths[path2];for(const method in pathData){const data=pathData[method];REQUEST_METHODS.includes(method.toUpperCase())&&methods.set(data?.operationId,method)}}return methods}static mapEndpoints(paths){const operationIds=new Map;for(const path2 in paths){const pathData=paths[path2];for(const method in pathData){const data=pathData[method];REQUEST_METHODS.includes(method.toUpperCase())&&operationIds.set(data?.operationId,path2)}}return operationIds}static async yamlToJson(yamlData){const data=yaml.load(yamlData);return await dereferenceSchema(data)}static async getJson(data){try{let parsedData=data;return typeof data=="string"&&(parsedData=JSON.parse(data)),await dereferenceSchema(parsedData)}catch{try{return await OpenAPIParser.yamlToJson(data)}catch{throw new Error("Invalid OpenAPI specification or JSON data format")}}}static async getJsonFromUrl(url){const data=(await axios.get(url)).data;return OpenAPIParser.getJson(data)}static isValidOpenAPI(data){return data?.openapi&&data?.paths&&data?.servers}}var __defProp$1B=Object.defineProperty,__getOwnPropDesc$y=Object.getOwnPropertyDescriptor,__defNormalProp$1B=(obj,key,value)=>key in obj?__defProp$1B(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$y=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$y(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$1B(target,key,result),result},__publicField$1B=(obj,key,value)=>__defNormalProp$1B(obj,typeof key!="symbol"?key+"":key,value);const console$o=Logger("ConversationHelper");class Conversation extends EventEmitter$1{constructor(_model,_specSource,_settings){super(),this._model=_model,this._specSource=_specSource,this._settings=_settings,__publicField$1B(this,"_agentId",""),__publicField$1B(this,"_systemPrompt"),__publicField$1B(this,"userDefinedSystemPrompt",""),__publicField$1B(this,"toolChoice","auto"),__publicField$1B(this,"assistantName"),__publicField$1B(this,"_reqMethods"),__publicField$1B(this,"_toolsConfig"),__publicField$1B(this,"_toolStatusMap",{}),__publicField$1B(this,"_endpoints"),__publicField$1B(this,"_baseUrl"),__publicField$1B(this,"_status",""),__publicField$1B(this,"_currentWaitPromise"),__publicField$1B(this,"_llmContextStore"),__publicField$1B(this,"_context"),__publicField$1B(this,"_maxContextSize",1024*128),__publicField$1B(this,"_maxOutputTokens",1024*8),__publicField$1B(this,"_teamId"),__publicField$1B(this,"_agentVersion"),__publicField$1B(this,"agentData"),__publicField$1B(this,"_id",""),__publicField$1B(this,"_lastError"),__publicField$1B(this,"_spec"),__publicField$1B(this,"_customToolsDeclarations",[]),__publicField$1B(this,"_customToolsHandlers",{}),__publicField$1B(this,"stop",!1),__publicField$1B(this,"_llmInference"),this._id="conv_"+randomUUID(),this.on("error",error=>{this._lastError=error,console$o.warn("Conversation Error: ",error?.message)}),this._maxContextSize=_settings?.maxContextSize||this._model.tokens||this._model.keyOptions?.tokens||this._maxContextSize,this._maxOutputTokens=_settings?.maxOutputTokens||this._model.completionTokens||this._model.keyOptions?.completionTokens||this._maxOutputTokens,_settings?.systemPrompt&&(this.userDefinedSystemPrompt=_settings.systemPrompt),_settings?.toolChoice&&(this.toolChoice=_settings.toolChoice),_settings?.store&&(this._llmContextStore=_settings.store),this._baseUrl=_settings?.baseUrl,this._agentVersion=_settings?.agentVersion,(async()=>_specSource?this.loadSpecFromSource(_specSource).then(async spec=>{if(!spec)throw this._status="error",this.emit("error","Unable to parse OpenAPI specifications"),new Error("Invalid OpenAPI specification data format");this._spec=spec,!this._agentId&&_settings?.agentId&&(this._agentId=_settings.agentId),this._agentId||(this._agentId="FAKE-AGENT-ID"),await this.assignTeamIdFromAgentId(this._agentId),await this.updateModel(this._model),this._status="ready"}).catch(error=>{this._status="error",this.emit("error",error)}):(await this.updateModel(this._model),this._status="ready"))()}get agentId(){return this._agentId}get systemPrompt(){return this._systemPrompt}set systemPrompt(systemPrompt){this._systemPrompt=systemPrompt,this._context&&(this._context.systemPrompt=systemPrompt)}get id(){return this._id}get context(){return this._context}set spec(specSource){this.ready.then(()=>{this._status="",this._currentWaitPromise=void 0,this.loadSpecFromSource(specSource).then(async spec=>{if(!spec)throw this._status="error",this.emit("error","Invalid OpenAPI specification data format"),new Error("Invalid OpenAPI specification data format");this._spec=spec,await this.assignTeamIdFromAgentId(this._agentId),await this.updateModel(this._model),this._status="ready"})})}set model(model){this.ready.then(async()=>{this._status="",await this.updateModel(model),this._status="ready"})}get model(){return this._model}get llmInference(){return this._llmInference}get ready(){return this._currentWaitPromise?this._currentWaitPromise:(this._currentWaitPromise=new Promise((resolve,reject)=>{if(this._status)return resolve(this._status);const maxWaitTime=3e4;let waitTime=0;const interval=100,wait=setInterval(()=>{if(this._status)return clearInterval(wait),resolve(this._status);if(waitTime+=interval,waitTime>=maxWaitTime)return clearInterval(wait),reject("Timeout: Failed to prepare data")},interval)}),this._currentWaitPromise)}async prompt(message,toolHeaders={},concurrentToolCalls=4,abortSignal){let error=null;const errListener=err=>error=err;this.once("error",errListener);const result=await this.streamPrompt(message,toolHeaders,concurrentToolCalls,abortSignal);if(error)throw error;return this.removeListener("error",errListener),result}async streamPrompt(message,toolHeaders={},concurrentToolCalls=4,abortSignal){let options=typeof message=="object"?message:{message};message=options?.message;const files=options?.files;if(message&&(this.stop=!1),this.stop){this.emit("interrupted","interrupted"),this.emit("end");return}await this.ready,abortSignal&&abortSignal.addEventListener("abort",()=>{this.emit("aborted","Aborted by user!")});const passThroughtContinueMessage="Continue with the next tool call if there are any, or just inform the user that you are done";let _content="";const reqMethods=this._reqMethods,toolsConfig=this._toolsConfig,endpoints=this._endpoints,baseUrl=this._baseUrl,message_id="msg_"+randomUUID();toolHeaders["X-DEBUG"],message&&this._context.addUserMessage(message,message_id);const contextWindow=await this._context.getContextWindow(this._maxContextSize,this._maxOutputTokens);let maxTokens=this._maxOutputTokens;typeof this.model=="object"&&this.model?.params?.maxTokens&&(maxTokens=this.model.params.maxTokens);const llmReqUid=randomUUID();this.emit(TLLMEvent.Requested,{model:typeof this.model=="string"?this.model:this.model?.modelId,contextWindow,files,maxTokens,agentId:this._agentId,requestId:llmReqUid});const eventEmitter=await this.llmInference.promptStream({contextWindow,files,params:{model:this.model,toolsConfig:this._settings?.toolsStrategy?this._settings.toolsStrategy(toolsConfig):toolsConfig,maxTokens,cache:this._settings?.experimentalCache,agentId:this._agentId,abortSignal}}).catch(error=>{console$o.error("Error on promptStream: ",error),this.emit(TLLMEvent.Error,error,{requestId:llmReqUid})});if(abortSignal&&abortSignal.addEventListener("abort",()=>{eventEmitter.removeAllListeners()}),!eventEmitter||eventEmitter.error)throw new Error("[LLM Request Error]");message&&this.emit("start",{requestId:llmReqUid}),eventEmitter.on(TLLMEvent.Thinking,thinking=>{this.stop||this.emit(TLLMEvent.Thinking,thinking,{requestId:llmReqUid})}),eventEmitter.on(TLLMEvent.Data,data=>{this.stop||this.emit(TLLMEvent.Data,data,{contextWindow,requestId:llmReqUid,model:typeof this.model=="string"?this.model:this.model?.modelId})}),eventEmitter.on(TLLMEvent.Content,content=>{this.stop||(_content+=content,this.emit(TLLMEvent.Content,content,{requestId:llmReqUid}))});let finishReason="stop";const toolsContent=await new Promise((resolve,reject)=>{let hasTools=!1,hasError=!1,passThroughContent="";eventEmitter.on(TLLMEvent.Error,error=>{hasError=!0,reject(error)}),eventEmitter.on(TLLMEvent.ToolInfo,async(toolsData,thinkingBlocks=[])=>{if(this.stop)return;hasTools=!0;let llmMessage={role:"assistant",content:_content,tool_calls:[]};thinkingBlocks?.length>0&&(this.emit("thoughtProcess",thinkingBlocks.filter(block=>block.type==="thinking").map(block=>block.thinking||"").join(`
|
|
25
25
|
`)),llmMessage.thinkingBlocks=thinkingBlocks),toolsData.forEach(tool=>{tool.status=tool.name?this._toolStatusMap?.[tool.name]:void 0}),toolsData.content=_content,toolsData.requestId=llmReqUid,toolsData.contextWindow=contextWindow,llmMessage.tool_calls=toolsData.map(tool=>({id:tool.id,type:tool.type,function:{name:tool.name,arguments:tool.arguments}})),this.emit(TLLMEvent.ToolInfo,toolsData);const _agentCallback=data=>{if(this.stop)return;let content="",thinking="";if(typeof data=="object"){data.content&&(content=data.content,passThroughContent+=content,eventEmitter.emit(TLLMEvent.Content,content)),data.thinking&&(thinking=data.thinking,eventEmitter.emit(TLLMEvent.Thinking,thinking));return}typeof data=="string"&&(passThroughContent+=data,eventEmitter.emit(TLLMEvent.Content,data))},toolProcessingTasks=toolsData.map(tool=>async()=>{const endpoint=endpoints?.get(tool?.name)||tool?.name;let args=typeof tool?.arguments=="string"?JSONContent(tool?.arguments).tryParse()||{}:tool?.arguments;if(args?.error)throw new Error(`[Tool] Arguments Parsing Error
|
|
26
26
|
`+JSON.stringify({message:args?.error}));this.emit("beforeToolCall",{tool,args},llmMessage);const status=tool.name?this._toolStatusMap?.[tool.name]:void 0;this.emit(TLLMEvent.ToolCall,{tool,status,_llmRequest:llmMessage,requestId:llmReqUid});const toolArgs={type:tool?.type,method:reqMethods?.get(tool?.name),endpoint,args,baseUrl,headers:toolHeaders,agentCallback:_agentCallback};let{data:functionResponse,error}=await this.useTool(toolArgs,abortSignal);error&&(functionResponse=typeof error=="object"&&typeof error!==null?JSON.stringify(error):error);const result=functionResponse;return functionResponse=typeof functionResponse=="object"&&typeof functionResponse!==null?JSON.stringify(functionResponse):functionResponse,this.emit("afterToolCall",{tool,args},functionResponse),this.emit(TLLMEvent.ToolResult,{tool,result,requestId:llmReqUid}),{...tool,result:functionResponse}}),processedToolsData=await processWithConcurrencyLimit(toolProcessingTasks,concurrentToolCalls);passThroughContent?this._context.addToolMessage(llmMessage,processedToolsData,message_id,{passThrough:!0}):this._context.addToolMessage(llmMessage,processedToolsData,message_id),this.streamPrompt(null,toolHeaders,concurrentToolCalls,abortSignal).then(resolve).catch(reject)}),eventEmitter.on(TLLMEvent.End,async(toolsData,usage_data,_finishReason)=>{if(_finishReason&&(finishReason=_finishReason),usage_data&&this.emit(TLLMEvent.Usage,usage_data,{requestId:llmReqUid}),!hasError&&(!hasTools||passThroughContent)){const lastMessage=this._context?.messages?.[this._context?.messages?.length-1];let metadata;lastMessage?.content?.includes(passThroughtContinueMessage)&&lastMessage?.__smyth_data__?.internal&&(metadata={internal:!0}),this._context.addAssistantMessage(_content,message_id,metadata),resolve("")}})}).catch(error=>(console$o.error("Error in toolsPromise: ",error),this.emit(TLLMEvent.Error,error,{requestId:llmReqUid}),""));return _content+=toolsContent,message&&(finishReason!=="stop"&&this.emit(TLLMEvent.Interrupted,finishReason,{requestId:llmReqUid}),this.emit(TLLMEvent.End,{requestId:llmReqUid})),_content}resolveToolEndpoint(baseUrl,method,endpoint,params){let templateParams={};if(params){const parameters=this._spec?.paths?.[endpoint]?.[method.toLowerCase()]?.parameters||[];for(let p of parameters)p.in==="path"&&(templateParams[p.name]=params[p.name]||"",delete params[p.name])}const parsedEndpoint=TemplateString(endpoint).parse(templateParams,Match.singleCurly).clean().result,url=new URL(parsedEndpoint,baseUrl);return Object.keys(params).forEach(key=>{url.searchParams.append(key,params[key])}),url.toString()}async useTool(params,abortSignal){if(this.stop)return{data:null,error:"Conversation Interrupted"};const{type,endpoint,args,method,baseUrl,headers={},agentCallback}=params;if(type==="function"){const toolHandler=this._customToolsHandlers[endpoint];if(toolHandler)try{return{data:await toolHandler(args),error:null}}catch(error){return{data:null,error:error?.message||"Custom tool handler failed"}}try{const url=this.resolveToolEndpoint(baseUrl,method,endpoint,method=="get"?args:{}),reqConfig={method,url,headers:{...headers},signal:abortSignal};method!=="get"&&(Object.keys(args).length&&(reqConfig.data=args),reqConfig.headers["Content-Type"]="application/json"),console$o.debug("Calling tool: ",reqConfig),reqConfig.headers["X-CACHE-ID"]=this._context?.llmCache?.id;const canRunLocally=reqConfig.url.includes("localhost")||reqConfig.headers["X-AGENT-ID"],requiresRemoteCall=reqConfig.headers["X-DEBUG"]!==void 0||reqConfig.headers["X-MONITOR-ID"]!==void 0||reqConfig.headers["x-conversation-id"]!==void 0;if(reqConfig.headers["x-conversation-id"]||(reqConfig.headers["x-conversation-id"]=this.id),canRunLocally&&!requiresRemoteCall){console$o.log("RUNNING AGENT LOCALLY");let agentProcess;return this.agentData===this._specSource?agentProcess=AgentProcess.load(this.agentData,this._agentVersion):agentProcess=AgentProcess.load(reqConfig.headers["X-AGENT-ID"]||this._agentId,reqConfig.headers["X-AGENT-VERSION"]||this._agentVersion),{data:(await agentProcess.run(reqConfig,agentCallback)).data,error:null}}else{console$o.log("RUNNING AGENT REMOTELY");let eventSource;if(reqConfig.headers["X-DEBUG"]&&reqConfig.headers["X-AGENT-ID"]||reqConfig.headers["X-MONITOR-ID"]){console$o.log("ATTACHING MONITOR TO REMOTE AGENT CALL");const monitUrl=reqConfig.url.split("/api")[0]+"/agent/"+reqConfig.headers["X-AGENT-ID"]+"/monitor",customFetch=(url2,init)=>fetch(url2,{...init,headers:{...init?.headers||{},...Object.fromEntries(Object.entries(reqConfig.headers).map(([k,v])=>[k,String(v)]))}});eventSource=new EventSource(monitUrl,{fetch:customFetch});let monitorId="";eventSource.addEventListener("init",event=>{monitorId=event.data,console$o.log("monitorId",monitorId),reqConfig.headers["X-MONITOR-ID"]?reqConfig.headers["X-MONITOR-ID"]=`${reqConfig.headers["X-MONITOR-ID"]},${monitorId}`:reqConfig.headers["X-MONITOR-ID"]=monitorId}),eventSource.addEventListener("llm/passthrough/content",event=>{params.agentCallback&¶ms.agentCallback({content:event.data.replace(/\\n/g,`
|
|
27
27
|
`)})}),eventSource.addEventListener("llm/passthrough/thinking",event=>{params.agentCallback&¶ms.agentCallback({thinking:event.data.replace(/\\n/g,`
|
|
@@ -31,12 +31,12 @@ ${this.systemPrompt}`),this.patchSpec(spec2)}const agentDataConnector=ConnectorS
|
|
|
31
31
|
|
|
32
32
|
${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),{});let baseUrl=this._baseUrl||"http://localhost/";baseUrl&&!baseUrl.endsWith("/")&&(baseUrl+="/");const spec=await agentDataConnector.getOpenAPIJSON(agentData,baseUrl,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"&¶m.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"&¶m.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$y([hookAsyncWithContext("Conversation.prompt",async instance=>(await instance.ready,{teamId:instance._teamId,agentId:instance._agentId,model:instance._model,agentData:instance.agentData}))],Conversation.prototype,"prompt"),__decorateClass$y([hookAsyncWithContext("Conversation.streamPrompt",async instance=>(await instance.ready,{teamId:instance._teamId,agentId:instance._agentId,model:instance._model,agentData:instance.agentData}))],Conversation.prototype,"streamPrompt");const inputErrMsg=(type,name)=>`Invalid ${type} value for Input: ${name}`,logger$i=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$i.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$i.warn("Error processing binary input",{key,error:error.message}),null}}async function inferDateType(value,key,agent){const errMsg=`Invalid Date value
|
|
33
33
|
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(`
|
|
34
|
-
`).map(val=>val.trim()).filter(val=>val&&(isUrl(val)||isSmythFsUrl(val)))]);return Array.from(urls)}catch(error){return logger$i.warn("Error extracting URLs from value",{error}),[]}}var __defProp$
|
|
34
|
+
`).map(val=>val.trim()).filter(val=>val&&(isUrl(val)||isSmythFsUrl(val)))]);return Array.from(urls)}catch(error){return logger$i.warn("Error extracting URLs from value",{error}),[]}}var __defProp$1A=Object.defineProperty,__getOwnPropDesc$x=Object.getOwnPropertyDescriptor,__defNormalProp$1A=(obj,key,value)=>key in obj?__defProp$1A(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$x=(decorators,target,key,kind)=>{for(var result=kind>1?void 0:kind?__getOwnPropDesc$x(target,key):target,i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=(kind?decorator(target,key,result):decorator(result))||result);return kind&&result&&__defProp$1A(target,key,result),result},__publicField$1A=(obj,key,value)=>__defNormalProp$1A(obj,typeof key!="symbol"?key+"":key,value),ComponentInputType=(ComponentInputType2=>(ComponentInputType2.Any="Any",ComponentInputType2.Binary="Binary",ComponentInputType2.String="Text",ComponentInputType2.Text="Text",ComponentInputType2.Image="Image",ComponentInputType2.Video="Video",ComponentInputType2.Number="Number",ComponentInputType2.Integer="Integer",ComponentInputType2.Boolean="Boolean",ComponentInputType2.Date="Date",ComponentInputType2.Array="Array",ComponentInputType2.Object="Object",ComponentInputType2))(ComponentInputType||{});let Component=class{constructor(){__publicField$1A(this,"hasReadOutput",!1),__publicField$1A(this,"hasPostProcess",!0),__publicField$1A(this,"alwaysActive",!1),__publicField$1A(this,"exclusive",!1),__publicField$1A(this,"schema",{name:"Component",settings:{},inputs:{}}),__publicField$1A(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");let _input={};for(let[key,value]of Object.entries(input))_input[key]=TemplateString(value).parse(agent.agentVariables).result;_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}async register(componentId,componentSettings,payload){}async unregister(componentId,componentSettings,payload){}};__decorateClass$x([hookAsync("Component.process")],Component.prototype,"process",1),Component=__decorateClass$x([hookableClass],Component);var __defProp$1z=Object.defineProperty,__defNormalProp$1z=(obj,key,value)=>key in obj?__defProp$1z(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1z=(obj,key,value)=>__defNormalProp$1z(obj,key+"",value);class AgentPlugin extends Component{constructor(){super(),__publicField$1z(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:
|
|
35
35
|
`,result,`
|
|
36
36
|
`),{Response:result,_debug:logger2.output}}catch(error){return console.error("Error on running Agent Component: ",error),{_error:`Error on running Agent Component!
|
|
37
|
-
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var __defProp$1x=Object.defineProperty,__defNormalProp$1x=(obj,key,value)=>key in obj?__defProp$1x(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1x=(obj,key,value)=>__defNormalProp$1x(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$1x(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){if(await super.process(input,config2,agent),typeof config2.process=="function"){const contextData=agent?.agentRuntime?.getComponentData(config2.id),inputs=Array.isArray(contextData?.input)?contextData?.input:[contextData?.input];return await config2.process.apply(null,inputs)}const req=agent.agentRequest,logger2=this.createComponentLogger(agent,config2),isTrigger=req.path.startsWith(agent.triggerBasePath),headers=req?req.headers:{};let body=req&&!isTrigger?req.body:input;const params=req&&!isTrigger?req.params:{};let query=req&&!isTrigger?req.query:{};const _authInfo=req?req._agent_authinfo:void 0,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 resolveTemplateVariables(body,input,agent),query=await resolveTemplateVariables(query,input,agent),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}}async postProcess(output,config2,agent){return typeof config2.process=="function"?output?.result:output}}async function resolveTemplateVariables(data,input,agent){for(const[key,value]of Object.entries(data))isKeyTemplateVar(value)?data[key]=await parseKey(value,agent.teamId):isTemplateVar(value)&&(data[key]=TemplateString(value).parse(input).parse(agent.agentVariables).result);return data}var __defProp$1w=Object.defineProperty,__defNormalProp$1w=(obj,key,value)=>key in obj?__defProp$1w(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1w=(obj,key,value)=>__defNormalProp$1w(obj,typeof key!="symbol"?key+"":key,value);class APIOutput extends Component{constructor(){super(),__publicField$1w(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$1w(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$1v=Object.defineProperty,__defNormalProp$1v=(obj,key,value)=>key in obj?__defProp$1v(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1v=(obj,key,value)=>__defNormalProp$1v(obj,key+"",value);Logger("ForkedAgent");class ForkedAgent{constructor(parent,componentId){this.parent=parent,__publicField$1v(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$1u=Object.defineProperty,__defNormalProp$1u=(obj,key,value)=>key in obj?__defProp$1u(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1u=(obj,key,value)=>__defNormalProp$1u(obj,typeof key!="symbol"?key+"":key,value);const _Async=class _Async2 extends Component{constructor(){super(),__publicField$1u(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$1u(_Async,"JOBS",{}),__publicField$1u(_Async,"ForkedAgent");let Async=_Async;var __defProp$1t=Object.defineProperty,__defNormalProp$1t=(obj,key,value)=>key in obj?__defProp$1t(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1t=(obj,key,value)=>__defNormalProp$1t(obj,typeof key!="symbol"?key+"":key,value);const _Await=class _Await2 extends Component{constructor(){super(),__publicField$1t(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
|
|
37
|
+
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var __defProp$1y=Object.defineProperty,__defNormalProp$1y=(obj,key,value)=>key in obj?__defProp$1y(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1y=(obj,key,value)=>__defNormalProp$1y(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$1y(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){if(await super.process(input,config2,agent),typeof config2.process=="function"){const contextData=agent?.agentRuntime?.getComponentData(config2.id),inputs=Array.isArray(contextData?.input)?contextData?.input:[contextData?.input];return await config2.process.apply(null,inputs)}const req=agent.agentRequest,logger2=this.createComponentLogger(agent,config2),isTrigger=req.path.startsWith(agent.triggerBasePath),headers=req?req.headers:{};let body=req&&!isTrigger?req.body:input;const params=req&&!isTrigger?req.params:{};let query=req&&!isTrigger?req.query:{};const _authInfo=req?req._agent_authinfo:void 0,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 resolveTemplateVariables(body,input,agent),query=await resolveTemplateVariables(query,input,agent),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}}async postProcess(output,config2,agent){return typeof config2.process=="function"?output?.result:output}}async function resolveTemplateVariables(data,input,agent){for(const[key,value]of Object.entries(data))isKeyTemplateVar(value)?data[key]=await parseKey(value,agent.teamId):isTemplateVar(value)&&(data[key]=TemplateString(value).parse(input).result);return data}var __defProp$1x=Object.defineProperty,__defNormalProp$1x=(obj,key,value)=>key in obj?__defProp$1x(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1x=(obj,key,value)=>__defNormalProp$1x(obj,typeof key!="symbol"?key+"":key,value);class APIOutput extends Component{constructor(){super(),__publicField$1x(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$1x(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$1w=Object.defineProperty,__defNormalProp$1w=(obj,key,value)=>key in obj?__defProp$1w(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1w=(obj,key,value)=>__defNormalProp$1w(obj,key+"",value);Logger("ForkedAgent");class ForkedAgent{constructor(parent,componentId){this.parent=parent,__publicField$1w(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$1v=Object.defineProperty,__defNormalProp$1v=(obj,key,value)=>key in obj?__defProp$1v(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1v=(obj,key,value)=>__defNormalProp$1v(obj,typeof key!="symbol"?key+"":key,value);const _Async=class _Async2 extends Component{constructor(){super(),__publicField$1v(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$1v(_Async,"JOBS",{}),__publicField$1v(_Async,"ForkedAgent");let Async=_Async;var __defProp$1u=Object.defineProperty,__defNormalProp$1u=(obj,key,value)=>key in obj?__defProp$1u(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1u=(obj,key,value)=>__defNormalProp$1u(obj,typeof key!="symbol"?key+"":key,value);const _Await=class _Await2 extends Component{constructor(){super(),__publicField$1u(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
|
|
38
38
|
${_error}
|
|
39
|
-
`),delete _Await2.WAITS[agent.id][config2.id][agent.agentRuntime.workflowReqId],{Output:void 0,_error,_debug:logger2.output,_debug_time:logger2.elapsedTime}}}};__publicField$
|
|
39
|
+
`),delete _Await2.WAITS[agent.id][config2.id][agent.agentRuntime.workflowReqId],{Output:void 0,_error,_debug:logger2.output,_debug_time:logger2.elapsedTime}}}};__publicField$1u(_Await,"WAITS",{});let Await=_Await;var __defProp$1t=Object.defineProperty,__defNormalProp$1t=(obj,key,value)=>key in obj?__defProp$1t(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1t=(obj,key,value)=>__defNormalProp$1t(obj,typeof key!="symbol"?key+"":key,value);class Classifier extends Component{constructor(){super(),__publicField$1t(this,"schema",{name:"Classifier",settings:{model:{type:"string",max:200,required:!0},prompt:{type:"string",max:3e4,allow:"",label:"Prompt"}},inputs:{Input:{type:"Any",default:!0}}}),__publicField$1t(this,"configSchema",Joi.object({model:Joi.string().max(200).required(),prompt:Joi.string().max(3e4).allow("").label("Prompt")}))}init(){}escapeJSONString(str){return str.replace(/\{/g,"<[<(").replace(/\}/g,")>]>").replace(/"/g,"`")}unescapeJSONString(str){return str.replace(/<\[<\(/g,"{").replace(/\)>]>/g,"}").replace(/`/g,'"')}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2),inputCopy=JSON.parse(JSON.stringify(input));for(let key in inputCopy)typeof inputCopy[key]=="string"?inputCopy[key]=this.escapeJSONString(inputCopy[key]):typeof inputCopy[key]=="object"&&(inputCopy[key]=JSON.stringify(inputCopy[key]),inputCopy[key]=this.escapeJSONString(inputCopy[key]));const _input=typeof input=="string"?input:JSON.stringify(inputCopy,null,2),categories={};for(let con of config2.outputs)categories[con.name]=con.description||"";const outputs={};for(let con of config2.outputs)outputs[con.name]="<Boolean|String>";const model=config2.data.model,modelId=await agent.modelsProvider.getModelId(model);logger2.log(` Selected model : ${modelId||model}`);let prompt="";const excludedKeys=["_debug","_error"],outputKeys=Object.keys(outputs).filter(key=>!excludedKeys.includes(key));if(outputKeys.length>0&&(outputKeys.forEach(key=>outputs[key]),prompt=`${config2.data.prompt}
|
|
40
40
|
${_input}
|
|
41
41
|
|
|
42
42
|
---
|
|
@@ -46,84 +46,124 @@ ${prompt}
|
|
|
46
46
|
`),!prompt)return logger2.error(" Missing information, Cannot run classifier"),{_error:"Missing information, Cannot run classifier",_debug:logger2.output};const llmInference=await LLMInference$1.getInstance(model||"echo",AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};try{let response=await llmInference.prompt({query:prompt,params:{...config2,agentId:agent.id},onFallback:data=>{logger2.debug(`
|
|
47
47
|
\u21A9\uFE0F Using Fallback Model: ${data.model}`)}}).catch(error=>({error}));if(response?.error){const error=response?.error+" "+(response?.details||"");return logger2.error(" LLM Error=",error),{_error:error,_debug:logger2.output}}let parsed=typeof response=="string"?JSONContentHelper.create(response).tryParse():response;for(let entry in parsed)if(!parsed[entry])delete parsed[entry];else if(typeof parsed[entry]=="string"){parsed[entry]=this.unescapeJSONString(parsed[entry]);const parsedValue=JSONContentHelper.create(parsed[entry]).tryParse();typeof parsedValue=="object"&&!parsedValue.error&&(parsed[entry]=parsedValue)}return parsed.error&&(parsed._error=parsed.error,logger2.warn(` Post process error=${parsed.error}`),delete parsed.error),logger2.debug(`
|
|
48
48
|
Classifier result
|
|
49
|
-
`,parsed),parsed._debug=logger2.output,parsed}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$
|
|
50
|
-
`:null;try{const _config={...config2.data,name:TemplateString(config2.data.name).parse(input).result,id:TemplateString(config2.data.id).parse(input).result,metadata:TemplateString(config2.data.metadata).parse(input).result},outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?`<${con?.description}>`:"");const namespaceId=_config.namespace.split("_").slice(1).join("_")||_config.namespace;debugOutput+=`[Selected namespace id]
|
|
51
|
-
${namespaceId}
|
|
52
|
-
|
|
53
|
-
`;const vectorDbConnector=ConnectorService.getVectorDBConnector();if(!await vectorDbConnector.requester(AccessCandidate.team(teamId)).namespaceExists(namespaceId)){const newNs=await vectorDbConnector.requester(AccessCandidate.team(teamId)).createNamespace(namespaceId);debugOutput+=`[Created namespace]
|
|
54
|
-
${newNs}
|
|
55
|
-
|
|
56
|
-
`}const inputSchema=this.validateInput(input);if(inputSchema.error)throw new Error(`Input validation error: ${inputSchema.error}
|
|
57
|
-
EXITING...`);const providedId=_config.id,idRegex=/^[a-zA-Z0-9\-\_\.]+$/;if(providedId){if(!idRegex.test(providedId))throw new Error("Invalid id. Accepted characters: 'a-z', 'A-Z', '0-9', '-', '_', '.'")}else throw new Error("Id is required");let indexRes=null,parsedUrlArray=null;//! DISABLE URL ARRAY PARSING FOR NOW UNTIL WE HAVE A GOOD WAY TO HANDLE BULK INDEXING
|
|
58
|
-
const dsId=DataSourceIndexer.genDsId(providedId,teamId,namespaceId);if(isUrl(inputSchema.value.Source))throw debugOutput+=`STEP: Parsing input as url
|
|
59
|
-
|
|
60
|
-
`,new Error("URLs are not supported yet");return debugOutput+=`STEP: Parsing input as text
|
|
61
|
-
|
|
62
|
-
`,indexRes=await this.addDSFromText({teamId,namespaceId,text:inputSchema.value.Source,name:_config.name||"Untitled",metadata:_config.metadata||null,sourceId:dsId}),debugOutput+=`Created datasource successfully
|
|
63
|
-
|
|
64
|
-
`,{_debug:debugOutput,Success:{result:indexRes?.data?.dataSource||!0,id:_config.id}}}catch(err){return debugOutput+=`Error: ${err?.message||"Couldn't index data source"}
|
|
65
|
-
|
|
66
|
-
`,{_debug:debugOutput,_error:err?.message||"Couldn't index data source"}}}validateInput(input){return Joi.object({Source:Joi.any().required()}).unknown(!0).validate(input)}async addDSFromText({teamId,sourceId,namespaceId,text,name,metadata}){return await ConnectorService.getVectorDBConnector().requester(AccessCandidate.team(teamId)).createDatasource(namespaceId,{text,metadata,id:sourceId,label:name})}static genDsId(providedId,teamId,namespaceId){return`${teamId}::${namespaceId}::${providedId}`}async addDSFromUrl({teamId,namespaceId,dsId,type,url,name,metadata}){throw new Error("URLs are not supported yet")}}var __defProp$1p=Object.defineProperty,__defNormalProp$1p=(obj,key,value)=>key in obj?__defProp$1p(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1p=(obj,key,value)=>__defNormalProp$1p(obj,key+"",value);class DataSourceCleaner extends Component{constructor(){super(),__publicField$1p(this,"configSchema",Joi.object({namespaceId:Joi.string().max(50).allow("").label("namespace"),id:Joi.string().custom(validateCharacterSet,"custom validation characterSet").allow("").label("source identifier")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const teamId=agent.teamId;agent.id;let debugOutput=agent.agentRuntime?.debug?`== Source Indexer Log ==
|
|
67
|
-
`:null;try{const configSchema=this.validateConfigData(config2.data);if(configSchema.error)throw new Error(`Config data validation error: ${configSchema.error}
|
|
68
|
-
EXITING...`);const outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?`<${con?.description}>`:"");const inputSchema=this.validateInput(input);if(inputSchema.error)throw new Error(`Input validation error: ${inputSchema.error}
|
|
69
|
-
EXITING...`);const namespaceId=configSchema.value.namespaceId.split("_")?.slice(1).join("_")||configSchema.value.namespaceId;let vectorDbConnector=ConnectorService.getVectorDBConnector();if(!await vectorDbConnector.requester(AccessCandidate.team(teamId)).namespaceExists(namespaceId))throw new Error(`Namespace ${namespaceId} does not exist`);const providedId=TemplateString(config2.data.id).parse(input).result;if(!/^[a-zA-Z0-9\-\_\.]+$/.test(providedId))throw new Error("Invalid id. Accepted characters: 'a-z', 'A-Z', '0-9', '-', '_', '.'");debugOutput+=`Searching for data source with id: ${providedId}
|
|
70
|
-
`;const dsId=DataSourceIndexer.genDsId(providedId,teamId,namespaceId);return await vectorDbConnector.requester(AccessCandidate.team(teamId)).deleteDatasource(namespaceId,dsId),debugOutput+=`Deleted data source with id: ${providedId}
|
|
71
|
-
`,{_debug:debugOutput,Success:!0}}catch(err){return debugOutput+=`Failed to delete data source:
|
|
72
|
-
Error: ${err?.message}
|
|
73
|
-
`,{_debug:debugOutput,_error:err?.message||"Couldn't delete data source"}}}validateInput(input){return Joi.object({}).unknown(!0).validate(input)}validateConfigData(data){return Joi.object({namespaceId:Joi.string().required(),id:Joi.string().optional().allow("").allow(null)}).unknown(!0).validate(data)}}var __defProp$1o=Object.defineProperty,__defNormalProp$1o=(obj,key,value)=>key in obj?__defProp$1o(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1o=(obj,key,value)=>__defNormalProp$1o(obj,key+"",value);class LLMInference2{static async getInstance(model){throw new Error("Method not implemented.")}}class DataSourceLookup extends Component{constructor(){super(),__publicField$1o(this,"configSchema",Joi.object({topK:Joi.alternatives([Joi.string(),Joi.number()]).custom(validateInteger$2({min:0}),"custom range validation").label("Result Count"),model:Joi.string().valid("gpt-4o-mini","gpt-4","gpt-3.5-turbo","gpt-4","gpt-3.5-turbo-16k").optional(),prompt:Joi.string().max(3e4).allow("").label("Prompt").optional(),postprocess:Joi.boolean().strict().optional(),includeMetadata:Joi.boolean().strict().optional(),namespace:Joi.string().allow("").max(80).messages({"string.max":"The length of the 'namespace' name must be 50 characters or fewer."}),scoreThreshold:Joi.number().optional().label("Score Threshold"),includeScore:Joi.boolean().optional().label("Include Score")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const componentId=config2.id;agent.components[componentId];const teamId=agent.teamId;let debugOutput=agent.agentRuntime?.debug?`== Data Source Lookup Log ==
|
|
74
|
-
`:null;const outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]="");const namespace=config2.data.namespace.split("_").slice(1).join("_")||config2.data.namespace,model=config2.data?.model||"gpt-4o-mini",prompt=config2.data?.prompt?.trim?.()||"",postprocess=config2.data?.postprocess||!1,includeMetadata=config2.data?.includeMetadata||!1,scoreThreshold=config2.data?.scoreThreshold||.001,includeScore=config2.data?.includeScore||!1,_input=typeof input.Query=="string"?input.Query:JSON.stringify(input.Query),topK=Math.max(config2.data?.topK||50,50);let vectorDbConnector=ConnectorService.getVectorDBConnector();if(!await vectorDbConnector.requester(AccessCandidate.team(teamId)).namespaceExists(namespace))throw new Error(`Namespace ${namespace} does not exist`);let results,_error;try{results=(await vectorDbConnector.requester(AccessCandidate.team(teamId)).search(namespace,_input,{topK,includeMetadata:!0})).slice(0,config2.data.topK).map(result=>({content:result.text,metadata:result.metadata,score:result.score})),results=results.filter(result=>result.score>=scoreThreshold),results=results.map(result=>{const transformedResult={content:result.content};return includeMetadata&&(transformedResult.metadata=this.parseMetadata(result.metadata||result.metadata?.metadata)),includeScore&&(transformedResult.score=result.score),includeMetadata||includeScore?transformedResult:result.content}),debugOutput+=`[Results]
|
|
75
|
-
Loaded ${results.length} results from namespace: ${namespace}
|
|
76
|
-
|
|
77
|
-
`}catch(error){_error=error.toString()}if(postprocess&&prompt){const promises=[];for(let result of results)TemplateString(prompt.replace(/{{result}}/g,JSON.stringify(result))).parse(input).result,await LLMInference2.getInstance(model);results=await Promise.all(promises);for(let i=0;i<results.length;i++)typeof results[i]=="string"&&(results[i]=JSONContent(results[i]).tryParse())}const totalLength=JSON.stringify(results).length;return debugOutput+=`[Total Length]
|
|
78
|
-
${totalLength}
|
|
79
|
-
|
|
80
|
-
`,{Results:results,_error,_debug:debugOutput}}parseMetadata(metadata){try{return JSON.parse(jsonrepair(metadata))}catch{return metadata}}}class FEncDec extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const data=input.Data,action=config2.data.action||"Encode",encoding=config2.data.encoding;return logger2.debug(`${encoding} ${action} data`),{Output:action=="Encode"?Buffer.from(data).toString(encoding):Buffer.from(data,encoding).toString("utf8"),_error:void 0,_debug:logger2.output}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error processing data
|
|
49
|
+
`,parsed),parsed._debug=logger2.output,parsed}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$1s=Object.defineProperty,__defNormalProp$1s=(obj,key,value)=>key in obj?__defProp$1s(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1s=(obj,key,value)=>__defNormalProp$1s(obj,key+"",value);class ComponentHost extends Component{constructor(){super(),__publicField$1s(this,"configSchema",null)}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const componentName=config2.data._component,component=await ConnectorService.getComponentConnector().requester(AccessCandidate.agent(agent.id)).get(componentName);return component?await component.process(input,config2,agent):(logger2.debug(`Component ${componentName} not found`),{_error:`Component ${componentName} not found`,_debug:logger2.output})}catch(error){return{_error:error.message,_debug:logger2.output}}}}class FEncDec extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const data=input.Data,action=config2.data.action||"Encode",encoding=config2.data.encoding;return logger2.debug(`${encoding} ${action} data`),{Output:action=="Encode"?Buffer.from(data).toString(encoding):Buffer.from(data,encoding).toString("utf8"),_error:void 0,_debug:logger2.output}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error processing data
|
|
81
50
|
${_error}
|
|
82
51
|
`),{hash:void 0,_error,_debug:logger2.output}}}}class FHash extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const data=input.Data,algorithm=config2.data.algorithm,encoding=config2.data.encoding;logger2.debug(` Generating hash using ${algorithm} algorithm and ${encoding} encoding`);const hashAlgo=crypto$1.createHash(algorithm);hashAlgo.update(data);const Hash=hashAlgo.digest(encoding);return logger2.debug(` Generated hash: ${Hash}`),{Hash,_error:void 0,_debug:logger2.output}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error generating hash
|
|
83
52
|
${_error}
|
|
84
|
-
`),{hash:void 0,_error,_debug:logger2.output}}}}var __defProp$
|
|
53
|
+
`),{hash:void 0,_error,_debug:logger2.output}}}}var __defProp$1r=Object.defineProperty,__defNormalProp$1r=(obj,key,value)=>key in obj?__defProp$1r(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1r=(obj,key,value)=>__defNormalProp$1r(obj,key+"",value);class FileStore extends Component{constructor(){super(),__publicField$1r(this,"configSchema",Joi.object({name:Joi.string().max(1e3).allow("").label("Name"),ttl:Joi.number().integer().label("TTL")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== File Store Log ===");let Output={},_error,data=input.Data;const accessCandidate=AccessCandidate.agent(agent.id),binaryData=await BinaryInput.from(data,null,null,accessCandidate),fileData=await binaryData.getJsonData(accessCandidate),buffer=await binaryData.getBuffer(),customFileName=TemplateString(config2.data.name).parse(input).result,metadata={ContentType:fileData.mimetype},ttl=config2.data.ttl||86400,extension=fileData.url?.split(".").pop(),s3StorageConnector=ConnectorService.getStorageConnector("S3"),fileName=this.getFileName(customFileName,extension);try{const smythFSUrl=`smythfs://${agent.id}.agent/components_data/${fileName}`;await SmythFS.Instance.write(smythFSUrl,buffer,null,metadata,ttl),Output={Url:await SmythFS.Instance.genResourceUrl(smythFSUrl,AccessCandidate.agent(agent.id))}}catch(error){logger2.error(`Error saving file
|
|
85
54
|
${error}
|
|
86
55
|
`),_error=error?.response?.data||error?.message||error.toString(),Output=void 0}return{...Output,_error,_debug:logger2.output}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error saving file
|
|
87
56
|
${_error}
|
|
88
|
-
`),{Output:void 0,_error,_debug:logger2.output}}}getExtension(mimeType){return mimeType.split("/")[1]}getFileName(customName,extension){return`${btoa(String.fromCharCode(...crypto.getRandomValues(new Uint8Array(9)))).replace(/[+/=]/g,"")}${customName?`.${customName}`:""}.${extension}`}}var __defProp$
|
|
57
|
+
`),{Output:void 0,_error,_debug:logger2.output}}}getExtension(mimeType){return mimeType.split("/")[1]}getFileName(customName,extension){return`${btoa(String.fromCharCode(...crypto.getRandomValues(new Uint8Array(9)))).replace(/[+/=]/g,"")}${customName?`.${customName}`:""}.${extension}`}}var __defProp$1q=Object.defineProperty,__defNormalProp$1q=(obj,key,value)=>key in obj?__defProp$1q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1q=(obj,key,value)=>__defNormalProp$1q(obj,key+"",value);class ForEach extends Component{constructor(){super(),__publicField$1q(this,"configSchema",null)}init(){}async process(input,config2,agent){await super.process(input,config2,agent);let Loop={},Result,_temp_result,_error=null,_in_progress=!0;const logger2=this.createComponentLogger(agent,config2);try{const inputObject=input.Input;let inputArray;Array.isArray(inputObject)?inputArray=inputObject:typeof inputObject=="string"?inputArray=inputObject.trim().startsWith("[")?JSONContent(inputObject).tryParse():inputObject.split(","):inputArray=[inputObject],!Array.isArray(inputArray)&&typeof inputArray=="object"&&(inputArray=Object.values(inputArray));const _ForEachData=agent.agentRuntime.getRuntimeData(config2.id)._LoopData||{parentId:config2.id,loopIndex:0,loopLength:inputArray.length};logger2.debug(`Loop: ${_ForEachData.loopIndex} / ${_ForEachData.loopLength}`),delete _ForEachData.branches,_ForEachData.result&&(_temp_result=_ForEachData.result,logger2.debug(` => Loop Result : ${JSON.stringify(Loop,null,2)}`),logger2.debug("---------------------------------------------------")),Loop=inputArray[_ForEachData.loopIndex],logger2.debug(` => Loop Data : ${JSON.stringify(Loop,null,2)}`),_in_progress=Loop!==void 0,_in_progress&&_ForEachData.loopIndex++,_ForEachData._in_progress=_in_progress,agent.agentRuntime.updateRuntimeData(config2.id,{_LoopData:_ForEachData})}catch(error){_error=error,logger2.error(error)}if(!_in_progress)switch(Result=_temp_result||[],config2?.data?.format){case"minimal":Result=Result.map(item=>cleanupResult$1(item.result));break;case"results-array":Result=Result.map(item=>Object.values(cleanupResult$1(item.result))).flat(1/0);break}return{Loop,Result,_temp_result,_error,_in_progress,_debug:logger2.output}}async postProcess(output,config2,agent){return output=await super.postProcess(output,config2,agent),output?.result&&(delete output.result._temp_result,delete output.result._in_progress,delete output.result.Loop),output}}function cleanupResult$1(result){return typeof result!="object"||(result._debug&&delete result._debug,result._error&&delete result._error,result._temp_result&&delete result._temp_result,result._in_progress&&delete result._in_progress),result}class FSign extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const teamId=agent?agent.teamId:null;let data=input.Data,signingKey=input.Key||config2.data.key;signingKey=await TemplateString(signingKey).parse(input).parseTeamKeysAsync(teamId).asyncResult;const signMethod=config2.data.signMethod||"HMAC",dataTransform=config2.data.dataTransform||"None",hashType=config2.data.hashType||"md5",RSA_padding=config2.data.RSA_padding,RSA_saltLength=config2.data.RSA_saltLength,encoding=config2.data.encoding||"hex";if(typeof data!="string")switch(dataTransform){case"Stringify":data=JSON.stringify(data);break;case"Querystring":data=querystring.stringify(data);break}logger2.debug(" Data to sign = ",data),logger2.debug(` Signing data using ${signMethod} algorithm and ${encoding} encoding`);const Signature=this.signData(data,signingKey,signMethod,encoding,{hashType,RSA_padding,RSA_saltLength});return logger2.debug(` Signature generated: ${Signature}`),{Signature,_error:void 0,_debug:logger2.output}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error generating hash
|
|
89
58
|
${_error}
|
|
90
59
|
`),{hash:void 0,_error,_debug:logger2.output}}}signData(data,key,signMethod,encoding="hex",options={}){switch(signMethod){case"RSA":const algo=`${signMethod}-${options.hashType||"md5"}`.toUpperCase(),sign=crypto$1.createSign(algo);sign.update(data);const sign_options={key,padding:options.RSA_padding?crypto$1.constants[options.RSA_padding]:void 0,saltLength:options.RSA_saltLength?crypto$1.constants[options.RSA_saltLength]:void 0};return sign.sign(sign_options,encoding.toLowerCase());case"HMAC":const hmac=crypto$1.createHmac(options.hashType,key);return hmac.update(data),hmac.digest(encoding)}return null}}class FSleep extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const delay2=parseInt(config2.data.delay||1),Output=input.Input;return logger2.debug(`Sleeping for ${delay2} seconds`),await new Promise(resolve=>setTimeout(resolve,delay2*1e3)),{Output,_error:void 0,_debug:logger2.output,_debug_time:logger2.elapsedTime}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error processing data
|
|
91
60
|
${_error}
|
|
92
|
-
`),{hash:void 0,_error,_debug:logger2.output,_debug_time:logger2.elapsedTime}}}}var __defProp$
|
|
61
|
+
`),{hash:void 0,_error,_debug:logger2.output,_debug_time:logger2.elapsedTime}}}}var __defProp$1p=Object.defineProperty,__defNormalProp$1p=(obj,key,value)=>key in obj?__defProp$1p(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1p=(obj,key,value)=>__defNormalProp$1p(obj,key+"",value);class FTimestamp extends Component{constructor(){super(),__publicField$1p(this,"configSchema",Joi.object({format:Joi.alternatives().try(Joi.string().valid("unix","iso","timestamp"),Joi.string().pattern(/^[YMDHhmsSSZzAa\s\-\/:,\.]*$/,"custom dayjs format")).default("unix").allow(null).label("Timestamp Format").messages({"string.pattern.name":"Invalid format string: {#value}"})}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2),validationResult=await this.validateConfig(config2);if(validationResult._error)return{Timestamp:void 0,_error:validationResult._error,_debug:logger2.output,_debug_time:logger2.elapsedTime};try{const format=config2.data.format||"unix",now=dayjs();let Timestamp;switch(format){case"unix":case"timestamp":Timestamp=Date.now(),logger2.debug(`Unix timestamp: ${Timestamp}`);break;case"iso":Timestamp=now.toISOString(),logger2.debug(`ISO timestamp: ${Timestamp}`);break;default:Timestamp=now.format(format),logger2.debug(`Custom formatted timestamp (${format}): ${Timestamp}`);break}return{Timestamp,_error:void 0,_debug:logger2.output,_debug_time:logger2.elapsedTime}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error processing timestamp
|
|
93
62
|
${_error}
|
|
94
|
-
`),{Timestamp:void 0,_error,_debug:logger2.output,_debug_time:logger2.elapsedTime}}}}var __defProp$
|
|
63
|
+
`),{Timestamp:void 0,_error,_debug:logger2.output,_debug_time:logger2.elapsedTime}}}}var __defProp$1o=Object.defineProperty,__defNormalProp$1o=(obj,key,value)=>key in obj?__defProp$1o(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1o=(obj,key,value)=>__defNormalProp$1o(obj,typeof key!="symbol"?key+"":key,value);class GenAILLM extends Component{constructor(){super(),__publicField$1o(this,"schema",{name:"GenAILLM",description:"Use this component to generate a responses from an LLM",settings:{model:{type:"string",max:200,required:!0},prompt:{type:"string",max:8e6,label:"Prompt"},temperature:{type:"number",min:0,max:5,label:"Temperature"},maxTokens:{type:"number",min:1,label:"Maximum Tokens"},stopSequences:{type:"string",max:400,label:"Stop Sequences",allowEmpty:!0},topP:{type:"number",min:0,max:1,label:"Top P"},topK:{type:"number",min:0,max:500,label:"Top K"},frequencyPenalty:{type:"number",min:0,max:2,label:"Frequency Penalty"},presencePenalty:{type:"number",min:0,max:2,label:"Presence Penalty"},responseFormat:{type:"string",valid:["json","text"],label:"Response Format"},passthrough:{type:"boolean",description:"If true, the LLM response will be returned as is by the agent",label:"Passthrough"},useSystemPrompt:{type:"boolean",description:"If true, the component will use parent agent system prompt",label:"Use System Prompt"},useContextWindow:{type:"boolean",description:"If true, the component will use parent agent context window",label:"Use Context Window"},maxContextWindowLength:{type:"number",min:0,description:"The maximum number of messages to use from this component context window (if useContextWindow is true)",label:"Maximum Context Window Length"},useWebSearch:{type:"boolean",description:"If true, the component will use web search for additional context",label:"Use Web Search"},webSearchContextSize:{type:"string",valid:["high","medium","low"],label:"Web Search Context Size"},webSearchCity:{type:"string",max:100,label:"Web Search City",allowEmpty:!0},webSearchCountry:{type:"string",max:2,label:"Web Search Country",allowEmpty:!0},webSearchRegion:{type:"string",max:100,label:"Web Search Region",allowEmpty:!0},webSearchTimezone:{type:"string",max:100,label:"Web Search Timezone",allowEmpty:!0},useSearch:{type:"boolean",description:"If true, the component will use xAI live search capabilities",label:"Use Search",allowEmpty:!0},searchMode:{type:"string",valid:["auto","on","off"],label:"Search Mode",allowEmpty:!0},returnCitations:{type:"boolean",description:"If true, include citations and sources in the response",label:"Return Citations",allowEmpty:!0},maxSearchResults:{type:"number",min:1,max:50,label:"Max Search Results",allowEmpty:!0},searchDataSources:{type:"array",max:4,label:"Search Data Sources",allowEmpty:!0},searchCountry:{type:"string",max:2,label:"Search Country",allowEmpty:!0},excludedWebsites:{type:"string",max:1e4,label:"Excluded Websites",allowEmpty:!0},allowedWebsites:{type:"string",max:1e4,label:"Allowed Websites",allowEmpty:!0},includedXHandles:{type:"string",max:1e3,label:"Included X Handles",allowEmpty:!0},excludedXHandles:{type:"string",max:1e3,label:"Excluded X Handles",allowEmpty:!0},postFavoriteCount:{type:"number",min:0,max:1e9,label:"Post Favorite Count",allowEmpty:!0},postViewCount:{type:"number",min:0,max:1e9,label:"Post View Count",allowEmpty:!0},link:{type:"string",max:5e3,label:"RSS Link",allowEmpty:!0},safeSearch:{type:"boolean",description:"If true, enable safe search filtering",label:"Safe Search",allowEmpty:!0},fromDate:{type:"string",max:10,label:"From Date",allowEmpty:!0},toDate:{type:"string",max:10,label:"To Date",allowEmpty:!0},useReasoning:{type:"boolean",description:"If true, the component will use reasoning capabilities for complex problem-solving",label:"Use Reasoning"},verbosity:{type:"string",valid:["low","medium","high"],label:"Verbosity",allowEmpty:!0},reasoningEffort:{type:"string",valid:["none","default","low","medium","high"],description:"Controls the level of effort the model will put into reasoning",label:"Reasoning Effort"},maxThinkingTokens:{type:"number",min:1,label:"Maximum Thinking Tokens"}},inputs:{Input:{type:"Any",description:"An input that you can pass to the LLM"},Attachment:{type:"Binary",description:"An attachment that you can pass to the LLM",optional:!0}},outputs:{Reply:{default:!0}}}),__publicField$1o(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").allow("").optional().label("Response Format"),passthrough:Joi.boolean().optional().label("Passthrough"),useSystemPrompt:Joi.boolean().optional().label("Use System Prompt"),useContextWindow:Joi.boolean().optional().label("Use Context Window"),maxContextWindowLength:Joi.number().optional().min(0).label("Maximum Context Window Length"),verbosity:Joi.string().valid("low","medium","high").optional().allow("").allow(null).label("Verbosity"),useWebSearch:Joi.boolean().optional().label("Use Web Search"),webSearchContextSize:Joi.string().valid("high","medium","low").optional().label("Web Search Context Size"),webSearchCity:Joi.string().max(100).optional().allow("").label("Web Search City"),webSearchCountry:Joi.string().max(2).optional().allow("").label("Web Search Country"),webSearchRegion:Joi.string().max(100).optional().allow("").label("Web Search Region"),webSearchTimezone:Joi.string().max(100).optional().allow("").label("Web Search Timezone"),useSearch:Joi.boolean().optional().allow("").label("Use Search"),searchMode:Joi.string().valid("auto","on","off").optional().allow("").label("Search Mode"),returnCitations:Joi.boolean().optional().allow("").label("Return Citations"),maxSearchResults:Joi.number().min(1).max(100).optional().allow("").label("Max Search Results"),searchDataSources:Joi.array().items(Joi.string().valid("web","x","news","rss")).max(4).optional().allow("").label("Search Data Sources"),searchCountry:Joi.string().length(2).optional().allow("").label("Search Country"),excludedWebsites:Joi.string().max(1e4).optional().allow("").label("Excluded Websites"),allowedWebsites:Joi.string().max(1e4).optional().allow("").label("Allowed Websites"),includedXHandles:Joi.string().max(1e3).optional().allow("").label("Included X Handles"),excludedXHandles:Joi.string().max(1e3).optional().allow("").label("Excluded X Handles"),postFavoriteCount:Joi.number().min(0).max(1e9).optional().allow("").label("Post Favorite Count"),postViewCount:Joi.number().min(0).max(1e9).optional().allow("").label("Post View Count"),rssLinks:Joi.string().max(1e4).optional().allow("").label("RSS Link"),safeSearch:Joi.boolean().optional().allow("").label("Safe Search"),fromDate:Joi.string().pattern(/^\d{4}-\d{2}-\d{2}$/).optional().allow("").label("From Date"),toDate:Joi.string().pattern(/^\d{4}-\d{2}-\d{2}$/).optional().allow("").label("To Date"),useReasoning:Joi.boolean().optional().label("Use Reasoning"),reasoningEffort:Joi.string().valid("none","default","minimal","low","medium","high").optional().allow("").label("Reasoning Effort"),maxThinkingTokens:Joi.number().min(1).optional().label("Maximum Thinking Tokens")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== GenAILLM Log ===");let teamId=agent?.teamId;const passThrough=config2.data.passthrough||!1,useContextWindow=config2.data.useContextWindow||!1,useSystemPrompt=config2.data.useSystemPrompt||!1,useWebSearch=config2.data.useWebSearch||!1,maxTokens=parseInt(config2.data.maxTokens)||1024,maxContextWindowLength=parseInt(config2.data.maxContextWindowLength)||1024,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,files=parseFiles$1(input,config2),isMultimodalRequest=!1;const provider=await agent.modelsProvider.getProvider(model),isEcho=provider==="Echo";if(files?.length>0&&!isEcho){const supportedFileTypes=SUPPORTED_MIME_TYPES_MAP?.[provider]||{},features=(await agent.modelsProvider.getModelInfo(model))?.features||[],fileTypes=new Set;if(files=(await Promise.all(files.map(async file=>{const mimeType=file?.mimetype||await getMimeType(file),[requestFeature=""]=Object.entries(supportedFileTypes).find(([key,value])=>value.includes(mimeType))||[];return mimeType&&fileTypes.add(mimeType),features?.includes(requestFeature)?file:null}))).filter(Boolean),files.length===0)return{_error:`Model does not support ${fileTypes?.size>0?Array.from(fileTypes).join(", "):"File(s)"}`,_debug:logger2.output};isMultimodalRequest=!0}logger2.debug(` Prompt
|
|
95
64
|
`,prompt,`
|
|
96
65
|
`),isEcho||logger2.debug(` Files
|
|
97
66
|
`,await Promise.all(files.map(file=>formatDataForDebug(file,AccessCandidate.agent(agent.id)))));const hasCustomOutputs=config2?.outputs?.some(output=>!output.default);config2.data.responseFormat=config2.data?.responseFormat||(hasCustomOutputs?"json":"");let response;const _prompt=llmInference.connector.enhancePrompt(prompt,config2);let messages=[],systemPrompt="";if(useSystemPrompt&&(systemPrompt=await agent.agentRuntime.llmCache.get("systemPrompt","text")||agent.data?.behavior||"",systemPrompt&&logger2.debug(` Using Agent System Prompt
|
|
98
67
|
`,systemPrompt),systemPrompt&&(messages=[{role:"system",content:systemPrompt}])),useContextWindow){const cachedMessages=await agent.agentRuntime.llmCache.get("messages","json");try{const messagesJSON=typeof cachedMessages=="string"?JSON.parse(cachedMessages):cachedMessages,convMessages=await llmInference.getContextWindow(systemPrompt,messagesJSON,maxContextWindowLength,maxTokens);convMessages.length>0&&logger2.debug(` Using Agent Context Window : ${convMessages.length-1} messages will be used`),messages=[...convMessages]}catch(error){logger2.warn("Error on parsing context window: ",error),console.warn(cachedMessages)}}messages[messages.length-1]?.role=="user"?messages[messages.length-1].content=_prompt:messages.push({role:"user",content:_prompt});let finishReason="stop";if(response=await new Promise(async(resolve,reject)=>{let _content="",eventEmitter;eventEmitter=await llmInference.promptStream({contextWindow:messages,files,params:{...config2.data,agentId:agent.id},onFallback:fallbackInfo=>{logger2.debug(`
|
|
99
68
|
\u21A9\uFE0F Using fallback model: ${fallbackInfo.model}`)}}).catch(error=>{console.error("Error on promptStream: ",error),reject(error)}),eventEmitter.on(TLLMEvent.Content,content=>{passThrough&&(typeof agent.callback=="function"&&agent.callback({content}),agent.sse.send("llm/passthrough/content",content.replace(/\n/g,"\\n"))),_content+=content}),eventEmitter.on(TLLMEvent.Thinking,thinking=>{passThrough&&(typeof agent.callback=="function"&&agent.callback({thinking}),agent.sse.send("llm/passthrough/thinking",thinking.replace(/\n/g,"\\n")))}),eventEmitter.on(TLLMEvent.End,()=>{passThrough&&(typeof agent.callback=="function"&&agent.callback({content:`
|
|
100
|
-
`}),agent.sse.send("llm/passthrough/content","\\n")),resolve(_content)}),eventEmitter.on(TLLMEvent.Interrupted,reason=>{finishReason=reason||"stop"}),eventEmitter.on(TLLMEvent.Error,error=>{reject(error)})}).catch(error=>({error:error.message||error})),
|
|
69
|
+
`}),agent.sse.send("llm/passthrough/content","\\n")),resolve(_content)}),eventEmitter.on(TLLMEvent.Interrupted,reason=>{finishReason=reason||"stop"}),eventEmitter.on(TLLMEvent.Error,error=>{reject(error)})}).catch(error=>({error:error.message||error})),response?.error){const error=response?.error+" "+(response?.details||"");return logger2.error(" LLM Error=",error),{Output:response?.data,_error:error,_debug:logger2.output}}const emptyResponseErrorMsg="Empty response. This is usually due to output token limit reached. Please try again with a higher 'Maximum Output Tokens'.";if(finishReason!=="stop"){let errMsg=`The model stopped before completing the response.
|
|
70
|
+
|
|
71
|
+
Reason: ${finishReason}.
|
|
72
|
+
|
|
73
|
+
${response?"":emptyResponseErrorMsg}`;return{Reply:response,_error:errMsg,_debug:logger2.output}}if(!response)return{_error:emptyResponseErrorMsg,_debug:logger2.output};const Reply=llmInference.connector.postProcess(response);if(Reply.error)return logger2.error(" LLM Error=",Reply.error),{_error:Reply.error,_debug:logger2.output};logger2.debug(`
|
|
101
74
|
Reply
|
|
102
|
-
`,Reply);const result={Reply};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}function parseFiles$1(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$
|
|
75
|
+
`,Reply);const result={Reply};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}function parseFiles$1(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$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 GPTPlugin extends Component{constructor(){super(),__publicField$1n(this,"configSchema",Joi.object({model:Joi.string().optional(),openAiModel:Joi.string().optional(),specUrl:Joi.string().max(2048).uri().required().description("URL of the OpenAPI specification"),descForModel:Joi.string().max(5e3).required().allow("").label("Description for Model"),name:Joi.string().max(500).required().allow(""),desc:Joi.string().max(5e3).required().allow("").label("Description"),logoUrl:Joi.string().max(8192).allow(""),id:Joi.string().max(200),version:Joi.string().max(100).allow(""),domain:Joi.string().max(253).allow("")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Open API Log ===");try{const specUrl=config2?.data?.specUrl;if(!specUrl)return{_error:"Please provide a Open API Specification URL!",_debug:logger2.output};const model=config2?.data?.model||config2?.data?.openAiModel,descForModel=TemplateString(config2?.data?.descForModel).parse(input).result;let prompt="";if(input?.Prompt?prompt=typeof input?.Prompt=="string"?input?.Prompt:JSON.stringify(input?.Prompt):input?.Query&&(prompt=typeof input?.Query=="string"?input?.Query:JSON.stringify(input?.Query)),!prompt)return{_error:"Please provide a prompt",_debug:logger2.output};const result=await new Conversation(model,specUrl,{systemPrompt:descForModel,agentId:agent?.id}).prompt(prompt);return logger2.debug(`Response:
|
|
103
76
|
`,result,`
|
|
104
77
|
`),{Output:result,_debug:logger2.output}}catch(error){return console.error("Error on running Open API: ",error),{_error:`Error on running Open API!
|
|
105
|
-
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var translation={inputs:{Text:{type:"string",desc:"(required) a string to be translated in the original languages",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},summarization={inputs:{Text:{type:"string",desc:"(required) a string to be summarized",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{min_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the minimum length in tokens of the output summary."},max_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the maximum length in tokens of the output summary."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."}},formatRequest:'inputs: "{{text}}"'},conversational={inputs:{Text:{type:"string",desc:"(required) The last input from the user in the conversation.",request_parameter_name:"text",request_parameter_type:"string"},Generated_responses:{type:"string[]",desc:"A list of strings corresponding to the earlier replies from the model.",request_parameter_name:"generated_responses",request_parameter_type:"string[]"},Past_user_inputs:{type:"string[]",desc:"A list of strings corresponding to the earlier replies from the user. Should be of the same length of generated_responses.",request_parameter_name:"past_user_inputs",request_parameter_type:"string[]"}},parameters:{min_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the minimum length in tokens of the output summary."},max_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the maximum length in tokens of the output summary."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."}},formatRequest:'inputs: "{{text}}", past_user_inputs: [{{past_user_inputs}}], generated_responses: [{{generated_responses}}] }'},hfParams={"text-classification":{inputs:{Text:{type:"string",desc:"(required) a string to be classified",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"token-classification":{inputs:{Text:{type:"string",desc:"(required) a string to be classified",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{aggregation_strategy:{type:"string",default:"simple",desc:"(Default: simple). There are several aggregation strategies:",supportedValues:[{value:"none",desc:"Every token gets classified without further aggregation."},{value:"simple",desc:"Entities are grouped according to the default schema (B-, I- tags get merged when the tag is similar)."},{value:"first",desc:"Same as the simple strategy except words cannot end up with different tags. Words will use the tag of the first token when there is ambiguity."},{value:"average",desc:"Same as the simple strategy except words cannot end up with different tags. Scores are averaged across tokens and then the maximum label is applied."},{value:"max",desc:"Same as the simple strategy except words cannot end up with different tags. Word entity will be the token with the maximum score."}]}},formatRequest:'inputs: "{{text}}"'},"table-question-answering":{inputs:{Query:{type:"string",desc:"(required) The query in plain text that you want to ask the table",request_parameter_name:"query",request_parameter_type:"string"},Table:{type:"string",desc:"(required) A table of data represented as a dict of list where entries are headers and the lists are all the values, all lists must have the same size.",request_parameter_name:"table",request_parameter_type:"Record<string, string[]>"}},formatRequest:'inputs: { query: "{{query}}", table: {{table}} }'},"question-answering":{inputs:{Question:{type:"string",request_parameter_name:"question",request_parameter_type:"string"},Context:{type:"string",request_parameter_name:"context",request_parameter_type:"string"}},formatRequest:'inputs: { context: "{{context}}", question: "{{question}}" }'},"document-question-answering":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"},Question:{type:"string",desc:"(required) Question about document image.",request_parameter_name:"question",request_parameter_type:"string"}},formatRequest:'inputs: { image: {{image}}, question: "{{question}}" }'},"visual-question-answering":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"},Question:{type:"string",desc:"(required) Question about visual image.",request_parameter_name:"question",request_parameter_type:"string"}},formatRequest:'inputs: { image: {{image}}, question: "{{question}}" }'},"zero-shot-classification":{inputs:{Text:{type:"string",desc:"(required) a string or list of strings",request_parameter_name:"inputs",request_parameter_type:"string | string[]"}},parameters:{candidate_labels:{type:"string[]",default:[],desc:"(required) a list of strings that are potential classes for inputs. (max 10 candidate_labels, for more, simply run multiple requests, results are going to be misleading if using too many candidate_labels anyway. If you want to keep the exact same, you can simply run multi_label=true and do the scaling on your end. )"},multi_label:{type:"boolean",default:!1,desc:"(Default: false) Boolean that is set to True if classes can overlap"}},formatRequest:'inputs: "{{text}}", parameters: { candidate_labels: [{{candidate_labels}}] }'},translation,summarization,conversational,"text-generation":{inputs:{Text:{type:"string",desc:"(required) a string to be generated from",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{do_sample:{type:"boolean",default:!0,desc:"(Optional: true). Bool. Whether or not to use sampling, use greedy decoding otherwise."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."},num_return_sequences:{type:"number",default:1,desc:"(Default: 1). Integer. The number of proposition you want to be returned."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},return_full_text:{type:"boolean",default:!0,desc:"(Default: true). Bool. If set to False, the return results will not contain the original query making it easier for prompting."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},max_new_tokens:{type:"number",default:"None",desc:"(Default: None). Int (0-250). The amount of new tokens to be generated, this does not include the input length it is a estimate of the size of generated text you want. Each new tokens slows down the request, so look for balance between response times and length of text generated."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},truncate:{type:"number",default:"None",desc:"(Default: None). Integer. The maximum number of tokens from the input."}},formatRequest:'inputs: "{{text}}"'},"text2text-generation":{inputs:{Text:{type:"string",desc:"(required) a string to be generated from",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."},num_return_sequences:{type:"number",default:1,desc:"(Default: 1). Integer. The number of proposition you want to be returned."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},max_new_tokens:{type:"number",default:"None",desc:"(Default: None). Int (0-250). The amount of new tokens to be generated, this does not include the input length it is a estimate of the size of generated text you want. Each new tokens slows down the request, so look for balance between response times and length of text generated."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."}},formatRequest:'inputs: "{{text}}"'},"fill-mask":{inputs:{Text:{type:"string",desc:"(required) a string to be filled from, must contain the [MASK] token (check model card for exact name of the mask)",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"sentence-similarity":{inputs:{Source_sentence:{type:"string",desc:"(required) The string that you wish to compare the other strings with. This can be a phrase, sentence, or longer passage, depending on the model being used.",request_parameter_name:"source_sentence",request_parameter_type:"string"},Sentences:{type:"string[]",desc:"(required) A list of strings which will be compared against the source_sentence.",request_parameter_name:"sentences",request_parameter_type:"string[]"}},formatRequest:'inputs: { source_sentence: "{{source_sentence}}", sentences: [{{sentences}}] }'},"text-to-image":{inputs:{Text:{type:"string",desc:"(required) prompt to generate image from",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"image-to-text":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}} "},"image-classification":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"object-detection":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"image-segmentation":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"zero-shot-image-classification":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"}},parameters:{candidate_labels:{type:"string[]",desc:"A list of strings that are potential classes for inputs. (max 10)"}},formatRequest:"inputs: { image: {{image}}, parameters: { candidate_labels: [{{candidate_labels}}] } }"},"image-to-image":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"inputs",request_parameter_type:"Blob | ArrayBuffer"}},parameters:{prompt:{type:"string",desc:"(Optional) The text prompt to guide the image generation",default:"None"},strength:{type:"number",default:0,desc:"(Optional) The 'strength' parameter is effective only for SD img2img and alt diffusion img2img models. It conceptually indicates the extent of transformation applied to the reference 'image,' with values between 0 and 1. A higher 'strength' adds more noise to the initial 'image,' and the denoising process runs for the specified number of iterations in 'num_inference_steps.' A 'strength' of 1 ignores the 'image,' applying maximum added noise and running denoising for the full set of iterations."},negative_prompt:{type:"string",default:"None",desc:"(Optional) A negative prompt for the image generation"},height:{type:"number",default:"None",desc:"(Optional) The height in pixels of the generated image"},width:{type:"number",default:"None",desc:"(Optional) The width in pixels of the generated image"},num_inference_steps:{type:"number",default:"None",desc:"(Optional) The number of denoising steps. More denoising steps usually lead to a higher quality image at the expense of slower inference."},guidance_scale:{type:"number",default:"None",desc:"(Optional) Guidance scale: Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, usually at the expense of lower image quality."},guess_mode:{type:"boolean",default:"None",desc:"(Optional) guess_mode only works for ControlNet models, defaults to False In this mode, the ControlNet encoder will try best to recognize the content of the input image even if you remove all prompts. The `guidance_scale` between 3.0 and 5.0 is recommended."}},formatRequest:"inputs: {{image}}"},"text-to-speech":{inputs:{Text:{type:"string",desc:"(required) a string to be converted to speech",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"automatic-speech-recognition":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"audio-to-audio":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"audio-classification":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"feature-extraction":{inputs:{Text:{type:"string | string[]",desc:"(required) a string or a list of strings to get the features from.",request_parameter_name:"inputs",request_parameter_type:"string | string[]"}},formatRequest:'inputs: "{{text}}"'}},__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,key+"",value);function shouldNestInputs(formatRequestPattern){const trimmedPattern=formatRequestPattern?.trim();return/^(inputs|data):\s*{(?![{])/.test(trimmedPattern)}function validateAndParseJson$1(value,helpers){let parsedJson=null;try{parsedJson=JSON.parse(value)}catch{return helpers.error("string.invalidJson",{value})}if(typeof parsedJson!="object"||parsedJson===null)return helpers.error("string.notJsonObject",{value});for(const key in parsedJson)if(key.trim()==="")return helpers.error("object.emptyKey",{value});return parsedJson}class HuggingFace extends Component{constructor(){super(),__publicField$1i(this,"configSchema",Joi.object({accessToken:Joi.string().max(350).required().label("Access Token"),modelName:Joi.string().max(100).required(),modelTask:Joi.string().max(100).required(),inputConfig:Joi.string().allow(""),parameters:Joi.string().custom(validateAndParseJson$1,"custom JSON validation").allow(""),name:Joi.string().max(100).required(),displayName:Joi.string().max(100).required(),desc:Joi.string().max(5e3).required().allow(""),logoUrl:Joi.string().max(500).allow(""),disableCache:Joi.boolean().strict()}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Hugging Face Log ===");const agentId=agent?.id,teamId=agent?.teamId,accessToken=await TemplateStringHelper.create(config2?.data?.accessToken).parseTeamKeysAsync(teamId).asyncResult;if(!accessToken)return{_error:"Please provide a valid Hugging Face Access Token",_debug:logger2.output};const hf=new HfInference(accessToken),task=config2?.data?.modelTask;if(!task)return{_error:"Hugging Face Task is required!",_debug:logger2.output};logger2.debug(`Task: ${kebabToCapitalize(task)}`);let hfFunc=kebabToCamel(task);if(hfFunc==="text2textGeneration"&&(hfFunc="textGeneration"),!hf?.[hfFunc])return{_error:`Inference API does not support for this task - ${kebabToCapitalize(task)}`,_debug:logger2.output};const modelName=config2?.data?.modelName;if(!modelName)return{_error:"Hugging Face Model is required!",_debug:logger2.output};logger2.debug(`Model Name: ${modelName}`);let inputConfig={};const formatRequest=hfParams?.[task]?.formatRequest,_hfParams=hfParams?.[task]?.inputs;if(_hfParams&&Object.keys(_hfParams).length>0){for(const key in _hfParams){const config22=_hfParams[key];inputConfig[key]=config22}typeof inputConfig=="object"&&inputConfig!==null&&(inputConfig={...inputConfig,formatRequest})}(!inputConfig||Object.keys(inputConfig)?.length===0)&&console.log("No inputs config found for Hugging Face Model!");let inputs={};if(!input||Object.keys(input)?.length===0)return{_error:"Please provide a valid input!",_debug:logger2.output};if(typeof input!="object")return{_error:"Invalid input!",_debug:logger2.output};if(typeof input=="object"&&Object.keys(input)?.length>0){for(const key in input)if(inputConfig?.[key]){let value=input[key],name=inputConfig[key].request_parameter_name,type=inputConfig[key].request_parameter_type;if(type&&type?.includes("Blob"))try{const buffer=await BinaryInput.from(value,void 0,void 0,AccessCandidate.agent(agentId)).getBuffer(),blob=new Blob([buffer]);inputs[name]=blob}catch(error){return{_error:error?.message||JSON.stringify(error),_debug:logger2.output}}else inputs[name]=value}}const structuredInputs=shouldNestInputs(inputConfig.formatRequest)?{inputs}:inputs;let inputsLog;if(structuredInputs.inputs&&typeof structuredInputs.inputs=="object"){inputsLog={...structuredInputs.inputs};for(const[key,value]of Object.entries(structuredInputs.inputs||{}))value instanceof Blob&&(inputsLog[key]=`Blob size=${value.size}`)}else inputsLog=structuredInputs;logger2.debug("Inputs: ",inputsLog);let params=JSON.parse(config2?.data?.parameters||"{}");params=convertStringToRespectiveType(params);let parameters={};if(params&&Object.keys(params)?.length>0)for(const key in params){const value=params[key];if(typeof value=="string"){if(value?.toLowerCase()==="none")continue;parameters[key]=TemplateStringHelper.create(value).parse(input).result}else parameters[key]=value}let args={model:modelName,...structuredInputs};const options={};config2?.data?.disableCache&&(options.use_cache=!1),Object.keys(parameters)?.length>0&&(args.parameters=parameters,logger2.debug(`Parameters:
|
|
78
|
+
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var translation={inputs:{Text:{type:"string",desc:"(required) a string to be translated in the original languages",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},summarization={inputs:{Text:{type:"string",desc:"(required) a string to be summarized",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{min_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the minimum length in tokens of the output summary."},max_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the maximum length in tokens of the output summary."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."}},formatRequest:'inputs: "{{text}}"'},conversational={inputs:{Text:{type:"string",desc:"(required) The last input from the user in the conversation.",request_parameter_name:"text",request_parameter_type:"string"},Generated_responses:{type:"string[]",desc:"A list of strings corresponding to the earlier replies from the model.",request_parameter_name:"generated_responses",request_parameter_type:"string[]"},Past_user_inputs:{type:"string[]",desc:"A list of strings corresponding to the earlier replies from the user. Should be of the same length of generated_responses.",request_parameter_name:"past_user_inputs",request_parameter_type:"string[]"}},parameters:{min_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the minimum length in tokens of the output summary."},max_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the maximum length in tokens of the output summary."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."}},formatRequest:'inputs: "{{text}}", past_user_inputs: [{{past_user_inputs}}], generated_responses: [{{generated_responses}}] }'},hfParams={"text-classification":{inputs:{Text:{type:"string",desc:"(required) a string to be classified",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"token-classification":{inputs:{Text:{type:"string",desc:"(required) a string to be classified",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{aggregation_strategy:{type:"string",default:"simple",desc:"(Default: simple). There are several aggregation strategies:",supportedValues:[{value:"none",desc:"Every token gets classified without further aggregation."},{value:"simple",desc:"Entities are grouped according to the default schema (B-, I- tags get merged when the tag is similar)."},{value:"first",desc:"Same as the simple strategy except words cannot end up with different tags. Words will use the tag of the first token when there is ambiguity."},{value:"average",desc:"Same as the simple strategy except words cannot end up with different tags. Scores are averaged across tokens and then the maximum label is applied."},{value:"max",desc:"Same as the simple strategy except words cannot end up with different tags. Word entity will be the token with the maximum score."}]}},formatRequest:'inputs: "{{text}}"'},"table-question-answering":{inputs:{Query:{type:"string",desc:"(required) The query in plain text that you want to ask the table",request_parameter_name:"query",request_parameter_type:"string"},Table:{type:"string",desc:"(required) A table of data represented as a dict of list where entries are headers and the lists are all the values, all lists must have the same size.",request_parameter_name:"table",request_parameter_type:"Record<string, string[]>"}},formatRequest:'inputs: { query: "{{query}}", table: {{table}} }'},"question-answering":{inputs:{Question:{type:"string",request_parameter_name:"question",request_parameter_type:"string"},Context:{type:"string",request_parameter_name:"context",request_parameter_type:"string"}},formatRequest:'inputs: { context: "{{context}}", question: "{{question}}" }'},"document-question-answering":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"},Question:{type:"string",desc:"(required) Question about document image.",request_parameter_name:"question",request_parameter_type:"string"}},formatRequest:'inputs: { image: {{image}}, question: "{{question}}" }'},"visual-question-answering":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"},Question:{type:"string",desc:"(required) Question about visual image.",request_parameter_name:"question",request_parameter_type:"string"}},formatRequest:'inputs: { image: {{image}}, question: "{{question}}" }'},"zero-shot-classification":{inputs:{Text:{type:"string",desc:"(required) a string or list of strings",request_parameter_name:"inputs",request_parameter_type:"string | string[]"}},parameters:{candidate_labels:{type:"string[]",default:[],desc:"(required) a list of strings that are potential classes for inputs. (max 10 candidate_labels, for more, simply run multiple requests, results are going to be misleading if using too many candidate_labels anyway. If you want to keep the exact same, you can simply run multi_label=true and do the scaling on your end. )"},multi_label:{type:"boolean",default:!1,desc:"(Default: false) Boolean that is set to True if classes can overlap"}},formatRequest:'inputs: "{{text}}", parameters: { candidate_labels: [{{candidate_labels}}] }'},translation,summarization,conversational,"text-generation":{inputs:{Text:{type:"string",desc:"(required) a string to be generated from",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{do_sample:{type:"boolean",default:!0,desc:"(Optional: true). Bool. Whether or not to use sampling, use greedy decoding otherwise."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."},num_return_sequences:{type:"number",default:1,desc:"(Default: 1). Integer. The number of proposition you want to be returned."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},return_full_text:{type:"boolean",default:!0,desc:"(Default: true). Bool. If set to False, the return results will not contain the original query making it easier for prompting."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},max_new_tokens:{type:"number",default:"None",desc:"(Default: None). Int (0-250). The amount of new tokens to be generated, this does not include the input length it is a estimate of the size of generated text you want. Each new tokens slows down the request, so look for balance between response times and length of text generated."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},truncate:{type:"number",default:"None",desc:"(Default: None). Integer. The maximum number of tokens from the input."}},formatRequest:'inputs: "{{text}}"'},"text2text-generation":{inputs:{Text:{type:"string",desc:"(required) a string to be generated from",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."},num_return_sequences:{type:"number",default:1,desc:"(Default: 1). Integer. The number of proposition you want to be returned."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},max_new_tokens:{type:"number",default:"None",desc:"(Default: None). Int (0-250). The amount of new tokens to be generated, this does not include the input length it is a estimate of the size of generated text you want. Each new tokens slows down the request, so look for balance between response times and length of text generated."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."}},formatRequest:'inputs: "{{text}}"'},"fill-mask":{inputs:{Text:{type:"string",desc:"(required) a string to be filled from, must contain the [MASK] token (check model card for exact name of the mask)",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"sentence-similarity":{inputs:{Source_sentence:{type:"string",desc:"(required) The string that you wish to compare the other strings with. This can be a phrase, sentence, or longer passage, depending on the model being used.",request_parameter_name:"source_sentence",request_parameter_type:"string"},Sentences:{type:"string[]",desc:"(required) A list of strings which will be compared against the source_sentence.",request_parameter_name:"sentences",request_parameter_type:"string[]"}},formatRequest:'inputs: { source_sentence: "{{source_sentence}}", sentences: [{{sentences}}] }'},"text-to-image":{inputs:{Text:{type:"string",desc:"(required) prompt to generate image from",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"image-to-text":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}} "},"image-classification":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"object-detection":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"image-segmentation":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"zero-shot-image-classification":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"}},parameters:{candidate_labels:{type:"string[]",desc:"A list of strings that are potential classes for inputs. (max 10)"}},formatRequest:"inputs: { image: {{image}}, parameters: { candidate_labels: [{{candidate_labels}}] } }"},"image-to-image":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"inputs",request_parameter_type:"Blob | ArrayBuffer"}},parameters:{prompt:{type:"string",desc:"(Optional) The text prompt to guide the image generation",default:"None"},strength:{type:"number",default:0,desc:"(Optional) The 'strength' parameter is effective only for SD img2img and alt diffusion img2img models. It conceptually indicates the extent of transformation applied to the reference 'image,' with values between 0 and 1. A higher 'strength' adds more noise to the initial 'image,' and the denoising process runs for the specified number of iterations in 'num_inference_steps.' A 'strength' of 1 ignores the 'image,' applying maximum added noise and running denoising for the full set of iterations."},negative_prompt:{type:"string",default:"None",desc:"(Optional) A negative prompt for the image generation"},height:{type:"number",default:"None",desc:"(Optional) The height in pixels of the generated image"},width:{type:"number",default:"None",desc:"(Optional) The width in pixels of the generated image"},num_inference_steps:{type:"number",default:"None",desc:"(Optional) The number of denoising steps. More denoising steps usually lead to a higher quality image at the expense of slower inference."},guidance_scale:{type:"number",default:"None",desc:"(Optional) Guidance scale: Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, usually at the expense of lower image quality."},guess_mode:{type:"boolean",default:"None",desc:"(Optional) guess_mode only works for ControlNet models, defaults to False In this mode, the ControlNet encoder will try best to recognize the content of the input image even if you remove all prompts. The `guidance_scale` between 3.0 and 5.0 is recommended."}},formatRequest:"inputs: {{image}}"},"text-to-speech":{inputs:{Text:{type:"string",desc:"(required) a string to be converted to speech",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"automatic-speech-recognition":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"audio-to-audio":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"audio-classification":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"feature-extraction":{inputs:{Text:{type:"string | string[]",desc:"(required) a string or a list of strings to get the features from.",request_parameter_name:"inputs",request_parameter_type:"string | string[]"}},formatRequest:'inputs: "{{text}}"'}},__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 shouldNestInputs(formatRequestPattern){const trimmedPattern=formatRequestPattern?.trim();return/^(inputs|data):\s*{(?![{])/.test(trimmedPattern)}function validateAndParseJson$1(value,helpers){let parsedJson=null;try{parsedJson=JSON.parse(value)}catch{return helpers.error("string.invalidJson",{value})}if(typeof parsedJson!="object"||parsedJson===null)return helpers.error("string.notJsonObject",{value});for(const key in parsedJson)if(key.trim()==="")return helpers.error("object.emptyKey",{value});return parsedJson}class HuggingFace extends Component{constructor(){super(),__publicField$1m(this,"configSchema",Joi.object({accessToken:Joi.string().max(350).required().label("Access Token"),modelName:Joi.string().max(100).required(),modelTask:Joi.string().max(100).required(),inputConfig:Joi.string().allow(""),parameters:Joi.string().custom(validateAndParseJson$1,"custom JSON validation").allow(""),name:Joi.string().max(100).required(),displayName:Joi.string().max(100).required(),desc:Joi.string().max(5e3).required().allow(""),logoUrl:Joi.string().max(500).allow(""),disableCache:Joi.boolean().strict()}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Hugging Face Log ===");const agentId=agent?.id,teamId=agent?.teamId,accessToken=await TemplateStringHelper.create(config2?.data?.accessToken).parseTeamKeysAsync(teamId).asyncResult;if(!accessToken)return{_error:"Please provide a valid Hugging Face Access Token",_debug:logger2.output};const hf=new HfInference(accessToken),task=config2?.data?.modelTask;if(!task)return{_error:"Hugging Face Task is required!",_debug:logger2.output};logger2.debug(`Task: ${kebabToCapitalize(task)}`);let hfFunc=kebabToCamel(task);if(hfFunc==="text2textGeneration"&&(hfFunc="textGeneration"),!hf?.[hfFunc])return{_error:`Inference API does not support for this task - ${kebabToCapitalize(task)}`,_debug:logger2.output};const modelName=config2?.data?.modelName;if(!modelName)return{_error:"Hugging Face Model is required!",_debug:logger2.output};logger2.debug(`Model Name: ${modelName}`);let inputConfig={};const formatRequest=hfParams?.[task]?.formatRequest,_hfParams=hfParams?.[task]?.inputs;if(_hfParams&&Object.keys(_hfParams).length>0){for(const key in _hfParams){const config22=_hfParams[key];inputConfig[key]=config22}typeof inputConfig=="object"&&inputConfig!==null&&(inputConfig={...inputConfig,formatRequest})}(!inputConfig||Object.keys(inputConfig)?.length===0)&&console.log("No inputs config found for Hugging Face Model!");let inputs={};if(!input||Object.keys(input)?.length===0)return{_error:"Please provide a valid input!",_debug:logger2.output};if(typeof input!="object")return{_error:"Invalid input!",_debug:logger2.output};if(typeof input=="object"&&Object.keys(input)?.length>0){for(const key in input)if(inputConfig?.[key]){let value=input[key],name=inputConfig[key].request_parameter_name,type=inputConfig[key].request_parameter_type;if(type&&type?.includes("Blob"))try{const buffer=await BinaryInput.from(value,void 0,void 0,AccessCandidate.agent(agentId)).getBuffer(),blob=new Blob([buffer]);inputs[name]=blob}catch(error){return{_error:error?.message||JSON.stringify(error),_debug:logger2.output}}else inputs[name]=value}}const structuredInputs=shouldNestInputs(inputConfig.formatRequest)?{inputs}:inputs;let inputsLog;if(structuredInputs.inputs&&typeof structuredInputs.inputs=="object"){inputsLog={...structuredInputs.inputs};for(const[key,value]of Object.entries(structuredInputs.inputs||{}))value instanceof Blob&&(inputsLog[key]=`Blob size=${value.size}`)}else inputsLog=structuredInputs;logger2.debug("Inputs: ",inputsLog);let params=JSON.parse(config2?.data?.parameters||"{}");params=convertStringToRespectiveType(params);let parameters={};if(params&&Object.keys(params)?.length>0)for(const key in params){const value=params[key];if(typeof value=="string"){if(value?.toLowerCase()==="none")continue;parameters[key]=TemplateStringHelper.create(value).parse(input).result}else parameters[key]=value}let args={model:modelName,...structuredInputs};const options={};config2?.data?.disableCache&&(options.use_cache=!1),Object.keys(parameters)?.length>0&&(args.parameters=parameters,logger2.debug(`Parameters:
|
|
106
79
|
`,parameters));const modelCallWithRetry=async({retryCount=0,retryLimit=2,retryDelay=1e3})=>{try{(typeof hf[hfFunc]!="function"||retryCount===retryLimit)&&(hfFunc="request");const result=await hf[hfFunc](args,options);let output;return result instanceof Blob?output=await BinaryInput.from(result).getJsonData(AccessCandidate.agent(agent.id)):Array.isArray(result)?output=await Promise.all(result.map(async item=>{if(item.blob instanceof Blob||typeof item.blob=="string"&&isBase64(item.blob)){let binaryInput;item.blob instanceof Blob?binaryInput=BinaryInput.from(item.blob):binaryInput=BinaryInput.from(item.blob,void 0,item["content-type"]);const fileObj=await binaryInput.getJsonData(AccessCandidate.agent(agent.id));return{...item,blob:fileObj}}else return item})):output=result,output}catch(error){if(retryCount<retryLimit)return await delay(retryDelay),modelCallWithRetry({retryCount:retryCount+1,retryLimit,retryDelay:retryDelay*2});throw error}};try{const output=await modelCallWithRetry({retryCount:0,retryLimit:2,retryDelay:5e3});return logger2.debug(`Output:
|
|
107
80
|
`,output),{Output:output,_debug:logger2.output}}catch(error){return console.log("Error on running Hugging Face Model!",error),console.log("Error: args, options ",args,options),{_error:`Error from Hugging Face:
|
|
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$
|
|
81
|
+
${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$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,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$1l(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"),aspectRatio:Joi.string().valid("1:1","3:4","4:3","9:16","16:9").optional().allow("").label("Aspect Ratio"),personGeneration:Joi.string().valid("dont_allow","allow_adult","allow_all").optional().allow("").label("Person Generation")}))}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
82
|
`,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
83
|
${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");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()}},imagen:async({model,prompt,config:config2,logger:logger2,agent,input})=>{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 files=parseFiles(input,config2);let args={model,aspectRatio:config2?.data?.aspectRatio||config2?.data?.size||"1:1",numberOfImages:config2?.data?.numberOfImages||1,personGeneration:config2?.data?.personGeneration||"allow_adult"},response;if(files.length>0){const validFiles=files.filter(file=>imageGenerator.isValidImageFile("GoogleAI",file.mimetype));if(validFiles.length===0)throw new Error("Supported image file types are: "+SUPPORTED_MIME_TYPES_MAP.GoogleAI?.image?.join(", "));response=await llmInference.imageEditRequest({query:prompt,files:validFiles,params:{...args,agentId:agent.id}})}else response=await llmInference.imageGenRequest({query:prompt,params:{...args,agentId:agent.id}});let output=response?.data?.[0]?.b64_json;if(output){const binaryInput=BinaryInput.from(output),agentId=typeof agent=="object"&&agent.id?agent.id:agent;return{output:await binaryInput.getJsonData(AccessCandidate.agent(agentId))}}else return output=response?.data?.[0]?.url,{output}}catch(error){throw new Error(`Google AI Image Generation Error: ${error?.message||JSON.stringify(error)}`)}},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":await isGoogleAIModel(model,agent)?"imagen":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")}async function isGoogleAIModel(model,agent){const provider=await agent.modelsProvider.getProvider(model);return provider==="GoogleAI"||provider?.toLowerCase()==="GoogleAI".toLowerCase()||model?.replace(BUILT_IN_MODEL_PREFIX,"")?.includes("imagen")}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$
|
|
84
|
+
${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()}},imagen:async({model,prompt,config:config2,logger:logger2,agent,input})=>{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 files=parseFiles(input,config2);let args={model,aspectRatio:config2?.data?.aspectRatio||config2?.data?.size||"1:1",numberOfImages:config2?.data?.numberOfImages||1,personGeneration:config2?.data?.personGeneration||"allow_adult"},response;if(files.length>0){const validFiles=files.filter(file=>imageGenerator.isValidImageFile("GoogleAI",file.mimetype));if(validFiles.length===0)throw new Error("Supported image file types are: "+SUPPORTED_MIME_TYPES_MAP.GoogleAI?.image?.join(", "));response=await llmInference.imageEditRequest({query:prompt,files:validFiles,params:{...args,agentId:agent.id}})}else response=await llmInference.imageGenRequest({query:prompt,params:{...args,agentId:agent.id}});let output=response?.data?.[0]?.b64_json;if(output){const binaryInput=BinaryInput.from(output),agentId=typeof agent=="object"&&agent.id?agent.id:agent;return{output:await binaryInput.getJsonData(AccessCandidate.agent(agentId))}}else return output=response?.data?.[0]?.url,{output}}catch(error){throw new Error(`Google AI Image Generation Error: ${error?.message||JSON.stringify(error)}`)}},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":await isGoogleAIModel(model,agent)?"imagen":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")}async function isGoogleAIModel(model,agent){const provider=await agent.modelsProvider.getProvider(model);return provider==="GoogleAI"||provider?.toLowerCase()==="GoogleAI".toLowerCase()||model?.replace(BUILT_IN_MODEL_PREFIX,"")?.includes("imagen")}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$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);class PromptGenerator extends Component{constructor(){super(),__publicField$1k(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
85
|
`,prompt,`
|
|
113
86
|
`),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
|
-
`,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/json","application/ld+json","application/geo+json","application/graphql","application/vnd.api+json","application/json-patch+json","application/merge-patch+json","application/problem+json","application/hal+json","application/vnd.collection+json","application/json-seq","application/csp-report","application/manifest+json","application/cloudevents+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$1f=Object.defineProperty,__defNormalProp$1f=(obj,key,value)=>key in obj?__defProp$1f(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1f=(obj,key,value)=>__defNormalProp$1f(obj,typeof key!="symbol"?key+"":key,value);const console$n=Logger("AccessTokenManager");let managedVault$1;SystemEvents.on("SRE:Booted",()=>{managedVault$1=ConnectorService.getManagedVaultConnector()});class AccessTokenManager{constructor(clientId,clientSecret,secondaryToken,tokenUrl,expires_in,primaryToken,tokensData,keyId,logger2,agent,isNewStructure=!1){__publicField$1f(this,"clientId"),__publicField$1f(this,"clientSecret"),__publicField$1f(this,"primaryToken"),__publicField$1f(this,"secondaryToken"),__publicField$1f(this,"tokenUrl"),__publicField$1f(this,"expires_in"),__publicField$1f(this,"tokensData"),__publicField$1f(this,"keyId"),__publicField$1f(this,"logger"),__publicField$1f(this,"agent"),__publicField$1f(this,"isNewStructure"),this.clientId=clientId,this.clientSecret=clientSecret,this.primaryToken=primaryToken,this.secondaryToken=secondaryToken,this.tokenUrl=tokenUrl,this.expires_in=expires_in,this.tokensData=tokensData,this.keyId=keyId,this.logger=logger2,this.agent=agent,this.isNewStructure=isNewStructure}async getAccessToken(){try{const currentTime=new Date().getTime();if(!this.secondaryToken&&!this.expires_in)return console$n.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$n.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$n.log("Access token is expired or missing. Refreshing access token..."),await this.refreshAccessToken()}else return console$n.log("Access token is still valid"),this.logger.debug("Access token is still valid."),this.primaryToken}catch(error){throw console$n.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$n.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;let updatedData;this.isNewStructure?updatedData={...this.tokensData,auth_data:{...this.tokensData?.auth_data??{},primary:newAccessToken,secondary:response?.data?.refresh_token??this.secondaryToken,expires_in:(expirationTimestamp??void 0)!==void 0?String(expirationTimestamp):void 0}}:(updatedData={...this.tokensData,primary:newAccessToken,expires_in:(expirationTimestamp??void 0)!==void 0?String(expirationTimestamp):void 0},updatedData.secondary=response?.data?.refresh_token??this.secondaryToken);const save=await managedVault$1.user(AccessCandidate.agent(this.agent.id)).set(this.keyId,JSON.stringify(updatedData));return save&&save.status===200?(console$n.log("Access token value is updated successfully."),this.logger.debug("Access token value is updated successfully.")):(console$n.log("Warning: new access token value is not updated."),this.logger.debug("Warning: new access token value is not updated.")),this.tokensData=updatedData,this.primaryToken=newAccessToken,this.secondaryToken=response?.data?.refresh_token??this.secondaryToken,this.expires_in=(expirationTimestamp??void 0)!==void 0?String(expirationTimestamp):void 0,newAccessToken}catch(error){throw console$n.error("Failed to refresh access token:",error),this.logger.debug(`Failed to refresh access token: ${error}`),new Error("Failed to refresh access token.")}}}const logger$h=Logger("OAuth.helper");let managedVault;SystemEvents.on("SRE:Booted",()=>{try{managedVault=ConnectorService.getManagedVaultConnector()}catch{logger$h.warn("Could not find a compatible ManagedVault connector, OAuth APICalls will not work")}});function extractAdditionalParamsForOAuth1(reqConfig={}){let additionalParams={};reqConfig.url&&(reqConfig.url.includes("{{")||reqConfig.url.includes("${{"))&&logger$h.warn("Warning: URL contains unresolved template variables for OAuth1 signature:",reqConfig.url);try{const searchParams=new URL(reqConfig.url).searchParams;additionalParams=Object.fromEntries(searchParams.entries()),searchParams.toString()&&logger$h.debug("OAuth1: Found query parameters:",Object.keys(additionalParams))}catch(error){logger$h.warn("Failed to parse URL for OAuth1 parameters:",error)}const headers=reqConfig.headers||{};let contentType="";if(Array.isArray(headers)){const contentTypeHeader=headers.find(h=>Object.keys(h).some(k=>k.toLowerCase()==="content-type"));if(contentTypeHeader){const key=Object.keys(contentTypeHeader).find(k=>k.toLowerCase()==="content-type");contentType=contentTypeHeader[key]}}else contentType=headers["Content-Type"]||headers["content-type"]||"";const method=(reqConfig.method||"GET").toUpperCase();if(contentType.includes(REQUEST_CONTENT_TYPES.urlEncodedFormData)){if(reqConfig.data){let formParams={};if(typeof reqConfig.data=="string"){(reqConfig.data.includes("{{")||reqConfig.data.includes("${{"))&&logger$h.warn("Warning: Form data contains unresolved template variables for OAuth1 signature");const formData=new URLSearchParams(reqConfig.data);formParams=Object.fromEntries(formData.entries())}else reqConfig.data instanceof URLSearchParams?formParams=Object.fromEntries(reqConfig.data.entries()):typeof reqConfig.data=="object"&&(formParams=reqConfig.data);logger$h.debug("OAuth1: Including form parameters in signature:",Object.keys(formParams)),additionalParams={...additionalParams,...formParams}}}else if(contentType.includes(REQUEST_CONTENT_TYPES.json)||contentType.includes("application/")||contentType.includes("text/")){if(reqConfig.data&&method!=="GET"&&method!=="HEAD"){let bodyString="";typeof reqConfig.data=="string"?bodyString=reqConfig.data:bodyString=JSON.stringify(reqConfig.data),(bodyString.includes("{{")||bodyString.includes("${{"))&&logger$h.warn("Warning: Request body contains unresolved template variables for OAuth1 signature");const hash=crypto$1.createHash("sha1").update(bodyString).digest("base64");additionalParams.oauth_body_hash=hash,logger$h.debug("OAuth1: Added oauth_body_hash for",contentType)}}else if(contentType.includes(REQUEST_CONTENT_TYPES.multipartFormData)){if(reqConfig.data&&typeof reqConfig.data=="object"&&"entries"in reqConfig.data){const formData=reqConfig.data;for(const[key,value]of formData.entries())if(typeof value=="string")additionalParams[key]=value;else{if(typeof value=="object"&&value!==null&&("size"in value||"type"in value))continue;additionalParams[key]=String(value)}}}else if(!contentType&&(method==="POST"||method==="PUT"||method==="PATCH")&&reqConfig.data){const bodyString=typeof reqConfig.data=="string"?reqConfig.data:JSON.stringify(reqConfig.data),hash=crypto$1.createHash("sha1").update(bodyString).digest("base64");additionalParams.oauth_body_hash=hash}return logger$h.debug("OAuth1: Total parameters for signature:",Object.keys(additionalParams).length),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")}});let baseUrl=url;try{const urlObj=new URL(url);baseUrl=`${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`,logger$h.debug("OAuth1: Base URL for signature:",baseUrl)}catch(error){logger$h.warn("Failed to parse URL for OAuth1 signature:",error)}const requestData={url:baseUrl,method:method.toUpperCase(),data:additionalParams},token=oauth1Credentials.token&&oauth1Credentials.token!==""?{key:oauth1Credentials.token,secret:oauth1Credentials.tokenSecret||""}:null,signedRequest=oauth.authorize(requestData,token);return oauth.toHeader(signedRequest)},retrieveOAuthTokens=async(agent,config2)=>{let tokenKey=null;try{tokenKey=config2?.data?.oauth_con_id||`OAUTH_${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 isNewStructure=tokensData.auth_data!==void 0&&tokensData.auth_settings!==void 0;isNewStructure&&await Promise.all(Object.keys(tokensData.auth_settings).map(async key=>{typeof tokensData.auth_settings[key]=="string"&&(tokensData.auth_settings[key]=await TemplateString(tokensData.auth_settings[key]).parseTeamKeysAsync(agent.teamId).asyncResult)}));const primaryToken=isNewStructure?tokensData.auth_data?.primary:tokensData.primary,secondaryToken=isNewStructure?tokensData.auth_data?.secondary:tokensData.secondary,expiresIn=isNewStructure?tokensData.auth_data?.expires_in:tokensData.expires_in,type=isNewStructure?tokensData.auth_settings?.type:tokensData.type||tokensData.oauth_info?.type,service=isNewStructure?tokensData.auth_settings?.service:tokensData.oauth_info?.service;if(type==="oauth2"&&service!=="oauth2_client_credentials"&&(secondaryToken||logger$h.warn("Warning: refresh_token is missing for OAuth2"),expiresIn||logger$h.warn("Warning: expires_in is missing for OAuth2.")),service!=="oauth2_client_credentials"&&!primaryToken)throw new Error("Retrieved OAuth tokens do not exist, invalid OR incomplete. Please authenticate ...");const responseData={primaryToken,secondaryToken,type,service};return type==="oauth"?(isNewStructure?(responseData.consumerKey=tokensData.auth_settings?.consumerKey,responseData.consumerSecret=tokensData.auth_settings?.consumerSecret,responseData.tokenURL=tokensData.auth_settings?.tokenURL):(responseData.consumerKey=tokensData.consumerKey||tokensData.oauth_info?.consumerKey,responseData.consumerSecret=tokensData.consumerSecret||tokensData.oauth_info?.consumerSecret,responseData.tokenURL=tokensData.tokenURL||tokensData.oauth_info?.tokenURL),responseData.team=tokensData.team||agent.teamId):type==="oauth2"&&(isNewStructure?(responseData.tokenURL=tokensData.auth_settings?.tokenURL,responseData.clientID=tokensData.auth_settings?.clientID,responseData.clientSecret=tokensData.auth_settings?.clientSecret):(responseData.tokenURL=tokensData.tokenURL||tokensData.oauth_info?.tokenURL,responseData.clientID=tokensData.clientID||tokensData.oauth_info?.clientID,responseData.clientSecret=tokensData.clientSecret||tokensData.oauth_info?.clientSecret),responseData.expiresIn=expiresIn??0,responseData.team=tokensData.team||agent.teamId),{responseData,tokensData,keyId:tokenKey,isNewStructure}}catch(error){throw new Error(`Failed to parse retrieved tokens: ${error}`)}}catch(error){throw logger$h.error("Error retrieving OAuth tokens:",error),error}},handleOAuthHeaders=async(agent,config2,reqConfig,logger2,additionalParams={})=>{let headers={};const{responseData:oauthTokens,tokensData,keyId,isNewStructure}=await retrieveOAuthTokens(agent,config2);try{let oAuthConfigString=JSON.stringify({consumerKey:oauthTokens.consumerKey||"",consumerSecret:oauthTokens.consumerSecret||"",clientID:oauthTokens.clientID||"",clientSecret:oauthTokens.clientSecret||"",tokenURL:oauthTokens.tokenURL||""});oAuthConfigString=await TemplateString(oAuthConfigString).parseTeamKeysAsync(oauthTokens.team||agent.teamId).asyncResult;const oAuthConfig=JSON.parse(oAuthConfigString);if(oauthTokens.service==="oauth2_client_credentials"){const accessToken=await getClientCredentialToken(tokensData,logger2,keyId,oauthTokens,config2,agent,isNewStructure);headers.Authorization=`Bearer ${accessToken}`}else if(oauthTokens.type==="oauth"){const oauthHeader=buildOAuth1Header(reqConfig.url,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,tokensData,keyId,logger2,agent,isNewStructure).getAccessToken();headers.Authorization=`Bearer ${accessToken}`}return headers}catch(error){throw logger2.error(`Access token check failed: ${error}`),error}};async function getClientCredentialToken(tokensData,logger2,keyId,oauthTokens,config2,agent,isNewStructure=!1){const logAndThrowError=message=>{throw logger2.debug(message),new Error(message)};try{const{clientID,clientSecret,tokenURL}=oauthTokens,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"}});logger2.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;let updatedData;if(isNewStructure){const parts=String(config2?.data?.oauth_con_id??"").split("_"),prefixSuffix=parts.length>1?parts[1]:parts[0],oauthKeysPrefix=prefixSuffix?`OAUTH_${prefixSuffix}`:void 0;updatedData={...tokensData||{},auth_data:{...tokensData?.auth_data||{},primary:newAccessToken,expires_in:expirationTimestamp.toString()},auth_settings:{...tokensData?.auth_settings||{},type:"oauth2",tokenURL,clientID,clientSecret,...oauthKeysPrefix?{oauth_keys_prefix:oauthKeysPrefix}:{},service:"oauth2_client_credentials"}}}else updatedData={...tokensData,primary:newAccessToken,expires_in:expirationTimestamp.toString()},updatedData.type||(updatedData.type="oauth2"),updatedData.tokenURL||(updatedData.tokenURL=tokenURL),updatedData.team||(updatedData.team=agent.teamId),updatedData.oauth_info||(updatedData.oauth_info={oauth_keys_prefix:`OAUTH_${config2?.data?.oauth_con_id?.split("_")[1]||config2?.id}`,service:"oauth2_client_credentials",tokenURL,clientID,clientSecret});return await managedVault.user(AccessCandidate.agent(agent.id)).set(keyId,JSON.stringify(updatedData)),newAccessToken}else return logger2.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$1e=Object.defineProperty,__defNormalProp$1e=(obj,key,value)=>key in obj?__defProp$1e(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1e=(obj,key,value)=>__defNormalProp$1e(obj,typeof key!="symbol"?key+"":key,value);class APICall extends Component{constructor(){super(),__publicField$1e(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$1e(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"),oauth_con_id:Joi.string().allow("").label("OAuth Connection ID")}))}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,AccessCandidate.agent(agent.id))),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(logger2.debug("checking oauth config",config2?.data?.oauth_con_id,config2?.data?.oauthService),config2?.data?.oauth_con_id&&config2.data.oauth_con_id!=="None"||config2?.data?.oauthService&&config2.data.oauthService!=="None"){const additionalParams=extractAdditionalParamsForOAuth1(reqConfig),oauthHeaders=await handleOAuthHeaders(agent,config2,reqConfig,logger2,additionalParams);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
|
|
115
|
-
`,Response),Headers=Object.fromEntries(Object.entries(response.headers))}catch(error){logger2.debug(`Error making API call: ${error.message}`),Headers=error?.response?.headers?Object.fromEntries(Object.entries(error.response.headers)):{},Response=await parseArrayBufferResponse(error.response,agent),_error=error.message}return{Response,Headers,_error,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}finally{publicUrls.length>0&&await destroyPublicUrls(publicUrls)}}}var __defProp$
|
|
87
|
+
`,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/json","application/ld+json","application/geo+json","application/graphql","application/vnd.api+json","application/json-patch+json","application/merge-patch+json","application/problem+json","application/hal+json","application/vnd.collection+json","application/json-seq","application/csp-report","application/manifest+json","application/cloudevents+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$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 console$n=Logger("AccessTokenManager");let managedVault$1;SystemEvents.on("SRE:Booted",()=>{managedVault$1=ConnectorService.getManagedVaultConnector()});class AccessTokenManager{constructor(clientId,clientSecret,secondaryToken,tokenUrl,expires_in,primaryToken,tokensData,keyId,logger2,agent,isNewStructure=!1){__publicField$1j(this,"clientId"),__publicField$1j(this,"clientSecret"),__publicField$1j(this,"primaryToken"),__publicField$1j(this,"secondaryToken"),__publicField$1j(this,"tokenUrl"),__publicField$1j(this,"expires_in"),__publicField$1j(this,"tokensData"),__publicField$1j(this,"keyId"),__publicField$1j(this,"logger"),__publicField$1j(this,"agent"),__publicField$1j(this,"isNewStructure"),this.clientId=clientId,this.clientSecret=clientSecret,this.primaryToken=primaryToken,this.secondaryToken=secondaryToken,this.tokenUrl=tokenUrl,this.expires_in=expires_in,this.tokensData=tokensData,this.keyId=keyId,this.logger=logger2,this.agent=agent,this.isNewStructure=isNewStructure}async getAccessToken(){try{const currentTime=new Date().getTime();if(!this.secondaryToken&&!this.expires_in)return console$n.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$n.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$n.log("Access token is expired or missing. Refreshing access token..."),await this.refreshAccessToken()}else return console$n.log("Access token is still valid"),this.logger.debug("Access token is still valid."),this.primaryToken}catch(error){throw console$n.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$n.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;let updatedData;this.isNewStructure?updatedData={...this.tokensData,auth_data:{...this.tokensData?.auth_data??{},primary:newAccessToken,secondary:response?.data?.refresh_token??this.secondaryToken,expires_in:(expirationTimestamp??void 0)!==void 0?String(expirationTimestamp):void 0}}:(updatedData={...this.tokensData,primary:newAccessToken,expires_in:(expirationTimestamp??void 0)!==void 0?String(expirationTimestamp):void 0},updatedData.secondary=response?.data?.refresh_token??this.secondaryToken);const save=await managedVault$1.user(AccessCandidate.agent(this.agent.id)).set(this.keyId,JSON.stringify(updatedData));return save&&save.status===200?(console$n.log("Access token value is updated successfully."),this.logger.debug("Access token value is updated successfully.")):(console$n.log("Warning: new access token value is not updated."),this.logger.debug("Warning: new access token value is not updated.")),this.tokensData=updatedData,this.primaryToken=newAccessToken,this.secondaryToken=response?.data?.refresh_token??this.secondaryToken,this.expires_in=(expirationTimestamp??void 0)!==void 0?String(expirationTimestamp):void 0,newAccessToken}catch(error){throw console$n.error("Failed to refresh access token:",error),this.logger.debug(`Failed to refresh access token: ${error}`),new Error("Failed to refresh access token.")}}}const logger$h=Logger("OAuth.helper");let managedVault;SystemEvents.on("SRE:Booted",()=>{try{managedVault=ConnectorService.getManagedVaultConnector()}catch{logger$h.warn("Could not find a compatible ManagedVault connector, OAuth APICalls will not work")}});function extractAdditionalParamsForOAuth1(reqConfig={}){let additionalParams={};reqConfig.url&&(reqConfig.url.includes("{{")||reqConfig.url.includes("${{"))&&logger$h.warn("Warning: URL contains unresolved template variables for OAuth1 signature:",reqConfig.url);try{const searchParams=new URL(reqConfig.url).searchParams;additionalParams=Object.fromEntries(searchParams.entries()),searchParams.toString()&&logger$h.debug("OAuth1: Found query parameters:",Object.keys(additionalParams))}catch(error){logger$h.warn("Failed to parse URL for OAuth1 parameters:",error)}const headers=reqConfig.headers||{};let contentType="";if(Array.isArray(headers)){const contentTypeHeader=headers.find(h=>Object.keys(h).some(k=>k.toLowerCase()==="content-type"));if(contentTypeHeader){const key=Object.keys(contentTypeHeader).find(k=>k.toLowerCase()==="content-type");contentType=contentTypeHeader[key]}}else contentType=headers["Content-Type"]||headers["content-type"]||"";const method=(reqConfig.method||"GET").toUpperCase();if(contentType.includes(REQUEST_CONTENT_TYPES.urlEncodedFormData)){if(reqConfig.data){let formParams={};if(typeof reqConfig.data=="string"){(reqConfig.data.includes("{{")||reqConfig.data.includes("${{"))&&logger$h.warn("Warning: Form data contains unresolved template variables for OAuth1 signature");const formData=new URLSearchParams(reqConfig.data);formParams=Object.fromEntries(formData.entries())}else reqConfig.data instanceof URLSearchParams?formParams=Object.fromEntries(reqConfig.data.entries()):typeof reqConfig.data=="object"&&(formParams=reqConfig.data);logger$h.debug("OAuth1: Including form parameters in signature:",Object.keys(formParams)),additionalParams={...additionalParams,...formParams}}}else if(contentType.includes(REQUEST_CONTENT_TYPES.json)||contentType.includes("application/")||contentType.includes("text/")){if(reqConfig.data&&method!=="GET"&&method!=="HEAD"){let bodyString="";typeof reqConfig.data=="string"?bodyString=reqConfig.data:bodyString=JSON.stringify(reqConfig.data),(bodyString.includes("{{")||bodyString.includes("${{"))&&logger$h.warn("Warning: Request body contains unresolved template variables for OAuth1 signature");const hash=crypto$1.createHash("sha1").update(bodyString).digest("base64");additionalParams.oauth_body_hash=hash,logger$h.debug("OAuth1: Added oauth_body_hash for",contentType)}}else if(contentType.includes(REQUEST_CONTENT_TYPES.multipartFormData)){if(reqConfig.data&&typeof reqConfig.data=="object"&&"entries"in reqConfig.data){const formData=reqConfig.data;for(const[key,value]of formData.entries())if(typeof value=="string")additionalParams[key]=value;else{if(typeof value=="object"&&value!==null&&("size"in value||"type"in value))continue;additionalParams[key]=String(value)}}}else if(!contentType&&(method==="POST"||method==="PUT"||method==="PATCH")&&reqConfig.data){const bodyString=typeof reqConfig.data=="string"?reqConfig.data:JSON.stringify(reqConfig.data),hash=crypto$1.createHash("sha1").update(bodyString).digest("base64");additionalParams.oauth_body_hash=hash}return logger$h.debug("OAuth1: Total parameters for signature:",Object.keys(additionalParams).length),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")}});let baseUrl=url;try{const urlObj=new URL(url);baseUrl=`${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`,logger$h.debug("OAuth1: Base URL for signature:",baseUrl)}catch(error){logger$h.warn("Failed to parse URL for OAuth1 signature:",error)}const requestData={url:baseUrl,method:method.toUpperCase(),data:additionalParams},token=oauth1Credentials.token&&oauth1Credentials.token!==""?{key:oauth1Credentials.token,secret:oauth1Credentials.tokenSecret||""}:null,signedRequest=oauth.authorize(requestData,token);return oauth.toHeader(signedRequest)},retrieveOAuthTokens=async(agent,config2)=>{let tokenKey=null;try{tokenKey=config2?.data?.oauth_con_id||`OAUTH_${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 isNewStructure=tokensData.auth_data!==void 0&&tokensData.auth_settings!==void 0;isNewStructure&&await Promise.all(Object.keys(tokensData.auth_settings).map(async key=>{typeof tokensData.auth_settings[key]=="string"&&(tokensData.auth_settings[key]=await TemplateString(tokensData.auth_settings[key]).parseTeamKeysAsync(agent.teamId).asyncResult)}));const primaryToken=isNewStructure?tokensData.auth_data?.primary:tokensData.primary,secondaryToken=isNewStructure?tokensData.auth_data?.secondary:tokensData.secondary,expiresIn=isNewStructure?tokensData.auth_data?.expires_in:tokensData.expires_in,type=isNewStructure?tokensData.auth_settings?.type:tokensData.type||tokensData.oauth_info?.type,service=isNewStructure?tokensData.auth_settings?.service:tokensData.oauth_info?.service;if(type==="oauth2"&&service!=="oauth2_client_credentials"&&(secondaryToken||logger$h.warn("Warning: refresh_token is missing for OAuth2"),expiresIn||logger$h.warn("Warning: expires_in is missing for OAuth2.")),service!=="oauth2_client_credentials"&&!primaryToken)throw new Error("Retrieved OAuth tokens do not exist, invalid OR incomplete. Please authenticate ...");const responseData={primaryToken,secondaryToken,type,service};return type==="oauth"?(isNewStructure?(responseData.consumerKey=tokensData.auth_settings?.consumerKey,responseData.consumerSecret=tokensData.auth_settings?.consumerSecret,responseData.tokenURL=tokensData.auth_settings?.tokenURL):(responseData.consumerKey=tokensData.consumerKey||tokensData.oauth_info?.consumerKey,responseData.consumerSecret=tokensData.consumerSecret||tokensData.oauth_info?.consumerSecret,responseData.tokenURL=tokensData.tokenURL||tokensData.oauth_info?.tokenURL),responseData.team=tokensData.team||agent.teamId):type==="oauth2"&&(isNewStructure?(responseData.tokenURL=tokensData.auth_settings?.tokenURL,responseData.clientID=tokensData.auth_settings?.clientID,responseData.clientSecret=tokensData.auth_settings?.clientSecret):(responseData.tokenURL=tokensData.tokenURL||tokensData.oauth_info?.tokenURL,responseData.clientID=tokensData.clientID||tokensData.oauth_info?.clientID,responseData.clientSecret=tokensData.clientSecret||tokensData.oauth_info?.clientSecret),responseData.expiresIn=expiresIn??0,responseData.team=tokensData.team||agent.teamId),{responseData,tokensData,keyId:tokenKey,isNewStructure}}catch(error){throw new Error(`Failed to parse retrieved tokens: ${error}`)}}catch(error){throw logger$h.error("Error retrieving OAuth tokens:",error),error}},handleOAuthHeaders=async(agent,config2,reqConfig,logger2,additionalParams={})=>{let headers={};const{responseData:oauthTokens,tokensData,keyId,isNewStructure}=await retrieveOAuthTokens(agent,config2);try{let oAuthConfigString=JSON.stringify({consumerKey:oauthTokens.consumerKey||"",consumerSecret:oauthTokens.consumerSecret||"",clientID:oauthTokens.clientID||"",clientSecret:oauthTokens.clientSecret||"",tokenURL:oauthTokens.tokenURL||""});oAuthConfigString=await TemplateString(oAuthConfigString).parseTeamKeysAsync(oauthTokens.team||agent.teamId).asyncResult;const oAuthConfig=JSON.parse(oAuthConfigString);if(oauthTokens.service==="oauth2_client_credentials"){const accessToken=await getClientCredentialToken(tokensData,logger2,keyId,oauthTokens,config2,agent,isNewStructure);headers.Authorization=`Bearer ${accessToken}`}else if(oauthTokens.type==="oauth"){const oauthHeader=buildOAuth1Header(reqConfig.url,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,tokensData,keyId,logger2,agent,isNewStructure).getAccessToken();headers.Authorization=`Bearer ${accessToken}`}return headers}catch(error){throw logger2.error(`Access token check failed: ${error}`),error}};async function getClientCredentialToken(tokensData,logger2,keyId,oauthTokens,config2,agent,isNewStructure=!1){const logAndThrowError=message=>{throw logger2.debug(message),new Error(message)};try{const{clientID,clientSecret,tokenURL}=oauthTokens,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"}});logger2.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;let updatedData;if(isNewStructure){const parts=String(config2?.data?.oauth_con_id??"").split("_"),prefixSuffix=parts.length>1?parts[1]:parts[0],oauthKeysPrefix=prefixSuffix?`OAUTH_${prefixSuffix}`:void 0;updatedData={...tokensData||{},auth_data:{...tokensData?.auth_data||{},primary:newAccessToken,expires_in:expirationTimestamp.toString()},auth_settings:{...tokensData?.auth_settings||{},type:"oauth2",tokenURL,clientID,clientSecret,...oauthKeysPrefix?{oauth_keys_prefix:oauthKeysPrefix}:{},service:"oauth2_client_credentials"}}}else updatedData={...tokensData,primary:newAccessToken,expires_in:expirationTimestamp.toString()},updatedData.type||(updatedData.type="oauth2"),updatedData.tokenURL||(updatedData.tokenURL=tokenURL),updatedData.team||(updatedData.team=agent.teamId),updatedData.oauth_info||(updatedData.oauth_info={oauth_keys_prefix:`OAUTH_${config2?.data?.oauth_con_id?.split("_")[1]||config2?.id}`,service:"oauth2_client_credentials",tokenURL,clientID,clientSecret});return await managedVault.user(AccessCandidate.agent(agent.id)).set(keyId,JSON.stringify(updatedData)),newAccessToken}else return logger2.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$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);class APICall extends Component{constructor(){super(),__publicField$1i(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$1i(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"),oauth_con_id:Joi.string().allow("").label("OAuth Connection ID")}))}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,AccessCandidate.agent(agent.id))),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(logger2.debug("checking oauth config",config2?.data?.oauth_con_id,config2?.data?.oauthService),config2?.data?.oauth_con_id&&config2.data.oauth_con_id!=="None"||config2?.data?.oauthService&&config2.data.oauthService!=="None"){const additionalParams=extractAdditionalParamsForOAuth1(reqConfig),oauthHeaders=await handleOAuthHeaders(agent,config2,reqConfig,logger2,additionalParams);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
|
|
88
|
+
`,Response),Headers=Object.fromEntries(Object.entries(response.headers))}catch(error){logger2.debug(`Error making API call: ${error.message}`),Headers=error?.response?.headers?Object.fromEntries(Object.entries(error.response.headers)):{},Response=await parseArrayBufferResponse(error.response,agent),_error=error.message}return{Response,Headers,_error,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}finally{publicUrls.length>0&&await destroyPublicUrls(publicUrls)}}}var __defProp$1h=Object.defineProperty,__defNormalProp$1h=(obj,key,value)=>key in obj?__defProp$1h(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1h=(obj,key,value)=>__defNormalProp$1h(obj,key+"",value);class VisionLLM extends Component{constructor(){super(),__publicField$1h(this,"configSchema",Joi.object({prompt:Joi.string().required().max(8e6).label("Prompt"),maxTokens:Joi.number().min(1).label("Maximum Tokens"),model:Joi.string().max(200).required(),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("=== Vision LLM Log ===");const passThrough=config2.data.passthrough||!1,model=config2.data?.model,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
|
|
116
89
|
`,prompt,`
|
|
117
90
|
`);const files=Array.isArray(input.Images)?input.Images:[input.Images];let response;if(passThrough?response=await new Promise(async(resolve,reject)=>{let _content="";const eventEmitter=await llmInference.multimodalStreamRequestLegacy(prompt,files,config2,agent).catch(error=>{console.error("Error on multimodalStreamRequest: ",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,files,params:{...config2,agentId:agent.id}}),!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
|
|
118
|
-
`,response);const result={Reply:response};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$
|
|
91
|
+
`,response);const result={Reply:response};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$1g=Object.defineProperty,__defNormalProp$1g=(obj,key,value)=>key in obj?__defProp$1g(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1g=(obj,key,value)=>__defNormalProp$1g(obj,typeof key!="symbol"?key+"":key,value);class BaseEmbedding{constructor(fields){__publicField$1g(this,"model"),__publicField$1g(this,"modelName"),__publicField$1g(this,"chunkSize",512),__publicField$1g(this,"chunkOverlap",100),__publicField$1g(this,"stripNewLines",!0),__publicField$1g(this,"dimensions"),__publicField$1g(this,"timeout"),__publicField$1g(this,"batchSize",10),this.model=fields?.model??this.model,this.chunkSize=fields?.chunkSize||fields?.params?.chunkSize||this.chunkSize,this.chunkOverlap=fields?.chunkOverlap||fields?.params?.chunkOverlap||this.chunkOverlap,this.stripNewLines=fields?.stripNewLines||fields?.params?.stripNewLines||this.stripNewLines,this.timeout=fields?.timeout||fields?.params?.timeout,this.dimensions=fields?.dimensions||fields?.params?.dimensions}chunkArr(arr,sizePerChunk){return arr.reduce((chunks,elem,index)=>{const chunkIndex=Math.floor(index/sizePerChunk),chunk=chunks[chunkIndex]||[];return chunks[chunkIndex]=chunk.concat([elem]),chunks},[])}chunkText(text,{chunkSize,chunkOverlap}){return new TextSplitter({chunkSize:chunkSize??this.chunkSize,chunkOverlap:chunkOverlap??this.chunkOverlap}).splitText(text)}processTexts(texts){return this.stripNewLines?texts.map(t=>t.replace(/\n/g," ")):texts}detectSourceType(source){return typeof source=="string"?isUrl(source)?"url":"text":Array.isArray(source)&&source.every(v=>typeof v=="number")?"vector":"unknown"}transformSource(source,sourceType,candidate){switch(sourceType){case"text":{const texts=source.map(s=>s.source);return this.embedTexts(texts,candidate).then(vectors=>source.map((s,i)=>({...s,source:vectors[i],metadata:{...s.metadata,text:texts[i]}})))}case"vector":return source}}get dummyVector(){return Array(this.dimensions-1).fill(0).concat([1])}}class TextSplitter{constructor({chunkSize=1e3,chunkOverlap=200,separators,keepSeparator}={}){if(__publicField$1g(this,"chunkSize"),__publicField$1g(this,"chunkOverlap"),__publicField$1g(this,"separators",[`
|
|
92
|
+
|
|
93
|
+
`,`
|
|
94
|
+
`," ",""]),__publicField$1g(this,"keepSeparator",!0),this.chunkSize=chunkSize,this.chunkOverlap=chunkOverlap,separators&&(this.separators=separators),keepSeparator!==void 0&&(this.keepSeparator=keepSeparator),this.chunkOverlap>=this.chunkSize)throw new Error("Cannot have chunkOverlap >= chunkSize")}splitText(text){return this._splitText(text,this.separators)}_splitText(text,separators){const finalChunks=[];let separator=separators[separators.length-1],newSeparators;for(let i=0;i<separators.length;i+=1){const s=separators[i];if(s===""){separator=s;break}if(text.includes(s)){separator=s,newSeparators=separators.slice(i+1);break}}const splits=this.splitOnSeparator(text,separator);let goodSplits=[];const _separator=this.keepSeparator?"":separator;for(const s of splits)if(this.lengthFunction(s)<this.chunkSize)goodSplits.push(s);else{if(goodSplits.length){const mergedText=this.mergeSplits(goodSplits,_separator);finalChunks.push(...mergedText),goodSplits=[]}if(!newSeparators)finalChunks.push(s);else{const otherInfo=this._splitText(s,newSeparators);finalChunks.push(...otherInfo)}}if(goodSplits.length){const mergedText=this.mergeSplits(goodSplits,_separator);finalChunks.push(...mergedText)}return finalChunks}splitOnSeparator(text,separator){let splits;if(separator)if(this.keepSeparator){const regexEscapedSeparator=separator.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&");splits=text.split(new RegExp(`(?=${regexEscapedSeparator})`))}else splits=text.split(separator);else splits=text.split("");return splits.filter(s=>s!=="")}lengthFunction(text){return text.length}joinDocs(docs,separator){const text=docs.join(separator).trim();return text===""?null:text}mergeSplits(splits,separator){const docs=[],currentDoc=[];let total=0;for(const d of splits){const _len=this.lengthFunction(d);if(total+_len+currentDoc.length*separator.length>this.chunkSize&&(total>this.chunkSize&&console.warn(`Created a chunk of size ${total}, which is longer than the specified ${this.chunkSize}`),currentDoc.length>0)){const doc2=this.joinDocs(currentDoc,separator);for(doc2!==null&&docs.push(doc2);total>this.chunkOverlap||total+_len+currentDoc.length*separator.length>this.chunkSize&&total>0;)total-=this.lengthFunction(currentDoc[0]),currentDoc.shift()}currentDoc.push(d),total+=_len}const doc=this.joinDocs(currentDoc,separator);return doc!==null&&docs.push(doc),docs}}async function getLLMCredentials(candidate,modelInfo){const credentialsList=Array.isArray(modelInfo.credentials)?modelInfo.credentials||[TLLMCredentials.Internal]:[modelInfo.credentials||TLLMCredentials.Internal];for(let credentialsMode of credentialsList){if(typeof credentialsMode=="object"){const resolvedCredentials={};for(const[key,value]of Object.entries(credentialsMode))resolvedCredentials[key]=await resolveKeyTemplate(value,candidate);return resolvedCredentials}switch(credentialsMode){case TLLMCredentials.None:return{apiKey:""};case TLLMCredentials.Internal:{const credentials=await getEnvCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.Vault:{const credentials=await getStandardLLMCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.BedrockVault:{const credentials=await getBedrockCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.VertexAIVault:{const credentials=await getVertexAICredentials(candidate,modelInfo);if(credentials)return credentials;break}}}return{}}const SMYTHOS_API_KEYS={echo:"",openai:process.env.OPENAI_API_KEY,anthropic:process.env.ANTHROPIC_API_KEY,googleai:process.env.GOOGLE_AI_API_KEY,togetherai:process.env.TOGETHER_AI_API_KEY,groq:process.env.GROQ_API_KEY,xai:process.env.XAI_API_KEY,perplexity:process.env.PERPLEXITY_API_KEY};async function getEnvCredentials(candidate,modelInfo){const provider=(modelInfo.provider||modelInfo.llm)?.toLowerCase(),apiKey=SMYTHOS_API_KEYS?.[provider]||"";return apiKey?{apiKey}:null}async function getStandardLLMCredentials(candidate,modelInfo){const provider=(modelInfo.provider||modelInfo.llm)?.toLowerCase(),apiKey=await ConnectorService.getVaultConnector().requester(candidate).get(provider).catch(()=>"");return apiKey?{apiKey,isUserKey:!0}:null}async function getBedrockCredentials(candidate,modelInfo){const keyIdName=modelInfo.settings?.keyIDName,secretKeyName=modelInfo.settings?.secretKeyName,sessionKeyName=modelInfo.settings?.sessionKeyName,vaultConnector=ConnectorService.getVaultConnector(),[accessKeyId,secretAccessKey,sessionToken]=await Promise.all([vaultConnector.requester(candidate).get(keyIdName).catch(()=>""),vaultConnector.requester(candidate).get(secretKeyName).catch(()=>""),vaultConnector.requester(candidate).get(sessionKeyName).catch(()=>"")]);let credentials={accessKeyId,secretAccessKey,isUserKey:!0};return sessionToken&&(credentials.sessionToken=sessionToken),!accessKeyId||!secretAccessKey?null:credentials}async function getVertexAICredentials(candidate,modelInfo){const jsonCredentialsName=modelInfo.settings?.jsonCredentialsName;let jsonCredentials=await ConnectorService.getVaultConnector().requester(candidate).get(jsonCredentialsName).catch(()=>"");const credentials=JSON.parse(jsonCredentials);return credentials?{...credentials,isUserKey:!0}:null}function createVaultKeyProcessor(candidate){return async token=>{try{return await ConnectorService.getVaultConnector().requester(candidate).get(token)}catch{return""}}}async function resolveKeyTemplate(value,candidate){if(typeof value=="string")return await TemplateString(value).process(createVaultKeyProcessor(candidate),Match.fn("KEY")).asyncResult;if(Array.isArray(value))return await Promise.all(value.map(item=>resolveKeyTemplate(item,candidate)));if(typeof value=="object"&&value!==null){const resolvedObject={};for(const[key,val]of Object.entries(value))resolvedObject[key]=await resolveKeyTemplate(val,candidate);return resolvedObject}return value}var __defProp$1f=Object.defineProperty,__defNormalProp$1f=(obj,key,value)=>key in obj?__defProp$1f(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1f=(obj,key,value)=>__defNormalProp$1f(obj,typeof key!="symbol"?key+"":key,value);const createOpenAIError=(statusCode,error)=>new OpenAI$1.APIError(statusCode,{code:error?.errKey||error?.code,message:error?.message,type:error?.name},error?.message,null),DEFAULT_MODEL$1="text-embedding-3-large";class OpenAIEmbeds extends BaseEmbedding{constructor(settings){super({model:settings?.model??DEFAULT_MODEL$1,...settings}),this.settings=settings,__publicField$1f(this,"client"),__publicField$1f(this,"clientConfig"),__publicField$1f(this,"canSpecifyDimensions",!0),this.clientConfig={dangerouslyAllowBrowser:!0},this.model==="text-embedding-ada-002"&&(this.canSpecifyDimensions=!1)}async embedTexts(texts,candidate){const batches=this.chunkArr(this.processTexts(texts),this.batchSize),batchRequests=batches.map(batch=>{const params={model:this.model,input:batch};return this.dimensions&&this.canSpecifyDimensions&&(params.dimensions=this.dimensions),this.embed(params,candidate)}),batchResponses=await Promise.all(batchRequests),embeddings=[];for(let i=0;i<batchResponses.length;i+=1){const batch=batches[i],{data:batchResponse}=batchResponses[i];for(let j=0;j<batch.length;j+=1)embeddings.push(batchResponse[j].embedding)}return embeddings}async embedText(text,candidate){const params={model:this.model,input:this.processTexts([text])[0]};this.dimensions&&this.canSpecifyDimensions&&(params.dimensions=this.dimensions);const{data}=await this.embed(params,candidate);return data[0].embedding}async embed(request,candidate){const modelInfo={provider:"OpenAI",modelId:this.model,credentials:this.settings?.credentials||[TLLMCredentials.Internal,TLLMCredentials.Vault]},credentials=await getLLMCredentials(candidate,modelInfo);if(!this.client){const params={...this.clientConfig,apiKey:credentials.apiKey,timeout:this.timeout,maxRetries:0};this.client=new OpenAI(params)}try{return await this.client.embeddings.create(request)}catch(e){throw createOpenAIError(e.statusCode,e)}}}__publicField$1f(OpenAIEmbeds,"models",["text-embedding-3-large","text-embedding-ada-002"]);var __defProp$1e=Object.defineProperty,__defNormalProp$1e=(obj,key,value)=>key in obj?__defProp$1e(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1e=(obj,key,value)=>__defNormalProp$1e(obj,typeof key!="symbol"?key+"":key,value);const DEFAULT_MODEL="gemini-embedding-001";class GoogleEmbeds extends BaseEmbedding{constructor(settings){super({model:settings?.model??DEFAULT_MODEL,...settings}),this.settings=settings,__publicField$1e(this,"client"),__publicField$1e(this,"canSpecifyDimensions",!0)}async embedTexts(texts,candidate){const batches=this.chunkArr(this.processTexts(texts),this.batchSize),batchRequests=batches.map(batch=>this.embed(batch,candidate)),batchResponses=await Promise.all(batchRequests),embeddings=[];for(let i=0;i<batchResponses.length;i+=1){const batch=batches[i],batchResponse=batchResponses[i];for(let j=0;j<batch.length;j+=1)embeddings.push(batchResponse[j])}return embeddings}async embedText(text,candidate){const processedText=this.processTexts([text])[0];return(await this.embed([processedText],candidate))[0]}async embed(texts,candidate){let apiKey;try{const modelInfo={provider:"GoogleAI",modelId:this.model,credentials:this.settings?.credentials||[TLLMCredentials.Internal,TLLMCredentials.Vault]};apiKey=(await getLLMCredentials(candidate,modelInfo))?.apiKey}catch{}if(apiKey||(apiKey=process.env.GOOGLE_AI_API_KEY),!apiKey)throw new Error("Please provide an API key for Google AI embeddings via credentials or GOOGLE_AI_API_KEY environment variable");this.client||(this.client=new GoogleGenAI({apiKey}));try{const outputDimensionality=this.dimensions&&Number.isFinite(this.dimensions)?this.dimensions:void 0,res=await this.client.models.embedContent({model:this.model,contents:texts,...outputDimensionality?{outputDimensionality}:{}}),vectors=Array.isArray(res.embeddings)?res.embeddings.map(e=>e.values):[res.embedding?.values||[]],targetDim=outputDimensionality;return vectors.map(v=>this.postProcessEmbedding(v,targetDim))}catch(e){throw new Error(`Google Embeddings API error: ${e.message||e}`)}}postProcessEmbedding(values,targetDim){let v=Array.isArray(values)?values.slice():[];if(targetDim&&targetDim>0&&(v.length>targetDim?v=v.slice(0,targetDim):v.length<targetDim&&(v=v.concat(Array(targetDim-v.length).fill(0)))),(targetDim&&targetDim!==3072||!targetDim&&v.length!==3072)&&v.length>0){const norm=Math.sqrt(v.reduce((acc,x)=>acc+x*x,0));norm>0&&(v=v.map(x=>x/norm))}return v}}__publicField$1e(GoogleEmbeds,"models",["gemini-embedding-001","text-embedding-005","text-multilingual-embedding-002"]);const supportedProviders={OpenAI:{embedder:OpenAIEmbeds,models:OpenAIEmbeds.models},GoogleAI:{embedder:GoogleEmbeds,models:GoogleEmbeds.models}};class EmbeddingsFactory{static create(provider,config2){return provider||(provider="OpenAI"),config2||(config2={provider:"OpenAI",model:"text-embedding-3-large",dimensions:1024}),config2.model&&typeof config2.model=="object"&&(provider=config2.model.provider,config2.credentials=config2.model.credentials,config2.model=config2.model.modelId),new supportedProviders[provider].embedder(config2)}static getProviderByModel(model){return Object.keys(supportedProviders).find(provider=>supportedProviders[provider].models.includes(model))}static getModels(){return Object.keys(supportedProviders).reduce((acc,provider)=>(acc.push(...supportedProviders[provider].models.map(model=>({provider,model}))),acc),[]).filter(item=>item.model!=="text-embedding-ada-002");//! SPECIAL case for ada-002, it doesn't support dimensions passing
|
|
95
|
+
}}var __defProp$1d=Object.defineProperty,__defNormalProp$1d=(obj,key,value)=>key in obj?__defProp$1d(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1d=(obj,key,value)=>__defNormalProp$1d(obj,key+"",value),TDataSourceCompErrorCodes=(TDataSourceCompErrorCodes2=>(TDataSourceCompErrorCodes2[TDataSourceCompErrorCodes2.NAMESPACE_NOT_FOUND=1]="NAMESPACE_NOT_FOUND",TDataSourceCompErrorCodes2[TDataSourceCompErrorCodes2.CREDENTIAL_NOT_FOUND=2]="CREDENTIAL_NOT_FOUND",TDataSourceCompErrorCodes2[TDataSourceCompErrorCodes2.EMBEDDING_CONFIG_ERROR=3]="EMBEDDING_CONFIG_ERROR",TDataSourceCompErrorCodes2))(TDataSourceCompErrorCodes||{});class DataSourceCompError extends Error{constructor(message,code){super(message),__publicField$1d(this,"code"),this.name="DataSourceCompError",this.code=code}}class DataSourceComponent extends Component{constructor(){super()}async resolveVectorDbConnector(namespace,teamId){let namespaceRecord=namespace;if(typeof namespace=="string"){const rawNsRecord=await ConnectorService.getNKVConnector().requester(AccessCandidate.team(teamId)).get("vectorDB:namespaces",namespace);if(!rawNsRecord)throw new DataSourceCompError(`Namespace ${namespace} does not exist`,1);namespaceRecord=JSON.parse(rawNsRecord.toString())}const rawCredRecord=await ConnectorService.getAccountConnector().requester(AccessCandidate.team(teamId)).getTeamSetting(namespaceRecord.credentialId,"vector_db_creds");if(!rawCredRecord)throw new DataSourceCompError(`Credential ${namespaceRecord.credentialId} does not exist`,2);const credRecord=JSON.parse(rawCredRecord);return await Promise.all(Object.keys(credRecord.credentials).map(async key=>{typeof credRecord.credentials[key]=="string"&&(credRecord.credentials[key]=await TemplateString(credRecord.credentials[key]).parseTeamKeysAsync(teamId).asyncResult)})),ConnectorService.getVectorDBConnector(credRecord.provider).instance({credentials:credRecord.credentials,embeddings:await this.buildEmbeddingConfig(namespaceRecord.embeddings,teamId)})}async buildEmbeddingConfig(embedding,teamId){const provider=EmbeddingsFactory.getProviderByModel(embedding.modelId);ConnectorService.getModelsProviderConnector().requester(AccessCandidate.team(teamId));const llmCreds=await getLLMCredentials(AccessCandidate.team(teamId),{provider,modelId:embedding.modelId,credentials:[TLLMCredentials.Vault,TLLMCredentials.Internal]});return{provider,model:embedding.modelId,credentials:llmCreds,dimensions:parseInt(embedding.dimensions),params:{dimensions:parseInt(embedding.dimensions)}}}static normalizeDsId(providedId,teamId,namespaceId){return`${teamId}::${namespaceId}::${providedId}`}}var __defProp$1c=Object.defineProperty,__defNormalProp$1c=(obj,key,value)=>key in obj?__defProp$1c(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1c=(obj,key,value)=>__defNormalProp$1c(obj,key+"",value);class LLMInference2{static async getInstance(model){throw new Error("Method not implemented.")}}class DataSourceLookup extends DataSourceComponent{constructor(){super(),__publicField$1c(this,"configSchema",Joi.object({topK:Joi.alternatives([Joi.string(),Joi.number()]).custom(validateInteger$2({min:0}),"custom range validation").label("Result Count"),model:Joi.string().valid("gpt-4o-mini","gpt-4","gpt-3.5-turbo","gpt-4","gpt-3.5-turbo-16k").optional(),prompt:Joi.string().max(3e4).allow("").label("Prompt").optional(),postprocess:Joi.boolean().strict().optional(),includeMetadata:Joi.boolean().strict().optional(),namespace:Joi.string().allow("").max(80).messages({"string.max":"The length of the 'namespace' name must be 50 characters or fewer."}),scoreThreshold:Joi.number().optional().label("Score Threshold"),includeScore:Joi.boolean().optional().label("Include Score"),version:Joi.string().valid("v1","v2").default("v1")}))}init(){}async process(input,config2,agent){if(await super.process(input,config2,agent),!config2.data.version||config2.data.version==="v1")return await this.processV1(input,config2,agent);if(config2.data.version==="v2")return await this.processV2(input,config2,agent)}async processV1(input,config2,agent){const componentId=config2.id;agent.components[componentId];const teamId=agent.teamId;let debugOutput=agent.agentRuntime?.debug?`== Data Source Lookup Log ==
|
|
96
|
+
`:null;const outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]="");const namespace=config2.data.namespace.split("_").slice(1).join("_")||config2.data.namespace,model=config2.data?.model||"gpt-4o-mini",prompt=config2.data?.prompt?.trim?.()||"",postprocess=config2.data?.postprocess||!1,includeMetadata=config2.data?.includeMetadata||!1,scoreThreshold=config2.data?.scoreThreshold||.001,includeScore=config2.data?.includeScore||!1,_input=typeof input.Query=="string"?input.Query:JSON.stringify(input.Query),topK=Math.max(config2.data?.topK||50,50);let vectorDbConnector=ConnectorService.getVectorDBConnector();if(!await vectorDbConnector.requester(AccessCandidate.team(teamId)).namespaceExists(namespace))throw new Error(`Namespace ${namespace} does not exist`);let results,_error;try{results=(await vectorDbConnector.requester(AccessCandidate.team(teamId)).search(namespace,_input,{topK,includeMetadata:!0})).slice(0,config2.data.topK).map(result=>({content:result.text,metadata:result.metadata,score:result.score})),results=results.filter(result=>result.score>=scoreThreshold),results=results.map(result=>{const transformedResult={content:result.content};return includeMetadata&&(transformedResult.metadata=this.parseMetadata(result.metadata||result.metadata?.metadata)),includeScore&&(transformedResult.score=result.score),includeMetadata||includeScore?transformedResult:result.content}),debugOutput+=`[Results]
|
|
97
|
+
Loaded ${results.length} results from namespace: ${namespace}
|
|
98
|
+
|
|
99
|
+
`}catch(error){_error=error.toString()}if(postprocess&&prompt){const promises=[];for(let result of results)TemplateString(prompt.replace(/{{result}}/g,JSON.stringify(result))).parse(input).result,await LLMInference2.getInstance(model);results=await Promise.all(promises);for(let i=0;i<results.length;i++)typeof results[i]=="string"&&(results[i]=JSONContent(results[i]).tryParse())}const totalLength=JSON.stringify(results).length;return debugOutput+=`[Total Length]
|
|
100
|
+
${totalLength}
|
|
101
|
+
|
|
102
|
+
`,{Results:results,_error,_debug:debugOutput}}async processV2(input,config2,agent){const teamId=agent.teamId;let debugOutput=agent.agentRuntime?.debug?`== Data Source Lookup Log ==
|
|
103
|
+
`:null;const outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]="");const namespaceLabel=/^c[a-z0-9]{24}.+$/.test(config2.data.namespace)?config2.data.namespace.split("_").slice(1).join("_"):config2.data.namespace,namespaceId=config2.data.namespace;config2.data?.model;const includeMetadata=config2.data?.includeMetadata||!1,scoreThreshold=config2.data?.scoreThreshold||.001,includeScore=config2.data?.includeScore||!1,_input=typeof input.Query=="string"?input.Query:JSON.stringify(input.Query),topK=Math.max(config2.data?.topK||50,50),vecDbConnector=await this.resolveVectorDbConnector(namespaceId,teamId);let results,_error;try{results=(await vecDbConnector.requester(AccessCandidate.team(teamId)).search(namespaceLabel,_input,{topK,includeMetadata:!0})).slice(0,config2.data.topK).map(result=>({content:result.text,metadata:result.metadata,score:result.score})),results=results.filter(result=>result.score>=scoreThreshold),results=results.map(result=>{const transformedResult={content:result.content};return includeMetadata&&(transformedResult.metadata=this.parseMetadata(result.metadata||result.metadata?.metadata)),includeScore&&(transformedResult.score=result.score),includeMetadata||includeScore?transformedResult:result.content}),debugOutput+=`[Results]
|
|
104
|
+
Loaded ${results.length} results from namespace: ${namespaceLabel}
|
|
105
|
+
|
|
106
|
+
`}catch(error){debugOutput+=`Error: ${error instanceof Error?error.message:error.toString()}
|
|
107
|
+
|
|
108
|
+
`,_error=error instanceof Error?error.message:error.toString()}const totalLength=JSON.stringify(results).length;return debugOutput+=`[Total Length]
|
|
109
|
+
${totalLength}
|
|
110
|
+
|
|
111
|
+
`,{Results:results,_error,_debug:debugOutput}}parseMetadata(metadata){try{return JSON.parse(jsonrepair(metadata))}catch{return metadata}}}var __defProp$1b=Object.defineProperty,__defNormalProp$1b=(obj,key,value)=>key in obj?__defProp$1b(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1b=(obj,key,value)=>__defNormalProp$1b(obj,typeof key!="symbol"?key+"":key,value);class DataSourceIndexer extends DataSourceComponent{constructor(){super(),__publicField$1b(this,"MAX_ALLOWED_URLS_PER_INPUT",20),__publicField$1b(this,"configSchema",Joi.object({namespace:Joi.string().max(50).allow(""),id:Joi.string().custom(validateCharacterSet,"id custom validation").allow("").label("source identifier"),name:Joi.string().max(50).allow("").label("label"),metadata:Joi.string().allow(null).allow("").max(1e4).label("metadata"),chunkSize:Joi.number().optional(),chunkOverlap:Joi.number().optional(),version:Joi.string().valid("v1","v2").default("v1")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);let response=null;return!config2.data.version||config2.data.version==="v1"?response=await this.processV1(input,config2,agent):config2.data.version==="v2"&&(response=await this.processV2(input,config2,agent)),response}async processV1(input,config2,agent){const teamId=agent.teamId;agent.id;let debugOutput=agent.agentRuntime?.debug?`== Source Indexer Log ==
|
|
112
|
+
`:null;try{const _config={...config2.data,name:TemplateString(config2.data.name).parse(input).result,id:TemplateString(config2.data.id).parse(input).result,metadata:TemplateString(config2.data.metadata).parse(input).result},outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?`<${con?.description}>`:"");const namespaceId=_config.namespace.split("_").slice(1).join("_")||_config.namespace;debugOutput+=`[Selected namespace id]
|
|
113
|
+
${namespaceId}
|
|
114
|
+
|
|
115
|
+
`;const vectorDbConnector=ConnectorService.getVectorDBConnector();if(!await vectorDbConnector.requester(AccessCandidate.team(teamId)).namespaceExists(namespaceId)){const newNs=await vectorDbConnector.requester(AccessCandidate.team(teamId)).createNamespace(namespaceId);debugOutput+=`[Created namespace]
|
|
116
|
+
${newNs}
|
|
117
|
+
|
|
118
|
+
`}const inputSchema=this.validateInput(input);if(inputSchema.error)throw new Error(`Input validation error: ${inputSchema.error}
|
|
119
|
+
EXITING...`);const providedId=_config.id,idRegex=/^[a-zA-Z0-9\-\_\.]+$/;if(providedId){if(!idRegex.test(providedId))throw new Error("Invalid id. Accepted characters: 'a-z', 'A-Z', '0-9', '-', '_', '.'")}else throw new Error("Id is required");let indexRes=null,parsedUrlArray=null;const dsId=DataSourceIndexer.normalizeDsId(providedId,teamId,namespaceId);if(isUrl(inputSchema.value.Source))throw debugOutput+=`STEP: Parsing input as url
|
|
120
|
+
|
|
121
|
+
`,new Error("URLs are not supported yet");return debugOutput+=`STEP: Parsing input as text
|
|
122
|
+
|
|
123
|
+
`,indexRes=await this.addDSFromText({teamId,namespaceId,text:inputSchema.value.Source,name:_config.name||"Untitled",metadata:_config.metadata||null,sourceId:dsId}),debugOutput+=`Created datasource successfully
|
|
124
|
+
|
|
125
|
+
`,{_debug:debugOutput,Success:{result:indexRes?.data?.dataSource||!0,id:_config.id}}}catch(err){return debugOutput+=`Error: ${err?.message||"Couldn't index data source"}
|
|
126
|
+
|
|
127
|
+
`,{_debug:debugOutput,_error:err?.message||"Couldn't index data source"}}}async processV2(input,config2,agent){const teamId=agent.teamId;agent.id;let debugOutput=agent.agentRuntime?.debug?`== Source Indexer Log ==
|
|
128
|
+
`:null;try{const _config={...config2.data,name:TemplateString(config2.data.name).parse(input).result,id:TemplateString(config2.data.id).parse(input).result,metadata:TemplateString(config2.data.metadata).parse(input).result},outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?`<${con?.description}>`:"");const namespaceLabel=/^c[a-z0-9]{24}.+$/.test(_config.namespace)?_config.namespace.split("_").slice(1).join("_"):_config.namespace,namespaceId=_config.namespace;debugOutput+=`[Selected namespace]
|
|
129
|
+
${namespaceLabel}
|
|
130
|
+
|
|
131
|
+
`;let vecDbConnector=null;try{vecDbConnector=await this.resolveVectorDbConnector(namespaceId,teamId)}catch(err){return debugOutput+=`Error: ${err?.message||"Couldn't get vector database connector"}
|
|
132
|
+
|
|
133
|
+
`,{_debug:debugOutput,_error:err?.message||"Couldn't get vector database connector"}}const vecDbClient=vecDbConnector.requester(AccessCandidate.team(teamId)),inputSchema=this.validateInput(input);if(inputSchema.error)throw new Error(`Input validation error: ${inputSchema.error}
|
|
134
|
+
EXITING...`);const providedId=_config.id,idRegex=/^[a-zA-Z0-9\-\_\.]+$/;if(providedId){if(!idRegex.test(providedId))throw new Error("Invalid id. Accepted characters: 'a-z', 'A-Z', '0-9', '-', '_', '.'")}else throw new Error("Id is required");const dsId=DataSourceIndexer.normalizeDsId(providedId,teamId,namespaceLabel);if(await vecDbClient.getDatasource(namespaceLabel,dsId))return debugOutput+=`Datasource already exists
|
|
135
|
+
|
|
136
|
+
`,{_debug:debugOutput,_error:"Datasource already exists"};debugOutput+=`STEP: Parsing input as text
|
|
137
|
+
|
|
138
|
+
`;const response=await vecDbClient.createDatasource(namespaceLabel,{text:inputSchema.value.Source,metadata:JSONContentHelper.create(_config.metadata).tryParse()||null,id:dsId,label:_config.name||"Untitled",chunkSize:_config.chunkSize?parseInt(_config.chunkSize):void 0,chunkOverlap:_config.chunkOverlap?parseInt(_config.chunkOverlap):void 0});return debugOutput+=`Created datasource successfully
|
|
139
|
+
|
|
140
|
+
`,{_debug:debugOutput,Success:{result:response||!0,id:_config.id}}}catch(err){return debugOutput+=`Error: ${err?.message||"Couldn't index data source"}
|
|
141
|
+
|
|
142
|
+
`,{_debug:debugOutput,_error:err?.message||"Couldn't index data source"}}}validateInput(input){return Joi.object({Source:Joi.any().required()}).unknown(!0).validate(input)}async addDSFromText({teamId,sourceId,namespaceId,text,name,metadata}){return await ConnectorService.getVectorDBConnector().requester(AccessCandidate.team(teamId)).createDatasource(namespaceId,{text,metadata,id:sourceId,label:name})}}var __defProp$1a=Object.defineProperty,__defNormalProp$1a=(obj,key,value)=>key in obj?__defProp$1a(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1a=(obj,key,value)=>__defNormalProp$1a(obj,key+"",value);class DataSourceCleaner extends DataSourceComponent{constructor(){super(),__publicField$1a(this,"configSchema",Joi.object({namespaceId:Joi.string().max(50).allow("").label("namespace"),id:Joi.string().custom(validateCharacterSet,"custom validation characterSet").allow("").label("source identifier"),version:Joi.string().valid("v1","v2").default("v1")}))}init(){}async process(input,config2,agent){if(await super.process(input,config2,agent),!config2.data.version||config2.data.version==="v1")return await this.processV1(input,config2,agent);if(config2.data.version==="v2")return await this.processV2(input,config2,agent)}async processV1(input,config2,agent){const teamId=agent.teamId;agent.id;let debugOutput=agent.agentRuntime?.debug?`== Source Indexer Log ==
|
|
143
|
+
`:null;try{const configSchema=this.validateConfigData(config2.data);if(configSchema.error)throw new Error(`Config data validation error: ${configSchema.error}
|
|
144
|
+
EXITING...`);const outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?`<${con?.description}>`:"");const inputSchema=this.validateInput(input);if(inputSchema.error)throw new Error(`Input validation error: ${inputSchema.error}
|
|
145
|
+
EXITING...`);const namespaceId=/^c[a-z0-9]{24}.+$/.test(configSchema.value.namespaceId)?configSchema.value.namespaceId.split("_").slice(1).join("_"):configSchema.value.namespaceId;let vectorDbConnector=ConnectorService.getVectorDBConnector();if(!await vectorDbConnector.requester(AccessCandidate.team(teamId)).namespaceExists(namespaceId))throw new Error(`Namespace ${namespaceId} does not exist`);const providedId=TemplateString(config2.data.id).parse(input).result;if(!/^[a-zA-Z0-9\-\_\.]+$/.test(providedId))throw new Error("Invalid id. Accepted characters: 'a-z', 'A-Z', '0-9', '-', '_', '.'");debugOutput+=`Searching for data source with id: ${providedId}
|
|
146
|
+
`;const dsId=DataSourceIndexer.normalizeDsId(providedId,teamId,namespaceId);return await vectorDbConnector.requester(AccessCandidate.team(teamId)).deleteDatasource(namespaceId,dsId),debugOutput+=`Deleted data source with id: ${providedId}
|
|
147
|
+
`,{_debug:debugOutput,Success:!0}}catch(err){return debugOutput+=`Failed to delete data source:
|
|
148
|
+
Error: ${err?.message}
|
|
149
|
+
`,{_debug:debugOutput,_error:err?.message||"Couldn't delete data source"}}}async processV2(input,config2,agent){const teamId=agent.teamId;agent.id;let debugOutput=agent.agentRuntime?.debug?`== Source Indexer Log ==
|
|
150
|
+
`:null;try{const configSchema=this.validateConfigData(config2.data);if(configSchema.error)throw new Error(`Config data validation error: ${configSchema.error}
|
|
151
|
+
EXITING...`);const outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?`<${con?.description}>`:"");const inputSchema=this.validateInput(input);if(inputSchema.error)throw new Error(`Input validation error: ${inputSchema.error}
|
|
152
|
+
EXITING...`);const namespaceLabel=/^c[a-z0-9]{24}.+$/.test(configSchema.value.namespaceId)?configSchema.value.namespaceId.split("_").slice(1).join("_"):configSchema.value.namespaceId,namespaceId=configSchema.value.namespaceId;let vecDbConnector=null;try{vecDbConnector=await this.resolveVectorDbConnector(namespaceId,teamId)}catch(err){return debugOutput+=`Error: ${err?.message||"Couldn't get vector database connector"}
|
|
153
|
+
|
|
154
|
+
`,{_debug:debugOutput,_error:err?.message||"Couldn't get vector database connector"}}const providedId=TemplateString(config2.data.id).parse(input).result;if(!/^[a-zA-Z0-9\-\_\.]+$/.test(providedId))throw new Error("Invalid id. Accepted characters: 'a-z', 'A-Z', '0-9', '-', '_', '.'");debugOutput+=`Searching for data source with id: ${providedId}
|
|
155
|
+
`;const dsId=DataSourceComponent.normalizeDsId(providedId,teamId,namespaceLabel);return await vecDbConnector.requester(AccessCandidate.team(teamId)).deleteDatasource(namespaceLabel,dsId),debugOutput+=`Deleted data source with id: ${providedId}
|
|
156
|
+
`,{_debug:debugOutput,Success:!0}}catch(err){return debugOutput+=`Failed to delete data source:
|
|
157
|
+
Error: ${err?.message}
|
|
158
|
+
`,{_debug:debugOutput,_error:err?.message||"Couldn't delete data source"}}}validateInput(input){return Joi.object({}).unknown(!0).validate(input)}validateConfigData(data){return Joi.object({namespaceId:Joi.string().required(),id:Joi.string().optional().allow("").allow(null)}).unknown(!0).validate(data)}}var __defProp$19=Object.defineProperty,__defNormalProp$19=(obj,key,value)=>key in obj?__defProp$19(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$19=(obj,key,value)=>__defNormalProp$19(obj,key+"",value);class JSONFilter extends Component{constructor(){super(),__publicField$19(this,"configSchema",Joi.object({fields:Joi.string().max(3e4).allow("").label("Prompt")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== JSONFilter Log ===");let Output={},_error=null;try{const componentId=config2.id,fields=config2.data.fields,obj=input.Input;Output=filterFields(obj,fields),logger2.debug("Output filtered")}catch(error){_error=error,logger2.error(" JSONFilter Error",error)}return{Output,_error,_debug:logger2.output}}}function filterFields(obj,fields){const fieldList=fields?.split(",").map(field=>field.trim());function filterObject(obj2){return Array.isArray(obj2)?obj2.map(filterObject):obj2!==null&&typeof obj2=="object"?Object.keys(obj2).filter(key=>fieldList.includes(key)).reduce((acc,key)=>(acc[key]=filterObject(obj2[key]),acc),{}):obj2}return filterObject(obj)}class LogicAND extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent),this.createComponentLogger(agent,config2);const result={Output:!0};for(let cfgInput of config2.inputs)if(!input[cfgInput.name]){result.Output=void 0;break}return result.Verified=result.Output!==void 0,result.Unverified=!result.Verified,result.Verified||delete result.Verified,result.Unverified||delete result.Unverified,result}}class LogicOR extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const result={Output:void 0};console.log(input),console.log(config2);for(let cfgInput of config2.inputs)if(input[cfgInput.name]){result.Output=!0;break}return result.Verified=result.Output!==void 0,result.Unverified=!result.Verified,result.Verified||delete result.Verified,result.Unverified||delete result.Unverified,result}}class LogicXOR extends Component{constructor(){super()}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const result={Output:void 0};let trueCount=0;for(let cfgInput of config2.inputs)input[cfgInput.name]&&trueCount++;return trueCount===1&&(result.Output=!0),result.Verified=result.Output!==void 0,result.Unverified=!result.Verified,result.Verified||delete result.Verified,result.Unverified||delete result.Unverified,result}}var __defProp$18=Object.defineProperty,__defNormalProp$18=(obj,key,value)=>key in obj?__defProp$18(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$18=(obj,key,value)=>__defNormalProp$18(obj,key+"",value);class LogicAtLeast extends Component{constructor(){super(),__publicField$18(this,"configSchema",Joi.object({minSetInputs:Joi.alternatives([Joi.string(),Joi.number()]).custom(validateInteger$1({min:0,max:9}),"custom range validation").label("Minimum Inputs")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent),this.createComponentLogger(agent,config2);const result={Output:void 0};if(config2.data.minSetInputs===""||isNaN(Number(config2.data.minSetInputs)))return result;const minSetInputs=Number(config2.data.minSetInputs);if(config2.inputs.length<minSetInputs)return result;let trueCount=0;for(let cfgInput of config2.inputs)input[cfgInput.name]&&trueCount++;return trueCount>=minSetInputs&&(result.Output=!0),result.Verified=result.Output!==void 0,result.Unverified=!result.Verified,result.Verified||delete result.Verified,result.Unverified||delete result.Unverified,result}}function validateInteger$1(args){return(value,helpers)=>{const numValue=Number(value),fieldName=helpers.schema._flags.label||helpers.state.path[helpers.state.path.length-1];if(isNaN(numValue))throw new Error(`The value for '${fieldName}' must be a number`);if(args.min!==void 0&&args.max!==void 0){if(numValue<args.min||numValue>args.max)throw new Error(`The value for '${fieldName}' must be from ${args.min} to ${args.max}`)}else if(args.min!==void 0){if(numValue<args.min)throw new Error(`The value for '${fieldName}' must be greater or equal to ${args.min}`)}else if(args.max!==void 0&&numValue>args.max)throw new Error(`The value for '${fieldName}' must be less or equal to ${args.max}`);return value}}var __defProp$17=Object.defineProperty,__defNormalProp$17=(obj,key,value)=>key in obj?__defProp$17(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$17=(obj,key,value)=>__defNormalProp$17(obj,key+"",value);class LogicAtMost extends Component{constructor(){super(),__publicField$17(this,"configSchema",Joi.object({maxSetInputs:Joi.alternatives([Joi.string(),Joi.number()]).custom(validateInteger({min:0,max:9}),"custom range validation").label("Maximum Inputs")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const result={Output:void 0};if(config2.data.maxSetInputs===""||isNaN(Number(config2.data.maxSetInputs)))return result;const maxSetInputs=Number(config2.data.maxSetInputs);if(config2.inputs.length<maxSetInputs)return result;let trueCount=0;for(let cfgInput of config2.inputs)if(input[cfgInput.name]&&(trueCount++,trueCount>maxSetInputs))break;return trueCount<=maxSetInputs&&(result.Output=!0),result.Verified=result.Output!==void 0,result.Unverified=!result.Verified,result.Verified||delete result.Verified,result.Unverified||delete result.Unverified,result}}function validateInteger(args){return(value,helpers)=>{const numValue=Number(value),fieldName=helpers.schema._flags.label||helpers.state.path[helpers.state.path.length-1];if(isNaN(numValue))throw new Error(`The value for '${fieldName}' must be a number`);if(args.min!==void 0&&args.max!==void 0){if(numValue<args.min||numValue>args.max)throw new Error(`The value for '${fieldName}' must be from ${args.min} to ${args.max}`)}else if(args.min!==void 0){if(numValue<args.min)throw new Error(`The value for '${fieldName}' must be greater or equal to ${args.min}`)}else if(args.max!==void 0&&numValue>args.max)throw new Error(`The value for '${fieldName}' must be less or equal to ${args.max}`);return value}}var __defProp$16=Object.defineProperty,__defNormalProp$16=(obj,key,value)=>key in obj?__defProp$16(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$16=(obj,key,value)=>__defNormalProp$16(obj,key+"",value);let cacheConnector;function getCacheConnector(){return cacheConnector||(cacheConnector=ConnectorService.getCacheConnector()),cacheConnector}async function saveMessagesToSession(agentId,userId,conversationId,messages,ttl){if(!userId&&!conversationId)return;const cacheConnector2=getCacheConnector(),conv_uid=`${agentId}:conv-u${userId}-c${conversationId}`;cacheConnector2.requester(AccessCandidate.agent(agentId)).set(conv_uid,JSON.stringify(messages),null,null,ttl)}async function readMessagesFromSession(agentId,userId,conversationId,maxTokens=DEFAULT_MAX_TOKENS_FOR_LLM){if(!userId&&!conversationId)return[];const cacheConnector2=getCacheConnector(),conv_uid=`${agentId}:conv-u${userId}-c${conversationId}`,sessionData=await cacheConnector2.requester(AccessCandidate.agent(agentId))?.get(conv_uid);let messages=sessionData?JSONContent(sessionData).tryParse():[];const filteredMessages=[];let tokens=0;if(messages[0]?.role=="system"){const messageTokens=encode(messages[0]?.content).length+3;tokens+=messageTokens}for(let i=messages.length-1;i>=0;i--){if(messages[i].role=="system")continue;const message=messages[i],messageTokens=encode(message?.content).length+3;if(tokens+messageTokens>maxTokens)break;filteredMessages.unshift(message),tokens+=messageTokens}return messages[0]?.role=="system"&&filteredMessages.unshift(messages[0]),filteredMessages}class LLMAssistant extends Component{constructor(){super(),__publicField$16(this,"configSchema",Joi.object({model:Joi.string().max(200).required(),behavior:Joi.string().max(3e4).allow("").label("Behavior"),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 Assistant Log ==
|
|
119
159
|
`);const passThrough=config2.data.passthrough||!1,model=config2.data.model||"echo",ttl=config2.data.ttl||void 0;let teamId=agent?.teamId;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 modelId=await agent.modelsProvider.getModelId(model);logger2.debug(` Model : ${modelId||model}`);const userInput=input.UserInput,userId=input.UserId,conversationId=input.ConversationId;let behavior=TemplateString(config2.data.behavior).parse(input).result;logger2.debug(`[Parsed Behavior]
|
|
120
160
|
${behavior}`);let maxTokens=2048;const isStandardLLM=await agent.modelsProvider.isStandardLLM(model);maxTokens=await agent.modelsProvider.getMaxCompletionTokens(model,!0);const messages=await readMessagesFromSession(agent.id,userId,conversationId,Math.round(maxTokens/2));messages.push({role:TLLMMessageRole.User,content:userInput}),messages[0]?.role!=TLLMMessageRole.System&&messages.unshift({role:TLLMMessageRole.System,content:behavior});const customParams={messages};let response;if(passThrough?response=await new Promise(async(resolve,reject)=>{let _content="";const eventEmitter=await llmInference.promptStream({contextWindow:messages,params:{...config2,model,agentId:agent.id},onFallback:fallbackInfo=>{logger2.debug(`
|
|
121
161
|
\u21A9\uFE0F Using fallback model: ${fallbackInfo.model}`)}}).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({contextWindow:messages,params:{...config2,agentId:agent.id},onFallback:fallbackInfo=>{logger2.debug(`
|
|
122
162
|
\u21A9\uFE0F Using fallback model: ${fallbackInfo.model}`)}}).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),{Response:response?.data,_error:error,_debug:logger2.output}}messages.push({role:"assistant",content:response}),saveMessagesToSession(agent.id,userId,conversationId,messages,ttl),logger2.debug(`
|
|
123
163
|
Response
|
|
124
|
-
`,response);const result={Response:response};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$
|
|
164
|
+
`,response);const result={Response:response};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$15=Object.defineProperty,__defNormalProp$15=(obj,key,value)=>key in obj?__defProp$15(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$15=(obj,key,value)=>__defNormalProp$15(obj,key+"",value);function validateAndParseJson(value,helpers){let parsedJson=null;try{parsedJson=JSON.parse(value)}catch{return helpers.error("string.invalidJson",{value})}if(typeof parsedJson!="object"||parsedJson===null)return helpers.error("string.notJsonObject",{value});for(const key in parsedJson)if(key.trim()==="")return helpers.error("object.emptyKey",{value});return parsedJson}class ZapierAction extends Component{constructor(){super(),__publicField$15(this,"configSchema",Joi.object({actionName:Joi.string().max(100).required(),actionId:Joi.string().max(100).required(),logoUrl:Joi.string().max(500).allow(""),apiKey:Joi.string().max(350).required(),params:Joi.string().custom(validateAndParseJson,"custom JSON validation").allow("")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Zapier Action Log ===");const teamId=agent?.teamId,apiKey=await TemplateStringHelper.create(config2?.data?.apiKey).parseTeamKeysAsync(teamId).asyncResult;if(!apiKey)return{_error:"You are not authorized to run the Zapier Action!",_debug:logger2.output};const actionId=config2?.data?.actionId;if(!actionId)return{_error:"Zapier Action ID is required!",_debug:logger2.output};if(!Object.keys(input||{})?.length)return{_error:"Give a plain english description of exact action you want to do!",_debug:logger2.output};let _input={},_pubUrlsCreated=[];for(const[key,value]of Object.entries(input))if(isSmythFileObject(value)){const pubUrl=await SmythFS.Instance.genTempUrl(value?.url,AccessCandidate.agent(agent.id));_pubUrlsCreated.push(pubUrl),_input[key]=pubUrl}else _input[key]=value;try{const url=`https://actions.zapier.com/api/v1/exposed/${actionId}/execute/?api_key=${apiKey}`,res=await axios.post(url,{..._input});return logger2.debug(`Output:
|
|
125
165
|
`,res?.data),Promise.all(_pubUrlsCreated.map(url2=>SmythFS.Instance.destroyTempUrl(url2))).then(()=>{console.log("Cleaned up all temp urls")}).catch(e=>{console.log("Error cleaning up temp urls",e)}),{Output:res?.data,_debug:logger2.output}}catch(error){console.log(`Error Running Zapier Action:
|
|
126
|
-
`,error);let message=Object.keys(error?.response?.data||{})?.length?error?.response?.data:error?.message;return typeof message=="object"&&(message=JSON.stringify(message)),logger2.error("Error running Zapier Action!",message),logger2.error("Error Inputs ",input),Promise.all(_pubUrlsCreated.map(url=>SmythFS.Instance.destroyTempUrl(url))).then(()=>{console.log("Cleaned up all temp urls")}).catch(e=>{console.log("Error cleaning up temp urls",e)}),{_error:`Zapier Error: ${message}`,_debug:logger2.output}}}}var __defProp$
|
|
166
|
+
`,error);let message=Object.keys(error?.response?.data||{})?.length?error?.response?.data:error?.message;return typeof message=="object"&&(message=JSON.stringify(message)),logger2.error("Error running Zapier Action!",message),logger2.error("Error Inputs ",input),Promise.all(_pubUrlsCreated.map(url=>SmythFS.Instance.destroyTempUrl(url))).then(()=>{console.log("Cleaned up all temp urls")}).catch(e=>{console.log("Error cleaning up temp urls",e)}),{_error:`Zapier Error: ${message}`,_debug:logger2.output}}}}var __defProp$14=Object.defineProperty,__defNormalProp$14=(obj,key,value)=>key in obj?__defProp$14(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$14=(obj,key,value)=>__defNormalProp$14(obj,key+"",value);class MultimodalLLM extends Component{constructor(){super(),__publicField$14(this,"configSchema",Joi.object({prompt:Joi.string().required().max(8e6).label("Prompt"),maxTokens:Joi.number().min(1).label("Maximum Tokens"),model:Joi.string().max(200).required(),passthrough:Joi.boolean().optional().label("Passthrough")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Multimodal LLM Log ===");try{const passThrough=config2.data.passthrough||!1,model=config2.data.model||"gpt-4o-mini",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
|
|
127
167
|
`,prompt,`
|
|
128
168
|
`);const outputs={};for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?`<${con?.description}>`:"");const excludedKeys=["_debug","_error"],outputKeys=Object.keys(outputs).filter(key=>!excludedKeys.includes(key));if(outputKeys.length>0){const outputFormat={};outputKeys.forEach(key=>outputFormat[key]="<value>"),prompt+=`
|
|
129
169
|
|
|
@@ -133,9 +173,9 @@ Expected output format = `+JSON.stringify(outputFormat)+`
|
|
|
133
173
|
${prompt}
|
|
134
174
|
|
|
135
175
|
`)}const files=Array.isArray(input.Input)?input.Input:[input.Input];let response;if(passThrough?response=await new Promise(async(resolve,reject)=>{let _content="";const eventEmitter=await llmInference.multimodalStreamRequestLegacy(prompt,files,config2,agent).catch(error=>{console.error("Error on multimodalStreamRequest: ",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,files,params:{...config2,agentId:agent.id}}),!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
|
|
136
|
-
`,response);const result={Reply:response};return result._debug=logger2.output,result}catch(error){const _error=`${error?.error||""} ${error?.details||""}`.trim()||error?.message||"Something went wrong!";return logger2.error("Error processing File(s)!",_error),{_error,_debug:logger2.output}}}}var __defProp$
|
|
176
|
+
`,response);const result={Reply:response};return result._debug=logger2.output,result}catch(error){const _error=`${error?.error||""} ${error?.details||""}`.trim()||error?.message||"Something went wrong!";return logger2.error("Error processing File(s)!",_error),{_error,_debug:logger2.output}}}}var __defProp$13=Object.defineProperty,__defNormalProp$13=(obj,key,value)=>key in obj?__defProp$13(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$13=(obj,key,value)=>__defNormalProp$13(obj,typeof key!="symbol"?key+"":key,value);class ScrapflyWebScrape extends Component{constructor(){super(),__publicField$13(this,"schema",{name:"ScrapflyWebScrape",description:"Use this component to scrape web pages",inputs:{URLs:{type:"Array",description:"The URLs to scrape",default:!0}},outputs:{Results:{type:"Array",description:"The scraped results",default:!0},FailedURLs:{type:"Array",description:"The URLs that failed to scrape",default:!0}}}),__publicField$13(this,"configSchema",Joi.object({antiScrapingProtection:Joi.boolean().default(!1).label("Enable Anti-Scraping Protection"),javascriptRendering:Joi.boolean().default(!1).label("Enable JavaScript Rendering"),autoScroll:Joi.boolean().default(!1).label("Enable Auto Scroll"),format:Joi.string().default("markdown").label("Format").optional()}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== Web Scrape Log ===");let Output={},_error;const componentInputNames=new Set(config2.inputs.map(input2=>input2.name)),filteredInput=Object.fromEntries(Object.entries(input).filter(([key2])=>componentInputNames.has(key2))),scrapeUrls=this.extractUrls(filteredInput);logger2.debug("Payload:",JSON.stringify(config2.data)),logger2.debug(`Vaild URLs: ${JSON.stringify(scrapeUrls)}`);const teamId=agent.teamId,key=await getCredentials(AccessCandidate.team(teamId),"scrapfly"),scrapeResults=await Promise.all(scrapeUrls.map(url=>this.scrapeURL(url,config2.data,key))),results=scrapeResults.filter(result=>result.success).map(result=>({url:result.url,content:result.content})),failedResults=scrapeResults.filter(result=>!result.success).map(result=>({url:result.url,error:result.error}));Output={Results:results,FailedURLs:failedResults};const totalCredits=scrapeResults.reduce((acc,result)=>acc+(result.cost||0),0);return this.reportUsage({urlsScraped:results?.length,agentId:agent.id,teamId:agent.teamId,totalCredits}),{...Output,_error,_debug:logger2.output}}catch(err){const _error=err?.message||err?.response?.data||err.toString();return logger2.error(` Error scraping web
|
|
137
177
|
${_error}
|
|
138
|
-
`),{Output:void 0,_error,_debug:logger2.output}}}async scrapeURL(url,data,key){try{const response=await axios({method:"get",url:"https://api.scrapfly.io/scrape",params:{url:encodeURIComponent(url),key,cost_budget:80,...data.format?{format:data.format}:{format:"markdown"},...data.antiScrapingProtection&&{asp:!0},...data.javascriptRendering&&{render_js:!0},...data.autoScroll&&{auto_scroll:!0,render_js:!0}}});return{content:response.data?.result?.content,success:!0,url,cost:response.data?.context?.cost?.total||0}}catch(error){return{content:void 0,success:!1,error:error?.response?.data?.result?.error?.message||"Failed to scrape URL",url,cost:0}}}extractUrls(input){const scrapeUrls=[];for(const key in input)if(Object.prototype.hasOwnProperty.call(input,key)){const inputItem=input[key];if(typeof inputItem=="string")try{let urls=JSON.parse(inputItem);for(const url of urls)this.isValidUrl(url)&&scrapeUrls.push(url.trim())}catch{const commaSeparatedUrls=inputItem.split(",");for(const url of commaSeparatedUrls)this.isValidUrl(url)&&scrapeUrls.push(url.trim())}else if(typeof inputItem=="object")for(const url of inputItem)this.isValidUrl(url)&&scrapeUrls.push(url.trim())}return scrapeUrls}isValidUrl(urlString){try{const urlToCheck=urlString;return new URL(urlToCheck),!0}catch{return!1}}reportUsage({urlsScraped,agentId,teamId,totalCredits}){SystemEvents.emit("USAGE:API",{sourceId:"api:webscrape.smyth",credits:totalCredits,agentId,teamId})}}var __defProp$
|
|
178
|
+
`),{Output:void 0,_error,_debug:logger2.output}}}async scrapeURL(url,data,key){try{const response=await axios({method:"get",url:"https://api.scrapfly.io/scrape",params:{url:encodeURIComponent(url),key,cost_budget:80,...data.format?{format:data.format}:{format:"markdown"},...data.antiScrapingProtection&&{asp:!0},...data.javascriptRendering&&{render_js:!0},...data.autoScroll&&{auto_scroll:!0,render_js:!0}}});return{content:response.data?.result?.content,success:!0,url,cost:response.data?.context?.cost?.total||0}}catch(error){return{content:void 0,success:!1,error:error?.response?.data?.result?.error?.message||"Failed to scrape URL",url,cost:0}}}extractUrls(input){const scrapeUrls=[];for(const key in input)if(Object.prototype.hasOwnProperty.call(input,key)){const inputItem=input[key];if(typeof inputItem=="string")try{let urls=JSON.parse(inputItem);for(const url of urls)this.isValidUrl(url)&&scrapeUrls.push(url.trim())}catch{const commaSeparatedUrls=inputItem.split(",");for(const url of commaSeparatedUrls)this.isValidUrl(url)&&scrapeUrls.push(url.trim())}else if(typeof inputItem=="object")for(const url of inputItem)this.isValidUrl(url)&&scrapeUrls.push(url.trim())}return scrapeUrls}isValidUrl(urlString){try{const urlToCheck=urlString;return new URL(urlToCheck),!0}catch{return!1}}reportUsage({urlsScraped,agentId,teamId,totalCredits}){SystemEvents.emit("USAGE:API",{sourceId:"api:webscrape.smyth",credits:totalCredits,agentId,teamId})}}var __defProp$12=Object.defineProperty,__defNormalProp$12=(obj,key,value)=>key in obj?__defProp$12(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$12=(obj,key,value)=>__defNormalProp$12(obj,typeof key!="symbol"?key+"":key,value);class TavilyWebSearch extends Component{constructor(){super(),__publicField$12(this,"schema",{name:"TavilyWebSearch",description:"Use this component to generate a responses from an LLM",inputs:{SearchQuery:{type:"Text",description:"The search query to get the web search results of",default:!0}},outputs:{Results:{type:"Array",description:"The web search results",default:!0}}}),__publicField$12(this,"configSchema",Joi.object({includeImages:Joi.boolean().default(!1).label("Include Image Results"),sourcesLimit:Joi.number().integer().default(10).label("Sources Limit"),searchTopic:Joi.string().valid("general","news").label("Search Topic"),includeQAs:Joi.boolean().default(!1).label("Include QAs"),timeRange:Joi.string().valid("None","day","week","month","year").label("Time Range"),includeRawContent:Joi.boolean().default(!1).label("Include Raw Content"),excludeDomains:Joi.string().allow("").label("Exclude Domains")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== Web Scrape Log ===");let Output={},_error,searchQuery=input.SearchQuery;const teamId=agent.teamId,api_key=await getCredentials(AccessCandidate.team(teamId),"tavily");logger2.debug("Payload:",JSON.stringify(config2.data));const excludeDomains=config2.data.excludeDomains?.length?config2.data.excludeDomains.split(",").map(d=>d.trim()):[],response=await axios({method:"post",url:"https://api.tavily.com/search",data:{api_key,query:searchQuery,topic:config2.data.searchTopic,exclude_domains:excludeDomains,max_results:config2.data.sourcesLimit,...config2.data.timeRange!=="None"?{time_range:config2.data.timeRange}:{},...config2.data.includeImages?{include_images:!0}:{},...config2.data.includeQAs?{include_answer:!0}:{},...config2.data.includeRawContent?{include_raw_content:!0}:{}}});return Output={Results:response.data.results,...config2.data.includeImages?{Images:response.data.images}:{},...config2.data.includeQAs?{Answer:response.data.answer}:{}},this.reportUsage({agentId:agent.id,teamId:agent.teamId}),{...Output,_error,_debug:logger2.output}}catch(err){const _error=err?.message||err?.response?.data||err.toString();return err?.status===401?logger2.error('Tavily Web Search Auth failed, make sure that you have the vault key "tavily" is present and valid'):logger2.error(` Error scraping web
|
|
139
179
|
${JSON.stringify(_error)}
|
|
140
180
|
`),{Output:void 0,_error,_debug:logger2.output}}}reportUsage({agentId,teamId}){SystemEvents.emit("USAGE:API",{sourceId:"api:websearch.smyth",credits:1,agentId,teamId})}}const cachePrefix="serverless_code",cacheTTL=60*60*24*16,PER_SECOND_COST=1e-4;function getLambdaFunctionName(agentId,componentId){return`${agentId}-${componentId}`}function generateCodeHash(code_body,codeInputs,envVariables){const bodyHash=getSanitizeCodeHash(code_body),inputsHash=getSanitizeCodeHash(JSON.stringify(codeInputs)),envVariablesHash=getSanitizeCodeHash(JSON.stringify(envVariables));return`body-${bodyHash}__inputs-${inputsHash}__env-${envVariablesHash}`}function getSanitizeCodeHash(rawCode){const code=replaceVaultKeysTemplateVars(rawCode);let output="",isSingleQuote=!1,isDoubleQuote=!1,isTemplateLiteral=!1,isComment=!1,prevChar="";for(let i=0;i<code.length;i++){let char=code[i],nextChar=code[i+1];if(char==="'"&&!isDoubleQuote&&!isTemplateLiteral&&prevChar!=="\\"&&(isSingleQuote=!isSingleQuote),char==='"'&&!isSingleQuote&&!isTemplateLiteral&&prevChar!=="\\"&&(isDoubleQuote=!isDoubleQuote),char==="`"&&!isSingleQuote&&!isDoubleQuote&&prevChar!=="\\"&&(isTemplateLiteral=!isTemplateLiteral),char==="/"&&nextChar==="/"&&!isSingleQuote&&!isDoubleQuote&&!isTemplateLiteral&&(isComment=!0),char==="/"&&nextChar==="*"&&!isSingleQuote&&!isDoubleQuote&&!isTemplateLiteral&&(isComment=!0),char==="*"&&nextChar==="/"&&isComment){isComment=!1,i++;continue}char===`
|
|
141
181
|
`&&isComment&&(isComment=!1),isComment||(output+=char),prevChar=char}return crypto$1.createHash("md5").update(output.replace(/\s+/g," ").trim()).digest("hex")}async function getDeployedCodeHash(agentId,componentId){return await ConnectorService.getCacheConnector().user(AccessCandidate.agent(agentId)).get(`${cachePrefix}_${agentId}-${componentId}`)}async function setDeployedCodeHash(agentId,componentId,codeHash){await ConnectorService.getCacheConnector().user(AccessCandidate.agent(agentId)).set(`${cachePrefix}_${agentId}-${componentId}`,codeHash,null,null,cacheTTL)}function replaceVaultKeysTemplateVars(code,envVariables){const regex=/\{\{KEY\((.*?)\)\}\}/g;return code.replaceAll(regex,(match,p1)=>`process.env.${p1}`)}function generateLambdaCode(code,parameters,envVariables){return`
|
|
@@ -162,7 +202,7 @@ ${JSON.stringify(_error)}
|
|
|
162
202
|
async function main(${codeInputs.join(", ")}) {
|
|
163
203
|
${code_body}
|
|
164
204
|
}
|
|
165
|
-
`}function extractAllKeyNamesFromTemplateVars(input){const regex=/\{\{KEY\((.*?)\)\}\}/g,matches=[];let match;for(;(match=regex.exec(input))!==null;)match[1]&&matches.push(match[1]);return matches}async function fetchVaultSecret(keyName,agentTeamId){return{value:await VaultHelper.getAgentKey(keyName,agentTeamId),key:keyName}}async function getCurrentEnvironmentVariables(agentTeamId,code){const allKeyNames=extractAllKeyNamesFromTemplateVars(code),envVariables={};return(await Promise.all(allKeyNames.map(keyName=>fetchVaultSecret(keyName,agentTeamId)))).forEach(secret=>{envVariables[secret.key]=secret.value}),envVariables}function getSortedObjectValues(obj){return Object.keys(obj).sort().map(key=>obj[key])}var __defProp$
|
|
205
|
+
`}function extractAllKeyNamesFromTemplateVars(input){const regex=/\{\{KEY\((.*?)\)\}\}/g,matches=[];let match;for(;(match=regex.exec(input))!==null;)match[1]&&matches.push(match[1]);return matches}async function fetchVaultSecret(keyName,agentTeamId){return{value:await VaultHelper.getAgentKey(keyName,agentTeamId),key:keyName}}async function getCurrentEnvironmentVariables(agentTeamId,code){const allKeyNames=extractAllKeyNamesFromTemplateVars(code),envVariables={};return(await Promise.all(allKeyNames.map(keyName=>fetchVaultSecret(keyName,agentTeamId)))).forEach(secret=>{envVariables[secret.key]=secret.value}),envVariables}function getSortedObjectValues(obj){return Object.keys(obj).sort().map(key=>obj[key])}var __defProp$11=Object.defineProperty,__defNormalProp$11=(obj,key,value)=>key in obj?__defProp$11(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$11=(obj,key,value)=>__defNormalProp$11(obj,key+"",value);class ServerlessCode extends Component{constructor(){super(),__publicField$11(this,"configSchema",Joi.object({code_imports:Joi.string().max(1e3).allow("").label("Imports"),code_body:Joi.string().max(5e5).allow("").label("Code"),code:Joi.string().max(5e5).allow("").label("Code").optional(),deploy_btn:Joi.string().max(5e5).allow("").label("Deploy").optional(),accessKeyId:Joi.string().max(100).allow("").label("AWS Access Key ID").optional(),secretAccessKey:Joi.string().max(200).allow("").label("AWS Secret Access Key").optional(),region:Joi.string().label("AWS Region").optional(),_templateSettings:Joi.object().allow(null).label("Template Settings"),_templateVars:Joi.object().allow(null).label("Template Variables"),function_label:Joi.string().max(100).allow("").label("Function Label").optional(),function_label_end:Joi.string().allow(null).label("Function Label End").optional(),use_own_keys:Joi.boolean().label("Use Own Keys").optional(),pricing_note:Joi.string().allow(null).label("Pricing Note").optional()}))}init(){}async process(input,config2,agent){await new Promise(resolve=>setTimeout(resolve,1e4)),await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== Serverless Code Log ===");let Output={},_error;const componentInputs=agent.components[config2.id]?.inputs||{};let codeInputs={};for(let field of componentInputs){const inputValue=TemplateString(input[field.name]).parse(input).result;switch(typeof inputValue){case"string":try{codeInputs[field.name]=JSON.parse(inputValue.replace(/\\"/g,'"'))}catch{codeInputs[field.name]=`${inputValue}`}break;case"number":case"boolean":codeInputs[field.name]=inputValue;break;default:codeInputs[field.name]=inputValue;break}}logger2.debug(`
|
|
166
206
|
Input Variables:
|
|
167
207
|
${JSON.stringify(codeInputs,null,2)}
|
|
168
208
|
`);let codeConnector=ConnectorService.getCodeConnector(),codeCredentials=await getLambdaCredentials(agent,config2);codeCredentials.isUserProvidedKeys&&(codeConnector=codeConnector.instance({region:codeCredentials.region,accessKeyId:codeCredentials.accessKeyId,secretAccessKey:codeCredentials.secretAccessKey}));let code=config2?.data?.code;code||(code=generateCodeFromLegacyComponent(config2.data.code_body,config2.data.code_imports,Object.keys(codeInputs))),await codeConnector.agent(agent.id).deploy(config2.id,{code,inputs:codeInputs},{runtime:"nodejs"});try{const executionResponse=await codeConnector.agent(agent.id).execute(config2.id,codeInputs),executionTime=executionResponse.executionTime;logger2.debug(`Code result:
|
|
@@ -172,47 +212,47 @@ ${JSON.stringify(codeInputs,null,2)}
|
|
|
172
212
|
${error}
|
|
173
213
|
`),_error=error?.response?.data||error?.message||error.toString(),Output=void 0}return{Output,_error,_debug:logger2.output}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(` Error running code
|
|
174
214
|
${_error}
|
|
175
|
-
`),{Output:void 0,_error,_debug:logger2.output}}}}var __defProp$
|
|
215
|
+
`),{Output:void 0,_error,_debug:logger2.output}}}}var __defProp$10=Object.defineProperty,__defNormalProp$10=(obj,key,value)=>key in obj?__defProp$10(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$10=(obj,key,value)=>__defNormalProp$10(obj,key+"",value);class MCPClient extends Component{constructor(){super(),__publicField$10(this,"configSchema",Joi.object({model:Joi.string().optional(),openAiModel:Joi.string().optional(),mcpUrl:Joi.string().max(2048).uri().required().description("URL of the MCP"),descForModel:Joi.string().max(5e3).allow("").label("Description for Model"),name:Joi.string().max(500).required().allow(""),desc:Joi.string().max(5e3).allow("").label("Description"),logoUrl:Joi.string().max(8192).allow(""),id:Joi.string().max(200),version:Joi.string().max(100).allow(""),domain:Joi.string().max(253).allow(""),prompt:Joi.string().max(5e3).optional().allow("").label("Prompt")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== MCP Client Log ===");try{const mcpUrl=config2?.data?.mcpUrl;if(!mcpUrl)return{_error:"Please provide a MCP URL!",_debug:logger2.output};const model=config2?.data?.model||config2?.data?.openAiModel,descForModel=TemplateString(config2?.data?.descForModel).parse(input).result;let prompt=TemplateString(config2?.data?.prompt).parse(input).result;if(!prompt)return{_error:"Please provide a prompt",_debug:logger2.output};const{client}=await this.connectMCP(mcpUrl,logger2),toolsData=await client.listTools(),conv=new Conversation(model,{openapi:"3.0.1",info:{title:`${agent?.name}`,version:`${agent?.version}`,description:descForModel},servers:[{url:agent?.domain}],paths:{}},{agentId:agent?.id});for(const tool of toolsData.tools){let toolArgs={};Object.entries(tool.inputSchema.properties).forEach(([propName,propDetails])=>{toolArgs[propName]={description:"",required:(tool.inputSchema.required||[]).includes(propName)||!1,type:propDetails.type,...propDetails.type==="array"?{items:{type:"string"}}:{}}}),await conv.addTool({name:tool.name,description:tool.description,arguments:toolArgs,handler:async input2=>await client.callTool({name:tool.name,arguments:input2})})}const result=await conv.prompt(prompt);return logger2.debug(`Response:
|
|
176
216
|
`,result,`
|
|
177
217
|
`),{Output:result,_debug:logger2.output}}catch(error){return{_error:`Error on running MCP Client!
|
|
178
|
-
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}async connectMCP(mcpUrl,logger2){const client=new Client({name:"auto-client",version:"1.0.0"});try{const st=new StreamableHTTPClientTransport(new URL(mcpUrl));return await client.connect(st),logger2.debug("Connected to MCP using Streamable HTTP"),{client,transport:"streamable"}}catch(e){logger2.debug("Failed to connect to MCP using Streamable HTTP, falling back to SSE");const msg=String(e?.message||e),isUnsupported=/404|405|ENOTFOUND|ECONNREFUSED|CORS/i.test(msg);if(/406|Not Acceptable|text\/event-stream/i.test(msg))throw new Error("Server is Streamable; include Accept: application/json, text/event-stream");if(!isUnsupported)throw e;const sse=new SSEClientTransport(new URL(mcpUrl));return await client.connect(sse),{client,transport:"sse"}}}}var __defProp
|
|
218
|
+
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}async connectMCP(mcpUrl,logger2){const client=new Client({name:"auto-client",version:"1.0.0"});try{const st=new StreamableHTTPClientTransport(new URL(mcpUrl));return await client.connect(st),logger2.debug("Connected to MCP using Streamable HTTP"),{client,transport:"streamable"}}catch(e){logger2.debug("Failed to connect to MCP using Streamable HTTP, falling back to SSE");const msg=String(e?.message||e),isUnsupported=/404|405|ENOTFOUND|ECONNREFUSED|CORS/i.test(msg);if(/406|Not Acceptable|text\/event-stream/i.test(msg))throw new Error("Server is Streamable; include Accept: application/json, text/event-stream");if(!isUnsupported)throw e;const sse=new SSEClientTransport(new URL(mcpUrl));return await client.connect(sse),{client,transport:"sse"}}}}var __defProp$$=Object.defineProperty,__defNormalProp$$=(obj,key,value)=>key in obj?__defProp$$(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$$=(obj,key,value)=>__defNormalProp$$(obj,key+"",value);class OpenAPI extends Component{constructor(){super(),__publicField$$(this,"configSchema",Joi.object({model:Joi.string().optional(),openAiModel:Joi.string().optional(),specUrl:Joi.string().max(2048).uri().required().description("URL of the OpenAPI specification"),descForModel:Joi.string().max(5e3).required().allow("").label("Description for Model"),name:Joi.string().max(500).required().allow(""),desc:Joi.string().max(5e3).required().allow("").label("Description"),logoUrl:Joi.string().max(8192).allow(""),id:Joi.string().max(200),version:Joi.string().max(100).allow(""),domain:Joi.string().max(253).allow("")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Open API Log ===");try{const specUrl=config2?.data?.specUrl;if(!specUrl)return{_error:"Please provide a Open API Specification URL!",_debug:logger2.output};const model=config2?.data?.model||config2?.data?.openAiModel,descForModel=TemplateString(config2?.data?.descForModel).parse(input).result;let prompt="";if(input?.Prompt?prompt=typeof input?.Prompt=="string"?input?.Prompt:JSON.stringify(input?.Prompt):input?.Query&&(prompt=typeof input?.Query=="string"?input?.Query:JSON.stringify(input?.Query)),!prompt)return{_error:"Please provide a prompt",_debug:logger2.output};const result=await new Conversation(model,specUrl,{systemPrompt:descForModel,agentId:agent?.id}).prompt(prompt);return logger2.debug(`Response:
|
|
179
219
|
`,result,`
|
|
180
220
|
`),{Output:result,_debug:logger2.output}}catch(error){return console.error("Error on running Open API: ",error),{_error:`Error on running Open API!
|
|
181
|
-
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var __defProp$
|
|
221
|
+
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var __defProp$_=Object.defineProperty,__defNormalProp$_=(obj,key,value)=>key in obj?__defProp$_(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$_=(obj,key,value)=>__defNormalProp$_(obj,key+"",value);let ECMASandbox$1=class extends Component{constructor(){super(),__publicField$_(this,"configSchema",Joi.object({code:Joi.string().max(5e5).allow("").label("Code")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{let Output={},_error,codeInputs={};for(let fieldName in input)switch(typeof input[fieldName]){case"string":const b64encoded=Buffer.from(input[fieldName]).toString("base64");codeInputs[fieldName]=`___internal.b64decode('${b64encoded}')`;break;case"number":case"boolean":codeInputs[fieldName]=input[fieldName];break;default:codeInputs[fieldName]=input[fieldName];break}const code=config2.data.code;logger2.debug(`Running code:
|
|
182
222
|
${code}
|
|
183
223
|
`);const executionResponse=await ConnectorService.getCodeConnector("ECMASandbox").agent(agent.id).execute(config2.id,{code,inputs:input});return executionResponse.success?Output=executionResponse.output:(Output=void 0,_error=executionResponse.errors),{Output,_error,_debug:logger2.output}}catch(err){const _error=err?.response?.data||err?.message||err.toString();return logger2.error(`Error running code:
|
|
184
224
|
${_error}
|
|
185
225
|
`),{Output:void 0,_error,_debug:logger2.output}}}generateInputVarCode(input){let input_vars="";for(const key in input)input_vars+=`var ${key} = ${input[key]};
|
|
186
|
-
`;return input_vars}};var __defProp$10=Object.defineProperty,__defNormalProp$10=(obj,key,value)=>key in obj?__defProp$10(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$10=(obj,key,value)=>__defNormalProp$10(obj,key+"",value);class MemoryWriteKeyVal extends Component{constructor(){super(),__publicField$10(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key"),value:Joi.string().max(1e5).allow("").label("Value"),scope:Joi.string().max(20).allow("").label("Scope"),ttl:Joi.number().min(300).max(604800).allow("").label("TTL")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,value=TemplateString(config2.data.value).parse(input).result,scope=config2.data.scope,ttl=scope==="ttl"?config2?.data?.ttl:3*60*60,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;let scopeKey="";scope==="session"?scopeKey=sessionId:scope==="request"?scopeKey=workflowId:scope==="ttl"&&(scopeKey="ttl");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`;await connectorRequester.set(scopeKeyId,JSON.stringify({scope,value:scopeKey}),null,null,ttl);const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return await connectorRequester.set(fullKey,value,null,null,ttl),{Key:key,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$$=Object.defineProperty,__defNormalProp$$=(obj,key,value)=>key in obj?__defProp$$(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$$=(obj,key,value)=>__defNormalProp$$(obj,key+"",value);class MemoryReadKeyVal extends Component{constructor(){super(),__publicField$$(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;logger2.debug("Reading Scope Data");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopeStrData=await connectorRequester.get(scopeKeyId);if(!scopeStrData)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Checking Scope");const scopeData=JSON.parse(scopeStrData),scopeKey=scopeData.value;if(scopeData.scope==="session"&&scopeKey!==sessionId)return{_warning:"key not found",_debug:logger2.output};if(scopeData.scope==="request"&&scopeKey!==workflowId)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Reading Value");const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return{Value:await connectorRequester.get(fullKey),_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$_=Object.defineProperty,__defNormalProp$_=(obj,key,value)=>key in obj?__defProp$_(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$_=(obj,key,value)=>__defNormalProp$_(obj,key+"",value);class MemoryDeleteKeyVal extends Component{constructor(){super(),__publicField$_(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;logger2.debug("Reading Scope Data for deletion");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopeStrData=await connectorRequester.get(scopeKeyId);if(!scopeStrData)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Checking Scope for deletion");const scopeData=JSON.parse(scopeStrData),scopeKey=scopeData.value;if(scopeData.scope==="session"&&scopeKey!==sessionId)return{_warning:"key not found",_debug:logger2.output};if(scopeData.scope==="request"&&scopeKey!==workflowId)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Deleting memory value and scope data");const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return await connectorRequester.delete(fullKey),await connectorRequester.delete(scopeKeyId),{Key:key,deleted:!0,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}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);class MemoryWriteObject extends Component{constructor(){super(),__publicField$Z(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),scope:Joi.string().max(20).allow("").label("Scope"),ttl:Joi.number().min(300).max(604800).allow("").label("TTL")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,dataString=input.Data,scope=config2.data.scope,ttl=scope==="ttl"?config2?.data?.ttl:3*60*60;let dataObject;try{dataObject=typeof dataString=="object"?dataString:JSON.parse(dataString)}catch{return{_error:"Invalid JSON data provided",_debug:logger2.output}}if(typeof dataObject!="object"||dataObject===null||Array.isArray(dataObject))return{_error:"Data must be a valid JSON object",_debug:logger2.output};const sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;let scopeKey="";scope==="session"?scopeKey=sessionId:scope==="request"?scopeKey=workflowId:scope==="ttl"&&(scopeKey="ttl");const keys=Object.keys(dataObject);logger2.debug(`Writing ${keys.length} key-value pairs to memory`);const writePromises=keys.map(async key=>{const value=String(dataObject[key]),scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopePromise=connectorRequester.set(scopeKeyId,JSON.stringify({scope,value:scopeKey}),null,null,ttl),fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`,valuePromise=connectorRequester.set(fullKey,value,null,null,ttl);return await Promise.all([scopePromise,valuePromise]),{key,success:!0}}),successfulKeys=(await Promise.all(writePromises)).filter(result=>result.success).map(result=>result.key);return logger2.debug(`Successfully wrote ${successfulKeys.length} keys to memory`),{Keys:successfulKeys,Count:successfulKeys.length,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}class Credentials{}var __typeError=msg=>{throw TypeError(msg)},__accessCheck=(obj,member,msg)=>member.has(obj)||__typeError("Cannot "+msg),__privateGet=(obj,member,getter)=>(__accessCheck(obj,member,"read from private field"),getter?getter.call(obj):member.get(obj)),__privateAdd=(obj,member,value)=>member.has(obj)?__typeError("Cannot add the same private member more than once"):member instanceof WeakSet?member.add(obj):member.set(obj,value),__privateSet=(obj,member,value,setter)=>(__accessCheck(obj,member,"write to private field"),member.set(obj,value),value),_accessToken,_refreshToken,_expiresIn,_scope,_tokenUrl,_service,_clientId,_clientSecret;const _ManagedOAuth2Credentials=class _ManagedOAuth2Credentials2 extends Credentials{constructor(data){super(),__privateAdd(this,_accessToken),__privateAdd(this,_refreshToken),__privateAdd(this,_expiresIn),__privateAdd(this,_scope),__privateAdd(this,_tokenUrl),__privateAdd(this,_service),__privateAdd(this,_clientId),__privateAdd(this,_clientSecret),this.parseData(data)}get accessToken(){return __privateGet(this,_accessToken)}get refreshToken(){return __privateGet(this,_refreshToken)}get expiresIn(){return __privateGet(this,_expiresIn)}get scope(){return __privateGet(this,_scope)}get tokenUrl(){return __privateGet(this,_tokenUrl)}get service(){return __privateGet(this,_service)}static async load(keyId,candidate){const result=await ConnectorService.getManagedVaultConnector().requester(candidate).get(keyId),data=typeof result=="object"?result:JSON.parse(result||"{}");return new _ManagedOAuth2Credentials2(data)}parseData(data){if(!data.auth_data||!data.auth_settings)throw new Error("oAuth2Manager:Invalid data format");__privateSet(this,_accessToken,data.auth_data.primary),__privateSet(this,_refreshToken,data.auth_data.secondary),__privateSet(this,_expiresIn,data.auth_data.expires_in),__privateSet(this,_scope,data.auth_settings.scope),__privateSet(this,_tokenUrl,data.auth_settings.tokenURL),__privateSet(this,_service,data.auth_settings.service),__privateSet(this,_clientId,data.auth_settings.clientID),__privateSet(this,_clientSecret,data.auth_settings.clientSecret)}async refreshAccessToken(){console.log("Refreshing access token...");const tokenUrl=__privateGet(this,_tokenUrl),body=new URLSearchParams({client_id:__privateGet(this,_clientId),client_secret:__privateGet(this,_clientSecret),refresh_token:__privateGet(this,_refreshToken),grant_type:"refresh_token"});try{const res=await fetch(tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:body.toString()}),text=await res.text();let json;try{json=JSON.parse(text)}catch{throw new Error(`Invalid JSON response: ${text}`)}if(!res.ok){const errorMsg=json.error_description||json.error?.message||json.error||text;throw new Error(`HTTP ${res.status}: ${errorMsg}`)}return __privateSet(this,_accessToken,json.access_token),__privateSet(this,_expiresIn,Date.now()+json.expires_in*1e3),__privateGet(this,_accessToken)}catch(error){throw new Error(`Failed to refresh access token: ${error.message}`)}}};_accessToken=new WeakMap,_refreshToken=new WeakMap,_expiresIn=new WeakMap,_scope=new WeakMap,_tokenUrl=new WeakMap,_service=new WeakMap,_clientId=new WeakMap,_clientSecret=new WeakMap;let ManagedOAuth2Credentials=_ManagedOAuth2Credentials;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 Trigger extends Component{constructor(){super(...arguments),__publicField$Y(this,"logger")}async process(input,settings,agent){await super.process(input,settings,agent),this.logger=this.createComponentLogger(agent,settings);try{const agentRequest=agent.agentRequest,processedRequest=await this.requestHandler(input,settings,agent);if(processedRequest)return agent.kill("TRIGGER_REQ_HANDLED"),processedRequest;let inputArray=await this.collectPayload(input,settings,agent);return inputArray.length<2?{Payload:inputArray?.[0],_error:null,_in_progress:!1,_debug:this.logger.output}:await this.processIteration(inputArray,settings,agent)}catch(error){return this.logger.error(error),{Payload:{},Result:[],_error:error,_in_progress:!1,_debug:this.logger.output}}}async collectPayload(input,settings,agent){return[]}async requestHandler(input,settings,agent){}async processIteration(inputArray,settings,agent){let Payload={},Result,_temp_result,_error=null,_in_progress=!0;const logger2=this.logger,_LoopData=agent.agentRuntime.getRuntimeData(settings.id)._LoopData||{parentId:settings.id,loopIndex:0,loopLength:inputArray.length};return logger2.debug(`Loop: ${_LoopData.loopIndex} / ${_LoopData.loopLength}`),delete _LoopData.branches,_LoopData.result&&(_temp_result=_LoopData.result,logger2.debug(` => Trigger Iteration Result : ${JSON.stringify(Payload,null,2)}`),logger2.debug("---------------------------------------------------")),Payload=inputArray[_LoopData.loopIndex],logger2.debug(` => Trigger Iteration Data : ${JSON.stringify(Payload,null,2)}`),_in_progress=Payload!==void 0,_in_progress&&_LoopData.loopIndex++,_LoopData._in_progress=_in_progress,agent.agentRuntime.updateRuntimeData(settings.id,{_LoopData}),_in_progress||(Result=(_temp_result||[]).map(item=>cleanupResult(item.result||item))),{Payload,Result,_temp_result,_error,_in_progress,_debug:logger2.output}}async postProcess(output,settings,agent){return output=await super.postProcess(output,settings,agent),output?.result.Result}async register(componentId,componentSettings,payload){}}function cleanupResult(result){return typeof result!="object"||(result._debug&&delete result._debug,result._error&&delete result._error,result._temp_result&&delete result._temp_result,result._in_progress&&delete result._in_progress),result}class GmailTrigger extends Trigger{async collectPayload(input,config2,agent){const credentialsKey=config2?.data?.oauth_cred_id,agentCandidate=AccessCandidate.agent(agent.id),oauth2Credentials=await ManagedOAuth2Credentials.load(credentialsKey,agentCandidate);return console.log(oauth2Credentials.accessToken,oauth2Credentials.refreshToken,oauth2Credentials.expiresIn,oauth2Credentials.scope,oauth2Credentials.tokenUrl,oauth2Credentials.service),await oauth2Credentials.refreshAccessToken(),await getMostRecentUnreadMessage(0,oauth2Credentials,5)}}async function gmailApiRequest(endpoint,accessToken){const url=`https://www.googleapis.com/gmail/v1/users/me${endpoint}`;try{const json=await(await fetch(url,{headers:{Authorization:`Bearer ${accessToken}`}})).json();return console.log(json),json}catch(error){throw new Error(`Gmail API request failed: ${error.message}`)}}async function getMostRecentUnreadMessage(retryCount=0,oauth2Credentials,numMessages=1,excludeMessageId){let accessToken=oauth2Credentials.accessToken;accessToken||(accessToken=await oauth2Credentials.refreshAccessToken());try{console.log("Fetching unread messages...");const collectedIds=[];let pageToken,reachedBoundary=!1;for(;collectedIds.length<numMessages&&!reachedBoundary;){const pageQuery=`/messages?q=is:unread&maxResults=${Math.min(Math.max(numMessages,1),100)}${pageToken?`&pageToken=${pageToken}`:""}`,listResponse=await gmailApiRequest(pageQuery,accessToken),messages=Array.isArray(listResponse.messages)?listResponse.messages:[];if(messages.length===0)break;for(const m of messages)if(excludeMessageId&&m.id,collectedIds.push(m.id),collectedIds.length>=numMessages)break;if(collectedIds.length>=numMessages||reachedBoundary||!listResponse.nextPageToken)break;pageToken=listResponse.nextPageToken}return collectedIds.length===0?[]:(await Promise.all(collectedIds.map(id=>gmailApiRequest(`/messages/${id}?format=full`,accessToken)))).map(d=>parseMessage(d))}catch(error){if((error.message.includes("401")||error.message.includes("unauthorized"))&&retryCount<1){console.log("Access token expired, refreshing...");try{return accessToken=await oauth2Credentials.refreshAccessToken(),await getMostRecentUnreadMessage(retryCount+1,oauth2Credentials,numMessages,excludeMessageId)}catch(refreshError){throw new Error(`Authentication failed: ${refreshError.message}`)}}throw error}}function parseMessage(message){const headers={},payload=message.payload||{};payload.headers&&payload.headers.forEach(header=>{headers[header.name.toLowerCase()]=header.value});let textBody="",htmlBody="";function extractBody(part){part.mimeType==="text/plain"&&part.body&&part.body.data?textBody=Buffer.from(part.body.data,"base64").toString("utf-8"):part.mimeType==="text/html"&&part.body&&part.body.data&&(htmlBody=Buffer.from(part.body.data,"base64").toString("utf-8")),part.parts&&part.parts.forEach(extractBody)}payload.parts?payload.parts.forEach(extractBody):payload.body&&payload.body.data&&(payload.mimeType==="text/plain"?textBody=Buffer.from(payload.body.data,"base64").toString("utf-8"):payload.mimeType==="text/html"&&(htmlBody=Buffer.from(payload.body.data,"base64").toString("utf-8"))),textBody&&!htmlBody&&(htmlBody=textBody),htmlBody&&!textBody&&(textBody=htmlToPlainText(htmlBody));const attachments=[];function findAttachments(part){part.filename&&part.filename.length>0&&attachments.push({filename:part.filename,mimeType:part.mimeType,size:part.body?part.body.size:0,attachmentId:part.body?part.body.attachmentId:null}),part.parts&&part.parts.forEach(findAttachments)}return payload.parts&&payload.parts.forEach(findAttachments),{email:{id:message.id,threadId:message.threadId,labelIds:message.labelIds||[],snippet:message.snippet||"",sizeEstimate:message.sizeEstimate||0,internalDate:message.internalDate?new Date(parseInt(message.internalDate)).toISOString():null,headers:{from:headers.from||"",to:headers.to||"",cc:headers.cc||"",bcc:headers.bcc||"",subject:headers.subject||"",date:headers.date||"",messageId:headers["message-id"]||""},body:{text:textBody,html:htmlBody},attachments,isUnread:message.labelIds?message.labelIds.includes("UNREAD"):!1}}}function htmlToPlainText(htmlText,_styleConfig){try{const document=parseDocument(String(htmlText));findAll(node=>isTag(node)&&(node.name==="script"||node.name==="style"),document.children).forEach(node=>removeElement(node));let text=innerText(document);return text=text.replace(/\u00A0/g," "),text=text.replace(/\r\n?/g,`
|
|
226
|
+
`;return input_vars}};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);class MemoryWriteKeyVal extends Component{constructor(){super(),__publicField$Z(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key"),value:Joi.string().max(1e5).allow("").label("Value"),scope:Joi.string().max(20).allow("").label("Scope"),ttl:Joi.number().min(300).max(604800).allow("").label("TTL")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,value=TemplateString(config2.data.value).parse(input).result,scope=config2.data.scope,ttl=scope==="ttl"?config2?.data?.ttl:3*60*60,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;let scopeKey="";scope==="session"?scopeKey=sessionId:scope==="request"?scopeKey=workflowId:scope==="ttl"&&(scopeKey="ttl");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`;await connectorRequester.set(scopeKeyId,JSON.stringify({scope,value:scopeKey}),null,null,ttl);const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return await connectorRequester.set(fullKey,value,null,null,ttl),{Key:key,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}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 MemoryReadKeyVal extends Component{constructor(){super(),__publicField$Y(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;logger2.debug("Reading Scope Data");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopeStrData=await connectorRequester.get(scopeKeyId);if(!scopeStrData)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Checking Scope");const scopeData=JSON.parse(scopeStrData),scopeKey=scopeData.value;if(scopeData.scope==="session"&&scopeKey!==sessionId)return{_warning:"key not found",_debug:logger2.output};if(scopeData.scope==="request"&&scopeKey!==workflowId)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Reading Value");const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return{Value:await connectorRequester.get(fullKey),_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}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,key+"",value);class MemoryDeleteKeyVal extends Component{constructor(){super(),__publicField$X(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;logger2.debug("Reading Scope Data for deletion");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopeStrData=await connectorRequester.get(scopeKeyId);if(!scopeStrData)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Checking Scope for deletion");const scopeData=JSON.parse(scopeStrData),scopeKey=scopeData.value;if(scopeData.scope==="session"&&scopeKey!==sessionId)return{_warning:"key not found",_debug:logger2.output};if(scopeData.scope==="request"&&scopeKey!==workflowId)return{_warning:"key not found",_debug:logger2.output};logger2.debug("Deleting memory value and scope data");const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return await connectorRequester.delete(fullKey),await connectorRequester.delete(scopeKeyId),{Key:key,deleted:!0,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}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,key+"",value);class MemoryWriteObject extends Component{constructor(){super(),__publicField$W(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),scope:Joi.string().max(20).allow("").label("Scope"),ttl:Joi.number().min(300).max(604800).allow("").label("TTL")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,dataString=input.Data,scope=config2.data.scope,ttl=scope==="ttl"?config2?.data?.ttl:3*60*60;let dataObject;try{dataObject=typeof dataString=="object"?dataString:JSON.parse(dataString)}catch{return{_error:"Invalid JSON data provided",_debug:logger2.output}}if(typeof dataObject!="object"||dataObject===null||Array.isArray(dataObject))return{_error:"Data must be a valid JSON object",_debug:logger2.output};const sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;let scopeKey="";scope==="session"?scopeKey=sessionId:scope==="request"?scopeKey=workflowId:scope==="ttl"&&(scopeKey="ttl");const keys=Object.keys(dataObject);logger2.debug(`Writing ${keys.length} key-value pairs to memory`);const writePromises=keys.map(async key=>{const value=String(dataObject[key]),scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopePromise=connectorRequester.set(scopeKeyId,JSON.stringify({scope,value:scopeKey}),null,null,ttl),fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`,valuePromise=connectorRequester.set(fullKey,value,null,null,ttl);return await Promise.all([scopePromise,valuePromise]),{key,success:!0}}),successfulKeys=(await Promise.all(writePromises)).filter(result=>result.success).map(result=>result.key);return logger2.debug(`Successfully wrote ${successfulKeys.length} keys to memory`),{Keys:successfulKeys,Count:successfulKeys.length,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}class Credentials{}var __typeError=msg=>{throw TypeError(msg)},__accessCheck=(obj,member,msg)=>member.has(obj)||__typeError("Cannot "+msg),__privateGet=(obj,member,getter)=>(__accessCheck(obj,member,"read from private field"),getter?getter.call(obj):member.get(obj)),__privateAdd=(obj,member,value)=>member.has(obj)?__typeError("Cannot add the same private member more than once"):member instanceof WeakSet?member.add(obj):member.set(obj,value),__privateSet=(obj,member,value,setter)=>(__accessCheck(obj,member,"write to private field"),member.set(obj,value),value),_accessToken,_refreshToken,_expiresIn,_scope,_tokenUrl,_service,_clientId,_clientSecret;const _ManagedOAuth2Credentials=class _ManagedOAuth2Credentials2 extends Credentials{constructor(data){super(),__privateAdd(this,_accessToken),__privateAdd(this,_refreshToken),__privateAdd(this,_expiresIn),__privateAdd(this,_scope),__privateAdd(this,_tokenUrl),__privateAdd(this,_service),__privateAdd(this,_clientId),__privateAdd(this,_clientSecret),this.parseData(data)}get accessToken(){return __privateGet(this,_accessToken)}get refreshToken(){return __privateGet(this,_refreshToken)}get expiresIn(){return __privateGet(this,_expiresIn)}get scope(){return __privateGet(this,_scope)}get tokenUrl(){return __privateGet(this,_tokenUrl)}get service(){return __privateGet(this,_service)}static async load(keyId,candidate){const result=await ConnectorService.getManagedVaultConnector().requester(candidate).get(keyId),data=typeof result=="object"?result:JSON.parse(result||"{}");return new _ManagedOAuth2Credentials2(data)}parseData(data){if(!data.auth_data||!data.auth_settings)throw new Error("oAuth2Manager:Invalid data format");__privateSet(this,_accessToken,data.auth_data.primary),__privateSet(this,_refreshToken,data.auth_data.secondary),__privateSet(this,_expiresIn,data.auth_data.expires_in),__privateSet(this,_scope,data.auth_settings.scope),__privateSet(this,_tokenUrl,data.auth_settings.tokenURL),__privateSet(this,_service,data.auth_settings.service),__privateSet(this,_clientId,data.auth_settings.clientID),__privateSet(this,_clientSecret,data.auth_settings.clientSecret)}async refreshAccessToken(){console.log("Refreshing access token...");const tokenUrl=__privateGet(this,_tokenUrl),body=new URLSearchParams({client_id:__privateGet(this,_clientId),client_secret:__privateGet(this,_clientSecret),refresh_token:__privateGet(this,_refreshToken),grant_type:"refresh_token"});try{const res=await fetch(tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:body.toString()}),text=await res.text();let json;try{json=JSON.parse(text)}catch{throw new Error(`Invalid JSON response: ${text}`)}if(!res.ok){const errorMsg=json.error_description||json.error?.message||json.error||text;throw new Error(`HTTP ${res.status}: ${errorMsg}`)}return __privateSet(this,_accessToken,json.access_token),__privateSet(this,_expiresIn,Date.now()+json.expires_in*1e3),__privateGet(this,_accessToken)}catch(error){throw new Error(`Failed to refresh access token: ${error.message}`)}}};_accessToken=new WeakMap,_refreshToken=new WeakMap,_expiresIn=new WeakMap,_scope=new WeakMap,_tokenUrl=new WeakMap,_service=new WeakMap,_clientId=new WeakMap,_clientSecret=new WeakMap;let ManagedOAuth2Credentials=_ManagedOAuth2Credentials;var __defProp$V=Object.defineProperty,__defNormalProp$V=(obj,key,value)=>key in obj?__defProp$V(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$V=(obj,key,value)=>__defNormalProp$V(obj,key+"",value);class Trigger extends Component{constructor(){super(...arguments),__publicField$V(this,"logger")}async process(input,settings,agent){await super.process(input,settings,agent),this.logger=this.createComponentLogger(agent,settings);try{const agentRequest=agent.agentRequest,processedRequest=await this.requestHandler(input,settings,agent);if(processedRequest)return agent.kill("TRIGGER_REQ_HANDLED"),processedRequest;let inputArray=await this.collectPayload(input,settings,agent);return inputArray.length<2?{Payload:inputArray?.[0],_error:null,_in_progress:!1,_debug:this.logger.output}:await this.processIteration(inputArray,settings,agent)}catch(error){return this.logger.error(error),{Payload:{},Result:[],_error:error,_in_progress:!1,_debug:this.logger.output}}}async collectPayload(input,settings,agent){return[]}async requestHandler(input,settings,agent){}async processIteration(inputArray,settings,agent){let Payload={},Result,_temp_result,_error=null,_in_progress=!0;const logger2=this.logger,_LoopData=agent.agentRuntime.getRuntimeData(settings.id)._LoopData||{parentId:settings.id,loopIndex:0,loopLength:inputArray.length};return logger2.debug(`Loop: ${_LoopData.loopIndex} / ${_LoopData.loopLength}`),delete _LoopData.branches,_LoopData.result&&(_temp_result=_LoopData.result,logger2.debug(` => Trigger Iteration Result : ${JSON.stringify(Payload,null,2)}`),logger2.debug("---------------------------------------------------")),Payload=inputArray[_LoopData.loopIndex],logger2.debug(` => Trigger Iteration Data : ${JSON.stringify(Payload,null,2)}`),_in_progress=Payload!==void 0,_in_progress&&_LoopData.loopIndex++,_LoopData._in_progress=_in_progress,agent.agentRuntime.updateRuntimeData(settings.id,{_LoopData}),_in_progress||(Result=(_temp_result||[]).map(item=>cleanupResult(item.result||item))),{Payload,Result,_temp_result,_error,_in_progress,_debug:logger2.output}}async postProcess(output,settings,agent){return output=await super.postProcess(output,settings,agent),output?.result.Result}async register(componentId,componentSettings,payload){}}function cleanupResult(result){return typeof result!="object"||(result._debug&&delete result._debug,result._error&&delete result._error,result._temp_result&&delete result._temp_result,result._in_progress&&delete result._in_progress),result}class GmailTrigger extends Trigger{async collectPayload(input,config2,agent){const credentialsKey=config2?.data?.oauth_cred_id,agentCandidate=AccessCandidate.agent(agent.id),oauth2Credentials=await ManagedOAuth2Credentials.load(credentialsKey,agentCandidate);return console.log(oauth2Credentials.accessToken,oauth2Credentials.refreshToken,oauth2Credentials.expiresIn,oauth2Credentials.scope,oauth2Credentials.tokenUrl,oauth2Credentials.service),await oauth2Credentials.refreshAccessToken(),await getMostRecentUnreadMessage(0,oauth2Credentials,5)}}async function gmailApiRequest(endpoint,accessToken){const url=`https://www.googleapis.com/gmail/v1/users/me${endpoint}`;try{const json=await(await fetch(url,{headers:{Authorization:`Bearer ${accessToken}`}})).json();return console.log(json),json}catch(error){throw new Error(`Gmail API request failed: ${error.message}`)}}async function getMostRecentUnreadMessage(retryCount=0,oauth2Credentials,numMessages=1,excludeMessageId){let accessToken=oauth2Credentials.accessToken;accessToken||(accessToken=await oauth2Credentials.refreshAccessToken());try{console.log("Fetching unread messages...");const collectedIds=[];let pageToken,reachedBoundary=!1;for(;collectedIds.length<numMessages&&!reachedBoundary;){const pageQuery=`/messages?q=is:unread&maxResults=${Math.min(Math.max(numMessages,1),100)}${pageToken?`&pageToken=${pageToken}`:""}`,listResponse=await gmailApiRequest(pageQuery,accessToken),messages=Array.isArray(listResponse.messages)?listResponse.messages:[];if(messages.length===0)break;for(const m of messages)if(excludeMessageId&&m.id,collectedIds.push(m.id),collectedIds.length>=numMessages)break;if(collectedIds.length>=numMessages||reachedBoundary||!listResponse.nextPageToken)break;pageToken=listResponse.nextPageToken}return collectedIds.length===0?[]:(await Promise.all(collectedIds.map(id=>gmailApiRequest(`/messages/${id}?format=full`,accessToken)))).map(d=>parseMessage(d))}catch(error){if((error.message.includes("401")||error.message.includes("unauthorized"))&&retryCount<1){console.log("Access token expired, refreshing...");try{return accessToken=await oauth2Credentials.refreshAccessToken(),await getMostRecentUnreadMessage(retryCount+1,oauth2Credentials,numMessages,excludeMessageId)}catch(refreshError){throw new Error(`Authentication failed: ${refreshError.message}`)}}throw error}}function parseMessage(message){const headers={},payload=message.payload||{};payload.headers&&payload.headers.forEach(header=>{headers[header.name.toLowerCase()]=header.value});let textBody="",htmlBody="";function extractBody(part){part.mimeType==="text/plain"&&part.body&&part.body.data?textBody=Buffer.from(part.body.data,"base64").toString("utf-8"):part.mimeType==="text/html"&&part.body&&part.body.data&&(htmlBody=Buffer.from(part.body.data,"base64").toString("utf-8")),part.parts&&part.parts.forEach(extractBody)}payload.parts?payload.parts.forEach(extractBody):payload.body&&payload.body.data&&(payload.mimeType==="text/plain"?textBody=Buffer.from(payload.body.data,"base64").toString("utf-8"):payload.mimeType==="text/html"&&(htmlBody=Buffer.from(payload.body.data,"base64").toString("utf-8"))),textBody&&!htmlBody&&(htmlBody=textBody),htmlBody&&!textBody&&(textBody=htmlToPlainText(htmlBody));const attachments=[];function findAttachments(part){part.filename&&part.filename.length>0&&attachments.push({filename:part.filename,mimeType:part.mimeType,size:part.body?part.body.size:0,attachmentId:part.body?part.body.attachmentId:null}),part.parts&&part.parts.forEach(findAttachments)}return payload.parts&&payload.parts.forEach(findAttachments),{email:{id:message.id,threadId:message.threadId,labelIds:message.labelIds||[],snippet:message.snippet||"",sizeEstimate:message.sizeEstimate||0,internalDate:message.internalDate?new Date(parseInt(message.internalDate)).toISOString():null,headers:{from:headers.from||"",to:headers.to||"",cc:headers.cc||"",bcc:headers.bcc||"",subject:headers.subject||"",date:headers.date||"",messageId:headers["message-id"]||""},body:{text:textBody,html:htmlBody},attachments,isUnread:message.labelIds?message.labelIds.includes("UNREAD"):!1}}}function htmlToPlainText(htmlText,_styleConfig){try{const document=parseDocument(String(htmlText));findAll(node=>isTag(node)&&(node.name==="script"||node.name==="style"),document.children).forEach(node=>removeElement(node));let text=innerText(document);return text=text.replace(/\u00A0/g," "),text=text.replace(/\r\n?/g,`
|
|
187
227
|
`),text=text.replace(/\t+/g," "),text=text.replace(/[ \t\f]+\n/g,`
|
|
188
228
|
`),text=text.replace(/\n{3,}/g,`
|
|
189
229
|
|
|
190
230
|
`),text=text.replace(/[ ]{2,}/g," "),text=text.replace(/^\s+|\s+$/g,""),(text.length===0||text.lastIndexOf(`
|
|
191
231
|
`)!==text.length-1)&&(text+=`
|
|
192
|
-
`),text}catch{return String(htmlText)}}class WhatsAppTrigger extends Trigger{async collectPayload(input,settings,agent){const body=agent.agentRequest?.body||{};agent.agentRequest.res.sendStatus(200);const message=extractFirstIncomingMessage(body);return message?[{message}]:[]}async requestHandler(input,settings,agent){const req=agent.agentRequest?.req||agent.agentRequest,res=agent.agentRequest?.res;if(!req||!res)return null;const method=(req?.method||"POST").toUpperCase(),query=req?.query||{};if(method==="GET"){const verificationResult=handleVerification(query,settings?.data);if(verificationResult)return verificationResult.valid?res.status(200).type("text/plain").send(verificationResult.challenge):res.status(403).send("Forbidden"),!0}return null}async register(componentId,componentSettings,payload){const verifyToken=componentSettings?.verifyToken||componentSettings?.verify_token,clientId=componentSettings?.clientId||componentSettings?.appId,clientSecret=componentSettings?.clientSecret||componentSettings?.appSecret,subscriptionFields=["messages","message_template_status_update"],inferredWebhookUrl=payload?.triggerUrl,webhookUrl=(componentSettings?.webhookUrl||inferredWebhookUrl||"").split("?")[0];if(!clientId||!clientSecret)throw new Error("WhatsAppTrigger.register: Missing clientId/clientSecret");if(!verifyToken)throw new Error("WhatsAppTrigger.register: Missing verifyToken");if(!webhookUrl)throw new Error("WhatsAppTrigger.register: Missing webhookUrl");const accessToken=await getAppAccessToken(clientId,clientSecret);(await listWebhookSubscriptions(clientId,accessToken)||[]).find(s=>s.object==="whatsapp_business_account"&&s.active)&&await deleteWebhookSubscription(clientId,accessToken),await createWebhookSubscription(clientId,accessToken,{callback_url:webhookUrl,verify_token:verifyToken,fields:subscriptionFields})}async unregister(componentId,agent,payload){const data=(await agent.components[componentId])?.data||{},clientId=data?.clientId||data?.appId,clientSecret=data?.clientSecret||data?.appSecret;if(!clientId||!clientSecret)throw new Error("WhatsAppTrigger.unregister: Missing clientId/clientSecret");const accessToken=await getAppAccessToken(clientId,clientSecret);await deleteWebhookSubscription(clientId,accessToken)}}function handleVerification(query,config2){if(!(query?.["hub.mode"]==="subscribe"||query?.["hub.mode"]==="SUBSCRIBE"))return null;const providedToken=query["hub.verify_token"]||query["hub.verifyToken"],expectedToken=config2?.verifyToken||config2?.verify_token,challenge=query["hub.challenge"];return{valid:expectedToken?String(providedToken)===String(expectedToken):!1,challenge,mode:query["hub.mode"]}}async function getAppAccessToken(clientId,clientSecret){const url="https://graph.facebook.com/v19.0/oauth/access_token",body=new URLSearchParams({client_id:clientId,client_secret:clientSecret,grant_type:"client_credentials"}).toString(),res=await fetch(url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body}),json=await res.json();if(!res.ok)throw new Error(`getAppAccessToken failed: ${json?.error?.message||res.status}`);return json.access_token}async function listWebhookSubscriptions(clientId,accessToken){const url=`https://graph.facebook.com/v19.0/${clientId}/subscriptions`,res=await fetch(url,{method:"GET",headers:{Authorization:`Bearer ${accessToken}`}}),json=await res.json();if(!res.ok)throw new Error(`listWebhookSubscriptions failed: ${json?.error?.message||res.status}`);return json?.data||[]}async function deleteWebhookSubscription(clientId,accessToken){const url=`https://graph.facebook.com/v19.0/${clientId}/subscriptions`,body=new URLSearchParams({object:"whatsapp_business_account"}).toString(),res=await fetch(url,{method:"DELETE",headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/x-www-form-urlencoded"},body});if(!res.ok){const json=await res.json().catch(()=>({}));throw new Error(`deleteWebhookSubscription failed: ${json?.error?.message||res.status}`)}return!0}async function createWebhookSubscription(clientId,accessToken,params){const url=`https://graph.facebook.com/v19.0/${clientId}/subscriptions`,body=new URLSearchParams({object:"whatsapp_business_account",callback_url:params.callback_url,verify_token:params.verify_token,fields:JSON.stringify(params.fields),include_values:"true"}).toString(),res=await fetch(url,{method:"POST",headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/x-www-form-urlencoded"},body}),json=await res.json();if(!res.ok)throw new Error(`createWebhookSubscription failed: ${json?.error?.message||res.status}`);return json}function extractFirstIncomingMessage(body){try{const entries=Array.isArray(body?.entry)?body.entry:[];for(const entry of entries){const changes=Array.isArray(entry?.changes)?entry.changes:[];for(const change of changes){const value=change?.value||{},messages=Array.isArray(value?.messages)?value.messages:[];if(!messages.length)continue;const m=messages.find(x=>x?.text?.body)||messages[0]||{},contacts=Array.isArray(value?.contacts)?value.contacts:[],contact=contacts.length?contacts[0]:void 0,text=m?.text?.body||m?.button?.text||m?.interactive?.list_reply?.title||"",timestampIso=m?.timestamp?new Date(parseInt(m.timestamp,10)*1e3).toISOString():void 0;return{id:m?.id,from:m?.from||contact?.wa_id,profileName:contact?.profile?.name,text,type:m?.type,timestamp:timestampIso,phoneNumberId:value?.metadata?.phone_number_id}}}return null}catch{return null}}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,key+"",value);class Schedule{constructor(data){__publicField$X(this,"data",{}),data&&(this.data={...data})}static every(interval){const schedule=new Schedule;return schedule.data.interval=interval,schedule}static cron(cronExpression){const schedule=new Schedule;return schedule.data.cron=cronExpression,schedule}starts(date){return this.data.startDate=date.toISOString(),this}ends(date){return this.data.endDate=date.toISOString(),this}toJSON(){return{...this.data}}static fromJSON(json){return new Schedule(json)}getData(){return{...this.data}}validate(){if(!this.data.interval&&!this.data.cron)return{valid:!1,error:"Schedule must have either interval or cron expression"};if(this.data.interval&&this.data.cron)return{valid:!1,error:"Schedule cannot have both interval and cron expression"};if(this.data.interval&&!/^(\d+)(s|m|h|d|w)$/.test(this.data.interval))return{valid:!1,error:'Invalid interval format. Use format like "10m", "30s", "2h"'};if(this.data.startDate&&this.data.endDate){const start=new Date(this.data.startDate),end=new Date(this.data.endDate);if(start>=end)return{valid:!1,error:"Start date must be before end date"}}return{valid:!0}}static parseInterval(interval){const match=interval.match(/^(\d+)(s|m|h|d|w)$/);if(!match)throw new Error(`Invalid interval format: ${interval}`);const value=parseInt(match[1],10),unit=match[2],multipliers={s:1e3,m:60*1e3,h:60*60*1e3,d:24*60*60*1e3,w:7*24*60*60*1e3};return value*multipliers[unit]}shouldRun(now=new Date){return!(this.data.startDate&&now<new Date(this.data.startDate)||this.data.endDate&&now>new Date(this.data.endDate))}calculateNextRun(lastRun){const now=new Date;if(this.data.endDate&&now>new Date(this.data.endDate))return null;if(this.data.interval){const intervalMs=Schedule.parseInterval(this.data.interval),nextRun=lastRun?new Date(lastRun.getTime()+intervalMs):now;if(this.data.startDate){const startDate=new Date(this.data.startDate);return nextRun<startDate?startDate:nextRun}return nextRun}return null}}var __defProp$W=Object.defineProperty,__getOwnPropDesc$w=Object.getOwnPropertyDescriptor,__defNormalProp$W=(obj,key,value)=>key in obj?__defProp$W(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$w=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$w(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$W(target,key,result),result},__publicField$W=(obj,key,value)=>__defNormalProp$W(obj,key+"",value);const console$m=Logger("Scheduler/Job"),_Job=class _Job2{constructor(config2){if(__publicField$W(this,"config"),!config2.type||config2.type!=="skill"&&config2.type!=="prompt"&&config2.type!=="trigger")throw new Error('Job type must be either "skill", "prompt", or "trigger"');if(!config2.agentId)throw new Error("Job must have an agentId");if(config2.type==="skill"&&!config2.skillName)throw new Error("Skill job must have a skillName");if(config2.type==="prompt"&&!config2.prompt)throw new Error("Prompt job must have a prompt");if(config2.type==="trigger"&&!config2.triggerName)throw new Error("Trigger job must have a triggerName");this.config={...config2,metadata:{retryOnFailure:!1,maxRetries:0,tags:[],...config2.metadata}}}get agentId(){return this.config.agentId}getMetadata(){return{...this.config.metadata}}getConfig(){return{...this.config}}async execute(){const startTime=Date.now();try{let result;return this.config.metadata.timeout&&this.config.metadata.timeout>0?result=await this.executeWithTimeout(this.config.metadata.timeout):result=await this.executeInternal(),{success:!0,executionTime:Date.now()-startTime,result}}catch(error){const executionTime=Date.now()-startTime;return{success:!1,error:error instanceof Error?error:new Error(String(error)),executionTime}}}async executeInternal(){return this.config.type==="skill"?await this.executeSkill():this.config.type==="trigger"?await this.executeTrigger():await this.executePrompt()}async executeSkill(){const config2=this.config,agentDataConnector=ConnectorService.getAgentDataConnector(),agentData=await agentDataConnector.getEphemeralAgentData(config2.agentId)||await agentDataConnector.getAgentData(config2.agentId);if(!agentData)throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const components2=(agentData.data||agentData).components;if(!components2||!Array.isArray(components2))throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const skill=components2.find(c=>(c.data?.endpoint||c.endpoint)===config2.skillName);if(!skill)throw new Error(`Skill ${config2.skillName} not found in agent ${config2.agentId}`);const method=(skill.data?.method||skill.method||"POST").toUpperCase(),path2=`/api/${config2.skillName}`,headers={"Content-Type":"application/json"},args=config2.args||{},body=method==="POST"?args:void 0,query=method==="GET"?args:void 0,agent=AgentProcess.load(agentData);return await agent.ready(),(await agent.run({method,path:path2,body,query,headers})).data}async executeTrigger(){const config2=this.config,agentDataConnector=ConnectorService.getAgentDataConnector(),agentData=await agentDataConnector.getEphemeralAgentData(config2.agentId)||await agentDataConnector.getAgentData(config2.agentId);if(!agentData)throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const components2=(agentData.data||agentData).components;if(!components2||!Array.isArray(components2))throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);if(!components2.find(c=>(c.data?.triggerEndpoint||c.triggerEndpoint)===config2.triggerName))throw new Error(`Trigger ${config2.triggerName} not found in agent ${config2.agentId}`);const path2=`/trigger/${config2.triggerName}`,headers={"Content-Type":"application/json"},agent=AgentProcess.load(agentData);return await agent.ready(),(await agent.run({method:"POST",path:path2,body:{},query:{},headers})).data}async executePrompt(){const config2=this.config,agentDataConnector=ConnectorService.getAgentDataConnector(),agentData=await agentDataConnector.getEphemeralAgentData(config2.agentId)||await agentDataConnector.getAgentData(config2.agentId);if(!agentData)throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const actualData=agentData.data||agentData,defaultModel=actualData.defaultModel,behavior=actualData.behavior||"";if(!defaultModel)throw new Error(`No model configured for agent ${config2.agentId}`);const conversation=new Conversation(defaultModel,agentData,{systemPrompt:behavior,agentId:config2.agentId});return await conversation.ready,await conversation.prompt(config2.prompt)}async executeWithRetry(retryCount=0){let lastError,totalExecutionTime=0,lastResult;const maxRetries=this.config.metadata.retryOnFailure&&this.config.metadata.maxRetries||0;for(let attempt=0;attempt<=maxRetries;attempt++){const result=await this.execute();if(totalExecutionTime+=result.executionTime,lastResult=result.result,result.success)return{success:!0,executionTime:totalExecutionTime,retries:attempt,result:lastResult};lastError=result.error,attempt<maxRetries&&await this.sleep(Math.min(1e3*Math.pow(2,attempt),3e4))}return{success:!1,error:lastError,executionTime:totalExecutionTime,retries:maxRetries}}async executeWithTimeout(timeoutMs){return new Promise((resolve,reject)=>{const timer=setTimeout(()=>{reject(new Error(`Job execution timed out after ${timeoutMs}ms`))},timeoutMs);this.executeInternal().then(result=>{clearTimeout(timer),resolve(result)}).catch(error=>{clearTimeout(timer),reject(error)})})}sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}toJSON(){return{...this.config}}static fromJSON(config2){return new _Job2(config2)}};__decorateClass$w([hookAsync("Scheduler/Job.execute")],_Job.prototype,"execute");let Job=_Job;class JobSchedulerTrigger extends Trigger{async collectPayload(input,settings,agent){agent.agentRequest;let payload=JSONContent(settings?.data?.payload).tryParse();return typeof payload!="object"&&(payload={}),[{...payload}]}async register(componentId,componentSettings,payload){try{const agent=payload?.agentData,triggerName=componentSettings.triggerEndpoint,schedulerConnector=ConnectorService.getSchedulerConnector();if(!schedulerConnector)throw new Error("Scheduler connector not found");const schedulerRequester=schedulerConnector.agent(agent.id),jobId=`job-${agent.id}-${triggerName}`;await schedulerRequester.add(jobId,new Job({agentId:agent.id,type:"trigger",triggerName}),Schedule.every("10s"))}catch{throw new Error("Failed to schedule job")}}async unregister(componentId,agent,payload){}}const components={Component:new Component,Note:new Component,APIEndpoint:new APIEndpoint,APIOutput:new APIOutput,PromptGenerator:new PromptGenerator,LLMPrompt:new PromptGenerator,APICall:new APICall,VisionLLM:new VisionLLM,FSleep:new FSleep,FHash:new FHash,FEncDec:new FEncDec,FSign:new FSign,FTimestamp:new FTimestamp,DataSourceLookup:new DataSourceLookup,DataSourceIndexer:new DataSourceIndexer,DataSourceCleaner:new DataSourceCleaner,JSONFilter:new JSONFilter,LogicAND:new LogicAND,LogicOR:new LogicOR,LogicXOR:new LogicXOR,LogicAtLeast:new LogicAtLeast,LogicAtMost:new LogicAtMost,AgentPlugin:new AgentPlugin,LLMAssistant:new LLMAssistant,Async:new Async,Await:new Await,ForEach:new ForEach,HuggingFace:new HuggingFace,ZapierAction:new ZapierAction,GPTPlugin:new GPTPlugin,Classifier:new Classifier,MultimodalLLM:new MultimodalLLM,GenAILLM:new GenAILLM,FileStore:new FileStore,WebSearch:new TavilyWebSearch,WebScrape:new ScrapflyWebScrape,TavilyWebSearch:new TavilyWebSearch,ScrapflyWebScrape:new ScrapflyWebScrape,ComponentHost:new ComponentHost,ServerlessCode:new ServerlessCode,ImageGenerator:new ImageGenerator,MCPClient:new MCPClient,OpenAPI:new OpenAPI,ECMASandbox:new ECMASandbox$1,MemoryWriteKeyVal:new MemoryWriteKeyVal,MemoryReadKeyVal:new MemoryReadKeyVal,MemoryDeleteKeyVal:new MemoryDeleteKeyVal,MemoryWriteObject:new MemoryWriteObject,GmailTrigger:new GmailTrigger,WhatsAppTrigger:new WhatsAppTrigger,JobSchedulerTrigger:new JobSchedulerTrigger},ComponentInstances=components,console$l=Logger("S3Cache");function generateLifecycleRules(){const rules=[];for(let i=1;i<100;i++)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});for(let i=100;i<1e3;i+=10)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});for(let i=1e3;i<=1e4;i+=100)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});return rules}function generateExpiryMetadata(expiryDays){let metadataValue;if(expiryDays>=1&&expiryDays<100)metadataValue=`ExpireAfter${expiryDays}Days`;else if(expiryDays>=100&&expiryDays<1e3)metadataValue=`ExpireAfter${Math.ceil(expiryDays/10)*10}Days`;else if(expiryDays>=1e3&&expiryDays<=1e4)metadataValue=`ExpireAfter${Math.ceil(expiryDays/100)*100}Days`;else throw new Error("Invalid expiry days. Please provide a valid expiry days value.");return{Key:"Expiry",Value:metadataValue}}function getNonExistingRules(existingRules,newRules){return newRules.filter(rule=>!existingRules.some(existingRule=>existingRule.ID===rule.ID))}function ttlToExpiryDays(ttl){return Math.ceil(ttl/(60*60*24))}async function checkAndInstallLifecycleRules(bucketName,s3Client){if(!bucketName||bucketName.trim()==="")throw new Error("Bucket name is required and cannot be empty");if(!s3Client)throw new Error("S3Client is required");console$l.log(`Checking lifecycle rules for bucket: ${bucketName}`);try{const getLifecycleCommand=new GetBucketLifecycleConfigurationCommand({Bucket:bucketName}),existingRules=(await s3Client.send(getLifecycleCommand)).Rules,newRules=generateLifecycleRules(),nonExistingNewRules=getNonExistingRules(existingRules,newRules);if(nonExistingNewRules.length>0){const params={Bucket:bucketName,LifecycleConfiguration:{Rules:[...existingRules,...nonExistingNewRules]}},putLifecycleCommand=new PutBucketLifecycleConfigurationCommand(params);await s3Client.send(putLifecycleCommand),console$l.log(`Added ${nonExistingNewRules.length} new lifecycle rules to bucket: ${bucketName}`)}else console$l.log("Lifecycle configuration already exists")}catch(error){if(error.code==="NoSuchLifecycleConfiguration"){console$l.log("No lifecycle configuration found. Creating new configuration...");const lifecycleRules=generateLifecycleRules(),params={Bucket:bucketName,LifecycleConfiguration:{Rules:lifecycleRules}},putLifecycleCommand=new PutBucketLifecycleConfigurationCommand(params);await s3Client.send(putLifecycleCommand),console$l.log("Lifecycle configuration created successfully.")}else console$l.error("Error checking lifecycle configuration:",error),console$l.error("Bucket name provided:",bucketName),console$l.error("Error details:",{name:error.name,message:error.message,code:error.code})}}var __defProp$V=Object.defineProperty,__getOwnPropDesc$v=Object.getOwnPropertyDescriptor,__defNormalProp$V=(obj,key,value)=>key in obj?__defProp$V(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$v=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$v(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$V(target,key,result),result},__publicField$V=(obj,key,value)=>__defNormalProp$V(obj,typeof key!="symbol"?key+"":key,value);Object.defineProperty(global,"crypto",{value:{getRandomValues:arr=>crypto$1.randomBytes(arr.length)}});const console$k=Logger("S3Storage");class S3Storage extends StorageConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$V(this,"name","S3Storage"),__publicField$V(this,"client"),__publicField$V(this,"bucket"),__publicField$V(this,"isInitialized",!1),__publicField$V(this,"initializationPromise",null),!_settings.bucket||_settings.bucket.trim()===""){console$k.warn("S3 bucket name is required and cannot be empty, connector not initialized");return}this.bucket=_settings.bucket;const clientConfig={};_settings.region&&(clientConfig.region=_settings.region),_settings.accessKeyId&&_settings.secretAccessKey&&(clientConfig.credentials={accessKeyId:_settings.accessKeyId,secretAccessKey:_settings.secretAccessKey}),this.client=new S3Client(clientConfig)}async ensureInitialized(){if(!this.isInitialized)return this.initializationPromise?this.initializationPromise:(this.initializationPromise=this.initialize(),this.initializationPromise)}async initialize(){if(!this.client){console$k.warn("S3 client not initialized");return}if(!this.isInitialized)try{await checkAndInstallLifecycleRules(this.bucket,this.client),this.isInitialized=!0}catch(error){throw console$k.error("Failed to initialize S3Storage:",error),this.initializationPromise=null,error}}async read(acRequest,resourceId){await this.ensureInitialized();const params={Bucket:this.bucket,Key:resourceId},s3HeadCommand=new HeadObjectCommand(params),expirationHeader=(await this.client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]);if(new Date>expirationDate){const s3DeleteCommand=new DeleteObjectCommand(params);await this.client.send(s3DeleteCommand);return}}}const command=new GetObjectCommand(params);try{const response=await this.client.send(command);return await streamToBuffer(response.Body)}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$k.error("Error reading object from S3",error.name,error.message),error}}async getMetadata(acRequest,resourceId){await this.ensureInitialized();try{return await this.getS3Metadata(resourceId)}catch(error){throw console$k.error("Error getting access rights in S3",error.name,error.message),error}}async setMetadata(acRequest,resourceId,metadata){await this.ensureInitialized();try{let s3Metadata=await this.getS3Metadata(resourceId);s3Metadata||(s3Metadata={}),s3Metadata={...s3Metadata,...metadata},await this.setS3Metadata(resourceId,s3Metadata)}catch(error){throw console$k.error("Error setting access rights in S3",error),error}}async write(acRequest,resourceId,value,acl,metadata){await this.ensureInitialized();const accessCandidate=acRequest.candidate;let amzACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,s3Metadata={...metadata,"x-amz-meta-acl":amzACL};const command=new PutObjectCommand({Bucket:this.bucket,Key:resourceId,Body:value,Metadata:this.serializeS3Metadata(s3Metadata),ContentType:s3Metadata.ContentType});try{const result=await this.client.send(command)}catch(error){throw console$k.error("Error writing object to S3",error.name,error.message),error}}async delete(acRequest,resourceId){await this.ensureInitialized();const command=new DeleteObjectCommand({Bucket:this.bucket,Key:resourceId});try{await this.client.send(command)}catch(error){throw console$k.error("Error deleting object from S3",error.name,error.message),error}}async exists(acRequest,resourceId){await this.ensureInitialized();const command=new HeadObjectCommand({Bucket:this.bucket,Key:resourceId});try{return await this.client.send(command),!0}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return!1;throw console$k.error("Error checking object existence in S3",error.name,error.message),error}}async getResourceACL(resourceId,candidate){await this.ensureInitialized();const s3Metadata=await this.getS3Metadata(resourceId);return s3Metadata!==void 0?ACL.from(s3Metadata?.["x-amz-meta-acl"]):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async getACL(acRequest,resourceId){await this.ensureInitialized();try{const s3Metadata=await this.getS3Metadata(resourceId);return ACL.from(s3Metadata?.["x-amz-meta-acl"])}catch(error){throw console$k.error("Error getting access rights in S3",error.name,error.message),error}}async setACL(acRequest,resourceId,acl){await this.ensureInitialized();try{let s3Metadata=await this.getS3Metadata(resourceId);s3Metadata||(s3Metadata={}),s3Metadata["x-amz-meta-acl"]=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setS3Metadata(resourceId,s3Metadata)}catch(error){throw console$k.error("Error setting access rights in S3",error),error}}async expire(acRequest,resourceId,ttl){await this.ensureInitialized();const expiryMetadata=generateExpiryMetadata(ttlToExpiryDays(ttl)),s3PutObjectTaggingCommand=new PutObjectTaggingCommand({Bucket:this.bucket,Key:resourceId,Tagging:{TagSet:[{Key:expiryMetadata.Key,Value:expiryMetadata.Value}]}});await this.client.send(s3PutObjectTaggingCommand)}migrateMetadata(metadata){if(!metadata.agentid&&!metadata.teamid&&!metadata.userid)return metadata;{const convertibleItems=["agentid","teamid","userid"],aclHelper=new ACL;for(let key of convertibleItems){if(!metadata[key])continue;const role=key==="agentid"?TAccessRole.Agent:key==="teamid"?TAccessRole.Team:TAccessRole.User;aclHelper.addAccess(role,metadata[key].toString(),[TAccessLevel.Owner,TAccessLevel.Read,TAccessLevel.Write]),delete metadata[key]}aclHelper.migrated=!0;const newMetadata={"x-amz-meta-acl":aclHelper.ACL};for(let key in metadata)newMetadata[key]=metadata[key];return newMetadata}}serializeS3Metadata(s3Metadata){let amzMetadata={};s3Metadata["x-amz-meta-acl"]&&(s3Metadata["x-amz-meta-acl"]&&(amzMetadata["x-amz-meta-acl"]=typeof s3Metadata["x-amz-meta-acl"]=="string"?s3Metadata["x-amz-meta-acl"]:ACL.from(s3Metadata["x-amz-meta-acl"]).serializedACL),delete s3Metadata["x-amz-meta-acl"]);for(let key in s3Metadata)key!="ContentType"&&(amzMetadata[key]=typeof s3Metadata[key]=="string"?s3Metadata[key]:JSON.stringify(s3Metadata[key]));return amzMetadata}deserializeS3Metadata(amzMetadata){let metadata={};for(let key in amzMetadata){if(key==="x-amz-meta-acl"){metadata[key]=ACL.from(amzMetadata[key]).ACL;continue}try{metadata[key]=JSON.parse(amzMetadata[key])}catch{metadata[key]=amzMetadata[key]}}return metadata=this.migrateMetadata(metadata),metadata}async getS3Metadata(resourceId){try{const command=new HeadObjectCommand({Bucket:this.bucket,Key:resourceId}),response=await this.client.send(command),s3RawMetadata=response.Metadata;if(!s3RawMetadata||Object.keys(s3RawMetadata).length===0)return{};let metadata=this.deserializeS3Metadata(s3RawMetadata);return metadata.ContentType||(metadata.ContentType=response.ContentType?response.ContentType:"application/octet-stream"),metadata}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$k.error("Error reading object metadata from S3",error.name,error.message),error}}async setS3Metadata(resourceId,metadata){try{const getObjectCommand=new GetObjectCommand({Bucket:this.bucket,Key:resourceId}),objectData=await this.client.send(getObjectCommand),bufferBody=await streamToBuffer(objectData.Body),amzMetadata=this.serializeS3Metadata(metadata),putObjectCommand=new PutObjectCommand({Bucket:this.bucket,Key:resourceId,Body:bufferBody,Metadata:amzMetadata});await this.client.send(putObjectCommand)}catch(error){throw console$k.error("Error setting object metadata in S3",error.name,error.message),error}}}__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"read"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"getMetadata"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"setMetadata"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"write"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"delete"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"exists"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"getACL"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"setACL"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"expire");var __defProp$U=Object.defineProperty,__getOwnPropDesc$u=Object.getOwnPropertyDescriptor,__defNormalProp$U=(obj,key,value)=>key in obj?__defProp$U(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$u=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$u(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$U(target,key,result),result},__publicField$U=(obj,key,value)=>__defNormalProp$U(obj,typeof key!="symbol"?key+"":key,value);const console$j=Logger("LocalStorage");class LocalStorage extends StorageConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$U(this,"name","LocalStorage"),__publicField$U(this,"folder"),__publicField$U(this,"storagePrefix","local"),__publicField$U(this,"metadataPrefix",".local.metadata"),__publicField$U(this,"isInitialized",!1),this.folder=this.findStorageFolder(_settings?.folder),this.initialize(),fs__default.existsSync(this.folder)||console$j.error(`Invalid folder provided: ${this.folder}`)}findStorageFolder(folder){let _storageFolder=folder;return fs__default.existsSync(_storageFolder)?_storageFolder:(_storageFolder=findSmythPath("storage"),fs__default.existsSync(_storageFolder)?(console$j.warn("Using alternative storage folder found in : ",_storageFolder),_storageFolder):(console$j.warn("!!! All attempts to find an existing storage folder failed !!!"),console$j.warn("!!! I will use this folder: ",_storageFolder),_storageFolder))}async read(acRequest,resourceId){this.isInitialized||await this.initialize();try{const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);return fs__default.existsSync(filePath)?fs__default.readFileSync(filePath,null):void 0}catch(error){throw console$j.error("Error reading object from local storage",error.name,error.message),error}}async getMetadata(acRequest,resourceId){try{const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId);if(!fs__default.existsSync(metadataFilePath))return;const data=fs__default.readFileSync(metadataFilePath,"utf-8");return this.deserializeMetadata(JSON.parse(data))}catch(error){throw console$j.error("Error reading metadata from LocalStorage",error.name,error.message),error}}async setMetadata(acRequest,resourceId,metadata){try{let fileMetadata=await this.getMetadata(acRequest,resourceId);fileMetadata||(fileMetadata={}),fileMetadata={...fileMetadata,...metadata};const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId,!0),serializedMetadata=this.serializeMetadata(fileMetadata);fs__default.writeFileSync(metadataFilePath,JSON.stringify(serializedMetadata))}catch(error){throw console$j.error("Error setting metadata in local storage",error.name,error.message),error}}async write(acRequest,resourceId,value,acl,metadata){this.isInitialized||await this.initialize();const accessCandidate=acRequest.candidate;let localACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,fileMetadata={...metadata,acl:localACL};const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId,!0);fs__default.writeFileSync(filePath,value),await this.setMetadata(acRequest,resourceId,fileMetadata)}async delete(acRequest,resourceId){try{const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);fs__default.existsSync(filePath)&&fs__default.unlinkSync(filePath);const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId);fs__default.existsSync(metadataFilePath)&&fs__default.unlinkSync(metadataFilePath)}catch(error){throw console$j.error("Error deleting object from local storage",error.name,error.message),error}}async exists(acRequest,resourceId){this.isInitialized||await this.initialize();const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);return!!fs__default.existsSync(filePath)}async getResourceACL(resourceId,candidate){this.isInitialized||await this.initialize();const metadataFilePath=this.getMetadataFilePath(candidate.id,resourceId);if(!fs__default.existsSync(metadataFilePath))return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);const metadata=fs__default.readFileSync(metadataFilePath,"utf-8");if(metadata===void 0)return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);try{let metadataObject=JSON.parse(metadata);return ACL.from(metadataObject?.acl)}catch(error){throw console$j.error("Error parsing metadata in local storage",error.name,error.message),error}}async getACL(acRequest,resourceId){try{const fileMetadata=await this.getMetadata(acRequest,resourceId);return ACL.from(fileMetadata?.acl)}catch(error){throw console$j.error("Error getting access rights in local storage",error.name,error.message),error}}async setACL(acRequest,resourceId,acl){try{let fileMetadata=await this.getMetadata(acRequest,resourceId);fileMetadata||(fileMetadata={}),fileMetadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,resourceId,fileMetadata)}catch(error){throw console$j.error("Error setting access rights in local storage",error),error}}async expire(acRequest,resourceId,ttl){console$j.warn(`LocalStorage.expire is not implemented, request will be ignored for resource ${resourceId} and ttl ${ttl}`)}async initialize(){const storageFolderPath=path.join(this.folder,this.storagePrefix);existsSync(storageFolderPath)||fs__default.mkdirSync(storageFolderPath,{recursive:!0});const metadataFolderPath=path.join(this.folder,this.metadataPrefix);existsSync(metadataFolderPath)||(fs__default.mkdirSync(metadataFolderPath,{recursive:!0}),fs__default.writeFileSync(path.join(metadataFolderPath,"README_IMPORTANT.txt"),"This folder is used for smythOS metadata, do not delete it, it will break SmythOS local filesystem")),this.isInitialized=!0}getStorageFilePath(candidateId,resourceId,createFoldersIfNotExists=!1){const fullPath=path.join(this.folder,this.storagePrefix,resourceId),folder=path.dirname(fullPath);return createFoldersIfNotExists&&!fs__default.existsSync(folder)&&fs__default.mkdirSync(folder,{recursive:!0}),fullPath}getMetadataFilePath(candidateId,resourceId,createFoldersIfNotExists=!1){const fullPath=path.join(this.folder,this.metadataPrefix,resourceId),folder=path.dirname(fullPath);return createFoldersIfNotExists&&!fs__default.existsSync(folder)&&fs__default.mkdirSync(folder,{recursive:!0}),fullPath}serializeMetadata(metadata){let updatedMetadata={};metadata.acl&&(metadata.acl&&(updatedMetadata.acl=typeof metadata.acl=="string"?metadata.acl:ACL.from(metadata.acl).serializedACL),delete metadata.acl);for(let key in metadata)updatedMetadata[key]=typeof metadata[key]=="string"?metadata[key]:JSON.stringify(metadata[key]);return updatedMetadata}deserializeMetadata(metadata){let deserializedMetadata={};for(let key in metadata){if(key==="acl"){deserializedMetadata[key]=ACL.from(metadata[key]).ACL;continue}try{deserializedMetadata[key]=JSON.parse(metadata[key])}catch{deserializedMetadata[key]=metadata[key]}}return deserializedMetadata}}__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"read"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"getMetadata"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"setMetadata"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"write"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"delete"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"exists"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"getACL"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"setACL"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"expire");class StorageService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Storage,"S3",S3Storage),ConnectorService.register(TConnectorService.Storage,"LocalStorage",LocalStorage)}}async function getLLMCredentials(candidate,modelInfo){const credentialsList=Array.isArray(modelInfo.credentials)?modelInfo.credentials||[TLLMCredentials.Internal]:[modelInfo.credentials||TLLMCredentials.Internal];for(let credentialsMode of credentialsList){if(typeof credentialsMode=="object"){const resolvedCredentials={};for(const[key,value]of Object.entries(credentialsMode))resolvedCredentials[key]=await resolveKeyTemplate(value,candidate);return resolvedCredentials}switch(credentialsMode){case TLLMCredentials.None:return{apiKey:""};case TLLMCredentials.Internal:{const credentials=await getEnvCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.Vault:{const credentials=await getStandardLLMCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.BedrockVault:{const credentials=await getBedrockCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.VertexAIVault:{const credentials=await getVertexAICredentials(candidate,modelInfo);if(credentials)return credentials;break}}}return{}}const SMYTHOS_API_KEYS={echo:"",openai:process.env.OPENAI_API_KEY,anthropic:process.env.ANTHROPIC_API_KEY,googleai:process.env.GOOGLE_AI_API_KEY,togetherai:process.env.TOGETHER_AI_API_KEY,groq:process.env.GROQ_API_KEY,xai:process.env.XAI_API_KEY,perplexity:process.env.PERPLEXITY_API_KEY};async function getEnvCredentials(candidate,modelInfo){const provider=(modelInfo.provider||modelInfo.llm)?.toLowerCase(),apiKey=SMYTHOS_API_KEYS?.[provider]||"";return apiKey?{apiKey}:null}async function getStandardLLMCredentials(candidate,modelInfo){const provider=(modelInfo.provider||modelInfo.llm)?.toLowerCase(),apiKey=await ConnectorService.getVaultConnector().requester(candidate).get(provider).catch(()=>"");return apiKey?{apiKey,isUserKey:!0}:null}async function getBedrockCredentials(candidate,modelInfo){const keyIdName=modelInfo.settings?.keyIDName,secretKeyName=modelInfo.settings?.secretKeyName,sessionKeyName=modelInfo.settings?.sessionKeyName,vaultConnector=ConnectorService.getVaultConnector(),[accessKeyId,secretAccessKey,sessionToken]=await Promise.all([vaultConnector.requester(candidate).get(keyIdName).catch(()=>""),vaultConnector.requester(candidate).get(secretKeyName).catch(()=>""),vaultConnector.requester(candidate).get(sessionKeyName).catch(()=>"")]);let credentials={accessKeyId,secretAccessKey,isUserKey:!0};return sessionToken&&(credentials.sessionToken=sessionToken),!accessKeyId||!secretAccessKey?null:credentials}async function getVertexAICredentials(candidate,modelInfo){const jsonCredentialsName=modelInfo.settings?.jsonCredentialsName;let jsonCredentials=await ConnectorService.getVaultConnector().requester(candidate).get(jsonCredentialsName).catch(()=>"");const credentials=JSON.parse(jsonCredentials);return credentials?{...credentials,isUserKey:!0}:null}function createVaultKeyProcessor(candidate){return async token=>{try{return await ConnectorService.getVaultConnector().requester(candidate).get(token)}catch{return""}}}async function resolveKeyTemplate(value,candidate){if(typeof value=="string")return await TemplateString(value).process(createVaultKeyProcessor(candidate),Match.fn("KEY")).asyncResult;if(Array.isArray(value))return await Promise.all(value.map(item=>resolveKeyTemplate(item,candidate)));if(typeof value=="object"&&value!==null){const resolvedObject={};for(const[key,val]of Object.entries(value))resolvedObject[key]=await resolveKeyTemplate(val,candidate);return resolvedObject}return value}var __defProp$T=Object.defineProperty,__defNormalProp$T=(obj,key,value)=>key in obj?__defProp$T(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$T=(obj,key,value)=>__defNormalProp$T(obj,typeof key!="symbol"?key+"":key,value);const logger$g=Logger("LLMConnector");class LLMStream extends Readable{constructor(options){super(options),__publicField$T(this,"dataQueue"),__publicField$T(this,"isReading"),this.dataQueue=[],this.isReading=!0}_read(size){if(this.dataQueue.length>0)for(;this.dataQueue.length>0;){const chunk=this.dataQueue.shift();if(!this.push(chunk))break}else this.push(null)}enqueueData(data){this.dataQueue.push(data),this.read(0)}endStream(){this.isReading=!1,this.push(null)}}class LLMConnector extends Connector{constructor(){super(...arguments),__publicField$T(this,"vaultConnector")}imageGenRequest({acRequest,body,context:context2}){return Promise.reject(new Error("Image edit not supported by this model"))}imageEditRequest({acRequest,body,context:context2}){return Promise.reject(new Error("Image edit not supported by this model"))}requester(candidate){return this.vaultConnector=ConnectorService.getVaultConnector(),(!this.vaultConnector||!this.vaultConnector.valid)&&logger$g.warn(`Vault Connector unavailable for ${candidate.id} `),{request:async params=>{logger$g.debug(`request ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params),provider=preparedParams.modelInfo.provider;return await this.request({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,agentId:preparedParams.agentId,teamId:preparedParams.teamId,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials,toolsInfo:{[provider]:preparedParams.toolsInfo[provider]}}})},streamRequest:async params=>{logger$g.debug(`streamRequest ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params),provider=preparedParams.modelInfo.provider?.toLowerCase(),requestParams={acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,agentId:preparedParams.agentId,teamId:preparedParams.teamId,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials,toolsInfo:{[provider]:preparedParams.toolsInfo[provider]}}};return await this.streamRequest(requestParams)},imageGenRequest:async params=>{logger$g.debug(`imageGenRequest ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params);return await this.imageGenRequest({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,agentId:preparedParams.agentId,teamId:preparedParams.teamId,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials}})},imageEditRequest:async params=>{logger$g.debug(`imageEditRequest ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params);return await this.imageEditRequest({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,agentId:preparedParams.agentId,teamId:preparedParams.teamId,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials}})}}}enhancePrompt(prompt,config2){if(!prompt)return prompt;let newPrompt=prompt;const outputs={};if(config2?.outputs)for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?` (${con?.description})`:"");const excludedKeys=["_debug","_error"],outputKeys=Object.keys(outputs).filter(key=>!excludedKeys.includes(key));if(outputKeys.length>0){const outputFormat={};outputKeys.forEach(key=>outputFormat[key]=(config2.name==="Classifier"?"<Boolean|String>":"<value>")+(outputs[key]||"")),newPrompt+=`
|
|
232
|
+
`),text}catch{return String(htmlText)}}class WhatsAppTrigger extends Trigger{async collectPayload(input,settings,agent){const body=agent.agentRequest?.body||{};agent.agentRequest.res.sendStatus(200);const message=extractFirstIncomingMessage(body);return message?[{message}]:[]}async requestHandler(input,settings,agent){const req=agent.agentRequest?.req||agent.agentRequest,res=agent.agentRequest?.res;if(!req||!res)return null;const method=(req?.method||"POST").toUpperCase(),query=req?.query||{};if(method==="GET"){const verificationResult=handleVerification(query,settings?.data);if(verificationResult)return verificationResult.valid?res.status(200).type("text/plain").send(verificationResult.challenge):res.status(403).send("Forbidden"),!0}return null}async register(componentId,componentSettings,payload){const verifyToken=componentSettings?.verifyToken||componentSettings?.verify_token,clientId=componentSettings?.clientId||componentSettings?.appId,clientSecret=componentSettings?.clientSecret||componentSettings?.appSecret,subscriptionFields=["messages","message_template_status_update"],inferredWebhookUrl=payload?.triggerUrl,webhookUrl=(componentSettings?.webhookUrl||inferredWebhookUrl||"").split("?")[0];if(!clientId||!clientSecret)throw new Error("WhatsAppTrigger.register: Missing clientId/clientSecret");if(!verifyToken)throw new Error("WhatsAppTrigger.register: Missing verifyToken");if(!webhookUrl)throw new Error("WhatsAppTrigger.register: Missing webhookUrl");const accessToken=await getAppAccessToken(clientId,clientSecret);(await listWebhookSubscriptions(clientId,accessToken)||[]).find(s=>s.object==="whatsapp_business_account"&&s.active)&&await deleteWebhookSubscription(clientId,accessToken),await createWebhookSubscription(clientId,accessToken,{callback_url:webhookUrl,verify_token:verifyToken,fields:subscriptionFields})}async unregister(componentId,agent,payload){const data=(await agent.components[componentId])?.data||{},clientId=data?.clientId||data?.appId,clientSecret=data?.clientSecret||data?.appSecret;if(!clientId||!clientSecret)throw new Error("WhatsAppTrigger.unregister: Missing clientId/clientSecret");const accessToken=await getAppAccessToken(clientId,clientSecret);await deleteWebhookSubscription(clientId,accessToken)}}function handleVerification(query,config2){if(!(query?.["hub.mode"]==="subscribe"||query?.["hub.mode"]==="SUBSCRIBE"))return null;const providedToken=query["hub.verify_token"]||query["hub.verifyToken"],expectedToken=config2?.verifyToken||config2?.verify_token,challenge=query["hub.challenge"];return{valid:expectedToken?String(providedToken)===String(expectedToken):!1,challenge,mode:query["hub.mode"]}}async function getAppAccessToken(clientId,clientSecret){const url="https://graph.facebook.com/v19.0/oauth/access_token",body=new URLSearchParams({client_id:clientId,client_secret:clientSecret,grant_type:"client_credentials"}).toString(),res=await fetch(url,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body}),json=await res.json();if(!res.ok)throw new Error(`getAppAccessToken failed: ${json?.error?.message||res.status}`);return json.access_token}async function listWebhookSubscriptions(clientId,accessToken){const url=`https://graph.facebook.com/v19.0/${clientId}/subscriptions`,res=await fetch(url,{method:"GET",headers:{Authorization:`Bearer ${accessToken}`}}),json=await res.json();if(!res.ok)throw new Error(`listWebhookSubscriptions failed: ${json?.error?.message||res.status}`);return json?.data||[]}async function deleteWebhookSubscription(clientId,accessToken){const url=`https://graph.facebook.com/v19.0/${clientId}/subscriptions`,body=new URLSearchParams({object:"whatsapp_business_account"}).toString(),res=await fetch(url,{method:"DELETE",headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/x-www-form-urlencoded"},body});if(!res.ok){const json=await res.json().catch(()=>({}));throw new Error(`deleteWebhookSubscription failed: ${json?.error?.message||res.status}`)}return!0}async function createWebhookSubscription(clientId,accessToken,params){const url=`https://graph.facebook.com/v19.0/${clientId}/subscriptions`,body=new URLSearchParams({object:"whatsapp_business_account",callback_url:params.callback_url,verify_token:params.verify_token,fields:JSON.stringify(params.fields),include_values:"true"}).toString(),res=await fetch(url,{method:"POST",headers:{Authorization:`Bearer ${accessToken}`,"Content-Type":"application/x-www-form-urlencoded"},body}),json=await res.json();if(!res.ok)throw new Error(`createWebhookSubscription failed: ${json?.error?.message||res.status}`);return json}function extractFirstIncomingMessage(body){try{const entries=Array.isArray(body?.entry)?body.entry:[];for(const entry of entries){const changes=Array.isArray(entry?.changes)?entry.changes:[];for(const change of changes){const value=change?.value||{},messages=Array.isArray(value?.messages)?value.messages:[];if(!messages.length)continue;const m=messages.find(x=>x?.text?.body)||messages[0]||{},contacts=Array.isArray(value?.contacts)?value.contacts:[],contact=contacts.length?contacts[0]:void 0,text=m?.text?.body||m?.button?.text||m?.interactive?.list_reply?.title||"",timestampIso=m?.timestamp?new Date(parseInt(m.timestamp,10)*1e3).toISOString():void 0;return{id:m?.id,from:m?.from||contact?.wa_id,profileName:contact?.profile?.name,text,type:m?.type,timestamp:timestampIso,phoneNumberId:value?.metadata?.phone_number_id}}}return null}catch{return null}}var __defProp$U=Object.defineProperty,__defNormalProp$U=(obj,key,value)=>key in obj?__defProp$U(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$U=(obj,key,value)=>__defNormalProp$U(obj,key+"",value);class Schedule{constructor(data){__publicField$U(this,"data",{}),data&&(this.data={...data})}static every(interval){const schedule=new Schedule;return schedule.data.interval=interval,schedule}static cron(cronExpression){const schedule=new Schedule;return schedule.data.cron=cronExpression,schedule}starts(date){return this.data.startDate=date.toISOString(),this}ends(date){return this.data.endDate=date.toISOString(),this}toJSON(){return{...this.data}}static fromJSON(json){return new Schedule(json)}getData(){return{...this.data}}validate(){if(!this.data.interval&&!this.data.cron)return{valid:!1,error:"Schedule must have either interval or cron expression"};if(this.data.interval&&this.data.cron)return{valid:!1,error:"Schedule cannot have both interval and cron expression"};if(this.data.interval&&!/^(\d+)(s|m|h|d|w)$/.test(this.data.interval))return{valid:!1,error:'Invalid interval format. Use format like "10m", "30s", "2h"'};if(this.data.startDate&&this.data.endDate){const start=new Date(this.data.startDate),end=new Date(this.data.endDate);if(start>=end)return{valid:!1,error:"Start date must be before end date"}}return{valid:!0}}static parseInterval(interval){const match=interval.match(/^(\d+)(s|m|h|d|w)$/);if(!match)throw new Error(`Invalid interval format: ${interval}`);const value=parseInt(match[1],10),unit=match[2],multipliers={s:1e3,m:60*1e3,h:60*60*1e3,d:24*60*60*1e3,w:7*24*60*60*1e3};return value*multipliers[unit]}shouldRun(now=new Date){return!(this.data.startDate&&now<new Date(this.data.startDate)||this.data.endDate&&now>new Date(this.data.endDate))}calculateNextRun(lastRun){const now=new Date;if(this.data.endDate&&now>new Date(this.data.endDate))return null;if(this.data.interval){const intervalMs=Schedule.parseInterval(this.data.interval),nextRun=lastRun?new Date(lastRun.getTime()+intervalMs):now;if(this.data.startDate){const startDate=new Date(this.data.startDate);return nextRun<startDate?startDate:nextRun}return nextRun}return null}}var __defProp$T=Object.defineProperty,__getOwnPropDesc$w=Object.getOwnPropertyDescriptor,__defNormalProp$T=(obj,key,value)=>key in obj?__defProp$T(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$w=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$w(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$T(target,key,result),result},__publicField$T=(obj,key,value)=>__defNormalProp$T(obj,key+"",value);const console$m=Logger("Scheduler/Job"),_Job=class _Job2{constructor(config2){if(__publicField$T(this,"config"),!config2.type||config2.type!=="skill"&&config2.type!=="prompt"&&config2.type!=="trigger")throw new Error('Job type must be either "skill", "prompt", or "trigger"');if(!config2.agentId)throw new Error("Job must have an agentId");if(config2.type==="skill"&&!config2.skillName)throw new Error("Skill job must have a skillName");if(config2.type==="prompt"&&!config2.prompt)throw new Error("Prompt job must have a prompt");if(config2.type==="trigger"&&!config2.triggerName)throw new Error("Trigger job must have a triggerName");this.config={...config2,metadata:{retryOnFailure:!1,maxRetries:0,tags:[],...config2.metadata}}}get agentId(){return this.config.agentId}getMetadata(){return{...this.config.metadata}}getConfig(){return{...this.config}}async execute(){const startTime=Date.now();try{let result;return this.config.metadata.timeout&&this.config.metadata.timeout>0?result=await this.executeWithTimeout(this.config.metadata.timeout):result=await this.executeInternal(),{success:!0,executionTime:Date.now()-startTime,result}}catch(error){const executionTime=Date.now()-startTime;return{success:!1,error:error instanceof Error?error:new Error(String(error)),executionTime}}}async executeInternal(){return this.config.type==="skill"?await this.executeSkill():this.config.type==="trigger"?await this.executeTrigger():await this.executePrompt()}async executeSkill(){const config2=this.config,agentDataConnector=ConnectorService.getAgentDataConnector(),agentData=await agentDataConnector.getEphemeralAgentData(config2.agentId)||await agentDataConnector.getAgentData(config2.agentId);if(!agentData)throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const components2=(agentData.data||agentData).components;if(!components2||!Array.isArray(components2))throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const skill=components2.find(c=>(c.data?.endpoint||c.endpoint)===config2.skillName);if(!skill)throw new Error(`Skill ${config2.skillName} not found in agent ${config2.agentId}`);const method=(skill.data?.method||skill.method||"POST").toUpperCase(),path2=`/api/${config2.skillName}`,headers={"Content-Type":"application/json"},args=config2.args||{},body=method==="POST"?args:void 0,query=method==="GET"?args:void 0,agent=AgentProcess.load(agentData);return await agent.ready(),(await agent.run({method,path:path2,body,query,headers})).data}async executeTrigger(){const config2=this.config,agentDataConnector=ConnectorService.getAgentDataConnector(),agentData=await agentDataConnector.getEphemeralAgentData(config2.agentId)||await agentDataConnector.getAgentData(config2.agentId);if(!agentData)throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const components2=(agentData.data||agentData).components;if(!components2||!Array.isArray(components2))throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);if(!components2.find(c=>(c.data?.triggerEndpoint||c.triggerEndpoint)===config2.triggerName))throw new Error(`Trigger ${config2.triggerName} not found in agent ${config2.agentId}`);const path2=`/trigger/${config2.triggerName}`,headers={"Content-Type":"application/json"},agent=AgentProcess.load(agentData);return await agent.ready(),(await agent.run({method:"POST",path:path2,body:{},query:{},headers})).data}async executePrompt(){const config2=this.config,agentDataConnector=ConnectorService.getAgentDataConnector(),agentData=await agentDataConnector.getEphemeralAgentData(config2.agentId)||await agentDataConnector.getAgentData(config2.agentId);if(!agentData)throw console$m.debug("Job execusion skiped, agent not found: ",config2.agentId),new Error(`Job execution skipped, agent not found: ${config2.agentId}`);const actualData=agentData.data||agentData,defaultModel=actualData.defaultModel,behavior=actualData.behavior||"";if(!defaultModel)throw new Error(`No model configured for agent ${config2.agentId}`);const conversation=new Conversation(defaultModel,agentData,{systemPrompt:behavior,agentId:config2.agentId});return await conversation.ready,await conversation.prompt(config2.prompt)}async executeWithRetry(retryCount=0){let lastError,totalExecutionTime=0,lastResult;const maxRetries=this.config.metadata.retryOnFailure&&this.config.metadata.maxRetries||0;for(let attempt=0;attempt<=maxRetries;attempt++){const result=await this.execute();if(totalExecutionTime+=result.executionTime,lastResult=result.result,result.success)return{success:!0,executionTime:totalExecutionTime,retries:attempt,result:lastResult};lastError=result.error,attempt<maxRetries&&await this.sleep(Math.min(1e3*Math.pow(2,attempt),3e4))}return{success:!1,error:lastError,executionTime:totalExecutionTime,retries:maxRetries}}async executeWithTimeout(timeoutMs){return new Promise((resolve,reject)=>{const timer=setTimeout(()=>{reject(new Error(`Job execution timed out after ${timeoutMs}ms`))},timeoutMs);this.executeInternal().then(result=>{clearTimeout(timer),resolve(result)}).catch(error=>{clearTimeout(timer),reject(error)})})}sleep(ms){return new Promise(resolve=>setTimeout(resolve,ms))}toJSON(){return{...this.config}}static fromJSON(config2){return new _Job2(config2)}};__decorateClass$w([hookAsync("Scheduler/Job.execute")],_Job.prototype,"execute");let Job=_Job;class JobSchedulerTrigger extends Trigger{async collectPayload(input,settings,agent){agent.agentRequest;let payload=JSONContent(settings?.data?.payload).tryParse();return typeof payload!="object"&&(payload={}),[{...payload}]}async register(componentId,componentSettings,payload){try{const agent=payload?.agentData,triggerName=componentSettings.triggerEndpoint,schedulerConnector=ConnectorService.getSchedulerConnector();if(!schedulerConnector)throw new Error("Scheduler connector not found");const schedulerRequester=schedulerConnector.agent(agent.id),jobId=`job-${agent.id}-${triggerName}`;await schedulerRequester.add(jobId,new Job({agentId:agent.id,type:"trigger",triggerName}),Schedule.every("10s"))}catch{throw new Error("Failed to schedule job")}}async unregister(componentId,agent,payload){}}const components={Component:new Component,Note:new Component,APIEndpoint:new APIEndpoint,APIOutput:new APIOutput,PromptGenerator:new PromptGenerator,LLMPrompt:new PromptGenerator,APICall:new APICall,VisionLLM:new VisionLLM,FSleep:new FSleep,FHash:new FHash,FEncDec:new FEncDec,FSign:new FSign,FTimestamp:new FTimestamp,DataSourceLookup:new DataSourceLookup,DataSourceIndexer:new DataSourceIndexer,DataSourceCleaner:new DataSourceCleaner,JSONFilter:new JSONFilter,LogicAND:new LogicAND,LogicOR:new LogicOR,LogicXOR:new LogicXOR,LogicAtLeast:new LogicAtLeast,LogicAtMost:new LogicAtMost,AgentPlugin:new AgentPlugin,LLMAssistant:new LLMAssistant,Async:new Async,Await:new Await,ForEach:new ForEach,HuggingFace:new HuggingFace,ZapierAction:new ZapierAction,GPTPlugin:new GPTPlugin,Classifier:new Classifier,MultimodalLLM:new MultimodalLLM,GenAILLM:new GenAILLM,FileStore:new FileStore,WebSearch:new TavilyWebSearch,WebScrape:new ScrapflyWebScrape,TavilyWebSearch:new TavilyWebSearch,ScrapflyWebScrape:new ScrapflyWebScrape,ComponentHost:new ComponentHost,ServerlessCode:new ServerlessCode,ImageGenerator:new ImageGenerator,MCPClient:new MCPClient,OpenAPI:new OpenAPI,ECMASandbox:new ECMASandbox$1,MemoryWriteKeyVal:new MemoryWriteKeyVal,MemoryReadKeyVal:new MemoryReadKeyVal,MemoryDeleteKeyVal:new MemoryDeleteKeyVal,MemoryWriteObject:new MemoryWriteObject,GmailTrigger:new GmailTrigger,WhatsAppTrigger:new WhatsAppTrigger,JobSchedulerTrigger:new JobSchedulerTrigger},ComponentInstances=components,console$l=Logger("S3Cache"),lifeCycleRuleNotExistsErrorCode="NoSuchLifecycleConfiguration";function generateLifecycleRules(){const rules=[];for(let i=1;i<100;i++)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});for(let i=100;i<1e3;i+=10)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});for(let i=1e3;i<=1e4;i+=100)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});return rules}function generateExpiryMetadata(expiryDays){let metadataValue;if(expiryDays>=1&&expiryDays<100)metadataValue=`ExpireAfter${expiryDays}Days`;else if(expiryDays>=100&&expiryDays<1e3)metadataValue=`ExpireAfter${Math.ceil(expiryDays/10)*10}Days`;else if(expiryDays>=1e3&&expiryDays<=1e4)metadataValue=`ExpireAfter${Math.ceil(expiryDays/100)*100}Days`;else throw new Error("Invalid expiry days. Please provide a valid expiry days value.");return{Key:"Expiry",Value:metadataValue}}function getNonExistingRules(existingRules,newRules){return newRules.filter(rule=>!existingRules.some(existingRule=>existingRule.ID===rule.ID))}function ttlToExpiryDays(ttl){return Math.ceil(ttl/(60*60*24))}async function checkAndInstallLifecycleRules(bucketName,s3Client){if(!bucketName||bucketName.trim()==="")throw new Error("Bucket name is required and cannot be empty");if(!s3Client)throw new Error("S3Client is required");console$l.log(`Checking lifecycle rules for bucket: ${bucketName}`);try{const getLifecycleCommand=new GetBucketLifecycleConfigurationCommand({Bucket:bucketName}),existingRules=(await s3Client.send(getLifecycleCommand)).Rules,newRules=generateLifecycleRules(),nonExistingNewRules=getNonExistingRules(existingRules,newRules);if(nonExistingNewRules.length>0){const params={Bucket:bucketName,LifecycleConfiguration:{Rules:[...existingRules,...nonExistingNewRules]}},putLifecycleCommand=new PutBucketLifecycleConfigurationCommand(params);await s3Client.send(putLifecycleCommand),console$l.log(`Added ${nonExistingNewRules.length} new lifecycle rules to bucket: ${bucketName}`)}else console$l.log("Lifecycle configuration already exists")}catch(error){if(error.code===lifeCycleRuleNotExistsErrorCode||error.name===lifeCycleRuleNotExistsErrorCode){console$l.log("No lifecycle configuration found. Creating new configuration...");const lifecycleRules=generateLifecycleRules(),params={Bucket:bucketName,LifecycleConfiguration:{Rules:lifecycleRules}},putLifecycleCommand=new PutBucketLifecycleConfigurationCommand(params);await s3Client.send(putLifecycleCommand),console$l.log("Lifecycle configuration created successfully.")}else console$l.error("Error checking lifecycle configuration:",error),console$l.error("Bucket name provided:",bucketName),console$l.error("Error details:",{name:error.name,message:error.message,code:error.code})}}var __defProp$S=Object.defineProperty,__getOwnPropDesc$v=Object.getOwnPropertyDescriptor,__defNormalProp$S=(obj,key,value)=>key in obj?__defProp$S(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$v=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$v(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$S(target,key,result),result},__publicField$S=(obj,key,value)=>__defNormalProp$S(obj,typeof key!="symbol"?key+"":key,value);Object.defineProperty(global,"crypto",{value:{getRandomValues:arr=>crypto$1.randomBytes(arr.length)}});const console$k=Logger("S3Storage");class S3Storage extends StorageConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$S(this,"name","S3Storage"),__publicField$S(this,"client"),__publicField$S(this,"bucket"),__publicField$S(this,"isInitialized",!1),__publicField$S(this,"initializationPromise",null),!_settings.bucket||_settings.bucket.trim()===""){console$k.warn("S3 bucket name is required and cannot be empty, connector not initialized");return}this.bucket=_settings.bucket;const clientConfig={};_settings.region&&(clientConfig.region=_settings.region),_settings.accessKeyId&&_settings.secretAccessKey&&(clientConfig.credentials={accessKeyId:_settings.accessKeyId,secretAccessKey:_settings.secretAccessKey}),this.client=new S3Client(clientConfig)}async ensureInitialized(){if(!this.isInitialized)return this.initializationPromise?this.initializationPromise:(this.initializationPromise=this.initialize(),this.initializationPromise)}async initialize(){if(!this.client){console$k.warn("S3 client not initialized");return}if(!this.isInitialized)try{await checkAndInstallLifecycleRules(this.bucket,this.client),this.isInitialized=!0}catch(error){throw console$k.error("Failed to initialize S3Storage:",error),this.initializationPromise=null,error}}async read(acRequest,resourceId){await this.ensureInitialized();const params={Bucket:this.bucket,Key:resourceId},s3HeadCommand=new HeadObjectCommand(params),expirationHeader=(await this.client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]);if(new Date>expirationDate){const s3DeleteCommand=new DeleteObjectCommand(params);await this.client.send(s3DeleteCommand);return}}}const command=new GetObjectCommand(params);try{const response=await this.client.send(command);return await streamToBuffer(response.Body)}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$k.error("Error reading object from S3",error.name,error.message),error}}async getMetadata(acRequest,resourceId){await this.ensureInitialized();try{return await this.getS3Metadata(resourceId)}catch(error){throw console$k.error("Error getting access rights in S3",error.name,error.message),error}}async setMetadata(acRequest,resourceId,metadata){await this.ensureInitialized();try{let s3Metadata=await this.getS3Metadata(resourceId);s3Metadata||(s3Metadata={}),s3Metadata={...s3Metadata,...metadata},await this.setS3Metadata(resourceId,s3Metadata)}catch(error){throw console$k.error("Error setting access rights in S3",error),error}}async write(acRequest,resourceId,value,acl,metadata){await this.ensureInitialized();const accessCandidate=acRequest.candidate;let amzACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,s3Metadata={...metadata,"x-amz-meta-acl":amzACL};const command=new PutObjectCommand({Bucket:this.bucket,Key:resourceId,Body:value,Metadata:this.serializeS3Metadata(s3Metadata),ContentType:s3Metadata.ContentType});try{const result=await this.client.send(command)}catch(error){throw console$k.error("Error writing object to S3",error.name,error.message),error}}async delete(acRequest,resourceId){await this.ensureInitialized();const command=new DeleteObjectCommand({Bucket:this.bucket,Key:resourceId});try{await this.client.send(command)}catch(error){throw console$k.error("Error deleting object from S3",error.name,error.message),error}}async exists(acRequest,resourceId){await this.ensureInitialized();const command=new HeadObjectCommand({Bucket:this.bucket,Key:resourceId});try{return await this.client.send(command),!0}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return!1;throw console$k.error("Error checking object existence in S3",error.name,error.message),error}}async getResourceACL(resourceId,candidate){await this.ensureInitialized();const s3Metadata=await this.getS3Metadata(resourceId);return s3Metadata!==void 0?ACL.from(s3Metadata?.["x-amz-meta-acl"]):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async getACL(acRequest,resourceId){await this.ensureInitialized();try{const s3Metadata=await this.getS3Metadata(resourceId);return ACL.from(s3Metadata?.["x-amz-meta-acl"])}catch(error){throw console$k.error("Error getting access rights in S3",error.name,error.message),error}}async setACL(acRequest,resourceId,acl){await this.ensureInitialized();try{let s3Metadata=await this.getS3Metadata(resourceId);s3Metadata||(s3Metadata={}),s3Metadata["x-amz-meta-acl"]=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setS3Metadata(resourceId,s3Metadata)}catch(error){throw console$k.error("Error setting access rights in S3",error),error}}async expire(acRequest,resourceId,ttl){await this.ensureInitialized();const expiryMetadata=generateExpiryMetadata(ttlToExpiryDays(ttl)),s3PutObjectTaggingCommand=new PutObjectTaggingCommand({Bucket:this.bucket,Key:resourceId,Tagging:{TagSet:[{Key:expiryMetadata.Key,Value:expiryMetadata.Value}]}});await this.client.send(s3PutObjectTaggingCommand)}migrateMetadata(metadata){if(!metadata.agentid&&!metadata.teamid&&!metadata.userid)return metadata;{const convertibleItems=["agentid","teamid","userid"],aclHelper=new ACL;for(let key of convertibleItems){if(!metadata[key])continue;const role=key==="agentid"?TAccessRole.Agent:key==="teamid"?TAccessRole.Team:TAccessRole.User;aclHelper.addAccess(role,metadata[key].toString(),[TAccessLevel.Owner,TAccessLevel.Read,TAccessLevel.Write]),delete metadata[key]}aclHelper.migrated=!0;const newMetadata={"x-amz-meta-acl":aclHelper.ACL};for(let key in metadata)newMetadata[key]=metadata[key];return newMetadata}}serializeS3Metadata(s3Metadata){let amzMetadata={};s3Metadata["x-amz-meta-acl"]&&(s3Metadata["x-amz-meta-acl"]&&(amzMetadata["x-amz-meta-acl"]=typeof s3Metadata["x-amz-meta-acl"]=="string"?s3Metadata["x-amz-meta-acl"]:ACL.from(s3Metadata["x-amz-meta-acl"]).serializedACL),delete s3Metadata["x-amz-meta-acl"]);for(let key in s3Metadata)key!="ContentType"&&(amzMetadata[key]=typeof s3Metadata[key]=="string"?s3Metadata[key]:JSON.stringify(s3Metadata[key]));return amzMetadata}deserializeS3Metadata(amzMetadata){let metadata={};for(let key in amzMetadata){if(key==="x-amz-meta-acl"){metadata[key]=ACL.from(amzMetadata[key]).ACL;continue}try{metadata[key]=JSON.parse(amzMetadata[key])}catch{metadata[key]=amzMetadata[key]}}return metadata=this.migrateMetadata(metadata),metadata}async getS3Metadata(resourceId){try{const command=new HeadObjectCommand({Bucket:this.bucket,Key:resourceId}),response=await this.client.send(command),s3RawMetadata=response.Metadata;if(!s3RawMetadata||Object.keys(s3RawMetadata).length===0)return{};let metadata=this.deserializeS3Metadata(s3RawMetadata);return metadata.ContentType||(metadata.ContentType=response.ContentType?response.ContentType:"application/octet-stream"),metadata}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$k.error("Error reading object metadata from S3",error.name,error.message),error}}async setS3Metadata(resourceId,metadata){try{const getObjectCommand=new GetObjectCommand({Bucket:this.bucket,Key:resourceId}),objectData=await this.client.send(getObjectCommand),bufferBody=await streamToBuffer(objectData.Body),amzMetadata=this.serializeS3Metadata(metadata),putObjectCommand=new PutObjectCommand({Bucket:this.bucket,Key:resourceId,Body:bufferBody,Metadata:amzMetadata});await this.client.send(putObjectCommand)}catch(error){throw console$k.error("Error setting object metadata in S3",error.name,error.message),error}}}__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"read"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"getMetadata"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"setMetadata"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"write"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"delete"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"exists"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"getACL"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"setACL"),__decorateClass$v([SecureConnector.AccessControl],S3Storage.prototype,"expire");var __defProp$R=Object.defineProperty,__getOwnPropDesc$u=Object.getOwnPropertyDescriptor,__defNormalProp$R=(obj,key,value)=>key in obj?__defProp$R(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$u=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$u(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$R(target,key,result),result},__publicField$R=(obj,key,value)=>__defNormalProp$R(obj,typeof key!="symbol"?key+"":key,value);const console$j=Logger("LocalStorage");class LocalStorage extends StorageConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$R(this,"name","LocalStorage"),__publicField$R(this,"folder"),__publicField$R(this,"storagePrefix","local"),__publicField$R(this,"metadataPrefix",".local.metadata"),__publicField$R(this,"isInitialized",!1),this.folder=this.findStorageFolder(_settings?.folder),this.initialize(),fs__default.existsSync(this.folder)||console$j.error(`Invalid folder provided: ${this.folder}`)}findStorageFolder(folder){let _storageFolder=folder;return fs__default.existsSync(_storageFolder)?_storageFolder:(_storageFolder=findSmythPath("storage"),fs__default.existsSync(_storageFolder)?(console$j.warn("Using alternative storage folder found in : ",_storageFolder),_storageFolder):(console$j.warn("!!! All attempts to find an existing storage folder failed !!!"),console$j.warn("!!! I will use this folder: ",_storageFolder),_storageFolder))}async read(acRequest,resourceId){this.isInitialized||await this.initialize();try{const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);return fs__default.existsSync(filePath)?fs__default.readFileSync(filePath,null):void 0}catch(error){throw console$j.error("Error reading object from local storage",error.name,error.message),error}}async getMetadata(acRequest,resourceId){try{const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId);if(!fs__default.existsSync(metadataFilePath))return;const data=fs__default.readFileSync(metadataFilePath,"utf-8");return this.deserializeMetadata(JSON.parse(data))}catch(error){throw console$j.error("Error reading metadata from LocalStorage",error.name,error.message),error}}async setMetadata(acRequest,resourceId,metadata){try{let fileMetadata=await this.getMetadata(acRequest,resourceId);fileMetadata||(fileMetadata={}),fileMetadata={...fileMetadata,...metadata};const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId,!0),serializedMetadata=this.serializeMetadata(fileMetadata);fs__default.writeFileSync(metadataFilePath,JSON.stringify(serializedMetadata))}catch(error){throw console$j.error("Error setting metadata in local storage",error.name,error.message),error}}async write(acRequest,resourceId,value,acl,metadata){this.isInitialized||await this.initialize();const accessCandidate=acRequest.candidate;let localACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,fileMetadata={...metadata,acl:localACL};const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId,!0);fs__default.writeFileSync(filePath,value),await this.setMetadata(acRequest,resourceId,fileMetadata)}async delete(acRequest,resourceId){try{const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);fs__default.existsSync(filePath)&&fs__default.unlinkSync(filePath);const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId);fs__default.existsSync(metadataFilePath)&&fs__default.unlinkSync(metadataFilePath)}catch(error){throw console$j.error("Error deleting object from local storage",error.name,error.message),error}}async exists(acRequest,resourceId){this.isInitialized||await this.initialize();const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);return!!fs__default.existsSync(filePath)}async getResourceACL(resourceId,candidate){this.isInitialized||await this.initialize();const metadataFilePath=this.getMetadataFilePath(candidate.id,resourceId);if(!fs__default.existsSync(metadataFilePath))return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);const metadata=fs__default.readFileSync(metadataFilePath,"utf-8");if(metadata===void 0)return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);try{let metadataObject=JSON.parse(metadata);return ACL.from(metadataObject?.acl)}catch(error){throw console$j.error("Error parsing metadata in local storage",error.name,error.message),error}}async getACL(acRequest,resourceId){try{const fileMetadata=await this.getMetadata(acRequest,resourceId);return ACL.from(fileMetadata?.acl)}catch(error){throw console$j.error("Error getting access rights in local storage",error.name,error.message),error}}async setACL(acRequest,resourceId,acl){try{let fileMetadata=await this.getMetadata(acRequest,resourceId);fileMetadata||(fileMetadata={}),fileMetadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,resourceId,fileMetadata)}catch(error){throw console$j.error("Error setting access rights in local storage",error),error}}async expire(acRequest,resourceId,ttl){console$j.warn(`LocalStorage.expire is not implemented, request will be ignored for resource ${resourceId} and ttl ${ttl}`)}async initialize(){const storageFolderPath=path.join(this.folder,this.storagePrefix);existsSync(storageFolderPath)||fs__default.mkdirSync(storageFolderPath,{recursive:!0});const metadataFolderPath=path.join(this.folder,this.metadataPrefix);existsSync(metadataFolderPath)||(fs__default.mkdirSync(metadataFolderPath,{recursive:!0}),fs__default.writeFileSync(path.join(metadataFolderPath,"README_IMPORTANT.txt"),"This folder is used for smythOS metadata, do not delete it, it will break SmythOS local filesystem")),this.isInitialized=!0}getStorageFilePath(candidateId,resourceId,createFoldersIfNotExists=!1){const fullPath=path.join(this.folder,this.storagePrefix,resourceId),folder=path.dirname(fullPath);return createFoldersIfNotExists&&!fs__default.existsSync(folder)&&fs__default.mkdirSync(folder,{recursive:!0}),fullPath}getMetadataFilePath(candidateId,resourceId,createFoldersIfNotExists=!1){const fullPath=path.join(this.folder,this.metadataPrefix,resourceId),folder=path.dirname(fullPath);return createFoldersIfNotExists&&!fs__default.existsSync(folder)&&fs__default.mkdirSync(folder,{recursive:!0}),fullPath}serializeMetadata(metadata){let updatedMetadata={};metadata.acl&&(metadata.acl&&(updatedMetadata.acl=typeof metadata.acl=="string"?metadata.acl:ACL.from(metadata.acl).serializedACL),delete metadata.acl);for(let key in metadata)updatedMetadata[key]=typeof metadata[key]=="string"?metadata[key]:JSON.stringify(metadata[key]);return updatedMetadata}deserializeMetadata(metadata){let deserializedMetadata={};for(let key in metadata){if(key==="acl"){deserializedMetadata[key]=ACL.from(metadata[key]).ACL;continue}try{deserializedMetadata[key]=JSON.parse(metadata[key])}catch{deserializedMetadata[key]=metadata[key]}}return deserializedMetadata}}__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"read"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"getMetadata"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"setMetadata"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"write"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"delete"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"exists"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"getACL"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"setACL"),__decorateClass$u([SecureConnector.AccessControl],LocalStorage.prototype,"expire");class StorageService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Storage,"S3",S3Storage),ConnectorService.register(TConnectorService.Storage,"LocalStorage",LocalStorage)}}var __defProp$Q=Object.defineProperty,__defNormalProp$Q=(obj,key,value)=>key in obj?__defProp$Q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Q=(obj,key,value)=>__defNormalProp$Q(obj,typeof key!="symbol"?key+"":key,value);const logger$g=Logger("LLMConnector");class LLMStream extends Readable{constructor(options){super(options),__publicField$Q(this,"dataQueue"),__publicField$Q(this,"isReading"),this.dataQueue=[],this.isReading=!0}_read(size){if(this.dataQueue.length>0)for(;this.dataQueue.length>0;){const chunk=this.dataQueue.shift();if(!this.push(chunk))break}else this.push(null)}enqueueData(data){this.dataQueue.push(data),this.read(0)}endStream(){this.isReading=!1,this.push(null)}}class LLMConnector extends Connector{constructor(){super(...arguments),__publicField$Q(this,"vaultConnector")}imageGenRequest({acRequest,body,context:context2}){return Promise.reject(new Error("Image edit not supported by this model"))}imageEditRequest({acRequest,body,context:context2}){return Promise.reject(new Error("Image edit not supported by this model"))}requester(candidate){return this.vaultConnector=ConnectorService.getVaultConnector(),(!this.vaultConnector||!this.vaultConnector.valid)&&logger$g.warn(`Vault Connector unavailable for ${candidate.id} `),{request:async params=>{logger$g.debug(`request ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params),provider=preparedParams.modelInfo.provider;return await this.request({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,agentId:preparedParams.agentId,teamId:preparedParams.teamId,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials,toolsInfo:{[provider]:preparedParams.toolsInfo[provider]}}})},streamRequest:async params=>{logger$g.debug(`streamRequest ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params),provider=preparedParams.modelInfo.provider?.toLowerCase(),requestParams={acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,agentId:preparedParams.agentId,teamId:preparedParams.teamId,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials,toolsInfo:{[provider]:preparedParams.toolsInfo[provider]}}};return await this.streamRequest(requestParams)},imageGenRequest:async params=>{logger$g.debug(`imageGenRequest ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params);return await this.imageGenRequest({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,agentId:preparedParams.agentId,teamId:preparedParams.teamId,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials}})},imageEditRequest:async params=>{logger$g.debug(`imageEditRequest ${this.name}`,candidate);const preparedParams=await this.prepareParams(candidate,params);return await this.imageEditRequest({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,agentId:preparedParams.agentId,teamId:preparedParams.teamId,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials}})}}}enhancePrompt(prompt,config2){if(!prompt)return prompt;let newPrompt=prompt;const outputs={};if(config2?.outputs)for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?` (${con?.description})`:"");const excludedKeys=["_debug","_error"],outputKeys=Object.keys(outputs).filter(key=>!excludedKeys.includes(key));if(outputKeys.length>0){const outputFormat={};outputKeys.forEach(key=>outputFormat[key]=(config2.name==="Classifier"?"<Boolean|String>":"<value>")+(outputs[key]||"")),newPrompt+=`
|
|
193
233
|
##
|
|
194
234
|
Expected output format = `+JSON.stringify(outputFormat)+`
|
|
195
|
-
The output JSON should only use the entries from the output format.`}return newPrompt}postProcess(response){try{return JSONContent(response).tryParse()}catch{return{error:"Invalid JSON response",data:response,details:"The response from the model is not a valid JSON object. Please check the model output and try again."}}}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){throw new Error("This model does not support tools")}transformToolMessageBlocks({messageBlock,toolsData}){throw new Error("This model does not support tools")}getConsistentMessages(messages){return messages}async prepareParams(candidate,params){const modelsProvider=ConnectorService.getModelsProviderConnector(),files=params?.files;delete params?.files;const clonedParams=JSON.parse(JSON.stringify(params)),_params=this.formatParamValues(clonedParams),model=_params.model,teamId=await this.getTeamId(candidate);_params.modelEntryName=typeof model=="string"?model:model.modelId,_params.teamId=teamId;const modelProviderCandidate=modelsProvider.requester(candidate),modelInfo=await modelProviderCandidate.getModelInfo(model);if(modelInfo.params)for(let key in modelInfo.params)typeof _params[key]>"u"&&(_params[key]=modelInfo.params[key]);_params.credentials=await getLLMCredentials(candidate,modelInfo),_params.baseURL=modelInfo?.baseURL,_params.modelInfo=modelInfo,_params.maxTokens?_params.maxTokens=await modelProviderCandidate.adjustMaxCompletionTokens(model,_params.maxTokens,_params?.isUserKey):_params.maxTokens=await modelProviderCandidate.getMaxCompletionTokens(model,_params?.isUserKey),_params.model=await modelProviderCandidate.getModelId(model),_params.files=files;const features=modelInfo?.features||[];_params.capabilities={search:features.includes("search"),reasoning:features.includes("reasoning"),imageGeneration:features.includes("image-generation")},_params.toolsInfo={openai:await this.prepareOpenAIToolsInfo(_params),xai:await this.prepareXAIToolsInfo(_params)},_params.agentId=candidate.id;const body=await this.reqBodyAdapter(_params);return{..._params,body}}async prepareOpenAIToolsInfo(params){const openAIToolsInfo={webSearch:{enabled:params?.useWebSearch&¶ms.capabilities.search===!0,contextSize:params?.webSearchContextSize||"medium"}};return params?.webSearchCity&&(openAIToolsInfo.webSearch.city=params?.webSearchCity),params?.webSearchCountry&&(openAIToolsInfo.webSearch.country=params?.webSearchCountry),params?.webSearchRegion&&(openAIToolsInfo.webSearch.region=params?.webSearchRegion),params?.webSearchTimezone&&(openAIToolsInfo.webSearch.timezone=params?.webSearchTimezone),openAIToolsInfo}async prepareXAIToolsInfo(params){const xaiToolsInfo={search:{enabled:params?.useSearch===!0&¶ms.capabilities.search===!0}};return params?.searchMode&&(xaiToolsInfo.search.mode=params?.searchMode),params?.returnCitations&&(xaiToolsInfo.search.returnCitations=params?.returnCitations),params?.maxSearchResults&&(xaiToolsInfo.search.maxResults=params?.maxSearchResults),params?.searchDataSources&&(xaiToolsInfo.search.dataSources=params?.searchDataSources),params?.searchCountry&&(xaiToolsInfo.search.country=params?.searchCountry),params?.excludedWebsites&&(xaiToolsInfo.search.excludedWebsites=params?.excludedWebsites),params?.allowedWebsites&&(xaiToolsInfo.search.allowedWebsites=params?.allowedWebsites),params?.includedXHandles&&(xaiToolsInfo.search.includedXHandles=params?.includedXHandles),params?.excludedXHandles&&(xaiToolsInfo.search.excludedXHandles=params?.excludedXHandles),params?.postFavoriteCount&&(xaiToolsInfo.search.postFavoriteCount=params?.postFavoriteCount),params?.postViewCount&&(xaiToolsInfo.search.postViewCount=params?.postViewCount),params?.rssLinks&&(xaiToolsInfo.search.rssLinks=params?.rssLinks),params?.safeSearch&&(xaiToolsInfo.search.safeSearch=params?.safeSearch),params?.fromDate&&(xaiToolsInfo.search.fromDate=params?.fromDate),params?.toDate&&(xaiToolsInfo.search.toDate=params?.toDate),xaiToolsInfo}formatParamValues(params){let _params={};for(const[key,value]of Object.entries(params)){let _value=value;["stopSequences","excludedWebsites","allowedWebsites","includedXHandles","excludedXHandles","rssLinks"].includes(key)&&(_value&&typeof _value=="string"?_value=_value.split(/[,\n]/).map(item=>item.trim()).filter(item=>item.length>0):Array.isArray(_value)?_value=_value:_value=_value?[_value]:null),typeof _value=="string"&&_value.trim()!==""&&!isNaN(Number(_value))&&(_value=+_value),key==="messages"&&(_value=this.getConsistentMessages(_value)),_params[key]=_value}return _params}async getTeamId(candidate){const accountConnector=ConnectorService.getAccountConnector();if(!accountConnector)throw new Error("Account Connector unavailable, cannot proceed");return await accountConnector.getCandidateTeam(candidate)}}var __defProp$S=Object.defineProperty,__getOwnPropDesc$t=Object.getOwnPropertyDescriptor,__defNormalProp$S=(obj,key,value)=>key in obj?__defProp$S(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$t=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$t(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$S(target,key,result),result},__publicField$S=(obj,key,value)=>__defNormalProp$S(obj,key+"",value);const logger$f=Logger("EchoConnector");class EchoConnector extends LLMConnector{constructor(){super(...arguments),__publicField$S(this,"name","LLM:Echo")}async request({acRequest,body,context:context2}){try{logger$f.debug(`request ${this.name}`,acRequest.candidate);const content=body?.messages?.[0]?.content;return{content,finishReason:"stop",useTool:!1,toolsData:[],message:{content,role:"assistant"},usage:{}}}catch(error){throw logger$f.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$f.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1;let content="";return Array.isArray(body?.messages)&&(content=body?.messages?.filter(m=>m.role==="user").pop()?.content),(async()=>{const chunks=content.split(" ");for(let i=0;i<chunks.length;i++){await delay(3);const isLastChunk=i===chunks.length-1,delta={content:chunks[i]+(isLastChunk?"":" ")};emitter.emit("data",delta),emitter.emit("content",delta.content)}setTimeout(()=>{emitter.emit("end",[],[])},100)})(),emitter}catch(error){throw logger$f.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){return params}enhancePrompt(prompt,config2){return prompt}postProcess(response){try{const result=JSONContent(response).tryFullParse();return result?.error?response:result}catch{return response}}reportUsage(usage,metadata){}}__decorateClass$t([hookAsync("LLMConnector.request")],EchoConnector.prototype,"request"),__decorateClass$t([hookAsync("LLMConnector.streamRequest")],EchoConnector.prototype,"streamRequest");class LLMHelper{static hasSystemMessage(messages){return Array.isArray(messages)?messages?.some(message=>message.role==="system"):!1}static separateSystemMessages(messages){const systemMessage=messages.find(message=>message.role==="system")||{},otherMessages=messages.filter(message=>message.role!=="system");return{systemMessage,otherMessages}}static async countVisionPromptTokens(prompt){let tokens=0;const textObj=prompt?.filter(item=>["text","input_text"].includes(item.type)),textTokens=encode(textObj?.[0]?.text).length,images=prompt?.filter(item=>["image_url","input_image"].includes(item.type));let imageTokens=0;for(const image of images){const imageUrl=image?.image_url?.url||image?.image_url,{width,height}=await this.getImageDimensions(imageUrl),tokens2=this.countImageTokens(width,height);imageTokens+=tokens2}return tokens=textTokens+imageTokens,tokens}static async getImageDimensions(imageUrl){try{let buffer;if(isBase64FileUrl(imageUrl)){const base64Data=imageUrl.replace(/^data:image\/\w+;base64,/,"");buffer=Buffer.from(base64Data,"base64")}else if(isUrl(imageUrl)){const response=await axios.get(imageUrl,{responseType:"arraybuffer"});buffer=Buffer.from(response.data)}else throw new Error("Please provide a valid image url!");const dimensions=imageSize(buffer);return{width:dimensions?.width||0,height:dimensions?.height||0}}catch(error){throw console.error("Error getting image dimensions",error),new Error("Please provide a valid image url!")}}static countImageTokens(width,height,detailMode="auto"){if(detailMode==="low")return 85;if(width>2048||height>2048){const aspectRatio=width/height;aspectRatio>1?(width=2048,height=Math.floor(2048/aspectRatio)):(height=2048,width=Math.floor(2048*aspectRatio))}if(width>768&&height>768){const aspectRatio=width/height;aspectRatio>1?(height=768,width=Math.floor(768*aspectRatio)):(width=768,height=Math.floor(768/aspectRatio))}const tilesWidth=Math.ceil(width/512),tilesHeight=Math.ceil(height/512);return 85+170*(tilesWidth*tilesHeight)}static removeDuplicateUserMessages(messages){const _messages=JSON.parse(JSON.stringify(messages));return _messages.length>1&&_messages[0].role===TLLMMessageRole.User&&_messages[1].role===TLLMMessageRole.User&&_messages.shift(),_messages.length>1&&_messages[_messages.length-1].role===TLLMMessageRole.User&&_messages[_messages.length-2].role===TLLMMessageRole.User&&_messages.pop(),_messages}}var __defProp$R=Object.defineProperty,__defNormalProp$R=(obj,key,value)=>key in obj?__defProp$R(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$R=(obj,key,value)=>__defNormalProp$R(obj,key+"",value);class OpenAIApiInterface{constructor(context2){__publicField$R(this,"context"),this.context=context2}}var TToolType=(TToolType2=>(TToolType2.WebSearch="web_search_preview",TToolType2))(TToolType||{});const O3_AND_O4_MODELS=["o3","o3-pro","o4-mini"],O3_AND_O4_MODELS_PATTERN=/o3|o4/i,MODELS_WITHOUT_JSON_RESPONSE_SUPPORT=["o1-preview"],MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT=["o1-mini","o1-preview"],SEARCH_TOOL_COSTS={"gpt-4":.025,"gpt-5":.01};function isValidOpenAIReasoningEffort(value){return["minimal","low","medium","high"].includes(value)}var __defProp$Q=Object.defineProperty,__defNormalProp$Q=(obj,key,value)=>key in obj?__defProp$Q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Q=(obj,key,value)=>__defNormalProp$Q(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE$1=20*1024*1024,MAX_DOCUMENT_SIZE$1=25*1024*1024,EVENT_TYPES={WEB_SEARCH_IN_PROGRESS:"response.web_search_call.in_progress",WEB_SEARCH_SEARCHING:"response.web_search_call.searching",WEB_SEARCH_COMPLETED:"response.web_search_call.completed",WEB_SEARCH_STARTED:"response.web_search_call.started",RESPONSE_COMPLETED:"response.completed",OUTPUT_TEXT_DELTA:"response.output_text.delta",OUTPUT_ITEM_ADDED:"response.output_item.added",FUNCTION_CALL_ARGUMENTS_DELTA:"response.function_call_arguments.delta",FUNCTION_CALL_ARGUMENTS_DONE:"response.function_call_arguments.done",OUTPUT_ITEM_DONE:"response.output_item.done",INCOMPLETE:"response.incomplete"};class ResponsesApiInterface extends OpenAIApiInterface{constructor(context2,deps){super(context2),__publicField$Q(this,"deps"),__publicField$Q(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$Q(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context2){return await(await this.deps.getClient(context2)).responses.create({...body,stream:!1})}async createStream(body,context2){return await(await this.deps.getClient(context2)).responses.create({...body,stream:!0})}handleStream(stream,context2){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context2);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit("error",error)}})(),emitter}async processStream(stream,emitter){let toolsData=[],finishReason="stop";const usageData=[];for await(const part of stream)try{if("type"in part)switch(part.type){case EVENT_TYPES.WEB_SEARCH_IN_PROGRESS:toolsData=this.handleWebSearchInProgress(part,toolsData);break;case EVENT_TYPES.WEB_SEARCH_SEARCHING:toolsData=this.handleWebSearchSearching(part,toolsData);break;case EVENT_TYPES.WEB_SEARCH_COMPLETED:toolsData=this.handleWebSearchCompleted(part,toolsData);break;case EVENT_TYPES.OUTPUT_TEXT_DELTA:this.handleOutputTextDelta(part,emitter);break;case EVENT_TYPES.OUTPUT_ITEM_ADDED:toolsData=this.handleOutputItemAdded(part,toolsData,emitter);break;case EVENT_TYPES.FUNCTION_CALL_ARGUMENTS_DELTA:toolsData=this.handleFunctionCallArgumentsDelta(part,toolsData,emitter);break;case EVENT_TYPES.FUNCTION_CALL_ARGUMENTS_DONE:toolsData=this.handleFunctionCallArgumentsDone(part,toolsData,emitter);break;case EVENT_TYPES.OUTPUT_ITEM_DONE:toolsData=this.handleOutputItemDone(part,toolsData);break;case EVENT_TYPES.RESPONSE_COMPLETED:{finishReason="stop";const responseData2=part?.response;responseData2?.usage&&usageData.push(responseData2.usage);break}case EVENT_TYPES.INCOMPLETE:finishReason="incomplete";const responseData=part?.response;responseData?.usage&&usageData.push(responseData.usage);break;default:{const eventType=String(part.type);if(eventType===EVENT_TYPES.WEB_SEARCH_STARTED){const legacyId=part?.id;typeof legacyId=="string"&&(toolsData=this.upsertWebSearchToolImmutable(toolsData,legacyId).toolsData);break}finishReason=this.handleCompletionEvent(eventType);break}}}catch(error){console.warn("Error processing stream event:",error,"Event:",part)}return{toolsData:this.extractToolCalls(toolsData),finishReason,usageData}}extractToolCalls(output){return output.map(tool=>({index:tool.index,name:tool.name,arguments:tool.arguments,id:tool.callId||tool.id,type:tool.type,role:tool.role,callId:tool.callId}))}reportUsageStatistics(usage_data,context2){const reportedUsage=[];if(usage_data.forEach(usage=>{const convertedUsage={completion_tokens:usage.completion_tokens||0,prompt_tokens:usage.prompt_tokens||0,total_tokens:usage.total_tokens||0,...usage},reported=this.deps.reportUsage(convertedUsage,this.buildUsageContext(context2));reportedUsage.push(reported)}),context2.toolsInfo?.openai?.webSearch?.enabled){const searchUsage=this.calculateSearchToolUsage(context2),reported=this.deps.reportUsage(searchUsage,this.buildUsageContext(context2));reportedUsage.push(reported)}return reportedUsage}emitFinalEvents(emitter,toolsData,reportedUsage,finishReason){toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setImmediate(()=>{emitter.emit(TLLMEvent.End,toolsData,reportedUsage,finishReason)})}buildUsageContext(context2){return{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}}calculateSearchToolUsage(context2){const modelName=context2.modelEntryName?.replace("smythos/","");return{cost:this.getSearchToolCost(modelName),completion_tokens:0,prompt_tokens:0,total_tokens:0}}handleWebSearchCompleted(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search completed event:",error),toolsData}}handleWebSearchInProgress(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search in_progress event:",error),toolsData}}handleWebSearchSearching(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search searching event:",error),toolsData}}handleOutputTextDelta(part,emitter){try{if("delta"in part&&part.delta){const deltaMsg={role:"assistant",content:part.delta};emitter.emit("data",deltaMsg),emitter.emit("content",part.delta,"assistant")}}catch(error){console.warn("Error handling output text delta:",error)}}handleOutputItemAdded(part,toolsData,emitter){try{const partAny=part;if(partAny.item&&partAny.item.type==="function_call"){const item=partAny.item,callId=item.call_id,functionName=item.name,itemId=item.id;if(callId&&itemId){const existingIndex=toolsData.findIndex(t=>t.id===itemId||t.id===callId),addingNew=existingIndex===-1,nextIndex=addingNew?toolsData.length:existingIndex;let updated;if(addingNew){const newItem={index:nextIndex,id:itemId,callId,type:"function",name:functionName||"",arguments:item.arguments||"",role:"tool"};updated=[...toolsData,newItem]}else updated=toolsData.map((t,idx)=>idx!==existingIndex?t:{...t,name:functionName||t.name,arguments:item.arguments!==void 0?item.arguments:t.arguments,callId:t.callId||callId});return addingNew&&emitter.emit("tool_call_started",{id:callId,name:functionName||"",type:"function"}),updated}}return toolsData}catch(error){return console.warn("Error handling output item added:",error),toolsData}}handleFunctionCallArgumentsDelta(part,toolsData,emitter){try{if("delta"in part&&"item_id"in part&&typeof part.delta=="string"&&typeof part.item_id=="string"){const delta=part.delta,itemId=part.item_id,existingIndex=toolsData.findIndex(t=>t.id===itemId);let updated,finalIndex;if(existingIndex===-1){finalIndex=toolsData.length;const newItem={index:finalIndex,id:itemId,type:"function",name:"",arguments:delta,role:"tool"};updated=[...toolsData,newItem]}else finalIndex=existingIndex,updated=toolsData.map((t,idx)=>idx===existingIndex?{...t,arguments:String(t.arguments||"")+delta}:t);const entry=updated[finalIndex];return emitter.emit("tool_call_progress",{id:entry.callId||itemId,name:entry.name,arguments:entry.arguments,delta}),updated}return toolsData}catch(error){return console.warn("Error handling function call arguments delta:",error),toolsData}}handleFunctionCallArgumentsDone(part,toolsData,emitter){try{const partAny=part;if(partAny.item_id&&partAny.arguments){const itemId=partAny.item_id,finalArguments=partAny.arguments,toolIndex=toolsData.findIndex(t=>t.id===itemId);if(toolIndex!==-1){const updated=toolsData.map((t,idx)=>idx===toolIndex?{...t,arguments:finalArguments}:t),updatedEntry=updated[toolIndex];return emitter.emit("tool_call_completed",{id:updatedEntry.callId||itemId,name:updatedEntry.name,arguments:finalArguments}),updated}}return toolsData}catch(error){return console.warn("Error handling function call arguments done:",error),toolsData}}handleOutputItemDone(part,toolsData){try{const partAny=part;if(partAny.item&&partAny.item.type==="function_call"&&partAny.item.status==="completed"){const item=partAny.item,callId=item.call_id,itemId=item.id,toolIndex=toolsData.findIndex(t=>t.id===itemId||t.id===callId);if(toolIndex!==-1&&item.arguments)return toolsData.map((t,idx)=>idx===toolIndex?{...t,arguments:item.arguments,callId:t.callId||callId}:t)}return toolsData}catch(error){return console.warn("Error handling output item done:",error),toolsData}}handleCompletionEvent(eventType){return eventType===EVENT_TYPES.RESPONSE_COMPLETED||eventType.includes("done"),"stop"}async prepareRequestBody(params){let input=await this.prepareInputMessages(params);input=this.applyToolMessageTransformation(input);const body={model:params.model,input};params?.maxTokens!==void 0&&(body.max_output_tokens=params.maxTokens);const isGPT5ReasoningModels=params.modelEntryName?.includes("gpt-5")&¶ms?.capabilities?.reasoning;isGPT5ReasoningModels&¶ms?.verbosity&&(body.text={verbosity:params.verbosity}),isGPT5ReasoningModels&&isValidOpenAIReasoningEffort(params.reasoningEffort)&&(body.reasoning={effort:params.reasoningEffort});let tools=[];if(params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(tools=await this.prepareFunctionTools(params)),params.toolsInfo?.openai?.webSearch?.enabled){const searchTool=this.prepareWebSearchTool(params);tools.push(searchTool)}if(tools.length>0)if(body.tools=tools,params?.toolsConfig?.tool_choice){const toolChoice=params.toolsConfig.tool_choice;this.validateToolChoice(toolChoice,tools)?typeof toolChoice=="string"?body.tool_choice=toolChoice:typeof toolChoice=="object"&&toolChoice!==null&&("type"in toolChoice&&toolChoice.type==="function"&&"function"in toolChoice&&"name"in toolChoice.function?body.tool_choice={type:"function",name:toolChoice.function.name}:body.tool_choice=toolChoice):body.tool_choice="auto"}else body.tool_choice="auto";return body}transformToolsConfig(config2){return!config2?.toolDefinitions||!Array.isArray(config2.toolDefinitions)?[]:config2.toolDefinitions.map((tool,index)=>{if(!tool||typeof tool!="object")return{type:"function",name:void 0,description:void 0,parameters:{type:"object",properties:void 0,required:void 0},strict:!1};if("function"in tool&&tool.function&&typeof tool.function=="object"&&tool.function!==null){const funcTool=tool.function;return!funcTool.name||typeof funcTool.name!="string"?{type:"function",name:void 0,description:tool.description||"",parameters:{type:"object",properties:void 0,required:void 0},strict:!1}:{type:"function",name:funcTool.name,description:funcTool.description||tool.description||"",parameters:funcTool.parameters||{type:"object",properties:{},required:[]},strict:!1}}if("parameters"in tool)return{type:"function",name:tool.name,description:tool.description||"",parameters:tool.parameters||{type:"object",properties:{},required:[]},strict:!1};const legacyTool=tool;return{type:"function",name:tool.name,description:tool.description||legacyTool.desc,parameters:{type:"object",properties:legacyTool.properties,required:legacyTool.requiredFields||legacyTool.required},strict:!1}}).filter(Boolean)}normalizeToolArguments(args){if(typeof args=="string")try{return JSON.parse(args),args}catch{return JSON.stringify(args)}if(typeof args=="object"&&args!==null)try{return JSON.stringify(args)}catch{return"{}"}return args==null?"{}":JSON.stringify(args)}isValidToolData(toolData){return!!(toolData&&toolData.id&&toolData.name&&(toolData.result!==void 0||toolData.error!==void 0))}async handleFileAttachments(files,agentId,messages){if(files.length===0)return messages;const uploadedFiles=await this.uploadFiles(files,agentId),validImageFiles=this.getValidImageFiles(uploadedFiles),validDocumentFiles=this.getValidDocumentFiles(uploadedFiles),imageData=await this.processImageData(validImageFiles,agentId),documentData=await this.processDocumentData(validDocumentFiles,agentId);for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="user"){typeof messages[i].content=="string"?messages[i].content=[{type:"input_text",text:messages[i].content}]:Array.isArray(messages[i].content)||(messages[i].content=[]),messages[i].content.push(...imageData,...documentData);break}return messages.some(item=>item.role==="user")||messages.push({role:"user",content:[...imageData,...documentData]}),messages}getValidImageFiles(files){return files.filter(file=>this.validImageMimeTypes.includes(file?.mimetype))}getValidDocumentFiles(files){return files.filter(file=>this.validDocumentMimeTypes.includes(file?.mimetype))}async uploadFiles(files,agentId){const promises=files.map(file=>{const binaryInput=BinaryInput.from(file);return binaryInput.upload(AccessCandidate.agent(agentId)).then(()=>binaryInput)});return Promise.all(promises)}async uploadFile({file,agentId,purpose="user_data"}){try{if(!file?.mimetype)throw new Error("Missing required parameters to upload file to OpenAI!");const tempDir=os.tmpdir(),fileName=await file.getName(),tempFilePath=path.join(tempDir,`${uid()}_${fileName}`),bufferData=await file.readData(AccessCandidate.agent(agentId));await fs__default.promises.writeFile(tempFilePath,new Uint8Array(bufferData));const fileId=(await(await this.deps.getClient(this.context)).files.create({file:fs__default.createReadStream(tempFilePath),purpose})).id;if(!fileId)throw new Error("File upload did not return a file ID.");return await fs__default.promises.unlink(tempFilePath).catch(()=>{}),{fileId,filename:fileName}}catch(error){throw new Error(`Error uploading file to OpenAI: ${error.message}`)}}async processImageData(files,agentId){if(files.length===0)return[];const imageData=[];for(const file of files){await this.validateFileSize(file,MAX_IMAGE_SIZE$1,"Image");try{const{fileId}=await this.uploadFile({file,agentId,purpose:"vision"});imageData.push({type:"input_image",file_id:fileId})}catch(error){console.warn("Failed to upload image via Files API, falling back to base64:",error);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),url=`data:${file.mimetype};base64,${base64Data}`;imageData.push({type:"input_image",image_url:url})}}return imageData}async processDocumentData(files,agentId){if(files.length===0)return[];const documentData=[];for(const file of files){await this.validateFileSize(file,MAX_DOCUMENT_SIZE$1,"Document");try{const{fileId,filename}=await this.uploadFile({file,agentId,purpose:"user_data"});documentData.push({type:"input_file",file_id:fileId})}catch(error){console.warn("Failed to upload document via Files API, falling back to base64:",error);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),filename=await file.getName();documentData.push({type:"input_file",filename,file_data:`data:${file.mimetype};base64,${base64Data}`})}}return documentData}async validateFileSize(file,maxSize,fileType){await file.ready();const fileInfo=await file.getJsonData(AccessCandidate.agent("temp"));if(fileInfo.size>maxSize)throw new Error(`${fileType} file size (${fileInfo.size} bytes) exceeds maximum allowed size of ${maxSize} bytes`)}getInterfaceName(){return"responses"}validateParameters(params){return!!params.model}async prepareInputMessages(params){const messages=params?.messages||[],files=params?.files||[];let input=[...messages];return files.length>0&&(input=await this.handleFileAttachments(files,params.agentId,input)),input}async prepareFunctionTools(params){const tools=[];if(params?.toolsConfig?.tools&&Array.isArray(params.toolsConfig.tools)&¶ms.toolsConfig.tools.length>0)try{const validTools=this.transformToolsConfig({type:"function",toolDefinitions:params.toolsConfig.tools,toolChoice:params.toolsConfig.tool_choice||"auto",modelInfo:params.modelInfo||null}).filter((tool,index)=>!(tool.type!=="function"||!tool.name));tools.push(...validTools)}catch{}return tools}prepareWebSearchTool(params){const webSearch=params?.toolsInfo?.openai?.webSearch,contextSize=webSearch?.contextSize,searchCity=webSearch?.city,searchCountry=webSearch?.country,searchRegion=webSearch?.region,searchTimezone=webSearch?.timezone,userLocation={type:"approximate"};searchCity&&(userLocation.city=searchCity),searchCountry&&(userLocation.country=searchCountry),searchRegion&&(userLocation.region=searchRegion),searchTimezone&&(userLocation.timezone=searchTimezone);const hasLocationData=searchCity||searchCountry||searchRegion||searchTimezone,searchTool={type:"web_search_preview"},webSearchConfig={};return contextSize&&(webSearchConfig.search_context_size=contextSize),hasLocationData&&(webSearchConfig.user_location=userLocation),{...searchTool,...webSearchConfig}}applyToolMessageTransformation(input){const transformedMessages=[];for(let i=0;i<input.length;i++){const message=input[i];try{if(message.role==="assistant"&&message.tool_calls&&Array.isArray(message.tool_calls)){if(message.content!==void 0&&message.content!==null){const contentStr=typeof message.content=="string"?message.content:JSON.stringify(message.content);contentStr.trim().length>0&&transformedMessages.push({role:"assistant",content:contentStr})}message.tool_calls.forEach((toolCall,index)=>{if(!toolCall||!toolCall.function)return;const functionArgs=toolCall.function.arguments,normalizedArgs=functionArgs==null?void 0:typeof functionArgs=="object"?JSON.stringify(functionArgs):String(functionArgs);transformedMessages.push({type:"function_call",name:toolCall.function.name||"",arguments:normalizedArgs,call_id:toolCall.id||toolCall.call_id||`call_${Date.now()}_${index}`})})}else if(message.role==="tool"){if(!message.tool_call_id)return;const outputContent=message.content,normalizedOutput=typeof outputContent=="string"?outputContent:JSON.stringify(outputContent||"null");transformedMessages.push({type:"function_call_output",call_id:message.tool_call_id,output:normalizedOutput})}else transformedMessages.push(message)}catch{transformedMessages.push(message)}}return transformedMessages.filter((msg,index)=>!(!msg||typeof msg!="object"))}getSearchToolCost(modelName){if(!modelName)return 0;const normalized=String(modelName).toLowerCase().replace(/^smythos\//,""),match=Object.entries(SEARCH_TOOL_COSTS).find(([family])=>normalized.startsWith(family));return match?match[1]:0}async processFunctionCallResults(toolsData){const processedTools=[];for(const tool of toolsData)if(this.isValidToolData(tool))try{const processedTool={...tool,arguments:this.normalizeToolArguments(tool.arguments),function:tool.function||{name:tool.name,arguments:this.normalizeToolArguments(tool.arguments)}};processedTools.push(processedTool)}catch(error){processedTools.push({...tool,error:error instanceof Error?error.message:"Unknown processing error",result:void 0})}return processedTools}validateToolChoice(toolChoice,availableTools){return toolChoice?typeof toolChoice=="string"?["auto","required","none"].includes(toolChoice):typeof toolChoice=="object"&&toolChoice!==null&&toolChoice.type==="function"&&toolChoice.function?.name?availableTools.some(tool=>tool.type==="function"&&tool.name===toolChoice.function.name):!1:!0}upsertWebSearchToolImmutable(toolsData,id,args=""){const existingIndex=toolsData.findIndex(t=>t.id===id);if(existingIndex===-1){const index=toolsData.length,newItem={index,id,type:TToolType.WebSearch,name:"web_search",arguments:args,role:"tool"};return{toolsData:[...toolsData,newItem],index}}return args?{toolsData:toolsData.map((t,idx)=>idx===existingIndex?{...t,arguments:args}:t),index:existingIndex}:{toolsData,index:existingIndex}}}var __defProp$P=Object.defineProperty,__defNormalProp$P=(obj,key,value)=>key in obj?__defProp$P(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$P=(obj,key,value)=>__defNormalProp$P(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE=20*1024*1024,MAX_DOCUMENT_SIZE=25*1024*1024;class ChatCompletionsApiInterface extends OpenAIApiInterface{constructor(context2,deps){super(context2),__publicField$P(this,"deps"),__publicField$P(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$P(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context2){return await(await this.deps.getClient(context2)).chat.completions.create({...body,stream:!1})}async createStream(body,context2){return await(await this.deps.getClient(context2)).chat.completions.create({...body,stream:!0,stream_options:{include_usage:!0}})}handleStream(stream,context2){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context2);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit("error",error)}})(),emitter}async prepareRequestBody(params){let messages=await this.prepareMessages(params);if(MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName)&&(messages=this.convertSystemMessagesToUserMessages(messages)),params.responseFormat==="json"){if(!MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName))messages?.[0]?.role===TLLMMessageRole.System?messages[0]={...messages[0],content:messages[0].content+JSON_RESPONSE_INSTRUCTION}:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION});else{const firstUserMessageIndex=messages.findIndex(msg=>msg.role===TLLMMessageRole.User);if(firstUserMessageIndex!==-1){const userMessage=messages[firstUserMessageIndex],content=typeof userMessage.content=="string"?userMessage.content:"";messages[firstUserMessageIndex]={...userMessage,content:JSON_RESPONSE_INSTRUCTION+`
|
|
235
|
+
The output JSON should only use the entries from the output format.`}return newPrompt}postProcess(response){try{return JSONContent(response).tryParse()}catch{return{error:"Invalid JSON response",data:response,details:"The response from the model is not a valid JSON object. Please check the model output and try again."}}}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){throw new Error("This model does not support tools")}transformToolMessageBlocks({messageBlock,toolsData}){throw new Error("This model does not support tools")}getConsistentMessages(messages){return messages}async prepareParams(candidate,params){const modelsProvider=ConnectorService.getModelsProviderConnector(),files=params?.files;delete params?.files;const clonedParams=JSON.parse(JSON.stringify(params)),_params=this.formatParamValues(clonedParams),model=_params.model,teamId=await this.getTeamId(candidate);_params.modelEntryName=typeof model=="string"?model:model.modelId,_params.teamId=teamId;const modelProviderCandidate=modelsProvider.requester(candidate),modelInfo=await modelProviderCandidate.getModelInfo(model);if(modelInfo.params)for(let key in modelInfo.params)typeof _params[key]>"u"&&(_params[key]=modelInfo.params[key]);_params.credentials=await getLLMCredentials(candidate,modelInfo),_params.baseURL=modelInfo?.baseURL,_params.modelInfo=modelInfo,_params.maxTokens?_params.maxTokens=await modelProviderCandidate.adjustMaxCompletionTokens(model,_params.maxTokens,_params?.isUserKey):_params.maxTokens=await modelProviderCandidate.getMaxCompletionTokens(model,_params?.isUserKey),_params.model=await modelProviderCandidate.getModelId(model),_params.files=files;const features=modelInfo?.features||[];_params.capabilities={search:features.includes("search"),reasoning:features.includes("reasoning"),imageGeneration:features.includes("image-generation")},_params.toolsInfo={openai:await this.prepareOpenAIToolsInfo(_params),xai:await this.prepareXAIToolsInfo(_params)},_params.agentId=candidate.id;const body=await this.reqBodyAdapter(_params);return{..._params,body}}async prepareOpenAIToolsInfo(params){const openAIToolsInfo={webSearch:{enabled:params?.useWebSearch&¶ms.capabilities.search===!0,contextSize:params?.webSearchContextSize||"medium"}};return params?.webSearchCity&&(openAIToolsInfo.webSearch.city=params?.webSearchCity),params?.webSearchCountry&&(openAIToolsInfo.webSearch.country=params?.webSearchCountry),params?.webSearchRegion&&(openAIToolsInfo.webSearch.region=params?.webSearchRegion),params?.webSearchTimezone&&(openAIToolsInfo.webSearch.timezone=params?.webSearchTimezone),openAIToolsInfo}async prepareXAIToolsInfo(params){const xaiToolsInfo={search:{enabled:params?.useSearch===!0&¶ms.capabilities.search===!0}};return params?.searchMode&&(xaiToolsInfo.search.mode=params?.searchMode),params?.returnCitations&&(xaiToolsInfo.search.returnCitations=params?.returnCitations),params?.maxSearchResults&&(xaiToolsInfo.search.maxResults=params?.maxSearchResults),params?.searchDataSources&&(xaiToolsInfo.search.dataSources=params?.searchDataSources),params?.searchCountry&&(xaiToolsInfo.search.country=params?.searchCountry),params?.excludedWebsites&&(xaiToolsInfo.search.excludedWebsites=params?.excludedWebsites),params?.allowedWebsites&&(xaiToolsInfo.search.allowedWebsites=params?.allowedWebsites),params?.includedXHandles&&(xaiToolsInfo.search.includedXHandles=params?.includedXHandles),params?.excludedXHandles&&(xaiToolsInfo.search.excludedXHandles=params?.excludedXHandles),params?.postFavoriteCount&&(xaiToolsInfo.search.postFavoriteCount=params?.postFavoriteCount),params?.postViewCount&&(xaiToolsInfo.search.postViewCount=params?.postViewCount),params?.rssLinks&&(xaiToolsInfo.search.rssLinks=params?.rssLinks),params?.safeSearch&&(xaiToolsInfo.search.safeSearch=params?.safeSearch),params?.fromDate&&(xaiToolsInfo.search.fromDate=params?.fromDate),params?.toDate&&(xaiToolsInfo.search.toDate=params?.toDate),xaiToolsInfo}formatParamValues(params){let _params={};for(const[key,value]of Object.entries(params)){let _value=value;["stopSequences","excludedWebsites","allowedWebsites","includedXHandles","excludedXHandles","rssLinks"].includes(key)&&(_value&&typeof _value=="string"?_value=_value.split(/[,\n]/).map(item=>item.trim()).filter(item=>item.length>0):Array.isArray(_value)?_value=_value:_value=_value?[_value]:null),typeof _value=="string"&&_value.trim()!==""&&!isNaN(Number(_value))&&(_value=+_value),key==="messages"&&(_value=this.getConsistentMessages(_value)),_params[key]=_value}return _params}async getTeamId(candidate){const accountConnector=ConnectorService.getAccountConnector();if(!accountConnector)throw new Error("Account Connector unavailable, cannot proceed");return await accountConnector.getCandidateTeam(candidate)}}var __defProp$P=Object.defineProperty,__getOwnPropDesc$t=Object.getOwnPropertyDescriptor,__defNormalProp$P=(obj,key,value)=>key in obj?__defProp$P(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$t=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$t(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$P(target,key,result),result},__publicField$P=(obj,key,value)=>__defNormalProp$P(obj,key+"",value);const logger$f=Logger("EchoConnector");class EchoConnector extends LLMConnector{constructor(){super(...arguments),__publicField$P(this,"name","LLM:Echo")}async request({acRequest,body,context:context2}){try{logger$f.debug(`request ${this.name}`,acRequest.candidate);const content=body?.messages?.[0]?.content;return{content,finishReason:"stop",useTool:!1,toolsData:[],message:{content,role:"assistant"},usage:{}}}catch(error){throw logger$f.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$f.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1;let content="";return Array.isArray(body?.messages)&&(content=body?.messages?.filter(m=>m.role==="user").pop()?.content),(async()=>{const chunks=content.split(" ");for(let i=0;i<chunks.length;i++){await delay(3);const isLastChunk=i===chunks.length-1,delta={content:chunks[i]+(isLastChunk?"":" ")};emitter.emit(TLLMEvent.Data,delta),emitter.emit(TLLMEvent.Content,delta.content)}setTimeout(()=>{emitter.emit(TLLMEvent.End,[],[],"stop")},100)})(),emitter}catch(error){throw logger$f.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){return params}enhancePrompt(prompt,config2){return prompt}postProcess(response){try{const result=JSONContent(response).tryFullParse();return result?.error?response:result}catch{return response}}reportUsage(usage,metadata){}}__decorateClass$t([hookAsync("LLMConnector.request")],EchoConnector.prototype,"request"),__decorateClass$t([hookAsync("LLMConnector.streamRequest")],EchoConnector.prototype,"streamRequest");class LLMHelper{static hasSystemMessage(messages){return Array.isArray(messages)?messages?.some(message=>message.role==="system"):!1}static separateSystemMessages(messages){const systemMessage=messages.find(message=>message.role==="system")||{},otherMessages=messages.filter(message=>message.role!=="system");return{systemMessage,otherMessages}}static async countVisionPromptTokens(prompt){let tokens=0;const textObj=prompt?.filter(item=>["text","input_text"].includes(item.type)),textTokens=encode(textObj?.[0]?.text).length,images=prompt?.filter(item=>["image_url","input_image"].includes(item.type));let imageTokens=0;for(const image of images){const imageUrl=image?.image_url?.url||image?.image_url,{width,height}=await this.getImageDimensions(imageUrl),tokens2=this.countImageTokens(width,height);imageTokens+=tokens2}return tokens=textTokens+imageTokens,tokens}static async getImageDimensions(imageUrl){try{let buffer;if(isBase64FileUrl(imageUrl)){const base64Data=imageUrl.replace(/^data:image\/\w+;base64,/,"");buffer=Buffer.from(base64Data,"base64")}else if(isUrl(imageUrl)){const response=await axios.get(imageUrl,{responseType:"arraybuffer"});buffer=Buffer.from(response.data)}else throw new Error("Please provide a valid image url!");const dimensions=imageSize(buffer);return{width:dimensions?.width||0,height:dimensions?.height||0}}catch(error){throw console.error("Error getting image dimensions",error),new Error("Please provide a valid image url!")}}static countImageTokens(width,height,detailMode="auto"){if(detailMode==="low")return 85;if(width>2048||height>2048){const aspectRatio=width/height;aspectRatio>1?(width=2048,height=Math.floor(2048/aspectRatio)):(height=2048,width=Math.floor(2048*aspectRatio))}if(width>768&&height>768){const aspectRatio=width/height;aspectRatio>1?(height=768,width=Math.floor(768*aspectRatio)):(width=768,height=Math.floor(768/aspectRatio))}const tilesWidth=Math.ceil(width/512),tilesHeight=Math.ceil(height/512);return 85+170*(tilesWidth*tilesHeight)}static removeDuplicateUserMessages(messages){const _messages=JSON.parse(JSON.stringify(messages));return _messages.length>1&&_messages[0].role===TLLMMessageRole.User&&_messages[1].role===TLLMMessageRole.User&&_messages.shift(),_messages.length>1&&_messages[_messages.length-1].role===TLLMMessageRole.User&&_messages[_messages.length-2].role===TLLMMessageRole.User&&_messages.pop(),_messages}}var __defProp$O=Object.defineProperty,__defNormalProp$O=(obj,key,value)=>key in obj?__defProp$O(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$O=(obj,key,value)=>__defNormalProp$O(obj,key+"",value);class OpenAIApiInterface{constructor(context2){__publicField$O(this,"context"),this.context=context2}}var TToolType=(TToolType2=>(TToolType2.WebSearch="web_search_preview",TToolType2))(TToolType||{});const O3_AND_O4_MODELS=["o3","o3-pro","o4-mini"],O3_AND_O4_MODELS_PATTERN=/o3|o4/i,MODELS_WITHOUT_JSON_RESPONSE_SUPPORT=["o1-preview"],MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT=["o1-mini","o1-preview"],SEARCH_TOOL_COSTS={"gpt-4":.025,"gpt-5":.01};function isValidOpenAIReasoningEffort(value){return["minimal","low","medium","high"].includes(value)}var __defProp$N=Object.defineProperty,__defNormalProp$N=(obj,key,value)=>key in obj?__defProp$N(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$N=(obj,key,value)=>__defNormalProp$N(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE$1=20*1024*1024,MAX_DOCUMENT_SIZE$1=25*1024*1024,EVENT_TYPES={WEB_SEARCH_IN_PROGRESS:"response.web_search_call.in_progress",WEB_SEARCH_SEARCHING:"response.web_search_call.searching",WEB_SEARCH_COMPLETED:"response.web_search_call.completed",WEB_SEARCH_STARTED:"response.web_search_call.started",RESPONSE_COMPLETED:"response.completed",OUTPUT_TEXT_DELTA:"response.output_text.delta",OUTPUT_ITEM_ADDED:"response.output_item.added",FUNCTION_CALL_ARGUMENTS_DELTA:"response.function_call_arguments.delta",FUNCTION_CALL_ARGUMENTS_DONE:"response.function_call_arguments.done",OUTPUT_ITEM_DONE:"response.output_item.done",INCOMPLETE:"response.incomplete"};class ResponsesApiInterface extends OpenAIApiInterface{constructor(context2,deps){super(context2),__publicField$N(this,"deps"),__publicField$N(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$N(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context2){return await(await this.deps.getClient(context2)).responses.create({...body,stream:!1})}async createStream(body,context2){return await(await this.deps.getClient(context2)).responses.create({...body,stream:!0})}handleStream(stream,context2){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context2);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit(TLLMEvent.Error,error)}})(),emitter}async processStream(stream,emitter){let toolsData=[],finishReason="stop";const usageData=[];for await(const part of stream)try{if("type"in part)switch(part.type){case EVENT_TYPES.WEB_SEARCH_IN_PROGRESS:toolsData=this.handleWebSearchInProgress(part,toolsData);break;case EVENT_TYPES.WEB_SEARCH_SEARCHING:toolsData=this.handleWebSearchSearching(part,toolsData);break;case EVENT_TYPES.WEB_SEARCH_COMPLETED:toolsData=this.handleWebSearchCompleted(part,toolsData);break;case EVENT_TYPES.OUTPUT_TEXT_DELTA:this.handleOutputTextDelta(part,emitter);break;case EVENT_TYPES.OUTPUT_ITEM_ADDED:toolsData=this.handleOutputItemAdded(part,toolsData,emitter);break;case EVENT_TYPES.FUNCTION_CALL_ARGUMENTS_DELTA:toolsData=this.handleFunctionCallArgumentsDelta(part,toolsData,emitter);break;case EVENT_TYPES.FUNCTION_CALL_ARGUMENTS_DONE:toolsData=this.handleFunctionCallArgumentsDone(part,toolsData,emitter);break;case EVENT_TYPES.OUTPUT_ITEM_DONE:toolsData=this.handleOutputItemDone(part,toolsData);break;case EVENT_TYPES.RESPONSE_COMPLETED:{finishReason="stop";const responseData2=part?.response;responseData2?.usage&&usageData.push(responseData2.usage);break}case EVENT_TYPES.INCOMPLETE:finishReason="incomplete";const responseData=part?.response;responseData?.usage&&usageData.push(responseData.usage);break;default:{const eventType=String(part.type);if(eventType===EVENT_TYPES.WEB_SEARCH_STARTED){const legacyId=part?.id;typeof legacyId=="string"&&(toolsData=this.upsertWebSearchToolImmutable(toolsData,legacyId).toolsData);break}finishReason=this.handleCompletionEvent(eventType);break}}}catch(error){console.warn("Error processing stream event:",error,"Event:",part)}return{toolsData:this.extractToolCalls(toolsData),finishReason,usageData}}extractToolCalls(output){return output.map(tool=>({index:tool.index,name:tool.name,arguments:tool.arguments,id:tool.callId||tool.id,type:tool.type,role:tool.role,callId:tool.callId}))}reportUsageStatistics(usage_data,context2){const reportedUsage=[];if(usage_data.forEach(usage=>{const convertedUsage={completion_tokens:usage.completion_tokens||0,prompt_tokens:usage.prompt_tokens||0,total_tokens:usage.total_tokens||0,...usage},reported=this.deps.reportUsage(convertedUsage,this.buildUsageContext(context2));reportedUsage.push(reported)}),context2.toolsInfo?.openai?.webSearch?.enabled){const searchUsage=this.calculateSearchToolUsage(context2),reported=this.deps.reportUsage(searchUsage,this.buildUsageContext(context2));reportedUsage.push(reported)}return reportedUsage}emitFinalEvents(emitter,toolsData,reportedUsage,finishReason){toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setImmediate(()=>{emitter.emit(TLLMEvent.End,toolsData,reportedUsage,finishReason)})}buildUsageContext(context2){return{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}}calculateSearchToolUsage(context2){const modelName=context2.modelEntryName?.replace("smythos/","");return{cost:this.getSearchToolCost(modelName),completion_tokens:0,prompt_tokens:0,total_tokens:0}}handleWebSearchCompleted(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search completed event:",error),toolsData}}handleWebSearchInProgress(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search in_progress event:",error),toolsData}}handleWebSearchSearching(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search searching event:",error),toolsData}}handleOutputTextDelta(part,emitter){try{if("delta"in part&&part.delta){const deltaMsg={role:"assistant",content:part.delta};emitter.emit(TLLMEvent.Data,deltaMsg),emitter.emit(TLLMEvent.Content,part.delta,"assistant")}}catch(error){console.warn("Error handling output text delta:",error)}}handleOutputItemAdded(part,toolsData,emitter){try{const partAny=part;if(partAny.item&&partAny.item.type==="function_call"){const item=partAny.item,callId=item.call_id,functionName=item.name,itemId=item.id;if(callId&&itemId){const existingIndex=toolsData.findIndex(t=>t.id===itemId||t.id===callId),addingNew=existingIndex===-1,nextIndex=addingNew?toolsData.length:existingIndex;let updated;if(addingNew){const newItem={index:nextIndex,id:itemId,callId,type:"function",name:functionName||"",arguments:item.arguments||"",role:"tool"};updated=[...toolsData,newItem]}else updated=toolsData.map((t,idx)=>idx!==existingIndex?t:{...t,name:functionName||t.name,arguments:item.arguments!==void 0?item.arguments:t.arguments,callId:t.callId||callId});return addingNew&&emitter.emit("tool_call_started",{id:callId,name:functionName||"",type:"function"}),updated}}return toolsData}catch(error){return console.warn("Error handling output item added:",error),toolsData}}handleFunctionCallArgumentsDelta(part,toolsData,emitter){try{if("delta"in part&&"item_id"in part&&typeof part.delta=="string"&&typeof part.item_id=="string"){const delta=part.delta,itemId=part.item_id,existingIndex=toolsData.findIndex(t=>t.id===itemId);let updated,finalIndex;if(existingIndex===-1){finalIndex=toolsData.length;const newItem={index:finalIndex,id:itemId,type:"function",name:"",arguments:delta,role:"tool"};updated=[...toolsData,newItem]}else finalIndex=existingIndex,updated=toolsData.map((t,idx)=>idx===existingIndex?{...t,arguments:String(t.arguments||"")+delta}:t);const entry=updated[finalIndex];return emitter.emit("tool_call_progress",{id:entry.callId||itemId,name:entry.name,arguments:entry.arguments,delta}),updated}return toolsData}catch(error){return console.warn("Error handling function call arguments delta:",error),toolsData}}handleFunctionCallArgumentsDone(part,toolsData,emitter){try{const partAny=part;if(partAny.item_id&&partAny.arguments){const itemId=partAny.item_id,finalArguments=partAny.arguments,toolIndex=toolsData.findIndex(t=>t.id===itemId);if(toolIndex!==-1){const updated=toolsData.map((t,idx)=>idx===toolIndex?{...t,arguments:finalArguments}:t),updatedEntry=updated[toolIndex];return emitter.emit("tool_call_completed",{id:updatedEntry.callId||itemId,name:updatedEntry.name,arguments:finalArguments}),updated}}return toolsData}catch(error){return console.warn("Error handling function call arguments done:",error),toolsData}}handleOutputItemDone(part,toolsData){try{const partAny=part;if(partAny.item&&partAny.item.type==="function_call"&&partAny.item.status==="completed"){const item=partAny.item,callId=item.call_id,itemId=item.id,toolIndex=toolsData.findIndex(t=>t.id===itemId||t.id===callId);if(toolIndex!==-1&&item.arguments)return toolsData.map((t,idx)=>idx===toolIndex?{...t,arguments:item.arguments,callId:t.callId||callId}:t)}return toolsData}catch(error){return console.warn("Error handling output item done:",error),toolsData}}handleCompletionEvent(eventType){return eventType===EVENT_TYPES.RESPONSE_COMPLETED||eventType.includes("done"),"stop"}async prepareRequestBody(params){let input=await this.prepareInputMessages(params);input=this.applyToolMessageTransformation(input);const body={model:params.model,input};params?.maxTokens!==void 0&&(body.max_output_tokens=params.maxTokens);const isGPT5ReasoningModels=params.modelEntryName?.includes("gpt-5")&¶ms?.capabilities?.reasoning;isGPT5ReasoningModels&¶ms?.verbosity&&(body.text={verbosity:params.verbosity}),isGPT5ReasoningModels&&isValidOpenAIReasoningEffort(params.reasoningEffort)&&(body.reasoning={effort:params.reasoningEffort});let tools=[];if(params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(tools=await this.prepareFunctionTools(params)),params.toolsInfo?.openai?.webSearch?.enabled){const searchTool=this.prepareWebSearchTool(params);tools.push(searchTool)}if(tools.length>0)if(body.tools=tools,params?.toolsConfig?.tool_choice){const toolChoice=params.toolsConfig.tool_choice;this.validateToolChoice(toolChoice,tools)?typeof toolChoice=="string"?body.tool_choice=toolChoice:typeof toolChoice=="object"&&toolChoice!==null&&("type"in toolChoice&&toolChoice.type==="function"&&"function"in toolChoice&&"name"in toolChoice.function?body.tool_choice={type:"function",name:toolChoice.function.name}:body.tool_choice=toolChoice):body.tool_choice="auto"}else body.tool_choice="auto";return body}transformToolsConfig(config2){return!config2?.toolDefinitions||!Array.isArray(config2.toolDefinitions)?[]:config2.toolDefinitions.map((tool,index)=>{if(!tool||typeof tool!="object")return{type:"function",name:void 0,description:void 0,parameters:{type:"object",properties:void 0,required:void 0},strict:!1};if("function"in tool&&tool.function&&typeof tool.function=="object"&&tool.function!==null){const funcTool=tool.function;return!funcTool.name||typeof funcTool.name!="string"?{type:"function",name:void 0,description:tool.description||"",parameters:{type:"object",properties:void 0,required:void 0},strict:!1}:{type:"function",name:funcTool.name,description:funcTool.description||tool.description||"",parameters:funcTool.parameters||{type:"object",properties:{},required:[]},strict:!1}}if("parameters"in tool)return{type:"function",name:tool.name,description:tool.description||"",parameters:tool.parameters||{type:"object",properties:{},required:[]},strict:!1};const legacyTool=tool;return{type:"function",name:tool.name,description:tool.description||legacyTool.desc,parameters:{type:"object",properties:legacyTool.properties,required:legacyTool.requiredFields||legacyTool.required},strict:!1}}).filter(Boolean)}normalizeToolArguments(args){if(typeof args=="string")try{return JSON.parse(args),args}catch{return JSON.stringify(args)}if(typeof args=="object"&&args!==null)try{return JSON.stringify(args)}catch{return"{}"}return args==null?"{}":JSON.stringify(args)}isValidToolData(toolData){return!!(toolData&&toolData.id&&toolData.name&&(toolData.result!==void 0||toolData.error!==void 0))}async handleFileAttachments(files,agentId,messages){if(files.length===0)return messages;const uploadedFiles=await this.uploadFiles(files,agentId),validImageFiles=this.getValidImageFiles(uploadedFiles),validDocumentFiles=this.getValidDocumentFiles(uploadedFiles),imageData=await this.processImageData(validImageFiles,agentId),documentData=await this.processDocumentData(validDocumentFiles,agentId);for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="user"){typeof messages[i].content=="string"?messages[i].content=[{type:"input_text",text:messages[i].content}]:Array.isArray(messages[i].content)||(messages[i].content=[]),messages[i].content.push(...imageData,...documentData);break}return messages.some(item=>item.role==="user")||messages.push({role:"user",content:[...imageData,...documentData]}),messages}getValidImageFiles(files){return files.filter(file=>this.validImageMimeTypes.includes(file?.mimetype))}getValidDocumentFiles(files){return files.filter(file=>this.validDocumentMimeTypes.includes(file?.mimetype))}async uploadFiles(files,agentId){const promises=files.map(file=>{const binaryInput=BinaryInput.from(file);return binaryInput.upload(AccessCandidate.agent(agentId)).then(()=>binaryInput)});return Promise.all(promises)}async uploadFile({file,agentId,purpose="user_data"}){try{if(!file?.mimetype)throw new Error("Missing required parameters to upload file to OpenAI!");const tempDir=os.tmpdir(),fileName=await file.getName(),tempFilePath=path.join(tempDir,`${uid()}_${fileName}`),bufferData=await file.readData(AccessCandidate.agent(agentId));await fs__default.promises.writeFile(tempFilePath,new Uint8Array(bufferData));const fileId=(await(await this.deps.getClient(this.context)).files.create({file:fs__default.createReadStream(tempFilePath),purpose})).id;if(!fileId)throw new Error("File upload did not return a file ID.");return await fs__default.promises.unlink(tempFilePath).catch(()=>{}),{fileId,filename:fileName}}catch(error){throw new Error(`Error uploading file to OpenAI: ${error.message}`)}}async processImageData(files,agentId){if(files.length===0)return[];const imageData=[];for(const file of files){await this.validateFileSize(file,MAX_IMAGE_SIZE$1,"Image");try{const{fileId}=await this.uploadFile({file,agentId,purpose:"vision"});imageData.push({type:"input_image",file_id:fileId})}catch(error){console.warn("Failed to upload image via Files API, falling back to base64:",error);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),url=`data:${file.mimetype};base64,${base64Data}`;imageData.push({type:"input_image",image_url:url})}}return imageData}async processDocumentData(files,agentId){if(files.length===0)return[];const documentData=[];for(const file of files){await this.validateFileSize(file,MAX_DOCUMENT_SIZE$1,"Document");try{const{fileId,filename}=await this.uploadFile({file,agentId,purpose:"user_data"});documentData.push({type:"input_file",file_id:fileId})}catch(error){console.warn("Failed to upload document via Files API, falling back to base64:",error);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),filename=await file.getName();documentData.push({type:"input_file",filename,file_data:`data:${file.mimetype};base64,${base64Data}`})}}return documentData}async validateFileSize(file,maxSize,fileType){await file.ready();const fileInfo=await file.getJsonData(AccessCandidate.agent("temp"));if(fileInfo.size>maxSize)throw new Error(`${fileType} file size (${fileInfo.size} bytes) exceeds maximum allowed size of ${maxSize} bytes`)}getInterfaceName(){return"responses"}validateParameters(params){return!!params.model}async prepareInputMessages(params){const messages=params?.messages||[],files=params?.files||[];let input=[...messages];return files.length>0&&(input=await this.handleFileAttachments(files,params.agentId,input)),input}async prepareFunctionTools(params){const tools=[];if(params?.toolsConfig?.tools&&Array.isArray(params.toolsConfig.tools)&¶ms.toolsConfig.tools.length>0)try{const validTools=this.transformToolsConfig({type:"function",toolDefinitions:params.toolsConfig.tools,toolChoice:params.toolsConfig.tool_choice||"auto",modelInfo:params.modelInfo||null}).filter((tool,index)=>!(tool.type!=="function"||!tool.name));tools.push(...validTools)}catch{}return tools}prepareWebSearchTool(params){const webSearch=params?.toolsInfo?.openai?.webSearch,contextSize=webSearch?.contextSize,searchCity=webSearch?.city,searchCountry=webSearch?.country,searchRegion=webSearch?.region,searchTimezone=webSearch?.timezone,userLocation={type:"approximate"};searchCity&&(userLocation.city=searchCity),searchCountry&&(userLocation.country=searchCountry),searchRegion&&(userLocation.region=searchRegion),searchTimezone&&(userLocation.timezone=searchTimezone);const hasLocationData=searchCity||searchCountry||searchRegion||searchTimezone,searchTool={type:"web_search_preview"},webSearchConfig={};return contextSize&&(webSearchConfig.search_context_size=contextSize),hasLocationData&&(webSearchConfig.user_location=userLocation),{...searchTool,...webSearchConfig}}applyToolMessageTransformation(input){const transformedMessages=[];for(let i=0;i<input.length;i++){const message=input[i];try{if(message.role==="assistant"&&message.tool_calls&&Array.isArray(message.tool_calls)){if(message.content!==void 0&&message.content!==null){const contentStr=typeof message.content=="string"?message.content:JSON.stringify(message.content);contentStr.trim().length>0&&transformedMessages.push({role:"assistant",content:contentStr})}message.tool_calls.forEach((toolCall,index)=>{if(!toolCall||!toolCall.function)return;const functionArgs=toolCall.function.arguments,normalizedArgs=functionArgs==null?void 0:typeof functionArgs=="object"?JSON.stringify(functionArgs):String(functionArgs);transformedMessages.push({type:"function_call",name:toolCall.function.name||"",arguments:normalizedArgs,call_id:toolCall.id||toolCall.call_id||`call_${Date.now()}_${index}`})})}else if(message.role==="tool"){if(!message.tool_call_id)return;const outputContent=message.content,normalizedOutput=typeof outputContent=="string"?outputContent:JSON.stringify(outputContent||"null");transformedMessages.push({type:"function_call_output",call_id:message.tool_call_id,output:normalizedOutput})}else transformedMessages.push(message)}catch{transformedMessages.push(message)}}return transformedMessages.filter((msg,index)=>!(!msg||typeof msg!="object"))}getSearchToolCost(modelName){if(!modelName)return 0;const normalized=String(modelName).toLowerCase().replace(/^smythos\//,""),match=Object.entries(SEARCH_TOOL_COSTS).find(([family])=>normalized.startsWith(family));return match?match[1]:0}async processFunctionCallResults(toolsData){const processedTools=[];for(const tool of toolsData)if(this.isValidToolData(tool))try{const processedTool={...tool,arguments:this.normalizeToolArguments(tool.arguments),function:tool.function||{name:tool.name,arguments:this.normalizeToolArguments(tool.arguments)}};processedTools.push(processedTool)}catch(error){processedTools.push({...tool,error:error instanceof Error?error.message:"Unknown processing error",result:void 0})}return processedTools}validateToolChoice(toolChoice,availableTools){return toolChoice?typeof toolChoice=="string"?["auto","required","none"].includes(toolChoice):typeof toolChoice=="object"&&toolChoice!==null&&toolChoice.type==="function"&&toolChoice.function?.name?availableTools.some(tool=>tool.type==="function"&&tool.name===toolChoice.function.name):!1:!0}upsertWebSearchToolImmutable(toolsData,id,args=""){const existingIndex=toolsData.findIndex(t=>t.id===id);if(existingIndex===-1){const index=toolsData.length,newItem={index,id,type:TToolType.WebSearch,name:"web_search",arguments:args,role:"tool"};return{toolsData:[...toolsData,newItem],index}}return args?{toolsData:toolsData.map((t,idx)=>idx===existingIndex?{...t,arguments:args}:t),index:existingIndex}:{toolsData,index:existingIndex}}}var __defProp$M=Object.defineProperty,__defNormalProp$M=(obj,key,value)=>key in obj?__defProp$M(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$M=(obj,key,value)=>__defNormalProp$M(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE=20*1024*1024,MAX_DOCUMENT_SIZE=25*1024*1024;class ChatCompletionsApiInterface extends OpenAIApiInterface{constructor(context2,deps){super(context2),__publicField$M(this,"deps"),__publicField$M(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$M(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context2){return await(await this.deps.getClient(context2)).chat.completions.create({...body,stream:!1})}async createStream(body,context2){return await(await this.deps.getClient(context2)).chat.completions.create({...body,stream:!0,stream_options:{include_usage:!0}})}handleStream(stream,context2){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context2);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit(TLLMEvent.Error,error)}})(),emitter}async prepareRequestBody(params){let messages=await this.prepareMessages(params);if(MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName)&&(messages=this.convertSystemMessagesToUserMessages(messages)),params.responseFormat==="json"){if(!MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName))messages?.[0]?.role===TLLMMessageRole.System?messages[0]={...messages[0],content:messages[0].content+JSON_RESPONSE_INSTRUCTION}:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION});else{const firstUserMessageIndex=messages.findIndex(msg=>msg.role===TLLMMessageRole.User);if(firstUserMessageIndex!==-1){const userMessage=messages[firstUserMessageIndex],content=typeof userMessage.content=="string"?userMessage.content:"";messages[firstUserMessageIndex]={...userMessage,content:JSON_RESPONSE_INSTRUCTION+`
|
|
196
236
|
|
|
197
|
-
`+content}}else messages.push({role:TLLMMessageRole.User,content:JSON_RESPONSE_INSTRUCTION})}params.responseFormat={type:"json_object"}}const body={model:params.model,messages};params?.maxTokens!==void 0&&(body.max_completion_tokens=params.maxTokens);const modelName=params.modelEntryName?.replace(BUILT_IN_MODEL_PREFIX,"");params?.temperature!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.temperature=params.temperature),params?.topP!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.top_p=params.topP),params?.frequencyPenalty!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.frequency_penalty=params.frequencyPenalty),params?.presencePenalty!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.presence_penalty=params.presencePenalty),params?.responseFormat?.type&&!MODELS_WITHOUT_JSON_RESPONSE_SUPPORT.includes(modelName)&&(body.response_format=params.responseFormat),params?.stopSequences?.length&&!O3_AND_O4_MODELS.includes(modelName)&&(body.stop=params.stopSequences);const isGPT5ReasoningModels=params.modelEntryName?.includes("gpt-5")&¶ms?.capabilities?.reasoning;return isGPT5ReasoningModels&¶ms?.verbosity&&(body.verbosity=params.verbosity),isGPT5ReasoningModels&&isValidOpenAIReasoningEffort(params.reasoningEffort)&&(body.reasoning_effort=params.reasoningEffort),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(body.tools=params?.toolsConfig?.tools,body.tool_choice=params?.toolsConfig?.tool_choice),body}transformToolsConfig(config2){return config2.toolDefinitions.map(tool=>"parameters"in tool?{type:"function",function:{name:tool.name,description:tool.description,parameters:tool.parameters}}:{type:"function",function:{name:tool.name,description:tool.description,parameters:{type:"object",properties:tool.properties||{},required:tool.requiredFields||[]}}})}async handleFileAttachments(files,agentId,messages){if(files.length===0)return messages;const uploadedFiles=await this.uploadFiles(files,agentId),validImageFiles=this.getValidImageFiles(uploadedFiles),validDocumentFiles=this.getValidDocumentFiles(uploadedFiles),imageData=await this.processImageData(validImageFiles,agentId),documentData=await this.processDocumentData(validDocumentFiles,agentId),messagesCopy=[...messages],userMessage=Array.isArray(messagesCopy)&&messagesCopy.length>0?messagesCopy[messagesCopy.length-1]:{content:""},promptData=[{type:"text",text:(userMessage?.content&&typeof userMessage.content=="string"?userMessage.content:"")||""},...imageData,...documentData];return messagesCopy.length>0?messagesCopy[messagesCopy.length-1]={role:"user",content:promptData}:messagesCopy.push({role:"user",content:promptData}),messagesCopy}async processStream(stream,emitter){let toolsData=[],finishReason="stop";const usageData=[];for await(const part of stream){const delta=part.choices[0]?.delta,usage=part.usage;if(usage&&usageData.push(usage),emitter.emit(
|
|
237
|
+
`+content}}else messages.push({role:TLLMMessageRole.User,content:JSON_RESPONSE_INSTRUCTION})}params.responseFormat={type:"json_object"}}const body={model:params.model,messages};params?.maxTokens!==void 0&&(body.max_completion_tokens=params.maxTokens);const modelName=params.modelEntryName?.replace(BUILT_IN_MODEL_PREFIX,"");params?.temperature!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.temperature=params.temperature),params?.topP!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.top_p=params.topP),params?.frequencyPenalty!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.frequency_penalty=params.frequencyPenalty),params?.presencePenalty!==void 0&&!O3_AND_O4_MODELS.includes(modelName)&&(body.presence_penalty=params.presencePenalty),params?.responseFormat?.type&&!MODELS_WITHOUT_JSON_RESPONSE_SUPPORT.includes(modelName)&&(body.response_format=params.responseFormat),params?.stopSequences?.length&&!O3_AND_O4_MODELS.includes(modelName)&&(body.stop=params.stopSequences);const isGPT5ReasoningModels=params.modelEntryName?.includes("gpt-5")&¶ms?.capabilities?.reasoning;return isGPT5ReasoningModels&¶ms?.verbosity&&(body.verbosity=params.verbosity),isGPT5ReasoningModels&&isValidOpenAIReasoningEffort(params.reasoningEffort)&&(body.reasoning_effort=params.reasoningEffort),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(body.tools=params?.toolsConfig?.tools,body.tool_choice=params?.toolsConfig?.tool_choice),body}transformToolsConfig(config2){return config2.toolDefinitions.map(tool=>"parameters"in tool?{type:"function",function:{name:tool.name,description:tool.description,parameters:tool.parameters}}:{type:"function",function:{name:tool.name,description:tool.description,parameters:{type:"object",properties:tool.properties||{},required:tool.requiredFields||[]}}})}async handleFileAttachments(files,agentId,messages){if(files.length===0)return messages;const uploadedFiles=await this.uploadFiles(files,agentId),validImageFiles=this.getValidImageFiles(uploadedFiles),validDocumentFiles=this.getValidDocumentFiles(uploadedFiles),imageData=await this.processImageData(validImageFiles,agentId),documentData=await this.processDocumentData(validDocumentFiles,agentId),messagesCopy=[...messages],userMessage=Array.isArray(messagesCopy)&&messagesCopy.length>0?messagesCopy[messagesCopy.length-1]:{content:""},promptData=[{type:"text",text:(userMessage?.content&&typeof userMessage.content=="string"?userMessage.content:"")||""},...imageData,...documentData];return messagesCopy.length>0?messagesCopy[messagesCopy.length-1]={role:"user",content:promptData}:messagesCopy.push({role:"user",content:promptData}),messagesCopy}async processStream(stream,emitter){let toolsData=[],finishReason="stop";const usageData=[];for await(const part of stream){const delta=part.choices[0]?.delta,usage=part.usage;if(usage&&usageData.push(usage),emitter.emit(TLLMEvent.Data,delta),!delta?.tool_calls&&delta?.content&&emitter.emit(TLLMEvent.Content,delta?.content,delta?.role),delta?.tool_calls){const toolCall=delta?.tool_calls?.[0],index=toolCall?.index;toolsData[index]||(toolsData[index]={index:index||0,id:"",type:"function",name:"",arguments:"",role:"tool"}),toolCall?.function?.name&&(toolsData[index].name=toolCall.function.name),toolCall?.function?.arguments&&(toolsData[index].arguments+=toolCall.function.arguments),toolCall?.id&&(toolsData[index].id=toolCall.id)}part.choices[0]?.finish_reason&&(finishReason=part.choices[0].finish_reason)}return{toolsData:this.extractToolCalls(toolsData),finishReason,usageData}}extractToolCalls(toolsData){return toolsData.map(tool=>({index:tool.index,name:tool.name,arguments:tool.arguments,id:tool.id,type:tool.type,role:tool.role}))}reportUsageStatistics(usage_data,context2){const reportedUsage=[];return usage_data.forEach(usage=>{const reported=this.deps.reportUsage(usage,this.buildUsageContext(context2));reportedUsage.push(reported)}),reportedUsage}emitFinalEvents(emitter,toolsData,reportedUsage,finishReason){toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setImmediate(()=>{emitter.emit(TLLMEvent.End,toolsData,reportedUsage,finishReason)})}buildUsageContext(context2){return{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}}getValidImageFiles(files){return files.filter(file=>this.validImageMimeTypes.includes(file?.mimetype))}getValidDocumentFiles(files){return files.filter(file=>this.validDocumentMimeTypes.includes(file?.mimetype))}async uploadFiles(files,agentId){const candidate=AccessCandidate.agent(agentId),promises=files.map(file=>{const binaryInput=BinaryInput.from(file,null,null,candidate);return binaryInput.upload(candidate).then(()=>binaryInput)});return Promise.all(promises)}async processImageData(files,agentId){if(files.length===0)return[];const imageData=[];for(const file of files){await this.validateFileSize(file,MAX_IMAGE_SIZE,"Image",agentId);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),url=`data:${file.mimetype};base64,${base64Data}`;imageData.push({type:"image_url",image_url:{url}})}return imageData}async processDocumentData(files,agentId){if(files.length===0)return[];const documentData=[];for(const file of files){await this.validateFileSize(file,MAX_DOCUMENT_SIZE,"Document",agentId);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),fileData=`data:${file.mimetype};base64,${base64Data}`,filename=await file.getName();documentData.push({type:"file",file:{file_data:fileData,filename}})}return documentData}async validateFileSize(file,maxSize,fileType,agentId){await file.ready();const fileInfo=await file.getJsonData(AccessCandidate.agent(agentId));if(fileInfo.size>maxSize)throw new Error(`${fileType} file size (${fileInfo.size} bytes) exceeds maximum allowed size of ${maxSize} bytes`)}getInterfaceName(){return"chat.completions"}validateParameters(params){return!!params.model&&Array.isArray(params.messages)}convertSystemMessagesToUserMessages(messages){const convertedMessages=[],systemMessages=[];for(const message of messages)if(message.role===TLLMMessageRole.System){const content=typeof message.content=="string"?message.content:"";content.trim()&&systemMessages.push(content)}else convertedMessages.push(message);if(systemMessages.length>0){const systemContent=systemMessages.join(`
|
|
198
238
|
|
|
199
239
|
`),firstUserMessageIndex=convertedMessages.findIndex(msg=>msg.role===TLLMMessageRole.User);if(firstUserMessageIndex!==-1){const userMessage=convertedMessages[firstUserMessageIndex],existingContent=typeof userMessage.content=="string"?userMessage.content:"";convertedMessages[firstUserMessageIndex]={...userMessage,content:systemContent+`
|
|
200
240
|
|
|
201
|
-
`+existingContent}}else convertedMessages.unshift({role:TLLMMessageRole.User,content:systemContent})}return convertedMessages}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];return files.length>0?await this.handleFileAttachments(files,params.agentId,[...messages]):messages}}class OpenAIApiInterfaceFactory{constructor(){}createInterface(interfaceType,context2,deps){if(!context2||!deps)throw new Error("Context and dependencies (getClient(), reportUsage()) are required to create an interface");switch(interfaceType){case"responses":return new ResponsesApiInterface(context2,deps);case"chat.completions":return new ChatCompletionsApiInterface(context2,deps);default:throw new Error(`Unsupported OpenAI API interface type: ${interfaceType}. Supported types: ${this.getSupportedInterfaces().join(", ")}`)}}getSupportedInterfaces(){return["responses","chat.completions"]}isInterfaceSupported(interfaceType){return this.getSupportedInterfaces().includes(interfaceType)}getDefaultInterfaceType(){return"chat.completions"}getInterfaceTypeFromModelInfo(modelInfo){return modelInfo?.interface||this.getDefaultInterfaceType()}}var __defProp$O=Object.defineProperty,__getOwnPropDesc$s=Object.getOwnPropertyDescriptor,__defNormalProp$O=(obj,key,value)=>key in obj?__defProp$O(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$s=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$s(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$O(target,key,result),result},__publicField$O=(obj,key,value)=>__defNormalProp$O(obj,typeof key!="symbol"?key+"":key,value);const logger$e=Logger("OpenAIConnector");class OpenAIConnector extends LLMConnector{constructor(){super(),__publicField$O(this,"name","LLM:OpenAI"),__publicField$O(this,"interfaceFactory"),this.interfaceFactory=new OpenAIApiInterfaceFactory}getApiInterface(interfaceType,context2){const deps={getClient:context22=>this.getClient(context22),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};return this.interfaceFactory.createInterface(interfaceType,context2,deps)}getInterfaceType(context2){let responseInterface=this.interfaceFactory.getInterfaceTypeFromModelInfo(context2.modelInfo);return context2.toolsInfo?.openai?.webSearch?.enabled===!0&&(responseInterface="responses"),responseInterface}async getClient(context2){const apiKey=context2.credentials?.apiKey||"",baseURL=context2?.modelInfo?.baseURL;try{return new OpenAI({baseURL,apiKey})}catch(error){throw console.error("Error: on OpenAI client initialization",error),error}}async request({acRequest,body,context:context2}){try{logger$e.debug(`request ${this.name}`,acRequest.candidate);const _body=body;if(context2?.modelEntryName?.startsWith("legacy/")){const messages=_body?.messages||[],promptTokens=await this.computePromptTokens(messages,context2);await this.validateTokenLimit({acRequest,promptTokens,context:context2,maxTokens:_body.max_completion_tokens})}const responseInterface=this.getInterfaceType(context2),result=await this.getApiInterface(responseInterface,context2).createRequest(body,context2),message=result?.choices?.[0]?.message||{content:result?.output_text},finishReason=result?.choices?.[0]?.finish_reason||result?.incomplete_details||"stop";let toolsData=[],useTool=!1;finishReason==="tool_calls"&&(toolsData=message?.tool_calls?.map((tool,index)=>({index,id:tool?.id,type:tool?.type,name:tool?.function?.name,arguments:tool?.function?.arguments,role:"tool"}))||[],useTool=!0);const usage=result?.usage;return this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$e.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{if(logger$e.debug(`streamRequest ${this.name}`,acRequest.candidate),context2?.modelEntryName?.startsWith("legacy/")){const messages=body?.messages||body?.input||[],promptTokens=await this.computePromptTokens(messages,context2);await this.validateTokenLimit({acRequest,promptTokens,context:context2,maxTokens:body.max_completion_tokens})}const responseInterface=this.getInterfaceType(context2),apiInterface=this.getApiInterface(responseInterface,context2),stream=await apiInterface.createStream(body,context2);return apiInterface.handleStream(stream,context2)}catch(error){throw logger$e.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async imageGenRequest({acRequest,body,context:context2}){return await(await this.getClient(context2)).images.generate(body)}async imageEditRequest({acRequest,body,context:context2}){const _body=body;return await(await this.getClient(context2)).images.edit(_body)}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){let tools=[];if(toolDefinitions&&toolDefinitions.length>0){const interfaceType=modelInfo?.interface||"chat.completions",tempContext={modelEntryName:"",agentId:"",teamId:"",isUserKey:!1,modelInfo,credentials:null},deps={getClient:context2=>this.getClient(context2),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};tools=this.interfaceFactory.createInterface(interfaceType,tempContext,deps).transformToolsConfig({type,toolDefinitions,toolChoice,modelInfo})}return tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}async validateTokenLimit({acRequest,maxTokens,promptTokens,context:context2}){await(await this.getProvider(acRequest,context2.modelEntryName)).validateTokensLimit({model:context2.modelInfo,promptTokens,completionTokens:maxTokens,hasAPIKey:context2.isUserKey})}async getProvider(acRequest,modelEntryName){return ConnectorService.getModelsProviderConnector().requester(acRequest.candidate)}async computePromptTokens(messages,context2){try{if(context2?.hasFiles){const lastContent=(messages?.[messages?.length-1]||{})?.content??"";return await LLMHelper.countVisionPromptTokens(lastContent||"")}const normalized=(messages||[]).map(m=>{if(!m||!m.role)return null;let content="";if(Array.isArray(m.content))content=m.content.map(b=>typeof b?.text=="string"?b.text:"").join(" ");else if(typeof m.content=="string")content=m.content;else if(m.content!==void 0&&m.content!==null)try{content=JSON.stringify(m.content)}catch{content=""}return{role:m.role,content}}).filter(Boolean);return encodeChat(normalized,"gpt-4")?.length||0}catch{return 0}}async prepareImageGenerationBody(params){const{model,size,quality,n,responseFormat,style}=params,body={prompt:params.prompt,model,size,n:n||1};return quality&&(body.quality=quality),style&&(body.style=style),body}async prepareImageEditBody(params){const{model,size,n,responseFormat}=params,body={prompt:params.prompt,model,size,n:n||1,image:null},files=params?.files||[];if(files.length>0){const images=await Promise.all(files.map(async file=>await toFile(await file.getReadStream(),await file.getName(),{type:file.mimetype})));body.image=images[0]}return body}async reqBodyAdapter(params){if(params.capabilities?.imageGeneration===!0){const capabilityType=params?.files?.length>0?"image-edit":"image-generation";return this.prepareRequestBody(params,capabilityType)}const minimalContext={modelInfo:params.modelInfo,toolsInfo:params.toolsInfo},responseInterface=this.getInterfaceType(minimalContext);return this.prepareRequestBody(params,responseInterface)}async prepareRequestBody(params,preparationType){const minimalContext={modelInfo:params.modelInfo,modelEntryName:params.modelEntryName,agentId:params.agentId,teamId:params.teamId,isUserKey:params.isUserKey,credentials:params.credentials,hasFiles:params.files&¶ms.files.length>0,toolsInfo:params.toolsInfo},preparer={"chat.completions":async()=>this.getApiInterface("chat.completions",minimalContext).prepareRequestBody(params),responses:async()=>this.getApiInterface("responses",minimalContext).prepareRequestBody(params),"image-generation":()=>this.prepareImageGenerationBody(params),"image-edit":()=>this.prepareImageEditBody(params)}[preparationType];if(!preparer)throw new Error(`Unsupported preparation type: ${preparationType}`);return preparer()}reportUsage(usage,metadata){const modelName=metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),inputTokens=usage?.input_tokens||usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),outputTokens=usage?.output_tokens||usage?.completion_tokens||0,cachedInputTokens=usage?.input_tokens_details?.cached_tokens||usage?.prompt_tokens_details?.cached_tokens||0,usageData={sourceId:`llm:${modelName}`,input_tokens:inputTokens,output_tokens:outputTokens,input_tokens_cache_write:0,input_tokens_cache_read:cachedInputTokens,cost:usage?.cost||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}}__decorateClass$s([hookAsync("LLMConnector.request")],OpenAIConnector.prototype,"request"),__decorateClass$s([hookAsync("LLMConnector.streamRequest")],OpenAIConnector.prototype,"streamRequest");var __defProp$N=Object.defineProperty,__getOwnPropDesc$r=Object.getOwnPropertyDescriptor,__defNormalProp$N=(obj,key,value)=>key in obj?__defProp$N(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$r=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$r(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$N(target,key,result),result},__publicField$N=(obj,key,value)=>__defNormalProp$N(obj,typeof key!="symbol"?key+"":key,value);const logger$d=Logger("GoogleAIConnector"),MODELS_SUPPORT_SYSTEM_INSTRUCTION=["gemini-1.5-pro-exp-0801","gemini-1.5-pro-latest","gemini-1.5-pro-latest","gemini-1.5-pro","gemini-1.5-pro-001","gemini-1.5-flash-latest","gemini-1.5-flash-001","gemini-1.5-flash"],MODELS_SUPPORT_JSON_RESPONSE=MODELS_SUPPORT_SYSTEM_INSTRUCTION,VALID_MIME_TYPES=[...SUPPORTED_MIME_TYPES_MAP.GoogleAI.image,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.audio,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.video,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.document],IMAGE_GEN_FIXED_PRICING={"imagen-3.0-generate-001":.04,"imagen-4.0-generate-001":.04,"imagen-4":.04,"imagen-4-ultra":.06,"gemini-2.5-flash-image":.039};class GoogleAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$N(this,"name","LLM:GoogleAI"),__publicField$N(this,"validMimeTypes",{all:VALID_MIME_TYPES,image:SUPPORTED_MIME_TYPES_MAP.GoogleAI.image})}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");return new GoogleGenAI({apiKey})}async request({acRequest,body,context:context2}){try{logger$d.debug(`request ${this.name}`,acRequest.candidate);const promptSource=body.messages??body.contents??"",{contents,config:promptConfig}=this.normalizePrompt(promptSource),requestConfig=this.buildRequestConfig({generationConfig:body.generationConfig,systemInstruction:body.systemInstruction,promptConfig}),genAI=await this.getClient(context2),requestPayload={model:body.model,contents:contents??""};requestConfig&&(requestPayload.config=requestConfig);const response=await genAI.models.generateContent(requestPayload),content=response.text??"",finishReason=(response.candidates?.[0]?.finishReason||"stop").toLowerCase(),usage=response.usageMetadata;usage&&this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});const toolCalls=response.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);let toolsData=[],useTool=!1;return toolCalls&&toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall?.name,arguments:typeof toolCall.functionCall?.args=="string"?toolCall.functionCall?.args:JSON.stringify(toolCall.functionCall?.args??{}),role:TLLMMessageRole.Assistant,thoughtSignature:toolCall.thoughtSignature})),useTool=!0),{content,finishReason,useTool,toolsData,message:{content,role:"assistant"},usage}}catch(error){throw logger$d.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){logger$d.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,promptSource=body.messages??body.contents??"",{contents,config:promptConfig}=this.normalizePrompt(promptSource),requestConfig=this.buildRequestConfig({generationConfig:body.generationConfig,systemInstruction:body.systemInstruction,promptConfig}),genAI=await this.getClient(context2);try{const stream=await genAI.models.generateContentStream({model:body.model,contents:contents??"",...requestConfig?{config:requestConfig}:{}});let toolsData=[],usage;return(async()=>{try{for await(const chunk of stream){const chunkText=chunk.text??"";chunkText&&emitter.emit("content",chunkText);const toolCalls=chunk.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);toolCalls&&toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall?.name,arguments:typeof toolCall.functionCall?.args=="string"?toolCall.functionCall?.args:JSON.stringify(toolCall.functionCall?.args??{}),role:TLLMMessageRole.Assistant,thoughtSignature:toolCall.thoughtSignature})),emitter.emit(TLLMEvent.ToolInfo,toolsData)),chunk.usageMetadata&&(usage=chunk.usageMetadata)}usage&&this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),setTimeout(()=>{emitter.emit("end",toolsData)},100)}catch(error){logger$d.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit("error",error)}})(),emitter}catch(error){throw logger$d.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async imageGenRequest({body,context:context2}){const apiKey=context2.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");const model=body.model||"imagen-3.0-generate-001",modelName=context2.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),config2={numberOfImages:body.n||1,aspectRatio:body.aspect_ratio||body.size||"1:1",personGeneration:body.person_generation||"allow_adult"},ai=new GoogleGenAI({apiKey}),modelInterface=context2.modelInfo?.interface||LLMInterface.GenerateImages;let response;if(modelInterface===LLMInterface.GenerateContent){response=await ai.models.generateContent({model,contents:body.prompt});const imageData=[];if(response.candidates?.[0]?.content?.parts)for(const part of response.candidates[0].content.parts)part.inlineData?.data&&imageData.push({url:`data:image/png;base64,${part.inlineData.data}`,b64_json:part.inlineData.data,revised_prompt:body.prompt});const usageMetadata=response?.usageMetadata;if(this.reportImageUsage({usage:{cost:IMAGE_GEN_FIXED_PRICING[modelName],usageMetadata},context:context2}),imageData.length===0)throw new Error('Please enter a valid prompt \u2014 for example: "Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme."');return{created:Math.floor(Date.now()/1e3),data:imageData}}else if(modelInterface===LLMInterface.GenerateImages){response=await ai.models.generateImages({model,prompt:body.prompt,config:config2});const usageMetadata=response?.usageMetadata;return this.reportImageUsage({usage:{cost:IMAGE_GEN_FIXED_PRICING[modelName],usageMetadata},numberOfImages:config2.numberOfImages,context:context2}),{created:Math.floor(Date.now()/1e3),data:response.generatedImages?.map(generatedImage=>({url:generatedImage.image.imageBytes?`data:image/png;base64,${generatedImage.image.imageBytes}`:void 0,b64_json:generatedImage.image.imageBytes,revised_prompt:body.prompt}))||[]}}else throw new Error(`Unsupported interface: ${modelInterface}`)}async imageEditRequest({body,context:context2}){const apiKey=context2.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");if(context2.modelInfo?.interface!==LLMInterface.GenerateContent)throw new Error(`Image editing is not supported for model: ${body.model}. This model only supports image generation.`);const ai=new GoogleGenAI({apiKey}),modelName=context2.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),response=await ai.models.generateContent({model:body.model,contents:body.contents}),imageData=[];if(response.candidates?.[0]?.content?.parts)for(const part of response.candidates[0].content.parts)part.inlineData?.data&&imageData.push({url:`data:image/png;base64,${part.inlineData.data}`,b64_json:part.inlineData.data,revised_prompt:body._metadata?.prompt||body.prompt});const usageMetadata=response?.usageMetadata;return this.reportImageUsage({usage:{cost:IMAGE_GEN_FIXED_PRICING[modelName],usageMetadata},context:context2}),{created:Math.floor(Date.now()/1e3),data:imageData}}async reqBodyAdapter(params){const model=params?.model;if(params?.capabilities?.imageGeneration)return params?.files?.length>0?this.prepareImageEditBody(params):this.prepareBodyForImageGenRequest(params);const messages=await this.prepareMessages(params),body={model,messages},responseFormat=params?.responseFormat||"";let responseMimeType="",systemInstruction="";responseFormat==="json"&&(systemInstruction+=JSON_RESPONSE_INSTRUCTION,MODELS_SUPPORT_JSON_RESPONSE.includes(model)&&(responseMimeType="application/json"));const config2={};return params.maxTokens!==void 0&&(config2.maxOutputTokens=params.maxTokens),params.temperature!==void 0&&(config2.temperature=params.temperature),params.topP!==void 0&&(config2.topP=params.topP),params.topK!==void 0&&(config2.topK=params.topK),params.stopSequences?.length&&(config2.stopSequences=params.stopSequences),responseMimeType&&(config2.responseMimeType=responseMimeType),params.modelEntryName?.includes("gemini-3")&¶ms?.reasoningEffort&&(config2.thinkingConfig={thinkingLevel:params.reasoningEffort}),systemInstruction&&(body.systemInstruction=systemInstruction),Object.keys(config2).length>0&&(body.generationConfig=config2),body}normalizePrompt(prompt){if(prompt==null)return{contents:""};if(typeof prompt=="string"||Array.isArray(prompt))return{contents:prompt};if(typeof prompt=="object"&&"contents"in prompt){const{contents,systemInstruction,tools,toolConfig}=prompt,config2={};return systemInstruction&&(config2.systemInstruction=systemInstruction),tools&&(config2.tools=tools),toolConfig&&(config2.toolConfig=toolConfig),{contents,config:Object.keys(config2).length>0?config2:void 0}}return{contents:prompt}}buildRequestConfig({generationConfig,systemInstruction,promptConfig}){const config2={};if(generationConfig)for(const[key,value]of Object.entries(generationConfig))value!==void 0&&(config2[key]=value);return promptConfig?.tools&&(config2.tools=promptConfig.tools),promptConfig?.toolConfig&&(config2.toolConfig=promptConfig.toolConfig),promptConfig?.systemInstruction?config2.systemInstruction=promptConfig.systemInstruction:systemInstruction&&(config2.systemInstruction=systemInstruction),Object.keys(config2).length>0?config2:void 0}reportUsage(usage,metadata){const modelName=metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"");let inputTokens=usage?.promptTokenCount||0;const outputTokens=(usage?.candidatesTokenCount||0)+(usage?.thoughtsTokenCount||0);let cachedInputTokens=usage?.cachedContentTokenCount||0;cachedInputTokens&&(inputTokens=inputTokens-cachedInputTokens);const tierThresholds={"gemini-1.5-pro":128e3,"gemini-2.5-pro":2e5,"gemini-3-pro":2e5};let inTier="",outTier="",crTier="";const modelWithTier=Object.keys(tierThresholds).find(model=>modelName.includes(model));modelWithTier&&(inTier=inputTokens<=tierThresholds[modelWithTier]?"tier1":"tier2",outTier=outputTokens<=tierThresholds[modelWithTier]?"tier1":"tier2",crTier=cachedInputTokens<=tierThresholds[modelWithTier]?"tier1":"tier2");let audioInputTokens=0,cachedAudioInputTokens=0;["gemini-2.5-flash"].includes(modelName)&&(audioInputTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="AUDIO")?.tokenCount||0,cachedAudioInputTokens=usage?.cacheTokensDetails?.find(detail=>detail.modality==="AUDIO")?.tokenCount||0,cachedAudioInputTokens&&(audioInputTokens=audioInputTokens-cachedAudioInputTokens,cachedInputTokens=cachedInputTokens-cachedAudioInputTokens),inputTokens=inputTokens-audioInputTokens);const usageData={sourceId:`llm:${modelName}`,input_tokens:inputTokens,output_tokens:outputTokens,input_tokens_audio:audioInputTokens,input_tokens_cache_read:cachedInputTokens,input_tokens_cache_read_audio:cachedAudioInputTokens,input_tokens_cache_write:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId,inTier,outTier,crTier};return SystemEvents.emit("USAGE:LLM",usageData),usageData}extractTokenCounts(usage){const textTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="TEXT")?.tokenCount||0,imageTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="IMAGE")?.tokenCount||0;return{textTokens,imageTokens}}reportImageUsage({usage,context:context2,numberOfImages=1}){let input_tokens_txt=0,input_tokens_img=0;if(usage.usageMetadata){const{textTokens,imageTokens}=this.extractTokenCounts(usage.usageMetadata);input_tokens_txt=textTokens,input_tokens_img=imageTokens}const imageUsageData={sourceId:"api:imagegen.smyth",keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,cost:usage.cost*numberOfImages,input_tokens_txt,input_tokens_img,agentId:context2.agentId,teamId:context2.teamId};SystemEvents.emit("USAGE:API",imageUsageData)}formatToolsConfig({toolDefinitions,toolChoice="auto"}){return{tools:toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool,validName=this.sanitizeFunctionName(name),validProperties=properties&&Object.keys(properties).length>0?properties:{dummy:{type:"string"}};return{functionDeclarations:[{name:validName,description:description||"",parameters:{type:"OBJECT",properties:validProperties,required:requiredFields||[]}}]}}),toolChoice:{type:toolChoice}}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[],parseFunctionArgs=args=>{if(typeof args=="string")try{return JSON.parse(args)}catch{return args}return args??{}},parseFunctionResponse=response=>{if(typeof response=="string")try{const parsed=JSON.parse(response);return typeof parsed=="string"&&parsed!==response?parseFunctionResponse(parsed):parsed}catch{return response}return response??{}};if(messageBlock){const content=[];if(Array.isArray(messageBlock.parts)&&messageBlock.parts.length>0){for(const part of messageBlock.parts)if(part){if(typeof part.text=="string"&&part.text.trim()){content.push({text:part.text.trim()});continue}if(part.functionCall){const functionCallPart={functionCall:{name:part.functionCall.name,args:parseFunctionArgs(part.functionCall.args)}};part.thoughtSignature&&(functionCallPart.thoughtSignature=part.thoughtSignature),content.push(functionCallPart);continue}if(part.functionResponse){content.push({functionResponse:{name:part.functionResponse.name,response:parseFunctionResponse(part.functionResponse.response)}});continue}part.inlineData&&content.push({inlineData:part.inlineData})}}else typeof messageBlock.content=="string"&&messageBlock.content.trim()?content.push({text:messageBlock.content.trim()}):Array.isArray(messageBlock.content)&&messageBlock.content.length>0&&content.push(...messageBlock.content);if(!content.some(part=>part.functionCall)&&toolsData.length>0&&toolsData.forEach(toolCall=>{const functionCallPart={functionCall:{name:toolCall.name,args:parseFunctionArgs(toolCall.arguments)}};toolCall.thoughtSignature&&(functionCallPart.thoughtSignature=toolCall.thoughtSignature),content.push(functionCallPart)}),content.length>0){let role=messageBlock.role;role===TLLMMessageRole.Assistant&&(role=TLLMMessageRole.Model),messageBlocks.push({role,parts:content})}}const functionResponseParts=toolsData.filter(toolData=>toolData.result!==void 0).map(toolData=>({functionResponse:{name:toolData.name,response:parseFunctionResponse(toolData.result)}}));return functionResponseParts.length>0&&messageBlocks.push({role:TLLMMessageRole.Function,parts:functionResponseParts}),messageBlocks}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message},parseFunctionArgs=args=>{if(typeof args=="string")try{return JSON.parse(args)}catch{return args}return args??{}},parseFunctionResponse=response=>{if(typeof response=="string")try{return JSON.parse(response)}catch{return response}return response},pushTextPart=(parts,text)=>{const value=typeof text=="string"&&text.trim()?text:void 0;value&&parts.push({text:value})},normalizedParts=[];switch(_message.role){case TLLMMessageRole.Assistant:case TLLMMessageRole.System:case TLLMMessageRole.Model:_message.role=TLLMMessageRole.Model;break;case TLLMMessageRole.Function:case TLLMMessageRole.Tool:_message.role=TLLMMessageRole.Function;break;case TLLMMessageRole.User:break;default:_message.role=TLLMMessageRole.User}if(Array.isArray(message?.parts))for(const part of message.parts){if(!part)continue;const normalizedPart={...part};typeof normalizedPart.text=="string"&&(normalizedPart.text=normalizedPart.text.trim()||"..."),part.functionCall&&(normalizedPart.functionCall={name:part.functionCall.name,args:parseFunctionArgs(part.functionCall.args)},part.thoughtSignature&&(normalizedPart.thoughtSignature=part.thoughtSignature)),part.functionResponse&&(normalizedPart.functionResponse={name:part.functionResponse.name,response:parseFunctionResponse(part.functionResponse.response)}),Object.values(normalizedPart).some(value=>value!=null&&value!=="")&&normalizedParts.push(normalizedPart)}if(!normalizedParts.length&&Array.isArray(message?.content)){for(const contentPart of message.content)if(contentPart){if(typeof contentPart=="string")pushTextPart(normalizedParts,contentPart);else if(typeof contentPart=="object")if("text"in contentPart&&typeof contentPart.text=="string")pushTextPart(normalizedParts,contentPart.text);else if("functionCall"in contentPart&&contentPart.functionCall){const functionCallPart=contentPart.functionCall,normalizedFunctionCall={functionCall:{name:functionCallPart.name,args:parseFunctionArgs(functionCallPart.args)}};contentPart.thoughtSignature&&(normalizedFunctionCall.thoughtSignature=contentPart.thoughtSignature),normalizedParts.push(normalizedFunctionCall)}else if("functionResponse"in contentPart&&contentPart.functionResponse){const functionResponsePart=contentPart.functionResponse;normalizedParts.push({functionResponse:{name:functionResponsePart.name,response:parseFunctionResponse(functionResponsePart.response)}})}else{const fallbackText=typeof contentPart?.toString=="function"?contentPart.toString():"";fallbackText&&fallbackText!=="[object Object]"&&pushTextPart(normalizedParts,fallbackText)}}}if(!normalizedParts.length){if(typeof message?.content=="string")pushTextPart(normalizedParts,message.content);else if(message?.content&&typeof message.content=="object")if("text"in message.content)pushTextPart(normalizedParts,message.content.text);else{const fallbackText=typeof message.content?.toString=="function"?message.content.toString():"";fallbackText&&fallbackText!=="[object Object]"&&pushTextPart(normalizedParts,fallbackText)}}if(Array.isArray(message?.tool_calls)&&message.tool_calls.length>0)for(const toolCall of message.tool_calls){if(!toolCall?.function?.name)continue;const normalizedFunctionCall={functionCall:{name:toolCall.function.name,args:parseFunctionArgs(toolCall.function.arguments)}};toolCall.thoughtSignature&&(normalizedFunctionCall.thoughtSignature=toolCall.thoughtSignature),normalizedParts.push(normalizedFunctionCall)}return normalizedParts.length||normalizedParts.push({text:"..."}),_message.parts=normalizedParts,delete _message.content,delete _message.tool_calls,_message})}async prepareMessages(params){let messages=params?.messages||"";return(params?.files||[]).length>0?messages=await this.prepareMessagesWithFiles(params):params?.toolsConfig?.tools?.length>0?messages=await this.prepareMessagesWithTools(params):messages=await this.prepareMessagesWithTextQuery(params),messages}async prepareMessagesWithFiles(params){const model=params.model;let messages=params?.messages||"",systemInstruction="";const files=params?.files||[],promises=[],_files=[];for(let image of files){const binaryInput=BinaryInput.from(image);promises.push(binaryInput.upload(AccessCandidate.agent(params.agentId))),_files.push(binaryInput)}await Promise.all(promises);const validFiles=this.getValidFiles(_files,"all");if(validFiles.some(file=>file?.mimetype?.includes("video"))&&validFiles.length>1)throw new Error("Only one video file is supported at a time.");const fileUploadingTasks=validFiles.map(file=>async()=>{try{return{url:(await this.uploadFile({file,apiKey:params.credentials.apiKey,agentId:params.agentId})).url,mimetype:file.mimetype}}catch{return null}}),uploadedFiles=await processWithConcurrencyLimit(fileUploadingTasks);if(uploadedFiles&&uploadedFiles?.length===0)throw new Error("There is an issue during upload file in Google AI Server!");const fileData=this.getFileData(uploadedFiles);let prompt=(Array.isArray(messages)?messages.pop():{role:TLLMMessageRole.User,content:""})?.content||"";return MODELS_SUPPORT_SYSTEM_INSTRUCTION.includes(model)||(prompt=`${prompt}
|
|
241
|
+
`+existingContent}}else convertedMessages.unshift({role:TLLMMessageRole.User,content:systemContent})}return convertedMessages}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];return files.length>0?await this.handleFileAttachments(files,params.agentId,[...messages]):messages}}class OpenAIApiInterfaceFactory{constructor(){}createInterface(interfaceType,context2,deps){if(!context2||!deps)throw new Error("Context and dependencies (getClient(), reportUsage()) are required to create an interface");switch(interfaceType){case"responses":return new ResponsesApiInterface(context2,deps);case"chat.completions":return new ChatCompletionsApiInterface(context2,deps);default:throw new Error(`Unsupported OpenAI API interface type: ${interfaceType}. Supported types: ${this.getSupportedInterfaces().join(", ")}`)}}getSupportedInterfaces(){return["responses","chat.completions"]}isInterfaceSupported(interfaceType){return this.getSupportedInterfaces().includes(interfaceType)}getDefaultInterfaceType(){return"chat.completions"}getInterfaceTypeFromModelInfo(modelInfo){return modelInfo?.interface||this.getDefaultInterfaceType()}}var __defProp$L=Object.defineProperty,__getOwnPropDesc$s=Object.getOwnPropertyDescriptor,__defNormalProp$L=(obj,key,value)=>key in obj?__defProp$L(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$s=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$s(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$L(target,key,result),result},__publicField$L=(obj,key,value)=>__defNormalProp$L(obj,typeof key!="symbol"?key+"":key,value);const logger$e=Logger("OpenAIConnector");class OpenAIConnector extends LLMConnector{constructor(){super(),__publicField$L(this,"name","LLM:OpenAI"),__publicField$L(this,"interfaceFactory"),this.interfaceFactory=new OpenAIApiInterfaceFactory}getApiInterface(interfaceType,context2){const deps={getClient:context22=>this.getClient(context22),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};return this.interfaceFactory.createInterface(interfaceType,context2,deps)}getInterfaceType(context2){let responseInterface=this.interfaceFactory.getInterfaceTypeFromModelInfo(context2.modelInfo);return context2.toolsInfo?.openai?.webSearch?.enabled===!0&&(responseInterface="responses"),responseInterface}async getClient(context2){const apiKey=context2.credentials?.apiKey||"",baseURL=context2?.modelInfo?.baseURL;try{return new OpenAI$1({baseURL,apiKey})}catch(error){throw console.error("Error: on OpenAI client initialization",error),error}}async request({acRequest,body,context:context2}){try{logger$e.debug(`request ${this.name}`,acRequest.candidate);const _body=body;if(context2?.modelEntryName?.startsWith("legacy/")){const messages=_body?.messages||[],promptTokens=await this.computePromptTokens(messages,context2);await this.validateTokenLimit({acRequest,promptTokens,context:context2,maxTokens:_body.max_completion_tokens})}const responseInterface=this.getInterfaceType(context2),result=await this.getApiInterface(responseInterface,context2).createRequest(body,context2),message=result?.choices?.[0]?.message||{content:result?.output_text},finishReason=result?.choices?.[0]?.finish_reason||result?.incomplete_details||"stop";let toolsData=[],useTool=!1;finishReason==="tool_calls"&&(toolsData=message?.tool_calls?.map((tool,index)=>({index,id:tool?.id,type:tool?.type,name:tool?.function?.name,arguments:tool?.function?.arguments,role:"tool"}))||[],useTool=!0);const usage=result?.usage;return this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$e.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{if(logger$e.debug(`streamRequest ${this.name}`,acRequest.candidate),context2?.modelEntryName?.startsWith("legacy/")){const messages=body?.messages||body?.input||[],promptTokens=await this.computePromptTokens(messages,context2);await this.validateTokenLimit({acRequest,promptTokens,context:context2,maxTokens:body.max_completion_tokens})}const responseInterface=this.getInterfaceType(context2),apiInterface=this.getApiInterface(responseInterface,context2),stream=await apiInterface.createStream(body,context2);return apiInterface.handleStream(stream,context2)}catch(error){throw logger$e.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async imageGenRequest({acRequest,body,context:context2}){return await(await this.getClient(context2)).images.generate(body)}async imageEditRequest({acRequest,body,context:context2}){const _body=body;return await(await this.getClient(context2)).images.edit(_body)}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){let tools=[];if(toolDefinitions&&toolDefinitions.length>0){const interfaceType=modelInfo?.interface||"chat.completions",tempContext={modelEntryName:"",agentId:"",teamId:"",isUserKey:!1,modelInfo,credentials:null},deps={getClient:context2=>this.getClient(context2),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};tools=this.interfaceFactory.createInterface(interfaceType,tempContext,deps).transformToolsConfig({type,toolDefinitions,toolChoice,modelInfo})}return tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}async validateTokenLimit({acRequest,maxTokens,promptTokens,context:context2}){await(await this.getProvider(acRequest,context2.modelEntryName)).validateTokensLimit({model:context2.modelInfo,promptTokens,completionTokens:maxTokens,hasAPIKey:context2.isUserKey})}async getProvider(acRequest,modelEntryName){return ConnectorService.getModelsProviderConnector().requester(acRequest.candidate)}async computePromptTokens(messages,context2){try{if(context2?.hasFiles){const lastContent=(messages?.[messages?.length-1]||{})?.content??"";return await LLMHelper.countVisionPromptTokens(lastContent||"")}const normalized=(messages||[]).map(m=>{if(!m||!m.role)return null;let content="";if(Array.isArray(m.content))content=m.content.map(b=>typeof b?.text=="string"?b.text:"").join(" ");else if(typeof m.content=="string")content=m.content;else if(m.content!==void 0&&m.content!==null)try{content=JSON.stringify(m.content)}catch{content=""}return{role:m.role,content}}).filter(Boolean);return encodeChat(normalized,"gpt-4")?.length||0}catch{return 0}}async prepareImageGenerationBody(params){const{model,size,quality,n,responseFormat,style}=params,body={prompt:params.prompt,model,size,n:n||1};return quality&&(body.quality=quality),style&&(body.style=style),body}async prepareImageEditBody(params){const{model,size,n,responseFormat}=params,body={prompt:params.prompt,model,size,n:n||1,image:null},files=params?.files||[];if(files.length>0){const images=await Promise.all(files.map(async file=>await toFile(await file.getReadStream(),await file.getName(),{type:file.mimetype})));body.image=images[0]}return body}async reqBodyAdapter(params){if(params.capabilities?.imageGeneration===!0){const capabilityType=params?.files?.length>0?"image-edit":"image-generation";return this.prepareRequestBody(params,capabilityType)}const minimalContext={modelInfo:params.modelInfo,toolsInfo:params.toolsInfo},responseInterface=this.getInterfaceType(minimalContext);return this.prepareRequestBody(params,responseInterface)}async prepareRequestBody(params,preparationType){const minimalContext={modelInfo:params.modelInfo,modelEntryName:params.modelEntryName,agentId:params.agentId,teamId:params.teamId,isUserKey:params.isUserKey,credentials:params.credentials,hasFiles:params.files&¶ms.files.length>0,toolsInfo:params.toolsInfo},preparer={"chat.completions":async()=>this.getApiInterface("chat.completions",minimalContext).prepareRequestBody(params),responses:async()=>this.getApiInterface("responses",minimalContext).prepareRequestBody(params),"image-generation":()=>this.prepareImageGenerationBody(params),"image-edit":()=>this.prepareImageEditBody(params)}[preparationType];if(!preparer)throw new Error(`Unsupported preparation type: ${preparationType}`);return preparer()}reportUsage(usage,metadata){const modelName=metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),inputTokens=usage?.input_tokens||usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),outputTokens=usage?.output_tokens||usage?.completion_tokens||0,cachedInputTokens=usage?.input_tokens_details?.cached_tokens||usage?.prompt_tokens_details?.cached_tokens||0,usageData={sourceId:`llm:${modelName}`,input_tokens:inputTokens,output_tokens:outputTokens,input_tokens_cache_write:0,input_tokens_cache_read:cachedInputTokens,cost:usage?.cost||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}}__decorateClass$s([hookAsync("LLMConnector.request")],OpenAIConnector.prototype,"request"),__decorateClass$s([hookAsync("LLMConnector.streamRequest")],OpenAIConnector.prototype,"streamRequest");var __defProp$K=Object.defineProperty,__getOwnPropDesc$r=Object.getOwnPropertyDescriptor,__defNormalProp$K=(obj,key,value)=>key in obj?__defProp$K(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$r=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$r(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$K(target,key,result),result},__publicField$K=(obj,key,value)=>__defNormalProp$K(obj,typeof key!="symbol"?key+"":key,value);const logger$d=Logger("GoogleAIConnector"),MODELS_SUPPORT_SYSTEM_INSTRUCTION=["gemini-1.5-pro-exp-0801","gemini-1.5-pro-latest","gemini-1.5-pro-latest","gemini-1.5-pro","gemini-1.5-pro-001","gemini-1.5-flash-latest","gemini-1.5-flash-001","gemini-1.5-flash"],MODELS_SUPPORT_JSON_RESPONSE=MODELS_SUPPORT_SYSTEM_INSTRUCTION,VALID_MIME_TYPES=[...SUPPORTED_MIME_TYPES_MAP.GoogleAI.image,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.audio,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.video,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.document],IMAGE_GEN_FIXED_PRICING={"imagen-3.0-generate-001":.04,"imagen-4.0-generate-001":.04,"imagen-4":.04,"imagen-4-ultra":.06,"gemini-2.5-flash-image":.039};class GoogleAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$K(this,"name","LLM:GoogleAI"),__publicField$K(this,"validMimeTypes",{all:VALID_MIME_TYPES,image:SUPPORTED_MIME_TYPES_MAP.GoogleAI.image})}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");return new GoogleGenAI$1({apiKey})}async request({acRequest,body,context:context2}){try{logger$d.debug(`request ${this.name}`,acRequest.candidate);const promptSource=body.messages??body.contents??"",{contents,config:promptConfig}=this.normalizePrompt(promptSource),requestConfig=this.buildRequestConfig({generationConfig:body.generationConfig,systemInstruction:body.systemInstruction,promptConfig}),genAI=await this.getClient(context2),requestPayload={model:body.model,contents:contents??""};requestConfig&&(requestPayload.config=requestConfig);const response=await genAI.models.generateContent(requestPayload),content=response.text??"",finishReason=(response.candidates?.[0]?.finishReason||"stop").toLowerCase(),usage=response.usageMetadata;usage&&this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});const toolCalls=response.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);let toolsData=[],useTool=!1;return toolCalls&&toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall?.name,arguments:typeof toolCall.functionCall?.args=="string"?toolCall.functionCall?.args:JSON.stringify(toolCall.functionCall?.args??{}),role:TLLMMessageRole.Assistant,thoughtSignature:toolCall.thoughtSignature})),useTool=!0),{content,finishReason,useTool,toolsData,message:{content,role:"assistant"},usage}}catch(error){throw logger$d.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){logger$d.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,promptSource=body.messages??body.contents??"",{contents,config:promptConfig}=this.normalizePrompt(promptSource),requestConfig=this.buildRequestConfig({generationConfig:body.generationConfig,systemInstruction:body.systemInstruction,promptConfig}),genAI=await this.getClient(context2);try{const stream=await genAI.models.generateContentStream({model:body.model,contents:contents??"",...requestConfig?{config:requestConfig}:{}});let toolsData=[],usage;return(async()=>{try{for await(const chunk of stream){emitter.emit(TLLMEvent.Data,chunk);const chunkText=chunk.text??"";chunkText&&emitter.emit(TLLMEvent.Content,chunkText);const toolCalls=chunk.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);toolCalls&&toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall?.name,arguments:typeof toolCall.functionCall?.args=="string"?toolCall.functionCall?.args:JSON.stringify(toolCall.functionCall?.args??{}),role:TLLMMessageRole.Assistant,thoughtSignature:toolCall.thoughtSignature})),emitter.emit(TLLMEvent.ToolInfo,toolsData)),chunk.usageMetadata&&(usage=chunk.usageMetadata)}const finishReason="stop",reportedUsage=[];if(usage){const reported=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});reportedUsage.push(reported)}setTimeout(()=>{emitter.emit(TLLMEvent.End,toolsData,reportedUsage,finishReason)},100)}catch(error){logger$d.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit(TLLMEvent.Error,error)}})(),emitter}catch(error){throw logger$d.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async imageGenRequest({body,context:context2}){const apiKey=context2.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");const model=body.model||"imagen-3.0-generate-001",modelName=context2.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),config2={numberOfImages:body.n||1,aspectRatio:body.aspect_ratio||body.size||"1:1",personGeneration:body.person_generation||"allow_adult"},ai=new GoogleGenAI$1({apiKey}),modelInterface=context2.modelInfo?.interface||LLMInterface.GenerateImages;let response;if(modelInterface===LLMInterface.GenerateContent){response=await ai.models.generateContent({model,contents:body.prompt});const imageData=[];if(response.candidates?.[0]?.content?.parts)for(const part of response.candidates[0].content.parts)part.inlineData?.data&&imageData.push({url:`data:image/png;base64,${part.inlineData.data}`,b64_json:part.inlineData.data,revised_prompt:body.prompt});const usageMetadata=response?.usageMetadata;if(this.reportImageUsage({usage:{cost:IMAGE_GEN_FIXED_PRICING[modelName],usageMetadata},context:context2}),imageData.length===0)throw new Error('Please enter a valid prompt \u2014 for example: "Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme."');return{created:Math.floor(Date.now()/1e3),data:imageData}}else if(modelInterface===LLMInterface.GenerateImages){response=await ai.models.generateImages({model,prompt:body.prompt,config:config2});const usageMetadata=response?.usageMetadata;return this.reportImageUsage({usage:{cost:IMAGE_GEN_FIXED_PRICING[modelName],usageMetadata},numberOfImages:config2.numberOfImages,context:context2}),{created:Math.floor(Date.now()/1e3),data:response.generatedImages?.map(generatedImage=>({url:generatedImage.image.imageBytes?`data:image/png;base64,${generatedImage.image.imageBytes}`:void 0,b64_json:generatedImage.image.imageBytes,revised_prompt:body.prompt}))||[]}}else throw new Error(`Unsupported interface: ${modelInterface}`)}async imageEditRequest({body,context:context2}){const apiKey=context2.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");if(context2.modelInfo?.interface!==LLMInterface.GenerateContent)throw new Error(`Image editing is not supported for model: ${body.model}. This model only supports image generation.`);const ai=new GoogleGenAI$1({apiKey}),modelName=context2.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),response=await ai.models.generateContent({model:body.model,contents:body.contents}),imageData=[];if(response.candidates?.[0]?.content?.parts)for(const part of response.candidates[0].content.parts)part.inlineData?.data&&imageData.push({url:`data:image/png;base64,${part.inlineData.data}`,b64_json:part.inlineData.data,revised_prompt:body._metadata?.prompt||body.prompt});const usageMetadata=response?.usageMetadata;return this.reportImageUsage({usage:{cost:IMAGE_GEN_FIXED_PRICING[modelName],usageMetadata},context:context2}),{created:Math.floor(Date.now()/1e3),data:imageData}}async reqBodyAdapter(params){const model=params?.model;if(params?.capabilities?.imageGeneration)return params?.files?.length>0?this.prepareImageEditBody(params):this.prepareBodyForImageGenRequest(params);const messages=await this.prepareMessages(params),body={model,messages},responseFormat=params?.responseFormat||"";let responseMimeType="",systemInstruction="";responseFormat==="json"&&(systemInstruction+=JSON_RESPONSE_INSTRUCTION,MODELS_SUPPORT_JSON_RESPONSE.includes(model)&&(responseMimeType="application/json"));const config2={};return params.maxTokens!==void 0&&(config2.maxOutputTokens=params.maxTokens),params.temperature!==void 0&&(config2.temperature=params.temperature),params.topP!==void 0&&(config2.topP=params.topP),params.topK!==void 0&&(config2.topK=params.topK),params.stopSequences?.length&&(config2.stopSequences=params.stopSequences),responseMimeType&&(config2.responseMimeType=responseMimeType),params.modelEntryName?.includes("gemini-3")&¶ms?.reasoningEffort&&(config2.thinkingConfig={thinkingLevel:params.reasoningEffort}),systemInstruction&&(body.systemInstruction=systemInstruction),Object.keys(config2).length>0&&(body.generationConfig=config2),body}normalizePrompt(prompt){if(prompt==null)return{contents:""};if(typeof prompt=="string"||Array.isArray(prompt))return{contents:prompt};if(typeof prompt=="object"&&"contents"in prompt){const{contents,systemInstruction,tools,toolConfig}=prompt,config2={};return systemInstruction&&(config2.systemInstruction=systemInstruction),tools&&(config2.tools=tools),toolConfig&&(config2.toolConfig=toolConfig),{contents,config:Object.keys(config2).length>0?config2:void 0}}return{contents:prompt}}buildRequestConfig({generationConfig,systemInstruction,promptConfig}){const config2={};if(generationConfig)for(const[key,value]of Object.entries(generationConfig))value!==void 0&&(config2[key]=value);return promptConfig?.tools&&(config2.tools=promptConfig.tools),promptConfig?.toolConfig&&(config2.toolConfig=promptConfig.toolConfig),promptConfig?.systemInstruction?config2.systemInstruction=promptConfig.systemInstruction:systemInstruction&&(config2.systemInstruction=systemInstruction),Object.keys(config2).length>0?config2:void 0}reportUsage(usage,metadata){const modelName=metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"");let inputTokens=usage?.promptTokenCount||0;const outputTokens=(usage?.candidatesTokenCount||0)+(usage?.thoughtsTokenCount||0);let cachedInputTokens=usage?.cachedContentTokenCount||0;cachedInputTokens&&(inputTokens=inputTokens-cachedInputTokens);const tierThresholds={"gemini-1.5-pro":128e3,"gemini-2.5-pro":2e5,"gemini-3-pro":2e5};let inTier="",outTier="",crTier="";const modelWithTier=Object.keys(tierThresholds).find(model=>modelName.includes(model));modelWithTier&&(inTier=inputTokens<=tierThresholds[modelWithTier]?"tier1":"tier2",outTier=outputTokens<=tierThresholds[modelWithTier]?"tier1":"tier2",crTier=cachedInputTokens<=tierThresholds[modelWithTier]?"tier1":"tier2");let audioInputTokens=0,cachedAudioInputTokens=0;["gemini-2.5-flash"].includes(modelName)&&(audioInputTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="AUDIO")?.tokenCount||0,cachedAudioInputTokens=usage?.cacheTokensDetails?.find(detail=>detail.modality==="AUDIO")?.tokenCount||0,cachedAudioInputTokens&&(audioInputTokens=audioInputTokens-cachedAudioInputTokens,cachedInputTokens=cachedInputTokens-cachedAudioInputTokens),inputTokens=inputTokens-audioInputTokens);const usageData={sourceId:`llm:${modelName}`,input_tokens:inputTokens,output_tokens:outputTokens,input_tokens_audio:audioInputTokens,input_tokens_cache_read:cachedInputTokens,input_tokens_cache_read_audio:cachedAudioInputTokens,input_tokens_cache_write:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId,inTier,outTier,crTier};return SystemEvents.emit("USAGE:LLM",usageData),usageData}extractTokenCounts(usage){const textTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="TEXT")?.tokenCount||0,imageTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="IMAGE")?.tokenCount||0;return{textTokens,imageTokens}}reportImageUsage({usage,context:context2,numberOfImages=1}){let input_tokens_txt=0,input_tokens_img=0;if(usage.usageMetadata){const{textTokens,imageTokens}=this.extractTokenCounts(usage.usageMetadata);input_tokens_txt=textTokens,input_tokens_img=imageTokens}const imageUsageData={sourceId:"api:imagegen.smyth",keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,cost:usage.cost*numberOfImages,input_tokens_txt,input_tokens_img,agentId:context2.agentId,teamId:context2.teamId};SystemEvents.emit("USAGE:API",imageUsageData)}formatToolsConfig({toolDefinitions,toolChoice="auto"}){return{tools:toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool,validName=this.sanitizeFunctionName(name),validProperties=properties&&Object.keys(properties).length>0?properties:{dummy:{type:"string"}};return{functionDeclarations:[{name:validName,description:description||"",parameters:{type:"OBJECT",properties:validProperties,required:requiredFields||[]}}]}}),toolChoice:{type:toolChoice}}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[],parseFunctionArgs=args=>{if(typeof args=="string")try{return JSON.parse(args)}catch{return args}return args??{}},parseFunctionResponse=response=>{if(typeof response=="string")try{const parsed=JSON.parse(response);return typeof parsed=="string"&&parsed!==response?parseFunctionResponse(parsed):parsed}catch{return response}return response??{}};if(messageBlock){const content=[];if(Array.isArray(messageBlock.parts)&&messageBlock.parts.length>0){for(const part of messageBlock.parts)if(part){if(typeof part.text=="string"&&part.text.trim()){content.push({text:part.text.trim()});continue}if(part.functionCall){const functionCallPart={functionCall:{name:part.functionCall.name,args:parseFunctionArgs(part.functionCall.args)}};part.thoughtSignature&&(functionCallPart.thoughtSignature=part.thoughtSignature),content.push(functionCallPart);continue}if(part.functionResponse){content.push({functionResponse:{name:part.functionResponse.name,response:parseFunctionResponse(part.functionResponse.response)}});continue}part.inlineData&&content.push({inlineData:part.inlineData})}}else typeof messageBlock.content=="string"&&messageBlock.content.trim()?content.push({text:messageBlock.content.trim()}):Array.isArray(messageBlock.content)&&messageBlock.content.length>0&&content.push(...messageBlock.content);if(!content.some(part=>part.functionCall)&&toolsData.length>0&&toolsData.forEach(toolCall=>{const functionCallPart={functionCall:{name:toolCall.name,args:parseFunctionArgs(toolCall.arguments)}};toolCall.thoughtSignature&&(functionCallPart.thoughtSignature=toolCall.thoughtSignature),content.push(functionCallPart)}),content.length>0){let role=messageBlock.role;role===TLLMMessageRole.Assistant&&(role=TLLMMessageRole.Model),messageBlocks.push({role,parts:content})}}const functionResponseParts=toolsData.filter(toolData=>toolData.result!==void 0).map(toolData=>({functionResponse:{name:toolData.name,response:parseFunctionResponse(toolData.result)}}));return functionResponseParts.length>0&&messageBlocks.push({role:TLLMMessageRole.Function,parts:functionResponseParts}),messageBlocks}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message},parseFunctionArgs=args=>{if(typeof args=="string")try{return JSON.parse(args)}catch{return args}return args??{}},parseFunctionResponse=response=>{if(typeof response=="string")try{return JSON.parse(response)}catch{return response}return response},pushTextPart=(parts,text)=>{const value=typeof text=="string"&&text.trim()?text:void 0;value&&parts.push({text:value})},normalizedParts=[];switch(_message.role){case TLLMMessageRole.Assistant:case TLLMMessageRole.System:case TLLMMessageRole.Model:_message.role=TLLMMessageRole.Model;break;case TLLMMessageRole.Function:case TLLMMessageRole.Tool:_message.role=TLLMMessageRole.Function;break;case TLLMMessageRole.User:break;default:_message.role=TLLMMessageRole.User}if(Array.isArray(message?.parts))for(const part of message.parts){if(!part)continue;const normalizedPart={...part};typeof normalizedPart.text=="string"&&(normalizedPart.text=normalizedPart.text.trim()||"..."),part.functionCall&&(normalizedPart.functionCall={name:part.functionCall.name,args:parseFunctionArgs(part.functionCall.args)},part.thoughtSignature&&(normalizedPart.thoughtSignature=part.thoughtSignature)),part.functionResponse&&(normalizedPart.functionResponse={name:part.functionResponse.name,response:parseFunctionResponse(part.functionResponse.response)}),Object.values(normalizedPart).some(value=>value!=null&&value!=="")&&normalizedParts.push(normalizedPart)}if(!normalizedParts.length&&Array.isArray(message?.content)){for(const contentPart of message.content)if(contentPart){if(typeof contentPart=="string")pushTextPart(normalizedParts,contentPart);else if(typeof contentPart=="object")if("text"in contentPart&&typeof contentPart.text=="string")pushTextPart(normalizedParts,contentPart.text);else if("functionCall"in contentPart&&contentPart.functionCall){const functionCallPart=contentPart.functionCall,normalizedFunctionCall={functionCall:{name:functionCallPart.name,args:parseFunctionArgs(functionCallPart.args)}};contentPart.thoughtSignature&&(normalizedFunctionCall.thoughtSignature=contentPart.thoughtSignature),normalizedParts.push(normalizedFunctionCall)}else if("functionResponse"in contentPart&&contentPart.functionResponse){const functionResponsePart=contentPart.functionResponse;normalizedParts.push({functionResponse:{name:functionResponsePart.name,response:parseFunctionResponse(functionResponsePart.response)}})}else{const fallbackText=typeof contentPart?.toString=="function"?contentPart.toString():"";fallbackText&&fallbackText!=="[object Object]"&&pushTextPart(normalizedParts,fallbackText)}}}if(!normalizedParts.length){if(typeof message?.content=="string")pushTextPart(normalizedParts,message.content);else if(message?.content&&typeof message.content=="object")if("text"in message.content)pushTextPart(normalizedParts,message.content.text);else{const fallbackText=typeof message.content?.toString=="function"?message.content.toString():"";fallbackText&&fallbackText!=="[object Object]"&&pushTextPart(normalizedParts,fallbackText)}}if(Array.isArray(message?.tool_calls)&&message.tool_calls.length>0)for(const toolCall of message.tool_calls){if(!toolCall?.function?.name)continue;const normalizedFunctionCall={functionCall:{name:toolCall.function.name,args:parseFunctionArgs(toolCall.function.arguments)}};toolCall.thoughtSignature&&(normalizedFunctionCall.thoughtSignature=toolCall.thoughtSignature),normalizedParts.push(normalizedFunctionCall)}return normalizedParts.length||normalizedParts.push({text:"..."}),_message.parts=normalizedParts,delete _message.content,delete _message.tool_calls,_message})}async prepareMessages(params){let messages=params?.messages||"";return(params?.files||[]).length>0?messages=await this.prepareMessagesWithFiles(params):params?.toolsConfig?.tools?.length>0?messages=await this.prepareMessagesWithTools(params):messages=await this.prepareMessagesWithTextQuery(params),messages}async prepareMessagesWithFiles(params){const model=params.model;let messages=params?.messages||"",systemInstruction="";const files=params?.files||[],promises=[],_files=[];for(let image of files){const binaryInput=BinaryInput.from(image);promises.push(binaryInput.upload(AccessCandidate.agent(params.agentId))),_files.push(binaryInput)}await Promise.all(promises);const validFiles=this.getValidFiles(_files,"all");if(validFiles.some(file=>file?.mimetype?.includes("video"))&&validFiles.length>1)throw new Error("Only one video file is supported at a time.");const fileUploadingTasks=validFiles.map(file=>async()=>{try{return{url:(await this.uploadFile({file,apiKey:params.credentials.apiKey,agentId:params.agentId})).url,mimetype:file.mimetype}}catch{return null}}),uploadedFiles=await processWithConcurrencyLimit(fileUploadingTasks);if(uploadedFiles&&uploadedFiles?.length===0)throw new Error("There is an issue during upload file in Google AI Server!");const fileData=this.getFileData(uploadedFiles);let prompt=(Array.isArray(messages)?messages.pop():{role:TLLMMessageRole.User,content:""})?.content||"";return MODELS_SUPPORT_SYSTEM_INSTRUCTION.includes(model)||(prompt=`${prompt}
|
|
202
242
|
${systemInstruction}`),messages=fileData.length===1?[...fileData,{text:prompt}]:[prompt,...fileData],messages}async prepareMessagesWithTools(params){let formattedMessages,systemInstruction="",messages=params?.messages||[];if(LLMHelper.hasSystemMessage(messages)){const separateMessages=LLMHelper.separateSystemMessages(messages),systemMessageContent=separateMessages.systemMessage?.content;systemInstruction=typeof systemMessageContent=="string"?systemMessageContent:"",formattedMessages=separateMessages.otherMessages}else formattedMessages=messages;const toolsPrompt={contents:formattedMessages};if(systemInstruction&&(toolsPrompt.systemInstruction=systemInstruction),params?.toolsConfig?.tools&&(toolsPrompt.tools=params?.toolsConfig?.tools),params?.toolsConfig?.tool_choice){const toolConfig=toolsPrompt.toolConfig??{functionCallingConfig:{}},functionConfig=toolConfig.functionCallingConfig??{},toolChoice=params?.toolsConfig?.tool_choice;if(toolChoice==="auto")functionConfig.mode=FunctionCallingConfigMode.AUTO;else if(toolChoice==="required")functionConfig.mode=FunctionCallingConfigMode.ANY;else if(toolChoice==="none")functionConfig.mode=FunctionCallingConfigMode.NONE;else if(typeof toolChoice=="object"&&toolChoice.type==="function"){functionConfig.mode=FunctionCallingConfigMode.ANY;const functionName=this.sanitizeFunctionName(toolChoice.function?.name??"");functionName&&(functionConfig.allowedFunctionNames=[functionName])}else functionConfig.mode=FunctionCallingConfigMode.AUTO;toolConfig.functionCallingConfig=functionConfig,toolsPrompt.toolConfig=toolConfig}return toolsPrompt}async prepareMessagesWithTextQuery(params){const model=params.model;let systemInstruction="",prompt="";const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(params?.messages);return"content"in systemMessage&&(systemInstruction=systemMessage.content),(params?.responseFormat||"")==="json"&&(systemInstruction+=JSON_RESPONSE_INSTRUCTION,MODELS_SUPPORT_JSON_RESPONSE.includes(model)),otherMessages?.length>0&&(prompt+=otherMessages.map(message=>message?.parts?.[0]?.text||"").join(`
|
|
203
243
|
`)),MODELS_SUPPORT_SYSTEM_INSTRUCTION.includes(model)||(prompt=`${prompt}
|
|
204
|
-
${systemInstruction}`),prompt}async prepareBodyForImageGenRequest(params){return{prompt:params.prompt,model:params.model,aspectRatio:params.aspectRatio,personGeneration:params.personGeneration}}async prepareImageEditBody(params){const model=params.model||"gemini-2.5-flash-image-preview";let editPrompt=params.prompt||"Edit this image";params.instruction&&(editPrompt+=`. ${params.instruction}`);const contents=[],files=params?.files||[];if(files.length>0){const validImageFiles=this.getValidFiles(files,"image");if(validImageFiles.length===0)throw new Error("No valid image files found for editing. Please provide at least one image file.");for(const file of validImageFiles)try{const bufferData=await file.getBuffer(),base64Image=Buffer.from(bufferData).toString("base64");contents.push({inlineData:{mimeType:file.mimetype,data:base64Image}})}catch(error){throw new Error(`Failed to process image file: ${error.message}`)}}else throw new Error("No image provided for editing. Please include an image file.");return contents.push({text:editPrompt}),{model,contents,_metadata:{prompt:editPrompt,numberOfImages:params.n||1,aspectRatio:params.aspect_ratio||params.size||"1:1",personGeneration:params.person_generation||"allow_adult"}}}sanitizeFunctionName(name){if(name==null)return"_unnamed_function";let sanitized=name.replace(/[^a-zA-Z0-9_.-]/g,"");return/^[a-zA-Z_]/.test(sanitized)||(sanitized="_"+sanitized),sanitized===""&&(sanitized="_unnamed_function"),sanitized=sanitized.slice(0,64),sanitized}async uploadFile({file,apiKey,agentId}){try{if(!apiKey||!file?.mimetype)throw new Error("Missing required parameters to save file for Google AI!");const tempDir=os.tmpdir(),fileName=uid(),tempFilePath=path.join(tempDir,fileName),bufferData=await file.readData(AccessCandidate.agent(agentId));await fs__default.promises.writeFile(tempFilePath,new Uint8Array(bufferData));const ai=new GoogleGenAI({apiKey}),uploadResponse=await ai.files.upload({file:tempFilePath,config:{mimeType:file.mimetype,displayName:fileName}}),name=uploadResponse.name;if(!name)throw new Error("File upload did not return a file name.");let uploadedFile=uploadResponse;for(;uploadedFile.state===FileState.PROCESSING;)process.stdout.write("."),await new Promise(resolve=>setTimeout(resolve,1e4)),uploadedFile=await ai.files.get({name});if(uploadedFile.state===FileState.FAILED)throw new Error("File processing failed.");return await fs__default.promises.unlink(tempFilePath),{url:uploadedFile.uri||""}}catch(error){throw new Error(`Error uploading file for Google AI: ${error.message}`)}}getValidFiles(files,type){const validSources=[];for(let file of files)this.validMimeTypes[type].includes(file?.mimetype)&&validSources.push(file);if(validSources?.length===0)throw new Error(`Unsupported file(s). Please make sure your file is one of the following types: ${this.validMimeTypes[type].join(", ")}`);return validSources}getFileData(files){try{const imageData=[];for(let file of files)imageData.push({fileData:{mimeType:file.mimetype,fileUri:file.url}});return imageData}catch(error){throw error}}}__decorateClass$r([hookAsync("LLMConnector.request")],GoogleAIConnector.prototype,"request"),__decorateClass$r([hookAsync("LLMConnector.streamRequest")],GoogleAIConnector.prototype,"streamRequest");var __defProp$M=Object.defineProperty,__getOwnPropDesc$q=Object.getOwnPropertyDescriptor,__defNormalProp$M=(obj,key,value)=>key in obj?__defProp$M(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$q=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$q(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$M(target,key,result),result},__publicField$M=(obj,key,value)=>__defNormalProp$M(obj,typeof key!="symbol"?key+"":key,value);const logger$c=Logger("AnthropicConnector"),PREFILL_TEXT_FOR_JSON_RESPONSE="{",LEGACY_THINKING_MODELS=["smythos/claude-3.7-sonnet-thinking","claude-3.7-sonnet-thinking"];class AnthropicConnector extends LLMConnector{constructor(){super(...arguments),__publicField$M(this,"name","LLM:Anthropic"),__publicField$M(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.Anthropic.image)}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Anthropic");return new Anthropic({apiKey})}async request({acRequest,body,context:context2}){try{logger$c.debug(`request ${this.name}`,acRequest.candidate);const result=await(await this.getClient(context2)).messages.create(body),message={role:result?.role||TLLMMessageRole.User,content:result?.content||""},stopReason=result?.stop_reason;let toolsData=[],useTool=!1;if(stopReason==="tool_use"){const toolUseContentBlocks=result?.content?.filter(c=>c.type==="tool_use");if(toolUseContentBlocks?.length===0)return;toolUseContentBlocks.forEach((toolUseBlock,index)=>{toolsData.push({index,id:toolUseBlock?.id,type:"function",name:toolUseBlock?.name,arguments:toolUseBlock?.input,role:result?.role})}),useTool=!0}let content=result?.content?.find(block=>block.type==="text")?.text||"";const usage=result?.usage;return this.hasPrefillText(body.messages)&&(content=`${PREFILL_TEXT_FOR_JSON_RESPONSE}${content}`),this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content,finishReason:result?.stop_reason,useTool,toolsData,message,usage}}catch(error){throw logger$c.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$c.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,usage_data=[];let stream=(await this.getClient(context2)).messages.stream(body),toolsData=[],thinkingBlocks=[];const needsPrefillInjection=this.hasPrefillText(body.messages);let prefillInjected=!1;return stream.on("streamEvent",event=>{event.message?.usage}),stream.on("error",error=>{emitter.emit("error",error)}),stream.on("text",text=>{needsPrefillInjection&&!prefillInjected&&(text=`${PREFILL_TEXT_FOR_JSON_RESPONSE}${text}`,prefillInjected=!0),emitter.emit("content",text)}),stream.on("thinking",thinking=>{emitter.emit("thinking",thinking)}),stream.on("finalMessage",finalMessage=>{let finishReason="stop";thinkingBlocks=finalMessage.content.filter(block=>block.type==="thinking"||block.type==="redacted_thinking");const toolUseContentBlocks=finalMessage.content.filter(c=>c.type==="tool_use");if(toolUseContentBlocks?.length>0?(toolUseContentBlocks.forEach((toolUseBlock,index)=>{toolsData.push({index,id:toolUseBlock?.id,type:"function",name:toolUseBlock?.name,arguments:toolUseBlock?.input,role:finalMessage?.role})}),emitter.emit(TLLMEvent.ToolInfo,toolsData,thinkingBlocks)):finishReason=finalMessage.stop_reason,finalMessage?.usage){const usage=finalMessage.usage,reportedUsage=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});usage_data.push(reportedUsage)}finishReason!=="stop"&&finishReason!=="end_turn"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,usage_data,finishReason)},100)}),emitter}catch(error){throw logger$c.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){const body=await this.prepareBody(params);return await this.shouldUseThinkingMode(params)?await this.prepareBodyForThinkingRequest({body,maxThinkingTokens:params.maxThinkingTokens,toolChoice:params?.toolsConfig?.tool_choice}):body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.input_tokens,output_tokens:usage.output_tokens,input_tokens_cache_write:usage.cache_creation_input_tokens,input_tokens_cache_read:usage.cache_read_input_tokens,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{name,description,input_schema:{type:"object",properties,required:requiredFields}}})),tools?.length>0?{tools}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];if(messageBlock.thinkingBlocks?.length>0&&content.push(...messageBlock.thinkingBlocks),Array.isArray(messageBlock.content)?content.push(...messageBlock.content):messageBlock.content&&content.push({type:"text",text:messageBlock.content}),messageBlock.tool_calls){const calls=messageBlock.tool_calls.map(toolCall=>{const args=toolCall?.function?.arguments;return{type:"tool_use",id:toolCall.id,name:toolCall?.function?.name,input:typeof args=="string"?JSONContent(args||"{}").tryParse():args||{}}});content.push(...calls)}messageBlocks.push({role:messageBlock?.role,content})}const toolResultsContent=toolsData.map(toolData=>({type:"tool_result",tool_use_id:toolData.id,content:toolData.result}));return toolResultsContent.length>0&&messageBlocks.push({role:TLLMMessageRole.User,content:toolResultsContent}),messageBlocks}getConsistentMessages(messages){let _messages=JSON.parse(JSON.stringify(messages)),systemMessage=null;return _messages[0]?.role===TLLMMessageRole.System&&(systemMessage=_messages.shift()),_messages=LLMHelper.removeDuplicateUserMessages(_messages),_messages=_messages.map(message=>{let content;return message?.parts?content=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?Array.isArray(message.content)?message.content.filter(item=>typeof item=="object"&&"type"in item&&(item.type==="tool_use"||item.type==="tool_result"))?.length>0?content=message.content.map(item=>item.type==="text"&&(!item.text||item.text.trim()==="")?{...item,text:"..."}:item):content=message.content.map(block=>block?.text||"").join(" ").trim():content=message.content:message?.content&&(content=message.content),message.content=content||"...",message}),_messages[0]?.role===TLLMMessageRole.User&&Array.isArray(_messages[0].content)&&_messages[0].content.find(content=>"type"in content&&content.type==="tool_result")&&_messages.shift(),_messages[0]?.role!==TLLMMessageRole.User&&_messages.unshift({role:TLLMMessageRole.User,content:"continue"}),systemMessage&&systemMessage.content&&_messages.unshift(systemMessage),_messages}async prepareBody(params){let messages=await this.prepareMessages(params),body={model:params.model,messages,max_tokens:params.maxTokens};const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);if("content"in systemMessage&&(body.system=systemMessage?.content),messages=otherMessages,(params?.responseFormat||"")==="json"&&(body.system=body.system?`${body.system} ${JSON_RESPONSE_INSTRUCTION}`:JSON_RESPONSE_INSTRUCTION,messages.push({role:TLLMMessageRole.Assistant,content:PREFILL_TEXT_FOR_JSON_RESPONSE})),LLMHelper.hasSystemMessage(messages)){const{systemMessage:systemMessage2,otherMessages:otherMessages2}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage2&&(body.system=await this.prepareSystemPrompt(systemMessage2,params)),messages=otherMessages2}const isReasoningModel=params?.capabilities?.reasoning;params?.temperature!==void 0&&!isReasoningModel&&(body.temperature=params.temperature),params?.topP!==void 0&&!isReasoningModel&&(body.top_p=params.topP),params?.topK!==void 0&&!isReasoningModel&&(body.top_k=params.topK),params?.stopSequences?.length&&(body.stop_sequences=params.stopSequences),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools.length>0&&(body.tools=params?.toolsConfig?.tools,params?.cache&&(body.tools[body.tools.length-1].cache_control={type:"ephemeral"}));const toolChoice=params?.toolsConfig?.tool_choice;return toolChoice&&(body.tool_choice=toolChoice),body.messages=messages,body}async prepareBodyForThinkingRequest({body,maxThinkingTokens,toolChoice=null}){let messages=body.messages.filter(message=>!(message?.role===TLLMMessageRole.Assistant&&message?.content===PREFILL_TEXT_FOR_JSON_RESPONSE)),budget_tokens=Math.min(maxThinkingTokens,body.max_tokens);budget_tokens===body.max_tokens&&(budget_tokens=Math.floor(budget_tokens*.8));const thinkingBody={model:body.model,messages,max_tokens:body.max_tokens,thinking:{type:"enabled",budget_tokens}};return toolChoice&&(["any","tool"].includes(toolChoice.type)?thinkingBody.tool_choice={type:"auto"}:thinkingBody.tool_choice=toolChoice),thinkingBody}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];if(files?.length>0){const promises=[],_files=[];for(let image of files){const binaryInput=BinaryInput.from(image);promises.push(binaryInput.upload(AccessCandidate.agent(params.agentId))),_files.push(binaryInput)}await Promise.all(promises);const validSources=this.getValidImageFiles(_files),imageData=await this.getImageData(validSources,params.agentId),content=[{type:"text",text:(Array.isArray(messages)?messages.pop():{})?.content||""},...imageData];messages.push({role:TLLMMessageRole.User,content})}return messages}async prepareSystemPrompt(systemMessage,params){let systemPrompt=systemMessage?.content;return typeof systemPrompt=="string"&&(systemPrompt=[{type:"text",text:systemPrompt}]),systemPrompt.unshift({type:"text",text:'If you need to call a function, Do NOT inform the user that you are about to do so, and do not thank the user after you get the response. Just say something like "Give me a moment...", then when you get the response, Just continue answering the user without saying anything about the function you just called'}),params?.cache&&(systemPrompt[systemPrompt.length-1].cache_control={type:"ephemeral"}),systemPrompt}async shouldUseThinkingMode(params){return LEGACY_THINKING_MODELS.includes(params.modelEntryName)?!0:params?.useReasoning&¶ms.capabilities?.reasoning===!0}getValidImageFiles(files){const validSources=[];for(let file of files)this.validImageMimeTypes.includes(file?.mimetype)&&validSources.push(file);if(validSources?.length===0)throw new Error(`Unsupported file(s). Please make sure your file is one of the following types: ${this.validImageMimeTypes.join(", ")}`);return validSources}async getImageData(files,agentId){try{const imageData=[];for(let file of files){const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64");imageData.push({type:"image",source:{type:"base64",data:base64Data,media_type:file.mimetype}})}return imageData}catch(error){throw error}}hasPrefillText(messages){for(let i=messages.length-1;i>=0;i--){const message=messages[i];if(message?.role===TLLMMessageRole.Assistant&&message?.content===PREFILL_TEXT_FOR_JSON_RESPONSE)return!0}return!1}}__decorateClass$q([hookAsync("LLMConnector.request")],AnthropicConnector.prototype,"request"),__decorateClass$q([hookAsync("LLMConnector.streamRequest")],AnthropicConnector.prototype,"streamRequest");var __defProp$L=Object.defineProperty,__getOwnPropDesc$p=Object.getOwnPropertyDescriptor,__defNormalProp$L=(obj,key,value)=>key in obj?__defProp$L(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$p=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$p(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$L(target,key,result),result},__publicField$L=(obj,key,value)=>__defNormalProp$L(obj,key+"",value);const logger$b=Logger("GroqConnector"),MODELS_WITHOUT_REASONING_EFFORT_SUPPORT=["deepseek-r1-distill-llama-70b"];class GroqConnector extends LLMConnector{constructor(){super(...arguments),__publicField$L(this,"name","LLM:Groq")}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Groq");return new Groq({apiKey})}async request({acRequest,body,context:context2}){try{logger$b.debug(`request ${this.name}`,acRequest.candidate);const result=await(await this.getClient(context2)).chat.completions.create(body),message=result?.choices?.[0]?.message,finishReason=result?.choices?.[0]?.finish_reason,toolCalls=message?.tool_calls,usage=result.usage;this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});let toolsData=[],useTool=!1;return toolCalls&&(toolsData=toolCalls.map((tool,index)=>({index,id:tool.id,type:tool.type,name:tool.function.name,arguments:tool.function.arguments,role:TLLMMessageRole.Assistant})),useTool=!0),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$b.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$b.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,usage_data=[],stream=await(await this.getClient(context2)).chat.completions.create({...body,stream:!0,stream_options:{include_usage:!0}});let toolsData=[];return(async()=>{for await(const chunk of stream){const delta=chunk.choices[0]?.delta,usage=chunk.x_groq?.usage||chunk.usage;usage&&usage_data.push(usage),emitter.emit("data",delta),delta?.content&&emitter.emit("content",delta.content),delta?.tool_calls&&delta.tool_calls.forEach((toolCall,index)=>{toolsData[index]?toolsData[index].arguments+=toolCall.function?.arguments||"":toolsData[index]={index,id:toolCall.id,type:toolCall.type,name:toolCall.function?.name,arguments:toolCall.function?.arguments,role:"assistant"}})}toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),usage_data.forEach(usage=>{this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId})}),setTimeout(()=>{emitter.emit("end",toolsData)},100)})(),emitter}catch(error){throw logger$b.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){const messages=params?.messages||[],body={model:params.model,messages};(params?.responseFormat||"")==="json"&&(messages?.[0]?.role==="system"?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:"system",content:JSON_RESPONSE_INSTRUCTION}));const allowReasoning=params.useReasoning&¶ms.capabilities?.reasoning;return params.maxTokens!==void 0&&(allowReasoning?body.max_completion_tokens=params.maxTokens:body.max_tokens=params.maxTokens),params.temperature!==void 0&&(body.temperature=params.temperature),params.topP!==void 0&&(body.top_p=params.topP),params.stopSequences?.length&&(body.stop=params.stopSequences),params.toolsConfig?.tools&&(body.tools=params.toolsConfig?.tools),params.toolsConfig?.tool_choice&&(body.tool_choice=params.toolsConfig?.tool_choice),allowReasoning&&isValidGroqReasoningEffort(params?.reasoningEffort)&&!MODELS_WITHOUT_REASONING_EFFORT_SUPPORT.includes(params?.modelEntryName)&¶ms.reasoningEffort!==void 0&&(body.reasoning_effort=params.reasoningEffort),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),output_tokens:usage?.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice}:{}}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$p([hookAsync("LLMConnector.request")],GroqConnector.prototype,"request"),__decorateClass$p([hookAsync("LLMConnector.streamRequest")],GroqConnector.prototype,"streamRequest");function isValidGroqReasoningEffort(value){return["none","default","low","medium","high"].includes(value)}var __defProp$K=Object.defineProperty,__getOwnPropDesc$o=Object.getOwnPropertyDescriptor,__defNormalProp$K=(obj,key,value)=>key in obj?__defProp$K(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$o=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$o(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$K(target,key,result),result},__publicField$K=(obj,key,value)=>__defNormalProp$K(obj,key+"",value);const logger$a=Logger("BedrockConnector");class BedrockConnector extends LLMConnector{constructor(){super(...arguments),__publicField$K(this,"name","LLM:Bedrock")}async getClient(params){const credentials=params.credentials,region=params.modelInfo.settings.region;if(!(Object.keys(credentials).length>=2))throw new Error("Access key ID and secret access key are required for Bedrock");return new BedrockRuntimeClient({region,credentials})}async request({acRequest,body,context:context2}){try{logger$a.debug(`request ${this.name}`,acRequest.candidate);const bedrock=await this.getClient(context2),command=new ConverseCommand(body),response=await bedrock.send(command),usage=response.usage;this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});const message=response.output?.message,finishReason=response.stopReason;let toolsData=[],useTool=!1;return finishReason==="tool_use"&&(toolsData=(message?.content?.filter(block=>block?.toolUse)||[]).map((block,index)=>({index,id:block.toolUse?.toolUseId,type:"function",name:_deserializeToolName(block.toolUse?.name),arguments:block.toolUse?.input,role:"tool"})),useTool=!0),{content:Array.isArray(message?.content)?message?.content?.[0]?.text||"":message?.content||"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$a.error(`request ${this.name}`,error,acRequest.candidate),error?.error||error}}async streamRequest({acRequest,body,context:context2}){const emitter=new EventEmitter$1;try{logger$a.debug(`streamRequest ${this.name}`,acRequest.candidate);const bedrock=await this.getClient(context2),command=new ConverseStreamCommand(body),stream=(await bedrock.send(command)).stream;return stream&&(async()=>{let currentMessage={role:"",content:"",toolCalls:[],currentToolCall:null,currentToolInput:""};for await(const chunk of stream){if(chunk.messageStart&&(currentMessage.role=chunk.messageStart.role||"",emitter.emit("data",{role:currentMessage.role})),chunk.contentBlockDelta?.delta?.text&&(currentMessage.content+=chunk.contentBlockDelta.delta.text,emitter.emit("data",chunk.contentBlockDelta.delta.text),emitter.emit("content",chunk.contentBlockDelta.delta.text,currentMessage.role)),chunk.contentBlockStart?.start?.toolUse){const toolUse=chunk.contentBlockStart.start.toolUse;toolUse.toolUseId&&toolUse.name&&(currentMessage.currentToolCall={index:currentMessage.toolCalls.length,id:toolUse.toolUseId,type:"function",name:_deserializeToolName(toolUse.name),arguments:"",role:"tool"},currentMessage.currentToolInput="")}if(chunk.contentBlockDelta?.delta?.toolUse?.input&¤tMessage.currentToolCall&&(currentMessage.currentToolInput+=chunk.contentBlockDelta.delta.toolUse.input,currentMessage.currentToolCall.arguments=currentMessage.currentToolInput),chunk.contentBlockStop&¤tMessage.currentToolCall&&(typeof currentMessage.currentToolCall.arguments=="string"&&isJSONString(currentMessage.currentToolCall.arguments)&&(currentMessage.currentToolCall.arguments=JSON.parse(currentMessage.currentToolCall.arguments)),currentMessage.toolCalls.push(currentMessage.currentToolCall),currentMessage.currentToolCall=null,currentMessage.currentToolInput=""),chunk.messageStop&&(currentMessage.toolCalls.length>0&&emitter.emit(TLLMEvent.ToolInfo,currentMessage.toolCalls),emitter.emit(TLLMEvent.End,currentMessage.toolCalls)),chunk?.metadata?.usage){const usage=chunk.metadata.usage;this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId})}}})(),emitter}catch(error){const typedError=error;return logger$a.error(`streamRequest ${this.name}`,typedError,acRequest.candidate),emitter.emit(TLLMEvent.Error,typedError?.error||typedError),emitter}}async reqBodyAdapter(params){const customModelInfo=params.modelInfo;let systemPrompt,messages=params?.messages||[];const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage&&(systemPrompt=typeof systemMessage?.content=="string"?[{text:systemMessage?.content}]:systemMessage?.content),messages=otherMessages;const body={modelId:customModelInfo.settings?.customModel||customModelInfo.settings?.foundationModel,messages};return systemPrompt&&(body.system=systemPrompt),params?.toolsConfig?.tools?.length>0&&(body.toolConfig={tools:params?.toolsConfig?.tools,...params?.toolsConfig?.tool_choice&&{toolChoice:params?.toolsConfig?.tool_choice}}),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.inputTokens,output_tokens:usage.outputTokens,input_tokens_cache_write:usage.cacheWriteInputTokenCount||0,input_tokens_cache_read:usage.cacheReadInputTokenCount||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{toolSpec:{name:_serializeToolName(name),description,inputSchema:{json:{type:"object",properties,required:requiredFields}}}}})),tools?.length>0?{tools,toolChoice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];typeof messageBlock.content=="string"?content.push({text:messageBlock.content}):Array.isArray(messageBlock.content)&&content.push(...messageBlock.content),messageBlock.tool_calls?.length&&messageBlock.tool_calls.forEach(toolCall=>{const args=toolCall?.function?.arguments;content.push({toolUse:{toolUseId:toolCall.id,name:_serializeToolName(toolCall?.function?.name),input:typeof args=="string"?JSONContent(args||"{}").tryParse():args||{}}})}),messageBlocks.push({role:messageBlock?.role,content})}if(toolsData?.length){const toolResultsContent=toolsData.filter(tool=>tool.id&&(tool.result||tool.error)).map(tool=>{let content;return typeof tool?.result=="string"?content=[{text:tool.result}]:typeof tool?.result=="object"&&(content=[{json:tool.result}]),{toolResult:{toolUseId:tool.id,content,...tool.error&&{status:"error"}}}});toolResultsContent.length>0&&messageBlocks.push({role:TLLMMessageRole.User,content:toolResultsContent})}return messageBlocks}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{let textBlock=[];return message?.parts?textBlock=message.parts.map(part=>"text"in part?{...part,text:part.text||"..."}:{...part}):message?.content&&(textBlock=Array.isArray(message.content)?message.content.map(part=>"text"in part?{...part,text:part.text||"..."}:{...part}):[{text:message?.content||"..."}]),{role:message.role,content:textBlock}})}}__decorateClass$o([hookAsync("LLMConnector.request")],BedrockConnector.prototype,"request"),__decorateClass$o([hookAsync("LLMConnector.streamRequest")],BedrockConnector.prototype,"streamRequest");function _serializeToolName(name){return name?.replace(/-/g,"__")}function _deserializeToolName(name){return name?.replace(/__/g,"-")}var __defProp$J=Object.defineProperty,__getOwnPropDesc$n=Object.getOwnPropertyDescriptor,__defNormalProp$J=(obj,key,value)=>key in obj?__defProp$J(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$n=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$n(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$J(target,key,result),result},__publicField$J=(obj,key,value)=>__defNormalProp$J(obj,key+"",value);const logger$9=Logger("VertexAIConnector");class VertexAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$J(this,"name","LLM:VertexAI")}async getClient(params){const credentials=params.credentials,modelInfo=params.modelInfo,projectId=modelInfo?.settings?.projectId,region=modelInfo?.settings?.region;return new VertexAI({project:projectId,location:region,apiEndpoint:modelInfo?.settings?.apiEndpoint,googleAuthOptions:{credentials}})}async request({acRequest,body,context:context2}){try{logger$9.debug(`request ${this.name}`,acRequest.candidate);const vertexAI=await this.getClient(context2),contents=body.contents;delete body.contents;const requestParam={contents},response=await(await vertexAI.getGenerativeModel(body).generateContent(requestParam)).response,content=response.candidates?.[0]?.content?.parts?.[0]?.text||"",finishReason=response.candidates?.[0]?.finishReason||"stop",usage=response.usageMetadata;let toolsData=[],useTool=!1;const functionCalls=response.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);return functionCalls&&functionCalls.length>0&&(functionCalls.forEach((call,index)=>{toolsData.push({index,id:call.functionCall?.name+"_"+index,type:"function",name:call.functionCall?.name,arguments:call.functionCall?.args,role:TLLMMessageRole.Assistant})}),useTool=!0),usage&&this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content,finishReason,toolsData,useTool}}catch(error){throw logger$9.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){const emitter=new EventEmitter$1;return setTimeout(async()=>{try{logger$9.debug(`streamRequest ${this.name}`,acRequest.candidate);const vertexAI=await this.getClient(context2),contents=body.contents;delete body.contents;const vertexModel=vertexAI.getGenerativeModel(body),requestParam={contents},streamResult=await vertexModel.generateContentStream(requestParam);let toolsData=[],usageData=[];for await(const chunk of streamResult.stream){const chunkText=chunk.candidates?.[0]?.content?.parts?.[0]?.text||"";chunkText&&emitter.emit("content",chunkText)}const aggregatedResponse=await streamResult.response,functionCalls=aggregatedResponse.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);functionCalls&&functionCalls.length>0&&(functionCalls.forEach((call,index)=>{toolsData.push({index,id:call.functionCall?.name+"_"+index,type:"function",name:call.functionCall?.name,arguments:call.functionCall?.args,role:TLLMMessageRole.Assistant})}),emitter.emit(TLLMEvent.ToolInfo,toolsData));const usage=aggregatedResponse.usageMetadata;if(usage){const reportedUsage=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});usageData.push(reportedUsage)}const finishReason=(aggregatedResponse.candidates?.[0]?.finishReason||"stop").toLowerCase();finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,usageData,finishReason)},100)}catch(error){logger$9.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit("error",error)}},100),emitter}async reqBodyAdapter(params){const model=params?.model,{messages,systemMessage}=await this.prepareMessages(params);let body={model,contents:messages};const responseFormat=params?.responseFormat||"";let systemInstruction=systemMessage||"";responseFormat==="json"&&(systemInstruction+=(systemInstruction?`
|
|
244
|
+
${systemInstruction}`),prompt}async prepareBodyForImageGenRequest(params){return{prompt:params.prompt,model:params.model,aspectRatio:params.aspectRatio,personGeneration:params.personGeneration}}async prepareImageEditBody(params){const model=params.model||"gemini-2.5-flash-image-preview";let editPrompt=params.prompt||"Edit this image";params.instruction&&(editPrompt+=`. ${params.instruction}`);const contents=[],files=params?.files||[];if(files.length>0){const validImageFiles=this.getValidFiles(files,"image");if(validImageFiles.length===0)throw new Error("No valid image files found for editing. Please provide at least one image file.");for(const file of validImageFiles)try{const bufferData=await file.getBuffer(),base64Image=Buffer.from(bufferData).toString("base64");contents.push({inlineData:{mimeType:file.mimetype,data:base64Image}})}catch(error){throw new Error(`Failed to process image file: ${error.message}`)}}else throw new Error("No image provided for editing. Please include an image file.");return contents.push({text:editPrompt}),{model,contents,_metadata:{prompt:editPrompt,numberOfImages:params.n||1,aspectRatio:params.aspect_ratio||params.size||"1:1",personGeneration:params.person_generation||"allow_adult"}}}sanitizeFunctionName(name){if(name==null)return"_unnamed_function";let sanitized=name.replace(/[^a-zA-Z0-9_.-]/g,"");return/^[a-zA-Z_]/.test(sanitized)||(sanitized="_"+sanitized),sanitized===""&&(sanitized="_unnamed_function"),sanitized=sanitized.slice(0,64),sanitized}async uploadFile({file,apiKey,agentId}){try{if(!apiKey||!file?.mimetype)throw new Error("Missing required parameters to save file for Google AI!");const tempDir=os.tmpdir(),fileName=uid(),tempFilePath=path.join(tempDir,fileName),bufferData=await file.readData(AccessCandidate.agent(agentId));await fs__default.promises.writeFile(tempFilePath,new Uint8Array(bufferData));const ai=new GoogleGenAI$1({apiKey}),uploadResponse=await ai.files.upload({file:tempFilePath,config:{mimeType:file.mimetype,displayName:fileName}}),name=uploadResponse.name;if(!name)throw new Error("File upload did not return a file name.");let uploadedFile=uploadResponse;for(;uploadedFile.state===FileState.PROCESSING;)process.stdout.write("."),await new Promise(resolve=>setTimeout(resolve,1e4)),uploadedFile=await ai.files.get({name});if(uploadedFile.state===FileState.FAILED)throw new Error("File processing failed.");return await fs__default.promises.unlink(tempFilePath),{url:uploadedFile.uri||""}}catch(error){throw new Error(`Error uploading file for Google AI: ${error.message}`)}}getValidFiles(files,type){const validSources=[];for(let file of files)this.validMimeTypes[type].includes(file?.mimetype)&&validSources.push(file);if(validSources?.length===0)throw new Error(`Unsupported file(s). Please make sure your file is one of the following types: ${this.validMimeTypes[type].join(", ")}`);return validSources}getFileData(files){try{const imageData=[];for(let file of files)imageData.push({fileData:{mimeType:file.mimetype,fileUri:file.url}});return imageData}catch(error){throw error}}}__decorateClass$r([hookAsync("LLMConnector.request")],GoogleAIConnector.prototype,"request"),__decorateClass$r([hookAsync("LLMConnector.streamRequest")],GoogleAIConnector.prototype,"streamRequest");var __defProp$J=Object.defineProperty,__getOwnPropDesc$q=Object.getOwnPropertyDescriptor,__defNormalProp$J=(obj,key,value)=>key in obj?__defProp$J(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$q=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$q(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$J(target,key,result),result},__publicField$J=(obj,key,value)=>__defNormalProp$J(obj,typeof key!="symbol"?key+"":key,value);const logger$c=Logger("AnthropicConnector"),PREFILL_TEXT_FOR_JSON_RESPONSE="{",LEGACY_THINKING_MODELS=["smythos/claude-3.7-sonnet-thinking","claude-3.7-sonnet-thinking"],AnthropicStreamEvent={connect:"connect",streamEvent:"streamEvent",text:"text",citation:"citation",inputJson:"inputJson",thinking:"thinking",signature:"signature",message:"message",contentBlock:"contentBlock",finalMessage:"finalMessage",error:"error",abort:"abort",end:"end"};class AnthropicConnector extends LLMConnector{constructor(){super(...arguments),__publicField$J(this,"name","LLM:Anthropic"),__publicField$J(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.Anthropic.image)}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Anthropic");return new Anthropic({apiKey})}async request({acRequest,body,context:context2}){try{logger$c.debug(`request ${this.name}`,acRequest.candidate);const result=await(await this.getClient(context2)).messages.create(body),message={role:result?.role||TLLMMessageRole.User,content:result?.content||""},stopReason=result?.stop_reason;let toolsData=[],useTool=!1;if(stopReason==="tool_use"){const toolUseContentBlocks=result?.content?.filter(c=>c.type==="tool_use");if(toolUseContentBlocks?.length===0)return;toolUseContentBlocks.forEach((toolUseBlock,index)=>{toolsData.push({index,id:toolUseBlock?.id,type:"function",name:toolUseBlock?.name,arguments:toolUseBlock?.input,role:result?.role})}),useTool=!0}let content=result?.content?.find(block=>block.type==="text")?.text||"";const usage=result?.usage;return this.hasPrefillText(body.messages)&&(content=`${PREFILL_TEXT_FOR_JSON_RESPONSE}${content}`),this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content,finishReason:result?.stop_reason,useTool,toolsData,message,usage}}catch(error){throw logger$c.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$c.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,usage_data=[];let stream=(await this.getClient(context2)).messages.stream(body),toolsData=[],thinkingBlocks=[];const needsPrefillInjection=this.hasPrefillText(body.messages);let prefillInjected=!1;return stream.on(AnthropicStreamEvent.streamEvent,event=>{event.message?.usage}),stream.on(AnthropicStreamEvent.error,error=>{emitter.emit(TLLMEvent.Error,error)}),stream.on(AnthropicStreamEvent.message,message=>{emitter.emit(TLLMEvent.Data,message)}),stream.on(AnthropicStreamEvent.text,text=>{needsPrefillInjection&&!prefillInjected&&(text=`${PREFILL_TEXT_FOR_JSON_RESPONSE}${text}`,prefillInjected=!0),emitter.emit(TLLMEvent.Content,text)}),stream.on(AnthropicStreamEvent.thinking,thinking=>{emitter.emit(TLLMEvent.Thinking,thinking)}),stream.on(AnthropicStreamEvent.finalMessage,finalMessage=>{let finishReason="stop";thinkingBlocks=finalMessage.content.filter(block=>block.type==="thinking"||block.type==="redacted_thinking");const toolUseContentBlocks=finalMessage.content.filter(c=>c.type==="tool_use");if(toolUseContentBlocks?.length>0?(toolUseContentBlocks.forEach((toolUseBlock,index)=>{toolsData.push({index,id:toolUseBlock?.id,type:"function",name:toolUseBlock?.name,arguments:toolUseBlock?.input,role:finalMessage?.role})}),emitter.emit(TLLMEvent.ToolInfo,toolsData,thinkingBlocks)):finishReason=finalMessage.stop_reason,finalMessage?.usage){const usage=finalMessage.usage,reportedUsage=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});usage_data.push(reportedUsage)}finishReason!=="stop"&&finishReason!=="end_turn"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setTimeout(()=>{emitter.emit(TLLMEvent.End,toolsData,usage_data,finishReason)},100)}),emitter}catch(error){throw logger$c.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){const body=await this.prepareBody(params);return await this.shouldUseThinkingMode(params)?await this.prepareBodyForThinkingRequest({body,maxThinkingTokens:params.maxThinkingTokens,toolChoice:params?.toolsConfig?.tool_choice}):body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.input_tokens,output_tokens:usage.output_tokens,input_tokens_cache_write:usage.cache_creation_input_tokens,input_tokens_cache_read:usage.cache_read_input_tokens,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{name,description,input_schema:{type:"object",properties,required:requiredFields}}})),tools?.length>0?{tools}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];if(messageBlock.thinkingBlocks?.length>0&&content.push(...messageBlock.thinkingBlocks),Array.isArray(messageBlock.content)?content.push(...messageBlock.content):messageBlock.content&&content.push({type:"text",text:messageBlock.content}),messageBlock.tool_calls){const calls=messageBlock.tool_calls.map(toolCall=>{const args=toolCall?.function?.arguments;return{type:"tool_use",id:toolCall.id,name:toolCall?.function?.name,input:typeof args=="string"?JSONContent(args||"{}").tryParse():args||{}}});content.push(...calls)}messageBlocks.push({role:messageBlock?.role,content})}const toolResultsContent=toolsData.map(toolData=>({type:"tool_result",tool_use_id:toolData.id,content:toolData.result}));return toolResultsContent.length>0&&messageBlocks.push({role:TLLMMessageRole.User,content:toolResultsContent}),messageBlocks}getConsistentMessages(messages){let _messages=JSON.parse(JSON.stringify(messages)),systemMessage=null;return _messages[0]?.role===TLLMMessageRole.System&&(systemMessage=_messages.shift()),_messages=LLMHelper.removeDuplicateUserMessages(_messages),_messages=_messages.map(message=>{let content;return message?.parts?content=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?Array.isArray(message.content)?message.content.filter(item=>typeof item=="object"&&"type"in item&&(item.type==="tool_use"||item.type==="tool_result"))?.length>0?content=message.content.map(item=>item.type==="text"&&(!item.text||item.text.trim()==="")?{...item,text:"..."}:item):content=message.content.map(block=>block?.text||"").join(" ").trim():content=message.content:message?.content&&(content=message.content),message.content=content||"...",message}),_messages[0]?.role===TLLMMessageRole.User&&Array.isArray(_messages[0].content)&&_messages[0].content.find(content=>"type"in content&&content.type==="tool_result")&&_messages.shift(),_messages[0]?.role!==TLLMMessageRole.User&&_messages.unshift({role:TLLMMessageRole.User,content:"continue"}),systemMessage&&systemMessage.content&&_messages.unshift(systemMessage),_messages}async prepareBody(params){let messages=await this.prepareMessages(params),body={model:params.model,messages,max_tokens:params.maxTokens};const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);if("content"in systemMessage&&(body.system=systemMessage?.content),messages=otherMessages,(params?.responseFormat||"")==="json"&&(body.system=body.system?`${body.system} ${JSON_RESPONSE_INSTRUCTION}`:JSON_RESPONSE_INSTRUCTION,messages.push({role:TLLMMessageRole.Assistant,content:PREFILL_TEXT_FOR_JSON_RESPONSE})),LLMHelper.hasSystemMessage(messages)){const{systemMessage:systemMessage2,otherMessages:otherMessages2}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage2&&(body.system=await this.prepareSystemPrompt(systemMessage2,params)),messages=otherMessages2}const isReasoningModel=params?.capabilities?.reasoning;params?.temperature!==void 0&&!isReasoningModel&&(body.temperature=params.temperature),params?.topP!==void 0&&!isReasoningModel&&(body.top_p=params.topP),params?.topK!==void 0&&!isReasoningModel&&(body.top_k=params.topK),params?.stopSequences?.length&&(body.stop_sequences=params.stopSequences),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools.length>0&&(body.tools=params?.toolsConfig?.tools,params?.cache&&(body.tools[body.tools.length-1].cache_control={type:"ephemeral"}));const toolChoice=params?.toolsConfig?.tool_choice;return toolChoice&&(body.tool_choice=toolChoice),body.messages=messages,body}async prepareBodyForThinkingRequest({body,maxThinkingTokens,toolChoice=null}){let messages=body.messages.filter(message=>!(message?.role===TLLMMessageRole.Assistant&&message?.content===PREFILL_TEXT_FOR_JSON_RESPONSE)),budget_tokens=Math.min(maxThinkingTokens,body.max_tokens);budget_tokens===body.max_tokens&&(budget_tokens=Math.floor(budget_tokens*.8));const thinkingBody={model:body.model,messages,max_tokens:body.max_tokens,thinking:{type:"enabled",budget_tokens}};return toolChoice&&(["any","tool"].includes(toolChoice.type)?thinkingBody.tool_choice={type:"auto"}:thinkingBody.tool_choice=toolChoice),thinkingBody}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];if(files?.length>0){const promises=[],_files=[];for(let image of files){const binaryInput=BinaryInput.from(image);promises.push(binaryInput.upload(AccessCandidate.agent(params.agentId))),_files.push(binaryInput)}await Promise.all(promises);const validSources=this.getValidImageFiles(_files),imageData=await this.getImageData(validSources,params.agentId),content=[{type:"text",text:(Array.isArray(messages)?messages.pop():{})?.content||""},...imageData];messages.push({role:TLLMMessageRole.User,content})}return messages}async prepareSystemPrompt(systemMessage,params){let systemPrompt=systemMessage?.content;return typeof systemPrompt=="string"&&(systemPrompt=[{type:"text",text:systemPrompt}]),systemPrompt.unshift({type:"text",text:'If you need to call a function, Do NOT inform the user that you are about to do so, and do not thank the user after you get the response. Just say something like "Give me a moment...", then when you get the response, Just continue answering the user without saying anything about the function you just called'}),params?.cache&&(systemPrompt[systemPrompt.length-1].cache_control={type:"ephemeral"}),systemPrompt}async shouldUseThinkingMode(params){return LEGACY_THINKING_MODELS.includes(params.modelEntryName)?!0:params?.useReasoning&¶ms.capabilities?.reasoning===!0}getValidImageFiles(files){const validSources=[];for(let file of files)this.validImageMimeTypes.includes(file?.mimetype)&&validSources.push(file);if(validSources?.length===0)throw new Error(`Unsupported file(s). Please make sure your file is one of the following types: ${this.validImageMimeTypes.join(", ")}`);return validSources}async getImageData(files,agentId){try{const imageData=[];for(let file of files){const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64");imageData.push({type:"image",source:{type:"base64",data:base64Data,media_type:file.mimetype}})}return imageData}catch(error){throw error}}hasPrefillText(messages){for(let i=messages.length-1;i>=0;i--){const message=messages[i];if(message?.role===TLLMMessageRole.Assistant&&message?.content===PREFILL_TEXT_FOR_JSON_RESPONSE)return!0}return!1}}__decorateClass$q([hookAsync("LLMConnector.request")],AnthropicConnector.prototype,"request"),__decorateClass$q([hookAsync("LLMConnector.streamRequest")],AnthropicConnector.prototype,"streamRequest");var __defProp$I=Object.defineProperty,__getOwnPropDesc$p=Object.getOwnPropertyDescriptor,__defNormalProp$I=(obj,key,value)=>key in obj?__defProp$I(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$p=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$p(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$I(target,key,result),result},__publicField$I=(obj,key,value)=>__defNormalProp$I(obj,key+"",value);const logger$b=Logger("GroqConnector"),MODELS_WITHOUT_REASONING_EFFORT_SUPPORT=["deepseek-r1-distill-llama-70b"];class GroqConnector extends LLMConnector{constructor(){super(...arguments),__publicField$I(this,"name","LLM:Groq")}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Groq");return new Groq({apiKey})}async request({acRequest,body,context:context2}){try{logger$b.debug(`request ${this.name}`,acRequest.candidate);const result=await(await this.getClient(context2)).chat.completions.create(body),message=result?.choices?.[0]?.message,finishReason=result?.choices?.[0]?.finish_reason,toolCalls=message?.tool_calls,usage=result.usage;this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});let toolsData=[],useTool=!1;return toolCalls&&(toolsData=toolCalls.map((tool,index)=>({index,id:tool.id,type:tool.type,name:tool.function.name,arguments:tool.function.arguments,role:TLLMMessageRole.Assistant})),useTool=!0),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$b.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$b.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,usage_data=[],stream=await(await this.getClient(context2)).chat.completions.create({...body,stream:!0,stream_options:{include_usage:!0}});let toolsData=[],finishReason="stop";return(async()=>{for await(const chunk of stream){const delta=chunk.choices[0]?.delta,usage=chunk.x_groq?.usage||chunk.usage;usage&&usage_data.push(usage),emitter.emit(TLLMEvent.Data,delta),delta?.content&&emitter.emit(TLLMEvent.Content,delta.content),delta?.tool_calls&&delta.tool_calls.forEach((toolCall,index)=>{toolsData[index]?toolsData[index].arguments+=toolCall.function?.arguments||"":toolsData[index]={index,id:toolCall.id,type:toolCall.type,name:toolCall.function?.name,arguments:toolCall.function?.arguments,role:"assistant"}}),chunk.choices[0]?.finish_reason&&(finishReason=chunk.choices[0].finish_reason)}toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData);const reportedUsage=[];usage_data.forEach(usage=>{const reported=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});reportedUsage.push(reported)}),finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setTimeout(()=>{emitter.emit(TLLMEvent.End,toolsData,reportedUsage,finishReason)},100)})(),emitter}catch(error){throw logger$b.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){const messages=params?.messages||[],body={model:params.model,messages};(params?.responseFormat||"")==="json"&&(messages?.[0]?.role==="system"?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:"system",content:JSON_RESPONSE_INSTRUCTION}));const allowReasoning=params.useReasoning&¶ms.capabilities?.reasoning;return params.maxTokens!==void 0&&(allowReasoning?body.max_completion_tokens=params.maxTokens:body.max_tokens=params.maxTokens),params.temperature!==void 0&&(body.temperature=params.temperature),params.topP!==void 0&&(body.top_p=params.topP),params.stopSequences?.length&&(body.stop=params.stopSequences),params.toolsConfig?.tools&&(body.tools=params.toolsConfig?.tools),params.toolsConfig?.tool_choice&&(body.tool_choice=params.toolsConfig?.tool_choice),allowReasoning&&isValidGroqReasoningEffort(params?.reasoningEffort)&&!MODELS_WITHOUT_REASONING_EFFORT_SUPPORT.includes(params?.modelEntryName)&¶ms.reasoningEffort!==void 0&&(body.reasoning_effort=params.reasoningEffort),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),output_tokens:usage?.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice}:{}}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$p([hookAsync("LLMConnector.request")],GroqConnector.prototype,"request"),__decorateClass$p([hookAsync("LLMConnector.streamRequest")],GroqConnector.prototype,"streamRequest");function isValidGroqReasoningEffort(value){return["none","default","low","medium","high"].includes(value)}var __defProp$H=Object.defineProperty,__getOwnPropDesc$o=Object.getOwnPropertyDescriptor,__defNormalProp$H=(obj,key,value)=>key in obj?__defProp$H(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$o=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$o(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$H(target,key,result),result},__publicField$H=(obj,key,value)=>__defNormalProp$H(obj,key+"",value);const logger$a=Logger("BedrockConnector");class BedrockConnector extends LLMConnector{constructor(){super(...arguments),__publicField$H(this,"name","LLM:Bedrock")}async getClient(params){const credentials=params.credentials,region=params.modelInfo.settings.region;if(!(Object.keys(credentials).length>=2))throw new Error("Access key ID and secret access key are required for Bedrock");return new BedrockRuntimeClient({region,credentials})}async request({acRequest,body,context:context2}){try{logger$a.debug(`request ${this.name}`,acRequest.candidate);const bedrock=await this.getClient(context2),command=new ConverseCommand(body),response=await bedrock.send(command),usage=response.usage;this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});const message=response.output?.message,finishReason=response.stopReason;let toolsData=[],useTool=!1;return finishReason==="tool_use"&&(toolsData=(message?.content?.filter(block=>block?.toolUse)||[]).map((block,index)=>({index,id:block.toolUse?.toolUseId,type:"function",name:_deserializeToolName(block.toolUse?.name),arguments:block.toolUse?.input,role:"tool"})),useTool=!0),{content:Array.isArray(message?.content)?message?.content?.[0]?.text||"":message?.content||"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$a.error(`request ${this.name}`,error,acRequest.candidate),error?.error||error}}async streamRequest({acRequest,body,context:context2}){const emitter=new EventEmitter$1;try{logger$a.debug(`streamRequest ${this.name}`,acRequest.candidate);const bedrock=await this.getClient(context2),command=new ConverseStreamCommand(body),stream=(await bedrock.send(command)).stream;return stream&&(async()=>{let currentMessage={role:"",content:"",toolCalls:[],currentToolCall:null,currentToolInput:""};for await(const chunk of stream){if(chunk.messageStart&&(currentMessage.role=chunk.messageStart.role||"",emitter.emit(TLLMEvent.Data,{role:currentMessage.role})),chunk.contentBlockDelta?.delta?.text&&(currentMessage.content+=chunk.contentBlockDelta.delta.text,emitter.emit(TLLMEvent.Data,chunk.contentBlockDelta.delta.text),emitter.emit(TLLMEvent.Content,chunk.contentBlockDelta.delta.text,currentMessage.role)),chunk.contentBlockStart?.start?.toolUse){const toolUse=chunk.contentBlockStart.start.toolUse;toolUse.toolUseId&&toolUse.name&&(currentMessage.currentToolCall={index:currentMessage.toolCalls.length,id:toolUse.toolUseId,type:"function",name:_deserializeToolName(toolUse.name),arguments:"",role:"tool"},currentMessage.currentToolInput="")}if(chunk.contentBlockDelta?.delta?.toolUse?.input&¤tMessage.currentToolCall&&(currentMessage.currentToolInput+=chunk.contentBlockDelta.delta.toolUse.input,currentMessage.currentToolCall.arguments=currentMessage.currentToolInput),chunk.contentBlockStop&¤tMessage.currentToolCall&&(typeof currentMessage.currentToolCall.arguments=="string"&&isJSONString(currentMessage.currentToolCall.arguments)&&(currentMessage.currentToolCall.arguments=JSON.parse(currentMessage.currentToolCall.arguments)),currentMessage.toolCalls.push(currentMessage.currentToolCall),currentMessage.currentToolCall=null,currentMessage.currentToolInput=""),chunk.messageStop){const finishReason=chunk.messageStop.stopReason||"stop";currentMessage.toolCalls.length>0&&emitter.emit(TLLMEvent.ToolInfo,currentMessage.toolCalls),finishReason!=="stop"&&finishReason!=="end_turn"&&emitter.emit(TLLMEvent.Interrupted,finishReason),emitter.emit(TLLMEvent.End,currentMessage.toolCalls,[],finishReason)}if(chunk?.metadata?.usage){const usage=chunk.metadata.usage;this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId})}}})(),emitter}catch(error){const typedError=error;return logger$a.error(`streamRequest ${this.name}`,typedError,acRequest.candidate),emitter.emit(TLLMEvent.Error,typedError?.error||typedError),emitter}}async reqBodyAdapter(params){const customModelInfo=params.modelInfo;let systemPrompt,messages=params?.messages||[];const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage&&(systemPrompt=typeof systemMessage?.content=="string"?[{text:systemMessage?.content}]:systemMessage?.content),messages=otherMessages;const body={modelId:customModelInfo.settings?.customModel||customModelInfo.settings?.foundationModel,messages};return systemPrompt&&(body.system=systemPrompt),params?.toolsConfig?.tools?.length>0&&(body.toolConfig={tools:params?.toolsConfig?.tools,...params?.toolsConfig?.tool_choice&&{toolChoice:params?.toolsConfig?.tool_choice}}),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.inputTokens,output_tokens:usage.outputTokens,input_tokens_cache_write:usage.cacheWriteInputTokenCount||0,input_tokens_cache_read:usage.cacheReadInputTokenCount||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{toolSpec:{name:_serializeToolName(name),description,inputSchema:{json:{type:"object",properties,required:requiredFields}}}}})),tools?.length>0?{tools,toolChoice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];typeof messageBlock.content=="string"?content.push({text:messageBlock.content}):Array.isArray(messageBlock.content)&&content.push(...messageBlock.content),messageBlock.tool_calls?.length&&messageBlock.tool_calls.forEach(toolCall=>{const args=toolCall?.function?.arguments;content.push({toolUse:{toolUseId:toolCall.id,name:_serializeToolName(toolCall?.function?.name),input:typeof args=="string"?JSONContent(args||"{}").tryParse():args||{}}})}),messageBlocks.push({role:messageBlock?.role,content})}if(toolsData?.length){const toolResultsContent=toolsData.filter(tool=>tool.id&&(tool.result||tool.error)).map(tool=>{let content;return typeof tool?.result=="string"?content=[{text:tool.result}]:typeof tool?.result=="object"&&(content=[{json:tool.result}]),{toolResult:{toolUseId:tool.id,content,...tool.error&&{status:"error"}}}});toolResultsContent.length>0&&messageBlocks.push({role:TLLMMessageRole.User,content:toolResultsContent})}return messageBlocks}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{let textBlock=[];return message?.parts?textBlock=message.parts.map(part=>"text"in part?{...part,text:part.text||"..."}:{...part}):message?.content&&(textBlock=Array.isArray(message.content)?message.content.map(part=>"text"in part?{...part,text:part.text||"..."}:{...part}):[{text:message?.content||"..."}]),{role:message.role,content:textBlock}})}}__decorateClass$o([hookAsync("LLMConnector.request")],BedrockConnector.prototype,"request"),__decorateClass$o([hookAsync("LLMConnector.streamRequest")],BedrockConnector.prototype,"streamRequest");function _serializeToolName(name){return name?.replace(/-/g,"__")}function _deserializeToolName(name){return name?.replace(/__/g,"-")}var __defProp$G=Object.defineProperty,__getOwnPropDesc$n=Object.getOwnPropertyDescriptor,__defNormalProp$G=(obj,key,value)=>key in obj?__defProp$G(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$n=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$n(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$G(target,key,result),result},__publicField$G=(obj,key,value)=>__defNormalProp$G(obj,key+"",value);const logger$9=Logger("VertexAIConnector");class VertexAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$G(this,"name","LLM:VertexAI")}async getClient(params){const credentials=params.credentials,modelInfo=params.modelInfo,projectId=modelInfo?.settings?.projectId,region=modelInfo?.settings?.region;return new VertexAI({project:projectId,location:region,apiEndpoint:modelInfo?.settings?.apiEndpoint,googleAuthOptions:{credentials}})}async request({acRequest,body,context:context2}){try{logger$9.debug(`request ${this.name}`,acRequest.candidate);const vertexAI=await this.getClient(context2),contents=body.contents;delete body.contents;const requestParam={contents},response=await(await vertexAI.getGenerativeModel(body).generateContent(requestParam)).response,content=response.candidates?.[0]?.content?.parts?.[0]?.text||"",finishReason=response.candidates?.[0]?.finishReason||"stop",usage=response.usageMetadata;let toolsData=[],useTool=!1;const functionCalls=response.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);return functionCalls&&functionCalls.length>0&&(functionCalls.forEach((call,index)=>{toolsData.push({index,id:call.functionCall?.name+"_"+index,type:"function",name:call.functionCall?.name,arguments:call.functionCall?.args,role:TLLMMessageRole.Assistant})}),useTool=!0),usage&&this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content,finishReason,toolsData,useTool}}catch(error){throw logger$9.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){const emitter=new EventEmitter$1;return setTimeout(async()=>{try{logger$9.debug(`streamRequest ${this.name}`,acRequest.candidate);const vertexAI=await this.getClient(context2),contents=body.contents;delete body.contents;const vertexModel=vertexAI.getGenerativeModel(body),requestParam={contents},streamResult=await vertexModel.generateContentStream(requestParam);let toolsData=[],usageData=[];for await(const chunk of streamResult.stream){const chunkText=chunk.candidates?.[0]?.content?.parts?.[0]?.text||"";chunkText&&emitter.emit(TLLMEvent.Content,chunkText)}const aggregatedResponse=await streamResult.response;emitter.emit(TLLMEvent.Data,aggregatedResponse);const functionCalls=aggregatedResponse.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);functionCalls&&functionCalls.length>0&&(functionCalls.forEach((call,index)=>{toolsData.push({index,id:call.functionCall?.name+"_"+index,type:"function",name:call.functionCall?.name,arguments:call.functionCall?.args,role:TLLMMessageRole.Assistant})}),emitter.emit(TLLMEvent.ToolInfo,toolsData));const usage=aggregatedResponse.usageMetadata;if(usage){const reportedUsage=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});usageData.push(reportedUsage)}const finishReason=(aggregatedResponse.candidates?.[0]?.finishReason||"stop").toLowerCase();finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setTimeout(()=>{emitter.emit(TLLMEvent.End,toolsData,usageData,finishReason)},100)}catch(error){logger$9.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit(TLLMEvent.Error,error)}},100),emitter}async reqBodyAdapter(params){const model=params?.model,{messages,systemMessage}=await this.prepareMessages(params);let body={model,contents:messages};const responseFormat=params?.responseFormat||"";let systemInstruction=systemMessage||"";responseFormat==="json"&&(systemInstruction+=(systemInstruction?`
|
|
205
245
|
|
|
206
|
-
`:"")+JSON_RESPONSE_INSTRUCTION);const config2={};return params.maxTokens!==void 0&&(config2.maxOutputTokens=params.maxTokens),params.temperature!==void 0&&(config2.temperature=params.temperature),params.topP!==void 0&&(config2.topP=params.topP),params.topK!==void 0&&(config2.topK=params.topK),params.stopSequences?.length&&(config2.stopSequences=params.stopSequences),systemInstruction&&(body.systemInstruction={role:"system",parts:[{text:systemInstruction}]}),Object.keys(config2).length>0&&(body.generationConfig=config2),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools.length>0&&(body.tools=this.formatToolsForVertexAI(params.toolsConfig.tools)),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.promptTokenCount||0,output_tokens:usage.candidatesTokenCount||0,input_tokens_cache_read:usage.cachedContentTokenCount||0,input_tokens_cache_write:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];let processedMessages=[...messages];const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(processedMessages);if(processedMessages=otherMessages,files?.length>0){const fileData=await this.processFiles(files,params.agentId),userMessage=processedMessages.pop();if(userMessage){const content=[{text:userMessage.content},...fileData];processedMessages.push({role:userMessage.role,parts:content})}}let vertexAIMessages=this.convertMessagesToVertexAIFormat(processedMessages);return(!vertexAIMessages||vertexAIMessages.length===0)&&(vertexAIMessages=[{role:"user",parts:[{text:"Hello"}]}]),{messages:vertexAIMessages,systemMessage:systemMessage?.content||""}}async processFiles(files,agentId){const fileData=[];for(const file of files){const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64");fileData.push({inlineData:{data:base64Data,mimeType:file.mimetype}})}return fileData}convertMessagesToVertexAIFormat(messages){return messages.filter(message=>message&&(message.content||message.parts)).map(message=>{let parts;return typeof message.content=="string"?parts=message.content.trim()?[{text:message.content.trim()}]:[{text:"Continue"}]:message.parts&&Array.isArray(message.parts)?parts=message.parts:message.content?parts=[{text:String(message.content)||"Continue"}]:parts=[{text:"Continue"}],{role:message.role===TLLMMessageRole.Assistant?"model":"user",parts}})}formatToolsForVertexAI(tools){return[{functionDeclarations:tools.map(tool=>({name:tool.name,description:tool.description||"",parameters:{type:"object",properties:tool.properties||{},required:tool.requiredFields||[]}}))}]}formatToolsConfig({toolDefinitions,toolChoice="auto"}){return{tools:toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{name,description,properties,requiredFields}}),toolChoice:{type:toolChoice}}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[],parseFunctionArgs=args=>{if(typeof args=="string")try{return JSON.parse(args)}catch{return args}return args??{}},parseFunctionResponse=response=>{if(typeof response=="string")try{const parsed=JSON.parse(response);return typeof parsed=="string"&&parsed!==response?parseFunctionResponse(parsed):parsed}catch{return response}return response??{}};if(messageBlock){const parts=[];if(Array.isArray(messageBlock.parts)&&messageBlock.parts.length>0){for(const part of messageBlock.parts)if(part){if(typeof part.text=="string"&&part.text.trim()){parts.push({text:part.text.trim()});continue}if(part.functionCall){parts.push({functionCall:{name:part.functionCall.name,args:parseFunctionArgs(part.functionCall.args)}});continue}if(part.functionResponse){parts.push({functionResponse:{name:part.functionResponse.name,response:parseFunctionResponse(part.functionResponse.response)}});continue}part.inlineData&&parts.push({inlineData:part.inlineData})}}else typeof messageBlock.content=="string"&&messageBlock.content.trim()?parts.push({text:messageBlock.content.trim()}):Array.isArray(messageBlock.content)&&messageBlock.content.length>0&&parts.push(...messageBlock.content);if(Array.isArray(messageBlock.tool_calls)&&messageBlock.tool_calls.length>0){const functionCalls=messageBlock.tool_calls.map(toolCall=>{if(toolCall?.function?.name)return{functionCall:{name:toolCall.function.name,args:parseFunctionArgs(toolCall.function.arguments)}}}).filter(Boolean);parts.push(...functionCalls)}if(!parts.some(part=>part.functionCall)&&toolsData.length>0&&toolsData.forEach(toolCall=>{parts.push({functionCall:{name:toolCall.name,args:parseFunctionArgs(toolCall.arguments)}})}),parts.length>0){let role=messageBlock.role;role===TLLMMessageRole.Assistant?role=TLLMMessageRole.Model:role===TLLMMessageRole.Tool&&(role=TLLMMessageRole.Function),messageBlocks.push({role,parts})}}const functionResponseParts=toolsData.filter(toolData=>toolData.result!==void 0).map(toolData=>({functionResponse:{name:toolData.name,response:parseFunctionResponse(toolData.result)}}));return functionResponseParts.length>0&&messageBlocks.push({role:TLLMMessageRole.Function,parts:functionResponseParts}),messageBlocks}}__decorateClass$n([hookAsync("LLMConnector.request")],VertexAIConnector.prototype,"request"),__decorateClass$n([hookAsync("LLMConnector.streamRequest")],VertexAIConnector.prototype,"streamRequest");var __defProp$I=Object.defineProperty,__getOwnPropDesc$m=Object.getOwnPropertyDescriptor,__defNormalProp$I=(obj,key,value)=>key in obj?__defProp$I(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$m=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$m(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$I(target,key,result),result},__publicField$I=(obj,key,value)=>__defNormalProp$I(obj,key+"",value);const logger$8=Logger("PerplexityConnector");class PerplexityConnector extends LLMConnector{constructor(){super(...arguments),__publicField$I(this,"name","LLM:Perplexity")}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Perplexity");return axios.create({baseURL:params?.modelInfo?.baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context:context2}){try{logger$8.debug(`request ${this.name}`,acRequest.candidate);const response=await(await this.getClient(context2)).post("/chat/completions",body),content=response?.data?.choices?.[0]?.message.content,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage;return this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content,finishReason,useTool:!1,toolsData:[],message:{content,role:"assistant"},usage}}catch(error){throw logger$8.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){const emitter=new EventEmitter$1;return setTimeout(()=>{try{logger$8.debug(`streamRequest ${this.name}`,acRequest.candidate),this.request({acRequest,body,context:context2}).then(respose=>{const finishReason=respose.finishReason,usage=respose.usage;emitter.emit("interrupted",finishReason),emitter.emit("content",respose.content),emitter.emit("end",void 0,usage,finishReason)}).catch(error=>{emitter.emit("error",error.message||error.toString())})}catch(error){logger$8.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit("error",error.message||error.toString())}},100),emitter}async reqBodyAdapter(params){const messages=params?.messages||[];(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),delete params.responseFormat);const body={model:params.model,messages};return params?.maxTokens!==void 0&&(body.max_tokens=params.maxTokens),params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.topK!==void 0&&(body.top_k=params.topK),params?.frequencyPenalty&&(body.frequency_penalty=params.frequencyPenalty),params?.presencePenalty!==void 0&&(body.presence_penalty=params.presencePenalty),params.responseFormat&&(body.response_format=params.responseFormat),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),output_tokens:usage?.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,reasoning_tokens:usage?.reasoning_tokens||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$m([hookAsync("LLMConnector.request")],PerplexityConnector.prototype,"request"),__decorateClass$m([hookAsync("LLMConnector.streamRequest")],PerplexityConnector.prototype,"streamRequest");var __defProp$H=Object.defineProperty,__getOwnPropDesc$l=Object.getOwnPropertyDescriptor,__defNormalProp$H=(obj,key,value)=>key in obj?__defProp$H(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$l=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$l(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$H(target,key,result),result},__publicField$H=(obj,key,value)=>__defNormalProp$H(obj,key+"",value);const logger$7=Logger("xAIConnector");class xAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$H(this,"name","LLM:Grok")}async getClient(params){const apiKey=params.credentials?.apiKey,baseURL=params?.modelInfo?.baseURL||"https://api.x.ai/v1";if(!apiKey)throw new Error("Please provide an API key for Grok");return axios.create({baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context:context2}){try{logger$7.debug(`request ${this.name}`,acRequest.candidate);const response=await(await this.getClient(context2)).post("/chat/completions",body),message=response?.data?.choices?.[0]?.message,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage,citations=response?.data?.citations;let toolsData=[],useTool=!1;finishReason==="tool_calls"&&(toolsData=message?.tool_calls?.map((tool,index)=>({index,id:tool?.id,type:tool?.type,name:tool?.function?.name,arguments:tool?.function?.arguments,role:"tool"}))||[],useTool=!0);let content=message?.content??"";if(citations&&citations.length>0){const citationsText=`
|
|
246
|
+
`:"")+JSON_RESPONSE_INSTRUCTION);const config2={};return params.maxTokens!==void 0&&(config2.maxOutputTokens=params.maxTokens),params.temperature!==void 0&&(config2.temperature=params.temperature),params.topP!==void 0&&(config2.topP=params.topP),params.topK!==void 0&&(config2.topK=params.topK),params.stopSequences?.length&&(config2.stopSequences=params.stopSequences),systemInstruction&&(body.systemInstruction={role:"system",parts:[{text:systemInstruction}]}),Object.keys(config2).length>0&&(body.generationConfig=config2),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools.length>0&&(body.tools=this.formatToolsForVertexAI(params.toolsConfig.tools)),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.promptTokenCount||0,output_tokens:usage.candidatesTokenCount||0,input_tokens_cache_read:usage.cachedContentTokenCount||0,input_tokens_cache_write:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];let processedMessages=[...messages];const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(processedMessages);if(processedMessages=otherMessages,files?.length>0){const fileData=await this.processFiles(files,params.agentId),userMessage=processedMessages.pop();if(userMessage){const content=[{text:userMessage.content},...fileData];processedMessages.push({role:userMessage.role,parts:content})}}let vertexAIMessages=this.convertMessagesToVertexAIFormat(processedMessages);return(!vertexAIMessages||vertexAIMessages.length===0)&&(vertexAIMessages=[{role:"user",parts:[{text:"Hello"}]}]),{messages:vertexAIMessages,systemMessage:systemMessage?.content||""}}async processFiles(files,agentId){const fileData=[];for(const file of files){const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64");fileData.push({inlineData:{data:base64Data,mimeType:file.mimetype}})}return fileData}convertMessagesToVertexAIFormat(messages){return messages.filter(message=>message&&(message.content||message.parts)).map(message=>{let parts;return typeof message.content=="string"?parts=message.content.trim()?[{text:message.content.trim()}]:[{text:"Continue"}]:message.parts&&Array.isArray(message.parts)?parts=message.parts:message.content?parts=[{text:String(message.content)||"Continue"}]:parts=[{text:"Continue"}],{role:message.role===TLLMMessageRole.Assistant?"model":"user",parts}})}formatToolsForVertexAI(tools){return[{functionDeclarations:tools.map(tool=>({name:tool.name,description:tool.description||"",parameters:{type:"object",properties:tool.properties||{},required:tool.requiredFields||[]}}))}]}formatToolsConfig({toolDefinitions,toolChoice="auto"}){return{tools:toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{name,description,properties,requiredFields}}),toolChoice:{type:toolChoice}}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[],parseFunctionArgs=args=>{if(typeof args=="string")try{return JSON.parse(args)}catch{return args}return args??{}},parseFunctionResponse=response=>{if(typeof response=="string")try{const parsed=JSON.parse(response);return typeof parsed=="string"&&parsed!==response?parseFunctionResponse(parsed):parsed}catch{return response}return response??{}};if(messageBlock){const parts=[];if(Array.isArray(messageBlock.parts)&&messageBlock.parts.length>0){for(const part of messageBlock.parts)if(part){if(typeof part.text=="string"&&part.text.trim()){parts.push({text:part.text.trim()});continue}if(part.functionCall){parts.push({functionCall:{name:part.functionCall.name,args:parseFunctionArgs(part.functionCall.args)}});continue}if(part.functionResponse){parts.push({functionResponse:{name:part.functionResponse.name,response:parseFunctionResponse(part.functionResponse.response)}});continue}part.inlineData&&parts.push({inlineData:part.inlineData})}}else typeof messageBlock.content=="string"&&messageBlock.content.trim()?parts.push({text:messageBlock.content.trim()}):Array.isArray(messageBlock.content)&&messageBlock.content.length>0&&parts.push(...messageBlock.content);if(Array.isArray(messageBlock.tool_calls)&&messageBlock.tool_calls.length>0){const functionCalls=messageBlock.tool_calls.map(toolCall=>{if(toolCall?.function?.name)return{functionCall:{name:toolCall.function.name,args:parseFunctionArgs(toolCall.function.arguments)}}}).filter(Boolean);parts.push(...functionCalls)}if(!parts.some(part=>part.functionCall)&&toolsData.length>0&&toolsData.forEach(toolCall=>{parts.push({functionCall:{name:toolCall.name,args:parseFunctionArgs(toolCall.arguments)}})}),parts.length>0){let role=messageBlock.role;role===TLLMMessageRole.Assistant?role=TLLMMessageRole.Model:role===TLLMMessageRole.Tool&&(role=TLLMMessageRole.Function),messageBlocks.push({role,parts})}}const functionResponseParts=toolsData.filter(toolData=>toolData.result!==void 0).map(toolData=>({functionResponse:{name:toolData.name,response:parseFunctionResponse(toolData.result)}}));return functionResponseParts.length>0&&messageBlocks.push({role:TLLMMessageRole.Function,parts:functionResponseParts}),messageBlocks}}__decorateClass$n([hookAsync("LLMConnector.request")],VertexAIConnector.prototype,"request"),__decorateClass$n([hookAsync("LLMConnector.streamRequest")],VertexAIConnector.prototype,"streamRequest");var __defProp$F=Object.defineProperty,__getOwnPropDesc$m=Object.getOwnPropertyDescriptor,__defNormalProp$F=(obj,key,value)=>key in obj?__defProp$F(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$m=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$m(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$F(target,key,result),result},__publicField$F=(obj,key,value)=>__defNormalProp$F(obj,key+"",value);const logger$8=Logger("PerplexityConnector");class PerplexityConnector extends LLMConnector{constructor(){super(...arguments),__publicField$F(this,"name","LLM:Perplexity")}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Perplexity");return axios.create({baseURL:params?.modelInfo?.baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context:context2}){try{logger$8.debug(`request ${this.name}`,acRequest.candidate);const response=await(await this.getClient(context2)).post("/chat/completions",body),content=response?.data?.choices?.[0]?.message.content,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage;return this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content,finishReason,useTool:!1,toolsData:[],message:{content,role:"assistant"},usage}}catch(error){throw logger$8.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){const emitter=new EventEmitter$1;return setTimeout(()=>{try{logger$8.debug(`streamRequest ${this.name}`,acRequest.candidate),this.request({acRequest,body,context:context2}).then(respose=>{const finishReason=respose.finishReason,usage=respose.usage;emitter.emit(TLLMEvent.Data,respose),emitter.emit(TLLMEvent.Content,respose.content),finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),emitter.emit(TLLMEvent.End,[],[usage],finishReason)}).catch(error=>{emitter.emit(TLLMEvent.Error,error.message||error.toString())})}catch(error){logger$8.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit(TLLMEvent.Error,error.message||error.toString())}},100),emitter}async reqBodyAdapter(params){const messages=params?.messages||[];(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),delete params.responseFormat);const body={model:params.model,messages};return params?.maxTokens!==void 0&&(body.max_tokens=params.maxTokens),params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.topK!==void 0&&(body.top_k=params.topK),params?.frequencyPenalty&&(body.frequency_penalty=params.frequencyPenalty),params?.presencePenalty!==void 0&&(body.presence_penalty=params.presencePenalty),params.responseFormat&&(body.response_format=params.responseFormat),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),output_tokens:usage?.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,reasoning_tokens:usage?.reasoning_tokens||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$m([hookAsync("LLMConnector.request")],PerplexityConnector.prototype,"request"),__decorateClass$m([hookAsync("LLMConnector.streamRequest")],PerplexityConnector.prototype,"streamRequest");var __defProp$E=Object.defineProperty,__getOwnPropDesc$l=Object.getOwnPropertyDescriptor,__defNormalProp$E=(obj,key,value)=>key in obj?__defProp$E(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$l=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$l(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$E(target,key,result),result},__publicField$E=(obj,key,value)=>__defNormalProp$E(obj,key+"",value);const logger$7=Logger("xAIConnector");class xAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$E(this,"name","LLM:Grok")}async getClient(params){const apiKey=params.credentials?.apiKey,baseURL=params?.modelInfo?.baseURL||"https://api.x.ai/v1";if(!apiKey)throw new Error("Please provide an API key for Grok");return axios.create({baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context:context2}){try{logger$7.debug(`request ${this.name}`,acRequest.candidate);const response=await(await this.getClient(context2)).post("/chat/completions",body),message=response?.data?.choices?.[0]?.message,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage,citations=response?.data?.citations;let toolsData=[],useTool=!1;finishReason==="tool_calls"&&(toolsData=message?.tool_calls?.map((tool,index)=>({index,id:tool?.id,type:tool?.type,name:tool?.function?.name,arguments:tool?.function?.arguments,role:"tool"}))||[],useTool=!0);let content=message?.content??"";if(citations&&citations.length>0){const citationsText=`
|
|
207
247
|
|
|
208
248
|
**Sources:**
|
|
209
249
|
`+citations.map((url,index)=>`${index+1}. ${url}`).join(`
|
|
210
250
|
`);content+=citationsText}return this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId}),{content,finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$7.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){const emitter=new EventEmitter$1;try{logger$7.debug(`streamRequest ${this.name}`,acRequest.candidate);const response=await(await this.getClient(context2)).post("/chat/completions",{...body,stream:!0,stream_options:{include_usage:!0}},{responseType:"stream"}),reportedUsage=[];let finishReason="stop",toolsData=[],usage={},citations=[];response.data.on("data",chunk=>{const lines=chunk.toString().split(`
|
|
211
|
-
`);for(const line of lines)if(line.startsWith("data: ")){const data=line.slice(6);if(data==="[DONE]")continue;try{const parsed=JSON.parse(data),delta=parsed.choices?.[0]?.delta;if(parsed?.usage&&(usage=parsed.usage),parsed.citations&&(citations=parsed.citations),delta&&(emitter.emit(
|
|
251
|
+
`);for(const line of lines)if(line.startsWith("data: ")){const data=line.slice(6);if(data==="[DONE]")continue;try{const parsed=JSON.parse(data),delta=parsed.choices?.[0]?.delta;if(parsed?.usage&&(usage=parsed.usage),parsed.citations&&(citations=parsed.citations),delta&&(emitter.emit(TLLMEvent.Data,delta),delta.content&&emitter.emit(TLLMEvent.Content,delta.content,delta.role),delta.tool_calls)){const toolCall=delta.tool_calls[0],index=toolCall?.index;toolsData[index]={index,role:"tool",id:(toolsData?.[index]?.id||"")+(toolCall?.id||""),type:(toolsData?.[index]?.type||"")+(toolCall?.type||""),name:(toolsData?.[index]?.name||"")+(toolCall?.function?.name||""),arguments:(toolsData?.[index]?.arguments||"")+(toolCall?.function?.arguments||"")}}parsed.choices?.[0]?.finish_reason&&(finishReason=parsed.choices[0].finish_reason)}catch{}}}),response.data.on("end",()=>{if(citations&&citations.length>0){const citationsText=`
|
|
212
252
|
|
|
213
253
|
**Sources:**
|
|
214
254
|
`+citations.map((url,index)=>`${index+1}. ${url}`).join(`
|
|
215
|
-
`);emitter.emit("content",citationsText,"assistant")}if(toolsData.length>0&&emitter.emit("toolInfo",toolsData),Object.keys(usage).length>0){const _reported=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});reportedUsage.push(_reported)}finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)},100)}),response.data.on("error",error=>{emitter.emit("error",error)})}catch(error){logger$7.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit("error",error)}return emitter}async reqBodyAdapter(params){const messages=params?.messages||[],modelName=params.model;(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),params.responseFormat={type:"json_object"});const body={model:modelName,messages};if(params?.maxTokens!==void 0&&(body.max_tokens=params.maxTokens),params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.responseFormat&&(body.response_format=params.responseFormat),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(body.tools=params.toolsConfig.tools),params?.toolsConfig?.tool_choice&&(body.tool_choice=params.toolsConfig.tool_choice),params?.useSearch){body.search_parameters={},params.searchMode&&(body.search_parameters.mode=params.searchMode),params.returnCitations!==void 0&&(body.search_parameters.return_citations=params.returnCitations),params.maxSearchResults!==void 0&&(body.search_parameters.max_search_results=params.maxSearchResults),params.fromDate&&(body.search_parameters.from_date=params.fromDate),params.toDate&&(body.search_parameters.to_date=params.toDate);const sources=[];params.searchDataSources&¶ms.searchDataSources.length>0&¶ms.searchDataSources.forEach(sourceType=>{const source={type:sourceType};(sourceType==="web"||sourceType==="news")&&(params.searchCountry&&(source.country=params.searchCountry),params.excludedWebsites&¶ms.excludedWebsites.length>0?source.excluded_websites=params.excludedWebsites:params.allowedWebsites&¶ms.allowedWebsites.length>0&&(source.allowed_websites=params.allowedWebsites),params.safeSearch!==void 0&&(source.safe_search=params.safeSearch)),sourceType==="x"&&(params.includedXHandles&¶ms.includedXHandles.length>0?source.included_x_handles=params.includedXHandles:params.excludedXHandles&¶ms.excludedXHandles.length>0&&(source.excluded_x_handles=params.excludedXHandles),params.postFavoriteCount!==void 0&¶ms.postFavoriteCount>0&&(source.post_favorite_count=params.postFavoriteCount),params.postViewCount!==void 0&¶ms.postViewCount>0&&(source.post_view_count=params.postViewCount)),sourceType==="rss"&¶ms.rssLinks&&(source.links=params.rssLinks),sources.push(source)}),sources.length>0&&(body.search_parameters.sources=sources)}return body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),output_tokens:usage?.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,reasoning_tokens:usage?.completion_tokens_details?.reasoning_tokens||usage?.reasoning_tokens||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$l([hookAsync("LLMConnector.request")],xAIConnector.prototype,"request"),__decorateClass$l([hookAsync("LLMConnector.streamRequest")],xAIConnector.prototype,"streamRequest");var __defProp$G=Object.defineProperty,__getOwnPropDesc$k=Object.getOwnPropertyDescriptor,__defNormalProp$G=(obj,key,value)=>key in obj?__defProp$G(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$G(target,key,result),result},__publicField$G=(obj,key,value)=>__defNormalProp$G(obj,key+"",value);const logger$6=Logger("OllamaConnector");class OllamaConnector extends LLMConnector{constructor(){super(...arguments),__publicField$G(this,"name","LLM:Ollama")}getClient(context2){let host="http://localhost:11434";const apiKey=context2.credentials?.apiKey,baseURL=context2?.modelInfo?.baseURL;baseURL&&(host=new URL(baseURL).origin);const config2={host};return apiKey&&(config2.headers={Authorization:`Bearer ${apiKey}`}),new Ollama(config2)}async request({acRequest,body,context:context2}){try{logger$6.debug(`request ${this.name}`,acRequest.candidate);const result=await this.getClient(context2).chat({...body,stream:!1}),message=result.message,finishReason=result.done_reason||"stop",usage={prompt_tokens:result.prompt_eval_count||0,completion_tokens:result.eval_count||0,total_tokens:(result.prompt_eval_count||0)+(result.eval_count||0)};this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});let toolsData=[],useTool=!1;return message?.tool_calls&&(toolsData=message.tool_calls.map((tool,index)=>({index,id:tool.function?.name||`tool_${index}`,type:"function",name:tool.function.name,arguments:tool.function.arguments,role:TLLMMessageRole.Assistant})),useTool=!0),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$6.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$6.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,usage_data=[],stream=await this.getClient(context2).chat({...body,stream:!0});let toolsData=[],fullContent="";return(async()=>{for await(const chunk of stream){if(chunk.message?.content){const content=chunk.message.content;fullContent+=content,emitter.emit("content",content)}if(chunk.message?.tool_calls&&chunk.message.tool_calls.forEach((toolCall,index)=>{toolsData[index]?typeof toolsData[index].arguments=="string"&&typeof toolCall.function?.arguments=="string"?toolsData[index].arguments+=toolCall.function.arguments:toolsData[index].arguments={...toolsData[index].arguments,...toolCall.function?.arguments}:toolsData[index]={index,id:toolCall.function?.name||`tool_${index}`,type:"function",name:toolCall.function?.name,arguments:toolCall.function?.arguments||"",role:"assistant"}}),chunk.prompt_eval_count!==void 0||chunk.eval_count!==void 0){const usage={prompt_tokens:chunk.prompt_eval_count||0,completion_tokens:chunk.eval_count||0,total_tokens:(chunk.prompt_eval_count||0)+(chunk.eval_count||0)};usage_data.push(usage)}}toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),usage_data.forEach(usage=>{this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId})}),setTimeout(()=>{emitter.emit("end",toolsData)},100)})(),emitter}catch(error){throw logger$6.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){const messages=params?.messages||[],body={model:params.model,messages};(params?.responseFormat||"")==="json"&&(messages?.[0]?.role==="system"?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:"system",content:JSON_RESPONSE_INSTRUCTION}));const options={};return params.maxTokens!==void 0&&(options.num_predict=params.maxTokens),params.temperature!==void 0&&(options.temperature=params.temperature),params.topP!==void 0&&(options.top_p=params.topP),params.topK!==void 0&&(options.top_k=params.topK),params.stopSequences?.length&&(options.stop=params.stopSequences),Object.keys(options).length>0&&(body.options=options),params.toolsConfig?.tools&&(body.tools=params.toolsConfig.tools.map(tool=>({type:"function",function:{name:tool.function.name,description:tool.function.description,parameters:tool.function.parameters}}))),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.prompt_tokens,output_tokens:usage.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls){const args=toolCall?.function?.arguments;if(typeof args=="string")try{toolCall.function.arguments=JSON.parse(args)}catch{toolCall.function.arguments={}}}messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice}:{}}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$k([hookAsync("LLMConnector.request")],OllamaConnector.prototype,"request"),__decorateClass$k([hookAsync("LLMConnector.streamRequest")],OllamaConnector.prototype,"streamRequest");class LLMService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.LLM,"Echo",EchoConnector),ConnectorService.register(TConnectorService.LLM,"OpenAI",OpenAIConnector),ConnectorService.register(TConnectorService.LLM,"DeepSeek",OpenAIConnector),ConnectorService.register(TConnectorService.LLM,"GoogleAI",GoogleAIConnector),ConnectorService.register(TConnectorService.LLM,"Anthropic",AnthropicConnector),ConnectorService.register(TConnectorService.LLM,"Groq",GroqConnector),ConnectorService.register(TConnectorService.LLM,"TogetherAI",OpenAIConnector),ConnectorService.register(TConnectorService.LLM,"Bedrock",BedrockConnector),ConnectorService.register(TConnectorService.LLM,"VertexAI",VertexAIConnector),ConnectorService.register(TConnectorService.LLM,"xAI",xAIConnector),ConnectorService.register(TConnectorService.LLM,"Perplexity",PerplexityConnector),ConnectorService.register(TConnectorService.LLM,"Ollama",OllamaConnector)}init(){ConnectorService.init(TConnectorService.LLM,"Echo"),ConnectorService.init(TConnectorService.LLM,"OpenAI"),ConnectorService.init(TConnectorService.LLM,"DeepSeek"),ConnectorService.init(TConnectorService.LLM,"GoogleAI"),ConnectorService.init(TConnectorService.LLM,"Anthropic"),ConnectorService.init(TConnectorService.LLM,"Groq"),ConnectorService.init(TConnectorService.LLM,"TogetherAI"),ConnectorService.init(TConnectorService.LLM,"Bedrock"),ConnectorService.init(TConnectorService.LLM,"VertexAI"),ConnectorService.init(TConnectorService.LLM,"xAI"),ConnectorService.init(TConnectorService.LLM,"Perplexity"),ConnectorService.init(TConnectorService.LLM,"Ollama")}}var __defProp$F=Object.defineProperty,__getOwnPropDesc$j=Object.getOwnPropertyDescriptor,__defNormalProp$F=(obj,key,value)=>key in obj?__defProp$F(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$j=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$j(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$F(target,key,result),result},__publicField$F=(obj,key,value)=>__defNormalProp$F(obj,typeof key!="symbol"?key+"":key,value);const console$i=Logger("RedisCache");class RedisCache extends CacheConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$F(this,"name","RedisCache"),__publicField$F(this,"redis"),__publicField$F(this,"_prefix","smyth:cache"),__publicField$F(this,"_mdPrefix","smyth:metadata");const sentinels=parseSentinelHosts(_settings.hosts||process.env.REDIS_HOSTS);let host=sentinels.length===1?sentinels[0].host:null,port=sentinels.length===1?sentinels[0].port:null;this.redis=new IORedis({...host?{host,port}:{sentinels,name:_settings.name||process.env.REDIS_MASTER_NAME},password:_settings.password||process.env.REDIS_PASSWORD}),this.redis.on("error",error=>{console$i.error("Redis Error:",error)}),this.redis.on("connect",()=>{console$i.log("Redis connected!")})}get client(){return this.redis}get prefix(){return this._prefix}get mdPrefix(){return this._mdPrefix}async get(acRequest,key){return await this.redis.get(`${this._prefix}:${key}`)}async set(acRequest,key,data,acl,metadata,ttl){const accessCandidate=acRequest.candidate,promises=[],newMetadata=metadata||{};return newMetadata.acl=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,ttl&&ttl>0?(promises.push(this.redis.set(`${this._prefix}:${key}`,data,"EX",ttl)),promises.push(this.setMetadataWithTTL(acRequest,key,newMetadata,ttl))):(promises.push(this.redis.set(`${this._prefix}:${key}`,data)),promises.push(this.setMetadata(acRequest,key,newMetadata))),await Promise.all(promises),!0}async delete(acRequest,key){await Promise.all([this.redis.del(`${this._prefix}:${key}`),this.redis.del(`${this._mdPrefix}:${key}`)])}async exists(acRequest,key){return!!await this.redis.exists(`${this._prefix}:${key}`)}async getMetadata(acRequest,key){if(this.exists(acRequest,key))try{const metadata=await this.redis.get(`${this._mdPrefix}:${key}`);return metadata?this.deserializeRedisMetadata(metadata):{}}catch{return{}}}async setMetadata(acRequest,key,metadata){if(metadata.acl){const newACL=ACL.from(metadata.acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL;metadata.acl=newACL}if(!metadata.acl){const curACL=await this.getACL(acRequest,key);metadata.acl=curACL}await this.setMetadataWithTTL(acRequest,key,metadata)}async setMetadataWithTTL(acRequest,key,metadata,ttl){ttl&&ttl>0?await this.redis.set(`${this._mdPrefix}:${key}`,this.serializeRedisMetadata(metadata),"EX",ttl):await this.redis.set(`${this._mdPrefix}:${key}`,this.serializeRedisMetadata(metadata))}async updateTTL(acRequest,key,ttl){ttl&&await Promise.all([this.redis.expire(`${this._prefix}:${key}`,ttl),this.redis.expire(`${this._mdPrefix}:${key}`,ttl)])}async getTTL(acRequest,key){return this.redis.ttl(`${this._prefix}:${key}`)}async getResourceACL(resourceId,candidate){const _metadata=await this.redis.get(`${this._mdPrefix}:${resourceId}`).catch(error=>{}),exists=_metadata!=null,metadata=exists?this.deserializeRedisMetadata(_metadata):{};return exists?ACL.from(metadata?.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async getACL(acRequest,key){try{return(await this.getMetadata(acRequest,key))?.acl||{}}catch(error){throw console$i.error("Error getting access rights in S3",error.name,error.message),error}}async setACL(acRequest,key,acl){try{let metadata=await this.getMetadata(acRequest,key);metadata||(metadata={}),metadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,metadata)}catch(error){throw console$i.error("Error setting access rights in S3",error),error}}serializeRedisMetadata(redisMetadata){if(!redisMetadata)return"";if(redisMetadata.acl){const acl=redisMetadata.acl;acl&&(redisMetadata.acl=ACL.from(acl).serializedACL)}return JSON.stringify(redisMetadata)}deserializeRedisMetadata(strMetadata){try{const redisMetadata=JSON.parse(strMetadata);if(redisMetadata.acl){const acl=ACL.from(redisMetadata.acl).ACL;redisMetadata.acl=acl}return redisMetadata}catch{return console$i.warn("Error deserializing metadata",strMetadata),{}}}async stop(){super.stop(),await this.redis.quit()}}__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"get"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"set"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"delete"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"exists"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"getMetadata"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"setMetadata"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"updateTTL"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"getTTL"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"getACL"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"setACL");function parseSentinelHosts(hosts){return typeof hosts=="string"?hosts.split(",").map(host=>{const[hostName,port]=host.split(":");return{host:hostName,port:Number(port)}}):Array.isArray(hosts)?hosts.map(host=>{if(typeof host=="string"){const[hostName,port]=host.split(":");return{host:hostName,port:Number(port)}}else return host}):[]}var __defProp$E=Object.defineProperty,__getOwnPropDesc$i=Object.getOwnPropertyDescriptor,__defNormalProp$E=(obj,key,value)=>key in obj?__defProp$E(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$i=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$i(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$E(target,key,result),result},__publicField$E=(obj,key,value)=>__defNormalProp$E(obj,typeof key!="symbol"?key+"":key,value);const console$h=Logger("S3Cache");class S3Cache extends CacheConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$E(this,"name","S3Cache"),__publicField$E(this,"s3Client"),__publicField$E(this,"bucketName"),__publicField$E(this,"isInitialized",!1),__publicField$E(this,"cachePrefix","_smyth_cache"),this.s3Client=new S3Client({region:_settings.region,credentials:{accessKeyId:_settings.accessKeyId,secretAccessKey:_settings.secretAccessKey}}),this.bucketName=_settings.bucketName}get client(){return this.s3Client}async get(acRequest,key){const candidateId=acRequest.candidate.id;this.isInitialized||await this.initialize();try{const params={Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`},s3HeadCommand=new HeadObjectCommand(params),expirationHeader=(await this.s3Client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]);if(new Date>expirationDate){const s3DeleteCommand=new DeleteObjectCommand(params);return await this.s3Client.send(s3DeleteCommand),console$h.log(`Object ${key} expired and deleted.`),null}}}const s3GetCommand=new GetObjectCommand(params);return(await this.s3Client.send(s3GetCommand)).Body.transformToString()}catch(error){throw console$h.error(`Error reading object ${key}:`,error),null}}async set(acRequest,key,data,acl,metadata,ttl){const accessCandidate=acRequest.candidate,candidateId=accessCandidate.id,newMetadata=metadata||{};newMetadata.acl=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL;const serializedMetadata=this.serializeS3Metadata(newMetadata),s3PutCommandConfig={Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`,Body:data,Metadata:serializedMetadata};if(ttl){const expiryMetadata=generateExpiryMetadata(ttlToExpiryDays(ttl));s3PutCommandConfig.Tagging=`${expiryMetadata.Key}=${expiryMetadata.Value}`}const s3PutCommand=new PutObjectCommand(s3PutCommandConfig);return await this.s3Client.send(s3PutCommand),!0}async delete(acRequest,key){try{const candidateId=acRequest.candidate.id,deleteCommand=new DeleteObjectCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`});await this.s3Client.send(deleteCommand)}catch(error){console$h.log(`Error deleting object ${key}:`,error);return}}async exists(acRequest,key){const candidateId=acRequest.candidate.id;try{const params={Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`},s3HeadCommand=new HeadObjectCommand(params),expirationHeader=(await this.s3Client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]);if(new Date>expirationDate)return await this.delete(acRequest,key),console$h.log(`Object ${key} expired and deleted.`),!1}}return!0}catch(error){return console$h.error(`Error reading object ${key}:`,error),!1}}async getMetadata(acRequest,key){const candidateId=acRequest.candidate.id;try{return await this.getS3Metadata(`${this.cachePrefix}/${candidateId}/${key}`)}catch(error){throw console$h.error("Error getting access rights in S3",error.name,error.message),error}}async setMetadata(acRequest,key,metadata){const candidateId=acRequest.candidate.id;try{let s3Metadata=await this.getS3Metadata(`${this.cachePrefix}/${candidateId}/${key}`);s3Metadata||(s3Metadata={}),s3Metadata={...s3Metadata,...metadata},await this.setS3Metadata(`${this.cachePrefix}/${candidateId}/${key}`,s3Metadata)}catch(error){throw console$h.error("Error setting access rights in S3",error),error}}async updateTTL(acRequest,key,ttl){if(ttl){const candidateId=acRequest.candidate.id,expiryMetadata=generateExpiryMetadata(ttlToExpiryDays(ttl)),s3PutObjectTaggingCommand=new PutObjectTaggingCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`,Tagging:{TagSet:[{Key:expiryMetadata.Key,Value:expiryMetadata.Value}]}});await this.s3Client.send(s3PutObjectTaggingCommand)}}async getTTL(acRequest,key){const candidateId=acRequest.candidate.id,s3HeadCommand=new HeadObjectCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`}),expirationHeader=(await this.s3Client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]),currentDate=new Date,timeDifference=expirationDate.getTime()-currentDate.getTime();return Math.floor(timeDifference/(1e3*60*60*24))}}return-1}async getResourceACL(resourceId,candidate){try{const s3HeadCommand=new HeadObjectCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidate.id}/${resourceId}`}),metadata=(await this.s3Client.send(s3HeadCommand)).Metadata;return metadata.acl?ACL.from(metadata?.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}catch(error){if(error.name==="NotFound")return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);throw error}}async getACL(acRequest,key){try{return(await this.getMetadata(acRequest,key))?.acl||{}}catch(error){throw error}}async setACL(acRequest,key,acl){try{let metadata=await this.getMetadata(acRequest,key);metadata||(metadata={}),metadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,metadata)}catch(error){throw console$h.error("Error setting access rights in S3",error),error}}async getS3Metadata(resourceId){try{const command=new HeadObjectCommand({Bucket:this.bucketName,Key:resourceId}),response=await this.client.send(command),s3RawMetadata=response.Metadata;if(!s3RawMetadata||Object.keys(s3RawMetadata).length===0)return{};let metadata=this.deserializeS3Metadata(s3RawMetadata);return metadata.ContentType||(metadata.ContentType=response.ContentType?response.ContentType:"application/octet-stream"),metadata}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$h.error("Error reading object metadata from S3",error.name,error.message),error}}async setS3Metadata(resourceId,metadata){try{const getObjectTaggingCommand=new GetObjectTaggingCommand({Bucket:this.bucketName,Key:resourceId}),objectTagging=await this.client.send(getObjectTaggingCommand),serializedMetadata=this.serializeS3Metadata(metadata),copyObjectCommand=new CopyObjectCommand({Bucket:this.bucketName,CopySource:`${this.bucketName}/${resourceId}`,Key:resourceId,Metadata:serializedMetadata,MetadataDirective:"REPLACE",Tagging:objectTagging.TagSet.map(tag=>`${tag.Key}=${tag.Value}`).join("&")});await this.client.send(copyObjectCommand)}catch(error){throw console$h.error("Error setting object metadata in S3",error.name,error.message),error}}async initialize(){await checkAndInstallLifecycleRules(this.bucketName,this.s3Client),this.isInitialized=!0}serializeS3Metadata(s3Metadata){let amzMetadata={};s3Metadata.acl&&(amzMetadata.acl=typeof s3Metadata.acl=="string"?s3Metadata.acl:ACL.from(s3Metadata.acl).serializedACL,delete s3Metadata.acl);for(let key in s3Metadata)key!="ContentType"&&(amzMetadata[key]=typeof s3Metadata[key]=="string"?s3Metadata[key]:JSON.stringify(s3Metadata[key]));return amzMetadata}deserializeS3Metadata(amzMetadata){let metadata={};for(let key in amzMetadata){if(key==="acl"){metadata[key]=ACL.from(amzMetadata[key]).ACL;continue}try{metadata[key]=JSON.parse(amzMetadata[key])}catch{metadata[key]=amzMetadata[key]}}return metadata}}__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"get"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"set"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"delete"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"exists"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"getMetadata"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"setMetadata"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"updateTTL"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"getTTL"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"getACL"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"setACL");var __defProp$D=Object.defineProperty,__getOwnPropDesc$h=Object.getOwnPropertyDescriptor,__defNormalProp$D=(obj,key,value)=>key in obj?__defProp$D(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$h=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$h(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$D(target,key,result),result},__publicField$D=(obj,key,value)=>__defNormalProp$D(obj,typeof key!="symbol"?key+"":key,value);const console$g=Logger("LocalStorageCache");class LocalStorageCache extends CacheConnector{constructor(_settings){super(_settings),__publicField$D(this,"name","LocalStorageCache"),__publicField$D(this,"folder"),__publicField$D(this,"_prefix","cache"),__publicField$D(this,"_mdPrefix","cache.metadata"),__publicField$D(this,"isInitialized",!1),this.folder=_settings.folder||`${os.tmpdir()}/.smyth/cache`,this.initialize()}async initialize(){existsSync(this.folder)||mkdirSync(this.folder,{recursive:!0});const cacheFolderPath=path.join(this.folder,this._prefix);existsSync(cacheFolderPath)||mkdirSync(cacheFolderPath,{recursive:!0});const metadataFolderPath=path.join(this.folder,this._mdPrefix);existsSync(metadataFolderPath)||(mkdirSync(metadataFolderPath,{recursive:!0}),writeFileSync(path.join(metadataFolderPath,"README_IMPORTANT.txt"),"This folder is used for smythOS metadata, do not delete it, it will break SmythOS cache functionality")),this.isInitialized=!0}get prefix(){return this._prefix}get mdPrefix(){return this._mdPrefix}async get(acRequest,key){this.isInitialized||await this.initialize();try{const filePath=this.getStorageFilePath(acRequest.candidate.id,key);if(!existsSync(filePath))return;const data=readFileSync(filePath,"utf-8"),metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);if(metadataObject.expiresAt&&metadataObject.expiresAt<Date.now()){await this.delete(acRequest,key);return}return data}catch(error){throw console$g.error("Error reading object from local storage",error.name,error.message),error}}async set(acRequest,key,data,acl,metadata,ttl){this.isInitialized||await this.initialize();const accessCandidate=acRequest.candidate;let amzACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,fileMetadata={...metadata,acl:amzACL,...ttl?{expiresAt:Date.now()+ttl*1e3}:{}};const storageFolderPath=this.getStorageFilePath(acRequest.candidate.id,key,!0);this.createDirectories(storageFolderPath,key);const filePath=this.getStorageFilePath(acRequest.candidate.id,key);return writeFileSync(filePath,data),await this.setMetadata(acRequest,key,fileMetadata),!0}async delete(acRequest,key){try{const filePath=this.getStorageFilePath(acRequest.candidate.id,key);if(!existsSync(filePath))return;unlinkSync(filePath);const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key);unlinkSync(metadataFilePath)}catch(error){throw console$g.error("Error deleting object from local storage",error.name,error.message),error}}async exists(acRequest,key){this.isInitialized||await this.initialize();const filePath=this.getStorageFilePath(acRequest.candidate.id,key);if(!existsSync(filePath))return!1;const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key);if(!existsSync(metadataFilePath))return!1;const metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);return metadataObject.expiresAt&&metadataObject.expiresAt<Date.now()?(await this.delete(acRequest,key),!1):!0}async getMetadata(acRequest,key){try{const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key);if(!existsSync(metadataFilePath))return;const data=readFileSync(metadataFilePath,"utf-8");return this.deserializeMetadata(JSON.parse(data))}catch(error){throw console$g.error("Error reading metadata from LocalStorage",error.name,error.message),error}}async setMetadata(acRequest,key,metadata){try{let fileMetadata=await this.getMetadata(acRequest,key);fileMetadata||(fileMetadata={}),fileMetadata={...fileMetadata,...metadata};const metadataFolderPath=this.getMetadataFilePath(acRequest.candidate.id,key,!0);this.createDirectories(metadataFolderPath,key);const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),serializedMetadata=this.serializeMetadata(fileMetadata);writeFileSync(metadataFilePath,JSON.stringify(serializedMetadata))}catch(error){throw console$g.error("Error setting metadata in local storage",error.name,error.message),error}}async updateTTL(acRequest,key,ttl){if(ttl){const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);metadataObject.expiresAt=Date.now()+ttl*1e3,writeFileSync(metadataFilePath,JSON.stringify(metadataObject))}}async getTTL(acRequest,key){const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);return metadataObject.expiresAt&&metadataObject.expiresAt>Date.now()?Math.floor((metadataObject.expiresAt-Date.now())/1e3):0}async getResourceACL(resourceId,candidate){this.isInitialized||await this.initialize();const metadataFilePath=this.getMetadataFilePath(candidate.id,resourceId);if(!existsSync(metadataFilePath))return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);const metadata=readFileSync(metadataFilePath,"utf-8");if(metadata===void 0)return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);try{let metadataObject=JSON.parse(metadata);return ACL.from(metadataObject?.acl)}catch(error){throw console$g.error("Error parsing metadata in local storage",error.name,error.message),error}}async getACL(acRequest,key){try{const fileMetadata=await this.getMetadata(acRequest,key);return ACL.from(fileMetadata?.acl)}catch(error){throw console$g.error("Error getting access rights in local storage",error.name,error.message),error}}async setACL(acRequest,key,acl){try{let fileMetadata=await this.getMetadata(acRequest,key);fileMetadata||(fileMetadata={}),fileMetadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,fileMetadata)}catch(error){throw console$g.error("Error setting access rights in local storage",error),error}}serializeMetadata(metadata){let updatedMetadata={};metadata.acl&&(metadata.acl&&(updatedMetadata.acl=typeof metadata.acl=="string"?metadata.acl:ACL.from(metadata.acl).serializedACL),delete metadata.acl);for(let key in metadata)key!="ContentType"&&(updatedMetadata[key]=typeof metadata[key]=="string"?metadata[key]:JSON.stringify(metadata[key]));return updatedMetadata}deserializeMetadata(metadata){let deserializedMetadata={};for(let key in metadata){if(key==="acl"){deserializedMetadata[key]=ACL.from(metadata[key]).ACL;continue}try{deserializedMetadata[key]=JSON.parse(metadata[key])}catch{deserializedMetadata[key]=metadata[key]}}return deserializedMetadata}getStorageFilePath(teamId,resourceId,returnBasePath=!1){return existsSync(path.join(this.folder,this._prefix,teamId))||mkdirSync(path.join(this.folder,this._prefix,teamId)),returnBasePath?path.join(this.folder,this._prefix,teamId):path.join(this.folder,this._prefix,teamId,resourceId)}getMetadataFilePath(teamId,resourceId,returnBasePath=!1){return existsSync(path.join(this.folder,this._mdPrefix,teamId))||mkdirSync(path.join(this.folder,this._mdPrefix,teamId)),returnBasePath?path.join(this.folder,this._mdPrefix,teamId):path.join(this.folder,this._mdPrefix,teamId,resourceId)}createDirectories(basePath,resourceId){const folders=resourceId.split("/").slice(0,-1);let currentPath=basePath;for(let folder of folders)currentPath=path.join(currentPath,folder),existsSync(currentPath)||mkdirSync(currentPath)}}__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"get"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"set"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"delete"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"exists"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"getMetadata"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"setMetadata"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"updateTTL"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"getTTL"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"getACL"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"setACL");var __defProp$C=Object.defineProperty,__getOwnPropDesc$g=Object.getOwnPropertyDescriptor,__defNormalProp$C=(obj,key,value)=>key in obj?__defProp$C(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$g=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$g(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$C(target,key,result),result},__publicField$C=(obj,key,value)=>__defNormalProp$C(obj,typeof key!="symbol"?key+"":key,value);const console$f=Logger("RAMCache");class RAMCache extends CacheConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$C(this,"name","RAMCache"),__publicField$C(this,"_prefix","smyth:cache"),__publicField$C(this,"_mdPrefix","smyth:metadata"),__publicField$C(this,"cache",new Map),__publicField$C(this,"cleanupInterval"),this.cleanupInterval=setInterval(()=>this.cleanupExpiredEntries(),6e4),this.cleanupInterval.unref()}get prefix(){return this._prefix}get mdPrefix(){return this._mdPrefix}getFullKey(key){return`${this._prefix}:${key}`}getFullMetadataKey(key){return`${this._mdPrefix}:${key}`}cleanupExpiredEntries(){const now=Date.now();for(const[key,entry]of this.cache.entries())entry.expiresAt&&entry.expiresAt<now&&this.cache.delete(key)}async get(acRequest,key){const fullKey=this.getFullKey(key),entry=this.cache.get(fullKey);return entry?entry.expiresAt&&entry.expiresAt<Date.now()?(this.cache.delete(fullKey),null):entry.value:null}async set(acRequest,key,data,acl,metadata,ttl){const accessCandidate=acRequest.candidate,fullKey=this.getFullKey(key),fullMetadataKey=this.getFullMetadataKey(key),newMetadata=metadata||{};newMetadata.acl=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL;const entry={value:data,metadata:newMetadata,expiresAt:ttl?Date.now()+ttl*1e3:void 0};return this.cache.set(fullKey,entry),this.cache.set(fullMetadataKey,entry),!0}async delete(acRequest,key){const fullKey=this.getFullKey(key),fullMetadataKey=this.getFullMetadataKey(key);this.cache.delete(fullKey),this.cache.delete(fullMetadataKey)}async exists(acRequest,key){const fullKey=this.getFullKey(key),entry=this.cache.get(fullKey);return entry?entry.expiresAt&&entry.expiresAt<Date.now()?(this.cache.delete(fullKey),!1):!0:!1}async getMetadata(acRequest,key){if(!await this.exists(acRequest,key))return;const fullMetadataKey=this.getFullMetadataKey(key);return this.cache.get(fullMetadataKey)?.metadata||{}}async setMetadata(acRequest,key,metadata){const fullMetadataKey=this.getFullMetadataKey(key),entry=this.cache.get(fullMetadataKey);if(entry){const existingMetadata=entry.metadata||{},existingAcl=existingMetadata?.acl,mergedMetadata={...existingMetadata,...metadata};existingAcl?mergedMetadata.acl=ACL.from(existingAcl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL:mergedMetadata.acl?mergedMetadata.acl=ACL.from(mergedMetadata.acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL:mergedMetadata.acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,entry.metadata=mergedMetadata,this.cache.set(fullMetadataKey,entry)}}async updateTTL(acRequest,key,ttl){const fullKey=this.getFullKey(key),fullMetadataKey=this.getFullMetadataKey(key),entry=this.cache.get(fullKey);entry&&(entry.expiresAt=ttl?Date.now()+ttl*1e3:void 0,this.cache.set(fullKey,entry),this.cache.set(fullMetadataKey,entry))}async getTTL(acRequest,key){const fullKey=this.getFullKey(key),entry=this.cache.get(fullKey);if(!entry||!entry.expiresAt)return-1;const remaining=Math.ceil((entry.expiresAt-Date.now())/1e3);return remaining>0?remaining:-1}async getResourceACL(resourceId,candidate){const fullMetadataKey=this.getFullMetadataKey(resourceId),entry=this.cache.get(fullMetadataKey);return entry?ACL.from(entry.metadata?.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async getACL(acRequest,key){try{return(await this.getMetadata(acRequest,key))?.acl||{}}catch(error){throw console$f.error("Error getting access rights in RAMCache",error.name,error.message),error}}async setACL(acRequest,key,acl){try{let metadata=await this.getMetadata(acRequest,key);metadata||(metadata={}),metadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,metadata)}catch(error){throw console$f.error("Error setting access rights in RAMCache",error),error}}async stop(){super.stop(),clearInterval(this.cleanupInterval),this.cache.clear()}}__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"get"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"set"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"delete"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"exists"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"getMetadata"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"setMetadata"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"updateTTL"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"getTTL"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"getACL"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"setACL");class CacheService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Cache,"Redis",RedisCache),ConnectorService.register(TConnectorService.Cache,"S3",S3Cache),ConnectorService.register(TConnectorService.Cache,"LocalStorage",LocalStorageCache),ConnectorService.register(TConnectorService.Cache,"RAM",RAMCache)}}function findSmythPath(_path="",callback){let _smythDir="";_path&&(_smythDir=findSmythPath(""));const searchDirectories=[];if(process.env.SMYTH_PATH){fs__default.existsSync(process.env.SMYTH_PATH)||(console.error("CRITICAL : SMYTH_PATH environment variable is not a valid directory"),process.exit(1));const envDir=path.resolve(process.env.SMYTH_PATH,_path);return fs__default.existsSync(envDir)?callback?.(envDir,!0,null):(callback?.(envDir,!1,null),console.error(`CRITICAL : missing directory (${envDir}) under SMYTH_PATH `)),envDir}const isElectron=!!process.versions.electron;let execPath="";isElectron?process.resourcesPath?execPath=path.dirname(process.resourcesPath):execPath=path.dirname(process.execPath):execPath=process.cwd();const localDir=path.resolve(execPath,".smyth",_path);searchDirectories.push(localDir);const mainScriptPath=process.argv[1],mainScriptDir=mainScriptPath?path.dirname(path.resolve(mainScriptPath)):null;if(mainScriptDir){const mainScriptSmythDir=path.resolve(mainScriptDir,".smyth",_path);searchDirectories.push(mainScriptSmythDir)}const packageRootDir=findPackageRoot();if(packageRootDir){const packageSmythDir=path.resolve(packageRootDir,".smyth",_path);searchDirectories.push(packageSmythDir)}const packageMainRootDir=findPackageRoot(mainScriptDir);if(packageMainRootDir){const packageSmythDir=path.resolve(packageMainRootDir,".smyth",_path);searchDirectories.push(packageSmythDir)}const homeDir=path.resolve(os.homedir(),".smyth",_path);searchDirectories.push(homeDir);const deduplicatedSearchDirectories=Array.from(new Set(searchDirectories));for(let i=0;i<deduplicatedSearchDirectories.length;i++){const dir=deduplicatedSearchDirectories[i],nextDir=deduplicatedSearchDirectories[i+1];if(!fs__default.existsSync(dir)){callback?.(dir,!1,nextDir);continue}return callback?.(dir,!0,null),dir}return _smythDir&&_path?path.resolve(_smythDir,_path):homeDir}function findValidResourcePath(listOfLocations,callback){let found="";const deduplicatedLocations=Array.from(new Set(listOfLocations));for(let location of deduplicatedLocations)if(findSmythPath(location,(dir,success,nextDir)=>{callback?.(dir,success,nextDir),success&&(found=dir)}),found)return found;return found}function findPackageRoot(startDir){try{if(!startDir){const isElectron=!!process.versions.electron;let execPath="";isElectron?process.resourcesPath?execPath=path.dirname(process.resourcesPath):execPath=path.dirname(process.execPath):execPath=process.cwd(),startDir=execPath}let currentDir=startDir;for(;currentDir!==path.dirname(currentDir);){const packageJsonPath=path.resolve(currentDir,"package.json");if(fs__default.existsSync(packageJsonPath))return currentDir;currentDir=path.dirname(currentDir)}}catch{}return null}class VaultConnector extends SecureConnector{constructor(_settings){super(_settings),this._settings=_settings}requester(candidate){return{get:async keyId=>this.get(candidate.readRequest,keyId),exists:async keyId=>this.exists(candidate.readRequest,keyId),listKeys:async()=>this.listKeys(candidate.readRequest)}}}var __defProp$B=Object.defineProperty,__getOwnPropDesc$f=Object.getOwnPropertyDescriptor,__defNormalProp$B=(obj,key,value)=>key in obj?__defProp$B(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$f=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$f(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$B(target,key,result),result},__publicField$B=(obj,key,value)=>__defNormalProp$B(obj,typeof key!="symbol"?key+"":key,value);const logger$5=Logger("JSONFileVault");class JSONFileVault extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$B(this,"name","JSONFileVault"),__publicField$B(this,"vaultData"),__publicField$B(this,"index"),__publicField$B(this,"shared"),__publicField$B(this,"vaultFile"),__publicField$B(this,"watcher",null),__publicField$B(this,"_interactiveVaultCreation",!1),this.shared=_settings.shared||"",this.vaultFile=this.findVaultFile(_settings.file),this.fetchVaultData(this.vaultFile,_settings),this.initFileWatcher()}findVaultFile(vaultFile){let _vaultFile=vaultFile;if(_vaultFile&&fs__default.existsSync(_vaultFile))return _vaultFile;logger$5.warn("Vault file not found in:",_vaultFile);let found="";if(found=findValidResourcePath(["vault.json","vault/vault.json",".sre/vault.json"],(dir,success,nextDir)=>{success||logger$5.warn("Vault file not found in:",dir)}),found)return logger$5.warn("Found a Vault file in : ",found," I will use this one."),found;if(console.warn("!!! All attempts to find the vault file failed !!!"),this._interactiveVaultCreation)process.stdout.write(colors.red+`[ERR] Could not find or create a valid vault file.
|
|
255
|
+
`);emitter.emit(TLLMEvent.Content,citationsText,"assistant")}if(toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),Object.keys(usage).length>0){const _reported=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});reportedUsage.push(_reported)}finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setTimeout(()=>{emitter.emit(TLLMEvent.End,toolsData,reportedUsage,finishReason)},100)}),response.data.on("error",error=>{emitter.emit(TLLMEvent.Error,error)})}catch(error){logger$7.error(`streamRequest ${this.name}`,error,acRequest.candidate),emitter.emit(TLLMEvent.Error,error)}return emitter}async reqBodyAdapter(params){const messages=params?.messages||[],modelName=params.model;(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),params.responseFormat={type:"json_object"});const body={model:modelName,messages};if(params?.maxTokens!==void 0&&(body.max_tokens=params.maxTokens),params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.responseFormat&&(body.response_format=params.responseFormat),params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(body.tools=params.toolsConfig.tools),params?.toolsConfig?.tool_choice&&(body.tool_choice=params.toolsConfig.tool_choice),params?.useSearch){body.search_parameters={},params.searchMode&&(body.search_parameters.mode=params.searchMode),params.returnCitations!==void 0&&(body.search_parameters.return_citations=params.returnCitations),params.maxSearchResults!==void 0&&(body.search_parameters.max_search_results=params.maxSearchResults),params.fromDate&&(body.search_parameters.from_date=params.fromDate),params.toDate&&(body.search_parameters.to_date=params.toDate);const sources=[];params.searchDataSources&¶ms.searchDataSources.length>0&¶ms.searchDataSources.forEach(sourceType=>{const source={type:sourceType};(sourceType==="web"||sourceType==="news")&&(params.searchCountry&&(source.country=params.searchCountry),params.excludedWebsites&¶ms.excludedWebsites.length>0?source.excluded_websites=params.excludedWebsites:params.allowedWebsites&¶ms.allowedWebsites.length>0&&(source.allowed_websites=params.allowedWebsites),params.safeSearch!==void 0&&(source.safe_search=params.safeSearch)),sourceType==="x"&&(params.includedXHandles&¶ms.includedXHandles.length>0?source.included_x_handles=params.includedXHandles:params.excludedXHandles&¶ms.excludedXHandles.length>0&&(source.excluded_x_handles=params.excludedXHandles),params.postFavoriteCount!==void 0&¶ms.postFavoriteCount>0&&(source.post_favorite_count=params.postFavoriteCount),params.postViewCount!==void 0&¶ms.postViewCount>0&&(source.post_view_count=params.postViewCount)),sourceType==="rss"&¶ms.rssLinks&&(source.links=params.rssLinks),sources.push(source)}),sources.length>0&&(body.search_parameters.sources=sources)}return body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),output_tokens:usage?.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,reasoning_tokens:usage?.completion_tokens_details?.reasoning_tokens||usage?.reasoning_tokens||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$l([hookAsync("LLMConnector.request")],xAIConnector.prototype,"request"),__decorateClass$l([hookAsync("LLMConnector.streamRequest")],xAIConnector.prototype,"streamRequest");var __defProp$D=Object.defineProperty,__getOwnPropDesc$k=Object.getOwnPropertyDescriptor,__defNormalProp$D=(obj,key,value)=>key in obj?__defProp$D(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$D(target,key,result),result},__publicField$D=(obj,key,value)=>__defNormalProp$D(obj,key+"",value);const logger$6=Logger("OllamaConnector");class OllamaConnector extends LLMConnector{constructor(){super(...arguments),__publicField$D(this,"name","LLM:Ollama")}getClient(context2){let host="http://localhost:11434";const apiKey=context2.credentials?.apiKey,baseURL=context2?.modelInfo?.baseURL;baseURL&&(host=new URL(baseURL).origin);const config2={host};return apiKey&&(config2.headers={Authorization:`Bearer ${apiKey}`}),new Ollama(config2)}async request({acRequest,body,context:context2}){try{logger$6.debug(`request ${this.name}`,acRequest.candidate);const result=await this.getClient(context2).chat({...body,stream:!1}),message=result.message,finishReason=result.done_reason||"stop",usage={prompt_tokens:result.prompt_eval_count||0,completion_tokens:result.eval_count||0,total_tokens:(result.prompt_eval_count||0)+(result.eval_count||0)};this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});let toolsData=[],useTool=!1;return message?.tool_calls&&(toolsData=message.tool_calls.map((tool,index)=>({index,id:tool.function?.name||`tool_${index}`,type:"function",name:tool.function.name,arguments:tool.function.arguments,role:TLLMMessageRole.Assistant})),useTool=!0),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}catch(error){throw logger$6.error(`request ${this.name}`,error,acRequest.candidate),error}}async streamRequest({acRequest,body,context:context2}){try{logger$6.debug(`streamRequest ${this.name}`,acRequest.candidate);const emitter=new EventEmitter$1,usage_data=[],stream=await this.getClient(context2).chat({...body,stream:!0});let toolsData=[],fullContent="",finishReason="stop";return(async()=>{for await(const chunk of stream){if(emitter.emit(TLLMEvent.Data,chunk),chunk.message?.content){const content=chunk.message.content;fullContent+=content,emitter.emit(TLLMEvent.Content,content)}if(chunk.message?.tool_calls&&chunk.message.tool_calls.forEach((toolCall,index)=>{toolsData[index]?typeof toolsData[index].arguments=="string"&&typeof toolCall.function?.arguments=="string"?toolsData[index].arguments+=toolCall.function.arguments:toolsData[index].arguments={...toolsData[index].arguments,...toolCall.function?.arguments}:toolsData[index]={index,id:toolCall.function?.name||`tool_${index}`,type:"function",name:toolCall.function?.name,arguments:toolCall.function?.arguments||"",role:"assistant"}}),chunk.prompt_eval_count!==void 0||chunk.eval_count!==void 0){const usage={prompt_tokens:chunk.prompt_eval_count||0,completion_tokens:chunk.eval_count||0,total_tokens:(chunk.prompt_eval_count||0)+(chunk.eval_count||0)};usage_data.push(usage)}chunk.done_reason&&(finishReason=chunk.done_reason)}toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData);const reportedUsage=[];usage_data.forEach(usage=>{const reported=this.reportUsage(usage,{modelEntryName:context2.modelEntryName,keySource:context2.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context2.agentId,teamId:context2.teamId});reportedUsage.push(reported)}),finishReason!=="stop"&&emitter.emit(TLLMEvent.Interrupted,finishReason),setTimeout(()=>{emitter.emit(TLLMEvent.End,toolsData,reportedUsage,finishReason)},100)})(),emitter}catch(error){throw logger$6.error(`streamRequest ${this.name}`,error,acRequest.candidate),error}}async reqBodyAdapter(params){const messages=params?.messages||[],body={model:params.model,messages};(params?.responseFormat||"")==="json"&&(messages?.[0]?.role==="system"?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:"system",content:JSON_RESPONSE_INSTRUCTION}));const options={};return params.maxTokens!==void 0&&(options.num_predict=params.maxTokens),params.temperature!==void 0&&(options.temperature=params.temperature),params.topP!==void 0&&(options.top_p=params.topP),params.topK!==void 0&&(options.top_k=params.topK),params.stopSequences?.length&&(options.stop=params.stopSequences),Object.keys(options).length>0&&(body.options=options),params.toolsConfig?.tools&&(body.tools=params.toolsConfig.tools.map(tool=>({type:"function",function:{name:tool.function.name,description:tool.function.description,parameters:tool.function.parameters}}))),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.prompt_tokens,output_tokens:usage.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls){const args=toolCall?.function?.arguments;if(typeof args=="string")try{toolCall.function.arguments=JSON.parse(args)}catch{toolCall.function.arguments={}}}messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice}:{}}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}__decorateClass$k([hookAsync("LLMConnector.request")],OllamaConnector.prototype,"request"),__decorateClass$k([hookAsync("LLMConnector.streamRequest")],OllamaConnector.prototype,"streamRequest");class LLMService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.LLM,"Echo",EchoConnector),ConnectorService.register(TConnectorService.LLM,"OpenAI",OpenAIConnector),ConnectorService.register(TConnectorService.LLM,"DeepSeek",OpenAIConnector),ConnectorService.register(TConnectorService.LLM,"GoogleAI",GoogleAIConnector),ConnectorService.register(TConnectorService.LLM,"Anthropic",AnthropicConnector),ConnectorService.register(TConnectorService.LLM,"Groq",GroqConnector),ConnectorService.register(TConnectorService.LLM,"TogetherAI",OpenAIConnector),ConnectorService.register(TConnectorService.LLM,"Bedrock",BedrockConnector),ConnectorService.register(TConnectorService.LLM,"VertexAI",VertexAIConnector),ConnectorService.register(TConnectorService.LLM,"xAI",xAIConnector),ConnectorService.register(TConnectorService.LLM,"Perplexity",PerplexityConnector),ConnectorService.register(TConnectorService.LLM,"Ollama",OllamaConnector)}init(){ConnectorService.init(TConnectorService.LLM,"Echo"),ConnectorService.init(TConnectorService.LLM,"OpenAI"),ConnectorService.init(TConnectorService.LLM,"DeepSeek"),ConnectorService.init(TConnectorService.LLM,"GoogleAI"),ConnectorService.init(TConnectorService.LLM,"Anthropic"),ConnectorService.init(TConnectorService.LLM,"Groq"),ConnectorService.init(TConnectorService.LLM,"TogetherAI"),ConnectorService.init(TConnectorService.LLM,"Bedrock"),ConnectorService.init(TConnectorService.LLM,"VertexAI"),ConnectorService.init(TConnectorService.LLM,"xAI"),ConnectorService.init(TConnectorService.LLM,"Perplexity"),ConnectorService.init(TConnectorService.LLM,"Ollama")}}var __defProp$C=Object.defineProperty,__getOwnPropDesc$j=Object.getOwnPropertyDescriptor,__defNormalProp$C=(obj,key,value)=>key in obj?__defProp$C(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$j=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$j(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$C(target,key,result),result},__publicField$C=(obj,key,value)=>__defNormalProp$C(obj,typeof key!="symbol"?key+"":key,value);const console$i=Logger("RedisCache");class RedisCache extends CacheConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$C(this,"name","RedisCache"),__publicField$C(this,"redis"),__publicField$C(this,"_prefix","smyth:cache"),__publicField$C(this,"_mdPrefix","smyth:metadata");const sentinels=parseSentinelHosts(_settings.hosts||process.env.REDIS_HOSTS);let host=sentinels.length===1?sentinels[0].host:null,port=sentinels.length===1?sentinels[0].port:null;this.redis=new IORedis({...host?{host,port}:{sentinels,name:_settings.name||process.env.REDIS_MASTER_NAME},password:_settings.password||process.env.REDIS_PASSWORD}),this.redis.on("error",error=>{console$i.error("Redis Error:",error)}),this.redis.on("connect",()=>{console$i.log("Redis connected!")})}get client(){return this.redis}get prefix(){return this._prefix}get mdPrefix(){return this._mdPrefix}async get(acRequest,key){return await this.redis.get(`${this._prefix}:${key}`)}async set(acRequest,key,data,acl,metadata,ttl){const accessCandidate=acRequest.candidate,promises=[],newMetadata=metadata||{};return newMetadata.acl=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,ttl&&ttl>0?(promises.push(this.redis.set(`${this._prefix}:${key}`,data,"EX",ttl)),promises.push(this.setMetadataWithTTL(acRequest,key,newMetadata,ttl))):(promises.push(this.redis.set(`${this._prefix}:${key}`,data)),promises.push(this.setMetadata(acRequest,key,newMetadata))),await Promise.all(promises),!0}async delete(acRequest,key){await Promise.all([this.redis.del(`${this._prefix}:${key}`),this.redis.del(`${this._mdPrefix}:${key}`)])}async exists(acRequest,key){return!!await this.redis.exists(`${this._prefix}:${key}`)}async getMetadata(acRequest,key){if(this.exists(acRequest,key))try{const metadata=await this.redis.get(`${this._mdPrefix}:${key}`);return metadata?this.deserializeRedisMetadata(metadata):{}}catch{return{}}}async setMetadata(acRequest,key,metadata){if(metadata.acl){const newACL=ACL.from(metadata.acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL;metadata.acl=newACL}if(!metadata.acl){const curACL=await this.getACL(acRequest,key);metadata.acl=curACL}await this.setMetadataWithTTL(acRequest,key,metadata)}async setMetadataWithTTL(acRequest,key,metadata,ttl){ttl&&ttl>0?await this.redis.set(`${this._mdPrefix}:${key}`,this.serializeRedisMetadata(metadata),"EX",ttl):await this.redis.set(`${this._mdPrefix}:${key}`,this.serializeRedisMetadata(metadata))}async updateTTL(acRequest,key,ttl){ttl&&await Promise.all([this.redis.expire(`${this._prefix}:${key}`,ttl),this.redis.expire(`${this._mdPrefix}:${key}`,ttl)])}async getTTL(acRequest,key){return this.redis.ttl(`${this._prefix}:${key}`)}async getResourceACL(resourceId,candidate){const _metadata=await this.redis.get(`${this._mdPrefix}:${resourceId}`).catch(error=>{}),exists=_metadata!=null,metadata=exists?this.deserializeRedisMetadata(_metadata):{};return exists?ACL.from(metadata?.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async getACL(acRequest,key){try{return(await this.getMetadata(acRequest,key))?.acl||{}}catch(error){throw console$i.error("Error getting access rights in S3",error.name,error.message),error}}async setACL(acRequest,key,acl){try{let metadata=await this.getMetadata(acRequest,key);metadata||(metadata={}),metadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,metadata)}catch(error){throw console$i.error("Error setting access rights in S3",error),error}}serializeRedisMetadata(redisMetadata){if(!redisMetadata)return"";if(redisMetadata.acl){const acl=redisMetadata.acl;acl&&(redisMetadata.acl=ACL.from(acl).serializedACL)}return JSON.stringify(redisMetadata)}deserializeRedisMetadata(strMetadata){try{const redisMetadata=JSON.parse(strMetadata);if(redisMetadata.acl){const acl=ACL.from(redisMetadata.acl).ACL;redisMetadata.acl=acl}return redisMetadata}catch{return console$i.warn("Error deserializing metadata",strMetadata),{}}}async stop(){super.stop(),await this.redis.quit()}}__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"get"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"set"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"delete"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"exists"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"getMetadata"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"setMetadata"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"updateTTL"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"getTTL"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"getACL"),__decorateClass$j([SecureConnector.AccessControl],RedisCache.prototype,"setACL");function parseSentinelHosts(hosts){return typeof hosts=="string"?hosts.split(",").map(host=>{const[hostName,port]=host.split(":");return{host:hostName,port:Number(port)}}):Array.isArray(hosts)?hosts.map(host=>{if(typeof host=="string"){const[hostName,port]=host.split(":");return{host:hostName,port:Number(port)}}else return host}):[]}var __defProp$B=Object.defineProperty,__getOwnPropDesc$i=Object.getOwnPropertyDescriptor,__defNormalProp$B=(obj,key,value)=>key in obj?__defProp$B(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$i=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$i(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$B(target,key,result),result},__publicField$B=(obj,key,value)=>__defNormalProp$B(obj,typeof key!="symbol"?key+"":key,value);const console$h=Logger("S3Cache");class S3Cache extends CacheConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$B(this,"name","S3Cache"),__publicField$B(this,"s3Client"),__publicField$B(this,"bucketName"),__publicField$B(this,"isInitialized",!1),__publicField$B(this,"cachePrefix","_smyth_cache"),this.s3Client=new S3Client({region:_settings.region,credentials:{accessKeyId:_settings.accessKeyId,secretAccessKey:_settings.secretAccessKey}}),this.bucketName=_settings.bucketName}get client(){return this.s3Client}async get(acRequest,key){const candidateId=acRequest.candidate.id;this.isInitialized||await this.initialize();try{const params={Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`},s3HeadCommand=new HeadObjectCommand(params),expirationHeader=(await this.s3Client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]);if(new Date>expirationDate){const s3DeleteCommand=new DeleteObjectCommand(params);return await this.s3Client.send(s3DeleteCommand),console$h.log(`Object ${key} expired and deleted.`),null}}}const s3GetCommand=new GetObjectCommand(params);return(await this.s3Client.send(s3GetCommand)).Body.transformToString()}catch(error){throw console$h.error(`Error reading object ${key}:`,error),null}}async set(acRequest,key,data,acl,metadata,ttl){const accessCandidate=acRequest.candidate,candidateId=accessCandidate.id,newMetadata=metadata||{};newMetadata.acl=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL;const serializedMetadata=this.serializeS3Metadata(newMetadata),s3PutCommandConfig={Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`,Body:data,Metadata:serializedMetadata};if(ttl){const expiryMetadata=generateExpiryMetadata(ttlToExpiryDays(ttl));s3PutCommandConfig.Tagging=`${expiryMetadata.Key}=${expiryMetadata.Value}`}const s3PutCommand=new PutObjectCommand(s3PutCommandConfig);return await this.s3Client.send(s3PutCommand),!0}async delete(acRequest,key){try{const candidateId=acRequest.candidate.id,deleteCommand=new DeleteObjectCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`});await this.s3Client.send(deleteCommand)}catch(error){console$h.log(`Error deleting object ${key}:`,error);return}}async exists(acRequest,key){const candidateId=acRequest.candidate.id;try{const params={Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`},s3HeadCommand=new HeadObjectCommand(params),expirationHeader=(await this.s3Client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]);if(new Date>expirationDate)return await this.delete(acRequest,key),console$h.log(`Object ${key} expired and deleted.`),!1}}return!0}catch(error){return console$h.error(`Error reading object ${key}:`,error),!1}}async getMetadata(acRequest,key){const candidateId=acRequest.candidate.id;try{return await this.getS3Metadata(`${this.cachePrefix}/${candidateId}/${key}`)}catch(error){throw console$h.error("Error getting access rights in S3",error.name,error.message),error}}async setMetadata(acRequest,key,metadata){const candidateId=acRequest.candidate.id;try{let s3Metadata=await this.getS3Metadata(`${this.cachePrefix}/${candidateId}/${key}`);s3Metadata||(s3Metadata={}),s3Metadata={...s3Metadata,...metadata},await this.setS3Metadata(`${this.cachePrefix}/${candidateId}/${key}`,s3Metadata)}catch(error){throw console$h.error("Error setting access rights in S3",error),error}}async updateTTL(acRequest,key,ttl){if(ttl){const candidateId=acRequest.candidate.id,expiryMetadata=generateExpiryMetadata(ttlToExpiryDays(ttl)),s3PutObjectTaggingCommand=new PutObjectTaggingCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`,Tagging:{TagSet:[{Key:expiryMetadata.Key,Value:expiryMetadata.Value}]}});await this.s3Client.send(s3PutObjectTaggingCommand)}}async getTTL(acRequest,key){const candidateId=acRequest.candidate.id,s3HeadCommand=new HeadObjectCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidateId}/${key}`}),expirationHeader=(await this.s3Client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]),currentDate=new Date,timeDifference=expirationDate.getTime()-currentDate.getTime();return Math.floor(timeDifference/(1e3*60*60*24))}}return-1}async getResourceACL(resourceId,candidate){try{const s3HeadCommand=new HeadObjectCommand({Bucket:this.bucketName,Key:`${this.cachePrefix}/${candidate.id}/${resourceId}`}),metadata=(await this.s3Client.send(s3HeadCommand)).Metadata;return metadata.acl?ACL.from(metadata?.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}catch(error){if(error.name==="NotFound")return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);throw error}}async getACL(acRequest,key){try{return(await this.getMetadata(acRequest,key))?.acl||{}}catch(error){throw error}}async setACL(acRequest,key,acl){try{let metadata=await this.getMetadata(acRequest,key);metadata||(metadata={}),metadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,metadata)}catch(error){throw console$h.error("Error setting access rights in S3",error),error}}async getS3Metadata(resourceId){try{const command=new HeadObjectCommand({Bucket:this.bucketName,Key:resourceId}),response=await this.client.send(command),s3RawMetadata=response.Metadata;if(!s3RawMetadata||Object.keys(s3RawMetadata).length===0)return{};let metadata=this.deserializeS3Metadata(s3RawMetadata);return metadata.ContentType||(metadata.ContentType=response.ContentType?response.ContentType:"application/octet-stream"),metadata}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$h.error("Error reading object metadata from S3",error.name,error.message),error}}async setS3Metadata(resourceId,metadata){try{const getObjectTaggingCommand=new GetObjectTaggingCommand({Bucket:this.bucketName,Key:resourceId}),objectTagging=await this.client.send(getObjectTaggingCommand),serializedMetadata=this.serializeS3Metadata(metadata),copyObjectCommand=new CopyObjectCommand({Bucket:this.bucketName,CopySource:`${this.bucketName}/${resourceId}`,Key:resourceId,Metadata:serializedMetadata,MetadataDirective:"REPLACE",Tagging:objectTagging.TagSet.map(tag=>`${tag.Key}=${tag.Value}`).join("&")});await this.client.send(copyObjectCommand)}catch(error){throw console$h.error("Error setting object metadata in S3",error.name,error.message),error}}async initialize(){await checkAndInstallLifecycleRules(this.bucketName,this.s3Client),this.isInitialized=!0}serializeS3Metadata(s3Metadata){let amzMetadata={};s3Metadata.acl&&(amzMetadata.acl=typeof s3Metadata.acl=="string"?s3Metadata.acl:ACL.from(s3Metadata.acl).serializedACL,delete s3Metadata.acl);for(let key in s3Metadata)key!="ContentType"&&(amzMetadata[key]=typeof s3Metadata[key]=="string"?s3Metadata[key]:JSON.stringify(s3Metadata[key]));return amzMetadata}deserializeS3Metadata(amzMetadata){let metadata={};for(let key in amzMetadata){if(key==="acl"){metadata[key]=ACL.from(amzMetadata[key]).ACL;continue}try{metadata[key]=JSON.parse(amzMetadata[key])}catch{metadata[key]=amzMetadata[key]}}return metadata}}__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"get"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"set"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"delete"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"exists"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"getMetadata"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"setMetadata"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"updateTTL"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"getTTL"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"getACL"),__decorateClass$i([SecureConnector.AccessControl],S3Cache.prototype,"setACL");var __defProp$A=Object.defineProperty,__getOwnPropDesc$h=Object.getOwnPropertyDescriptor,__defNormalProp$A=(obj,key,value)=>key in obj?__defProp$A(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$h=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$h(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$A(target,key,result),result},__publicField$A=(obj,key,value)=>__defNormalProp$A(obj,typeof key!="symbol"?key+"":key,value);const console$g=Logger("LocalStorageCache");class LocalStorageCache extends CacheConnector{constructor(_settings){super(_settings),__publicField$A(this,"name","LocalStorageCache"),__publicField$A(this,"folder"),__publicField$A(this,"_prefix","cache"),__publicField$A(this,"_mdPrefix","cache.metadata"),__publicField$A(this,"isInitialized",!1),this.folder=_settings.folder||`${os.tmpdir()}/.smyth/cache`,this.initialize()}async initialize(){existsSync(this.folder)||mkdirSync(this.folder,{recursive:!0});const cacheFolderPath=path.join(this.folder,this._prefix);existsSync(cacheFolderPath)||mkdirSync(cacheFolderPath,{recursive:!0});const metadataFolderPath=path.join(this.folder,this._mdPrefix);existsSync(metadataFolderPath)||(mkdirSync(metadataFolderPath,{recursive:!0}),writeFileSync(path.join(metadataFolderPath,"README_IMPORTANT.txt"),"This folder is used for smythOS metadata, do not delete it, it will break SmythOS cache functionality")),this.isInitialized=!0}get prefix(){return this._prefix}get mdPrefix(){return this._mdPrefix}async get(acRequest,key){this.isInitialized||await this.initialize();try{const filePath=this.getStorageFilePath(acRequest.candidate.id,key);if(!existsSync(filePath))return;const data=readFileSync(filePath,"utf-8"),metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);if(metadataObject.expiresAt&&metadataObject.expiresAt<Date.now()){await this.delete(acRequest,key);return}return data}catch(error){throw console$g.error("Error reading object from local storage",error.name,error.message),error}}async set(acRequest,key,data,acl,metadata,ttl){this.isInitialized||await this.initialize();const accessCandidate=acRequest.candidate;let amzACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,fileMetadata={...metadata,acl:amzACL,...ttl?{expiresAt:Date.now()+ttl*1e3}:{}};const storageFolderPath=this.getStorageFilePath(acRequest.candidate.id,key,!0);this.createDirectories(storageFolderPath,key);const filePath=this.getStorageFilePath(acRequest.candidate.id,key);return writeFileSync(filePath,data),await this.setMetadata(acRequest,key,fileMetadata),!0}async delete(acRequest,key){try{const filePath=this.getStorageFilePath(acRequest.candidate.id,key);if(!existsSync(filePath))return;unlinkSync(filePath);const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key);unlinkSync(metadataFilePath)}catch(error){throw console$g.error("Error deleting object from local storage",error.name,error.message),error}}async exists(acRequest,key){this.isInitialized||await this.initialize();const filePath=this.getStorageFilePath(acRequest.candidate.id,key);if(!existsSync(filePath))return!1;const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key);if(!existsSync(metadataFilePath))return!1;const metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);return metadataObject.expiresAt&&metadataObject.expiresAt<Date.now()?(await this.delete(acRequest,key),!1):!0}async getMetadata(acRequest,key){try{const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key);if(!existsSync(metadataFilePath))return;const data=readFileSync(metadataFilePath,"utf-8");return this.deserializeMetadata(JSON.parse(data))}catch(error){throw console$g.error("Error reading metadata from LocalStorage",error.name,error.message),error}}async setMetadata(acRequest,key,metadata){try{let fileMetadata=await this.getMetadata(acRequest,key);fileMetadata||(fileMetadata={}),fileMetadata={...fileMetadata,...metadata};const metadataFolderPath=this.getMetadataFilePath(acRequest.candidate.id,key,!0);this.createDirectories(metadataFolderPath,key);const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),serializedMetadata=this.serializeMetadata(fileMetadata);writeFileSync(metadataFilePath,JSON.stringify(serializedMetadata))}catch(error){throw console$g.error("Error setting metadata in local storage",error.name,error.message),error}}async updateTTL(acRequest,key,ttl){if(ttl){const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);metadataObject.expiresAt=Date.now()+ttl*1e3,writeFileSync(metadataFilePath,JSON.stringify(metadataObject))}}async getTTL(acRequest,key){const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,key),metadata=readFileSync(metadataFilePath,"utf-8"),metadataObject=JSON.parse(metadata);return metadataObject.expiresAt&&metadataObject.expiresAt>Date.now()?Math.floor((metadataObject.expiresAt-Date.now())/1e3):0}async getResourceACL(resourceId,candidate){this.isInitialized||await this.initialize();const metadataFilePath=this.getMetadataFilePath(candidate.id,resourceId);if(!existsSync(metadataFilePath))return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);const metadata=readFileSync(metadataFilePath,"utf-8");if(metadata===void 0)return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);try{let metadataObject=JSON.parse(metadata);return ACL.from(metadataObject?.acl)}catch(error){throw console$g.error("Error parsing metadata in local storage",error.name,error.message),error}}async getACL(acRequest,key){try{const fileMetadata=await this.getMetadata(acRequest,key);return ACL.from(fileMetadata?.acl)}catch(error){throw console$g.error("Error getting access rights in local storage",error.name,error.message),error}}async setACL(acRequest,key,acl){try{let fileMetadata=await this.getMetadata(acRequest,key);fileMetadata||(fileMetadata={}),fileMetadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,fileMetadata)}catch(error){throw console$g.error("Error setting access rights in local storage",error),error}}serializeMetadata(metadata){let updatedMetadata={};metadata.acl&&(metadata.acl&&(updatedMetadata.acl=typeof metadata.acl=="string"?metadata.acl:ACL.from(metadata.acl).serializedACL),delete metadata.acl);for(let key in metadata)key!="ContentType"&&(updatedMetadata[key]=typeof metadata[key]=="string"?metadata[key]:JSON.stringify(metadata[key]));return updatedMetadata}deserializeMetadata(metadata){let deserializedMetadata={};for(let key in metadata){if(key==="acl"){deserializedMetadata[key]=ACL.from(metadata[key]).ACL;continue}try{deserializedMetadata[key]=JSON.parse(metadata[key])}catch{deserializedMetadata[key]=metadata[key]}}return deserializedMetadata}getStorageFilePath(teamId,resourceId,returnBasePath=!1){return existsSync(path.join(this.folder,this._prefix,teamId))||mkdirSync(path.join(this.folder,this._prefix,teamId)),returnBasePath?path.join(this.folder,this._prefix,teamId):path.join(this.folder,this._prefix,teamId,resourceId)}getMetadataFilePath(teamId,resourceId,returnBasePath=!1){return existsSync(path.join(this.folder,this._mdPrefix,teamId))||mkdirSync(path.join(this.folder,this._mdPrefix,teamId)),returnBasePath?path.join(this.folder,this._mdPrefix,teamId):path.join(this.folder,this._mdPrefix,teamId,resourceId)}createDirectories(basePath,resourceId){const folders=resourceId.split("/").slice(0,-1);let currentPath=basePath;for(let folder of folders)currentPath=path.join(currentPath,folder),existsSync(currentPath)||mkdirSync(currentPath)}}__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"get"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"set"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"delete"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"exists"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"getMetadata"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"setMetadata"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"updateTTL"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"getTTL"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"getACL"),__decorateClass$h([SecureConnector.AccessControl],LocalStorageCache.prototype,"setACL");var __defProp$z=Object.defineProperty,__getOwnPropDesc$g=Object.getOwnPropertyDescriptor,__defNormalProp$z=(obj,key,value)=>key in obj?__defProp$z(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$g=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$g(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$z(target,key,result),result},__publicField$z=(obj,key,value)=>__defNormalProp$z(obj,typeof key!="symbol"?key+"":key,value);const console$f=Logger("RAMCache");class RAMCache extends CacheConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$z(this,"name","RAMCache"),__publicField$z(this,"_prefix","smyth:cache"),__publicField$z(this,"_mdPrefix","smyth:metadata"),__publicField$z(this,"cache",new Map),__publicField$z(this,"cleanupInterval"),this.cleanupInterval=setInterval(()=>this.cleanupExpiredEntries(),6e4),this.cleanupInterval.unref()}get prefix(){return this._prefix}get mdPrefix(){return this._mdPrefix}getFullKey(key){return`${this._prefix}:${key}`}getFullMetadataKey(key){return`${this._mdPrefix}:${key}`}cleanupExpiredEntries(){const now=Date.now();for(const[key,entry]of this.cache.entries())entry.expiresAt&&entry.expiresAt<now&&this.cache.delete(key)}async get(acRequest,key){const fullKey=this.getFullKey(key),entry=this.cache.get(fullKey);return entry?entry.expiresAt&&entry.expiresAt<Date.now()?(this.cache.delete(fullKey),null):entry.value:null}async set(acRequest,key,data,acl,metadata,ttl){const accessCandidate=acRequest.candidate,fullKey=this.getFullKey(key),fullMetadataKey=this.getFullMetadataKey(key),newMetadata=metadata||{};newMetadata.acl=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL;const entry={value:data,metadata:newMetadata,expiresAt:ttl?Date.now()+ttl*1e3:void 0};return this.cache.set(fullKey,entry),this.cache.set(fullMetadataKey,entry),!0}async delete(acRequest,key){const fullKey=this.getFullKey(key),fullMetadataKey=this.getFullMetadataKey(key);this.cache.delete(fullKey),this.cache.delete(fullMetadataKey)}async exists(acRequest,key){const fullKey=this.getFullKey(key),entry=this.cache.get(fullKey);return entry?entry.expiresAt&&entry.expiresAt<Date.now()?(this.cache.delete(fullKey),!1):!0:!1}async getMetadata(acRequest,key){if(!await this.exists(acRequest,key))return;const fullMetadataKey=this.getFullMetadataKey(key);return this.cache.get(fullMetadataKey)?.metadata||{}}async setMetadata(acRequest,key,metadata){const fullMetadataKey=this.getFullMetadataKey(key),entry=this.cache.get(fullMetadataKey);if(entry){const existingMetadata=entry.metadata||{},existingAcl=existingMetadata?.acl,mergedMetadata={...existingMetadata,...metadata};existingAcl?mergedMetadata.acl=ACL.from(existingAcl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL:mergedMetadata.acl?mergedMetadata.acl=ACL.from(mergedMetadata.acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL:mergedMetadata.acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,entry.metadata=mergedMetadata,this.cache.set(fullMetadataKey,entry)}}async updateTTL(acRequest,key,ttl){const fullKey=this.getFullKey(key),fullMetadataKey=this.getFullMetadataKey(key),entry=this.cache.get(fullKey);entry&&(entry.expiresAt=ttl?Date.now()+ttl*1e3:void 0,this.cache.set(fullKey,entry),this.cache.set(fullMetadataKey,entry))}async getTTL(acRequest,key){const fullKey=this.getFullKey(key),entry=this.cache.get(fullKey);if(!entry||!entry.expiresAt)return-1;const remaining=Math.ceil((entry.expiresAt-Date.now())/1e3);return remaining>0?remaining:-1}async getResourceACL(resourceId,candidate){const fullMetadataKey=this.getFullMetadataKey(resourceId),entry=this.cache.get(fullMetadataKey);return entry?ACL.from(entry.metadata?.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async getACL(acRequest,key){try{return(await this.getMetadata(acRequest,key))?.acl||{}}catch(error){throw console$f.error("Error getting access rights in RAMCache",error.name,error.message),error}}async setACL(acRequest,key,acl){try{let metadata=await this.getMetadata(acRequest,key);metadata||(metadata={}),metadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,key,metadata)}catch(error){throw console$f.error("Error setting access rights in RAMCache",error),error}}async stop(){super.stop(),clearInterval(this.cleanupInterval),this.cache.clear()}}__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"get"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"set"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"delete"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"exists"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"getMetadata"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"setMetadata"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"updateTTL"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"getTTL"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"getACL"),__decorateClass$g([SecureConnector.AccessControl],RAMCache.prototype,"setACL");class CacheService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Cache,"Redis",RedisCache),ConnectorService.register(TConnectorService.Cache,"S3",S3Cache),ConnectorService.register(TConnectorService.Cache,"LocalStorage",LocalStorageCache),ConnectorService.register(TConnectorService.Cache,"RAM",RAMCache)}}function findSmythPath(_path="",callback){let _smythDir="";_path&&(_smythDir=findSmythPath(""));const searchDirectories=[];if(process.env.SMYTH_PATH){fs__default.existsSync(process.env.SMYTH_PATH)||(console.error("CRITICAL : SMYTH_PATH environment variable is not a valid directory"),process.exit(1));const envDir=path.resolve(process.env.SMYTH_PATH,_path);return fs__default.existsSync(envDir)?callback?.(envDir,!0,null):(callback?.(envDir,!1,null),console.error(`CRITICAL : missing directory (${envDir}) under SMYTH_PATH `)),envDir}const isElectron=!!process.versions.electron;let execPath="";isElectron?process.resourcesPath?execPath=path.dirname(process.resourcesPath):execPath=path.dirname(process.execPath):execPath=process.cwd();const localDir=path.resolve(execPath,".smyth",_path);searchDirectories.push(localDir);const mainScriptPath=process.argv[1],mainScriptDir=mainScriptPath?path.dirname(path.resolve(mainScriptPath)):null;if(mainScriptDir){const mainScriptSmythDir=path.resolve(mainScriptDir,".smyth",_path);searchDirectories.push(mainScriptSmythDir)}const packageRootDir=findPackageRoot();if(packageRootDir){const packageSmythDir=path.resolve(packageRootDir,".smyth",_path);searchDirectories.push(packageSmythDir)}const packageMainRootDir=findPackageRoot(mainScriptDir);if(packageMainRootDir){const packageSmythDir=path.resolve(packageMainRootDir,".smyth",_path);searchDirectories.push(packageSmythDir)}const homeDir=path.resolve(os.homedir(),".smyth",_path);searchDirectories.push(homeDir);const deduplicatedSearchDirectories=Array.from(new Set(searchDirectories));for(let i=0;i<deduplicatedSearchDirectories.length;i++){const dir=deduplicatedSearchDirectories[i],nextDir=deduplicatedSearchDirectories[i+1];if(!fs__default.existsSync(dir)){callback?.(dir,!1,nextDir);continue}return callback?.(dir,!0,null),dir}return _smythDir&&_path?path.resolve(_smythDir,_path):homeDir}function findValidResourcePath(listOfLocations,callback){let found="";const deduplicatedLocations=Array.from(new Set(listOfLocations));for(let location of deduplicatedLocations)if(findSmythPath(location,(dir,success,nextDir)=>{callback?.(dir,success,nextDir),success&&(found=dir)}),found)return found;return found}function findPackageRoot(startDir){try{if(!startDir){const isElectron=!!process.versions.electron;let execPath="";isElectron?process.resourcesPath?execPath=path.dirname(process.resourcesPath):execPath=path.dirname(process.execPath):execPath=process.cwd(),startDir=execPath}let currentDir=startDir;for(;currentDir!==path.dirname(currentDir);){const packageJsonPath=path.resolve(currentDir,"package.json");if(fs__default.existsSync(packageJsonPath))return currentDir;currentDir=path.dirname(currentDir)}}catch{}return null}class VaultConnector extends SecureConnector{constructor(_settings){super(_settings),this._settings=_settings}requester(candidate){return{get:async keyId=>this.get(candidate.readRequest,keyId),exists:async keyId=>this.exists(candidate.readRequest,keyId),listKeys:async()=>this.listKeys(candidate.readRequest)}}}var __defProp$y=Object.defineProperty,__getOwnPropDesc$f=Object.getOwnPropertyDescriptor,__defNormalProp$y=(obj,key,value)=>key in obj?__defProp$y(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$f=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$f(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$y(target,key,result),result},__publicField$y=(obj,key,value)=>__defNormalProp$y(obj,typeof key!="symbol"?key+"":key,value);const logger$5=Logger("JSONFileVault");class JSONFileVault extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$y(this,"name","JSONFileVault"),__publicField$y(this,"vaultData"),__publicField$y(this,"index"),__publicField$y(this,"shared"),__publicField$y(this,"vaultFile"),__publicField$y(this,"watcher",null),__publicField$y(this,"_interactiveVaultCreation",!1),this.shared=_settings.shared||"",this.vaultFile=this.findVaultFile(_settings.file),this.fetchVaultData(this.vaultFile,_settings),this.initFileWatcher()}findVaultFile(vaultFile){let _vaultFile=vaultFile;if(_vaultFile&&fs__default.existsSync(_vaultFile))return _vaultFile;logger$5.warn("Vault file not found in:",_vaultFile);let found="";if(found=findValidResourcePath(["vault.json","vault/vault.json",".sre/vault.json"],(dir,success,nextDir)=>{success||logger$5.warn("Vault file not found in:",dir)}),found)return logger$5.warn("Found a Vault file in : ",found," I will use this one."),found;if(console.warn("!!! All attempts to find the vault file failed !!!"),this._interactiveVaultCreation)process.stdout.write(colors.red+`[ERR] Could not find or create a valid vault file.
|
|
216
256
|
`+colors.reset),console.warn("!!! SRE Will continue without vault !!!"),console.warn("!!! Many features might not work !!!");else return this.createDefaultVaultInteractive(),this._interactiveVaultCreation=!0,this.findVaultFile(this.vaultFile);return null}getMasterKeyInteractive(){process.stdout.write(`\x1B[1;37m===[ Encrypted Vault Detected ]=================================\x1B[0m
|
|
217
257
|
`);const masterKey=readlineSync.question("Enter master key: ",{hideEchoBack:!0,mask:"*"});return logger$5.info("Master key entered"),masterKey}createDefaultVaultInteractive(){const userVaultDir=path.resolve(os.homedir(),".smyth"),userVaultPath=path.resolve(userVaultDir,"vault.json");process.stdout.write(colors.red+`
|
|
218
258
|
|
|
@@ -229,12 +269,10 @@ You can edit it later if you want to add/update keys.`+colors.reset),process.std
|
|
|
229
269
|
================================================
|
|
230
270
|
|
|
231
271
|
|
|
232
|
-
`+colors.reset),!0}resolveEnvironmentVariables(value){if(typeof value!="string")return value;const envVarPattern=/\$env\(([^)]+)\)/g;return value.replace(envVarPattern,(match,envVarName)=>{const envValue=process.env[envVarName];return envValue===void 0?(logger$5.warn(`Environment variable ${envVarName} not found, keeping original value: ${match}`),match):envValue})}async get(acRequest,keyId){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),rawValue=this.vaultData?.[teamId]?.[keyId]||this.vaultData?.[this.shared]?.[keyId];return this.resolveEnvironmentVariables(rawValue)}async exists(acRequest,keyId){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate);return!!(this.vaultData?.[teamId]?.[keyId]||this.vaultData?.[this.shared]?.[keyId])}async listKeys(acRequest){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate);return Object.keys(this.vaultData?.[teamId]||this.vaultData?.[this.shared]||{})}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return resourceId&&typeof this.vaultData?.[teamId]?.[resourceId]!="string"?(this.shared&&typeof this.vaultData?.[this.shared]?.[resourceId]=="string"&&acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl):(acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),this.shared&&typeof this.vaultData?.[this.shared]?.[resourceId]=="string"&&acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl)}fetchVaultData(vaultFile,_settings){if(fs__default.existsSync(vaultFile)){try{if(_settings.fileKey&&fs__default.existsSync(_settings.fileKey))try{const privateKey=fs__default.readFileSync(_settings.fileKey,"utf8"),encryptedVault=fs__default.readFileSync(vaultFile,"utf8").toString(),decryptedBuffer=crypto$1.privateDecrypt({key:privateKey,padding:crypto$1.constants.RSA_PKCS1_OAEP_PADDING},Buffer.from(encryptedVault,"base64"));this.vaultData=JSON.parse(decryptedBuffer.toString("utf8"))}catch{throw new Error("Failed to decrypt vault")}else this.vaultData=JSON.parse(fs__default.readFileSync(vaultFile).toString())}catch(e){logger$5.error("Error parsing vault file:",e),logger$5.error("!!! Vault features might not work properly !!!"),this.vaultData={}}this.vaultData?.encrypted&&this.vaultData?.algorithm&&this.vaultData?.data&&this.setInteraction(this.getMasterKeyInteractive.bind(this));for(let teamId in this.vaultData)for(let resourceId in this.vaultData[teamId]){this.index||(this.index={}),this.index[resourceId]||(this.index[resourceId]={});const value=this.vaultData[teamId][resourceId];this.index[resourceId][teamId]=value}}}initFileWatcher(){!this.vaultFile||!fs__default.existsSync(this.vaultFile)||(this.watcher=chokidar.watch(this.vaultFile,{persistent:!1,ignoreInitial:!0}),this.watcher.on("change",()=>{this.fetchVaultData(this.vaultFile,this._settings)}))}async stop(){super.stop(),this.watcher&&(this.watcher.close(),this.watcher=null)}}__decorateClass$f([SecureConnector.AccessControl],JSONFileVault.prototype,"get"),__decorateClass$f([SecureConnector.AccessControl],JSONFileVault.prototype,"exists"),__decorateClass$f([SecureConnector.AccessControl],JSONFileVault.prototype,"listKeys");var __defProp$A=Object.defineProperty,__getOwnPropDesc$e=Object.getOwnPropertyDescriptor,__defNormalProp$A=(obj,key,value)=>key in obj?__defProp$A(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$e=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$e(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$A(target,key,result),result},__publicField$A=(obj,key,value)=>__defNormalProp$A(obj,typeof key!="symbol"?key+"":key,value);const console$e=Logger("SecretsManager");class SecretsManager extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$A(this,"name","SecretsManager"),__publicField$A(this,"secretsManager"),__publicField$A(this,"prefix"),this.prefix=_settings.prefix||"",this.secretsManager=new SecretsManagerClient({region:_settings.region,..._settings.awsAccessKeyId&&_settings.awsSecretAccessKey?{accessKeyId:_settings.awsAccessKeyId,secretAccessKey:_settings.awsSecretAccessKey}:{}})}async get(acRequest,secretName){try{const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate);let secret=await this.getSecretById(teamId,secretName);return secret||(secret=await this.getSecretByName(acRequest,secretName)),secret}catch(error){throw console$e.error(error),error}}async exists(acRequest,keyId){return!!await this.get(acRequest,keyId)}async listKeys(acRequest){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),secrets=[];let nextToken;do{const listResponse=await this.secretsManager.send(new ListSecretsCommand({NextToken:nextToken,Filters:[{Key:"tag-key",Values:["smyth-vault"]},{Key:"name",Values:[this.getVaultKey(teamId,"")]}]}));if(listResponse.SecretList)for(const secret of listResponse.SecretList)secret.Name&&secrets.push({ARN:secret.ARN,Name:secret.Name,CreatedDate:secret.CreatedDate});nextToken=listResponse.NextToken}while(nextToken);const $promises=[];for(const secret of secrets)$promises.push(getSpecificSecret(secret,this.secretsManager));return await Promise.all($promises);async function getSpecificSecret(secret,secretsManager){let secretString=(await secretsManager.send(new GetSecretValueCommand({SecretId:secret.ARN}))).SecretString;if(secretString)try{let parsedSecret=JSON.parse(secretString);const secretId=secret.Name?.split("/").pop(),key=parsedSecret.key,value=parsedSecret.value,metadata=parsedSecret.metadata;return{id:secretId,key,value,metadata}}catch{}return null}}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),acl}async getSecretByName(acRequest,secretName){try{return(await this.listKeys(acRequest)).find(s=>s.key===secretName)?.value}catch(error){return console$e.error(error),null}}getVaultKey(teamId,secretName){return`${this.prefix.length?`${this.prefix}/`:""}${teamId}/${secretName}`}async getSecretById(teamId,secretId){try{const secret=await this.secretsManager.send(new GetSecretValueCommand({SecretId:this.getVaultKey(teamId,secretId)}));return this.getSecretValue(secret)}catch(error){return console$e.error(error),null}}getSecretValue(secret){try{return(typeof secret.SecretString=="string"?JSON.parse(secret.SecretString):secret.SecretString).value}catch{return null}}}__decorateClass$e([SecureConnector.AccessControl],SecretsManager.prototype,"get"),__decorateClass$e([SecureConnector.AccessControl],SecretsManager.prototype,"exists"),__decorateClass$e([SecureConnector.AccessControl],SecretsManager.prototype,"listKeys");var __defProp$z=Object.defineProperty,__getOwnPropDesc$d=Object.getOwnPropertyDescriptor,__defNormalProp$z=(obj,key,value)=>key in obj?__defProp$z(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$d=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$d(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$z(target,key,result),result},__publicField$z=(obj,key,value)=>__defNormalProp$z(obj,typeof key!="symbol"?key+"":key,value);const console$d=Logger("NullVault");class NullVault extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$z(this,"name","NullVault"),__publicField$z(this,"vaultData"),__publicField$z(this,"index"),__publicField$z(this,"sharedVault"),console$d.warn("NullVault is used : Vault features will not be available")}async get(acRequest,keyId){return console$d.debug(`Ignored operation:NullVault.get: ${keyId}`),"NULLKEY"}async exists(acRequest,keyId){return console$d.debug(`Ignored operation:NullVault.exists: ${keyId}`),!1}async listKeys(acRequest){return console$d.debug("Ignored operation:NullVault.listKeys"),[]}async getResourceACL(resourceId,candidate){const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}__decorateClass$d([SecureConnector.AccessControl],NullVault.prototype,"get"),__decorateClass$d([SecureConnector.AccessControl],NullVault.prototype,"exists"),__decorateClass$d([SecureConnector.AccessControl],NullVault.prototype,"listKeys");class VaultService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Vault,"JSONFileVault",JSONFileVault),ConnectorService.register(TConnectorService.Vault,"SecretsManager",SecretsManager),ConnectorService.register(TConnectorService.Vault,"NullVault",NullVault)}}class AccountConnector extends Connector{constructor(_settings){super(_settings),this._settings=_settings}requester(candidate){return{getAllUserSettings:async()=>this.getAllUserSettings(candidate.readRequest,candidate.id),getUserSetting:async settingKey=>this.getUserSetting(candidate.readRequest,candidate.id,settingKey),getAllTeamSettings:async()=>this.getAllTeamSettings(candidate.readRequest,candidate.id),getTeamSetting:async settingKey=>this.getTeamSetting(candidate.readRequest,candidate.id,settingKey),isTeamMember:async teamId=>this.isTeamMember(teamId,candidate),getCandidateTeam:async()=>this.getCandidateTeam(candidate),getTeam:async()=>this.getCandidateTeam(candidate),getAgentSetting:async settingKey=>this.getAgentSetting(candidate.readRequest,candidate.id,settingKey)}}}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,typeof key!="symbol"?key+"":key,value);const console$c=Logger("DummyAccount");class DummyAccount extends AccountConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$y(this,"name","DummyAccount"),__publicField$y(this,"data",{}),this.data=_settings?.data||{},this.data[DEFAULT_TEAM_ID]||(this.data[DEFAULT_TEAM_ID]={users:{},agents:{"FAKE-AGENT-ID":{}},settings:{}}),this.data[DEFAULT_TEAM_ID]||console$c.warn("You are using the DummyAccount connector. This is a development tool and should not be used in production if you have security concerns.")}isTeamMember(team,candidate){if(team===DEFAULT_TEAM_ID)return Promise.resolve(!0);switch(candidate.role){case TAccessRole.Team:return Promise.resolve(team===candidate.id);case TAccessRole.User:return Promise.resolve(this.data[team]?.users?.[candidate.id]);case TAccessRole.Agent:return Promise.resolve(this.data[team]?.agents?.[candidate.id]);default:return Promise.resolve(!1)}}getCandidateTeam(candidate){if(candidate.role===TAccessRole.Team)return Promise.resolve(candidate.id);for(const team in this.data)if(candidate.role===TAccessRole.User&&this.data[team]?.users?.[candidate.id]||candidate.role===TAccessRole.Agent&&this.data[team]?.agents?.[candidate.id])return Promise.resolve(team);return Promise.resolve(DEFAULT_TEAM_ID)}getResourceACL(resourceId,candidate){throw new Error("getResourceACL Method not implemented.")}getAllTeamSettings(acRequest,teamId){return Promise.resolve(this.data[teamId]?.settings)}getAllUserSettings(acRequest,accountId){for(const team in this.data)if(this.data[team]?.users?.[accountId])return Promise.resolve(this.data[team]?.users?.[accountId]?.settings);return Promise.resolve([])}getTeamSetting(acRequest,teamId,settingKey){return Promise.resolve(this.data[teamId]?.settings?.[settingKey])}getUserSetting(acRequest,accountId,settingKey){for(const team in this.data)if(this.data[team]?.users?.[accountId])return Promise.resolve(this.data[team]?.users?.[accountId]?.settings?.[settingKey]);return Promise.resolve(void 0)}getAgentSetting(acRequest,agentId,settingKey){for(const team in this.data)if(this.data[team]?.agents?.[agentId])return Promise.resolve(this.data[team]?.agents?.[agentId]?.settings?.[settingKey]);return Promise.resolve(void 0)}}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);class MySQLAccount extends AccountConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$x(this,"name","MySQLAccount"),__publicField$x(this,"pool"),this.pool=mysql.createPool({host:_settings.host,database:_settings.database||"app",user:_settings.user||"app",password:_settings.password,connectionLimit:10})}isTeamMember(team,candidate){return Promise.resolve(!0)}getCandidateTeam(candidate){return candidate.role===TAccessRole.Team?Promise.resolve(candidate.id):Promise.resolve(DEFAULT_TEAM_ID)}async getAllTeamSettings(acRequest,teamId){try{const[rows]=await this.pool.execute("SELECT `key`, `value` FROM TeamSettings"),settings=[];return Array.isArray(rows)&&rows.length>0&&settings.push(...rows.map(row=>({key:row.key,value:row.value}))),settings}catch(error){return console.error("Error in getTeamSetting:",error),[]}}async getTeamSetting(acRequest,teamId,settingKey){try{const[rows]=await this.pool.execute("SELECT `value` FROM TeamSettings WHERE `key` = ? LIMIT 1",[settingKey]);return Array.isArray(rows)&&rows.length>0&&"value"in rows[0]?rows[0].value:""}catch(error){return console.error("Error in getTeamSetting:",error),""}}getResourceACL(resourceId,candidate){throw new Error("getResourceACL Method not implemented.")}getAllUserSettings(acRequest,accountId){throw new Error("getAllUserSettings Method not implemented.")}getUserSetting(acRequest,accountId,settingKey){throw new Error("getUserSetting Method not implemented.")}getAgentSetting(acRequest,agentId,settingKey){throw new Error("getAgentSetting Method not implemented.")}}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 JSONFileAccount extends AccountConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$w(this,"name","JSONFileAccount"),__publicField$w(this,"data",{}),__publicField$w(this,"file"),this.file=_settings.file,this.loadData()}loadData(){try{const fileContent=fs.readFileSync(this.file,"utf-8");this.data=JSON.parse(fileContent)}catch(error){console.error("Error loading JSON account data:",error),this.data={}}}saveData(){try{fs.writeFileSync(this.file,JSON.stringify(this.data,null,2))}catch(error){console.error("Error saving JSON account data:",error)}}async isTeamMember(team,candidate){return team===DEFAULT_TEAM_ID?!(candidate.role===TAccessRole.User&&!this.data[team].users?.[candidate.id]):this.data[team]?candidate.role===TAccessRole.Team&&team===candidate.id?!0:candidate.role===TAccessRole.User?!!this.data[team].users?.[candidate.id]:candidate.role===TAccessRole.Agent?!!this.data[team].agents?.[candidate.id]:!1:!1}async getCandidateTeam(candidate){if(candidate.role===TAccessRole.Team)return candidate.id;for(const[teamId,teamData]of Object.entries(this.data)){const typedTeamData=teamData;if(candidate.role===TAccessRole.User&&typedTeamData.users?.[candidate.id]||candidate.role===TAccessRole.Agent&&typedTeamData.agents?.[candidate.id])return teamId}return DEFAULT_TEAM_ID}async getResourceACL(resourceId,candidate){throw new Error("getResourceACL Method not implemented.")}async getAllTeamSettings(acRequest,teamId){return this.data[teamId]?.settings?Object.entries(this.data[teamId].settings).map(([key,value])=>({key,value})):[]}async getAllUserSettings(acRequest,accountId){for(const teamData of Object.values(this.data)){const typedTeamData=teamData;if(typedTeamData.users?.[accountId]?.settings)return Object.entries(typedTeamData.users[accountId].settings).map(([key,value])=>({key,value}))}return[]}async getTeamSetting(acRequest,teamId,settingKey){return this.data[teamId]?.settings?.[settingKey]||""}async getUserSetting(acRequest,accountId,settingKey){for(const teamData of Object.values(this.data)){const typedTeamData=teamData;if(typedTeamData.users?.[accountId]?.settings?.[settingKey])return typedTeamData.users[accountId].settings[settingKey]}return""}async getAgentSetting(acRequest,agentId,settingKey){for(const teamData of Object.values(this.data)){const typedTeamData=teamData;if(typedTeamData.agents?.[agentId]?.settings?.[settingKey])return typedTeamData.agents[agentId].settings[settingKey]}return""}}class AccountService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Account,"MySQLAccount",MySQLAccount),ConnectorService.register(TConnectorService.Account,"DummyAccount",DummyAccount),ConnectorService.register(TConnectorService.Account,"JSONFileAccount",JSONFileAccount)}}var __defProp$v=Object.defineProperty,__defNormalProp$v=(obj,key,value)=>key in obj?__defProp$v(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$v=(obj,key,value)=>__defNormalProp$v(obj,typeof key!="symbol"?key+"":key,value);const openapiTemplate=JSON.stringify({openapi:"3.0.1",info:{title:"{{model_name}}",description:"{{model_description}}",version:"{{version}}"},servers:[{url:"{{server_url}}"}],paths:{},components:{schemas:{}}}),openapiEndpointTemplate=JSON.stringify({summary:"{{summary}}",operationId:"{{operationId}}","x-openai-isConsequential":!1,requestBody:{required:!0,content:{}},responses:{200:{description:"response",content:{"text/plain":{schema:{type:"string"}}}}}}),_AgentDataConnector=class _AgentDataConnector2 extends Connector{constructor(){super(...arguments),__publicField$v(this,"name","AgentDataConnector")}async getOpenAPIJSON(source,server_url,version2,aiOnly=!1){if(!source)throw new Error("Agent not found");const apiBasePath=version2&&version2!="latest"?`/v${version2}/api`:"/api";let agentData=typeof source=="object"?source:await this.getAgentData(source,version2);agentData.data&&(agentData=agentData.data);const name=agentData.name;let description=aiOnly?agentData.behavior:agentData.shortDescription;description||(description=agentData.description);const _version=agentData.version||"1.0.0",openAPITpl=TemplateString(openapiTemplate).parse({model_name:escapeString(name),model_description:escapeString(description),server_url,version:_version}).clean().result,openAPIObj=JSON.parse(openAPITpl),components2=agentData.components.filter(component=>component.name==="APIEndpoint");for(let component of components2){const ai_exposed=component.data.ai_exposed||typeof component.data.ai_exposed>"u";if(aiOnly&&!ai_exposed)continue;let method=(component.data.method||"post").toLowerCase(),summary=aiOnly?component.data.description||component.data.doc:component.data.doc||component.data.description;const openAPIEntry=JSONContent(TemplateString(openapiEndpointTemplate).parse({summary:summary?.replace(/"/g,'\\"'),operationId:component?.data?.endpoint}).clean().result).tryParse();if(typeof openAPIEntry!="object"){console.warn("Error on openAPIEntry: ",openAPIEntry);continue}if(openAPIObj.paths[apiBasePath+"/"+component.data.endpoint]||(openAPIObj.paths[apiBasePath+"/"+component.data.endpoint]={}),openAPIObj.paths[apiBasePath+"/"+component.data.endpoint][method]=openAPIEntry,component.inputs.length>0)if(method==="get"){delete openAPIEntry.requestBody,openAPIEntry.parameters=[];for(let input of component.inputs){const parameter={name:input.name,in:"query",description:input.description,required:!input.optional,schema:getOpenAPIInputSchema(input.type)},{style,explode}=getOpenAPIParameterStyle(input.type);style&&(parameter.style=style,parameter.explode=explode),openAPIEntry.parameters.push(parameter)}}else{const requiredProps=[],mimetype=!aiOnly&&component.inputs.some(input=>input.type.toLowerCase().trim()==="binary")?"multipart/form-data":"application/json";openAPIEntry.requestBody.content[mimetype]={};for(let input of component.inputs){input.optional||requiredProps.push(input.name),openAPIEntry.requestBody.content[mimetype].schema||(openAPIEntry.requestBody.content[mimetype].schema={type:"object"});const schema=openAPIEntry.requestBody.content[mimetype].schema||{type:"object"};schema.properties||(schema.properties={}),schema.properties[input.name]={...getOpenAPIInputSchema(input.type),format:!aiOnly&&input.type.toLowerCase().trim()==="binary"?"binary":void 0,description:input.description,default:input.defaultVal},schema.required=requiredProps,openAPIEntry.requestBody.content[mimetype].schema||(openAPIEntry.requestBody.content["application/json"].schema=schema)}}else delete openAPIEntry.requestBody}return openAPIObj}async setEphemeralAgentData(agentId,data){_AgentDataConnector2.ephemeralAgentData.set(agentId,data)}async getEphemeralAgentData(agentId){return _AgentDataConnector2.ephemeralAgentData.get(agentId)}};__publicField$v(_AgentDataConnector,"ephemeralAgentData",new Map);let AgentDataConnector=_AgentDataConnector;function getOpenAPIInputSchema(input_type){switch(input_type?.toLowerCase()){case"binary":case"string":case"any":return{type:"string"};case"number":case"float":return{type:"number"};case"integer":return{type:"integer"};case"boolean":return{type:"boolean"};case"array":return{type:"array",items:{}};case"object":return{type:"object",additionalProperties:{}};default:return{type:"string"}}}function getOpenAPIParameterStyle(input_type){switch(input_type.toLowerCase()){case"array":return{style:"form",explode:!1};case"object":return{style:"deepObject",explode:!0};default:return{style:"",explode:!1}}}var __defProp$u=Object.defineProperty,__defNormalProp$u=(obj,key,value)=>key in obj?__defProp$u(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$u=(obj,key,value)=>__defNormalProp$u(obj,typeof key!="symbol"?key+"":key,value);class CLIAgentDataConnector extends AgentDataConnector{constructor(settings){super(),__publicField$u(this,"name","CLIAgentDataConnector"),__publicField$u(this,"argv"),this.argv=settings.args||process.argv}getAgentConfig(agentId){return{}}async getAgentData(agentId,version2){const params=ConnectorService.getCLIConnector().get("agent"),__dirname=fs__default.realpathSync(process.cwd()),filePath=path.join(__dirname,params.agent);if(fs__default.existsSync(filePath)){const data=fs__default.readFileSync(filePath,"utf8");return{data:JSON.parse(data),version:version2||"1.0"}}}getAgentIdByDomain(domain){return Promise.resolve("")}async getAgentSettings(agentId,version2){const params=ConnectorService.getCLIConnector().get("settings");let settings;return typeof params.settings=="string"?fs__default.existsSync(params.settings)&&(settings=JSON.parse(fs__default.readFileSync(params.settings,"utf8"))):settings=params.settings,settings}async getAgentEmbodiments(agentId){return[]}async listTeamAgents(teamId,deployedOnly){return console.warn("listTeamAgents is not implemented for CLIAgentDataConnector"),[]}async isDeployed(agentId){return!0}}var __defProp$t=Object.defineProperty,__defNormalProp$t=(obj,key,value)=>key in obj?__defProp$t(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$t=(obj,key,value)=>__defNormalProp$t(obj,typeof key!="symbol"?key+"":key,value);const console$b=Logger("LocalAgentDataConnector");class LocalAgentDataConnector extends AgentDataConnector{constructor(settings){super(),__publicField$t(this,"name","LocalAgentDataConnector"),__publicField$t(this,"devDir"),__publicField$t(this,"prodDir"),__publicField$t(this,"agentsData",{dev:{},prod:{}}),__publicField$t(this,"agentSettings",{dev:{},prod:{}}),this.devDir=settings.devDir,this.prodDir=settings.prodDir}getAgentConfig(agentId){return{}}indexDir(dir){const agents=fs__default.readdirSync(dir),agentsData={},agentSettings={};for(const agent of agents){if(!agent.endsWith(".smyth"))continue;const agentData=fs__default.readFileSync(path.join(dir,agent),"utf8");let jsonData;try{if(jsonData=JSON.parse(agentData),!jsonData.components){console$b.warn(`File ${agent} is not a valid agent data file, skipping...`);continue}jsonData.id||(console$b.warn(`Agent data for ${agent} does not contain an id, generating one...`),jsonData.id="tmp-"+uid())}catch(e){console$b.warn(`Error parsing agent data for ${agent}: ${e.message}`)}jsonData.components&&(agentsData[jsonData.id]=jsonData),jsonData.settings&&(agentSettings[jsonData.id]=jsonData.settings)}return{agentsData,agentSettings}}indexAgentsData(){const{agentsData:devAgentsData,agentSettings:devAgentSettings}=this.indexDir(this.devDir),{agentsData:prodAgentsData,agentSettings:prodAgentSettings}=this.indexDir(this.prodDir);this.agentsData={dev:devAgentsData,prod:prodAgentsData},this.agentSettings={dev:devAgentSettings,prod:prodAgentSettings}}async start(){super.start(),this.started=!1,this.indexAgentsData(),this.started=!0}async getAgentData(agentId,version2){if(!await this.ready())throw new Error("Connector not ready");const data=version2?this.agentsData.prod[agentId]:this.agentsData.dev[agentId];if(data)return{data,version:version2||"1.0"};throw new Error(`Agent with id ${agentId} not found`)}getAgentIdByDomain(domain){return Promise.resolve("")}async getAgentSettings(agentId,version2){if(!await this.ready())throw new Error("Connector not ready");const settings=version2?this.agentSettings.prod[agentId]:this.agentSettings.dev[agentId];if(settings)return settings;throw new Error(`Settings for agent with id ${agentId} not found`)}async getAgentEmbodiments(agentId){return[]}async listTeamAgents(teamId,deployedOnly){return console$b.warn("listTeamAgents is not implemented for LocalAgentDataConnector"),[]}async isDeployed(agentId){return!!this.agentsData.prod[agentId]}}var __defProp$s=Object.defineProperty,__defNormalProp$s=(obj,key,value)=>key in obj?__defProp$s(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$s=(obj,key,value)=>__defNormalProp$s(obj,key+"",value);class NullAgentData extends AgentDataConnector{constructor(settings){super(),__publicField$s(this,"name","NullAgentData")}getAgentConfig(agentId){return null}async getAgentData(agentId,version2){return null}getAgentIdByDomain(domain){return Promise.resolve("")}async getAgentSettings(agentId,version2){return{}}async getAgentEmbodiments(agentId){return[]}async listTeamAgents(teamId,deployedOnly){return[]}async isDeployed(agentId){return!0}}class AgentDataService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.AgentData,"AgentData",AgentDataConnector),ConnectorService.register(TConnectorService.AgentData,"CLI",CLIAgentDataConnector),ConnectorService.register(TConnectorService.AgentData,"Local",LocalAgentDataConnector),ConnectorService.register(TConnectorService.AgentData,"NullAgentData",NullAgentData)}}var __defProp$r=Object.defineProperty,__defNormalProp$r=(obj,key,value)=>key in obj?__defProp$r(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$r=(obj,key,value)=>__defNormalProp$r(obj,key+"",value);class VectorDBConnector extends SecureConnector{constructor(){super(...arguments),__publicField$r(this,"USER_METADATA_KEY","user_metadata")}requester(candidate){return{search:async(namespace,query,options)=>await this.search(candidate.readRequest,namespace,query,options),createDatasource:async(namespace,datasource)=>await this.createDatasource(candidate.writeRequest,namespace,datasource),deleteDatasource:async(namespace,datasourceId)=>{await this.deleteDatasource(candidate.writeRequest,namespace,datasourceId)},listDatasources:async namespace=>await this.listDatasources(candidate.readRequest,namespace),getDatasource:async(namespace,datasourceId)=>await this.getDatasource(candidate.readRequest,namespace,datasourceId),createNamespace:async(namespace,metadata)=>{await this.createNamespace(candidate.writeRequest,namespace,metadata)},deleteNamespace:async namespace=>{await this.deleteNamespace(candidate.writeRequest,namespace)},namespaceExists:async namespace=>await this.namespaceExists(candidate.readRequest,namespace)}}constructNsName(candidate,name){const joinedName=name.trim().replace(/\s/g,"_").toLowerCase();return`${candidate.role[0]+"_"+candidate.id}_${joinedName}`}}var __defProp$q=Object.defineProperty,__defNormalProp$q=(obj,key,value)=>key in obj?__defProp$q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$q=(obj,key,value)=>__defNormalProp$q(obj,typeof key!="symbol"?key+"":key,value);class BaseEmbedding{constructor(fields){__publicField$q(this,"model"),__publicField$q(this,"modelName"),__publicField$q(this,"chunkSize",512),__publicField$q(this,"chunkOverlap",100),__publicField$q(this,"stripNewLines",!0),__publicField$q(this,"dimensions"),__publicField$q(this,"timeout"),__publicField$q(this,"batchSize",10),this.model=fields?.model??this.model,this.chunkSize=fields?.chunkSize||fields?.params?.chunkSize||this.chunkSize,this.chunkOverlap=fields?.chunkOverlap||fields?.params?.chunkOverlap||this.chunkOverlap,this.stripNewLines=fields?.stripNewLines||fields?.params?.stripNewLines||this.stripNewLines,this.timeout=fields?.timeout||fields?.params?.timeout,this.dimensions=fields?.dimensions||fields?.params?.dimensions}chunkArr(arr,sizePerChunk){return arr.reduce((chunks,elem,index)=>{const chunkIndex=Math.floor(index/sizePerChunk),chunk=chunks[chunkIndex]||[];return chunks[chunkIndex]=chunk.concat([elem]),chunks},[])}chunkText(text,{chunkSize,chunkOverlap}){return new TextSplitter({chunkSize:chunkSize??this.chunkSize,chunkOverlap:chunkOverlap??this.chunkOverlap}).splitText(text)}processTexts(texts){return this.stripNewLines?texts.map(t=>t.replace(/\n/g," ")):texts}detectSourceType(source){return typeof source=="string"?isUrl(source)?"url":"text":Array.isArray(source)&&source.every(v=>typeof v=="number")?"vector":"unknown"}transformSource(source,sourceType,candidate){switch(sourceType){case"text":{const texts=source.map(s=>s.source);return this.embedTexts(texts,candidate).then(vectors=>source.map((s,i)=>({...s,source:vectors[i],metadata:{...s.metadata,text:texts[i]}})))}case"vector":return source}}get dummyVector(){return Array(this.dimensions-1).fill(0).concat([1])}}class TextSplitter{constructor({chunkSize=1e3,chunkOverlap=200,separators,keepSeparator}={}){if(__publicField$q(this,"chunkSize"),__publicField$q(this,"chunkOverlap"),__publicField$q(this,"separators",[`
|
|
233
|
-
|
|
234
|
-
`,`
|
|
235
|
-
`," ",""]),__publicField$q(this,"keepSeparator",!0),this.chunkSize=chunkSize,this.chunkOverlap=chunkOverlap,separators&&(this.separators=separators),keepSeparator!==void 0&&(this.keepSeparator=keepSeparator),this.chunkOverlap>=this.chunkSize)throw new Error("Cannot have chunkOverlap >= chunkSize")}splitText(text){return this._splitText(text,this.separators)}_splitText(text,separators){const finalChunks=[];let separator=separators[separators.length-1],newSeparators;for(let i=0;i<separators.length;i+=1){const s=separators[i];if(s===""){separator=s;break}if(text.includes(s)){separator=s,newSeparators=separators.slice(i+1);break}}const splits=this.splitOnSeparator(text,separator);let goodSplits=[];const _separator=this.keepSeparator?"":separator;for(const s of splits)if(this.lengthFunction(s)<this.chunkSize)goodSplits.push(s);else{if(goodSplits.length){const mergedText=this.mergeSplits(goodSplits,_separator);finalChunks.push(...mergedText),goodSplits=[]}if(!newSeparators)finalChunks.push(s);else{const otherInfo=this._splitText(s,newSeparators);finalChunks.push(...otherInfo)}}if(goodSplits.length){const mergedText=this.mergeSplits(goodSplits,_separator);finalChunks.push(...mergedText)}return finalChunks}splitOnSeparator(text,separator){let splits;if(separator)if(this.keepSeparator){const regexEscapedSeparator=separator.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&");splits=text.split(new RegExp(`(?=${regexEscapedSeparator})`))}else splits=text.split(separator);else splits=text.split("");return splits.filter(s=>s!=="")}lengthFunction(text){return text.length}joinDocs(docs,separator){const text=docs.join(separator).trim();return text===""?null:text}mergeSplits(splits,separator){const docs=[],currentDoc=[];let total=0;for(const d of splits){const _len=this.lengthFunction(d);if(total+_len+currentDoc.length*separator.length>this.chunkSize&&(total>this.chunkSize&&console.warn(`Created a chunk of size ${total}, which is longer than the specified ${this.chunkSize}`),currentDoc.length>0)){const doc2=this.joinDocs(currentDoc,separator);for(doc2!==null&&docs.push(doc2);total>this.chunkOverlap||total+_len+currentDoc.length*separator.length>this.chunkSize&&total>0;)total-=this.lengthFunction(currentDoc[0]),currentDoc.shift()}currentDoc.push(d),total+=_len}const doc=this.joinDocs(currentDoc,separator);return doc!==null&&docs.push(doc),docs}}var __defProp$p=Object.defineProperty,__defNormalProp$p=(obj,key,value)=>key in obj?__defProp$p(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$p=(obj,key,value)=>__defNormalProp$p(obj,typeof key!="symbol"?key+"":key,value);const createOpenAIError=(statusCode,error)=>new OpenAI.APIError(statusCode,{code:error?.errKey||error?.code,message:error?.message,type:error?.name},error?.message,null),DEFAULT_MODEL$1="text-embedding-3-large";class OpenAIEmbeds extends BaseEmbedding{constructor(settings){super({model:settings?.model??DEFAULT_MODEL$1,...settings}),this.settings=settings,__publicField$p(this,"client"),__publicField$p(this,"clientConfig"),__publicField$p(this,"canSpecifyDimensions",!0),this.clientConfig={dangerouslyAllowBrowser:!0},this.model==="text-embedding-ada-002"&&(this.canSpecifyDimensions=!1)}async embedTexts(texts,candidate){const batches=this.chunkArr(this.processTexts(texts),this.batchSize),batchRequests=batches.map(batch=>{const params={model:this.model,input:batch};return this.dimensions&&this.canSpecifyDimensions&&(params.dimensions=this.dimensions),this.embed(params,candidate)}),batchResponses=await Promise.all(batchRequests),embeddings=[];for(let i=0;i<batchResponses.length;i+=1){const batch=batches[i],{data:batchResponse}=batchResponses[i];for(let j=0;j<batch.length;j+=1)embeddings.push(batchResponse[j].embedding)}return embeddings}async embedText(text,candidate){const params={model:this.model,input:this.processTexts([text])[0]};this.dimensions&&this.canSpecifyDimensions&&(params.dimensions=this.dimensions);const{data}=await this.embed(params,candidate);return data[0].embedding}async embed(request,candidate){const modelInfo={provider:"OpenAI",modelId:this.model,credentials:this.settings?.credentials||[TLLMCredentials.Internal,TLLMCredentials.Vault]},credentials=await getLLMCredentials(candidate,modelInfo);if(!this.client){const params={...this.clientConfig,apiKey:credentials.apiKey,timeout:this.timeout,maxRetries:0};this.client=new OpenAI$1(params)}try{return await this.client.embeddings.create(request)}catch(e){throw createOpenAIError(e.statusCode,e)}}}__publicField$p(OpenAIEmbeds,"models",["text-embedding-ada-002","text-embedding-3-large"]);var __defProp$o=Object.defineProperty,__defNormalProp$o=(obj,key,value)=>key in obj?__defProp$o(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$o=(obj,key,value)=>__defNormalProp$o(obj,typeof key!="symbol"?key+"":key,value);const DEFAULT_MODEL="gemini-embedding-001";class GoogleEmbeds extends BaseEmbedding{constructor(settings){super({model:settings?.model??DEFAULT_MODEL,...settings}),this.settings=settings,__publicField$o(this,"client"),__publicField$o(this,"canSpecifyDimensions",!0)}async embedTexts(texts,candidate){const batches=this.chunkArr(this.processTexts(texts),this.batchSize),batchRequests=batches.map(batch=>this.embed(batch,candidate)),batchResponses=await Promise.all(batchRequests),embeddings=[];for(let i=0;i<batchResponses.length;i+=1){const batch=batches[i],batchResponse=batchResponses[i];for(let j=0;j<batch.length;j+=1)embeddings.push(batchResponse[j])}return embeddings}async embedText(text,candidate){const processedText=this.processTexts([text])[0];return(await this.embed([processedText],candidate))[0]}async embed(texts,candidate){let apiKey;try{const modelInfo={provider:"GoogleAI",modelId:this.model,credentials:this.settings?.credentials||[TLLMCredentials.Internal,TLLMCredentials.Vault]};apiKey=(await getLLMCredentials(candidate,modelInfo))?.apiKey}catch{}if(apiKey||(apiKey=process.env.GOOGLE_AI_API_KEY),!apiKey)throw new Error("Please provide an API key for Google AI embeddings via credentials or GOOGLE_AI_API_KEY environment variable");this.client||(this.client=new GoogleGenAI$1({apiKey}));try{const outputDimensionality=this.dimensions&&Number.isFinite(this.dimensions)?this.dimensions:void 0,res=await this.client.models.embedContent({model:this.model,contents:texts,...outputDimensionality?{outputDimensionality}:{}}),vectors=Array.isArray(res.embeddings)?res.embeddings.map(e=>e.values):[res.embedding?.values||[]],targetDim=outputDimensionality;return vectors.map(v=>this.postProcessEmbedding(v,targetDim))}catch(e){throw new Error(`Google Embeddings API error: ${e.message||e}`)}}postProcessEmbedding(values,targetDim){let v=Array.isArray(values)?values.slice():[];if(targetDim&&targetDim>0&&(v.length>targetDim?v=v.slice(0,targetDim):v.length<targetDim&&(v=v.concat(Array(targetDim-v.length).fill(0)))),(targetDim&&targetDim!==3072||!targetDim&&v.length!==3072)&&v.length>0){const norm=Math.sqrt(v.reduce((acc,x)=>acc+x*x,0));norm>0&&(v=v.map(x=>x/norm))}return v}}__publicField$o(GoogleEmbeds,"models",["gemini-embedding-001","text-embedding-005","text-multilingual-embedding-002"]);const supportedProviders={OpenAI:{embedder:OpenAIEmbeds,models:OpenAIEmbeds.models},GoogleAI:{embedder:GoogleEmbeds,models:GoogleEmbeds.models}};class EmbeddingsFactory{static create(provider,config2){return provider||(provider="OpenAI"),config2||(config2={provider:"OpenAI",model:"text-embedding-3-large",dimensions:1024}),config2.model&&typeof config2.model=="object"&&(provider=config2.model.provider,config2.credentials=config2.model.credentials,config2.model=config2.model.modelId),new supportedProviders[provider].embedder(config2)}}var __defProp$n=Object.defineProperty,__getOwnPropDesc$c=Object.getOwnPropertyDescriptor,__defNormalProp$n=(obj,key,value)=>key in obj?__defProp$n(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$c=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$c(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$n(target,key,result),result},__publicField$n=(obj,key,value)=>__defNormalProp$n(obj,typeof key!="symbol"?key+"":key,value);const console$a=Logger("Pinecone VectorDB");class PineconeVectorDB extends VectorDBConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$n(this,"name","PineconeVectorDB"),__publicField$n(this,"id","pinecone"),__publicField$n(this,"client"),__publicField$n(this,"indexName"),__publicField$n(this,"cache"),__publicField$n(this,"accountConnector"),__publicField$n(this,"nkvConnector"),__publicField$n(this,"embedder"),!_settings.apiKey){console$a.warn("Missing Pinecone API key : returning empty Pinecone connector");return}if(!_settings.indexName){console$a.warn("Missing Pinecone index name : returning empty Pinecone connector");return}this.client=new Pinecone({apiKey:_settings.apiKey}),console$a.info("Pinecone client initialized"),console$a.info("Pinecone index name:",_settings.indexName),this.indexName=_settings.indexName,this.accountConnector=ConnectorService.getAccountConnector(),this.cache=ConnectorService.getCacheConnector(),this.nkvConnector=ConnectorService.getNKVConnector(),_settings.embeddings||(_settings.embeddings={provider:"OpenAI",model:"text-embedding-3-large",dimensions:3072}),_settings.embeddings.dimensions||(_settings.embeddings.dimensions=3072),this.embedder=EmbeddingsFactory.create(_settings.embeddings.provider,_settings.embeddings)}async getResourceACL(resourceId,candidate){const preparedNs=this.constructNsName(candidate,resourceId),acl=await this.getACL(AccessCandidate.clone(candidate),preparedNs);return acl?ACL.from(acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async createNamespace(acRequest,namespace,metadata){const preparedNs=this.constructNsName(acRequest.candidate,namespace),acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),nsData={acl:acl.serializedACL,displayName:namespace,...metadata};return await this.client.Index(this.indexName).namespace(preparedNs).upsert([{id:`_reserved_${preparedNs}`,values:this.embedder.dummyVector,metadata:{isSkeletonVector:!0,...nsData}}]),await this.setACL(acRequest,preparedNs,acl.ACL),new Promise(resolve=>resolve())}async namespaceExists(acRequest,namespace){const stats=await this.client.Index(this.indexName).describeIndexStats();return Object.keys(stats.namespaces).includes(this.constructNsName(acRequest.candidate,namespace))}async deleteNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace);await this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace)).deleteAll().catch(e=>{if(console$a.error(`Error deleting namespace ${namespace}: ${e}`),e?.name=="PineconeNotFoundError"){console$a.warn(`Namespace ${namespace} does not exist and was requested to be deleted`);return}throw e}),await this.nkvConnector.requester(acRequest.candidate).deleteAll(`vectorDB:${this.id}:namespaces:${preparedNs}:datasources`),await this.deleteACL(AccessCandidate.clone(acRequest.candidate),namespace)}async search(acRequest,namespace,query,options={}){const pineconeIndex=this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace));let _vector=query;typeof query=="string"&&(_vector=await this.embedder.embedText(query,acRequest.candidate));const topK=(options.topK||10)+1,results=await pineconeIndex.query({topK,vector:_vector,includeMetadata:!0,includeValues:!0});let matches=[];for(const match of results.matches){if(match.metadata?.isSkeletonVector)continue;match.metadata?.[this.USER_METADATA_KEY]&&(match.metadata[this.USER_METADATA_KEY]=JSONContentHelper.create(match.metadata[this.USER_METADATA_KEY].toString()).tryParse());const text=match.metadata?.text;delete match.metadata?.text,matches.push({id:match.id,values:match.values,text,metadata:match.metadata?.[this.USER_METADATA_KEY]||match.metadata,score:match.score})}return matches.slice(0,options.topK)}async insert(acRequest,namespace,sourceWrapper){if(sourceWrapper=Array.isArray(sourceWrapper)?sourceWrapper:[sourceWrapper],sourceWrapper.some(s=>this.embedder.detectSourceType(s.source)!==this.embedder.detectSourceType(sourceWrapper[0].source)))throw new Error("All sources must be of the same type");const sourceType=this.embedder.detectSourceType(sourceWrapper[0].source);if(sourceType==="unknown"||sourceType==="url")throw new Error("Invalid source type");const preparedSource=(await this.embedder.transformSource(sourceWrapper,sourceType,acRequest.candidate)).map(s=>({id:s.id,values:s.source,metadata:s.metadata}));await this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace)).upsert(preparedSource);const accessCandidate=acRequest.candidate;if(!await this.requester(AccessCandidate.clone(accessCandidate)).namespaceExists(namespace)){let acl=new ACL().addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL;await this.setACL(acRequest,namespace,acl)}return preparedSource.map(s=>{const{text,acl,user_metadata,...restMetadata}=s.metadata||{};return{id:s.id,values:s.values,text,metadata:{...restMetadata,...typeof user_metadata=="string"?JSON.parse(user_metadata):user_metadata}}})}async delete(acRequest,namespace,deleteTarget){if(!(typeof deleteTarget=="object"&&!Array.isArray(deleteTarget))){const _ids=Array.isArray(deleteTarget)?deleteTarget:[deleteTarget];await this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace)).deleteMany(_ids)}}async createDatasource(acRequest,namespace,datasource){const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),dsId=datasource.id||crypto$1.randomUUID(),formattedNs=this.constructNsName(acRequest.candidate,namespace),chunkedText=this.embedder.chunkText(datasource.text,{chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap}),label=datasource.label||"Untitled",ids=Array.from({length:chunkedText.length},(_,i)=>`${dsId}_${crypto$1.randomUUID()}`),source=chunkedText.map((doc,i)=>({id:ids[i],source:doc,metadata:{acl:acl.serializedACL,namespaceId:formattedNs,datasourceId:dsId,datasourceLabel:label,user_metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0}})),_vIds=await this.insert(acRequest,namespace,source),dsData={namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,name:datasource.label||"Untitled",metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0,text:datasource.text,vectorIds:_vIds.map(v=>v.id),id:dsId};return datasource.returnFullVectorInfo&&(dsData.vectorInfo=_vIds),await this.nkvConnector.requester(acRequest.candidate).set(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,dsId,JSON.stringify(dsData)),dsData}async deleteDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);let ds=JSONContentHelper.create((await this.nkvConnector.requester(acRequest.candidate).get(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId))?.toString()).tryParse();if(!ds||typeof ds!="object")throw new Error(`Data source not found with id: ${datasourceId}`);await this.delete(acRequest,namespace,ds.vectorIds||[]),await this.nkvConnector.requester(acRequest.candidate).delete(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId)}async listDatasources(acRequest,namespace){const formattedNs=this.constructNsName(acRequest.candidate,namespace);return(await this.nkvConnector.requester(acRequest.candidate).list(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`)).map(ds=>JSONContentHelper.create(ds.data?.toString()).tryParse())}async getDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);return JSONContentHelper.create((await this.nkvConnector.requester(acRequest.candidate).get(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId))?.toString()).tryParse()}async setACL(acRequest,preparedNs,acl){await this.cache.requester(AccessCandidate.clone(acRequest.candidate)).set(`vectorDB:pinecone:namespace:${preparedNs}:acl`,JSON.stringify(acl))}async getACL(ac,preparedNs){let aclRes=await this.cache.requester(ac).get(`vectorDB:pinecone:namespace:${preparedNs}:acl`);return JSONContentHelper.create(aclRes?.toString?.()).tryParse()}async deleteACL(ac,preparedNs){this.cache.requester(AccessCandidate.clone(ac)).delete(`vectorDB:pinecone:namespace:${preparedNs}:acl`)}constructNsName(candidate,name){const joinedName=name.trim().replace(/\s/g,"_").toLowerCase();let prefix=candidate.id;return candidate.role!==TAccessRole.Team&&(prefix=candidate.role[0]+"_"+candidate.id),`${prefix}_${joinedName}`}}__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"createNamespace"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"namespaceExists"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"deleteNamespace"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"search"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"insert"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"delete"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"createDatasource"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"deleteDatasource"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"listDatasources"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"getDatasource");var __defProp$m=Object.defineProperty,__getOwnPropDesc$b=Object.getOwnPropertyDescriptor,__defNormalProp$m=(obj,key,value)=>key in obj?__defProp$m(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$b=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$b(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$m(target,key,result),result},__publicField$m=(obj,key,value)=>__defNormalProp$m(obj,typeof key!="symbol"?key+"":key,value);const console$9=Logger("Milvus");class MilvusVectorDB extends VectorDBConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$m(this,"name","MilvusVectorDB"),__publicField$m(this,"id","milvus"),__publicField$m(this,"client"),__publicField$m(this,"cache"),__publicField$m(this,"accountConnector"),__publicField$m(this,"embedder"),__publicField$m(this,"SCHEMA_DEFINITION"),__publicField$m(this,"INDEX_PARAMS"),!_settings.credentials)return;const clientConfig={address:_settings.credentials?.address,token:"token"in _settings.credentials?_settings.credentials.token:void 0,user:"user"in _settings.credentials?_settings.credentials.user:void 0,password:"password"in _settings.credentials?_settings.credentials.password:void 0};console$9.log("clientConfig",clientConfig),this.client=new MilvusClient(clientConfig),console$9.info("Milvus client initialized"),this.accountConnector=ConnectorService.getAccountConnector(),this.cache=ConnectorService.getCacheConnector(),_settings.embeddings||(_settings.embeddings={provider:"OpenAI",model:"text-embedding-3-large",dimensions:3072}),_settings.embeddings.dimensions||(_settings.embeddings.dimensions=3072),this.embedder=EmbeddingsFactory.create(_settings.embeddings.provider,_settings.embeddings),this.SCHEMA_DEFINITION=[{name:"id",data_type:DataType.VarChar,is_primary_key:!0,max_length:2048},{name:"text",data_type:DataType.VarChar,max_length:65535},{name:this.USER_METADATA_KEY,data_type:DataType.VarChar,max_length:65535},{name:"namespaceId",data_type:DataType.VarChar,max_length:2048},{name:"datasourceId",data_type:DataType.VarChar,max_length:2048},{name:"datasourceLabel",data_type:DataType.VarChar,max_length:2048},{name:"vector",data_type:DataType.FloatVector,dim:this.embedder.dimensions},{name:"acl",data_type:DataType.VarChar,max_length:2048}],this.INDEX_PARAMS={index_type:"AUTOINDEX",metric_type:"COSINE",field_name:"vector"}}async createNamespace(acRequest,namespace,metadata){const preparedNs=this.constructNsName(acRequest.candidate,namespace);await this.client.createCollection({collection_name:preparedNs,schema:this.SCHEMA_DEFINITION,index_params:this.INDEX_PARAMS});const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL;return await this.setACL(acRequest,preparedNs,acl),new Promise(resolve=>resolve())}async namespaceExists(acRequest,namespace){const res=await this.client.hasCollection({collection_name:this.constructNsName(acRequest.candidate,namespace)});if(res.status.error_code!==ErrorCode.SUCCESS)throw new Error(`Error checking collection: ${res}`);return!!res.value}async deleteNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace),res=await this.client.dropCollection({collection_name:preparedNs});if(res.error_code!==ErrorCode.SUCCESS)throw new Error(`Error dropping collection: ${res}`);await this.deleteACL(AccessCandidate.clone(acRequest.candidate),namespace)}async search(acRequest,namespace,query,options={}){const preparedNs=this.constructNsName(acRequest.candidate,namespace);let _vector=query;return typeof query=="string"&&(_vector=await this.embedder.embedText(query,acRequest.candidate)),(await this.client.search({data:_vector,collection_name:preparedNs,output_fields:["id","text",this.USER_METADATA_KEY,"namespaceId","datasourceId","datasourceLabel","vector"],limit:options.topK||10})).results.map(match=>{let _record=match;return match?.[this.USER_METADATA_KEY]&&(_record[this.USER_METADATA_KEY]=JSONContentHelper.create(match[this.USER_METADATA_KEY].toString()).tryParse()),{id:_record.id,values:_record.vector,text:_record.text,metadata:_record[this.USER_METADATA_KEY]??{},score:_record.score}})}async insert(acRequest,namespace,sourceWrapper){sourceWrapper=Array.isArray(sourceWrapper)?sourceWrapper:[sourceWrapper];const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(sourceWrapper.some(s=>this.embedder.detectSourceType(s.source)!==this.embedder.detectSourceType(sourceWrapper[0].source)))throw new Error("All sources must be of the same type");const sourceType=this.embedder.detectSourceType(sourceWrapper[0].source);if(sourceType==="unknown"||sourceType==="url")throw new Error("Unsupported source type");const preparedSource=(await this.embedder.transformSource(sourceWrapper,sourceType,acRequest.candidate)).map(s=>({id:s.id,text:s.metadata?.text,user_metadata:s.metadata?.[this.USER_METADATA_KEY],namespaceId:preparedNs,datasourceId:s.metadata?.datasourceId,datasourceLabel:s.metadata?.datasourceLabel,vector:s.source,acl:s.metadata?.acl})),res=await this.client.insert({collection_name:preparedNs,data:preparedSource});if(res.status.error_code!==ErrorCode.SUCCESS)throw console$9.error("Error inserting data: ",res),new Error(`Error inserting data: ${res?.status?.error_code}`);return preparedSource.map(s=>{const{text,acl,user_metadata,...restMetadata}=s||{};return{id:s.id,values:s.vector,text,metadata:{...restMetadata,...typeof user_metadata=="string"?JSON.parse(user_metadata):user_metadata}}})}async delete(acRequest,namespace,deleteTarget){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(typeof deleteTarget=="object"&&!Array.isArray(deleteTarget)){if(!["datasourceId"].some(field=>field in deleteTarget))throw new Error(`Unsupported field in delete target: ${Object.keys(deleteTarget).join(", ")}`);const res=await this.client.deleteEntities({collection_name:preparedNs,expr:`datasourceId == "${deleteTarget.datasourceId}"`});if(res.status.error_code!==ErrorCode.SUCCESS)throw new Error(`Error deleting data: ${res}`)}else{const _ids=Array.isArray(deleteTarget)?deleteTarget:[deleteTarget],res=await this.client.delete({collection_name:preparedNs,ids:_ids});if(res.status.error_code!==ErrorCode.SUCCESS)throw new Error(`Error deleting data: ${res}`)}}async createDatasource(acRequest,namespace,datasource){await this.accountConnector.getCandidateTeam(acRequest.candidate);const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),dsId=datasource.id||crypto$1.randomUUID(),formattedNs=this.constructNsName(acRequest.candidate,namespace),chunkedText=this.embedder.chunkText(datasource.text,{chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap}),ids=Array.from({length:chunkedText.length},(_,i)=>crypto$1.randomUUID()),label=datasource.label||"Untitled",source=chunkedText.map((doc,i)=>({id:ids[i],source:doc,metadata:{acl:acl.serializedACL,namespaceId:formattedNs,datasourceId:dsId,datasourceLabel:label,user_metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):JSON.stringify({})}})),_vIds=await this.insert(acRequest,namespace,source),dsData={namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,name:label,metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0,text:datasource.text,vectorIds:_vIds.map(v=>v.id),id:dsId};return datasource.returnFullVectorInfo&&(dsData.vectorInfo=_vIds),dsData}async deleteDatasource(acRequest,namespace,datasourceId){this.constructNsName(acRequest.candidate,namespace),await this.delete(acRequest,namespace,{datasourceId})}async listDatasources(acRequest,namespace){const formattedNs=this.constructNsName(acRequest.candidate,namespace),iterator=await this.client.queryIterator({collection_name:formattedNs,batchSize:1e3,output_fields:["id","text",this.USER_METADATA_KEY,"namespaceId","datasourceId","datasourceLabel","vector"]}),datasourceMap=new Map;try{for await(const batch of iterator)for(const record of batch){const datasourceId=record.datasourceId;datasourceMap.has(datasourceId)||datasourceMap.set(datasourceId,{namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,text:record.text,name:record.datasourceLabel,metadata:record[this.USER_METADATA_KEY]?JSONContentHelper.create(record[this.USER_METADATA_KEY].toString()).tryParse():void 0,vectorIds:[],id:datasourceId}),datasourceMap.get(datasourceId).vectorIds.push(record.id)}}finally{}return Array.from(datasourceMap.values())}async getDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace),res=await this.client.query({collection_name:formattedNs,expr:`datasourceId == "${datasourceId}"`,output_fields:["id","text",this.USER_METADATA_KEY,"namespaceId","datasourceId","datasourceLabel","vector"]});if(res.data.length===0)return;const referenceRecord=res.data[0],allIds=res.data.map(d=>d.id);return{namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,text:referenceRecord.text,name:referenceRecord.datasourceLabel,metadata:referenceRecord[this.USER_METADATA_KEY]?JSONContentHelper.create(referenceRecord[this.USER_METADATA_KEY].toString()).tryParse():void 0,vectorIds:allIds,id:datasourceId}}async setACL(acRequest,preparedNs,acl){await this.cache.requester(AccessCandidate.clone(acRequest.candidate)).set(`vectorDB:pinecone:namespace:${preparedNs}:acl`,JSON.stringify(acl))}async getACL(ac,preparedNs){let aclRes=await this.cache.requester(ac).get(`vectorDB:pinecone:namespace:${preparedNs}:acl`);return JSONContentHelper.create(aclRes?.toString?.()).tryParse()}async getResourceACL(resourceId,candidate){const preparedNs=this.constructNsName(candidate,resourceId),acl=await this.getACL(AccessCandidate.clone(candidate),preparedNs);return acl?ACL.from(acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async deleteACL(ac,preparedNs){this.cache.requester(AccessCandidate.clone(ac)).delete(`vectorDB:pinecone:namespace:${preparedNs}:acl`)}constructNsName(candidate,name){const joinedName=name.trim().replace(/\s/g,"_").toLowerCase();let prefix=candidate.role[0]+"_"+candidate.id;return`${"c"+crypto$1.createHash("sha256").update(prefix).digest("hex").slice(0,8)}_${joinedName}`}}__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"createNamespace"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"namespaceExists"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"deleteNamespace"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"search"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"insert"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"delete"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"createDatasource"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"deleteDatasource"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"listDatasources"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"getDatasource");var __defProp$l=Object.defineProperty,__getOwnPropDesc$a=Object.getOwnPropertyDescriptor,__defNormalProp$l=(obj,key,value)=>key in obj?__defProp$l(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$a=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$a(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$l(target,key,result),result},__publicField$l=(obj,key,value)=>__defNormalProp$l(obj,typeof key!="symbol"?key+"":key,value);Logger("RAM VectorDB");const _RAMVectorDB=class _RAMVectorDB2 extends VectorDBConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$l(this,"name","RAMVec"),__publicField$l(this,"id","ram"),__publicField$l(this,"accountConnector"),__publicField$l(this,"embedder"),this.accountConnector=ConnectorService.getAccountConnector(),_settings.embeddings||(_settings.embeddings={provider:"OpenAI",model:"text-embedding-3-large",dimensions:3072}),_settings.embeddings.dimensions||(_settings.embeddings.dimensions=3072),this.embedder=EmbeddingsFactory.create(_settings.embeddings.provider,_settings.embeddings)}async getResourceACL(resourceId,candidate){const preparedNs=this.constructNsName(candidate,resourceId),acl=_RAMVectorDB2.acls[preparedNs];return acl?ACL.from(acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async createNamespace(acRequest,namespace,metadata){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(!_RAMVectorDB2.namespaces[preparedNs]){const nsData={namespace:preparedNs,displayName:namespace,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,metadata:{...metadata,storageType:"RAM"}};_RAMVectorDB2.namespaces[preparedNs]=nsData,_RAMVectorDB2.vectors[preparedNs]=[],_RAMVectorDB2.datasources[preparedNs]={}}const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL;return _RAMVectorDB2.acls[preparedNs]=acl,new Promise(resolve=>resolve())}async namespaceExists(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace);return!!_RAMVectorDB2.namespaces[preparedNs]}async getNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace),nsData=_RAMVectorDB2.namespaces[preparedNs];if(!nsData)throw new Error(`Namespace ${namespace} not found`);return nsData}async listNamespaces(acRequest){return Object.values(_RAMVectorDB2.namespaces).filter(ns=>ns.candidateId===acRequest.candidate.id)}async deleteNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace);delete _RAMVectorDB2.vectors[preparedNs],delete _RAMVectorDB2.namespaces[preparedNs],delete _RAMVectorDB2.datasources[preparedNs],delete _RAMVectorDB2.acls[preparedNs]}async search(acRequest,namespace,query,options={}){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(!_RAMVectorDB2.namespaces[preparedNs])throw new Error("Namespace does not exist");let queryVector=query;typeof query=="string"&&(queryVector=await this.embedder.embedText(query,acRequest.candidate));const namespaceData=_RAMVectorDB2.vectors[preparedNs]||[],results=[];for(const vector of namespaceData){const similarity=this.cosineSimilarity(queryVector,vector.values);let userMetadata;if(options.includeMetadata)if(vector.metadata?.[this.USER_METADATA_KEY])try{userMetadata=JSON.parse(vector.metadata[this.USER_METADATA_KEY])}catch{userMetadata=vector.metadata[this.USER_METADATA_KEY]}else userMetadata={};results.push({id:vector.id,score:similarity,values:vector.values,text:vector.metadata?.text,metadata:options.includeMetadata?userMetadata:void 0})}const topK=options.topK||10;return results.sort((a,b)=>b.score-a.score).slice(0,topK)}async insert(acRequest,namespace,sourceWrapper){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(sourceWrapper=Array.isArray(sourceWrapper)?sourceWrapper:[sourceWrapper],sourceWrapper.some(s=>this.embedder.detectSourceType(s.source)!==this.embedder.detectSourceType(sourceWrapper[0].source)))throw new Error("All sources must be of the same type");const sourceType=this.embedder.detectSourceType(sourceWrapper[0].source);if(sourceType==="unknown"||sourceType==="url")throw new Error("Invalid source type");const transformedSource=await this.embedder.transformSource(sourceWrapper,sourceType,acRequest.candidate);_RAMVectorDB2.vectors[preparedNs]||(_RAMVectorDB2.vectors[preparedNs]=[]);const insertedIds=[];for(const source of transformedSource){const vectorData={id:source.id,values:source.source,datasource:source.metadata?.datasourceId||"unknown",metadata:source.metadata},existingIndex=_RAMVectorDB2.vectors[preparedNs].findIndex(v=>v.id===source.id);existingIndex>=0?_RAMVectorDB2.vectors[preparedNs][existingIndex]=vectorData:_RAMVectorDB2.vectors[preparedNs].push(vectorData);const{text,acl,user_metadata,...restMetadata}=source.metadata||{};insertedIds.push({id:source.id,values:source.source,text,metadata:{...restMetadata,...typeof user_metadata=="string"?JSON.parse(user_metadata):user_metadata}})}return insertedIds}async delete(acRequest,namespace,deleteTarget){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(typeof deleteTarget=="object"&&!Array.isArray(deleteTarget))if("datasourceId"in deleteTarget&&deleteTarget.datasourceId)_RAMVectorDB2.vectors[preparedNs]&&(_RAMVectorDB2.vectors[preparedNs]=_RAMVectorDB2.vectors[preparedNs].filter(vector=>vector.datasource!==deleteTarget.datasourceId));else throw new Error("Unsupported delete filter");else{const ids=Array.isArray(deleteTarget)?deleteTarget:[deleteTarget];_RAMVectorDB2.vectors[preparedNs]&&(_RAMVectorDB2.vectors[preparedNs]=_RAMVectorDB2.vectors[preparedNs].filter(vector=>!ids.includes(vector.id)))}}async createDatasource(acRequest,namespace,datasource){const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),dsId=datasource.id||crypto$1.randomUUID(),formattedNs=this.constructNsName(acRequest.candidate,namespace),chunkedText=this.embedder.chunkText(datasource.text,{chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap}),label=datasource.label||"Untitled",ids=Array.from({length:chunkedText.length},(_,i)=>`${dsId}_${crypto$1.randomUUID()}`),source=chunkedText.map((doc,i)=>({id:ids[i],source:doc,metadata:{acl:acl.serializedACL,namespaceId:formattedNs,datasourceId:dsId,datasourceLabel:label,[this.USER_METADATA_KEY]:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0}})),_vIds=await this.insert(acRequest,namespace,source),dsData={namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,name:datasource.label||"Untitled",metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0,text:datasource.text,vectorIds:_vIds.map(v=>v.id),id:dsId};return datasource.returnFullVectorInfo&&(dsData.vectorInfo=_vIds),_RAMVectorDB2.datasources[formattedNs]||(_RAMVectorDB2.datasources[formattedNs]={}),_RAMVectorDB2.datasources[formattedNs][dsId]=dsData,dsData}async deleteDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);await this.delete(acRequest,namespace,{datasourceId}),_RAMVectorDB2.datasources[formattedNs]&&_RAMVectorDB2.datasources[formattedNs][datasourceId]&&delete _RAMVectorDB2.datasources[formattedNs][datasourceId]}async listDatasources(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace),namespaceDatasources=_RAMVectorDB2.datasources[preparedNs]||{};return Object.values(namespaceDatasources)}async getDatasource(acRequest,namespace,datasourceId){const preparedNs=this.constructNsName(acRequest.candidate,namespace);return _RAMVectorDB2.datasources[preparedNs]?.[datasourceId]}cosineSimilarity(vecA,vecB){if(vecA.length!==vecB.length)throw new Error("Vectors must have the same length");let dotProduct=0,normA=0,normB=0;for(let i=0;i<vecA.length;i++)dotProduct+=vecA[i]*vecB[i],normA+=vecA[i]*vecA[i],normB+=vecB[i]*vecB[i];return normA=Math.sqrt(normA),normB=Math.sqrt(normB),normA===0||normB===0?0:dotProduct/(normA*normB)}};__publicField$l(_RAMVectorDB,"vectors",{}),__publicField$l(_RAMVectorDB,"namespaces",{}),__publicField$l(_RAMVectorDB,"datasources",{}),__publicField$l(_RAMVectorDB,"acls",{}),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"createNamespace"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"namespaceExists"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"getNamespace"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"listNamespaces"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"deleteNamespace"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"search"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"insert"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"delete"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"createDatasource"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"deleteDatasource"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"listDatasources"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"getDatasource");let RAMVectorDB=_RAMVectorDB;class VectorDBService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.VectorDB,"Pinecone",PineconeVectorDB),ConnectorService.register(TConnectorService.VectorDB,"RAMVec",RAMVectorDB),ConnectorService.register(TConnectorService.VectorDB,"Milvus",MilvusVectorDB)}}var __defProp$k=Object.defineProperty,__defNormalProp$k=(obj,key,value)=>key in obj?__defProp$k(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$k=(obj,key,value)=>__defNormalProp$k(obj,typeof key!="symbol"?key+"":key,value);class CLIConnector extends Connector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$k(this,"name","CLI"),__publicField$k(this,"params"),this.params=this.parse(process.argv)}parse(argv,args){let _keys=args;_keys&&!Array.isArray(_keys)&&(_keys=[_keys]);const argsList=_keys||getMainArgs(argv);return parseCLIArgs(argsList,argv)}get(args){let _keys=args;Array.isArray(_keys)||(_keys=[_keys]);const result={};return _keys.forEach(key=>{this.params[key]&&(result[key]=this.params[key])}),result}}class CLIService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.CLI,"CLI",CLIConnector)}}class NKVConnector extends SecureConnector{requester(candidate){return{get:async(namespace,key)=>this.get(candidate.readRequest,namespace,key),set:async(namespace,key,value)=>this.set(candidate.writeRequest,namespace,key,value),delete:async(namespace,key)=>this.delete(candidate.writeRequest,namespace,key),exists:async(namespace,key)=>this.exists(candidate.readRequest,namespace,key),deleteAll:async namespace=>this.deleteAll(candidate.writeRequest,namespace),list:async namespace=>this.list(candidate.readRequest,namespace)}}}var __defProp$j=Object.defineProperty,__getOwnPropDesc$9=Object.getOwnPropertyDescriptor,__defNormalProp$j=(obj,key,value)=>key in obj?__defProp$j(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$9=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$9(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$j(target,key,result),result},__publicField$j=(obj,key,value)=>__defNormalProp$j(obj,typeof key!="symbol"?key+"":key,value);const _NKVRedis=class extends NKVConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$j(this,"name","Redis"),__publicField$j(this,"redisCacheConnector"),__publicField$j(this,"accountConnector"),this.redisCacheConnector=ConnectorService.getCacheConnector("Redis"),this.accountConnector=ConnectorService.getAccountConnector()}key(...parts){return parts.join(":")}mdKey(...parts){return parts.join(":")}async get(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);return await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).get(this.key(`team_${teamId}`,namespace,key))}async set(acRequest,namespace,key,value){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),setKey=this.key(`team_${teamId}`,namespace,key);await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).set(setKey,value),!await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).exists(namespace)&&await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).set(this.key(`team_${teamId}`,namespace),"",void 0,{ns:!0})}async delete(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).delete(this.key(`team_${teamId}`,namespace,key))}async exists(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);return await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).exists(this.key(`team_${teamId}`,namespace,key))}async list(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);let keys=await this.fetchKeysByPrefix(this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace));if(keys=keys.filter(key=>key!==this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace)),keys.length<=0)return[];const pipeline=this.redisCacheConnector.client.pipeline();keys.forEach(key=>{pipeline.get(key)});const results=await pipeline.exec();return keys.map((key,index)=>({key:key.replace(`${this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace)}:`,""),data:results[index][1]}))}async deleteAll(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);let keys=await this.fetchKeysByPrefix(this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace));keys=keys.filter(key=>![this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace)].includes(key)),await this.redisCacheConnector.client.del(keys)}async getResourceACL(resourceId,candidate){return this.redisCacheConnector.getResourceACL(resourceId,candidate)}async fetchKeysByPrefix(prefix){let cursor="0";const keys=[];do{const result=await this.redisCacheConnector.client.scan(cursor,"MATCH",`${prefix}*`,"COUNT",1e4);cursor=result[0],keys.push(...result[1])}while(cursor!=="0");return keys}static NamespaceAccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const isNamespaceSearch=key===void 0,teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),resourceId=isNamespaceSearch?namespace:`${namespace}:${key}`,finalKey=this.key(this.redisCacheConnector.prefix,`team_${teamId}`,resourceId);if((await this.getAccessTicket(finalKey,acRequest)).access!==TAccessResult.Granted)throw new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}static Validate(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const validationResult=Joi.object().keys({namespace:Joi.string().min(1).required(),key:Joi.string().min(1).required()}).validate({namespace,key});if(validationResult.error)throw new Error(`Validation Error: ${validationResult.error.message}`);return originalMethod.apply(this,args)},descriptor}};__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"get"),__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"set"),__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"delete"),__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"exists"),__decorateClass$9([_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"list"),__decorateClass$9([_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"deleteAll");let NKVRedis=_NKVRedis;var __defProp$i=Object.defineProperty,__getOwnPropDesc$8=Object.getOwnPropertyDescriptor,__defNormalProp$i=(obj,key,value)=>key in obj?__defProp$i(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$8=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$8(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$i(target,key,result),result},__publicField$i=(obj,key,value)=>__defNormalProp$i(obj,typeof key!="symbol"?key+"":key,value);const _NKVRAM=class extends NKVConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$i(this,"name","NKVRAM"),__publicField$i(this,"storage",new Map),__publicField$i(this,"namespaces",new Set),__publicField$i(this,"accountConnector"),__publicField$i(this,"cacheConnector"),this.accountConnector=ConnectorService.getAccountConnector(),this.cacheConnector=ConnectorService.getCacheConnector("RAM")}key(...parts){return parts.join(":")}mdKey(...parts){return parts.join(":")}async get(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);return this.storage.get(storageKey)||null}async set(acRequest,namespace,key,value){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);this.storage.set(storageKey,value);const nsKey=this.key(`team_${teamId}`,namespace);this.namespaces.has(nsKey)||(this.namespaces.add(nsKey),this.storage.set(nsKey,""))}async delete(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);this.storage.delete(storageKey)}async exists(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);return this.storage.has(storageKey)}async list(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),prefix=this.key(`team_${teamId}`,namespace),results=[];for(const[storageKey,value]of this.storage.entries())if(storageKey.startsWith(prefix+":")){const actualKey=storageKey.substring(prefix.length+1);results.push({key:actualKey,data:value})}return results}async deleteAll(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),prefix=this.key(`team_${teamId}`,namespace),keysToDelete=[];for(const storageKey of this.storage.keys())storageKey.startsWith(prefix+":")&&keysToDelete.push(storageKey);for(const key of keysToDelete)this.storage.delete(key)}async getResourceACL(resourceId,candidate){return this.cacheConnector.getResourceACL(resourceId,candidate)}getKeysByPrefix(prefix){const keys=[];for(const key of this.storage.keys())key.startsWith(prefix)&&keys.push(key);return keys}clearAll(){this.storage.clear(),this.namespaces.clear()}getStats(){return{totalKeys:this.storage.size,totalNamespaces:this.namespaces.size}}static NamespaceAccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const isNamespaceSearch=key===void 0,teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),resourceId=isNamespaceSearch?namespace:`${namespace}:${key}`,finalKey=this.key(`team_${teamId}`,resourceId);if((await this.getAccessTicket(finalKey,acRequest)).access!==TAccessResult.Granted)throw new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}static Validate(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const validationResult=Joi.object().keys({namespace:Joi.string().min(1).required(),key:Joi.string().min(1).required()}).validate({namespace,key});if(validationResult.error)throw new Error(`Validation Error: ${validationResult.error.message}`);return originalMethod.apply(this,args)},descriptor}};__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"get"),__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"set"),__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"delete"),__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"exists"),__decorateClass$8([_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"list"),__decorateClass$8([_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"deleteAll");let NKVRAM=_NKVRAM;var __defProp$h=Object.defineProperty,__getOwnPropDesc$7=Object.getOwnPropertyDescriptor,__defNormalProp$h=(obj,key,value)=>key in obj?__defProp$h(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$7=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$7(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$h(target,key,result),result},__publicField$h=(obj,key,value)=>__defNormalProp$h(obj,typeof key!="symbol"?key+"":key,value);const console$8=Logger("NKVLocalStorage"),_NKVLocalStorage=class extends NKVConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$h(this,"name","NKVLocalStorage"),__publicField$h(this,"folder"),__publicField$h(this,"accountConnector"),__publicField$h(this,"cacheConnector"),__publicField$h(this,"isInitialized",!1),this.accountConnector=ConnectorService.getAccountConnector(),this.cacheConnector=ConnectorService.getCacheConnector("RAM"),this.folder=this.findStorageFolder(_settings?.folder),this.initialize()}findStorageFolder(folder){let _storageFolder=folder;return _storageFolder&&fs__default.existsSync(_storageFolder)?_storageFolder:(_storageFolder=findSmythPath("nkv"),fs__default.existsSync(_storageFolder)?(console$8.warn("Using alternative storage folder found in : ",_storageFolder),_storageFolder):(console$8.warn("!!! All attempts to find an existing storage folder failed !!!"),console$8.warn("!!! I will use this folder: ",_storageFolder),_storageFolder))}initialize(){this.isInitialized||(fs__default.existsSync(this.folder)||fs__default.mkdirSync(this.folder,{recursive:!0}),this.isInitialized=!0)}normalizeFilename(filename){let normalized=filename.replace(/:+/g,":");return normalized=normalized.replace(/:/g,"/"),normalized=normalized.replace(/[<>:"|?*\\\x00-\x1f\x7f]/g,"."),normalized=normalized.replace(/^[.\s]+|[.\s]+$/g,""),normalized=normalized.replace(/\/+/g,"/").replace(/\/\./g,"/").replace(/\.\//g,"./"),normalized||"default"}getStoragePath(teamId,namespace,key){const parts=[`team_${this.normalizeFilename(teamId)}`,this.normalizeFilename(namespace)];return key&&parts.push(this.normalizeFilename(key)),path.join(this.folder,...parts)}key(...parts){return parts.join(":")}async get(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key);if(!fs__default.existsSync(filePath))return null;try{const data=fs__default.readFileSync(filePath,"utf-8");return JSON.parse(data)}catch(error){return console$8.error(`Error reading from NKVLocalStorage: ${error.message}`),null}}async set(acRequest,namespace,key,value){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key),dirPath=path.dirname(filePath);fs__default.existsSync(dirPath)||fs__default.mkdirSync(dirPath,{recursive:!0}),fs__default.writeFileSync(filePath,JSON.stringify(value))}async delete(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key);fs__default.existsSync(filePath)&&fs__default.unlinkSync(filePath)}async exists(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key);return fs__default.existsSync(filePath)}async list(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),namespacePath=this.getStoragePath(teamId,namespace),results=[];if(!fs__default.existsSync(namespacePath))return results;const files=fs__default.readdirSync(namespacePath);for(const file of files){const filePath=path.join(namespacePath,file);if(fs__default.statSync(filePath).isFile()){const data=fs__default.readFileSync(filePath,"utf-8");results.push({key:file,data:JSON.parse(data)})}}return results}async deleteAll(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),namespacePath=this.getStoragePath(teamId,namespace);fs__default.existsSync(namespacePath)&&fs__default.rmSync(namespacePath,{recursive:!0,force:!0})}async getResourceACL(resourceId,candidate){return this.cacheConnector.getResourceACL(resourceId,candidate)}clearAll(){fs__default.existsSync(this.folder)&&(fs__default.rmSync(this.folder,{recursive:!0,force:!0}),this.initialize())}static NamespaceAccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const isNamespaceSearch=key===void 0,teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),resourceId=isNamespaceSearch?namespace:`${namespace}:${key}`,finalKey=this.key(`team_${teamId}`,resourceId);if((await this.getAccessTicket(finalKey,acRequest)).access!==TAccessResult.Granted)throw new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}static Validate(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const validationResult=Joi.object().keys({namespace:Joi.string().min(1).required(),key:Joi.string().min(1).required()}).validate({namespace,key});if(validationResult.error)throw new Error(`Validation Error: ${validationResult.error.message}`);return originalMethod.apply(this,args)},descriptor}};__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"get"),__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"set"),__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"delete"),__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"exists"),__decorateClass$7([_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"list"),__decorateClass$7([_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"deleteAll");let NKVLocalStorage=_NKVLocalStorage;class NKVService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.NKV,"Redis",NKVRedis),ConnectorService.register(TConnectorService.NKV,"RAM",NKVRAM),ConnectorService.register(TConnectorService.NKV,"LocalStorage",NKVLocalStorage)}}class RouterConnector extends Connector{}var __defProp$g=Object.defineProperty,__defNormalProp$g=(obj,key,value)=>key in obj?__defProp$g(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$g=(obj,key,value)=>__defNormalProp$g(obj,typeof key!="symbol"?key+"":key,value);class ExpressRouter extends RouterConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$g(this,"router"),__publicField$g(this,"baseUrl"),this.name="ExpressRouter",this.router=_settings.router,this.baseUrl=_settings.baseUrl}get(path2,...handlers){return this.router.get(path2,...handlers),this}post(path2,...handlers){return this.router.post(path2,...handlers),this}put(path2,...handlers){return this.router.put(path2,...handlers),this}delete(path2,...handlers){return this.router.delete(path2,...handlers),this}useFn(...handlers){return this.router.use(...handlers),this}use(path2,...handlers){return this.router.use(path2,...handlers),this}getRouter(){return this.router}}var __defProp$f=Object.defineProperty,__defNormalProp$f=(obj,key,value)=>key in obj?__defProp$f(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$f=(obj,key,value)=>__defNormalProp$f(obj,key+"",value);const console$7=Logger("NullRouter");class NullRouter extends RouterConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$f(this,"baseUrl"),this.baseUrl="http://nullrouter.local"}get(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.get: ${path2}`),this}post(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.post: ${path2}`),this}put(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.put: ${path2}`),this}delete(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.delete: ${path2}`),this}useFn(...handlers){return console$7.debug("Ignored operation:NullRouter.useFn"),this}use(path2,...handlers){return this}}class RouterService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Router,"ExpressRouter",ExpressRouter),ConnectorService.register(TConnectorService.Router,"NullRouter",NullRouter)}}class ManagedVaultConnector extends SecureConnector{constructor(_settings){super(_settings),this._settings=_settings}requester(candidate){return{get:async keyId=>this.get(candidate.readRequest,keyId),set:async(keyId,value)=>this.set(candidate.writeRequest,keyId,value),delete:async keyId=>this.delete(candidate.writeRequest,keyId),exists:async keyId=>this.exists(candidate.readRequest,keyId)}}}var __defProp$e=Object.defineProperty,__getOwnPropDesc$6=Object.getOwnPropertyDescriptor,__defNormalProp$e=(obj,key,value)=>key in obj?__defProp$e(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$6=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$6(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$e(target,key,result),result},__publicField$e=(obj,key,value)=>__defNormalProp$e(obj,typeof key!="symbol"?key+"":key,value);const DELETION_MARKER_ERROR_MESSAGE="You can't create this secret because a secret with this name is already scheduled for deletion.",console$6=Logger("SecretManagerManagedVault");class SecretManagerManagedVault extends ManagedVaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$e(this,"name","SecretManagerManagedVault"),__publicField$e(this,"scope","smyth-managed-vault"),__publicField$e(this,"secretsManager"),__publicField$e(this,"prefix"),this.prefix=_settings.prefix||"",this.secretsManager=new SecretsManagerClient({region:_settings.region,..._settings.awsAccessKeyId&&_settings.awsSecretAccessKey?{accessKeyId:_settings.awsAccessKeyId,secretAccessKey:_settings.awsSecretAccessKey}:{}})}async get(acRequest,secretName){try{return(await this.getSecretByName(acRequest,secretName))?.value}catch(error){return console$6.error(error),null}}async set(acRequest,secretName,value){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),secret=await this.getSecretByName(acRequest,secretName);if(secret)await this.secretsManager.send(new PutSecretValueCommand({SecretId:secret.secretId,SecretString:value}));else{const vaultKey=this.getVaultKey(secretName,teamId);try{await this.secretsManager.send(new CreateSecretCommand({Name:vaultKey,Description:"Smyth Managed Vault Secret",SecretString:JSON.stringify({[secretName]:value}),Tags:[{Key:this.scope,Value:"true"}]}))}catch(error){if(console$6.warn(error.message),error.message===DELETION_MARKER_ERROR_MESSAGE)(await this.secretsManager.send(new DescribeSecretCommand({SecretId:vaultKey}))).DeletedDate?(console$6.debug(`Secret ${vaultKey} is pending deletion, restoring...`),await this.secretsManager.send(new RestoreSecretCommand({SecretId:vaultKey}))):console$6.debug(`Secret ${vaultKey} already exists, updating value...`),await this.secretsManager.send(new PutSecretValueCommand({SecretId:vaultKey,SecretString:JSON.stringify({[secretName]:value})}));else throw error}}}async delete(acRequest,secretName){const secret=await this.getSecretByName(acRequest,secretName);secret&&await this.secretsManager.send(new DeleteSecretCommand({SecretId:secret.secretId,RecoveryWindowInDays:7}))}async exists(acRequest,secretName){return!!await this.get(acRequest,secretName)}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),acl}async getSecretByName(acRequest,secretName){try{const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),vaultKey=this.getVaultKey(secretName,teamId);let secret=null;try{(await this.secretsManager.send(new DescribeSecretCommand({SecretId:vaultKey}))).DeletedDate?secret=null:secret=await this.secretsManager.send(new GetSecretValueCommand({SecretId:vaultKey}))}catch{secret=null,console$6.warn("Secret not found by Id, trying to get it by name")}if(secret)return this.getFormattedSecret(secret);const secrets=[];let nextToken,listingVaultKey=this.getVaultKey("",teamId);do{const listResponse=await this.secretsManager.send(new ListSecretsCommand({NextToken:nextToken,Filters:[{Key:"tag-key",Values:[this.scope]},{Key:"name",Values:[listingVaultKey]}]}));if(listResponse.SecretList)for(const secret2 of listResponse.SecretList)secret2.Name&&secrets.push({ARN:secret2.ARN,Name:secret2.Name});nextToken=listResponse.NextToken}while(nextToken);const $promises=[];for(const secret2 of secrets)$promises.push(getSpecificSecret(secret2,this.secretsManager));return(await Promise.all($promises)).find(s=>s.key===secretName)}catch(error){console$6.error(error)}async function getSpecificSecret(secret,secretsManager){const data=await secretsManager.send(new GetSecretValueCommand({SecretId:secret.ARN}));return this.getFormattedSecret(data)}}getVaultKey(secretName,teamId){return`${this.prefix.length?`${this.prefix}/`:""}${teamId}/${secretName}`}getFormattedSecret(secret){let secretString=secret.SecretString,secretName=secret.Name;if(secretString)try{let parsedSecret=JSON.parse(secretString);Object.keys(parsedSecret).length===1&&(secretName=Object.keys(parsedSecret)[0],secretString=parsedSecret[secretName])}catch{}return{secretId:secret.Name,key:secretName,value:secretString}}}__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"get"),__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"set"),__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"delete"),__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"exists");var __defProp$d=Object.defineProperty,__getOwnPropDesc$5=Object.getOwnPropertyDescriptor,__defNormalProp$d=(obj,key,value)=>key in obj?__defProp$d(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$5=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$5(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$d(target,key,result),result},__publicField$d=(obj,key,value)=>__defNormalProp$d(obj,key+"",value);const console$5=Logger("NullManagedVault");class NullManagedVault extends ManagedVaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$d(this,"name","NullManagedVault")}async get(acRequest,keyId){console$5.debug(`Ignored operation:NullManagedVault.get: ${keyId}`)}async set(acRequest,keyId,value){console$5.debug(`Ignored operation:NullManagedVault.set: ${keyId} = ${value}`)}async delete(acRequest,keyId){console$5.debug(`Ignored operation:NullManagedVault.delete: ${keyId}`)}async exists(acRequest,keyId){return console$5.debug(`Ignored operation:NullManagedVault.exists: ${keyId}`),!1}async getResourceACL(resourceId,candidate){await ConnectorService.getAccountConnector().getCandidateTeam(candidate);const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"get"),__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"set"),__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"delete"),__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"exists");class ManagedVaultService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.ManagedVault,"SecretManagerManagedVault",SecretManagerManagedVault),ConnectorService.register(TConnectorService.ManagedVault,"NullManagedVault",NullManagedVault)}}class LogConnector extends SecureConnector{constructor(){super()}requester(candidate){if(candidate.role!=="agent")throw new Error("Only agents can use Log connector");return{log:async(logData,callId)=>await this.log(candidate.writeRequest,logData,callId),logTask:async(tasks,isUsingTestDomain)=>{await this.logTask(candidate.writeRequest,tasks,isUsingTestDomain)}}}}var __defProp$c=Object.defineProperty,__defNormalProp$c=(obj,key,value)=>key in obj?__defProp$c(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$c=(obj,key,value)=>__defNormalProp$c(obj,typeof key!="symbol"?key+"":key,value);const logger$4=Logger("SmythLog");class ConsoleLog extends LogConnector{constructor(){super(...arguments),__publicField$c(this,"name","ConsoleLog"),__publicField$c(this,"id")}getResourceACL(resourceId,candidate){return Promise.resolve(new ACL)}log(acRequest,logData,callId){return logger$4.debug(`Log for agent ${acRequest.candidate.id}: ${typeof logData=="string"?logData:JSON.stringify(logData)}`),Promise.resolve()}logTask(acRequest,tasks,isUsingTestDomain){return logger$4.debug(`${tasks} Task(s) Consumed by agent ${acRequest.candidate.id}: ${isUsingTestDomain?"Using Test Domain":"Using Production Domain"}`),Promise.resolve()}}class LogService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Log,"ConsoleLog",ConsoleLog)}}class ComponentConnector extends SecureConnector{requester(candidate){return{register:async(componentName,componentInstance)=>await this.register(candidate.readRequest,componentName,componentInstance),get:async componentName=>await this.get(candidate.readRequest,componentName),getAll:async()=>await this.getAll(candidate.readRequest)}}}var __defProp$b=Object.defineProperty,__getOwnPropDesc$4=Object.getOwnPropertyDescriptor,__defNormalProp$b=(obj,key,value)=>key in obj?__defProp$b(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$4=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$4(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$b(target,key,result),result},__publicField$b=(obj,key,value)=>__defNormalProp$b(obj,typeof key!="symbol"?key+"":key,value);const console$4=Logger("LocalComponentConnector");class LocalComponentConnector extends ComponentConnector{constructor(){super(),__publicField$b(this,"name","LocalComponentConnector"),__publicField$b(this,"components",{}),this.init()}async init(){for(const component in ComponentInstances)this.components[component]=ComponentInstances[component];console$4.debug("Registering Components :",Object.keys(this.components).join(", "))}async register(acRequest,componentName,componentInstance){this.components[componentName]=componentInstance}async get(acRequest,componentName){return this.components[componentName]}async getAll(acRequest){return this.components}async getResourceACL(resourceId,candidate){ConnectorService.getAccountConnector();const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}__decorateClass$4([SecureConnector.AccessControl],LocalComponentConnector.prototype,"register"),__decorateClass$4([SecureConnector.AccessControl],LocalComponentConnector.prototype,"get"),__decorateClass$4([SecureConnector.AccessControl],LocalComponentConnector.prototype,"getAll");class ComponentService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Component,"LocalComponent",LocalComponentConnector)}}const models={Echo:{llm:"Echo",provider:"Echo"},"deepseek-v2.5":{llm:"DeepSeek",label:"DeepSeek Chat",modelId:"deepseek-chat",provider:"DeepSeek",features:["text","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},baseURL:"https://api.deepseek.com/beta",credentials:"vault"},"deepseek-chat":{llm:"DeepSeek",baseURL:"https://api.deepseek.com/beta",tokens:128e3,completionTokens:8192,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192},credentials:"vault"},"gpt-4o-mini":{llm:"OpenAI",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GPTPlugin","GenAILLM"],label:"GPT 4o Mini",modelId:"gpt-4o-mini",provider:"OpenAI",features:["text","tools","image","search"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16383,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4.1-nano":{llm:"OpenAI",label:"GPT 4.1 Nano",modelId:"gpt-4.1-nano",provider:"OpenAI",features:["text","tools","image"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1047576,completionTokens:32768,enabled:!0},credentials:"vault"},"gpt-4.1-mini":{llm:"OpenAI",label:"GPT 4.1 Mini",modelId:"gpt-4.1-mini",provider:"OpenAI",features:["text","tools","image","search"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1047576,completionTokens:32768,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4.1":{llm:"OpenAI",label:"GPT 4.1",modelId:"gpt-4.1",provider:"OpenAI",features:["text","tools","image","search"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1047576,completionTokens:32768,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4o-mini-2024-07-18":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16383,enabled:!0},credentials:"vault"},"gpt-4.5-preview":{llm:"OpenAI",label:"GPT 4.5 Preview",modelId:"gpt-4.5-preview",provider:"OpenAI",features:["text","tools","image"],tags:["Personal","Deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"gpt-4o":{llm:"OpenAI",alias:"gpt-4o-2024-08-06",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GPTPlugin","GenAILLM"],label:"GPT 4o",modelId:"gpt-4o-2024-08-06",provider:"OpenAI",features:["text","tools","image","search","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4o-2024-08-06":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"o4-mini":{llm:"OpenAI",label:"GPT o4 mini",modelId:"o4-mini-2025-04-16",provider:"OpenAI",features:["text","reasoning"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},o3:{llm:"OpenAI",label:"GPT o3",modelId:"o3-2025-04-16",provider:"OpenAI",features:["text","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},"o3-mini":{llm:"OpenAI",alias:"o3-mini-2025-01-31",components:["PromptGenerator","GenAILLM"],label:"GPT o3 mini",modelId:"o3-mini-2025-01-31",provider:"OpenAI",features:["text","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},hidden:!0,credentials:"vault"},"o3-mini-2025-01-31":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},o1:{llm:"OpenAI",alias:"o1-2024-12-17",components:["PromptGenerator","GenAILLM"],label:"GPT o1",modelId:"o1-2024-12-17",provider:"OpenAI",features:["text","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},"o1-2024-12-17":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},"o1-mini":{llm:"OpenAI",alias:"o1-mini-2024-09-12",components:["PromptGenerator","GenAILLM"],label:"GPT o1 mini",modelId:"o1-mini-2024-09-12",provider:"OpenAI",features:["text"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:65536,enabled:!0},credentials:"vault"},"o1-mini-2024-09-12":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:65536,enabled:!0},credentials:"vault"},"o1-preview":{llm:"OpenAI",alias:"o1-preview-2024-09-12",components:["PromptGenerator","GenAILLM"],label:"GPT o1 Preview",modelId:"o1-preview-2024-09-12",provider:"OpenAI",features:["text"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},credentials:"vault"},"o1-preview-2024-09-12":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},credentials:"vault"},"gpt-4-turbo-latest":{llm:"OpenAI",alias:"gpt-4-turbo-2024-04-09",components:["PromptGenerator","LLMAssistant","Classifier"],label:"GPT 4 Turbo Latest",modelId:"gpt-4-turbo-2024-04-09",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:4096,enabled:!0},hidden:!0},"gpt-4-turbo":{llm:"OpenAI",alias:"gpt-4-turbo-2024-04-09",components:["PromptGenerator","LLMAssistant","VisionLLM","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 4 Turbo",modelId:"gpt-4-turbo-2024-04-09",provider:"OpenAI",features:["text","tools","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:4096,enabled:!0},hidden:!0},"gpt-4-turbo-2024-04-09":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:4096,enabled:!0},credentials:"vault"},"gpt-4-latest":{llm:"OpenAI",alias:"gpt-4-0613",components:["PromptGenerator","LLMAssistant"],label:"GPT 4 Latest",modelId:"gpt-4-0613",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},hidden:!0},"gpt-4":{llm:"OpenAI",components:["PromptGenerator","LLMAssistant","Classifier","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 4",modelId:"gpt-4o-2024-08-06",provider:"OpenAI",features:["text","tools"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},hidden:!0},"gpt-4-0613":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,hidden:!0,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"gpt-3.5-turbo-latest":{llm:"OpenAI",alias:"gpt-3.5-turbo-0125",components:["PromptGenerator","LLMAssistant","Classifier","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 3.5 Turbo Latest",modelId:"gpt-3.5-turbo-0125",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:16385,completionTokens:4096,enabled:!0},hidden:!0},"gpt-3.5-turbo":{llm:"OpenAI",alias:"gpt-3.5-turbo-0125",components:["PromptGenerator","LLMAssistant","Classifier","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 3.5 Turbo",modelId:"gpt-3.5-turbo-0125",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:16385,completionTokens:4096,enabled:!0},hidden:!0},"gpt-3.5-turbo-0125":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:16385,completionTokens:4096,enabled:!0},credentials:"vault"},"text-embedding-ada-002":{label:"OpenAI Embeddings Ada 002",modelId:"text-embedding-ada-002",provider:"OpenAI",features:["embeddings"],tokens:0,completionTokens:0,enabled:!1,credentials:["internal","vault"]},"text-embedding-3-large":{label:"OpenAI Embeddings 3 Large",modelId:"text-embedding-3-large",provider:"OpenAI",features:["embeddings"],tokens:0,completionTokens:0,enabled:!1,credentials:["internal","vault"]},"claude-4-opus":{label:"Claude 4 Opus",modelId:"claude-opus-4-20250514",provider:"Anthropic",features:["text","image","tools","reasoning"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:32e3,maxReasoningTokens:32e3,enabled:!0},credentials:"internal"},"claude-4-sonnet":{label:"Claude 4 Sonnet",modelId:"claude-sonnet-4-20250514",provider:"Anthropic",features:["text","image","tools","reasoning"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:64e3,maxReasoningTokens:32e3,enabled:!0},credentials:"vault"},"claude-3.7-sonnet":{llm:"Anthropic",alias:"claude-3-7-sonnet-20250219",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.7 Sonnet",modelId:"claude-3-7-sonnet-20250219",provider:"Anthropic",features:["text","tools","image","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,maxReasoningTokens:16384,enabled:!0},credentials:"vault"},"claude-3.7-sonnet-thinking":{llm:"Anthropic",alias:"claude-3-7-sonnet-20250219",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.7 Sonnet Thinking",modelId:"claude-3-7-sonnet-20250219",provider:"Anthropic",features:["text","tools","image","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:16384,maxReasoningTokens:16384,enabled:!0},hidden:!0,credentials:"vault"},"claude-3.5-haiku":{llm:"Anthropic",alias:"claude-3-5-haiku-latest",components:["PromptGenerator","LLMAssistant","Classifier","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.5 Haiku",modelId:"claude-3-5-haiku-latest",provider:"Anthropic",features:["text","tools"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-5-haiku-latest":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-5-sonnet-latest":{llm:"Anthropic",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.5 Sonnet Latest",modelId:"claude-3-5-sonnet-latest",provider:"Anthropic",features:["text","tools","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3.5-sonnet":{llm:"Anthropic",alias:"claude-3-5-sonnet-20240620",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.5 Sonnet Stable",modelId:"claude-3-5-sonnet-20240620",provider:"Anthropic",features:["text","tools","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-5-sonnet-20240620":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-opus":{llm:"Anthropic",alias:"claude-3-opus-20240229",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3 Opus",modelId:"claude-3-opus-20240229",provider:"Anthropic",features:["text","tools","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-3-opus-20240229":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-3-sonnet":{llm:"Anthropic",alias:"claude-3-sonnet-20240229",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot"],label:"Claude 3 Sonnet",modelId:"claude-3-sonnet-20240229",provider:"Anthropic",features:["text","tools","image"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"claude-3-sonnet-20240229":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-3-haiku":{llm:"Anthropic",alias:"claude-3-haiku-20240307",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot"],label:"Claude 3 Haiku",modelId:"claude-3-haiku-20240307",provider:"Anthropic",features:["text","tools","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"claude-3-haiku-20240307":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-2.1":{llm:"Anthropic",components:["PromptGenerator","LLMAssistant","Classifier"],label:"Claude 2.1",modelId:"claude-2.1",provider:"Anthropic",features:["text","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},hidden:!0},"claude-instant-1.2":{llm:"Anthropic",components:["PromptGenerator","LLMAssistant","Classifier"],label:"Claude Instant 1.2",modelId:"claude-instant-1.2",provider:"Anthropic",features:["text","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1e5,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"gemini-2.5-flash":{llm:"GoogleAI",label:"Gemini 2.5 Flash Preview",modelId:"gemini-2.5-flash",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:65536,enabled:!0},credentials:"vault"},"gemini-2.0-flash":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 2.0 Flash",modelId:"gemini-2.0-flash",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-2.0-flash-lite":{llm:"GoogleAI",label:"Gemini 2.0 Flash Lite",modelId:"gemini-2.0-flash-lite",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-2.5-pro":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 2.5 Pro Preview",modelId:"gemini-2.5-pro-preview-03-25",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:65536,enabled:!0},credentials:"vault"},"gemini-2.5-pro-exp":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 2.5 Pro Experimental",modelId:"gemini-2.5-pro-exp-03-25",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:65536,enabled:!0},credentials:"vault"},"gemini-1.5-pro-exp-0801":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Pro Experimental",modelId:"gemini-1.5-pro-exp-0801",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-pro-latest-stable":{llm:"GoogleAI",alias:"gemini-1.5-pro",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Pro Latest Stable",modelId:"gemini-1.5-pro",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-pro-latest":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM"],label:"Gemini 1.5 Pro",modelId:"gemini-1.5-pro",provider:"GoogleAI",tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-pro-stable":{llm:"GoogleAI",alias:"gemini-1.5-pro-001",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Pro Stable",modelId:"gemini-1.5-pro",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-pro":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-pro-001":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-flash-latest":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM"],label:"Gemini 1.5 Flash Latest",modelId:"gemini-1.5-flash-latest",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-flash-latest-stable":{llm:"GoogleAI",alias:"gemini-1.5-flash",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM"],label:"Gemini 1.5 Flash Latest Stable",modelId:"gemini-1.5-flash",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-flash-stable":{llm:"GoogleAI",alias:"gemini-1.5-flash-001",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Flash Stable",modelId:"gemini-1.5-flash-001",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-flash":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-flash-001":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.0-pro-latest":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant"],label:"Gemini 1.0 Pro Latest",modelId:"gemini-1.0-pro-latest",provider:"GoogleAI",features:["text"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.0-pro-latest-stable":{llm:"GoogleAI",alias:"gemini-1.0-pro",components:["PromptGenerator","LLMAssistant"],label:"Gemini 1.0 Pro Latest Stable",modelId:"gemini-1.0-pro",provider:"GoogleAI",features:["text"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.0-pro-stable":{llm:"GoogleAI",alias:"gemini-1.0-pro-001",components:["PromptGenerator","LLMAssistant"],label:"Gemini 1.0 Pro Stable",modelId:"gemini-1.0-pro-001",provider:"GoogleAI",features:["text"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.0-pro":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.0-pro-001":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-pro-vision":{llm:"GoogleAI",components:["VisionLLM"],label:"Gemini Pro Vision",modelId:"gemini-pro-vision",provider:"GoogleAI",features:["image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:12288,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"llama-3.3-70b":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.3 70B",modelId:"llama-3.3-70b-versatile",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},credentials:"vault"},"groq-llama3-70b":{llm:"Groq",alias:"llama3-70b-8192",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 70B",modelId:"llama3-70b-8192",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"llama3-70b-8192":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-llama-3.1-8b-instant":{llm:"Groq",alias:"llama-3.1-8b-instant",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.1 8B",modelId:"llama-3.1-8b-instant",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.1-8b-instant":{llm:"Groq",tokens:8e3,completionTokens:8e3,enabled:!1,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-guard-3-8b":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama Guard 3 8B",modelId:"llama-guard-3-8b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-llama3-8b":{llm:"Groq",alias:"llama3-8b-8192",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 8B",modelId:"llama3-8b-8192",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"llama3-8b-8192":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-gemma2-9b":{llm:"Groq",alias:"gemma2-9b-it",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 9B",modelId:"gemma2-9b-it",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"gemma2-9b-it":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-mixtral-8x7b":{llm:"Groq",alias:"mixtral-8x7b-32768",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - Mixtral 8x7b",modelId:"mixtral-8x7b-32768",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},credentials:"vault"},"mixtral-8x7b-32768":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},credentials:"vault"},"qwen-qwq-32b":{llm:"Groq",label:"Qwen - QWQ 32b Preview",modelId:"qwen-qwq-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"mistral-saba-24b":{llm:"Groq",label:"Mistral - Saba 24b Preview",modelId:"mistral-saba-24b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"qwen-2.5-coder-32b":{llm:"Groq",label:"Qwen - 2.5 Coder 32b Preview",modelId:"qwen-2.5-coder-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"qwen-2.5-32b":{llm:"Groq",label:"Qwen - 2.5 32b Preview",modelId:"qwen-2.5-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"deepseek-r1-distill-qwen-32b":{llm:"Groq",label:"DeepSeek - R1 Distill Qwen 32b Preview",modelId:"deepseek-r1-distill-qwen-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"deepseek-r1-distill-llama-70b":{llm:"Groq",label:"DeepSeek - R1 Distill Llama 70b Preview",modelId:"deepseek-r1-distill-llama-70b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"meta-llama/llama-4-scout-17b-16e-instruct":{llm:"Groq",label:"Meta - Llama 4 Scout 17B 16E Instruct",modelId:"meta-llama/llama-4-scout-17b-16e-instruct",provider:"Groq",features:["text"],tags:["New","Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.3-70b-specdec":{llm:"Groq",label:"Meta - Llama 3.3 70B SpecDec Preview",modelId:"llama-3.3-70b-specdec",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.2-1b-preview":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.2 1B Preview",modelId:"llama-3.2-1b-preview",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.2-3b-preview":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.2 3B Preview",modelId:"llama-3.2-3b-preview",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.2-11b-vision-preview":{llm:"Groq",components:["PromptGenerator","LLMAssistant","VisionLLM","GenAILLM"],label:"Meta - Llama 3.2 11B Vision Preview",modelId:"llama-3.2-11b-vision-preview",provider:"Groq",features:["text","image"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"llama-3.2-90b-vision-preview":{llm:"Groq",label:"Meta - Llama 3.2 90b Vision Preview",modelId:"llama-3.2-90b-vision-preview",provider:"Groq",features:["text","image"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B":{llm:"TogetherAI",label:"DeepSeek - R1 Distill Qwen 14B",modelId:"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B":{llm:"TogetherAI",label:"DeepSeek - R1 Distill Qwen 1.5B",modelId:"deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-R1-Distill-Llama-70B":{llm:"TogetherAI",label:"DeepSeek - R1 Distill Llama 70B",modelId:"deepseek-ai/DeepSeek-R1-Distill-Llama-70B",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-R1":{llm:"TogetherAI",label:"DeepSeek - R1",modelId:"deepseek-ai/DeepSeek-R1",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-V3":{llm:"TogetherAI",label:"DeepSeek - V3",modelId:"deepseek-ai/DeepSeek-V3",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/deepseek-llm-67b-chat":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"DeepSeek - Llama 67B Chat",modelId:"deepseek-ai/deepseek-llm-67b-chat",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8":{llm:"TogetherAI",label:"Meta - Llama 4 Maverick (17Bx128E)",modelId:"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",provider:"TogetherAI",features:["text","tools","image"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:524288,completionTokens:524288,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-4-Scout-17B-16E-Instruct":{llm:"TogetherAI",label:"Meta - Llama 4 Scout (17Bx16E)",modelId:"meta-llama/Llama-4-Scout-17B-16E-Instruct",provider:"TogetherAI",features:["text","tools","image"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:327680,completionTokens:327680,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.3-70B-Instruct-Turbo":{llm:"TogetherAI",label:"Meta - Llama 3.3 70B Instruct Turbo",modelId:"meta-llama/Llama-3.3-70B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3.1 8B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3.1 70B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3.1 405B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:130815,completionTokens:130815,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-8B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 8B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3-8B-Instruct-Turbo",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-70B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 70B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3-70B-Instruct-Turbo",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.2-3B-Instruct-Turbo":{llm:"TogetherAI",label:"Meta - Llama 3.2 3B Instruct Turbo",modelId:"meta-llama/Llama-3.2-3B-Instruct-Turbo",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-8B-Instruct-Lite":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 8B Instruct Lite",modelId:"meta-llama/Meta-Llama-3-8B-Instruct-Lite",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-70B-Instruct-Lite":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 70B Instruct Lite",modelId:"meta-llama/Meta-Llama-3-70B-Instruct-Lite",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3-8b-chat-hf":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 8B Chat",modelId:"meta-llama/Llama-3-8b-chat-hf",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3-70b-chat-hf":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 70B Chat",modelId:"meta-llama/Llama-3-70b-chat-hf",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-2-13b-chat-hf":{llm:"TogetherAI",components:["LLMAssistant"],label:"Meta - Llama 2 13B Chat",modelId:"meta-llama/Llama-2-13b-chat-hf",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-Vision-Free":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","VisionLLM","GenAILLM"],label:"Meta - Llama Vision Free",modelId:"meta-llama/Llama-Vision-Free",provider:"TogetherAI",features:["text","image"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","VisionLLM","GenAILLM"],label:"Meta - Llama 3.2 11B Vision Instruct Turbo",modelId:"meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo",provider:"TogetherAI",features:["text","image"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","VisionLLM","GenAILLM"],label:"Meta - Llama 3.2 90B Vision Instruct Turbo",modelId:"meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo",provider:"TogetherAI",features:["text","image"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"google/gemma-2-27b-it":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 27B",modelId:"google/gemma-2-27b-it",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"google/gemma-2-9b-it":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 9B",modelId:"google/gemma-2-9b-it",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"google/gemma-2b-it":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 2B",modelId:"google/gemma-2b-it",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mistral-7B-Instruct-v0.3":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","Classifier","GenAILLM"],label:"Mistral - 7B Instruct v0.3",modelId:"mistralai/Mistral-7B-Instruct-v0.3",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mistral-7B-Instruct-v0.2":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - 7B Instruct v0.2",modelId:"mistralai/Mistral-7B-Instruct-v0.2",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mistral-7B-Instruct-v0.1":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - 7B Instruct v0.1",modelId:"mistralai/Mistral-7B-Instruct-v0.1",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mixtral-8x7B-Instruct-v0.1":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","Classifier","GenAILLM"],label:"Mistral - 8x7B Instruct v0.1",modelId:"mistralai/Mixtral-8x7B-Instruct-v0.1",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mixtral-8x22B-Instruct-v0.1":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - 8x22B Instruct v0.1",modelId:"mistralai/Mixtral-8x22B-Instruct-v0.1",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:65536,completionTokens:65536,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2.5-Coder-32B-Instruct":{llm:"TogetherAI",label:"Qwen - 2.5 Coder 32B",modelId:"Qwen/Qwen2.5-Coder-32B-Instruct",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/QwQ-32B-Preview":{llm:"TogetherAI",label:"Qwen - QwQ 32B Preview",modelId:"Qwen/QwQ-32B-Preview",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2.5-7B-Instruct-Turbo":{llm:"TogetherAI",label:"Qwen - 2.5 7B Instruct Turbo",modelId:"Qwen/Qwen2.5-7B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2.5-72B-Instruct-Turbo":{llm:"TogetherAI",label:"Qwen - 2.5 72B Instruct Turbo",modelId:"Qwen/Qwen2.5-72B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2-72B-Instruct":{llm:"TogetherAI",label:"Qwen - 2 72B Instruct",modelId:"Qwen/Qwen2-72B-Instruct",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2-VL-72B-Instruct":{llm:"TogetherAI",label:"Qwen - 2 VL 72B Instruct",modelId:"Qwen/Qwen2-VL-72B-Instruct",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF":{llm:"TogetherAI",label:"Nvidia - Llama 3.1 Nemotron 70B",modelId:"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"microsoft/WizardLM-2-8x22B":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Microsoft - WizardLM 2 8x22B",modelId:"microsoft/WizardLM-2-8x22B",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:65536,completionTokens:65536,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"databricks/dbrx-instruct":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Databricks - DBRX Instruct",modelId:"databricks/dbrx-instruct",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"NousResearch - Hermes 2 Mixtral 8x7B DPO",modelId:"NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"upstage/SOLAR-10.7B-Instruct-v1.0":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Upstage - SOLAR 10.7B Instruct v1.0",modelId:"upstage/SOLAR-10.7B-Instruct-v1.0",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Gryphe/MythoMax-L2-13b":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Gryphe - MythoMax L2 13B",modelId:"Gryphe/MythoMax-L2-13b",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"smythos/gpt-image-1":{label:"GPT Image 1",modelId:"gpt-image-1",provider:"OpenAI",features:["image-generation"],tags:["New","SmythOS"],enabled:!0,credentials:"internal"},"gpt-image-1":{label:"GPT Image 1",modelId:"gpt-image-1",provider:"OpenAI",features:["image-generation"],tags:["New","Personal"],enabled:!1,keyOptions:{enabled:!0},credentials:"vault"},"dall-e-3":{label:"DALL\xB7E 3",modelId:"dall-e-3",provider:"OpenAI",features:["image-generation"],tags:["Deprecated"],enabled:!0,credentials:"vault"},"dall-e-2":{label:"DALL\xB7E 2",modelId:"dall-e-2",provider:"OpenAI",features:["image-generation"],tags:["Deprecated"],enabled:!0,credentials:"vault"},"smythos/flux.1-schnell":{label:"FLUX Schnell",modelId:"runware:100@1",provider:"Runware",features:["image-generation","text-to-image","image-to-image"],tags:["SmythOS","1.0"],enabled:!0,credentials:"internal"},"smythos/flux.1-dev":{label:"FLUX Dev",modelId:"runware:101@1",provider:"Runware",features:["image-generation","text-to-image","image-to-image"],tags:["SmythOS","1.0"],enabled:!0,credentials:"internal"},"smythos/face_yolov8n":{label:"Face YOLOv8n",modelId:"runware:35@1",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/face_yolov8s":{label:"Face YOLOv8s",modelId:"runware:35@2",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_full":{label:"MediaPipe Face Full",modelId:"runware:35@6",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_short":{label:"MediaPipe Face Short",modelId:"runware:35@7",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_mesh":{label:"MediaPipe Face Mesh",modelId:"runware:35@8",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_mesh_eyes_only":{label:"MediaPipe Face Mesh Eyes Only",modelId:"runware:35@9",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/eyes_mesh_mediapipe":{label:"Eyes Mesh MediaPipe",modelId:"runware:35@15",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/nose_mesh_mediapipe":{label:"Nose Mesh MediaPipe",modelId:"runware:35@13",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/lips_mesh_mediapipe":{label:"Lips Mesh MediaPipe",modelId:"runware:35@14",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/eyes_lips_mesh":{label:"Eyes & Lips Mesh",modelId:"runware:35@10",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/nose_eyes_mesh":{label:"Nose & Eyes Mesh",modelId:"runware:35@11",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/nose_lips_mesh":{label:"Nose & Lips Mesh",modelId:"runware:35@12",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0},"smythos/hand_yolov8n":{label:"Hand YOLOv8n",modelId:"runware:35@3",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Other body parts"],enabled:!0},"smythos/person_yolov8n-seg":{label:"Person YOLOv8n-seg",modelId:"runware:35@4",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Other body parts"],enabled:!0},"smythos/person_yolov8s-seg":{label:"Person YOLOv8s-seg",modelId:"runware:35@5",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Other body parts"],enabled:!0,credentials:"internal"},"flux.1-schnell":{label:"FLUX.1 (Schnell)",modelId:"runware:100@1",provider:"Runware",features:["image-generation"],tags:["SmythOS"],enabled:!1,credentials:"vault"},"flux.1-dev":{label:"FLUX.1 (Dev)",modelId:"runware:101@1",provider:"Runware",features:["image-generation"],tags:["SmythOS"],enabled:!1,credentials:"vault"},grok:{llm:"xAI",label:"Grok",modelId:"grok-2-latest",provider:"xAI",features:["text","tools"],tags:["Personal","xAI"],tokens:0,completionTokens:0,enabled:!1,hidden:!0,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},baseURL:"https://api.x.ai/v1",credentials:"vault"},"grok-2-vision":{llm:"xAI",label:"Grok Vision",modelId:"grok-2-vision-latest",provider:"xAI",features:["image"],tags:["New","Personal","xAI"],tokens:0,completionTokens:0,enabled:!1,hidden:!0,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.x.ai/v1",credentials:"vault"}};//! ***IMPORTANT***
|
|
272
|
+
`+colors.reset),!0}resolveEnvironmentVariables(value){if(typeof value!="string")return value;const envVarPattern=/\$env\(([^)]+)\)/g;return value.replace(envVarPattern,(match,envVarName)=>{const envValue=process.env[envVarName];return envValue===void 0?(logger$5.warn(`Environment variable ${envVarName} not found, keeping original value: ${match}`),match):envValue})}async get(acRequest,keyId){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),rawValue=this.vaultData?.[teamId]?.[keyId]||this.vaultData?.[this.shared]?.[keyId];return this.resolveEnvironmentVariables(rawValue)}async exists(acRequest,keyId){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate);return!!(this.vaultData?.[teamId]?.[keyId]||this.vaultData?.[this.shared]?.[keyId])}async listKeys(acRequest){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate);return Object.keys(this.vaultData?.[teamId]||this.vaultData?.[this.shared]||{})}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return resourceId&&typeof this.vaultData?.[teamId]?.[resourceId]!="string"?(this.shared&&typeof this.vaultData?.[this.shared]?.[resourceId]=="string"&&acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl):(acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),this.shared&&typeof this.vaultData?.[this.shared]?.[resourceId]=="string"&&acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl)}fetchVaultData(vaultFile,_settings){if(fs__default.existsSync(vaultFile)){try{if(_settings.fileKey&&fs__default.existsSync(_settings.fileKey))try{const privateKey=fs__default.readFileSync(_settings.fileKey,"utf8"),encryptedVault=fs__default.readFileSync(vaultFile,"utf8").toString(),decryptedBuffer=crypto$1.privateDecrypt({key:privateKey,padding:crypto$1.constants.RSA_PKCS1_OAEP_PADDING},Buffer.from(encryptedVault,"base64"));this.vaultData=JSON.parse(decryptedBuffer.toString("utf8"))}catch{throw new Error("Failed to decrypt vault")}else this.vaultData=JSON.parse(fs__default.readFileSync(vaultFile).toString())}catch(e){logger$5.error("Error parsing vault file:",e),logger$5.error("!!! Vault features might not work properly !!!"),this.vaultData={}}this.vaultData?.encrypted&&this.vaultData?.algorithm&&this.vaultData?.data&&this.setInteraction(this.getMasterKeyInteractive.bind(this));for(let teamId in this.vaultData)for(let resourceId in this.vaultData[teamId]){this.index||(this.index={}),this.index[resourceId]||(this.index[resourceId]={});const value=this.vaultData[teamId][resourceId];this.index[resourceId][teamId]=value}}}initFileWatcher(){!this.vaultFile||!fs__default.existsSync(this.vaultFile)||(this.watcher=chokidar.watch(this.vaultFile,{persistent:!1,ignoreInitial:!0}),this.watcher.on("change",()=>{this.fetchVaultData(this.vaultFile,this._settings)}))}async stop(){super.stop(),this.watcher&&(this.watcher.close(),this.watcher=null)}}__decorateClass$f([SecureConnector.AccessControl],JSONFileVault.prototype,"get"),__decorateClass$f([SecureConnector.AccessControl],JSONFileVault.prototype,"exists"),__decorateClass$f([SecureConnector.AccessControl],JSONFileVault.prototype,"listKeys");var __defProp$x=Object.defineProperty,__getOwnPropDesc$e=Object.getOwnPropertyDescriptor,__defNormalProp$x=(obj,key,value)=>key in obj?__defProp$x(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$e=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$e(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$x(target,key,result),result},__publicField$x=(obj,key,value)=>__defNormalProp$x(obj,typeof key!="symbol"?key+"":key,value);const defaultPrefix="smythos",console$e=Logger("SecretsManager");class SecretsManager extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$x(this,"name","SecretsManager"),__publicField$x(this,"secretsManager"),__publicField$x(this,"prefix"),this.prefix=_settings.prefix||defaultPrefix,this.secretsManager=new SecretsManagerClient({region:_settings.region,..._settings.awsAccessKeyId&&_settings.awsSecretAccessKey?{accessKeyId:_settings.awsAccessKeyId,secretAccessKey:_settings.awsSecretAccessKey}:{}})}async get(acRequest,secretName){try{const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate);return await this.getSecretById(teamId,secretName)}catch(error){throw console$e.error(error),error}}async exists(acRequest,keyId){return!!await this.get(acRequest,keyId)}async listKeys(acRequest){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),secrets=[];let nextToken;do{const listResponse=await this.secretsManager.send(new ListSecretsCommand({NextToken:nextToken,Filters:[{Key:"name",Values:[this.getVaultKey(teamId,"")]}]}));if(listResponse.SecretList)for(const secret of listResponse.SecretList)secret.Name&&secrets.push(this.extractSecretName(secret.Name,teamId,this.prefix));nextToken=listResponse.NextToken}while(nextToken);return secrets}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),acl}getVaultKey(teamId,secretName){return`${this.prefix.length?`${this.prefix}/`:""}${teamId}/${secretName}`}async getSecretById(teamId,secretId){try{return(await this.secretsManager.send(new GetSecretValueCommand({SecretId:this.getVaultKey(teamId,secretId)}))).SecretString}catch{return null}}extractSecretName(secretKey,teamId,prefix){return secretKey.replace(`${prefix}/${teamId}/`,"")}}__decorateClass$e([SecureConnector.AccessControl],SecretsManager.prototype,"get"),__decorateClass$e([SecureConnector.AccessControl],SecretsManager.prototype,"exists"),__decorateClass$e([SecureConnector.AccessControl],SecretsManager.prototype,"listKeys");var __defProp$w=Object.defineProperty,__getOwnPropDesc$d=Object.getOwnPropertyDescriptor,__defNormalProp$w=(obj,key,value)=>key in obj?__defProp$w(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$d=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$d(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$w(target,key,result),result},__publicField$w=(obj,key,value)=>__defNormalProp$w(obj,typeof key!="symbol"?key+"":key,value);const console$d=Logger("NullVault");class NullVault extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$w(this,"name","NullVault"),__publicField$w(this,"vaultData"),__publicField$w(this,"index"),__publicField$w(this,"sharedVault"),console$d.warn("NullVault is used : Vault features will not be available")}async get(acRequest,keyId){return console$d.debug(`Ignored operation:NullVault.get: ${keyId}`),"NULLKEY"}async exists(acRequest,keyId){return console$d.debug(`Ignored operation:NullVault.exists: ${keyId}`),!1}async listKeys(acRequest){return console$d.debug("Ignored operation:NullVault.listKeys"),[]}async getResourceACL(resourceId,candidate){const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}__decorateClass$d([SecureConnector.AccessControl],NullVault.prototype,"get"),__decorateClass$d([SecureConnector.AccessControl],NullVault.prototype,"exists"),__decorateClass$d([SecureConnector.AccessControl],NullVault.prototype,"listKeys");class VaultService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Vault,"JSONFileVault",JSONFileVault),ConnectorService.register(TConnectorService.Vault,"SecretsManager",SecretsManager),ConnectorService.register(TConnectorService.Vault,"NullVault",NullVault)}}class AccountConnector extends Connector{constructor(_settings){super(_settings),this._settings=_settings}requester(candidate){return{getAllUserSettings:async()=>this.getAllUserSettings(candidate.readRequest,candidate.id),getUserSetting:async settingKey=>this.getUserSetting(candidate.readRequest,candidate.id,settingKey),getAllTeamSettings:async()=>this.getAllTeamSettings(candidate.readRequest,candidate.id),getTeamSetting:async(settingKey,group)=>this.getTeamSetting(candidate.readRequest,candidate.id,settingKey,group),isTeamMember:async teamId=>this.isTeamMember(teamId,candidate),getCandidateTeam:async()=>this.getCandidateTeam(candidate),getTeam:async()=>this.getCandidateTeam(candidate),getAgentSetting:async settingKey=>this.getAgentSetting(candidate.readRequest,candidate.id,settingKey)}}}var __defProp$v=Object.defineProperty,__defNormalProp$v=(obj,key,value)=>key in obj?__defProp$v(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$v=(obj,key,value)=>__defNormalProp$v(obj,typeof key!="symbol"?key+"":key,value);const console$c=Logger("DummyAccount");class DummyAccount extends AccountConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$v(this,"name","DummyAccount"),__publicField$v(this,"data",{}),this.data=_settings?.data||{},this.data[DEFAULT_TEAM_ID]||(this.data[DEFAULT_TEAM_ID]={users:{},agents:{"FAKE-AGENT-ID":{}},settings:{}}),this.data[DEFAULT_TEAM_ID]||console$c.warn("You are using the DummyAccount connector. This is a development tool and should not be used in production if you have security concerns.")}isTeamMember(team,candidate){if(team===DEFAULT_TEAM_ID)return Promise.resolve(!0);switch(candidate.role){case TAccessRole.Team:return Promise.resolve(team===candidate.id);case TAccessRole.User:return Promise.resolve(this.data[team]?.users?.[candidate.id]);case TAccessRole.Agent:return Promise.resolve(this.data[team]?.agents?.[candidate.id]);default:return Promise.resolve(!1)}}getCandidateTeam(candidate){if(candidate.role===TAccessRole.Team)return Promise.resolve(candidate.id);for(const team in this.data)if(candidate.role===TAccessRole.User&&this.data[team]?.users?.[candidate.id]||candidate.role===TAccessRole.Agent&&this.data[team]?.agents?.[candidate.id])return Promise.resolve(team);return Promise.resolve(DEFAULT_TEAM_ID)}getResourceACL(resourceId,candidate){throw new Error("getResourceACL Method not implemented.")}getAllTeamSettings(acRequest,teamId){return Promise.resolve(this.data[teamId]?.settings)}getAllUserSettings(acRequest,accountId){for(const team in this.data)if(this.data[team]?.users?.[accountId])return Promise.resolve(this.data[team]?.users?.[accountId]?.settings);return Promise.resolve([])}getTeamSetting(acRequest,teamId,settingKey){return Promise.resolve(this.data[teamId]?.settings?.[settingKey])}getUserSetting(acRequest,accountId,settingKey){for(const team in this.data)if(this.data[team]?.users?.[accountId])return Promise.resolve(this.data[team]?.users?.[accountId]?.settings?.[settingKey]);return Promise.resolve(void 0)}getAgentSetting(acRequest,agentId,settingKey){for(const team in this.data)if(this.data[team]?.agents?.[agentId])return Promise.resolve(this.data[team]?.agents?.[agentId]?.settings?.[settingKey]);return Promise.resolve(void 0)}}var __defProp$u=Object.defineProperty,__defNormalProp$u=(obj,key,value)=>key in obj?__defProp$u(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$u=(obj,key,value)=>__defNormalProp$u(obj,typeof key!="symbol"?key+"":key,value);class MySQLAccount extends AccountConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$u(this,"name","MySQLAccount"),__publicField$u(this,"pool"),this.pool=mysql.createPool({host:_settings.host,database:_settings.database||"app",user:_settings.user||"app",password:_settings.password,connectionLimit:10})}isTeamMember(team,candidate){return Promise.resolve(!0)}getCandidateTeam(candidate){return candidate.role===TAccessRole.Team?Promise.resolve(candidate.id):Promise.resolve(DEFAULT_TEAM_ID)}async getAllTeamSettings(acRequest,teamId){try{const[rows]=await this.pool.execute("SELECT `key`, `value` FROM TeamSettings"),settings=[];return Array.isArray(rows)&&rows.length>0&&settings.push(...rows.map(row=>({key:row.key,value:row.value}))),settings}catch(error){return console.error("Error in getTeamSetting:",error),[]}}async getTeamSetting(acRequest,teamId,settingKey){try{const[rows]=await this.pool.execute("SELECT `value` FROM TeamSettings WHERE `key` = ? LIMIT 1",[settingKey]);return Array.isArray(rows)&&rows.length>0&&"value"in rows[0]?rows[0].value:""}catch(error){return console.error("Error in getTeamSetting:",error),""}}getResourceACL(resourceId,candidate){throw new Error("getResourceACL Method not implemented.")}getAllUserSettings(acRequest,accountId){throw new Error("getAllUserSettings Method not implemented.")}getUserSetting(acRequest,accountId,settingKey){throw new Error("getUserSetting Method not implemented.")}getAgentSetting(acRequest,agentId,settingKey){throw new Error("getAgentSetting Method not implemented.")}}var __defProp$t=Object.defineProperty,__defNormalProp$t=(obj,key,value)=>key in obj?__defProp$t(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$t=(obj,key,value)=>__defNormalProp$t(obj,typeof key!="symbol"?key+"":key,value);class JSONFileAccount extends AccountConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$t(this,"name","JSONFileAccount"),__publicField$t(this,"data",{}),__publicField$t(this,"file"),this.file=_settings.file,this.loadData()}loadData(){try{const fileContent=fs.readFileSync(this.file,"utf-8");this.data=JSON.parse(fileContent)}catch(error){console.error("Error loading JSON account data:",error),this.data={}}}saveData(){try{fs.writeFileSync(this.file,JSON.stringify(this.data,null,2))}catch(error){console.error("Error saving JSON account data:",error)}}async isTeamMember(team,candidate){return team===DEFAULT_TEAM_ID?!(candidate.role===TAccessRole.User&&!this.data[team].users?.[candidate.id]):this.data[team]?candidate.role===TAccessRole.Team&&team===candidate.id?!0:candidate.role===TAccessRole.User?!!this.data[team].users?.[candidate.id]:candidate.role===TAccessRole.Agent?!!this.data[team].agents?.[candidate.id]:!1:!1}async getCandidateTeam(candidate){if(candidate.role===TAccessRole.Team)return candidate.id;for(const[teamId,teamData]of Object.entries(this.data)){const typedTeamData=teamData;if(candidate.role===TAccessRole.User&&typedTeamData.users?.[candidate.id]||candidate.role===TAccessRole.Agent&&typedTeamData.agents?.[candidate.id])return teamId}return DEFAULT_TEAM_ID}async getResourceACL(resourceId,candidate){throw new Error("getResourceACL Method not implemented.")}async getAllTeamSettings(acRequest,teamId){return this.data[teamId]?.settings?Object.entries(this.data[teamId].settings).map(([key,value])=>({key,value})):[]}async getAllUserSettings(acRequest,accountId){for(const teamData of Object.values(this.data)){const typedTeamData=teamData;if(typedTeamData.users?.[accountId]?.settings)return Object.entries(typedTeamData.users[accountId].settings).map(([key,value])=>({key,value}))}return[]}async getTeamSetting(acRequest,teamId,settingKey){return this.data[teamId]?.settings?.[settingKey]||""}async getUserSetting(acRequest,accountId,settingKey){for(const teamData of Object.values(this.data)){const typedTeamData=teamData;if(typedTeamData.users?.[accountId]?.settings?.[settingKey])return typedTeamData.users[accountId].settings[settingKey]}return""}async getAgentSetting(acRequest,agentId,settingKey){for(const teamData of Object.values(this.data)){const typedTeamData=teamData;if(typedTeamData.agents?.[agentId]?.settings?.[settingKey])return typedTeamData.agents[agentId].settings[settingKey]}return""}}class AccountService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Account,"MySQLAccount",MySQLAccount),ConnectorService.register(TConnectorService.Account,"DummyAccount",DummyAccount),ConnectorService.register(TConnectorService.Account,"JSONFileAccount",JSONFileAccount)}}var __defProp$s=Object.defineProperty,__defNormalProp$s=(obj,key,value)=>key in obj?__defProp$s(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$s=(obj,key,value)=>__defNormalProp$s(obj,typeof key!="symbol"?key+"":key,value);const openapiTemplate=JSON.stringify({openapi:"3.0.1",info:{title:"{{model_name}}",description:"{{model_description}}",version:"{{version}}"},servers:[{url:"{{server_url}}"}],paths:{},components:{schemas:{}}}),openapiEndpointTemplate=JSON.stringify({summary:"{{summary}}",operationId:"{{operationId}}","x-openai-isConsequential":!1,requestBody:{required:!0,content:{}},responses:{200:{description:"response",content:{"text/plain":{schema:{type:"string"}}}}}}),_AgentDataConnector=class _AgentDataConnector2 extends Connector{constructor(){super(...arguments),__publicField$s(this,"name","AgentDataConnector")}async getOpenAPIJSON(source,server_url,version2,aiOnly=!1){if(!source)throw new Error("Agent not found");const apiBasePath=version2&&version2!="latest"?`/v${version2}/api`:"/api";let agentData=typeof source=="object"?source:await this.getAgentData(source,version2);agentData.data&&(agentData=agentData.data);const name=agentData.name;let description=aiOnly?agentData.behavior:agentData.shortDescription;description||(description=agentData.description);const _version=agentData.version||"1.0.0",openAPITpl=TemplateString(openapiTemplate).parse({model_name:escapeString(name),model_description:escapeString(description),server_url,version:_version}).clean().result,openAPIObj=JSON.parse(openAPITpl),components2=agentData.components.filter(component=>component.name==="APIEndpoint");for(let component of components2){const ai_exposed=component.data.ai_exposed||typeof component.data.ai_exposed>"u";if(aiOnly&&!ai_exposed)continue;let method=(component.data.method||"post").toLowerCase(),summary=aiOnly?component.data.description||component.data.doc:component.data.doc||component.data.description;const openAPIEntry=JSONContent(TemplateString(openapiEndpointTemplate).parse({summary:summary?.replace(/"/g,'\\"'),operationId:component?.data?.endpoint}).clean().result).tryParse();if(typeof openAPIEntry!="object"){console.warn("Error on openAPIEntry: ",openAPIEntry);continue}if(openAPIObj.paths[apiBasePath+"/"+component.data.endpoint]||(openAPIObj.paths[apiBasePath+"/"+component.data.endpoint]={}),openAPIObj.paths[apiBasePath+"/"+component.data.endpoint][method]=openAPIEntry,component.inputs.length>0)if(method==="get"){delete openAPIEntry.requestBody,openAPIEntry.parameters=[];for(let input of component.inputs){const parameter={name:input.name,in:"query",description:input.description,required:!input.optional,schema:getOpenAPIInputSchema(input.type)},{style,explode}=getOpenAPIParameterStyle(input.type);style&&(parameter.style=style,parameter.explode=explode),openAPIEntry.parameters.push(parameter)}}else{const requiredProps=[],mimetype=!aiOnly&&component.inputs.some(input=>input.type.toLowerCase().trim()==="binary")?"multipart/form-data":"application/json";openAPIEntry.requestBody.content[mimetype]={};for(let input of component.inputs){input.optional||requiredProps.push(input.name),openAPIEntry.requestBody.content[mimetype].schema||(openAPIEntry.requestBody.content[mimetype].schema={type:"object"});const schema=openAPIEntry.requestBody.content[mimetype].schema||{type:"object"};schema.properties||(schema.properties={}),schema.properties[input.name]={...getOpenAPIInputSchema(input.type),format:!aiOnly&&input.type.toLowerCase().trim()==="binary"?"binary":void 0,description:input.description,default:input.defaultVal},schema.required=requiredProps,openAPIEntry.requestBody.content[mimetype].schema||(openAPIEntry.requestBody.content["application/json"].schema=schema)}}else delete openAPIEntry.requestBody}return openAPIObj}async setEphemeralAgentData(agentId,data){_AgentDataConnector2.ephemeralAgentData.set(agentId,data)}async getEphemeralAgentData(agentId){return _AgentDataConnector2.ephemeralAgentData.get(agentId)}};__publicField$s(_AgentDataConnector,"ephemeralAgentData",new Map);let AgentDataConnector=_AgentDataConnector;function getOpenAPIInputSchema(input_type){switch(input_type?.toLowerCase()){case"binary":case"string":case"any":return{type:"string"};case"number":case"float":return{type:"number"};case"integer":return{type:"integer"};case"boolean":return{type:"boolean"};case"array":return{type:"array",items:{}};case"object":return{type:"object",additionalProperties:{}};default:return{type:"string"}}}function getOpenAPIParameterStyle(input_type){switch(input_type.toLowerCase()){case"array":return{style:"form",explode:!1};case"object":return{style:"deepObject",explode:!0};default:return{style:"",explode:!1}}}var __defProp$r=Object.defineProperty,__defNormalProp$r=(obj,key,value)=>key in obj?__defProp$r(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$r=(obj,key,value)=>__defNormalProp$r(obj,typeof key!="symbol"?key+"":key,value);class CLIAgentDataConnector extends AgentDataConnector{constructor(settings){super(),__publicField$r(this,"name","CLIAgentDataConnector"),__publicField$r(this,"argv"),this.argv=settings.args||process.argv}getAgentConfig(agentId){return{}}async getAgentData(agentId,version2){const params=ConnectorService.getCLIConnector().get("agent"),__dirname=fs__default.realpathSync(process.cwd()),filePath=path.join(__dirname,params.agent);if(fs__default.existsSync(filePath)){const data=fs__default.readFileSync(filePath,"utf8");return{data:JSON.parse(data),version:version2||"1.0"}}}getAgentIdByDomain(domain){return Promise.resolve("")}async getAgentSettings(agentId,version2){const params=ConnectorService.getCLIConnector().get("settings");let settings;return typeof params.settings=="string"?fs__default.existsSync(params.settings)&&(settings=JSON.parse(fs__default.readFileSync(params.settings,"utf8"))):settings=params.settings,settings}async getAgentEmbodiments(agentId){return[]}async listTeamAgents(teamId,deployedOnly){return console.warn("listTeamAgents is not implemented for CLIAgentDataConnector"),[]}async isDeployed(agentId){return!0}}var __defProp$q=Object.defineProperty,__defNormalProp$q=(obj,key,value)=>key in obj?__defProp$q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$q=(obj,key,value)=>__defNormalProp$q(obj,typeof key!="symbol"?key+"":key,value);const console$b=Logger("LocalAgentDataConnector");class LocalAgentDataConnector extends AgentDataConnector{constructor(settings){super(),__publicField$q(this,"name","LocalAgentDataConnector"),__publicField$q(this,"devDir"),__publicField$q(this,"prodDir"),__publicField$q(this,"agentsData",{dev:{},prod:{}}),__publicField$q(this,"agentSettings",{dev:{},prod:{}}),this.devDir=settings.devDir,this.prodDir=settings.prodDir}getAgentConfig(agentId){return{}}indexDir(dir){const agents=fs__default.readdirSync(dir),agentsData={},agentSettings={};for(const agent of agents){if(!agent.endsWith(".smyth"))continue;const agentData=fs__default.readFileSync(path.join(dir,agent),"utf8");let jsonData;try{if(jsonData=JSON.parse(agentData),!jsonData.components){console$b.warn(`File ${agent} is not a valid agent data file, skipping...`);continue}jsonData.id||(console$b.warn(`Agent data for ${agent} does not contain an id, generating one...`),jsonData.id="tmp-"+uid())}catch(e){console$b.warn(`Error parsing agent data for ${agent}: ${e.message}`)}jsonData.components&&(agentsData[jsonData.id]=jsonData),jsonData.settings&&(agentSettings[jsonData.id]=jsonData.settings)}return{agentsData,agentSettings}}indexAgentsData(){const{agentsData:devAgentsData,agentSettings:devAgentSettings}=this.indexDir(this.devDir),{agentsData:prodAgentsData,agentSettings:prodAgentSettings}=this.indexDir(this.prodDir);this.agentsData={dev:devAgentsData,prod:prodAgentsData},this.agentSettings={dev:devAgentSettings,prod:prodAgentSettings}}async start(){super.start(),this.started=!1,this.indexAgentsData(),this.started=!0}async getAgentData(agentId,version2){if(!await this.ready())throw new Error("Connector not ready");const data=version2?this.agentsData.prod[agentId]:this.agentsData.dev[agentId];if(data)return{data,version:version2||"1.0"};throw new Error(`Agent with id ${agentId} not found`)}getAgentIdByDomain(domain){return Promise.resolve("")}async getAgentSettings(agentId,version2){if(!await this.ready())throw new Error("Connector not ready");const settings=version2?this.agentSettings.prod[agentId]:this.agentSettings.dev[agentId];if(settings)return settings;throw new Error(`Settings for agent with id ${agentId} not found`)}async getAgentEmbodiments(agentId){return[]}async listTeamAgents(teamId,deployedOnly){return console$b.warn("listTeamAgents is not implemented for LocalAgentDataConnector"),[]}async isDeployed(agentId){return!!this.agentsData.prod[agentId]}}var __defProp$p=Object.defineProperty,__defNormalProp$p=(obj,key,value)=>key in obj?__defProp$p(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$p=(obj,key,value)=>__defNormalProp$p(obj,key+"",value);class NullAgentData extends AgentDataConnector{constructor(settings){super(),__publicField$p(this,"name","NullAgentData")}getAgentConfig(agentId){return null}async getAgentData(agentId,version2){return null}getAgentIdByDomain(domain){return Promise.resolve("")}async getAgentSettings(agentId,version2){return{}}async getAgentEmbodiments(agentId){return[]}async listTeamAgents(teamId,deployedOnly){return[]}async isDeployed(agentId){return!0}}class AgentDataService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.AgentData,"AgentData",AgentDataConnector),ConnectorService.register(TConnectorService.AgentData,"CLI",CLIAgentDataConnector),ConnectorService.register(TConnectorService.AgentData,"Local",LocalAgentDataConnector),ConnectorService.register(TConnectorService.AgentData,"NullAgentData",NullAgentData)}}var __defProp$o=Object.defineProperty,__defNormalProp$o=(obj,key,value)=>key in obj?__defProp$o(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$o=(obj,key,value)=>__defNormalProp$o(obj,key+"",value);class VectorDBConnector extends SecureConnector{constructor(){super(...arguments),__publicField$o(this,"USER_METADATA_KEY","user_metadata")}requester(candidate){return{search:async(namespace,query,options)=>await this.search(candidate.readRequest,namespace,query,options),createDatasource:async(namespace,datasource)=>await this.createDatasource(candidate.writeRequest,namespace,datasource),deleteDatasource:async(namespace,datasourceId)=>{await this.deleteDatasource(candidate.writeRequest,namespace,datasourceId)},listDatasources:async namespace=>await this.listDatasources(candidate.readRequest,namespace),getDatasource:async(namespace,datasourceId)=>await this.getDatasource(candidate.readRequest,namespace,datasourceId),createNamespace:async(namespace,metadata)=>{await this.createNamespace(candidate.writeRequest,namespace,metadata)},deleteNamespace:async namespace=>{await this.deleteNamespace(candidate.writeRequest,namespace)},namespaceExists:async namespace=>await this.namespaceExists(candidate.readRequest,namespace)}}constructNsName(candidate,name){const joinedName=name.trim().replace(/\s/g,"_").toLowerCase();return`${candidate.role[0]+"_"+candidate.id}_${joinedName}`}}function chunkArr(arr,sizePerChunk){return arr.reduce((chunks,elem,index)=>{const chunkIndex=Math.floor(index/sizePerChunk),chunk=chunks[chunkIndex]||[];return chunks[chunkIndex]=chunk.concat([elem]),chunks},[])}var __defProp$n=Object.defineProperty,__getOwnPropDesc$c=Object.getOwnPropertyDescriptor,__defNormalProp$n=(obj,key,value)=>key in obj?__defProp$n(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$c=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$c(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$n(target,key,result),result},__publicField$n=(obj,key,value)=>__defNormalProp$n(obj,typeof key!="symbol"?key+"":key,value);const console$a=Logger("Pinecone VectorDB");class PineconeVectorDB extends VectorDBConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$n(this,"name","PineconeVectorDB"),__publicField$n(this,"id","pinecone"),__publicField$n(this,"client"),__publicField$n(this,"indexName"),__publicField$n(this,"cache"),__publicField$n(this,"accountConnector"),__publicField$n(this,"nkvConnector"),__publicField$n(this,"embedder"),!_settings.apiKey&&!_settings?.credentials?.apiKey){console$a.warn("Missing Pinecone API key : returning empty Pinecone connector");return}if(!_settings.indexName&&!_settings?.credentials?.indexName){console$a.warn("Missing Pinecone index name : returning empty Pinecone connector");return}this.client=new Pinecone({apiKey:_settings.apiKey||_settings.credentials?.apiKey}),console$a.info("Pinecone client initialized"),console$a.info("Pinecone index name:",_settings.indexName||_settings.credentials?.indexName),this.indexName=_settings.indexName||_settings.credentials?.indexName,this.accountConnector=ConnectorService.getAccountConnector(),this.cache=ConnectorService.getCacheConnector(),this.nkvConnector=ConnectorService.getNKVConnector(),_settings.embeddings||(_settings.embeddings={provider:"OpenAI",model:"text-embedding-3-large",dimensions:3072}),_settings.embeddings?.dimensions||(_settings.embeddings.dimensions=3072),this.embedder=EmbeddingsFactory.create(_settings.embeddings.provider,_settings.embeddings)}async getResourceACL(resourceId,candidate){const preparedNs=this.constructNsName(candidate,resourceId),acl=await this.getACL(AccessCandidate.clone(candidate),preparedNs);return acl?ACL.from(acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async createNamespace(acRequest,namespace,metadata){const preparedNs=this.constructNsName(acRequest.candidate,namespace),acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),nsData={acl:acl.serializedACL,displayName:namespace,...metadata};return await this.client.Index(this.indexName).namespace(preparedNs).upsert([{id:`_reserved_${preparedNs}`,values:this.embedder.dummyVector,metadata:{isSkeletonVector:!0,...nsData}}]),await this.setACL(acRequest,preparedNs,acl.ACL),new Promise(resolve=>resolve())}async namespaceExists(acRequest,namespace){const stats=await this.client.Index(this.indexName).describeIndexStats();return Object.keys(stats.namespaces).includes(this.constructNsName(acRequest.candidate,namespace))}async deleteNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace);await this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace)).deleteAll().catch(e=>{if(console$a.error(`Error deleting namespace ${namespace}: ${e}`),e?.name=="PineconeNotFoundError"){console$a.warn(`Namespace ${namespace} does not exist and was requested to be deleted`);return}throw e}),await this.nkvConnector.requester(acRequest.candidate).deleteAll(`vectorDB:${this.id}:namespaces:${preparedNs}:datasources`),await this.deleteACL(AccessCandidate.clone(acRequest.candidate),namespace)}async search(acRequest,namespace,query,options={}){const pineconeIndex=this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace));let _vector=query;typeof query=="string"&&(_vector=await this.embedder.embedText(query,acRequest.candidate));const topK=(options.topK||10)+1,results=await pineconeIndex.query({topK,vector:_vector,includeMetadata:!0,includeValues:!0});let matches=[];for(const match of results.matches){if(match.metadata?.isSkeletonVector)continue;match.metadata?.[this.USER_METADATA_KEY]&&(match.metadata[this.USER_METADATA_KEY]=JSONContentHelper.create(match.metadata[this.USER_METADATA_KEY].toString()).tryParse());const text=match.metadata?.text;delete match.metadata?.text,matches.push({id:match.id,values:match.values,text,metadata:match.metadata?.[this.USER_METADATA_KEY]||match.metadata,score:match.score})}return matches.slice(0,options.topK)}async insert(acRequest,namespace,sourceWrapper){if(sourceWrapper=Array.isArray(sourceWrapper)?sourceWrapper:[sourceWrapper],sourceWrapper.some(s=>this.embedder.detectSourceType(s.source)!==this.embedder.detectSourceType(sourceWrapper[0].source)))throw new Error("All sources must be of the same type");const sourceType=this.embedder.detectSourceType(sourceWrapper[0].source);if(sourceType==="unknown"||sourceType==="url")throw new Error("Invalid source type");const preparedSources=(await this.embedder.transformSource(sourceWrapper,sourceType,acRequest.candidate)).map(s=>({id:s.id,values:s.source,metadata:s.metadata})),promises=chunkArr(preparedSources,100).map(async chunk=>{await this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace)).upsert(chunk)});await Promise.all(promises);const accessCandidate=acRequest.candidate;if(!await this.requester(AccessCandidate.clone(accessCandidate)).namespaceExists(namespace)){let acl=new ACL().addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL;await this.setACL(acRequest,namespace,acl)}return preparedSources.map(s=>{const{text,acl,user_metadata,...restMetadata}=s.metadata||{};return{id:s.id,values:s.values,text,metadata:{...restMetadata,...typeof user_metadata=="string"?JSON.parse(user_metadata):user_metadata}}})}async delete(acRequest,namespace,deleteTarget){if(!(typeof deleteTarget=="object"&&!Array.isArray(deleteTarget))){const _ids=Array.isArray(deleteTarget)?deleteTarget:[deleteTarget],promises=chunkArr(_ids,800).map(async chunk=>{await this.client.Index(this.indexName).namespace(this.constructNsName(acRequest.candidate,namespace)).deleteMany(chunk)});await Promise.all(promises)}}async createDatasource(acRequest,namespace,datasource){const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),dsId=datasource.id||crypto$1.randomUUID();datasource.chunkSize||(datasource.chunkSize=2e3),datasource.chunkOverlap||(datasource.chunkOverlap=200);const formattedNs=this.constructNsName(acRequest.candidate,namespace),chunkedText=this.embedder.chunkText(datasource.text,{chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap}),label=datasource.label||"Untitled",ids=Array.from({length:chunkedText.length},(_,i)=>`${dsId}_${crypto$1.randomUUID()}`),source=chunkedText.map((doc,i)=>({id:ids[i],source:doc,metadata:{acl:acl.serializedACL,namespaceId:formattedNs,datasourceId:dsId,datasourceLabel:label,chunkIndex:i,user_metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0}})),_vIds=await this.insert(acRequest,namespace,source),dsData={namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,name:datasource.label||"Untitled",metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0,text:datasource.text,vectorIds:_vIds.map(v=>v.id),id:dsId,datasourceSizeMb:calcSizeMb(datasource.text),chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap,createdAt:new Date};return datasource.returnFullVectorInfo&&(dsData.vectorInfo=_vIds),await this.nkvConnector.requester(acRequest.candidate).set(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,dsId,JSON.stringify(dsData)),dsData}async deleteDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);let ds=JSONContentHelper.create((await this.nkvConnector.requester(acRequest.candidate).get(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId))?.toString()).tryParse();if(!ds||typeof ds!="object")throw new Error(`Data source not found with id: ${datasourceId}`);await this.delete(acRequest,namespace,ds.vectorIds||[]),await this.nkvConnector.requester(acRequest.candidate).delete(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId)}async listDatasources(acRequest,namespace){const formattedNs=this.constructNsName(acRequest.candidate,namespace);return(await this.nkvConnector.requester(acRequest.candidate).list(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`)).map(ds=>JSONContentHelper.create(ds.data?.toString()).tryParse())}async getDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);return JSONContentHelper.create((await this.nkvConnector.requester(acRequest.candidate).get(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId))?.toString()).tryParse()}async setACL(acRequest,preparedNs,acl){await this.cache.requester(AccessCandidate.clone(acRequest.candidate)).set(`vectorDB:pinecone:namespace:${preparedNs}:acl`,JSON.stringify(acl))}async getACL(ac,preparedNs){let aclRes=await this.cache.requester(ac).get(`vectorDB:pinecone:namespace:${preparedNs}:acl`);return JSONContentHelper.create(aclRes?.toString?.()).tryParse()}async deleteACL(ac,preparedNs){this.cache.requester(AccessCandidate.clone(ac)).delete(`vectorDB:pinecone:namespace:${preparedNs}:acl`)}constructNsName(candidate,name){const joinedName=name.trim().replace(/\s/g,"_").toLowerCase();let prefix=candidate.id;return candidate.role!==TAccessRole.Team&&(prefix=candidate.role[0]+"_"+candidate.id),`${prefix}_${joinedName}`}}__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"createNamespace"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"namespaceExists"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"deleteNamespace"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"search"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"insert"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"delete"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"createDatasource"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"deleteDatasource"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"listDatasources"),__decorateClass$c([SecureConnector.AccessControl],PineconeVectorDB.prototype,"getDatasource");var __defProp$m=Object.defineProperty,__getOwnPropDesc$b=Object.getOwnPropertyDescriptor,__defNormalProp$m=(obj,key,value)=>key in obj?__defProp$m(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$b=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$b(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$m(target,key,result),result},__publicField$m=(obj,key,value)=>__defNormalProp$m(obj,typeof key!="symbol"?key+"":key,value);//! needs to install @zilliz/milvus2-sdk-node in the package.json of the project so it can work
|
|
273
|
+
const console$9=Logger("Milvus");class MilvusVectorDB extends VectorDBConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$m(this,"name","MilvusVectorDB"),__publicField$m(this,"id","milvus"),__publicField$m(this,"client"),__publicField$m(this,"cache"),__publicField$m(this,"accountConnector"),__publicField$m(this,"embedder"),__publicField$m(this,"SCHEMA_DEFINITION"),__publicField$m(this,"INDEX_PARAMS"),__publicField$m(this,"nkvConnector"),!_settings.credentials)return;const clientConfig={address:_settings.credentials?.address,token:"token"in _settings.credentials?_settings.credentials.token:void 0,user:"user"in _settings.credentials?_settings.credentials.user:void 0,password:"password"in _settings.credentials?_settings.credentials.password:void 0};console$9.log("clientConfig",clientConfig),this.client=new MilvusClient(clientConfig,void 0,void 0,void 0,{"grpc.max_receive_message_length":50*1024*1024,"grpc.max_send_message_length":50*1024*1024,max_receive_message_length:50*1024*1024,max_send_message_length:50*1024*1024}),console$9.info("Milvus client initialized"),this.accountConnector=ConnectorService.getAccountConnector(),this.cache=ConnectorService.getCacheConnector(),this.nkvConnector=ConnectorService.getNKVConnector(),_settings.embeddings||(_settings.embeddings={provider:"OpenAI",model:"text-embedding-3-large",dimensions:3072}),_settings.embeddings?.dimensions||(_settings.embeddings.dimensions=3072),this.embedder=EmbeddingsFactory.create(_settings.embeddings.provider,_settings.embeddings),this.SCHEMA_DEFINITION=[{name:"id",data_type:DataType.VarChar,is_primary_key:!0,max_length:2048},{name:"text",data_type:DataType.VarChar,max_length:65535},{name:this.USER_METADATA_KEY,data_type:DataType.VarChar,max_length:65535},{name:"namespaceId",data_type:DataType.VarChar,max_length:2048},{name:"datasourceId",data_type:DataType.VarChar,max_length:2048},{name:"datasourceLabel",data_type:DataType.VarChar,max_length:2048},{name:"vector",data_type:DataType.FloatVector,dim:this.embedder.dimensions},{name:"acl",data_type:DataType.VarChar,max_length:2048},{name:"smyth_metadata",data_type:DataType.VarChar,max_length:65535}],this.INDEX_PARAMS={index_type:"AUTOINDEX",metric_type:"COSINE",field_name:"vector"}}async createNamespace(acRequest,namespace,metadata){const preparedNs=this.constructNsName(acRequest.candidate,namespace);await this.client.createCollection({collection_name:preparedNs,schema:this.SCHEMA_DEFINITION,index_params:this.INDEX_PARAMS});const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL;return await this.setACL(acRequest,preparedNs,acl),new Promise(resolve=>resolve())}async namespaceExists(acRequest,namespace){const res=await this.client.hasCollection({collection_name:this.constructNsName(acRequest.candidate,namespace)});if(res.status.error_code!==ErrorCode.SUCCESS)throw new Error(`Error checking collection: ${res}`);return!!res.value}async deleteNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace),res=await this.client.dropCollection({collection_name:preparedNs});if(res.error_code!==ErrorCode.SUCCESS)throw new Error(`Error dropping collection: ${res}`);await this.nkvConnector.requester(acRequest.candidate).deleteAll(`vectorDB:${this.id}:namespaces:${preparedNs}:datasources`),await this.deleteACL(AccessCandidate.clone(acRequest.candidate),namespace)}async search(acRequest,namespace,query,options={}){const preparedNs=this.constructNsName(acRequest.candidate,namespace);let _vector=query;typeof query=="string"&&(_vector=await this.embedder.embedText(query,acRequest.candidate));const result=await this.client.search({data:_vector,collection_name:preparedNs,limit:options.topK||10});if(result.status.error_code!==ErrorCode.SUCCESS)throw new Error(`Error searching data: ${result.status.detail}`);return result.results.map(match=>{let _record=match;return match?.[this.USER_METADATA_KEY]&&(_record[this.USER_METADATA_KEY]=JSONContentHelper.create(match[this.USER_METADATA_KEY].toString()).tryParse()),{id:_record.id,values:_record.vector,text:_record.text,metadata:_record[this.USER_METADATA_KEY]??{},score:_record.score}})}async insert(acRequest,namespace,sourceWrapper){sourceWrapper=Array.isArray(sourceWrapper)?sourceWrapper:[sourceWrapper];const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(sourceWrapper.some(s=>this.embedder.detectSourceType(s.source)!==this.embedder.detectSourceType(sourceWrapper[0].source)))throw new Error("All sources must be of the same type");const sourceType=this.embedder.detectSourceType(sourceWrapper[0].source);if(sourceType==="unknown"||sourceType==="url")throw new Error("Unsupported source type");const transformedSource=await this.embedder.transformSource(sourceWrapper,sourceType,acRequest.candidate),liveSchema=await this.client.describeCollection({collection_name:preparedNs}),preparedSource=transformedSource.map(s=>{function schemaFieldExists(field){return liveSchema.schema.fields.some(f=>f.name===field)}return{id:s.id,text:s.metadata?.text,user_metadata:s.metadata?.[this.USER_METADATA_KEY],namespaceId:preparedNs,datasourceId:s.metadata?.datasourceId,datasourceLabel:s.metadata?.datasourceLabel,vector:s.source,acl:s.metadata?.acl,...schemaFieldExists("smyth_metadata")?{smyth_metadata:JSON.stringify({datasource:{id:s.metadata?.datasourceId,label:s.metadata?.datasourceLabel,chunkSize:s.metadata?.chunkSize,chunkOverlap:s.metadata?.chunkOverlap,createdAt:s.metadata?.createdAt,datasourceSizeMb:s.metadata?.datasourceSizeMb,chunkIndex:s.metadata?.chunkIndex}})}:{}}}),res=await this.client.insert({collection_name:preparedNs,data:preparedSource});if(res.status.error_code!==ErrorCode.SUCCESS)throw console$9.error("Error inserting data: ",res),new Error(`Error inserting data: ${res?.status?.error_code}`);return preparedSource.map(s=>{const{text,acl,user_metadata,...restMetadata}=s||{};return{id:s.id,values:s.vector,text,metadata:{...restMetadata,...typeof user_metadata=="string"?JSON.parse(user_metadata):user_metadata}}})}async delete(acRequest,namespace,deleteTarget){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(typeof deleteTarget=="object"&&!Array.isArray(deleteTarget)){if(!["datasourceId"].some(field=>field in deleteTarget))throw new Error(`Unsupported field in delete target: ${Object.keys(deleteTarget).join(", ")}`);const res=await this.client.deleteEntities({collection_name:preparedNs,expr:`datasourceId == "${deleteTarget.datasourceId}"`});if(res.status.error_code!==ErrorCode.SUCCESS)throw new Error(`Error deleting data: ${res}`)}else{const _ids=Array.isArray(deleteTarget)?deleteTarget:[deleteTarget],res=await this.client.delete({collection_name:preparedNs,ids:_ids});if(res.status.error_code!==ErrorCode.SUCCESS)throw new Error(`Error deleting data: ${res}`)}}async createDatasource(acRequest,namespace,datasource){await this.accountConnector.getCandidateTeam(acRequest.candidate);const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),dsId=datasource.id||crypto$1.randomUUID();datasource.chunkSize||(datasource.chunkSize=1e3),datasource.chunkOverlap||(datasource.chunkOverlap=200);const formattedNs=this.constructNsName(acRequest.candidate,namespace),chunkedText=this.embedder.chunkText(datasource.text,{chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap}),ids=Array.from({length:chunkedText.length},(_,i)=>crypto$1.randomUUID()),label=datasource.label||"Untitled",totalSizeMb=calcSizeMb(datasource.text),source=chunkedText.map((doc,i)=>({id:ids[i],source:doc,metadata:{acl:acl.serializedACL,namespaceId:formattedNs,datasourceId:dsId,datasourceLabel:label,chunkSize:datasource?.chunkSize?.toString(),chunkOverlap:datasource?.chunkOverlap?.toString(),createdAt:new Date().getTime().toString(),datasourceSizeMb:totalSizeMb.toString(),chunkIndex:i,user_metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):JSON.stringify({})}})),_vIds=await this.insert(acRequest,namespace,source),dsData={namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,name:label,metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0,text:datasource.text,vectorIds:_vIds.map(v=>v.id),id:dsId,chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap,createdAt:new Date,datasourceSizeMb:totalSizeMb};return await this.nkvConnector.requester(acRequest.candidate).set(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,dsId,JSON.stringify(dsData)),datasource.returnFullVectorInfo&&(dsData.vectorInfo=_vIds),dsData}async deleteDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);await this.delete(acRequest,namespace,{datasourceId}),await this.nkvConnector.requester(acRequest.candidate).delete(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId)}async listDatasources(acRequest,namespace){const formattedNs=this.constructNsName(acRequest.candidate,namespace);try{return await this.nkvConnector.requester(acRequest.candidate).list(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`).then(ds=>ds.map(d=>JSONContentHelper.create(d.data?.toString()).tryParse()))}catch(error){console$9.error("[NKV] Error listing datasources: ",error)}console$9.info("Trying to get datasources from Milvus");const iterator=await this.client.queryIterator({collection_name:formattedNs,batchSize:1e3}),datasourceMap=new Map;try{for await(const batch of iterator)for(const record of batch){const datasourceId=record.datasourceId;datasourceMap.has(datasourceId)||datasourceMap.set(datasourceId,{namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,name:record.datasourceLabel,metadata:record[this.USER_METADATA_KEY]?JSONContentHelper.create(record[this.USER_METADATA_KEY].toString()).tryParse():void 0,id:datasourceId,vectorIds:[],text:""}),datasourceMap.get(datasourceId).vectorIds.push(record.id),datasourceMap.get(datasourceId).text+=record.text}}finally{}return Array.from(datasourceMap.values())}async getDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);try{const nkvDatasource=await this.nkvConnector.requester(acRequest.candidate).get(`vectorDB:${this.id}:namespaces:${formattedNs}:datasources`,datasourceId).then(ds=>JSONContentHelper.create(ds?.toString()).tryParse());if(nkvDatasource)return nkvDatasource;console$9.info("Datasource not found in NKV")}catch(error){console$9.error("[NKV] Error getting datasource: ",error)}console$9.info("Trying to get datasource from Milvus");const res=await this.client.query({collection_name:formattedNs,expr:`datasourceId == "${datasourceId}"`});if(res.data.length===0)return;const referenceRecord=res.data[0],allIds=res.data.map(d=>d.id);return{namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,text:referenceRecord.text,name:referenceRecord.datasourceLabel,metadata:referenceRecord[this.USER_METADATA_KEY]?JSONContentHelper.create(referenceRecord[this.USER_METADATA_KEY].toString()).tryParse():void 0,vectorIds:allIds,id:datasourceId}}async setACL(acRequest,preparedNs,acl){await this.cache.requester(AccessCandidate.clone(acRequest.candidate)).set(`vectorDB:pinecone:namespace:${preparedNs}:acl`,JSON.stringify(acl))}async getACL(ac,preparedNs){let aclRes=await this.cache.requester(ac).get(`vectorDB:pinecone:namespace:${preparedNs}:acl`);return JSONContentHelper.create(aclRes?.toString?.()).tryParse()}async getResourceACL(resourceId,candidate){const preparedNs=this.constructNsName(candidate,resourceId),acl=await this.getACL(AccessCandidate.clone(candidate),preparedNs);return acl?ACL.from(acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async deleteACL(ac,preparedNs){this.cache.requester(AccessCandidate.clone(ac)).delete(`vectorDB:pinecone:namespace:${preparedNs}:acl`)}constructNsName(candidate,name){const joinedName=name.trim().replace(/\s/g,"_").toLowerCase();let prefix=candidate.role[0]+"_"+candidate.id;return`${"c"+crypto$1.createHash("sha256").update(prefix).digest("hex").slice(0,8)}_${joinedName}`}}__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"createNamespace"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"namespaceExists"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"deleteNamespace"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"search"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"insert"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"delete"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"createDatasource"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"deleteDatasource"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"listDatasources"),__decorateClass$b([SecureConnector.AccessControl],MilvusVectorDB.prototype,"getDatasource");var __defProp$l=Object.defineProperty,__getOwnPropDesc$a=Object.getOwnPropertyDescriptor,__defNormalProp$l=(obj,key,value)=>key in obj?__defProp$l(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$a=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$a(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$l(target,key,result),result},__publicField$l=(obj,key,value)=>__defNormalProp$l(obj,typeof key!="symbol"?key+"":key,value);Logger("RAM VectorDB");const _RAMVectorDB=class _RAMVectorDB2 extends VectorDBConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$l(this,"name","RAMVec"),__publicField$l(this,"id","ram"),__publicField$l(this,"accountConnector"),__publicField$l(this,"embedder"),this.accountConnector=ConnectorService.getAccountConnector(),_settings.embeddings||(_settings.embeddings={provider:"OpenAI",model:"text-embedding-3-large",dimensions:3072}),_settings.embeddings.dimensions||(_settings.embeddings.dimensions=3072),this.embedder=EmbeddingsFactory.create(_settings.embeddings.provider,_settings.embeddings)}async getResourceACL(resourceId,candidate){const preparedNs=this.constructNsName(candidate,resourceId),acl=_RAMVectorDB2.acls[preparedNs];return acl?ACL.from(acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async createNamespace(acRequest,namespace,metadata){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(!_RAMVectorDB2.namespaces[preparedNs]){const nsData={namespace:preparedNs,displayName:namespace,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,metadata:{...metadata,storageType:"RAM"}};_RAMVectorDB2.namespaces[preparedNs]=nsData,_RAMVectorDB2.vectors[preparedNs]=[],_RAMVectorDB2.datasources[preparedNs]={}}const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL;return _RAMVectorDB2.acls[preparedNs]=acl,new Promise(resolve=>resolve())}async namespaceExists(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace);return!!_RAMVectorDB2.namespaces[preparedNs]}async getNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace),nsData=_RAMVectorDB2.namespaces[preparedNs];if(!nsData)throw new Error(`Namespace ${namespace} not found`);return nsData}async listNamespaces(acRequest){return Object.values(_RAMVectorDB2.namespaces).filter(ns=>ns.candidateId===acRequest.candidate.id)}async deleteNamespace(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace);delete _RAMVectorDB2.vectors[preparedNs],delete _RAMVectorDB2.namespaces[preparedNs],delete _RAMVectorDB2.datasources[preparedNs],delete _RAMVectorDB2.acls[preparedNs]}async search(acRequest,namespace,query,options={}){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(!_RAMVectorDB2.namespaces[preparedNs])throw new Error("Namespace does not exist");let queryVector=query;typeof query=="string"&&(queryVector=await this.embedder.embedText(query,acRequest.candidate));const namespaceData=_RAMVectorDB2.vectors[preparedNs]||[],results=[];for(const vector of namespaceData){const similarity=this.cosineSimilarity(queryVector,vector.values);let userMetadata;if(options.includeMetadata)if(vector.metadata?.[this.USER_METADATA_KEY])try{userMetadata=JSON.parse(vector.metadata[this.USER_METADATA_KEY])}catch{userMetadata=vector.metadata[this.USER_METADATA_KEY]}else userMetadata={};results.push({id:vector.id,score:similarity,values:vector.values,text:vector.metadata?.text,metadata:options.includeMetadata?userMetadata:void 0})}const topK=options.topK||10;return results.sort((a,b)=>b.score-a.score).slice(0,topK)}async insert(acRequest,namespace,sourceWrapper){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(sourceWrapper=Array.isArray(sourceWrapper)?sourceWrapper:[sourceWrapper],sourceWrapper.some(s=>this.embedder.detectSourceType(s.source)!==this.embedder.detectSourceType(sourceWrapper[0].source)))throw new Error("All sources must be of the same type");const sourceType=this.embedder.detectSourceType(sourceWrapper[0].source);if(sourceType==="unknown"||sourceType==="url")throw new Error("Invalid source type");const transformedSource=await this.embedder.transformSource(sourceWrapper,sourceType,acRequest.candidate);_RAMVectorDB2.vectors[preparedNs]||(_RAMVectorDB2.vectors[preparedNs]=[]);const insertedIds=[];for(const source of transformedSource){const vectorData={id:source.id,values:source.source,datasource:source.metadata?.datasourceId||"unknown",metadata:source.metadata},existingIndex=_RAMVectorDB2.vectors[preparedNs].findIndex(v=>v.id===source.id);existingIndex>=0?_RAMVectorDB2.vectors[preparedNs][existingIndex]=vectorData:_RAMVectorDB2.vectors[preparedNs].push(vectorData);const{text,acl,user_metadata,...restMetadata}=source.metadata||{};insertedIds.push({id:source.id,values:source.source,text,metadata:{...restMetadata,...typeof user_metadata=="string"?JSON.parse(user_metadata):user_metadata}})}return insertedIds}async delete(acRequest,namespace,deleteTarget){const preparedNs=this.constructNsName(acRequest.candidate,namespace);if(typeof deleteTarget=="object"&&!Array.isArray(deleteTarget))if("datasourceId"in deleteTarget&&deleteTarget.datasourceId)_RAMVectorDB2.vectors[preparedNs]&&(_RAMVectorDB2.vectors[preparedNs]=_RAMVectorDB2.vectors[preparedNs].filter(vector=>vector.datasource!==deleteTarget.datasourceId));else throw new Error("Unsupported delete filter");else{const ids=Array.isArray(deleteTarget)?deleteTarget:[deleteTarget];_RAMVectorDB2.vectors[preparedNs]&&(_RAMVectorDB2.vectors[preparedNs]=_RAMVectorDB2.vectors[preparedNs].filter(vector=>!ids.includes(vector.id)))}}async createDatasource(acRequest,namespace,datasource){const acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner),dsId=datasource.id||crypto$1.randomUUID(),formattedNs=this.constructNsName(acRequest.candidate,namespace),chunkedText=this.embedder.chunkText(datasource.text,{chunkSize:datasource.chunkSize,chunkOverlap:datasource.chunkOverlap}),label=datasource.label||"Untitled",ids=Array.from({length:chunkedText.length},(_,i)=>`${dsId}_${crypto$1.randomUUID()}`),source=chunkedText.map((doc,i)=>({id:ids[i],source:doc,metadata:{acl:acl.serializedACL,namespaceId:formattedNs,datasourceId:dsId,datasourceLabel:label,[this.USER_METADATA_KEY]:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0}})),_vIds=await this.insert(acRequest,namespace,source),dsData={namespaceId:formattedNs,candidateId:acRequest.candidate.id,candidateRole:acRequest.candidate.role,name:datasource.label||"Untitled",metadata:datasource.metadata?jsonrepair(JSON.stringify(datasource.metadata)):void 0,text:datasource.text,vectorIds:_vIds.map(v=>v.id),id:dsId};return datasource.returnFullVectorInfo&&(dsData.vectorInfo=_vIds),_RAMVectorDB2.datasources[formattedNs]||(_RAMVectorDB2.datasources[formattedNs]={}),_RAMVectorDB2.datasources[formattedNs][dsId]=dsData,dsData}async deleteDatasource(acRequest,namespace,datasourceId){const formattedNs=this.constructNsName(acRequest.candidate,namespace);await this.delete(acRequest,namespace,{datasourceId}),_RAMVectorDB2.datasources[formattedNs]&&_RAMVectorDB2.datasources[formattedNs][datasourceId]&&delete _RAMVectorDB2.datasources[formattedNs][datasourceId]}async listDatasources(acRequest,namespace){const preparedNs=this.constructNsName(acRequest.candidate,namespace),namespaceDatasources=_RAMVectorDB2.datasources[preparedNs]||{};return Object.values(namespaceDatasources)}async getDatasource(acRequest,namespace,datasourceId){const preparedNs=this.constructNsName(acRequest.candidate,namespace);return _RAMVectorDB2.datasources[preparedNs]?.[datasourceId]}cosineSimilarity(vecA,vecB){if(vecA.length!==vecB.length)throw new Error("Vectors must have the same length");let dotProduct=0,normA=0,normB=0;for(let i=0;i<vecA.length;i++)dotProduct+=vecA[i]*vecB[i],normA+=vecA[i]*vecA[i],normB+=vecB[i]*vecB[i];return normA=Math.sqrt(normA),normB=Math.sqrt(normB),normA===0||normB===0?0:dotProduct/(normA*normB)}};__publicField$l(_RAMVectorDB,"vectors",{}),__publicField$l(_RAMVectorDB,"namespaces",{}),__publicField$l(_RAMVectorDB,"datasources",{}),__publicField$l(_RAMVectorDB,"acls",{}),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"createNamespace"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"namespaceExists"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"getNamespace"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"listNamespaces"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"deleteNamespace"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"search"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"insert"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"delete"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"createDatasource"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"deleteDatasource"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"listDatasources"),__decorateClass$a([SecureConnector.AccessControl],_RAMVectorDB.prototype,"getDatasource");let RAMVectorDB=_RAMVectorDB;class VectorDBService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.VectorDB,"Pinecone",PineconeVectorDB),ConnectorService.register(TConnectorService.VectorDB,"RAMVec",RAMVectorDB),ConnectorService.register(TConnectorService.VectorDB,"Milvus",MilvusVectorDB)}}var __defProp$k=Object.defineProperty,__defNormalProp$k=(obj,key,value)=>key in obj?__defProp$k(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$k=(obj,key,value)=>__defNormalProp$k(obj,typeof key!="symbol"?key+"":key,value);class CLIConnector extends Connector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$k(this,"name","CLI"),__publicField$k(this,"params"),this.params=this.parse(process.argv)}parse(argv,args){let _keys=args;_keys&&!Array.isArray(_keys)&&(_keys=[_keys]);const argsList=_keys||getMainArgs(argv);return parseCLIArgs(argsList,argv)}get(args){let _keys=args;Array.isArray(_keys)||(_keys=[_keys]);const result={};return _keys.forEach(key=>{this.params[key]&&(result[key]=this.params[key])}),result}}class CLIService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.CLI,"CLI",CLIConnector)}}class NKVConnector extends SecureConnector{requester(candidate){return{get:async(namespace,key)=>this.get(candidate.readRequest,namespace,key),set:async(namespace,key,value)=>this.set(candidate.writeRequest,namespace,key,value),delete:async(namespace,key)=>this.delete(candidate.writeRequest,namespace,key),exists:async(namespace,key)=>this.exists(candidate.readRequest,namespace,key),deleteAll:async namespace=>this.deleteAll(candidate.writeRequest,namespace),list:async namespace=>this.list(candidate.readRequest,namespace)}}}var __defProp$j=Object.defineProperty,__getOwnPropDesc$9=Object.getOwnPropertyDescriptor,__defNormalProp$j=(obj,key,value)=>key in obj?__defProp$j(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$9=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$9(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$j(target,key,result),result},__publicField$j=(obj,key,value)=>__defNormalProp$j(obj,typeof key!="symbol"?key+"":key,value);const _NKVRedis=class extends NKVConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$j(this,"name","Redis"),__publicField$j(this,"redisCacheConnector"),__publicField$j(this,"accountConnector"),this.redisCacheConnector=ConnectorService.getCacheConnector("Redis"),this.accountConnector=ConnectorService.getAccountConnector()}key(...parts){return parts.join(":")}mdKey(...parts){return parts.join(":")}async get(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);return await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).get(this.key(`team_${teamId}`,namespace,key))}async set(acRequest,namespace,key,value){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),setKey=this.key(`team_${teamId}`,namespace,key);await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).set(setKey,value),!await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).exists(namespace)&&await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).set(this.key(`team_${teamId}`,namespace),"",void 0,{ns:!0})}async delete(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).delete(this.key(`team_${teamId}`,namespace,key))}async exists(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);return await this.redisCacheConnector.requester(AccessCandidate.team(teamId)).exists(this.key(`team_${teamId}`,namespace,key))}async list(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);let keys=await this.fetchKeysByPrefix(this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace));if(keys=keys.filter(key=>key!==this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace)),keys.length<=0)return[];const pipeline=this.redisCacheConnector.client.pipeline();keys.forEach(key=>{pipeline.get(key)});const results=await pipeline.exec();return keys.map((key,index)=>({key:key.replace(`${this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace)}:`,""),data:results[index][1]}))}async deleteAll(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate);let keys=await this.fetchKeysByPrefix(this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace));keys=keys.filter(key=>![this.key(this.redisCacheConnector.prefix,`team_${teamId}`,namespace)].includes(key)),keys.length>0&&await this.redisCacheConnector.client.del(keys)}async getResourceACL(resourceId,candidate){return this.redisCacheConnector.getResourceACL(resourceId,candidate)}async fetchKeysByPrefix(prefix){let cursor="0";const keys=[];do{const result=await this.redisCacheConnector.client.scan(cursor,"MATCH",`${prefix}*`,"COUNT",1e4);cursor=result[0],keys.push(...result[1])}while(cursor!=="0");return keys}static NamespaceAccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const isNamespaceSearch=key===void 0,teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),resourceId=isNamespaceSearch?namespace:`${namespace}:${key}`,finalKey=this.key(this.redisCacheConnector.prefix,`team_${teamId}`,resourceId);if((await this.getAccessTicket(finalKey,acRequest)).access!==TAccessResult.Granted)throw new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}static Validate(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const validationResult=Joi.object().keys({namespace:Joi.string().min(1).required(),key:Joi.string().min(1).required()}).validate({namespace,key});if(validationResult.error)throw new Error(`Validation Error: ${validationResult.error.message}`);return originalMethod.apply(this,args)},descriptor}};__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"get"),__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"set"),__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"delete"),__decorateClass$9([_NKVRedis.Validate,_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"exists"),__decorateClass$9([_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"list"),__decorateClass$9([_NKVRedis.NamespaceAccessControl],_NKVRedis.prototype,"deleteAll");let NKVRedis=_NKVRedis;var __defProp$i=Object.defineProperty,__getOwnPropDesc$8=Object.getOwnPropertyDescriptor,__defNormalProp$i=(obj,key,value)=>key in obj?__defProp$i(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$8=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$8(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$i(target,key,result),result},__publicField$i=(obj,key,value)=>__defNormalProp$i(obj,typeof key!="symbol"?key+"":key,value);const _NKVRAM=class extends NKVConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$i(this,"name","NKVRAM"),__publicField$i(this,"storage",new Map),__publicField$i(this,"namespaces",new Set),__publicField$i(this,"accountConnector"),__publicField$i(this,"cacheConnector"),this.accountConnector=ConnectorService.getAccountConnector(),this.cacheConnector=ConnectorService.getCacheConnector("RAM")}key(...parts){return parts.join(":")}mdKey(...parts){return parts.join(":")}async get(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);return this.storage.get(storageKey)||null}async set(acRequest,namespace,key,value){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);this.storage.set(storageKey,value);const nsKey=this.key(`team_${teamId}`,namespace);this.namespaces.has(nsKey)||(this.namespaces.add(nsKey),this.storage.set(nsKey,""))}async delete(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);this.storage.delete(storageKey)}async exists(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),storageKey=this.key(`team_${teamId}`,namespace,key);return this.storage.has(storageKey)}async list(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),prefix=this.key(`team_${teamId}`,namespace),results=[];for(const[storageKey,value]of this.storage.entries())if(storageKey.startsWith(prefix+":")){const actualKey=storageKey.substring(prefix.length+1);results.push({key:actualKey,data:value})}return results}async deleteAll(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),prefix=this.key(`team_${teamId}`,namespace),keysToDelete=[];for(const storageKey of this.storage.keys())storageKey.startsWith(prefix+":")&&keysToDelete.push(storageKey);for(const key of keysToDelete)this.storage.delete(key)}async getResourceACL(resourceId,candidate){return this.cacheConnector.getResourceACL(resourceId,candidate)}getKeysByPrefix(prefix){const keys=[];for(const key of this.storage.keys())key.startsWith(prefix)&&keys.push(key);return keys}clearAll(){this.storage.clear(),this.namespaces.clear()}getStats(){return{totalKeys:this.storage.size,totalNamespaces:this.namespaces.size}}static NamespaceAccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const isNamespaceSearch=key===void 0,teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),resourceId=isNamespaceSearch?namespace:`${namespace}:${key}`,finalKey=this.key(`team_${teamId}`,resourceId);if((await this.getAccessTicket(finalKey,acRequest)).access!==TAccessResult.Granted)throw new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}static Validate(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const validationResult=Joi.object().keys({namespace:Joi.string().min(1).required(),key:Joi.string().min(1).required()}).validate({namespace,key});if(validationResult.error)throw new Error(`Validation Error: ${validationResult.error.message}`);return originalMethod.apply(this,args)},descriptor}};__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"get"),__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"set"),__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"delete"),__decorateClass$8([_NKVRAM.Validate,_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"exists"),__decorateClass$8([_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"list"),__decorateClass$8([_NKVRAM.NamespaceAccessControl],_NKVRAM.prototype,"deleteAll");let NKVRAM=_NKVRAM;var __defProp$h=Object.defineProperty,__getOwnPropDesc$7=Object.getOwnPropertyDescriptor,__defNormalProp$h=(obj,key,value)=>key in obj?__defProp$h(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$7=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$7(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$h(target,key,result),result},__publicField$h=(obj,key,value)=>__defNormalProp$h(obj,typeof key!="symbol"?key+"":key,value);const console$8=Logger("NKVLocalStorage"),_NKVLocalStorage=class extends NKVConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$h(this,"name","NKVLocalStorage"),__publicField$h(this,"folder"),__publicField$h(this,"accountConnector"),__publicField$h(this,"cacheConnector"),__publicField$h(this,"isInitialized",!1),this.accountConnector=ConnectorService.getAccountConnector(),this.cacheConnector=ConnectorService.getCacheConnector("RAM"),this.folder=this.findStorageFolder(_settings?.folder),this.initialize()}findStorageFolder(folder){let _storageFolder=folder;return _storageFolder&&fs__default.existsSync(_storageFolder)?_storageFolder:(_storageFolder=findSmythPath("nkv"),fs__default.existsSync(_storageFolder)?(console$8.warn("Using alternative storage folder found in : ",_storageFolder),_storageFolder):(console$8.warn("!!! All attempts to find an existing storage folder failed !!!"),console$8.warn("!!! I will use this folder: ",_storageFolder),_storageFolder))}initialize(){this.isInitialized||(fs__default.existsSync(this.folder)||fs__default.mkdirSync(this.folder,{recursive:!0}),this.isInitialized=!0)}normalizeFilename(filename){let normalized=filename.replace(/:+/g,":");return normalized=normalized.replace(/:/g,"/"),normalized=normalized.replace(/[<>:"|?*\\\x00-\x1f\x7f]/g,"."),normalized=normalized.replace(/^[.\s]+|[.\s]+$/g,""),normalized=normalized.replace(/\/+/g,"/").replace(/\/\./g,"/").replace(/\.\//g,"./"),normalized||"default"}getStoragePath(teamId,namespace,key){const parts=[`team_${this.normalizeFilename(teamId)}`,this.normalizeFilename(namespace)];return key&&parts.push(this.normalizeFilename(key)),path.join(this.folder,...parts)}key(...parts){return parts.join(":")}async get(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key);if(!fs__default.existsSync(filePath))return null;try{const data=fs__default.readFileSync(filePath,"utf-8");return JSON.parse(data)}catch(error){return console$8.error(`Error reading from NKVLocalStorage: ${error.message}`),null}}async set(acRequest,namespace,key,value){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key),dirPath=path.dirname(filePath);fs__default.existsSync(dirPath)||fs__default.mkdirSync(dirPath,{recursive:!0}),fs__default.writeFileSync(filePath,JSON.stringify(value))}async delete(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key);fs__default.existsSync(filePath)&&fs__default.unlinkSync(filePath)}async exists(acRequest,namespace,key){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),filePath=this.getStoragePath(teamId,namespace,key);return fs__default.existsSync(filePath)}async list(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),namespacePath=this.getStoragePath(teamId,namespace),results=[];if(!fs__default.existsSync(namespacePath))return results;const files=fs__default.readdirSync(namespacePath);for(const file of files){const filePath=path.join(namespacePath,file);if(fs__default.statSync(filePath).isFile()){const data=fs__default.readFileSync(filePath,"utf-8");results.push({key:file,data:JSON.parse(data)})}}return results}async deleteAll(acRequest,namespace){const teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),namespacePath=this.getStoragePath(teamId,namespace);fs__default.existsSync(namespacePath)&&fs__default.rmSync(namespacePath,{recursive:!0,force:!0})}async getResourceACL(resourceId,candidate){return this.cacheConnector.getResourceACL(resourceId,candidate)}clearAll(){fs__default.existsSync(this.folder)&&(fs__default.rmSync(this.folder,{recursive:!0,force:!0}),this.initialize())}static NamespaceAccessControl(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const isNamespaceSearch=key===void 0,teamId=await this.accountConnector.getCandidateTeam(acRequest.candidate),resourceId=isNamespaceSearch?namespace:`${namespace}:${key}`,finalKey=this.key(`team_${teamId}`,resourceId);if((await this.getAccessTicket(finalKey,acRequest)).access!==TAccessResult.Granted)throw new ACLAccessDeniedError("Access Denied");return originalMethod.apply(this,args)},descriptor}static Validate(target,propertyKey,descriptor){const originalMethod=descriptor.value;return descriptor.value=async function(...args){let[acRequest,namespace,key]=args;const validationResult=Joi.object().keys({namespace:Joi.string().min(1).required(),key:Joi.string().min(1).required()}).validate({namespace,key});if(validationResult.error)throw new Error(`Validation Error: ${validationResult.error.message}`);return originalMethod.apply(this,args)},descriptor}};__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"get"),__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"set"),__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"delete"),__decorateClass$7([_NKVLocalStorage.Validate,_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"exists"),__decorateClass$7([_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"list"),__decorateClass$7([_NKVLocalStorage.NamespaceAccessControl],_NKVLocalStorage.prototype,"deleteAll");let NKVLocalStorage=_NKVLocalStorage;class NKVService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.NKV,"Redis",NKVRedis),ConnectorService.register(TConnectorService.NKV,"RAM",NKVRAM),ConnectorService.register(TConnectorService.NKV,"LocalStorage",NKVLocalStorage)}}class RouterConnector extends Connector{}var __defProp$g=Object.defineProperty,__defNormalProp$g=(obj,key,value)=>key in obj?__defProp$g(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$g=(obj,key,value)=>__defNormalProp$g(obj,typeof key!="symbol"?key+"":key,value);class ExpressRouter extends RouterConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$g(this,"router"),__publicField$g(this,"baseUrl"),this.name="ExpressRouter",this.router=_settings.router,this.baseUrl=_settings.baseUrl}get(path2,...handlers){return this.router.get(path2,...handlers),this}post(path2,...handlers){return this.router.post(path2,...handlers),this}put(path2,...handlers){return this.router.put(path2,...handlers),this}delete(path2,...handlers){return this.router.delete(path2,...handlers),this}useFn(...handlers){return this.router.use(...handlers),this}use(path2,...handlers){return this.router.use(path2,...handlers),this}getRouter(){return this.router}}var __defProp$f=Object.defineProperty,__defNormalProp$f=(obj,key,value)=>key in obj?__defProp$f(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$f=(obj,key,value)=>__defNormalProp$f(obj,key+"",value);const console$7=Logger("NullRouter");class NullRouter extends RouterConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$f(this,"baseUrl"),this.baseUrl="http://nullrouter.local"}get(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.get: ${path2}`),this}post(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.post: ${path2}`),this}put(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.put: ${path2}`),this}delete(path2,...handlers){return console$7.debug(`Ignored operation:NullRouter.delete: ${path2}`),this}useFn(...handlers){return console$7.debug("Ignored operation:NullRouter.useFn"),this}use(path2,...handlers){return this}}class RouterService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Router,"ExpressRouter",ExpressRouter),ConnectorService.register(TConnectorService.Router,"NullRouter",NullRouter)}}class ManagedVaultConnector extends SecureConnector{constructor(_settings){super(_settings),this._settings=_settings}requester(candidate){return{get:async keyId=>this.get(candidate.readRequest,keyId),set:async(keyId,value)=>this.set(candidate.writeRequest,keyId,value),delete:async keyId=>this.delete(candidate.writeRequest,keyId),exists:async keyId=>this.exists(candidate.readRequest,keyId)}}}var __defProp$e=Object.defineProperty,__getOwnPropDesc$6=Object.getOwnPropertyDescriptor,__defNormalProp$e=(obj,key,value)=>key in obj?__defProp$e(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$6=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$6(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$e(target,key,result),result},__publicField$e=(obj,key,value)=>__defNormalProp$e(obj,typeof key!="symbol"?key+"":key,value);const DELETION_MARKER_ERROR_MESSAGE="You can't create this secret because a secret with this name is already scheduled for deletion.",console$6=Logger("SecretManagerManagedVault");class SecretManagerManagedVault extends ManagedVaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$e(this,"name","SecretManagerManagedVault"),__publicField$e(this,"scope","smyth-managed-vault"),__publicField$e(this,"secretsManager"),__publicField$e(this,"prefix"),this.prefix=_settings.prefix||"",this.secretsManager=new SecretsManagerClient({region:_settings.region,..._settings.awsAccessKeyId&&_settings.awsSecretAccessKey?{accessKeyId:_settings.awsAccessKeyId,secretAccessKey:_settings.awsSecretAccessKey}:{}})}async get(acRequest,secretName){try{return(await this.getSecretByName(acRequest,secretName))?.value}catch(error){return console$6.error(error),null}}async set(acRequest,secretName,value){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),secret=await this.getSecretByName(acRequest,secretName);if(secret)await this.secretsManager.send(new PutSecretValueCommand({SecretId:secret.secretId,SecretString:value}));else{const vaultKey=this.getVaultKey(secretName,teamId);try{await this.secretsManager.send(new CreateSecretCommand({Name:vaultKey,Description:"Smyth Managed Vault Secret",SecretString:JSON.stringify({[secretName]:value}),Tags:[{Key:this.scope,Value:"true"}]}))}catch(error){if(console$6.warn(error.message),error.message===DELETION_MARKER_ERROR_MESSAGE)(await this.secretsManager.send(new DescribeSecretCommand({SecretId:vaultKey}))).DeletedDate?(console$6.debug(`Secret ${vaultKey} is pending deletion, restoring...`),await this.secretsManager.send(new RestoreSecretCommand({SecretId:vaultKey}))):console$6.debug(`Secret ${vaultKey} already exists, updating value...`),await this.secretsManager.send(new PutSecretValueCommand({SecretId:vaultKey,SecretString:JSON.stringify({[secretName]:value})}));else throw error}}}async delete(acRequest,secretName){const secret=await this.getSecretByName(acRequest,secretName);secret&&await this.secretsManager.send(new DeleteSecretCommand({SecretId:secret.secretId,RecoveryWindowInDays:7}))}async exists(acRequest,secretName){return!!await this.get(acRequest,secretName)}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),acl}async getSecretByName(acRequest,secretName){try{const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(acRequest.candidate),vaultKey=this.getVaultKey(secretName,teamId);let secret=null;try{(await this.secretsManager.send(new DescribeSecretCommand({SecretId:vaultKey}))).DeletedDate?secret=null:secret=await this.secretsManager.send(new GetSecretValueCommand({SecretId:vaultKey}))}catch{secret=null,console$6.warn("Secret not found by Id, trying to get it by name")}if(secret)return this.getFormattedSecret(secret);const secrets=[];let nextToken,listingVaultKey=this.getVaultKey("",teamId);do{const listResponse=await this.secretsManager.send(new ListSecretsCommand({NextToken:nextToken,Filters:[{Key:"tag-key",Values:[this.scope]},{Key:"name",Values:[listingVaultKey]}]}));if(listResponse.SecretList)for(const secret2 of listResponse.SecretList)secret2.Name&&secrets.push({ARN:secret2.ARN,Name:secret2.Name});nextToken=listResponse.NextToken}while(nextToken);const $promises=[];for(const secret2 of secrets)$promises.push(getSpecificSecret(secret2,this.secretsManager));return(await Promise.all($promises)).find(s=>s.key===secretName)}catch(error){console$6.error(error)}async function getSpecificSecret(secret,secretsManager){const data=await secretsManager.send(new GetSecretValueCommand({SecretId:secret.ARN}));return this.getFormattedSecret(data)}}getVaultKey(secretName,teamId){return`${this.prefix.length?`${this.prefix}/`:""}${teamId}/${secretName}`}getFormattedSecret(secret){let secretString=secret.SecretString,secretName=secret.Name;if(secretString)try{let parsedSecret=JSON.parse(secretString);Object.keys(parsedSecret).length===1&&(secretName=Object.keys(parsedSecret)[0],secretString=parsedSecret[secretName])}catch{}return{secretId:secret.Name,key:secretName,value:secretString}}}__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"get"),__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"set"),__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"delete"),__decorateClass$6([SecureConnector.AccessControl],SecretManagerManagedVault.prototype,"exists");var __defProp$d=Object.defineProperty,__getOwnPropDesc$5=Object.getOwnPropertyDescriptor,__defNormalProp$d=(obj,key,value)=>key in obj?__defProp$d(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$5=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$5(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$d(target,key,result),result},__publicField$d=(obj,key,value)=>__defNormalProp$d(obj,key+"",value);const console$5=Logger("NullManagedVault");class NullManagedVault extends ManagedVaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$d(this,"name","NullManagedVault")}async get(acRequest,keyId){console$5.debug(`Ignored operation:NullManagedVault.get: ${keyId}`)}async set(acRequest,keyId,value){console$5.debug(`Ignored operation:NullManagedVault.set: ${keyId} = ${value}`)}async delete(acRequest,keyId){console$5.debug(`Ignored operation:NullManagedVault.delete: ${keyId}`)}async exists(acRequest,keyId){return console$5.debug(`Ignored operation:NullManagedVault.exists: ${keyId}`),!1}async getResourceACL(resourceId,candidate){await ConnectorService.getAccountConnector().getCandidateTeam(candidate);const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"get"),__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"set"),__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"delete"),__decorateClass$5([SecureConnector.AccessControl],NullManagedVault.prototype,"exists");class ManagedVaultService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.ManagedVault,"SecretManagerManagedVault",SecretManagerManagedVault),ConnectorService.register(TConnectorService.ManagedVault,"NullManagedVault",NullManagedVault)}}class LogConnector extends SecureConnector{constructor(){super()}requester(candidate){if(candidate.role!=="agent")throw new Error("Only agents can use Log connector");return{log:async(logData,callId)=>await this.log(candidate.writeRequest,logData,callId),logTask:async(tasks,isUsingTestDomain)=>{await this.logTask(candidate.writeRequest,tasks,isUsingTestDomain)}}}}var __defProp$c=Object.defineProperty,__defNormalProp$c=(obj,key,value)=>key in obj?__defProp$c(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$c=(obj,key,value)=>__defNormalProp$c(obj,typeof key!="symbol"?key+"":key,value);const logger$4=Logger("SmythLog");class ConsoleLog extends LogConnector{constructor(){super(...arguments),__publicField$c(this,"name","ConsoleLog"),__publicField$c(this,"id")}getResourceACL(resourceId,candidate){return Promise.resolve(new ACL)}log(acRequest,logData,callId){return logger$4.debug(`Log for agent ${acRequest.candidate.id}: ${typeof logData=="string"?logData:JSON.stringify(logData)}`),Promise.resolve()}logTask(acRequest,tasks,isUsingTestDomain){return logger$4.debug(`${tasks} Task(s) Consumed by agent ${acRequest.candidate.id}: ${isUsingTestDomain?"Using Test Domain":"Using Production Domain"}`),Promise.resolve()}}class LogService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Log,"ConsoleLog",ConsoleLog)}}class ComponentConnector extends SecureConnector{requester(candidate){return{register:async(componentName,componentInstance)=>await this.register(candidate.readRequest,componentName,componentInstance),get:async componentName=>await this.get(candidate.readRequest,componentName),getAll:async()=>await this.getAll(candidate.readRequest)}}}var __defProp$b=Object.defineProperty,__getOwnPropDesc$4=Object.getOwnPropertyDescriptor,__defNormalProp$b=(obj,key,value)=>key in obj?__defProp$b(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$4=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$4(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$b(target,key,result),result},__publicField$b=(obj,key,value)=>__defNormalProp$b(obj,typeof key!="symbol"?key+"":key,value);const console$4=Logger("LocalComponentConnector");class LocalComponentConnector extends ComponentConnector{constructor(){super(),__publicField$b(this,"name","LocalComponentConnector"),__publicField$b(this,"components",{}),this.init()}async init(){for(const component in ComponentInstances)this.components[component]=ComponentInstances[component];console$4.debug("Registering Components :",Object.keys(this.components).join(", "))}async register(acRequest,componentName,componentInstance){this.components[componentName]=componentInstance}async get(acRequest,componentName){return this.components[componentName]}async getAll(acRequest){return this.components}async getResourceACL(resourceId,candidate){ConnectorService.getAccountConnector();const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}__decorateClass$4([SecureConnector.AccessControl],LocalComponentConnector.prototype,"register"),__decorateClass$4([SecureConnector.AccessControl],LocalComponentConnector.prototype,"get"),__decorateClass$4([SecureConnector.AccessControl],LocalComponentConnector.prototype,"getAll");class ComponentService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Component,"LocalComponent",LocalComponentConnector)}}const models={Echo:{llm:"Echo",provider:"Echo"},"deepseek-v2.5":{llm:"DeepSeek",label:"DeepSeek Chat",modelId:"deepseek-chat",provider:"DeepSeek",features:["text","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},baseURL:"https://api.deepseek.com/beta",credentials:"vault"},"deepseek-chat":{llm:"DeepSeek",baseURL:"https://api.deepseek.com/beta",tokens:128e3,completionTokens:8192,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192},credentials:"vault"},"gpt-4o-mini":{llm:"OpenAI",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GPTPlugin","GenAILLM"],label:"GPT 4o Mini",modelId:"gpt-4o-mini",provider:"OpenAI",features:["text","tools","image","search"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16383,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4.1-nano":{llm:"OpenAI",label:"GPT 4.1 Nano",modelId:"gpt-4.1-nano",provider:"OpenAI",features:["text","tools","image"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1047576,completionTokens:32768,enabled:!0},credentials:"vault"},"gpt-4.1-mini":{llm:"OpenAI",label:"GPT 4.1 Mini",modelId:"gpt-4.1-mini",provider:"OpenAI",features:["text","tools","image","search"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1047576,completionTokens:32768,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4.1":{llm:"OpenAI",label:"GPT 4.1",modelId:"gpt-4.1",provider:"OpenAI",features:["text","tools","image","search"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1047576,completionTokens:32768,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4o-mini-2024-07-18":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16383,enabled:!0},credentials:"vault"},"gpt-4.5-preview":{llm:"OpenAI",label:"GPT 4.5 Preview",modelId:"gpt-4.5-preview",provider:"OpenAI",features:["text","tools","image"],tags:["Personal","Deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"gpt-4o":{llm:"OpenAI",alias:"gpt-4o-2024-08-06",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GPTPlugin","GenAILLM"],label:"GPT 4o",modelId:"gpt-4o-2024-08-06",provider:"OpenAI",features:["text","tools","image","search","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,searchContextTokens:128e3,enabled:!0},credentials:"vault"},"gpt-4o-2024-08-06":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"o4-mini":{llm:"OpenAI",label:"GPT o4 mini",modelId:"o4-mini-2025-04-16",provider:"OpenAI",features:["text","reasoning"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},o3:{llm:"OpenAI",label:"GPT o3",modelId:"o3-2025-04-16",provider:"OpenAI",features:["text","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},"o3-mini":{llm:"OpenAI",alias:"o3-mini-2025-01-31",components:["PromptGenerator","GenAILLM"],label:"GPT o3 mini",modelId:"o3-mini-2025-01-31",provider:"OpenAI",features:["text","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},hidden:!0,credentials:"vault"},"o3-mini-2025-01-31":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},o1:{llm:"OpenAI",alias:"o1-2024-12-17",components:["PromptGenerator","GenAILLM"],label:"GPT o1",modelId:"o1-2024-12-17",provider:"OpenAI",features:["text","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},"o1-2024-12-17":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:1e5,enabled:!0},credentials:"vault"},"o1-mini":{llm:"OpenAI",alias:"o1-mini-2024-09-12",components:["PromptGenerator","GenAILLM"],label:"GPT o1 mini",modelId:"o1-mini-2024-09-12",provider:"OpenAI",features:["text"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:65536,enabled:!0},credentials:"vault"},"o1-mini-2024-09-12":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:65536,enabled:!0},credentials:"vault"},"o1-preview":{llm:"OpenAI",alias:"o1-preview-2024-09-12",components:["PromptGenerator","GenAILLM"],label:"GPT o1 Preview",modelId:"o1-preview-2024-09-12",provider:"OpenAI",features:["text"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},credentials:"vault"},"o1-preview-2024-09-12":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},credentials:"vault"},"gpt-4-turbo-latest":{llm:"OpenAI",alias:"gpt-4-turbo-2024-04-09",components:["PromptGenerator","LLMAssistant","Classifier"],label:"GPT 4 Turbo Latest",modelId:"gpt-4-turbo-2024-04-09",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:4096,enabled:!0},hidden:!0},"gpt-4-turbo":{llm:"OpenAI",alias:"gpt-4-turbo-2024-04-09",components:["PromptGenerator","LLMAssistant","VisionLLM","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 4 Turbo",modelId:"gpt-4-turbo-2024-04-09",provider:"OpenAI",features:["text","tools","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:4096,enabled:!0},hidden:!0},"gpt-4-turbo-2024-04-09":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:128e3,completionTokens:4096,enabled:!0},credentials:"vault"},"gpt-4-latest":{llm:"OpenAI",alias:"gpt-4-0613",components:["PromptGenerator","LLMAssistant"],label:"GPT 4 Latest",modelId:"gpt-4-0613",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},hidden:!0},"gpt-4":{llm:"OpenAI",components:["PromptGenerator","LLMAssistant","Classifier","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 4",modelId:"gpt-4o-2024-08-06",provider:"OpenAI",features:["text","tools"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},hidden:!0},"gpt-4-0613":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,hidden:!0,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"gpt-3.5-turbo-latest":{llm:"OpenAI",alias:"gpt-3.5-turbo-0125",components:["PromptGenerator","LLMAssistant","Classifier","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 3.5 Turbo Latest",modelId:"gpt-3.5-turbo-0125",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:16385,completionTokens:4096,enabled:!0},hidden:!0},"gpt-3.5-turbo":{llm:"OpenAI",alias:"gpt-3.5-turbo-0125",components:["PromptGenerator","LLMAssistant","Classifier","GPTPlugin","AgentPlugin","Chatbot"],label:"GPT 3.5 Turbo",modelId:"gpt-3.5-turbo-0125",provider:"OpenAI",features:["text","tools"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:16385,completionTokens:4096,enabled:!0},hidden:!0},"gpt-3.5-turbo-0125":{llm:"OpenAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:16385,completionTokens:4096,enabled:!0},credentials:"vault"},"text-embedding-ada-002":{label:"OpenAI Embeddings Ada 002",modelId:"text-embedding-ada-002",provider:"OpenAI",features:["embeddings"],tokens:0,completionTokens:0,enabled:!1,credentials:["internal","vault"]},"text-embedding-3-large":{label:"OpenAI Embeddings 3 Large",modelId:"text-embedding-3-large",provider:"OpenAI",features:["embeddings"],tokens:0,completionTokens:0,enabled:!1,credentials:["internal","vault"]},"claude-4-opus":{label:"Claude 4 Opus",modelId:"claude-opus-4-20250514",provider:"Anthropic",features:["text","image","tools","reasoning"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:32e3,maxReasoningTokens:32e3,enabled:!0},credentials:"internal"},"claude-4-sonnet":{label:"Claude 4 Sonnet",modelId:"claude-sonnet-4-20250514",provider:"Anthropic",features:["text","image","tools","reasoning"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:64e3,maxReasoningTokens:32e3,enabled:!0},credentials:"vault"},"claude-3.7-sonnet":{llm:"Anthropic",alias:"claude-3-7-sonnet-20250219",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.7 Sonnet",modelId:"claude-3-7-sonnet-20250219",provider:"Anthropic",features:["text","tools","image","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,maxReasoningTokens:16384,enabled:!0},credentials:"vault"},"claude-3.7-sonnet-thinking":{llm:"Anthropic",alias:"claude-3-7-sonnet-20250219",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.7 Sonnet Thinking",modelId:"claude-3-7-sonnet-20250219",provider:"Anthropic",features:["text","tools","image","reasoning"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:16384,maxReasoningTokens:16384,enabled:!0},hidden:!0,credentials:"vault"},"claude-3.5-haiku":{llm:"Anthropic",alias:"claude-3-5-haiku-latest",components:["PromptGenerator","LLMAssistant","Classifier","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.5 Haiku",modelId:"claude-3-5-haiku-latest",provider:"Anthropic",features:["text","tools"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-5-haiku-latest":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-5-sonnet-latest":{llm:"Anthropic",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.5 Sonnet Latest",modelId:"claude-3-5-sonnet-latest",provider:"Anthropic",features:["text","tools","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3.5-sonnet":{llm:"Anthropic",alias:"claude-3-5-sonnet-20240620",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3.5 Sonnet Stable",modelId:"claude-3-5-sonnet-20240620",provider:"Anthropic",features:["text","tools","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-5-sonnet-20240620":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:8192,enabled:!0},credentials:"vault"},"claude-3-opus":{llm:"Anthropic",alias:"claude-3-opus-20240229",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot","GenAILLM"],label:"Claude 3 Opus",modelId:"claude-3-opus-20240229",provider:"Anthropic",features:["text","tools","image"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-3-opus-20240229":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-3-sonnet":{llm:"Anthropic",alias:"claude-3-sonnet-20240229",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot"],label:"Claude 3 Sonnet",modelId:"claude-3-sonnet-20240229",provider:"Anthropic",features:["text","tools","image"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"claude-3-sonnet-20240229":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-3-haiku":{llm:"Anthropic",alias:"claude-3-haiku-20240307",components:["PromptGenerator","LLMAssistant","Classifier","VisionLLM","AgentPlugin","Chatbot"],label:"Claude 3 Haiku",modelId:"claude-3-haiku-20240307",provider:"Anthropic",features:["text","tools","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"claude-3-haiku-20240307":{llm:"Anthropic",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},credentials:"vault"},"claude-2.1":{llm:"Anthropic",components:["PromptGenerator","LLMAssistant","Classifier"],label:"Claude 2.1",modelId:"claude-2.1",provider:"Anthropic",features:["text","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2e5,completionTokens:4096,enabled:!0},hidden:!0},"claude-instant-1.2":{llm:"Anthropic",components:["PromptGenerator","LLMAssistant","Classifier"],label:"Claude Instant 1.2",modelId:"claude-instant-1.2",provider:"Anthropic",features:["text","image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1e5,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"gemini-2.5-flash":{llm:"GoogleAI",label:"Gemini 2.5 Flash Preview",modelId:"gemini-2.5-flash",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:65536,enabled:!0},credentials:"vault"},"gemini-2.0-flash":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 2.0 Flash",modelId:"gemini-2.0-flash",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-2.0-flash-lite":{llm:"GoogleAI",label:"Gemini 2.0 Flash Lite",modelId:"gemini-2.0-flash-lite",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-2.5-pro":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 2.5 Pro Preview",modelId:"gemini-2.5-pro-preview-03-25",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:65536,enabled:!0},credentials:"vault"},"gemini-2.5-pro-exp":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 2.5 Pro Experimental",modelId:"gemini-2.5-pro-exp-03-25",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["New","Personal"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:65536,enabled:!0},credentials:"vault"},"gemini-1.5-pro-exp-0801":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Pro Experimental",modelId:"gemini-1.5-pro-exp-0801",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-pro-latest-stable":{llm:"GoogleAI",alias:"gemini-1.5-pro",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Pro Latest Stable",modelId:"gemini-1.5-pro",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-pro-latest":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM"],label:"Gemini 1.5 Pro",modelId:"gemini-1.5-pro",provider:"GoogleAI",tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-pro-stable":{llm:"GoogleAI",alias:"gemini-1.5-pro-001",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Pro Stable",modelId:"gemini-1.5-pro",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-pro":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-pro-001":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:2097152,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-flash-latest":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM"],label:"Gemini 1.5 Flash Latest",modelId:"gemini-1.5-flash-latest",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-flash-latest-stable":{llm:"GoogleAI",alias:"gemini-1.5-flash",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM"],label:"Gemini 1.5 Flash Latest Stable",modelId:"gemini-1.5-flash",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.5-flash-stable":{llm:"GoogleAI",alias:"gemini-1.5-flash-001",components:["PromptGenerator","LLMAssistant","VisionLLM","MultimodalLLM","GenAILLM"],label:"Gemini 1.5 Flash Stable",modelId:"gemini-1.5-flash-001",provider:"GoogleAI",features:["text","image","audio","video","document"],tags:["Personal","deprecated"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-flash":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.5-flash-001":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:1048576,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.0-pro-latest":{llm:"GoogleAI",components:["PromptGenerator","LLMAssistant"],label:"Gemini 1.0 Pro Latest",modelId:"gemini-1.0-pro-latest",provider:"GoogleAI",features:["text"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.0-pro-latest-stable":{llm:"GoogleAI",alias:"gemini-1.0-pro",components:["PromptGenerator","LLMAssistant"],label:"Gemini 1.0 Pro Latest Stable",modelId:"gemini-1.0-pro",provider:"GoogleAI",features:["text"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.0-pro-stable":{llm:"GoogleAI",alias:"gemini-1.0-pro-001",components:["PromptGenerator","LLMAssistant"],label:"Gemini 1.0 Pro Stable",modelId:"gemini-1.0-pro-001",provider:"GoogleAI",features:["text"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"gemini-1.0-pro":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-1.0-pro-001":{llm:"GoogleAI",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:30720,completionTokens:8192,enabled:!0},credentials:"vault"},"gemini-pro-vision":{llm:"GoogleAI",components:["VisionLLM"],label:"Gemini Pro Vision",modelId:"gemini-pro-vision",provider:"GoogleAI",features:["image"],tags:["Personal","legacy"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:12288,completionTokens:4096,enabled:!0},hidden:!0,credentials:"vault"},"llama-3.3-70b":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.3 70B",modelId:"llama-3.3-70b-versatile",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},credentials:"vault"},"groq-llama3-70b":{llm:"Groq",alias:"llama3-70b-8192",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 70B",modelId:"llama3-70b-8192",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"llama3-70b-8192":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-llama-3.1-8b-instant":{llm:"Groq",alias:"llama-3.1-8b-instant",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.1 8B",modelId:"llama-3.1-8b-instant",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.1-8b-instant":{llm:"Groq",tokens:8e3,completionTokens:8e3,enabled:!1,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-guard-3-8b":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama Guard 3 8B",modelId:"llama-guard-3-8b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-llama3-8b":{llm:"Groq",alias:"llama3-8b-8192",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 8B",modelId:"llama3-8b-8192",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"llama3-8b-8192":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-gemma2-9b":{llm:"Groq",alias:"gemma2-9b-it",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 9B",modelId:"gemma2-9b-it",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"gemma2-9b-it":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"groq-mixtral-8x7b":{llm:"Groq",alias:"mixtral-8x7b-32768",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - Mixtral 8x7b",modelId:"mixtral-8x7b-32768",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},credentials:"vault"},"mixtral-8x7b-32768":{llm:"Groq",tokens:2048,completionTokens:2048,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},credentials:"vault"},"qwen-qwq-32b":{llm:"Groq",label:"Qwen - QWQ 32b Preview",modelId:"qwen-qwq-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"mistral-saba-24b":{llm:"Groq",label:"Mistral - Saba 24b Preview",modelId:"mistral-saba-24b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"qwen-2.5-coder-32b":{llm:"Groq",label:"Qwen - 2.5 Coder 32b Preview",modelId:"qwen-2.5-coder-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"qwen-2.5-32b":{llm:"Groq",label:"Qwen - 2.5 32b Preview",modelId:"qwen-2.5-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"deepseek-r1-distill-qwen-32b":{llm:"Groq",label:"DeepSeek - R1 Distill Qwen 32b Preview",modelId:"deepseek-r1-distill-qwen-32b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:16384,enabled:!0},credentials:"vault"},"deepseek-r1-distill-llama-70b":{llm:"Groq",label:"DeepSeek - R1 Distill Llama 70b Preview",modelId:"deepseek-r1-distill-llama-70b",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"meta-llama/llama-4-scout-17b-16e-instruct":{llm:"Groq",label:"Meta - Llama 4 Scout 17B 16E Instruct",modelId:"meta-llama/llama-4-scout-17b-16e-instruct",provider:"Groq",features:["text"],tags:["New","Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.3-70b-specdec":{llm:"Groq",label:"Meta - Llama 3.3 70B SpecDec Preview",modelId:"llama-3.3-70b-specdec",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.2-1b-preview":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.2 1B Preview",modelId:"llama-3.2-1b-preview",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.2-3b-preview":{llm:"Groq",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3.2 3B Preview",modelId:"llama-3.2-3b-preview",provider:"Groq",features:["text"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},credentials:"vault"},"llama-3.2-11b-vision-preview":{llm:"Groq",components:["PromptGenerator","LLMAssistant","VisionLLM","GenAILLM"],label:"Meta - Llama 3.2 11B Vision Preview",modelId:"llama-3.2-11b-vision-preview",provider:"Groq",features:["text","image"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"llama-3.2-90b-vision-preview":{llm:"Groq",label:"Meta - Llama 3.2 90b Vision Preview",modelId:"llama-3.2-90b-vision-preview",provider:"Groq",features:["text","image"],tags:["Personal","Groq"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:8192,enabled:!0},hidden:!0,credentials:"vault"},"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B":{llm:"TogetherAI",label:"DeepSeek - R1 Distill Qwen 14B",modelId:"deepseek-ai/DeepSeek-R1-Distill-Qwen-14B",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B":{llm:"TogetherAI",label:"DeepSeek - R1 Distill Qwen 1.5B",modelId:"deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-R1-Distill-Llama-70B":{llm:"TogetherAI",label:"DeepSeek - R1 Distill Llama 70B",modelId:"deepseek-ai/DeepSeek-R1-Distill-Llama-70B",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-R1":{llm:"TogetherAI",label:"DeepSeek - R1",modelId:"deepseek-ai/DeepSeek-R1",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:128e3,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/DeepSeek-V3":{llm:"TogetherAI",label:"DeepSeek - V3",modelId:"deepseek-ai/DeepSeek-V3",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"deepseek-ai/deepseek-llm-67b-chat":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"DeepSeek - Llama 67B Chat",modelId:"deepseek-ai/deepseek-llm-67b-chat",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8":{llm:"TogetherAI",label:"Meta - Llama 4 Maverick (17Bx128E)",modelId:"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",provider:"TogetherAI",features:["text","tools","image"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:524288,completionTokens:524288,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-4-Scout-17B-16E-Instruct":{llm:"TogetherAI",label:"Meta - Llama 4 Scout (17Bx16E)",modelId:"meta-llama/Llama-4-Scout-17B-16E-Instruct",provider:"TogetherAI",features:["text","tools","image"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:327680,completionTokens:327680,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.3-70B-Instruct-Turbo":{llm:"TogetherAI",label:"Meta - Llama 3.3 70B Instruct Turbo",modelId:"meta-llama/Llama-3.3-70B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3.1 8B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3.1 70B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3.1 405B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:130815,completionTokens:130815,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-8B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 8B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3-8B-Instruct-Turbo",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-70B-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 70B Instruct Turbo",modelId:"meta-llama/Meta-Llama-3-70B-Instruct-Turbo",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.2-3B-Instruct-Turbo":{llm:"TogetherAI",label:"Meta - Llama 3.2 3B Instruct Turbo",modelId:"meta-llama/Llama-3.2-3B-Instruct-Turbo",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-8B-Instruct-Lite":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 8B Instruct Lite",modelId:"meta-llama/Meta-Llama-3-8B-Instruct-Lite",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Meta-Llama-3-70B-Instruct-Lite":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","GenAILLM"],label:"Meta - Llama 3 70B Instruct Lite",modelId:"meta-llama/Meta-Llama-3-70B-Instruct-Lite",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3-8b-chat-hf":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 8B Chat",modelId:"meta-llama/Llama-3-8b-chat-hf",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3-70b-chat-hf":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Meta - Llama 3 70B Chat",modelId:"meta-llama/Llama-3-70b-chat-hf",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-2-13b-chat-hf":{llm:"TogetherAI",components:["LLMAssistant"],label:"Meta - Llama 2 13B Chat",modelId:"meta-llama/Llama-2-13b-chat-hf",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-Vision-Free":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","VisionLLM","GenAILLM"],label:"Meta - Llama Vision Free",modelId:"meta-llama/Llama-Vision-Free",provider:"TogetherAI",features:["text","image"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","VisionLLM","GenAILLM"],label:"Meta - Llama 3.2 11B Vision Instruct Turbo",modelId:"meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo",provider:"TogetherAI",features:["text","image"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo":{llm:"TogetherAI",components:["LLMAssistant","PromptGenerator","VisionLLM","GenAILLM"],label:"Meta - Llama 3.2 90B Vision Instruct Turbo",modelId:"meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo",provider:"TogetherAI",features:["text","image"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:131072,completionTokens:131072,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"google/gemma-2-27b-it":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 27B",modelId:"google/gemma-2-27b-it",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"google/gemma-2-9b-it":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 9B",modelId:"google/gemma-2-9b-it",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"google/gemma-2b-it":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Google - Gemma 2 2B",modelId:"google/gemma-2b-it",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mistral-7B-Instruct-v0.3":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","Classifier","GenAILLM"],label:"Mistral - 7B Instruct v0.3",modelId:"mistralai/Mistral-7B-Instruct-v0.3",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mistral-7B-Instruct-v0.2":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - 7B Instruct v0.2",modelId:"mistralai/Mistral-7B-Instruct-v0.2",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mistral-7B-Instruct-v0.1":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - 7B Instruct v0.1",modelId:"mistralai/Mistral-7B-Instruct-v0.1",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:8192,completionTokens:8192,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mixtral-8x7B-Instruct-v0.1":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","Classifier","GenAILLM"],label:"Mistral - 8x7B Instruct v0.1",modelId:"mistralai/Mixtral-8x7B-Instruct-v0.1",provider:"TogetherAI",features:["text","tools"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"mistralai/Mixtral-8x22B-Instruct-v0.1":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Mistral - 8x22B Instruct v0.1",modelId:"mistralai/Mixtral-8x22B-Instruct-v0.1",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:65536,completionTokens:65536,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2.5-Coder-32B-Instruct":{llm:"TogetherAI",label:"Qwen - 2.5 Coder 32B",modelId:"Qwen/Qwen2.5-Coder-32B-Instruct",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/QwQ-32B-Preview":{llm:"TogetherAI",label:"Qwen - QwQ 32B Preview",modelId:"Qwen/QwQ-32B-Preview",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2.5-7B-Instruct-Turbo":{llm:"TogetherAI",label:"Qwen - 2.5 7B Instruct Turbo",modelId:"Qwen/Qwen2.5-7B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2.5-72B-Instruct-Turbo":{llm:"TogetherAI",label:"Qwen - 2.5 72B Instruct Turbo",modelId:"Qwen/Qwen2.5-72B-Instruct-Turbo",provider:"TogetherAI",features:["text","tools"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2-72B-Instruct":{llm:"TogetherAI",label:"Qwen - 2 72B Instruct",modelId:"Qwen/Qwen2-72B-Instruct",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Qwen/Qwen2-VL-72B-Instruct":{llm:"TogetherAI",label:"Qwen - 2 VL 72B Instruct",modelId:"Qwen/Qwen2-VL-72B-Instruct",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF":{llm:"TogetherAI",label:"Nvidia - Llama 3.1 Nemotron 70B",modelId:"nvidia/Llama-3.1-Nemotron-70B-Instruct-HF",provider:"TogetherAI",features:["text"],tags:["New","Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"microsoft/WizardLM-2-8x22B":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Microsoft - WizardLM 2 8x22B",modelId:"microsoft/WizardLM-2-8x22B",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:65536,completionTokens:65536,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"databricks/dbrx-instruct":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Databricks - DBRX Instruct",modelId:"databricks/dbrx-instruct",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"NousResearch - Hermes 2 Mixtral 8x7B DPO",modelId:"NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"upstage/SOLAR-10.7B-Instruct-v1.0":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Upstage - SOLAR 10.7B Instruct v1.0",modelId:"upstage/SOLAR-10.7B-Instruct-v1.0",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"Gryphe/MythoMax-L2-13b":{llm:"TogetherAI",components:["PromptGenerator","LLMAssistant","GenAILLM"],label:"Gryphe - MythoMax L2 13B",modelId:"Gryphe/MythoMax-L2-13b",provider:"TogetherAI",features:["text"],tags:["Personal","TogetherAI"],tokens:0,completionTokens:0,enabled:!1,keyOptions:{tokens:4096,completionTokens:4096,enabled:!0},baseURL:"https://api.together.xyz/v1",credentials:"vault"},"smythos/gpt-image-1":{label:"GPT Image 1",modelId:"gpt-image-1",provider:"OpenAI",features:["image-generation"],tags:["New","SmythOS"],enabled:!0,credentials:"internal"},"gpt-image-1":{label:"GPT Image 1",modelId:"gpt-image-1",provider:"OpenAI",features:["image-generation"],tags:["New","Personal"],enabled:!1,keyOptions:{enabled:!0},credentials:"vault"},"dall-e-3":{label:"DALL\xB7E 3",modelId:"dall-e-3",provider:"OpenAI",features:["image-generation"],tags:["Deprecated"],enabled:!0,credentials:"vault"},"dall-e-2":{label:"DALL\xB7E 2",modelId:"dall-e-2",provider:"OpenAI",features:["image-generation"],tags:["Deprecated"],enabled:!0,credentials:"vault"},"smythos/flux.1-schnell":{label:"FLUX Schnell",modelId:"runware:100@1",provider:"Runware",features:["image-generation","text-to-image","image-to-image"],tags:["SmythOS","1.0"],enabled:!0,credentials:"internal"},"smythos/flux.1-dev":{label:"FLUX Dev",modelId:"runware:101@1",provider:"Runware",features:["image-generation","text-to-image","image-to-image"],tags:["SmythOS","1.0"],enabled:!0,credentials:"internal"},"smythos/face_yolov8n":{label:"Face YOLOv8n",modelId:"runware:35@1",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/face_yolov8s":{label:"Face YOLOv8s",modelId:"runware:35@2",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_full":{label:"MediaPipe Face Full",modelId:"runware:35@6",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_short":{label:"MediaPipe Face Short",modelId:"runware:35@7",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_mesh":{label:"MediaPipe Face Mesh",modelId:"runware:35@8",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Full face detection"],enabled:!0,credentials:"internal"},"smythos/mediapipe_face_mesh_eyes_only":{label:"MediaPipe Face Mesh Eyes Only",modelId:"runware:35@9",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/eyes_mesh_mediapipe":{label:"Eyes Mesh MediaPipe",modelId:"runware:35@15",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/nose_mesh_mediapipe":{label:"Nose Mesh MediaPipe",modelId:"runware:35@13",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/lips_mesh_mediapipe":{label:"Lips Mesh MediaPipe",modelId:"runware:35@14",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/eyes_lips_mesh":{label:"Eyes & Lips Mesh",modelId:"runware:35@10",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/nose_eyes_mesh":{label:"Nose & Eyes Mesh",modelId:"runware:35@11",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0,credentials:"internal"},"smythos/nose_lips_mesh":{label:"Nose & Lips Mesh",modelId:"runware:35@12",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Facial features"],enabled:!0},"smythos/hand_yolov8n":{label:"Hand YOLOv8n",modelId:"runware:35@3",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Other body parts"],enabled:!0},"smythos/person_yolov8n-seg":{label:"Person YOLOv8n-seg",modelId:"runware:35@4",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Other body parts"],enabled:!0},"smythos/person_yolov8s-seg":{label:"Person YOLOv8s-seg",modelId:"runware:35@5",provider:"Runware",features:["image-inpainting"],tags:["SmythOS","Other body parts"],enabled:!0,credentials:"internal"},"flux.1-schnell":{label:"FLUX.1 (Schnell)",modelId:"runware:100@1",provider:"Runware",features:["image-generation"],tags:["SmythOS"],enabled:!1,credentials:"vault"},"flux.1-dev":{label:"FLUX.1 (Dev)",modelId:"runware:101@1",provider:"Runware",features:["image-generation"],tags:["SmythOS"],enabled:!1,credentials:"vault"},grok:{llm:"xAI",label:"Grok",modelId:"grok-2-latest",provider:"xAI",features:["text","tools"],tags:["Personal","xAI"],tokens:0,completionTokens:0,enabled:!1,hidden:!0,keyOptions:{tokens:131072,completionTokens:8192,enabled:!0},baseURL:"https://api.x.ai/v1",credentials:"vault"},"grok-2-vision":{llm:"xAI",label:"Grok Vision",modelId:"grok-2-vision-latest",provider:"xAI",features:["image"],tags:["New","Personal","xAI"],tokens:0,completionTokens:0,enabled:!1,hidden:!0,keyOptions:{tokens:32768,completionTokens:32768,enabled:!0},baseURL:"https://api.x.ai/v1",credentials:"vault"}};//! ***IMPORTANT***
|
|
236
274
|
//! ***IMPORTANT***
|
|
237
|
-
const customModels={"ai21.jamba-1-5-mini-v1:0":{llm:"Bedrock",label:"AI21 Labs - Jamba 1.5 Mini",tokens:256e3,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","AgentPlugin","GenAILLM"],tags:["new"]},"ai21.jamba-1-5-large-v1:0":{llm:"Bedrock",label:"AI21 Labs - Jamba 1.5 Large",tokens:256e3,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","AgentPlugin","GenAILLM"],tags:["new"]},"ai21.jamba-instruct-v1:0":{llm:"Bedrock",label:"AI21 Labs - Jamba-Instruct",tokens:256e3,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"ai21.j2-ultra-v1":{llm:"Bedrock",label:"AI21 Labs - Jurassic-2 Ultra",tokens:8191,completionTokens:8191,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"ai21.j2-mid-v1":{llm:"Bedrock",label:"AI21 Labs - Jurassic-2 Mid",tokens:8191,completionTokens:8191,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"amazon.titan-text-premier-v1:0":{llm:"Bedrock",label:"Amazon - Titan Text Premier",tokens:32e3,completionTokens:3e3,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"amazon.titan-text-express-v1":{llm:"Bedrock",label:"Amazon - Titan Text G1 - Express",tokens:8192,completionTokens:4096,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"amazon.titan-text-lite-v1":{llm:"Bedrock",label:"Amazon - Titan Text G1 - Lite",tokens:4096,completionTokens:4096,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"us.anthropic.claude-3-5-haiku-20241022-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3.5 Haiku",tokens:2e5,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0","new"]},"us.anthropic.claude-3-5-sonnet-20241022-v2:0":{llm:"Bedrock",label:"Anthropic - Claude 3.5 Sonnet",tokens:2e5,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v2:0","new"]},"anthropic.claude-3-5-sonnet-20240620-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3.5 Sonnet",tokens:2e5,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-3-sonnet-20240229-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3 Sonnet",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-3-haiku-20240307-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3 Haiku",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-3-opus-20240229-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3 Opus",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-v2:1":{llm:"Bedrock",label:"Anthropic - Claude 2.1",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"],tags:["v2:1"]},"anthropic.claude-v2":{llm:"Bedrock",label:"Anthropic - Claude 2.0",tokens:1e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"anthropic.claude-instant-v1":{llm:"Bedrock",label:"Anthropic - Claude Instant",tokens:1e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"cohere.command-r-plus-v1:0":{llm:"Bedrock",label:"Cohere - Command R+",tokens:128e3,completionTokens:4e3,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"]},"cohere.command-r-v1:0":{llm:"Bedrock",label:"Cohere - Command R",tokens:128e3,completionTokens:4e3,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"]},"cohere.command-text-v14":{llm:"Bedrock",label:"Cohere - Command",tokens:4e3,completionTokens:4e3,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"cohere.command-light-text-v14":{llm:"Bedrock",label:"Cohere - Command Light",tokens:4e3,completionTokens:4e3,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"us.meta.llama3-2-1b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3.2 1B Instruct",tokens:2e5,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"],tags:["new"]},"us.meta.llama3-2-3b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3.2 3B Instruct",tokens:2e5,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"],tags:["new"]},"meta.llama3-8b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3 8B Instruct",tokens:8192,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"meta.llama3-70b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3 70B Instruct",tokens:8192,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral.mistral-7b-instruct-v0:2":{llm:"Bedrock",label:"Mistral AI - Mistral 7B Instruct",tokens:32e3,completionTokens:8192,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"mistral.mixtral-8x7b-instruct-v0:1":{llm:"Bedrock",label:"Mistral AI - Mixtral 8X7B Instruct",tokens:32e3,completionTokens:4096,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"mistral.mistral-large-2402-v1:0":{llm:"Bedrock",label:"Mistral AI - Mistral Large",tokens:32e3,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral.mistral-small-2402-v1:0":{llm:"Bedrock",label:"Mistral AI - Mistral Small",tokens:32e3,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"gemini-1.5-flash":{llm:"VertexAI",label:"Gemini 1.5 Flash",supportsSystemPrompt:!0,tokens:1048576,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"gemini-1.5-pro":{llm:"VertexAI",label:"Gemini 1.5 Pro",supportsSystemPrompt:!0,tokens:2097152,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"gemini-1.0-pro":{llm:"VertexAI",label:"Gemini 1.0 Pro",supportsSystemPrompt:!0,tokens:32760,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-5-haiku":{llm:"VertexAI",label:"Claude 3.5 Haiku",supportsSystemPrompt:!0,tokens:2e5,completionTokens:8192,tags:["new"],components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-5-sonnet-v2":{llm:"VertexAI",label:"Claude 3.5 Sonnet",supportsSystemPrompt:!0,tokens:2e5,completionTokens:8192,tags:["v2","new"],components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-5-sonnet":{llm:"VertexAI",label:"Claude 3.5 Sonnet",supportsSystemPrompt:!0,tokens:2e5,completionTokens:8192,tags:["v1"],components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-sonnet":{llm:"VertexAI",label:"Claude 3 Sonnet",supportsSystemPrompt:!0,tokens:2e5,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-opus":{llm:"VertexAI",label:"Claude 3 Opus",supportsSystemPrompt:!0,tokens:2e5,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-haiku":{llm:"VertexAI",label:"Claude 3 Haiku",supportsSystemPrompt:!0,tokens:2e5,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},gemma2:{llm:"VertexAI",label:"Gemma 2",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},gemma:{llm:"VertexAI",label:"Gemma",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},codegemma:{llm:"VertexAI",label:"CodeGemma",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"llama3-405b-instruct-maas":{llm:"VertexAI",label:"Llama 3.1 API Service",supportsSystemPrompt:!0,tokens:4096,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},llama3_1:{llm:"VertexAI",label:"Llama 3.1",supportsSystemPrompt:!0,tokens:4096,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"llama-guard":{llm:"VertexAI",label:"Llama Guard",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},llama3:{llm:"VertexAI",label:"Llama 3",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},llama2:{llm:"VertexAI",label:"Llama 2",value:"llama2",supportsSystemPrompt:!0,tokens:4096,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral-large":{llm:"VertexAI",label:"Mistral Large (2407)",supportsSystemPrompt:!0,tokens:128e3,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral-nemo":{llm:"VertexAI",label:"Mistral Nemo",supportsSystemPrompt:!0,tokens:128e3,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},codestral:{llm:"VertexAI",label:"Codestral",supportsSystemPrompt:!0,tokens:32e3,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},mixtral:{llm:"VertexAI",label:"Mixtral",supportsSystemPrompt:!0,tokens:32e3,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"chat-bison":{llm:"VertexAI",label:"PaLM 2 Chat Bison",supportsSystemPrompt:!0,tokens:4096,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"text-bison":{llm:"VertexAI",label:"PaLM 2 Text Bison",supportsSystemPrompt:!0,tokens:32768,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},phi3:{llm:"VertexAI",label:"Phi-3",supportsSystemPrompt:!0,tokens:128e3,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},qwen2:{llm:"VertexAI",label:"Qwen2",supportsSystemPrompt:!0,tokens:131072,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},mammut:{llm:"VertexAI",label:"MaMMUT",supportsSystemPrompt:!0,tokens:4096,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"lmsys-vicuna-7b":{llm:"VertexAI",label:"Vicuna",supportsSystemPrompt:!0,tokens:4096,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"bio-gpt":{llm:"VertexAI",label:"BioGPT",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"microsoft-biomedclip":{llm:"VertexAI",label:"BiomedCLIP",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},mistral:{llm:"VertexAI",label:"Mistral Self-host (7B & Nemo)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},nllb:{llm:"VertexAI",label:"NLLB",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"codellama-7b-hf":{llm:"VertexAI",label:"Code Llama",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"palmyra-med":{llm:"VertexAI",label:"Palmyra Med (Writer)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"llama-2-quantized":{llm:"VertexAI",label:"Llama 2 (Quantized)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"bert-base-uncased":{llm:"VertexAI",label:"BERT (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"falcon-instruct-7b-peft":{llm:"VertexAI",label:"Falcon-instruct (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},openllama:{llm:"VertexAI",label:"OpenLLaMA (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"roberta-large":{llm:"VertexAI",label:"RoBERTa-large (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"xlm-roberta-large":{llm:"VertexAI",label:"XLM-RoBERTa-large (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"bart-large-cnn":{llm:"VertexAI",label:"Bart-large-cnn",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"dolly-v2":{llm:"VertexAI",label:"Dolly-v2",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},imagetext:{llm:"VertexAI",label:"Imagen for Captioning & VQA",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"codechat-bison":{llm:"VertexAI",label:"Codey for Code Chat",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"code-bison":{llm:"VertexAI",label:"Codey for Code Generation",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"code-gecko":{llm:"VertexAI",label:"Codey for Code Completion",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"text-unicorn":{llm:"VertexAI",label:"PaLM 2 Text Unicorn",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"textembedding-gecko":{llm:"VertexAI",label:"Embeddings for Text",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"t5-flan":{llm:"VertexAI",label:"T5-FLAN",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"t5-1.1":{llm:"VertexAI",label:"T5-1.1",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"blip2-opt-2.7-b":{llm:"VertexAI",label:"BLIP2",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"instruct-pix2pix":{llm:"VertexAI",label:"InstructPix2Pix",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"bert-base":{llm:"VertexAI",label:"BERT",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"mediapipe-mobile-bert-classifier":{llm:"VertexAI",label:"MobileBERT Classifier (MediaPipe)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"mediapipe-average-word-embedding-classifier":{llm:"VertexAI",label:"Average Word Embedding Classifier (MediaPipe)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},pic2word:{llm:"VertexAI",label:"Pic2Word Composed Image Retrieval",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"text-translation":{llm:"VertexAI",label:"Text Translation",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-moderate-text":{llm:"VertexAI",label:"Text Moderation",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-analyze-syntax":{llm:"VertexAI",label:"Syntax analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-analyze-entity-sentiment":{llm:"VertexAI",label:"Entity sentiment analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-analyze-sentiment":{llm:"VertexAI",label:"Sentiment analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-classify-text-v1":{llm:"VertexAI",label:"Content classification",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"pt-test":{llm:"VertexAI",label:"Entity analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]}};var __defProp$a=Object.defineProperty,__getOwnPropDesc$3=Object.getOwnPropertyDescriptor,__defNormalProp$a=(obj,key,value)=>key in obj?__defProp$a(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$3=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$3(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$a(target,key,result),result},__publicField$a=(obj,key,value)=>__defNormalProp$a(obj,key+"",value);const _ModelsProviderConnector=class _ModelsProviderConnector2 extends SecureConnector{requester(candidate){const cacheKey=`ModelsProviderConnector:${candidate.toString()}`;if(_ModelsProviderConnector2.localCache.has(cacheKey))return _ModelsProviderConnector2.localCache.get(cacheKey,10*60*1e3);let teamModels=null,customModels2=null;const loadTeamModels=async()=>{if(!teamModels)try{const builtinmodels=await this.getModels(candidate.readRequest);customModels2=await this.getCustomModels(candidate),teamModels={...builtinmodels,...customModels2}}catch{return null}return setImmediate(async()=>{const _customModels=await this.getCustomModels(candidate);teamModels={...teamModels,..._customModels}}),teamModels};loadTeamModels();const instance={getModels:async()=>await loadTeamModels(),getCustomModels:async()=>await this.getCustomModels(candidate),addModels:async models2=>await this.addModels(candidate.readRequest,models2),getModelInfo:async(model,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey)},getModelId:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getModelId(candidate.readRequest,teamModels2,model)},getProvider:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getProvider(candidate.readRequest,teamModels2,model)},getFallbackLLM:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getFallbackLLM(candidate.readRequest,teamModels2,model)},getBaseURL:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getBaseURL(candidate.readRequest,teamModels2,model)},isUserCustomLLM:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.isUserCustomLLM(candidate.readRequest,teamModels2,model)},isStandardLLM:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return!(await this.getModelInfo(candidate.readRequest,teamModels2,model)).isCustomLLM},adjustMaxCompletionTokens:async(model,maxCompletionTokens,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{},modelInfo=await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey);return Math.min(maxCompletionTokens||512,modelInfo?.completionTokens||modelInfo?.tokens||maxCompletionTokens||512)},getMaxContextTokens:async(model,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return(await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey))?.tokens||1024},getMaxCompletionTokens:async(model,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{},modelInfo=await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey);return modelInfo?.completionTokens||modelInfo?.tokens||512},validateTokensLimit:async({model,promptTokens,completionTokens,hasAPIKey})=>{if(Array.isArray(model?.tags)&&model?.tags?.includes("sdk"))return;const allowedContextTokens=(await this.getModelInfo(candidate.readRequest,{},model,hasAPIKey))?.tokens,totalTokens=promptTokens+completionTokens,teamAPIKeyExceededMessage=`This models' maximum content length is ${allowedContextTokens} tokens. (This is the sum of your prompt with all variables and the maximum output tokens you've set in Advanced Settings) However, you requested approx ${totalTokens} tokens (${promptTokens} in the prompt, ${completionTokens} in the output). Please reduce the length of either the input prompt or the Maximum output tokens.`,noAPIKeyExceededMessage=`Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key and select Personal tagged models to unlock full length.`;if(totalTokens>allowedContextTokens)throw new Error(hasAPIKey?teamAPIKeyExceededMessage:noAPIKeyExceededMessage)}};return _ModelsProviderConnector2.localCache.set(cacheKey,instance,10*60*1e3),instance}async getModelInfo(acRequest,models2,model,hasAPIKey=!1){let modelId,alias,aliasModelInfo,modelInfo;typeof model=="object"&&model.modelId?(modelId=model.modelId,alias=model.alias,aliasModelInfo=models2?.[alias],modelInfo=model):(modelId=await this.getModelId(acRequest,models2,model),alias=models2?.[model]?.alias,aliasModelInfo=models2?.[alias],modelInfo=models2?.[model]);const aliasKeyOptions=aliasModelInfo&&hasAPIKey?aliasModelInfo?.keyOptions:null,modelKeyOptions=modelInfo?.keyOptions||aliasKeyOptions;return{...modelInfo,...aliasModelInfo,...aliasKeyOptions,...modelKeyOptions,modelId}}async getModelId(acRequest,models2,model){if(typeof model=="object"&&model.modelId)return model.modelId;const modelId=models2?.[model]?.modelId||model,alias=models2?.[model]?.alias;return alias?models2?.[alias]?.modelId||alias||model:modelId}async getProvider(acRequest,models2,model){if(typeof model=="object"&&model.provider)return model.provider;const modelId=await this.getModelId(acRequest,models2,model);return models2?.[modelId]?.provider||models2?.[model]?.provider||models2?.[modelId]?.llm||models2?.[model]?.llm}async getFallbackLLM(acRequest,models2,model){if(typeof model=="object"&&"fallbackLLM"in model)return model.fallbackLLM;const modelId=await this.getModelId(acRequest,models2,model);return models2?.[modelId]?.fallbackLLM||models2?.[model]?.fallbackLLM}async getBaseURL(acRequest,models2,model){if(typeof model=="object"&&"baseURL"in model)return model.baseURL;const modelId=await this.getModelId(acRequest,models2,model);return models2?.[modelId]?.baseURL||models2?.[model]?.baseURL}async isUserCustomLLM(acRequest,models2,model){if(typeof model=="object"&&"isUserCustomLLM"in model)return!!model.isUserCustomLLM;const modelId=await this.getModelId(acRequest,models2,model);return!!(models2?.[modelId]?.isUserCustomLLM||models2?.[model]?.isUserCustomLLM)}async getCustomModels(candidate){const enterpriseModels=await this.getEnterpriseModels(candidate),userCustomModels=await this.getUserCustomModels(candidate);return{...enterpriseModels,...userCustomModels}}async getEnterpriseModels(candidate){try{const models2={},accountConnector=ConnectorService.getAccountConnector(),team=await accountConnector.requester(candidate).getTeam(),modelsSetting=await accountConnector.team(team).getTeamSetting(ENTERPRISE_MODELS_SETTING_KEY),modelEntries=JSON.parse(modelsSetting||"{}");for(const[entryId,entry]of Object.entries(modelEntries)){const foundationModel=entry.settings.foundationModel,customModel=entry.settings.customModel,supportsSystemPrompt=customModels[foundationModel]?.supportsSystemPrompt||entry.settings.supportsSystemPrompt,customModelData=customModels[foundationModel]||{};let credentials=null;switch(entry.provider){case TLLMProvider.Bedrock:credentials=TLLMCredentials.BedrockVault;break;case TLLMProvider.VertexAI:credentials=TLLMCredentials.VertexAIVault;break;default:credentials=TLLMCredentials.Internal;break}models2[entry.name]={label:entry.name,modelId:customModel||foundationModel,provider:entry.provider,features:entry.features?.map(feature=>{switch(feature){case"text-completion":return"text";case"tool-use":return"tools";default:return feature}}),tags:Array.isArray(entry?.tags)?["Enterprise",...entry?.tags]:["Enterprise"],tokens:customModelData?.tokens??1e5,completionTokens:customModelData?.completionTokens??4096,enabled:!0,id:entryId,name:entry.name,alias:foundationModel,llm:entry.provider,components:customModelData?.components??[],isCustomLLM:!0,supportsSystemPrompt,settings:entry.settings,credentials}}return models2}catch{return{}}}async getUserCustomModels(candidate){try{const models2={},accountConnector=ConnectorService.getAccountConnector(),team=await accountConnector.requester(candidate).getTeam(),modelsSetting=await accountConnector.team(team).getTeamSetting(USER_CUSTOM_MODELS_SETTING_KEY),modelEntries=JSON.parse(modelsSetting||"{}");for(const[entryId,entry]of Object.entries(modelEntries))models2[entry.name]={label:entry.name,modelId:entry?.modelId,provider:entry.provider,features:entry?.features||[],tags:Array.isArray(entry?.tags)?["Custom",...entry?.tags]:["Custom"],tokens:entry?.contextWindow??8192,completionTokens:entry?.maxOutputTokens??8192,enabled:!0,id:entryId,name:entry.name,baseURL:entry.baseURL,fallbackLLM:entry.fallbackLLM,isUserCustomLLM:!0,credentials:entry?.credentials||{}};return models2}catch{return{}}}};__publicField$a(_ModelsProviderConnector,"localCache",new LocalCache),__decorateClass$3([hookAsync("Connector.ModelsProvider.getEnterpriseModels")],_ModelsProviderConnector.prototype,"getEnterpriseModels"),__decorateClass$3([hookAsync("Connector.ModelsProvider.getUserCustomModels")],_ModelsProviderConnector.prototype,"getUserCustomModels");let ModelsProviderConnector=_ModelsProviderConnector;var __defProp$9=Object.defineProperty,__getOwnPropDesc$2=Object.getOwnPropertyDescriptor,__defNormalProp$9=(obj,key,value)=>key in obj?__defProp$9(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$2=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$2(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$9(target,key,result),result},__publicField$9=(obj,key,value)=>__defNormalProp$9(obj,typeof key!="symbol"?key+"":key,value);const logger$3=Logger("SmythModelsProvider"),_JSONModelsProvider=class _JSONModelsProvider2 extends ModelsProviderConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$9(this,"name","JSONModelsProvider"),__publicField$9(this,"models"),this.models=JSON.parse(JSON.stringify(models)),typeof this._settings.models=="string")this.initDirWatcher(this._settings.models);else if(typeof this._settings.models=="object")this._settings.mode==="merge"?this.models={...this.models,...this._settings.models}:this.models=this._settings.models,this.started=!0;else{const modelsFolder=this.findModelsFolder();modelsFolder?(this._settings.mode="merge",this.initDirWatcher(modelsFolder)):(logger$3.warn("No models folder found ... falling back to built-in models only"),this.started=!0)}}async start(){super.start()}findModelsFolder(){const _modelsFolder=findSmythPath("models");return fs__default.existsSync(_modelsFolder)?(logger$3.warn("Using default models folder : ",_modelsFolder),_modelsFolder):null}async addModels(acRequest,models2){await this.ready();const validModels=await this.getValidModels(models2)||{};Object.keys(validModels).length>0&&(this.models={...this.models,...validModels})}async getModels(acRequest){return await this.ready(),this.models}async getResourceACL(resourceId,candidate){ConnectorService.getAccountConnector();const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}async reindexModels(dir){try{logger$3.debug(`Reindexing models from directory: ${dir}`);const scannedModels=await this.scanDirectoryForModels(dir);this._settings?.mode==="merge"?this.models={...this.models,...scannedModels}:this.models=scannedModels,_JSONModelsProvider2.localCache.clear(),logger$3.debug(`Successfully reindexed models. Total models: ${Object.keys(this.models).length}`)}catch(error){logger$3.error(`Error reindexing models from directory "${dir}":`,error)}}async scanDirectoryForModels(dir){const scannedModels={};try{const entries=await fs$1.readdir(dir,{withFileTypes:!0});for(const entry of entries){const fullPath=path.join(dir,entry.name);if(entry.isDirectory()){const subDirModels=await this.scanDirectoryForModels(fullPath);Object.assign(scannedModels,subDirModels)}else if(entry.isFile()&&entry.name.endsWith(".json"))try{const fileContent=await fs$1.readFile(fullPath,"utf-8"),modelData=JSON.parse(fileContent),validModels=await this.getValidModels(modelData);Object.assign(scannedModels,validModels)}catch(error){console.error(`Error parsing model data from file "${fullPath}"`),logger$3.warn(`Error parsing model data from file "${fullPath}":`,error.message)}}}catch(error){logger$3.warn(`Error scanning directory "${dir}":`,error)}return scannedModels}async getValidModels(modelData){const validModels={};try{if(modelData.modelId)this.isValidSingleModel(modelData)?(validModels[modelData.modelId]=modelData,logger$3.debug(`Loaded model: ${modelData.modelId}`)):logger$3.warn("Invalid model format",modelData);else if(typeof modelData=="object"&&!Array.isArray(modelData)){let models2="";for(const[modelId,model]of Object.entries(modelData))try{this.isValidSingleModel(model)?(validModels[modelId]=model,models2+=`${modelId} `):logger$3.warn(`Invalid model format for model "${modelId}"`)}catch(error){logger$3.warn(`Error processing model "${modelId}":`,error)}logger$3.debug(`Loaded models: ${models2}`)}else logger$3.warn("Invalid format (not a model or object of models)")}catch(error){logger$3.warn("Error loading model:",error)}return validModels}isValidSingleModel(data){return data&&typeof data=="object"&&typeof data.modelId=="string"&&(data.provider===void 0||typeof data.provider=="string")}isValidModel(data){return this.isValidSingleModel(data)}initDirWatcher(dir){const stats=fs__default.statSync(dir);if(!stats.isDirectory()&&!stats.isFile()){logger$3.warn(`Path "${dir}" is neither a file nor a directory ... skipping models watcher and falling back to built-in models only`),this.started=!0;return}try{if(!stats.isDirectory()){if(stats.isFile()){const fileContent=fs__default.readFileSync(dir,"utf-8");try{const modelData=JSON.parse(fileContent);this._settings?.mode==="merge"?this.models={...this.models,...modelData}:this.models=modelData}catch(error){console.error(`Error parsing model data from file "${dir}":`),logger$3.warn(`Error parsing model data from file "${dir}":`,error.message)}this.started=!0;return}logger$3.warn(`Path "${dir}" is neither a file nor a directory`);return}}catch(error){logger$3.warn(`Path "${dir}" does not exist or cannot be accessed:`,error.message);return}const debouncedReindex=debounce(this.reindexModels.bind(this,dir),1e3,{leading:!1,maxWait:5e3});chokidar__default.watch(dir,{ignored:/(^|[\/\\])\../,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:2e3,pollInterval:100}}).on("add",path2=>{logger$3.debug(`File ${path2} has been added`),debouncedReindex()}).on("change",path2=>{logger$3.debug(`File ${path2} has been changed`),debouncedReindex()}).on("unlink",path2=>{logger$3.debug(`File ${path2} has been removed`),debouncedReindex()}).on("ready",async()=>{logger$3.debug(`Watcher ready. Performing initial scan of ${dir}`),await this.reindexModels(dir),this.started=!0})}};__decorateClass$2([SecureConnector.AccessControl],_JSONModelsProvider.prototype,"addModels"),__decorateClass$2([SecureConnector.AccessControl],_JSONModelsProvider.prototype,"getModels");let JSONModelsProvider=_JSONModelsProvider;class ModelsProviderService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.ModelsProvider,"JSONModelsProvider",JSONModelsProvider)}}class CodeConnector extends SecureConnector{requester(candidate){return{prepare:async(codeUID,input,config2)=>await this.prepare(candidate.readRequest,codeUID,input,config2),deploy:async(codeUID,input,config2)=>await this.deploy(candidate.writeRequest,codeUID,input,config2),execute:async(codeUID,inputs,config2)=>await this.execute(candidate.readRequest,codeUID,inputs,config2),executeDeployment:async(codeUID,deploymentId,inputs,config2)=>await this.executeDeployment(candidate.readRequest,codeUID,deploymentId,inputs,config2),listDeployments:async(codeUID,config2)=>await this.listDeployments(candidate.readRequest,codeUID,config2),getDeployment:async(codeUID,deploymentId,config2)=>await this.getDeployment(candidate.readRequest,codeUID,deploymentId,config2),deleteDeployment:async(codeUID,deploymentId,config2)=>{await this.deleteDeployment(candidate.writeRequest,codeUID,deploymentId,config2)}}}}var __defProp$8=Object.defineProperty,__defNormalProp$8=(obj,key,value)=>key in obj?__defProp$8(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$8=(obj,key,value)=>__defNormalProp$8(obj,typeof key!="symbol"?key+"":key,value);const console$3=Logger("AWSLambda");class AWSLambdaCode extends CodeConnector{constructor(config2){super(config2),__publicField$8(this,"name","AWSLambda"),__publicField$8(this,"awsConfigs"),this.awsConfigs=config2}async prepare(acRequest,codeUID,input,config2){return{prepared:!0,errors:[],warnings:[]}}async deploy(acRequest,codeUID,input,config2){const agentId=acRequest.candidate.id,functionName=getLambdaFunctionName(agentId,codeUID),[isLambdaExists,exisitingCodeHash,currentEnvVariables]=await Promise.all([getDeployedFunction(functionName,this.awsConfigs),getDeployedCodeHash(agentId,codeUID),getCurrentEnvironmentVariables(acRequest.candidate.id,input.code)]),envValues=getSortedObjectValues(currentEnvVariables),codeHash=generateCodeHash(input.code,Object.keys(input.inputs),envValues);if(isLambdaExists&&exisitingCodeHash===codeHash)return{id:functionName,runtime:config2.runtime,createdAt:new Date,status:"deployed"};const baseFolder=`${process.cwd()}/lambda_archives`;fs__default.existsSync(baseFolder)||fs__default.mkdirSync(baseFolder);const directory=`${baseFolder}/${functionName}__${Date.now()}`;try{const{isValid,parameters,error,dependencies}=validateAsyncMainFunction(input.code);if(!isValid)throw new Error(error||"Invalid Code");const lambdaCode=generateLambdaCode(input.code,parameters,currentEnvVariables);fs__default.mkdirSync(directory),fs__default.writeFileSync(path.join(directory,"index.mjs"),lambdaCode),execSync("npm init -y",{cwd:directory}),execSync(`npm install ${dependencies.join(" ")}`,{cwd:directory});const zipFilePath=await zipCode(directory);return await createOrUpdateLambdaFunction(functionName,zipFilePath,this.awsConfigs,currentEnvVariables),await setDeployedCodeHash(agentId,codeUID,codeHash),console$3.debug("Lambda function updated successfully!"),{id:functionName,runtime:config2.runtime,createdAt:new Date,status:"deploying"}}catch(error){throw error}finally{try{fs__default.rmSync(`${directory}`,{recursive:!0,force:!0}),fs__default.unlinkSync(`${directory}.zip`)}catch{}}}async execute(acRequest,codeUID,inputs,config2){try{const agentId=acRequest.candidate.id,functionName=getLambdaFunctionName(agentId,codeUID),lambdaResponse=JSON.parse(await invokeLambdaFunction(functionName,inputs,this.awsConfigs)),executionTime=lambdaResponse.executionTime;return await updateDeployedCodeTTL(agentId,codeUID,cacheTTL),console$3.debug(`Code result:
|
|
275
|
+
const customModels={"ai21.jamba-1-5-mini-v1:0":{llm:"Bedrock",label:"AI21 Labs - Jamba 1.5 Mini",tokens:256e3,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","AgentPlugin","GenAILLM"],tags:["new"]},"ai21.jamba-1-5-large-v1:0":{llm:"Bedrock",label:"AI21 Labs - Jamba 1.5 Large",tokens:256e3,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","AgentPlugin","GenAILLM"],tags:["new"]},"ai21.jamba-instruct-v1:0":{llm:"Bedrock",label:"AI21 Labs - Jamba-Instruct",tokens:256e3,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"ai21.j2-ultra-v1":{llm:"Bedrock",label:"AI21 Labs - Jurassic-2 Ultra",tokens:8191,completionTokens:8191,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"ai21.j2-mid-v1":{llm:"Bedrock",label:"AI21 Labs - Jurassic-2 Mid",tokens:8191,completionTokens:8191,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"amazon.titan-text-premier-v1:0":{llm:"Bedrock",label:"Amazon - Titan Text Premier",tokens:32e3,completionTokens:3e3,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"amazon.titan-text-express-v1":{llm:"Bedrock",label:"Amazon - Titan Text G1 - Express",tokens:8192,completionTokens:4096,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"amazon.titan-text-lite-v1":{llm:"Bedrock",label:"Amazon - Titan Text G1 - Lite",tokens:4096,completionTokens:4096,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"us.anthropic.claude-3-5-haiku-20241022-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3.5 Haiku",tokens:2e5,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0","new"]},"us.anthropic.claude-3-5-sonnet-20241022-v2:0":{llm:"Bedrock",label:"Anthropic - Claude 3.5 Sonnet",tokens:2e5,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v2:0","new"]},"anthropic.claude-3-5-sonnet-20240620-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3.5 Sonnet",tokens:2e5,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-3-sonnet-20240229-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3 Sonnet",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-3-haiku-20240307-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3 Haiku",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-3-opus-20240229-v1:0":{llm:"Bedrock",label:"Anthropic - Claude 3 Opus",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"],tags:["v1:0"]},"anthropic.claude-v2:1":{llm:"Bedrock",label:"Anthropic - Claude 2.1",tokens:2e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"],tags:["v2:1"]},"anthropic.claude-v2":{llm:"Bedrock",label:"Anthropic - Claude 2.0",tokens:1e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"anthropic.claude-instant-v1":{llm:"Bedrock",label:"Anthropic - Claude Instant",tokens:1e5,completionTokens:4096,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"cohere.command-r-plus-v1:0":{llm:"Bedrock",label:"Cohere - Command R+",tokens:128e3,completionTokens:4e3,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"]},"cohere.command-r-v1:0":{llm:"Bedrock",label:"Cohere - Command R",tokens:128e3,completionTokens:4e3,supportsSystemPrompt:!0,supportsStreamingToolUse:!0,components:["PromptGenerator","LLMAssistant","AgentPlugin","Chatbot"]},"cohere.command-text-v14":{llm:"Bedrock",label:"Cohere - Command",tokens:4e3,completionTokens:4e3,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"cohere.command-light-text-v14":{llm:"Bedrock",label:"Cohere - Command Light",tokens:4e3,completionTokens:4e3,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"us.meta.llama3-2-1b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3.2 1B Instruct",tokens:2e5,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"],tags:["new"]},"us.meta.llama3-2-3b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3.2 3B Instruct",tokens:2e5,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"],tags:["new"]},"meta.llama3-8b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3 8B Instruct",tokens:8192,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"meta.llama3-70b-instruct-v1:0":{llm:"Bedrock",label:"Meta - Llama 3 70B Instruct",tokens:8192,completionTokens:2048,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral.mistral-7b-instruct-v0:2":{llm:"Bedrock",label:"Mistral AI - Mistral 7B Instruct",tokens:32e3,completionTokens:8192,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"mistral.mixtral-8x7b-instruct-v0:1":{llm:"Bedrock",label:"Mistral AI - Mixtral 8X7B Instruct",tokens:32e3,completionTokens:4096,supportsSystemPrompt:!1,supportsStreamingToolUse:!1,components:["PromptGenerator","GenAILLM"]},"mistral.mistral-large-2402-v1:0":{llm:"Bedrock",label:"Mistral AI - Mistral Large",tokens:32e3,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral.mistral-small-2402-v1:0":{llm:"Bedrock",label:"Mistral AI - Mistral Small",tokens:32e3,completionTokens:8192,supportsSystemPrompt:!0,supportsStreamingToolUse:!1,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"gemini-1.5-flash":{llm:"VertexAI",label:"Gemini 1.5 Flash",supportsSystemPrompt:!0,tokens:1048576,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"gemini-1.5-pro":{llm:"VertexAI",label:"Gemini 1.5 Pro",supportsSystemPrompt:!0,tokens:2097152,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"gemini-1.0-pro":{llm:"VertexAI",label:"Gemini 1.0 Pro",supportsSystemPrompt:!0,tokens:32760,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-5-haiku":{llm:"VertexAI",label:"Claude 3.5 Haiku",supportsSystemPrompt:!0,tokens:2e5,completionTokens:8192,tags:["new"],components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-5-sonnet-v2":{llm:"VertexAI",label:"Claude 3.5 Sonnet",supportsSystemPrompt:!0,tokens:2e5,completionTokens:8192,tags:["v2","new"],components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-5-sonnet":{llm:"VertexAI",label:"Claude 3.5 Sonnet",supportsSystemPrompt:!0,tokens:2e5,completionTokens:8192,tags:["v1"],components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-sonnet":{llm:"VertexAI",label:"Claude 3 Sonnet",supportsSystemPrompt:!0,tokens:2e5,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-opus":{llm:"VertexAI",label:"Claude 3 Opus",supportsSystemPrompt:!0,tokens:2e5,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"claude-3-haiku":{llm:"VertexAI",label:"Claude 3 Haiku",supportsSystemPrompt:!0,tokens:2e5,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},gemma2:{llm:"VertexAI",label:"Gemma 2",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},gemma:{llm:"VertexAI",label:"Gemma",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},codegemma:{llm:"VertexAI",label:"CodeGemma",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"llama3-405b-instruct-maas":{llm:"VertexAI",label:"Llama 3.1 API Service",supportsSystemPrompt:!0,tokens:4096,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},llama3_1:{llm:"VertexAI",label:"Llama 3.1",supportsSystemPrompt:!0,tokens:4096,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"llama-guard":{llm:"VertexAI",label:"Llama Guard",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},llama3:{llm:"VertexAI",label:"Llama 3",supportsSystemPrompt:!0,tokens:8192,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},llama2:{llm:"VertexAI",label:"Llama 2",value:"llama2",supportsSystemPrompt:!0,tokens:4096,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral-large":{llm:"VertexAI",label:"Mistral Large (2407)",supportsSystemPrompt:!0,tokens:128e3,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"mistral-nemo":{llm:"VertexAI",label:"Mistral Nemo",supportsSystemPrompt:!0,tokens:128e3,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},codestral:{llm:"VertexAI",label:"Codestral",supportsSystemPrompt:!0,tokens:32e3,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},mixtral:{llm:"VertexAI",label:"Mixtral",supportsSystemPrompt:!0,tokens:32e3,completionTokens:4096,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"chat-bison":{llm:"VertexAI",label:"PaLM 2 Chat Bison",supportsSystemPrompt:!0,tokens:4096,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"text-bison":{llm:"VertexAI",label:"PaLM 2 Text Bison",supportsSystemPrompt:!0,tokens:32768,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},phi3:{llm:"VertexAI",label:"Phi-3",supportsSystemPrompt:!0,tokens:128e3,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},qwen2:{llm:"VertexAI",label:"Qwen2",supportsSystemPrompt:!0,tokens:131072,completionTokens:8192,components:["PromptGenerator","LLMAssistant","GenAILLM"]},mammut:{llm:"VertexAI",label:"MaMMUT",supportsSystemPrompt:!0,tokens:4096,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"lmsys-vicuna-7b":{llm:"VertexAI",label:"Vicuna",supportsSystemPrompt:!0,tokens:4096,completionTokens:2048,components:["PromptGenerator","LLMAssistant","GenAILLM"]},"bio-gpt":{llm:"VertexAI",label:"BioGPT",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"microsoft-biomedclip":{llm:"VertexAI",label:"BiomedCLIP",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},mistral:{llm:"VertexAI",label:"Mistral Self-host (7B & Nemo)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},nllb:{llm:"VertexAI",label:"NLLB",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"codellama-7b-hf":{llm:"VertexAI",label:"Code Llama",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"palmyra-med":{llm:"VertexAI",label:"Palmyra Med (Writer)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"llama-2-quantized":{llm:"VertexAI",label:"Llama 2 (Quantized)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"bert-base-uncased":{llm:"VertexAI",label:"BERT (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"falcon-instruct-7b-peft":{llm:"VertexAI",label:"Falcon-instruct (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},openllama:{llm:"VertexAI",label:"OpenLLaMA (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"roberta-large":{llm:"VertexAI",label:"RoBERTa-large (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"xlm-roberta-large":{llm:"VertexAI",label:"XLM-RoBERTa-large (PEFT)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"bart-large-cnn":{llm:"VertexAI",label:"Bart-large-cnn",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"dolly-v2":{llm:"VertexAI",label:"Dolly-v2",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},imagetext:{llm:"VertexAI",label:"Imagen for Captioning & VQA",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"codechat-bison":{llm:"VertexAI",label:"Codey for Code Chat",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"code-bison":{llm:"VertexAI",label:"Codey for Code Generation",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"code-gecko":{llm:"VertexAI",label:"Codey for Code Completion",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"text-unicorn":{llm:"VertexAI",label:"PaLM 2 Text Unicorn",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"textembedding-gecko":{llm:"VertexAI",label:"Embeddings for Text",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"t5-flan":{llm:"VertexAI",label:"T5-FLAN",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"t5-1.1":{llm:"VertexAI",label:"T5-1.1",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"blip2-opt-2.7-b":{llm:"VertexAI",label:"BLIP2",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"instruct-pix2pix":{llm:"VertexAI",label:"InstructPix2Pix",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"bert-base":{llm:"VertexAI",label:"BERT",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"mediapipe-mobile-bert-classifier":{llm:"VertexAI",label:"MobileBERT Classifier (MediaPipe)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"mediapipe-average-word-embedding-classifier":{llm:"VertexAI",label:"Average Word Embedding Classifier (MediaPipe)",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},pic2word:{llm:"VertexAI",label:"Pic2Word Composed Image Retrieval",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"text-translation":{llm:"VertexAI",label:"Text Translation",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-moderate-text":{llm:"VertexAI",label:"Text Moderation",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-analyze-syntax":{llm:"VertexAI",label:"Syntax analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-analyze-entity-sentiment":{llm:"VertexAI",label:"Entity sentiment analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-analyze-sentiment":{llm:"VertexAI",label:"Sentiment analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"language-v1-classify-text-v1":{llm:"VertexAI",label:"Content classification",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]},"pt-test":{llm:"VertexAI",label:"Entity analysis",supportsSystemPrompt:!1,tokens:4096,completionTokens:4096,components:["PromptGenerator","GenAILLM"]}};var __defProp$a=Object.defineProperty,__getOwnPropDesc$3=Object.getOwnPropertyDescriptor,__defNormalProp$a=(obj,key,value)=>key in obj?__defProp$a(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$3=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$3(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$a(target,key,result),result},__publicField$a=(obj,key,value)=>__defNormalProp$a(obj,key+"",value);const _ModelsProviderConnector=class _ModelsProviderConnector2 extends SecureConnector{requester(candidate){const cacheKey=`ModelsProviderConnector:${candidate.toString()}`;if(_ModelsProviderConnector2.localCache.has(cacheKey))return _ModelsProviderConnector2.localCache.get(cacheKey,10*60*1e3);let teamModels=null,customModels2=null;const loadTeamModels=async()=>{if(!teamModels)try{const builtinmodels=await this.getModels(candidate.readRequest);customModels2=await this.getCustomModels(candidate),teamModels={...builtinmodels,...customModels2}}catch{return null}return setImmediate(async()=>{const _customModels=await this.getCustomModels(candidate);teamModels={...teamModels,..._customModels}}),teamModels};loadTeamModels();const instance={getModels:async()=>await loadTeamModels(),getCustomModels:async()=>await this.getCustomModels(candidate),addModels:async models2=>await this.addModels(candidate.readRequest,models2),getModelInfo:async(model,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey)},getModelId:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getModelId(candidate.readRequest,teamModels2,model)},getProvider:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getProvider(candidate.readRequest,teamModels2,model)},getFallbackLLM:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getFallbackLLM(candidate.readRequest,teamModels2,model)},getBaseURL:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.getBaseURL(candidate.readRequest,teamModels2,model)},isUserCustomLLM:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return this.isUserCustomLLM(candidate.readRequest,teamModels2,model)},isStandardLLM:async model=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return!(await this.getModelInfo(candidate.readRequest,teamModels2,model)).isCustomLLM},adjustMaxCompletionTokens:async(model,maxCompletionTokens,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{},modelInfo=await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey);return Math.min(maxCompletionTokens||512,modelInfo?.completionTokens||modelInfo?.tokens||maxCompletionTokens||512)},getMaxContextTokens:async(model,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{};return(await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey))?.tokens||1024},getMaxCompletionTokens:async(model,hasAPIKey=!1)=>{const teamModels2=typeof model=="string"?await loadTeamModels():{},modelInfo=await this.getModelInfo(candidate.readRequest,teamModels2,model,hasAPIKey);return modelInfo?.completionTokens||modelInfo?.tokens||512},validateTokensLimit:async({model,promptTokens,completionTokens,hasAPIKey})=>{if(Array.isArray(model?.tags)&&model?.tags?.includes("sdk"))return;const allowedContextTokens=(await this.getModelInfo(candidate.readRequest,{},model,hasAPIKey))?.tokens,totalTokens=promptTokens+completionTokens,teamAPIKeyExceededMessage=`This models' maximum content length is ${allowedContextTokens} tokens. (This is the sum of your prompt with all variables and the maximum output tokens you've set in Advanced Settings) However, you requested approx ${totalTokens} tokens (${promptTokens} in the prompt, ${completionTokens} in the output). Please reduce the length of either the input prompt or the Maximum output tokens.`,noAPIKeyExceededMessage=`Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key and select Personal tagged models to unlock full length.`;if(totalTokens>allowedContextTokens)throw new Error(hasAPIKey?teamAPIKeyExceededMessage:noAPIKeyExceededMessage)}};return _ModelsProviderConnector2.localCache.set(cacheKey,instance,10*60*1e3),instance}async getModelInfo(acRequest,models2,model,hasAPIKey=!1){let modelId,alias,aliasModelInfo,modelInfo;typeof model=="object"&&model.modelId?(modelId=model.modelId,alias=model.alias,aliasModelInfo=models2?.[alias],modelInfo=model):(modelId=await this.getModelId(acRequest,models2,model),alias=models2?.[model]?.alias,aliasModelInfo=models2?.[alias],modelInfo=models2?.[model]);const aliasKeyOptions=aliasModelInfo&&hasAPIKey?aliasModelInfo?.keyOptions:null,modelKeyOptions=modelInfo?.keyOptions||aliasKeyOptions;return{...modelInfo,...aliasModelInfo,...aliasKeyOptions,...modelKeyOptions,modelId}}async getModelId(acRequest,models2,model){if(typeof model=="object"&&model.modelId)return model.modelId;const modelId=models2?.[model]?.modelId||model,alias=models2?.[model]?.alias;return alias?models2?.[alias]?.modelId||alias||model:modelId}async getProvider(acRequest,models2,model){if(typeof model=="object"&&model.provider)return model.provider;const modelId=await this.getModelId(acRequest,models2,model);return models2?.[modelId]?.provider||models2?.[model]?.provider||models2?.[modelId]?.llm||models2?.[model]?.llm}async getFallbackLLM(acRequest,models2,model){if(typeof model=="object"&&"fallbackLLM"in model)return model.fallbackLLM;const modelId=await this.getModelId(acRequest,models2,model);return models2?.[modelId]?.fallbackLLM||models2?.[model]?.fallbackLLM}async getBaseURL(acRequest,models2,model){if(typeof model=="object"&&"baseURL"in model)return model.baseURL;const modelId=await this.getModelId(acRequest,models2,model);return models2?.[modelId]?.baseURL||models2?.[model]?.baseURL}async isUserCustomLLM(acRequest,models2,model){if(typeof model=="object"&&"isUserCustomLLM"in model)return!!model.isUserCustomLLM;const modelId=await this.getModelId(acRequest,models2,model);return!!(models2?.[modelId]?.isUserCustomLLM||models2?.[model]?.isUserCustomLLM)}async getCustomModels(candidate){const enterpriseModels=await this.getEnterpriseModels(candidate),userCustomModels=await this.getUserCustomModels(candidate);return{...enterpriseModels,...userCustomModels}}async getEnterpriseModels(candidate){try{const models2={},accountConnector=ConnectorService.getAccountConnector(),team=await accountConnector.requester(candidate).getTeam(),modelsSetting=await accountConnector.team(team).getTeamSetting(ENTERPRISE_MODELS_SETTING_KEY),modelEntries=JSON.parse(modelsSetting||"{}");for(const[entryId,entry]of Object.entries(modelEntries)){const foundationModel=entry.settings.foundationModel,customModel=entry.settings.customModel,supportsSystemPrompt=customModels[foundationModel]?.supportsSystemPrompt||entry.settings.supportsSystemPrompt,customModelData=customModels[foundationModel]||{};let credentials=null;switch(entry.provider){case TLLMProvider.Bedrock:credentials=TLLMCredentials.BedrockVault;break;case TLLMProvider.VertexAI:credentials=TLLMCredentials.VertexAIVault;break;default:credentials=TLLMCredentials.Internal;break}models2[entry.name]={label:entry.name,modelId:customModel||foundationModel,provider:entry.provider,features:entry.features?.map(feature=>{switch(feature){case"text-completion":return"text";case"tool-use":return"tools";default:return feature}}),tags:Array.isArray(entry?.tags)?["Enterprise",...entry?.tags]:["Enterprise"],tokens:customModelData?.tokens??1e5,completionTokens:customModelData?.completionTokens??4096,enabled:!0,id:entryId,name:entry.name,alias:foundationModel,llm:entry.provider,components:customModelData?.components??[],isCustomLLM:!0,supportsSystemPrompt,settings:entry.settings,credentials}}return models2}catch{return{}}}async getUserCustomModels(candidate){try{const models2={},accountConnector=ConnectorService.getAccountConnector(),team=await accountConnector.requester(candidate).getTeam(),modelsSetting=await accountConnector.team(team).getTeamSetting(USER_CUSTOM_MODELS_SETTING_KEY),modelEntries=JSON.parse(modelsSetting||"{}");for(const[entryId,entry]of Object.entries(modelEntries))models2[entry.name]={label:entry.name,modelId:entry?.modelId,provider:entry.provider,features:entry?.features||[],tags:Array.isArray(entry?.tags)?["Custom",...entry?.tags]:["Custom"],tokens:entry?.contextWindow??8192,completionTokens:entry?.maxOutputTokens??8192,enabled:!0,id:entryId,name:entry.name,baseURL:entry.baseURL,fallbackLLM:entry.fallbackLLM,isUserCustomLLM:!0,credentials:entry?.credentials||{}};return models2}catch{return{}}}};__publicField$a(_ModelsProviderConnector,"localCache",new LocalCache),__decorateClass$3([hookAsync("Connector.ModelsProvider.getEnterpriseModels")],_ModelsProviderConnector.prototype,"getEnterpriseModels"),__decorateClass$3([hookAsync("Connector.ModelsProvider.getUserCustomModels")],_ModelsProviderConnector.prototype,"getUserCustomModels");let ModelsProviderConnector=_ModelsProviderConnector;var __defProp$9=Object.defineProperty,__getOwnPropDesc$2=Object.getOwnPropertyDescriptor,__defNormalProp$9=(obj,key,value)=>key in obj?__defProp$9(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$2=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$2(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$9(target,key,result),result},__publicField$9=(obj,key,value)=>__defNormalProp$9(obj,typeof key!="symbol"?key+"":key,value);const logger$3=Logger("SmythModelsProvider"),_JSONModelsProvider=class _JSONModelsProvider2 extends ModelsProviderConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$9(this,"name","JSONModelsProvider"),__publicField$9(this,"models"),this.models=JSON.parse(JSON.stringify(models)),typeof this._settings.models=="string")this.initDirWatcher(this._settings.models);else if(typeof this._settings.models=="object")this._settings.mode==="merge"?this.models={...this.models,...this._settings.models}:this.models=this._settings.models,this.started=!0;else{const modelsFolder=this.findModelsFolder();modelsFolder?(this._settings.mode="merge",this.initDirWatcher(modelsFolder)):(logger$3.warn("No models folder found ... falling back to built-in models only"),this.started=!0)}}async start(){super.start()}findModelsFolder(){const _modelsFolder=findSmythPath("models");return fs__default.existsSync(_modelsFolder)?(logger$3.warn("Using default models folder : ",_modelsFolder),_modelsFolder):null}async addModels(acRequest,models2){await this.ready();const validModels=await this.getValidModels(models2)||{};Object.keys(validModels).length>0&&(this.models={...this.models,...validModels})}async getModels(acRequest){return await this.ready(),this.models}async getResourceACL(resourceId,candidate){ConnectorService.getAccountConnector();const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}async reindexModels(dir){try{logger$3.debug(`Reindexing models from directory: ${dir}`);const scannedModels=await this.scanDirectoryForModels(dir);this._settings?.mode==="merge"?this.models={...this.models,...scannedModels}:this.models=scannedModels,_JSONModelsProvider2.localCache.clear(),logger$3.debug(`Successfully reindexed models. Total models: ${Object.keys(this.models).length}`)}catch(error){logger$3.error(`Error reindexing models from directory "${dir}":`,error)}}async scanDirectoryForModels(dir){const scannedModels={};try{const entries=await fs$1.readdir(dir,{withFileTypes:!0});for(const entry of entries){const fullPath=path.join(dir,entry.name);if(entry.isDirectory()){const subDirModels=await this.scanDirectoryForModels(fullPath);Object.assign(scannedModels,subDirModels)}else if(entry.isFile()&&entry.name.endsWith(".json"))try{const fileContent=await fs$1.readFile(fullPath,"utf-8"),modelData=JSON.parse(fileContent),validModels=await this.getValidModels(modelData);Object.assign(scannedModels,validModels)}catch(error){console.error(`Error parsing model data from file "${fullPath}"`),logger$3.warn(`Error parsing model data from file "${fullPath}":`,error.message)}}}catch(error){logger$3.warn(`Error scanning directory "${dir}":`,error)}return scannedModels}async getValidModels(modelData){const validModels={};try{if(modelData.modelId)this.isValidSingleModel(modelData)?(validModels[modelData.modelId]=modelData,logger$3.debug(`Loaded model: ${modelData.modelId}`)):logger$3.warn("Invalid model format",modelData);else if(typeof modelData=="object"&&!Array.isArray(modelData)){let models2="";for(const[modelId,model]of Object.entries(modelData))try{this.isValidSingleModel(model)?(validModels[modelId]=model,models2+=`${modelId} `):logger$3.warn(`Invalid model format for model "${modelId}"`)}catch(error){logger$3.warn(`Error processing model "${modelId}":`,error)}logger$3.debug(`Loaded models: ${models2}`)}else logger$3.warn("Invalid format (not a model or object of models)")}catch(error){logger$3.warn("Error loading model:",error)}return validModels}isValidSingleModel(data){return data&&typeof data=="object"&&typeof data.modelId=="string"&&(data.provider===void 0||typeof data.provider=="string")}isValidModel(data){return this.isValidSingleModel(data)}shouldIgnorePath(filePath,watchedDir,smythPath){const hasDotSegment=/[\\/]\./.test(filePath);if(!hasDotSegment)return!1;if(hasDotSegment&&!smythPath)return!0;const resolvedPath=path.resolve(filePath);if(!(resolvedPath===watchedDir||resolvedPath.startsWith(watchedDir+path.sep)))return!0;const relativePath=path.relative(watchedDir,resolvedPath);return/(^|[\\/])\./.test(relativePath)}initDirWatcher(dir){const stats=fs__default.statSync(dir);if(!stats.isDirectory()&&!stats.isFile()){logger$3.warn(`Path "${dir}" is neither a file nor a directory ... skipping models watcher and falling back to built-in models only`),this.started=!0;return}try{if(!stats.isDirectory()){if(stats.isFile()){const fileContent=fs__default.readFileSync(dir,"utf-8");try{const modelData=JSON.parse(fileContent);this._settings?.mode==="merge"?this.models={...this.models,...modelData}:this.models=modelData}catch(error){console.error(`Error parsing model data from file "${dir}":`),logger$3.warn(`Error parsing model data from file "${dir}":`,error.message)}this.started=!0;return}logger$3.warn(`Path "${dir}" is neither a file nor a directory`);return}}catch(error){logger$3.warn(`Path "${dir}" does not exist or cannot be accessed:`,error.message);return}const debouncedReindex=debounce(this.reindexModels.bind(this,dir),1e3,{leading:!1,maxWait:5e3}),smythPath=process.env.SMYTH_PATH?path.resolve(process.env.SMYTH_PATH):null,watchedDir=path.resolve(dir);chokidar__default.watch(dir,{ignored:filePath=>this.shouldIgnorePath(filePath,watchedDir,smythPath),persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:2e3,pollInterval:100}}).on("add",path2=>{logger$3.debug(`File ${path2} has been added`),debouncedReindex()}).on("change",path2=>{logger$3.debug(`File ${path2} has been changed`),debouncedReindex()}).on("unlink",path2=>{logger$3.debug(`File ${path2} has been removed`),debouncedReindex()}).on("ready",async()=>{logger$3.debug(`Watcher ready. Performing initial scan of ${dir}`),await this.reindexModels(dir),this.started=!0})}};__decorateClass$2([SecureConnector.AccessControl],_JSONModelsProvider.prototype,"addModels"),__decorateClass$2([SecureConnector.AccessControl],_JSONModelsProvider.prototype,"getModels");let JSONModelsProvider=_JSONModelsProvider;class ModelsProviderService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.ModelsProvider,"JSONModelsProvider",JSONModelsProvider)}}class CodeConnector extends SecureConnector{requester(candidate){return{prepare:async(codeUID,input,config2)=>await this.prepare(candidate.readRequest,codeUID,input,config2),deploy:async(codeUID,input,config2)=>await this.deploy(candidate.writeRequest,codeUID,input,config2),execute:async(codeUID,inputs,config2)=>await this.execute(candidate.readRequest,codeUID,inputs,config2),executeDeployment:async(codeUID,deploymentId,inputs,config2)=>await this.executeDeployment(candidate.readRequest,codeUID,deploymentId,inputs,config2),listDeployments:async(codeUID,config2)=>await this.listDeployments(candidate.readRequest,codeUID,config2),getDeployment:async(codeUID,deploymentId,config2)=>await this.getDeployment(candidate.readRequest,codeUID,deploymentId,config2),deleteDeployment:async(codeUID,deploymentId,config2)=>{await this.deleteDeployment(candidate.writeRequest,codeUID,deploymentId,config2)}}}}var __defProp$8=Object.defineProperty,__defNormalProp$8=(obj,key,value)=>key in obj?__defProp$8(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$8=(obj,key,value)=>__defNormalProp$8(obj,typeof key!="symbol"?key+"":key,value);const console$3=Logger("AWSLambda");class AWSLambdaCode extends CodeConnector{constructor(config2){super(config2),__publicField$8(this,"name","AWSLambda"),__publicField$8(this,"awsConfigs"),this.awsConfigs=config2}async prepare(acRequest,codeUID,input,config2){return{prepared:!0,errors:[],warnings:[]}}async deploy(acRequest,codeUID,input,config2){const agentId=acRequest.candidate.id,functionName=getLambdaFunctionName(agentId,codeUID),[isLambdaExists,exisitingCodeHash,currentEnvVariables]=await Promise.all([getDeployedFunction(functionName,this.awsConfigs),getDeployedCodeHash(agentId,codeUID),getCurrentEnvironmentVariables(acRequest.candidate.id,input.code)]),envValues=getSortedObjectValues(currentEnvVariables),codeHash=generateCodeHash(input.code,Object.keys(input.inputs),envValues);if(isLambdaExists&&exisitingCodeHash===codeHash)return{id:functionName,runtime:config2.runtime,createdAt:new Date,status:"deployed"};const baseFolder=`${process.cwd()}/lambda_archives`;fs__default.existsSync(baseFolder)||fs__default.mkdirSync(baseFolder);const directory=`${baseFolder}/${functionName}__${Date.now()}`;try{const{isValid,parameters,error,dependencies}=validateAsyncMainFunction(input.code);if(!isValid)throw new Error(error||"Invalid Code");const lambdaCode=generateLambdaCode(input.code,parameters,currentEnvVariables);fs__default.mkdirSync(directory),fs__default.writeFileSync(path.join(directory,"index.mjs"),lambdaCode),execSync("npm init -y",{cwd:directory}),execSync(`npm install ${dependencies.join(" ")}`,{cwd:directory});const zipFilePath=await zipCode(directory);return await createOrUpdateLambdaFunction(functionName,zipFilePath,this.awsConfigs,currentEnvVariables),await setDeployedCodeHash(agentId,codeUID,codeHash),console$3.debug("Lambda function updated successfully!"),{id:functionName,runtime:config2.runtime,createdAt:new Date,status:"deploying"}}catch(error){throw error}finally{try{fs__default.rmSync(`${directory}`,{recursive:!0,force:!0}),fs__default.unlinkSync(`${directory}.zip`)}catch{}}}async execute(acRequest,codeUID,inputs,config2){try{const agentId=acRequest.candidate.id,functionName=getLambdaFunctionName(agentId,codeUID),lambdaResponse=JSON.parse(await invokeLambdaFunction(functionName,inputs,this.awsConfigs)),executionTime=lambdaResponse.executionTime;return await updateDeployedCodeTTL(agentId,codeUID,cacheTTL),console$3.debug(`Code result:
|
|
238
276
|
${typeof lambdaResponse.result=="object"?JSON.stringify(lambdaResponse.result,null,2):lambdaResponse.result}
|
|
239
277
|
`),console$3.debug(`Execution time: ${executionTime}ms
|
|
240
278
|
`),{output:lambdaResponse.result,executionTime,success:!0}}catch(error){return console$3.error(`Error running code
|
|
@@ -245,5 +283,5 @@ ${error}
|
|
|
245
283
|
const result = await main(${getParametersString(parameters,inputs)});
|
|
246
284
|
return result;
|
|
247
285
|
})();
|
|
248
|
-
`}var __defProp$7=Object.defineProperty,__defNormalProp$7=(obj,key,value)=>key in obj?__defProp$7(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$7=(obj,key,value)=>__defNormalProp$7(obj,typeof key!="symbol"?key+"":key,value);const console$2=Logger("ECMASandbox");class ECMASandbox2 extends CodeConnector{constructor(config2){super(config2),__publicField$7(this,"name","ECMASandbox"),__publicField$7(this,"sandboxUrl"),this.sandboxUrl=config2.sandboxUrl}async prepare(acRequest,codeUID,input,config2){return{prepared:!0,errors:[],warnings:[]}}async deploy(acRequest,codeUID,input,config2){return{id:codeUID,runtime:config2.runtime,createdAt:new Date,status:"Deployed"}}async execute(acRequest,codeUID,inputs,config2){try{const{isValid,error,parameters}=validateAsyncMainFunction(inputs.code);if(!isValid)return{output:void 0,executionTime:0,success:!1,errors:[error]};const executableCode=generateExecutableCode(inputs.code,parameters,inputs.inputs);if(this.sandboxUrl){console$2.debug("Running code in remote sandbox");const executionStartTime=Date.now(),result=await axios.post(this.sandboxUrl,{code:executableCode}).catch(error2=>({error:error2})),executionTime=Date.now()-executionStartTime;if(result.error){const error2=result.error?.response?.data||result.error?.message||result.error.toString()||"Unknown error";return console$2.error(`Error running code: ${JSON.stringify(error2,null,2)}`),{output:void 0,executionTime,success:!1,errors:[error2]}}else return console$2.debug(`Code result: ${result?.data?.Output}`),{output:result.data?.Output,executionTime,success:!0,errors:[]}}else{console$2.debug("Running code in isolated vm");const executionStartTime=Date.now(),result=await runJs(executableCode),executionTime=Date.now()-executionStartTime;return console$2.debug(`Code result: ${result}`),{output:result,executionTime,success:!0,errors:[]}}}catch(error){return console$2.error(`Error running code: ${error}`),{output:void 0,executionTime:0,success:!1,errors:[error]}}}async executeDeployment(acRequest,codeUID,deploymentId,inputs,config2){return await this.execute(acRequest,codeUID,inputs,config2)}async listDeployments(acRequest,codeUID,config2){return[]}async getDeployment(acRequest,codeUID,deploymentId,config2){return null}async deleteDeployment(acRequest,codeUID,deploymentId){}async getResourceACL(resourceId,candidate){const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}class CodeService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Code,"AWSLambda",AWSLambdaCode),ConnectorService.register(TConnectorService.Code,"ECMASandbox",ECMASandbox2)}}var __defProp$6=Object.defineProperty,__defNormalProp$6=(obj,key,value)=>key in obj?__defProp$6(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$6=(obj,key,value)=>__defNormalProp$6(obj,key+"",value);class SchedulerConnector extends SecureConnector{constructor(settings){super(settings),__publicField$6(this,"_eventEmitter"),this._eventEmitter=new EventEmitter$1}requester(candidate){return{list:async()=>await this.list(candidate.readRequest),add:async(jobId,job,schedule)=>{const accountConnector=ConnectorService.getAccountConnector(),agentTeam=await accountConnector.getCandidateTeam(AccessCandidate.agent(job.agentId)),candidateTeam=await accountConnector.getCandidateTeam(candidate);if(agentTeam!==candidateTeam)throw new Error(`Candidate ${candidate.id} is not authorized to schedule a job for agent ${job.agentId}`);await this.add(candidate.writeRequest,jobId,job,schedule)},delete:async jobId=>{await this.delete(candidate.writeRequest,jobId)},get:async jobId=>await this.get(candidate.readRequest,jobId),pause:async jobId=>{await this.pause(candidate.writeRequest,jobId)},resume:async jobId=>{await this.resume(candidate.writeRequest,jobId)},on:(event,listener)=>{this.on(event,listener)},off:(event,listener)=>{this.off(event,listener)}}}constructJobKey(candidate,jobId){return`${candidate.role}_${candidate.id}_${jobId}`}emit(event,...args){return this._eventEmitter.emit(event,...args)}on(event,listener){return this._eventEmitter.on(event,listener),this}off(event,listener){return this._eventEmitter.off(event,listener),this}}var __defProp$5=Object.defineProperty,__getOwnPropDesc$1=Object.getOwnPropertyDescriptor,__defNormalProp$5=(obj,key,value)=>key in obj?__defProp$5(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$1=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$1(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$5(target,key,result),result},__publicField$5=(obj,key,value)=>__defNormalProp$5(obj,typeof key!="symbol"?key+"":key,value);const logger$2=Logger("LocalScheduler"),_LocalScheduler=class _LocalScheduler2 extends SchedulerConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$5(this,"name","LocalScheduler"),__publicField$5(this,"id","local"),__publicField$5(this,"folder"),__publicField$5(this,"jobsPrefix","jobs"),__publicField$5(this,"runtimePrefix",".jobs.runtime"),__publicField$5(this,"isInitialized",!1),__publicField$5(this,"config"),this.config={folder:_settings?.folder||"",runJobs:_settings?.runJobs!==!1,persistExecutionHistory:_settings?.persistExecutionHistory!==!1,maxHistoryEntries:_settings?.maxHistoryEntries||100},this.folder=this.findSchedulerFolder(this.config.folder),this.initialize(),fs__default.existsSync(this.folder)||logger$2.warn(`Invalid folder provided: ${this.folder}`)}findSchedulerFolder(folder){let _schedulerFolder=folder;return _schedulerFolder&&fs__default.existsSync(_schedulerFolder)?_schedulerFolder:(_schedulerFolder=findSmythPath("scheduler"),fs__default.existsSync(_schedulerFolder)?(logger$2.warn("Using alternative scheduler folder found in : ",_schedulerFolder),_schedulerFolder):(logger$2.warn("!!! All attempts to find an existing scheduler folder failed !!!"),logger$2.warn("!!! I will use this folder: ",_schedulerFolder),_schedulerFolder))}async initialize(){const jobsFolderPath=path.join(this.folder,this.jobsPrefix);fs__default.existsSync(jobsFolderPath)||(fs__default.mkdirSync(jobsFolderPath,{recursive:!0}),fs__default.writeFileSync(path.join(jobsFolderPath,"README_IMPORTANT.txt"),"This folder contains scheduler job configurations. Do not delete it."));const runtimeFolderPath=path.join(this.folder,this.runtimePrefix);fs__default.existsSync(runtimeFolderPath)||(fs__default.mkdirSync(runtimeFolderPath,{recursive:!0}),fs__default.writeFileSync(path.join(runtimeFolderPath,"README_IMPORTANT.txt"),"This folder contains scheduler runtime data and execution history. Safe to delete if needed.")),this.config.runJobs&&await this.loadJobsFromDisk(),this.isInitialized=!0,logger$2.info(`LocalScheduler initialized (runJobs: ${this.config.runJobs})`)}getCandidateFolderName(candidate){return`${candidate.id}.${candidate.role}`}getJobFilePath(candidate,jobId,createFoldersIfNotExists=!1){const candidateFolder=this.getCandidateFolderName(candidate),jobFilename=jobId,fullPath=path.join(this.folder,this.jobsPrefix,candidateFolder,`${jobFilename}.json`);if(createFoldersIfNotExists){const folder=path.dirname(fullPath);fs__default.existsSync(folder)||fs__default.mkdirSync(folder,{recursive:!0})}return fullPath}getRuntimeFilePath(candidate,jobId,createFoldersIfNotExists=!1){const candidateFolder=this.getCandidateFolderName(candidate),jobFilename=jobId,fullPath=path.join(this.folder,this.runtimePrefix,candidateFolder,`${jobFilename}.json`);if(createFoldersIfNotExists){const folder=path.dirname(fullPath);fs__default.existsSync(folder)||fs__default.mkdirSync(folder,{recursive:!0})}return fullPath}async loadJobsFromDisk(){try{const jobsFolderPath=path.join(this.folder,this.jobsPrefix);if(!fs__default.existsSync(jobsFolderPath))return;const candidateFolders=fs__default.readdirSync(jobsFolderPath).filter(f=>{const fullPath=path.join(jobsFolderPath,f);return fs__default.statSync(fullPath).isDirectory()});for(const candidateFolder of candidateFolders){const lastDotIndex=candidateFolder.lastIndexOf(".");if(lastDotIndex===-1){logger$2.warn(`Invalid candidate folder format: ${candidateFolder}`);continue}const candidateId=candidateFolder.substring(0,lastDotIndex),candidateRole=candidateFolder.substring(lastDotIndex+1),candidate={id:candidateId,role:candidateRole},candidatePath=path.join(jobsFolderPath,candidateFolder),jobFiles=fs__default.readdirSync(candidatePath).filter(f=>f.endsWith(".json"));for(const file of jobFiles)try{const filePath=path.join(candidatePath,file),data=fs__default.readFileSync(filePath,"utf-8"),jobConfig=JSON.parse(data),runtimeData=await this.loadRuntimeDataFromDisk(candidate,jobConfig.id),jobData={...jobConfig,...runtimeData,candidateRole:candidate.role,candidateId:candidate.id},jobKey=this.constructJobKey(candidate,jobData.id);_LocalScheduler2.jobs.set(jobKey,jobData),jobData.status==="active"&&(logger$2.info(`Job ${jobData.id} loaded from ${candidateFolder} and scheduled for execution`),await this.scheduleJob(jobData))}catch(error){logger$2.warn(`Error loading job file ${file} from ${candidateFolder}:`,error)}}logger$2.info(`Loaded ${_LocalScheduler2.jobs.size} jobs from disk`)}catch(error){logger$2.warn("Error loading jobs from disk",error)}}async saveJobToDisk(candidate,jobData){try{const filePath=this.getJobFilePath(candidate,jobData.id,!0),{executionHistory,lastRun,nextRun,candidateRole,candidateId,createdBy,...configData}=jobData;fs__default.writeFileSync(filePath,JSON.stringify(configData,null,2),"utf-8")}catch(error){throw logger$2.warn(`Error saving job ${jobData.id} to disk`,error),error}}async saveRuntimeDataToDisk(candidate,jobData){try{const filePath=this.getRuntimeFilePath(candidate,jobData.id,!0),runtimeData={executionHistory:jobData.executionHistory||[],lastRun:jobData.lastRun,nextRun:jobData.nextRun};fs__default.writeFileSync(filePath,JSON.stringify(runtimeData,null,2),"utf-8")}catch(error){logger$2.warn(`Error saving runtime data for job ${jobData.id}`,error);return}}async loadRuntimeDataFromDisk(candidate,jobId){try{const filePath=this.getRuntimeFilePath(candidate,jobId);if(!fs__default.existsSync(filePath))return{};const data=fs__default.readFileSync(filePath,"utf-8");return JSON.parse(data)}catch(error){return logger$2.warn(`Error loading runtime data for job ${jobId}`,error),{}}}async deleteJobFromDisk(candidate,jobId){try{const jobFilePath=this.getJobFilePath(candidate,jobId);fs__default.existsSync(jobFilePath)&&fs__default.unlinkSync(jobFilePath);const runtimeFilePath=this.getRuntimeFilePath(candidate,jobId);fs__default.existsSync(runtimeFilePath)&&fs__default.unlinkSync(runtimeFilePath)}catch(error){logger$2.warn(`Error deleting job ${jobId} from disk`,error);return}}async scheduleJob(jobData){if(jobData.status!=="active")return;const validation=Schedule.fromJSON(jobData.schedule).validate();if(!validation.valid)throw logger$2.warn(`Invalid schedule for job ${jobData.id}: ${validation.error}`),new Error(`Invalid schedule for job ${jobData.id}: ${validation.error}`);const jobKey=this.constructJobKey({role:jobData.candidateRole,id:jobData.candidateId},jobData.id),existingTimer=_LocalScheduler2.timers.get(jobKey);if(existingTimer&&(logger$2.info(`Clearing existing timer for job ${jobData.id} (overwriting duplicate schedule)`),clearInterval(existingTimer),_LocalScheduler2.timers.delete(jobKey)),jobData.schedule.interval){const intervalMs=Schedule.parseInterval(jobData.schedule.interval),timer=setInterval(async()=>{await this.executeJob(jobData)},intervalMs);timer.unref(),_LocalScheduler2.timers.set(jobKey,timer)}if(jobData.schedule.cron)throw logger$2.warn(`Cron scheduling not yet implemented for job ${jobData.id}`),new Error(`Cron scheduling not yet implemented for job ${jobData.id}`)}async unscheduleJob(jobKey){const timer=_LocalScheduler2.timers.get(jobKey);timer&&(clearInterval(timer),_LocalScheduler2.timers.delete(jobKey))}async executeJob(jobData){if(!jobData.jobConfig){logger$2.warn(`Skipping execution of job ${jobData.id}: job configuration not available.`);return}const schedule=Schedule.fromJSON(jobData.schedule);if(!schedule.shouldRun()){logger$2.info(`Job ${jobData.id} skipped - outside schedule window`);return}const job=Job.fromJSON(jobData.jobConfig);logger$2.debug(`Executing job ${jobData.id} with metadata:`,JSON.stringify(jobData.jobConfig.metadata));const owner=jobData.createdBy;this.emit("executing",{id:jobData.id,job,owner});const result=await job.executeWithRetry();this.emit("executed",{id:jobData.id,job,owner,result}),jobData.lastRun=new Date().toISOString();const nextRun=schedule.calculateNextRun(new Date(jobData.lastRun));jobData.nextRun=nextRun?nextRun.toISOString():void 0,result.success||logger$2.warn(`Job ${jobData.id} failed:`,result.error?.message),this.config.persistExecutionHistory&&(jobData.executionHistory||(jobData.executionHistory=[]),jobData.executionHistory.unshift({timestamp:new Date().toISOString(),success:result.success,error:result.error?.message,executionTime:result.executionTime,retries:result.retries}),jobData.executionHistory.length>this.config.maxHistoryEntries&&(jobData.executionHistory=jobData.executionHistory.slice(0,this.config.maxHistoryEntries)));const candidate={role:jobData.candidateRole,id:jobData.candidateId};await this.saveJobToDisk(candidate,jobData),this.config.persistExecutionHistory&&await this.saveRuntimeDataToDisk(candidate,jobData)}async getResourceACL(resourceId,candidate){this.isInitialized||await this.initialize();const accountConnector=ConnectorService.getAccountConnector(),teamId=await accountConnector.getCandidateTeam(candidate),jobKey=this.constructJobKey(candidate,resourceId),jobData=_LocalScheduler2.jobs.get(jobKey),jobAgentTeamId=jobData?.jobConfig?.agentId?await accountConnector.getCandidateTeam(AccessCandidate.agent(jobData?.jobConfig?.agentId)):null;return jobAgentTeamId&&teamId!==jobAgentTeamId?new ACL:jobData?ACL.from(jobData.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async list(acRequest){this.isInitialized||await this.initialize();const result=[];for(const[key,jobData]of _LocalScheduler2.jobs)if(jobData.candidateRole===acRequest.candidate.role&&jobData.candidateId===acRequest.candidate.id){const{candidateRole,candidateId,...serializableData}=jobData;result.push(serializableData)}return result}async add(acRequest,jobId,job,schedule){this.isInitialized||await this.initialize();const validation=schedule.validate();if(!validation.valid){logger$2.warn(`Invalid schedule: ${validation.error}`);return}const jobKey=this.constructJobKey(acRequest.candidate,jobId),existingJob=_LocalScheduler2.jobs.get(jobKey);let acl;existingJob?acl=ACL.from(existingJob.acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner):acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner);const nextRun=schedule.calculateNextRun(),jobData={id:jobId,schedule:schedule.toJSON(),jobConfig:job.toJSON(),acl:acl.ACL,status:"active",nextRun:nextRun?nextRun.toISOString():void 0,createdBy:{role:acRequest.candidate.role,id:acRequest.candidate.id},candidateRole:acRequest.candidate.role,candidateId:acRequest.candidate.id,executionHistory:existingJob?.executionHistory||[]};existingJob&&await this.unscheduleJob(jobKey),_LocalScheduler2.jobs.set(jobKey,jobData),await this.saveJobToDisk(acRequest.candidate,jobData),this.config.runJobs&&await this.scheduleJob(jobData),logger$2.info(`Job ${jobId} added successfully`)}async delete(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId);if(!_LocalScheduler2.jobs.get(jobKey)){logger$2.warn(`Job ${jobId} not found`);return}await this.unscheduleJob(jobKey),_LocalScheduler2.jobs.delete(jobKey),await this.deleteJobFromDisk(acRequest.candidate,jobId),logger$2.info(`Job ${jobId} deleted successfully`)}async get(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId),jobData=_LocalScheduler2.jobs.get(jobKey);if(!jobData)return;const{candidateRole,candidateId,...serializableData}=jobData;return serializableData}async pause(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId),jobData=_LocalScheduler2.jobs.get(jobKey);if(!jobData){logger$2.warn(`Job ${jobId} not found`);return}jobData.status!=="paused"&&(await this.unscheduleJob(jobKey),jobData.status="paused",await this.saveJobToDisk(acRequest.candidate,jobData),logger$2.info(`Job ${jobId} paused`))}async resume(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId),jobData=_LocalScheduler2.jobs.get(jobKey);if(!jobData){logger$2.warn(`Job ${jobId} not found`);return}jobData.status==="paused"&&(jobData.status="active",await this.saveJobToDisk(acRequest.candidate,jobData),this.config.runJobs&&await this.scheduleJob(jobData),logger$2.info(`Job ${jobId} resumed`))}async shutdown(){logger$2.info("Shutting down LocalScheduler...");const timerCount=_LocalScheduler2.timers.size;for(const[jobKey,timer]of _LocalScheduler2.timers)clearInterval(timer);_LocalScheduler2.timers.clear(),logger$2.info(`LocalScheduler shutdown complete (cleared ${timerCount} timers)`)}};__publicField$5(_LocalScheduler,"jobs",new Map),__publicField$5(_LocalScheduler,"timers",new Map),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"list"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"add"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"delete"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"get"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"pause"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"resume");let LocalScheduler=_LocalScheduler;class SchedulerService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Scheduler,"LocalScheduler",LocalScheduler)}}class TelemetryConnector extends SecureConnector{constructor(){super()}requester(candidate){return{}}}var __defProp$4=Object.defineProperty,__defNormalProp$4=(obj,key,value)=>key in obj?__defProp$4(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$4=(obj,key,value)=>__defNormalProp$4(obj,key+"",value);class OTelContextRegistry{static key(agentId,processId){return`${agentId}:${processId}`}static startProcess(agentId,processId,span){this.registry.set(this.key(agentId,processId),{agentId,processId,rootSpan:span})}static get(agentId,processId){return this.registry.get(this.key(agentId,processId))}static update(agentId,processId,ctx){const key=this.key(agentId,processId),current=this.registry.get(key);current&&this.registry.set(key,{...current,...ctx})}static endProcess(agentId,processId){this.registry.delete(this.key(agentId,processId))}}__publicField$4(OTelContextRegistry,"registry",new Map);var __defProp$3=Object.defineProperty,__defNormalProp$3=(obj,key,value)=>key in obj?__defProp$3(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$3=(obj,key,value)=>__defNormalProp$3(obj,typeof key!="symbol"?key+"":key,value);const outputLogger=Logger("OTelLog");class OTel extends TelemetryConnector{constructor(_settings){super(),this._settings=_settings,__publicField$3(this,"name","OTel"),__publicField$3(this,"id"),__publicField$3(this,"tracer"),__publicField$3(this,"logger"),__publicField$3(this,"tracerProvider"),__publicField$3(this,"loggerProvider"),outputLogger.log("Initializing Tracer ...");const traceExporter=new OTLPTraceExporter({url:`${_settings.endpoint}/v1/traces`,headers:_settings.headers}),spanProcessor=new BatchSpanProcessor(traceExporter),resource=resourceFromAttributes({[ATTR_SERVICE_NAME]:_settings.serviceName||"smythos",[ATTR_SERVICE_VERSION]:_settings.serviceVersion||"1.0.0"});this.tracerProvider=new NodeTracerProvider({resource,spanProcessors:[spanProcessor]}),this.tracerProvider.register(),outputLogger.log("Initializing Log Exporter ...");const logExporter=new OTLPLogExporter({url:`${_settings.endpoint}/v1/logs`,headers:_settings.headers}),logProcessor=new BatchLogRecordProcessor(logExporter);this.loggerProvider=new LoggerProvider({resource,processors:[logProcessor]}),logs.setGlobalLoggerProvider(this.loggerProvider),this.tracer=trace.getTracer("smythos.agent"),this.logger=logs.getLogger("smythos.agent"),this.id=`otel-${_settings.endpoint}`,this.setupHooks()}async stop(){outputLogger.log(`Stopping ${this.name} connector ...`),await this.tracerProvider.forceFlush?.().catch(error=>{outputLogger.error("Error forcing flush of tracer provider",error)}),await this.tracerProvider.shutdown?.().catch(error=>{outputLogger.error("Error shutting down tracer provider",error)}),await this.loggerProvider.forceFlush().catch(error=>{outputLogger.error("Error forcing flush of logger provider",error)}),await this.loggerProvider.shutdown().catch(error=>{outputLogger.error("Error shutting down logger provider",error)})}redactSensitiveData(data,redactFields){if(!redactFields||redactFields.length===0||typeof data!="object"||data===null)return data;const redacted=Array.isArray(data)?[...data]:{...data};for(const key in redacted)redactFields.some(field=>key.toLowerCase().includes(field.toLowerCase()))?redacted[key]="[REDACTED]":typeof redacted[key]=="object"&&redacted[key]!==null&&(redacted[key]=this.redactSensitiveData(redacted[key],redactFields));return redacted}formatOutputForLog(output,isError=!1){const config2=this._settings,maxSize=config2.maxOutputSize??10*1024;if((config2.fullOutputOnErrorOnly??!1)&&!isError)return;const redacted=this.redactSensitiveData(output,config2.redactFields),outputStr=JSON.stringify(redacted);return outputStr&&outputStr.length>maxSize?`${outputStr.substring(0,maxSize)}...[TRUNCATED: ${outputStr.length} bytes, limit: ${maxSize} bytes]`:outputStr}getResourceACL(resourceId,candidate){return Promise.resolve(new ACL)}log(acRequest,logData,callId){return Promise.resolve()}logTask(acRequest,tasks,isUsingTestDomain){return Promise.resolve()}prepareComponentData(data,prefix,maxEntryLength=200){const result={};for(let key in data)result[prefix?`${prefix}.${key}`:key]=(typeof data[key]=="object"?JSON.stringify(data[key]):data[key].toString()).substring(0,maxEntryLength);return result}setupHooks(){const tracer=this.tracer,logger2=this.logger,oTelInstance=this,createToolInfoHandler=function(hookContext){return function(toolInfo){if(!hookContext.curLLMGenSpan||!hookContext.convSpan)return;const modelId=toolInfo.model,lastContext=toolInfo.contextWindow.filter(context2=>context2.role==="user").slice(-2),toolNames=toolInfo.map(tool=>tool.name+"("+tool.arguments+")");hookContext.curLLMGenSpan.addEvent("llm.gen.tool.calls",{"tool.calls":toolNames.join(", "),"llm.model":modelId||"unknown","context.preview":JSON.stringify(lastContext).substring(0,200)});const spanContext=trace.setSpan(context.active(),hookContext.curLLMGenSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`LLM tool calls: ${toolNames.join(", ")}`,attributes:{"agent.id":hookContext.agentId,"conv.id":hookContext.processId,"llm.model":modelId||"unknown","context.preview":JSON.stringify(lastContext).substring(0,5e3)}})}),hookContext.curLLMGenSpan.end(),delete hookContext.curLLMGenSpan}},createDataHandler=function(hookContext){return function(data,reqInfo){if(!hookContext.convSpan||hookContext.curLLMGenSpan)return;const modelId=reqInfo.model,lastContext=reqInfo.contextWindow.filter(context2=>context2.role==="user").slice(-2);if(hookContext?.latencySpans?.[reqInfo.requestId]){const ttfbSpan=hookContext.latencySpans[reqInfo.requestId];ttfbSpan.addEvent("llm.first.byte.received",{"request.id":reqInfo.requestId,"data.size":JSON.stringify(data||{}).length,"llm.model":modelId||"unknown"}),ttfbSpan.setStatus({code:SpanStatusCode.OK}),ttfbSpan.end(),delete hookContext.latencySpans[reqInfo.requestId]}const llmGenSpan=tracer.startSpan("Conv.GenAI",{attributes:{"agent.id":hookContext.agentId,"conv.id":hookContext.processId,"llm.model":modelId||"unknown"}},trace.setSpan(context.active(),hookContext.convSpan));llmGenSpan.addEvent("llm.gen.started",{"request.id":reqInfo.requestId,timestamp:Date.now(),"llm.model":modelId||"unknown","context.preview":JSON.stringify(lastContext).substring(0,200)}),hookContext.curLLMGenSpan=llmGenSpan}},createRequestedHandler=function(hookContext){return function(reqInfo){if(!hookContext.convSpan)return;hookContext.latencySpans||(hookContext.latencySpans={});const lastContext=reqInfo.contextWindow.filter(context2=>context2.role==="user").slice(-2),modelId=reqInfo.model,llmGenLatencySpan=tracer.startSpan("Conv.GenAI.TTFB",{attributes:{"agent.id":hookContext.agentId,"conv.id":hookContext.processId,"request.id":reqInfo.requestId,"llm.model":modelId||"unknown","metric.type":"ttfb"}},trace.setSpan(context.active(),hookContext.convSpan));llmGenLatencySpan.addEvent("llm.requested",{"request.id":reqInfo.requestId,timestamp:Date.now(),"context.preview":JSON.stringify(lastContext).substring(0,200)}),hookContext.latencySpans[reqInfo.requestId]=llmGenLatencySpan}};return HookService.register("Conversation.streamPrompt",async function(additionalContext,args){const conversation=this.instance,processId=conversation.id,agentId=conversation.agentId,message=typeof args=="object"?args?.message:args||null,hookContext=this.context;if(message==null)return;const modelId=typeof conversation?.model=="string"?conversation?.model:conversation?.model?.modelId,convSpan=tracer.startSpan("Agent.Conv",{attributes:{"gen_ai.operation.name":"chat","gen_ai.provider.name":conversation?.llmInference?.llmProviderName||"unknown","gen_ai.conversation.id":processId,"gen_ai.request.model":modelId||"unknown","agent.id":agentId,"conv.id":processId,"llm.model":modelId||"unknown"}});hookContext.convSpan=convSpan,hookContext.dataHandler=createDataHandler(hookContext),conversation.on(TLLMEvent.Data,hookContext.dataHandler),hookContext.requestedHandler=createRequestedHandler(hookContext),conversation.on(TLLMEvent.Requested,hookContext.requestedHandler),hookContext.agentId=agentId,hookContext.processId=processId,hookContext.toolInfoHandler=createToolInfoHandler(hookContext),conversation.on(TLLMEvent.ToolInfo,hookContext.toolInfoHandler),convSpan.addEvent("skill.process.started",{"input.size":JSON.stringify(message||{}).length,"input.preview":message.substring(0,200),"llm.model":modelId||"unknown"}),OTelContextRegistry.startProcess(agentId,processId,convSpan);const spanCtx=convSpan.spanContext(),spanContext=trace.setSpan(context.active(),convSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Conversation.streamPrompt started: ${processId}`,attributes:{trace_id:spanCtx.traceId,span_id:spanCtx.spanId,trace_flags:spanCtx.traceFlags,"agent.id":agentId,"conv.id":processId,"input.size":JSON.stringify(message||{}).length,"input.preview":message.substring(0,2e3)}})})},THook.NonBlocking),HookService.registerAfter("Conversation.streamPrompt",async function({result,args,error}){const conversation=this.instance,processId=conversation.id,agentId=conversation.agentId,message=typeof args?.[0]=="object"?args?.[0]?.message:args?.[0]||null,hookContext=this.context;if(message==null)return;const ctx=OTelContextRegistry.get(agentId,processId);if(!ctx)return;hookContext.curLLMGenSpan&&(hookContext.curLLMGenSpan.addEvent("llm.gen.content",{"content.size":JSON.stringify(result||{}).length,"content.preview":result.substring(0,200)}),hookContext.curLLMGenSpan.end(),hookContext.toolInfoHandler&&conversation.off(TLLMEvent.ToolInfo,hookContext.toolInfoHandler),hookContext.dataHandler&&conversation.off(TLLMEvent.Data,hookContext.dataHandler),hookContext.requestedHandler&&conversation.off(TLLMEvent.Requested,hookContext.requestedHandler));const{rootSpan:convSpan}=ctx;convSpan.spanContext();const spanContext=trace.setSpan(context.active(),convSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Conversation.streamPrompt completed: ${processId}`,attributes:{"agent.id":agentId,"conv.id":processId,"output.size":JSON.stringify(result||{}).length,"output.preview":result.substring(0,2e3)}})}),convSpan.end(),OTelContextRegistry.endProcess(agentId,processId)},THook.NonBlocking),HookService.register("SREAgent.process",async function(endpointPath,inputData){const agent=this.instance,agentProcessId=agent.agentRuntime.processID,conversationId=agent.conversationId||agent.agentRequest?.header("X-CONVERSATION-ID"),processId=agentProcessId.split(":").shift(),agentId=agent.id,agentRequest=agent.agentRequest,teamId=agent.teamId,_hookContext=this.context,body=oTelInstance.prepareComponentData(agentRequest.body||{}),query=oTelInstance.prepareComponentData(agentRequest.query||{}),headers=oTelInstance.prepareComponentData(agentRequest.headers||{}),agentInput=oTelInstance.prepareComponentData(inputData||{}),input={body,query,headers,processInput:agentInput};let convSpan;const ctx=OTelContextRegistry.get(agentId,processId)||OTelContextRegistry.get(agentId,conversationId);ctx&&(convSpan=ctx.rootSpan,_hookContext.otelSpan=convSpan);const agentSpan=tracer.startSpan("Agent.Skill",{attributes:{"agent.id":agentId,"team.id":teamId,"process.id":agentProcessId}},convSpan?trace.setSpan(context.active(),convSpan):void 0),inputPreview=JSON.stringify(input||{}).substring(0,200);agentSpan.addEvent("skill.process.started",{endpoint:endpointPath,"input.size":JSON.stringify(input||{}).length,"input.preview":inputPreview}),OTelContextRegistry.startProcess(agentId,agentProcessId,agentSpan);const spanCtx=agentSpan.spanContext(),spanContext=trace.setSpan(context.active(),agentSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Agent Skill process started: ${processId}`,attributes:{trace_id:spanCtx.traceId,span_id:spanCtx.spanId,trace_flags:spanCtx.traceFlags,agentId,processId:agentProcessId,input:agentInput,body,query,headers}})})},THook.NonBlocking),HookService.registerAfter("SREAgent.process",async function({result,error}){const agent=this.instance,agentProcessId=agent.agentRuntime.processID,agentId=agent.id;this.context;const ctx=OTelContextRegistry.get(agentId,agentProcessId);if(!ctx)return;const agentSpan=ctx.rootSpan;if(!agentSpan)return;error?(agentSpan.recordException(error),agentSpan.setStatus({code:SpanStatusCode.ERROR,message:error.message}),agentSpan.addEvent("skill.process.error",{"error.message":error.message})):(agentSpan.setStatus({code:SpanStatusCode.OK}),agentSpan.addEvent("skill.process.completed",{"output.size":JSON.stringify(result||{}).length}),agentSpan.setAttributes({"output.size":JSON.stringify(result||{}).length}));const outputForLog=oTelInstance.formatOutputForLog(result,!!error),spanCtx=agentSpan.spanContext(),logAttributes={trace_id:spanCtx.traceId,span_id:spanCtx.spanId,trace_flags:spanCtx.traceFlags,agentId,processId:agentProcessId,hasError:!!error,"error.message":error?.message,"error.stack":error?.stack};outputForLog!==void 0&&(logAttributes["agent.output"]=outputForLog);const spanContext=trace.setSpan(context.active(),agentSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:error?SeverityNumber.ERROR:SeverityNumber.INFO,severityText:error?"ERROR":"INFO",body:`Agent process ${error?"failed":"completed"}: ${agentProcessId}`,attributes:logAttributes})}),agentSpan.end(),OTelContextRegistry.endProcess(agentId,agentProcessId)},THook.NonBlocking),HookService.register("Component.process",async function(input,settings,agent){const processId=agent.agentRuntime.processID,agentId=agent.id;this.instance;const componentId=settings.id||"unknown",componentType=settings.name,componentName=settings.displayName||settings.name,eventId=settings.eventId,parentSpan=OTelContextRegistry.get(agentId,processId)?.rootSpan,compSettingsData=oTelInstance.prepareComponentData(settings?.data||{},"cmp.settings"),spanName=`Component.${componentType}`,span=tracer.startSpan(spanName,{attributes:{"agent.id":agentId,"process.id":processId,"event.id":eventId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,...compSettingsData}},parentSpan?trace.setSpan(context.active(),parentSpan):void 0);JSON.stringify(input||{});const compInputData=oTelInstance.prepareComponentData(input||{});span.addEvent("cmp.call",{"event.id":eventId,"cmp.input.size":JSON.stringify(input||{}).length,"cmp.input":JSON.stringify(compInputData)});const spanContext=trace.setSpan(context.active(),span);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Component ${componentType} started`,attributes:{"agent.id":agentId,"process.id":processId,"event.id":eventId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,"cmp.input":input}})}),this.context.otelSpan=span},THook.NonBlocking),HookService.registerAfter("Component.process",async function({result,error,args}){const span=this.context.otelSpan;if(!span)return;const agent=args[2],settings=args[1],eventId=settings.eventId,processId=agent.agentRuntime.processID,agentId=agent.id;this.instance;const componentId=settings.id||"unknown",componentType=settings.name,componentName=settings.displayName||settings.name;if(error){span.recordException(error),span.setStatus({code:SpanStatusCode.ERROR,message:error.message}),span.addEvent("cmp.call.error",{"event.id":eventId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,"error.type":error.name,"error.message":error.message,"error.stack":error.stack?.substring(0,500)});const spanContext=trace.setSpan(context.active(),span);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.ERROR,severityText:"ERROR",body:`Component ${componentType} (${componentId}) failed: ${error.message}`,attributes:{"agent.id":agentId,"process.id":processId,"event.id":eventId,"cmp.id":componentId,"cmp.name":componentName,"cmp.type":componentType,"error.type":error.name,"error.message":error.message,"error.stack":error.stack}})})}else{span.setStatus({code:SpanStatusCode.OK});const resultStr=JSON.stringify(result||{});span.addEvent("cmp.call.result",{"output.size":resultStr.length,"output.preview":resultStr.substring(0,200)}),span.setAttributes({"output.size":JSON.stringify(result||{}).length,"output.has_error":!!result?._error}),oTelInstance.formatOutputForLog(result,!1);const logAttributes={"agent.id":agentId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,"process.id":processId,"event.id":eventId,"cmp.output":result},spanContext=trace.setSpan(context.active(),span);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Component ${componentType} (${componentId}) completed successfully`,attributes:logAttributes})})}span.end()},THook.NonBlocking),Promise.resolve()}}class TelemetryService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Telemetry,"OTel",OTel)}}const console$1=Logger("Boot");let _booted=!1;function boot(){if(_booted){console$1.warn("SRE already booted");return}_booted=!0,SystemEvents.emit("SRE:BootStart"),console$1.debug("SRE Boot sequence started");const service={};service.NKV=new NKVService,service.Account=new AccountService,service.Vault=new VaultService,service.ManagedVault=new ManagedVaultService,service.Cache=new CacheService,service.Storage=new StorageService,service.ModelsProvider=new ModelsProviderService,service.LLM=new LLMService,service.AgentData=new AgentDataService,service.CLI=new CLIService,service.VectorDB=new VectorDBService,service.Router=new RouterService,service.Log=new LogService,service.Component=new ComponentService,service.Code=new CodeService,service.Scheduler=new SchedulerService,service.Telemetry=new TelemetryService,SystemEvents.on("SRE:Initialized",()=>{console$1.debug("SRE Initialized");for(let key in service)service[key].init();SystemEvents.emit("SRE:Booted",service),console$1.debug("SRE Boot sequence completed")})}function generateServiceKey(serviceName){const secret=process.env.SRE_SECRET;if(!secret||secret.trim().length<32)throw new Error("SRE_SECRET must be at least 32 characters");return createHmac("sha256",secret).update(`sre-service:${serviceName}`).digest("hex")}function validateServiceKey(serviceName,providedKey){try{const expectedKey=generateServiceKey(serviceName);return timingSafeEqual(Buffer.from(expectedKey),Buffer.from(providedKey))}catch{return!1}}var __defProp$2=Object.defineProperty,__defNormalProp$2=(obj,key,value)=>key in obj?__defProp$2(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$2=(obj,key,value)=>__defNormalProp$2(obj,typeof key!="symbol"?key+"":key,value);const logger$1=Logger("ExternalEventsReceiver");class ExternalEventsReceiver{constructor(config2){if(__publicField$2(this,"server",null),__publicField$2(this,"wss",null),__publicField$2(this,"config"),__publicField$2(this,"isRunning",!1),this.config={enableHttp:!0,enableWebSocket:!0,path:"/ws",...config2},!this.config.authTokens||this.config.authTokens.length===0)throw logger$1.warn("At least one authentication token must be provided"),new Error("At least one authentication token must be provided")}async start(){if(this.isRunning){logger$1.warn("Server is already running");return}return this.server=createServer((req,res)=>this.handleHttpRequest(req,res)),this.config.enableWebSocket&&(this.wss=new WebSocketServer({server:this.server,path:this.config.path}),this.wss.on("connection",(ws,req)=>{this.handleWebSocketConnection(ws,req)})),new Promise((resolve,reject)=>{this.server.listen(this.config.port,"127.0.0.1",()=>{this.isRunning=!0,logger$1.debug(`Server started on port ${this.config.port}`+(this.config.enableHttp?" [HTTP]":"")+(this.config.enableWebSocket?` [WebSocket: ${this.config.path}]`:"")),resolve()}),this.server.on("error",error=>{logger$1.error("Server error",error),reject(error)})})}async stop(){if(this.isRunning)return new Promise((resolve,reject)=>{this.wss&&this.wss.close(err=>{err&&logger$1.error("Error closing WebSocket server",err)}),this.server?this.server.close(err=>{err?(logger$1.error("Error closing HTTP server",err),reject(err)):(this.isRunning=!1,logger$1.debug("Server stopped"),resolve())}):resolve()})}handleHttpRequest(req,res){if(!this.config.enableHttp){this.sendResponse(res,404,{error:"HTTP endpoint is disabled"});return}if(req.method!=="POST"){this.sendResponse(res,405,{error:"Method not allowed. Only POST requests are accepted."});return}const authResult=this.validateAuth(req.headers);if(!authResult.valid){this.sendResponse(res,401,{error:authResult.error});return}const connectorName=this.getConnectorName(req.headers);if(!connectorName){this.sendResponse(res,400,{error:"Missing x-connector-name header"});return}let body="";req.on("data",chunk=>{body+=chunk.toString()}),req.on("end",()=>{try{const data=body?JSON.parse(body):{};this.emitExternalEvent(connectorName,data),this.sendResponse(res,200,{success:!0,message:`Event EXT:${connectorName} emitted successfully`})}catch(error){logger$1.error("Error processing HTTP request",error),this.sendResponse(res,400,{error:"Invalid JSON payload"})}}),req.on("error",error=>{logger$1.error("HTTP request error",error),this.sendResponse(res,500,{error:"Internal server error"})})}handleWebSocketConnection(ws,req){logger$1.debug("New WebSocket connection");const authResult=this.validateAuth(req.headers);if(!authResult.valid){ws.close(1008,authResult.error);return}let connectorName=this.getConnectorName(req.headers);ws.on("message",message=>{try{const data=JSON.parse(message.toString());if(!connectorName&&(connectorName=data.connectorName||data["x-connector-name"],!connectorName)){ws.send(JSON.stringify({error:"Missing connector name in headers or message"}));return}this.emitExternalEvent(connectorName,data),ws.send(JSON.stringify({success:!0,message:`Event EXT:${connectorName} emitted successfully`}))}catch(error){logger$1.error("Error processing WebSocket message",error),ws.send(JSON.stringify({error:"Invalid JSON message"}))}}),ws.on("error",error=>{logger$1.error("WebSocket error",error)}),ws.on("close",()=>{logger$1.debug("WebSocket connection closed")})}validateAuth(headers){const authHeader=headers.authorization||headers.Authorization,serviceName=headers["x-service-name"]||headers["X-Service-Name"];if(!authHeader)return logger$1.warn("Missing Authorization header"),{valid:!1,error:"Missing Authorization header"};if(!serviceName||typeof serviceName!="string")return logger$1.warn("Missing or invalid X-Service-Name header"),{valid:!1,error:"Missing X-Service-Name header"};const token=authHeader.replace(/^Bearer\s+/i,"");return token?validateServiceKey(serviceName,token)?(logger$1.debug(`Authenticated service: ${serviceName}`),{valid:!0,serviceName}):(logger$1.warn(`Invalid key for service: ${serviceName}`),{valid:!1,error:"Invalid authentication"}):{valid:!1,error:"Invalid Authorization header format"}}getConnectorName(headers){const connectorName=headers["x-connector-name"]||headers["X-Connector-Name"];return typeof connectorName=="string"?connectorName:connectorName?.[0]||null}emitExternalEvent(connectorName,data){const eventName=`EXT:${connectorName}`,connector=ConnectorService.getInstance(TConnectorService[connectorName]);connector&&connector.handleEvent(eventName,data)}sendResponse(res,statusCode,body){res.statusCode=statusCode,res.setHeader("Content-Type","application/json"),res.end(JSON.stringify(body))}getStatus(){return{running:this.isRunning,port:this.config.port,config:this.config}}}var __defProp$1=Object.defineProperty,__defNormalProp$1=(obj,key,value)=>key in obj?__defProp$1(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1=(obj,key,value)=>__defNormalProp$1(obj,typeof key!="symbol"?key+"":key,value);const logger=Logger("SRE"),_SmythRuntime=class _SmythRuntime2{constructor(){__publicField$1(this,"started",!1),__publicField$1(this,"_smythDir"),__publicField$1(this,"_readyPromise"),__publicField$1(this,"_readyResolve"),__publicField$1(this,"defaultConfig",{Vault:{Connector:"JSONFileVault",Settings:{shared:"default"}},Account:{Connector:"DummyAccount"},Cache:{Connector:"RAM"},Storage:{Connector:"LocalStorage"},Code:{Connector:"DummyConnector"},NKV:{Connector:"LocalStorage"},VectorDB:{Connector:"RAMVec"},ModelsProvider:{Connector:"JSONModelsProvider"},AgentData:{Connector:"NullAgentData"},Component:{Connector:"LocalComponent"},ManagedVault:{Connector:"NullManagedVault"},Log:{Connector:"ConsoleLog"},Router:{Connector:"NullRouter"},Scheduler:{Connector:"LocalScheduler",Settings:{runJobs:!0,persistExecutionHistory:!0}}}),__publicField$1(this,"connectors",{}),__publicField$1(this,"connectorInstances",{}),__publicField$1(this,"_initializing",!1),__publicField$1(this,"_initialized",!1),__publicField$1(this,"_stopping",!1),this.started=!0,this._readyPromise=new Promise(resolve=>{this._readyResolve=resolve})}get smythDir(){return this._smythDir}get version(){return pkg.version}static get Instance(){return _SmythRuntime2.instance||(_SmythRuntime2.instance=new _SmythRuntime2),_SmythRuntime2.instance}get initializing(){return this._initializing}init(_config){if(logger.info(`SRE v${this.version} initializing...`),this._initialized)return console.warn("SRE already initialized ... skipping"),_SmythRuntime2.Instance;if(this._initializing)return console.warn("You tried to initialize SRE while it is already initializing ... skipping"),_SmythRuntime2.Instance;(!_config||JSON.stringify(_config)==="{}")&&(this._smythDir=findSmythPath(),logger.info(".smyth directory found in:",this._smythDir)),this._initializing=!0,SystemEvents.on("SRE:Booted",()=>{this._readyResolve(!0)}),boot();const config2=this.autoConf(_config);for(let connectorType in config2)for(let configEntry of config2[connectorType])ConnectorService.init(connectorType,configEntry.Connector,configEntry.Id,configEntry.Settings,configEntry.Default)||logger.warn(`Failed to initialize connector ${connectorType}:${configEntry.Id||configEntry.Connector}`);return this._initialized=!0,SystemEvents.emit("SRE:Initialized",_SmythRuntime2.Instance),this.setupShutdownHandlers(),_SmythRuntime2.Instance}autoConf(config2={}){const defaultConfig=JSON.parse(JSON.stringify(this.defaultConfig)),keys=Object.keys({...defaultConfig,...config2}),newConfig={};for(let connectorType of keys){newConfig[connectorType]=[];let entry=config2[connectorType]||defaultConfig[connectorType];Array.isArray(entry)||(entry=[entry]);let hasDefault=!1;for(let connector of entry){if(!connector.Connector){logger.warn(`Missing Connector Name in ${connectorType} entry ... it will be ignored`);continue}connector.Default&&(hasDefault&&logger.warn(`Entry ${connectorType} has more than one default Connector ... only the first one will be used`),hasDefault=!0),newConfig[connectorType].push(connector)}!hasDefault&&newConfig[connectorType].length>0&&(newConfig[connectorType][0].Default=!0)}return newConfig}ready(){return this._readyPromise}async _stop(){this._stopping||(this._stopping=!0,logger.info("Sending Shutdown Signals To All Subsystems..."),await ConnectorService._stop(),this.started=!1)}setupShutdownHandlers(){["SIGINT","SIGTERM"].forEach(signal=>{process.on(signal,async()=>{await shutdown(signal),process.exit(0)})}),process.on("beforeExit",code=>{shutdown("beforeExit")}),process.on("exit",code=>{logger.info("Goodbye!")})}};__publicField$1(_SmythRuntime,"instance");let SmythRuntime=_SmythRuntime;const SRE=SmythRuntime.Instance;let shuttingDown=!1;async function shutdown(reason){if(SmythRuntime.Instance.started&&!shuttingDown&&(shuttingDown=!0,logger.info(`Caught ${reason} ... Attempting graceful shutdown`),SmythRuntime.Instance))try{await SmythRuntime.Instance._stop()}catch(err){logger.error("Shutdown error:",err)}}class SmythURI{static agent(id){return`smyth:agent:${id}`}}class LLMMemoryConnector extends SecureConnector{requester(candidate){return{load:async messages=>await this.load(candidate.readRequest,messages)}}}var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp(target,key,result),result},__publicField=(obj,key,value)=>__defNormalProp(obj,key+"",value);Logger("HashicorpVault");class HashicorpVault extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField(this,"name","HashicorpVault")}async get(acRequest,keyId){return null}async exists(acRequest,keyId){return!1}async listKeys(acRequest){return[]}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),acl}}__decorateClass([SecureConnector.AccessControl],HashicorpVault.prototype,"get"),__decorateClass([SecureConnector.AccessControl],HashicorpVault.prototype,"exists"),__decorateClass([SecureConnector.AccessControl],HashicorpVault.prototype,"listKeys");export{ACL,ACLAccessDeniedError,APICall,APIEndpoint,APIKeySource,APIOutput,AWSLambdaCode,AccessCandidate,AccessRequest,AccountConnector,AccountService,Agent,AgentDataConnector,AgentDataService,AgentLogger,AgentPlugin,AgentProcess,AgentRequest,AgentRuntime,AgentSSE,AgentSettings,AnthropicConnector,Async,Await,BUILT_IN_MODEL_PREFIX,BaseEmbedding,BedrockConnector,BinaryInput,BuiltinLLMProviders,CLIAgentDataConnector,CLIConnector,CLIService,COMP_NAMES,CacheConnector,CacheService,Classifier,CodeConnector,CodeService,Component,ComponentConnector,ComponentHost,ComponentInputType,ComponentInstances,ComponentService,Connector,ConnectorService,ConnectorServiceProvider,ConsoleLog,Conversation,Credentials,DEFAULT_MAX_TOKENS_FOR_LLM,DEFAULT_SMYTHOS_LLM_PROVIDERS_SETTINGS,DEFAULT_TEAM_ID,DataSourceCleaner,DataSourceIndexer,DataSourceLookup,DummyAccount,DummyConnector,EMBODIMENT_TYPES,ENTERPRISE_MODELS_SETTING_KEY,ERR_MSG_INVALID_BINARY,ERR_MSG_INVALID_IMAGE_SOURCE,ERR_MSG_MAX_ARRAY_SIZE,ERR_MSG_MAX_DEPTH,ERR_MSG_MAX_OBJECT_SIZE,EchoConnector,EmbeddingsFactory,EmbodimentSettings,ExpressRouter,ExternalEventsReceiver,FEncDec,FHash,FSign,FSleep,FTimestamp,FileStore,ForEach,ForkedAgent,GPTPlugin,GenAILLM,GmailTrigger,GoogleAIConnector,GoogleEmbeds,GroqConnector,HashicorpVault,HookService,HuggingFace,ImageGenerator,ImageSettingsConfig,JSONContent,JSONContentHelper,JSONExpression$1 as JSONExpression,JSONFileAccount,JSONFileVault,JSONFilter,JSONModelsProvider,JSON_RESPONSE_INSTRUCTION,Job,JobSchedulerTrigger,LLMAssistant,LLMCache,LLMConnector,LLMContext,LLMHelper,LLMInference$1 as LLMInference,LLMInterface,LLMMemoryConnector,LLMService,LLMStream,LevelMap,LocalAgentDataConnector,LocalCache,LocalComponentConnector,LocalScheduler,LocalStorage,LocalStorageCache,LogConnector,LogHelper,LogService,Logger,LogicAND,LogicAtLeast,LogicAtMost,LogicOR,LogicXOR,MAX_ARRAY_SIZE,MAX_DEPTH,MAX_FILE_COUNT,MAX_FILE_SIZE,MAX_OBJECT_SIZE,MCPClient,MODELS_WITHOUT_JSON_RESPONSE_SUPPORT,MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT,ManagedOAuth2Credentials,ManagedVaultConnector,ManagedVaultService,Match,MemoryDeleteKeyVal,MemoryReadKeyVal,MemoryWriteKeyVal,MemoryWriteObject,MilvusVectorDB,ModelsProviderConnector,ModelsProviderService,MultimodalLLM,MySQLAccount,NKVConnector,NKVLocalStorage,NKVRAM,NKVRedis,NKVService,NullAgentData,NullManagedVault,NullRouter,NullVault,O3_AND_O4_MODELS,O3_AND_O4_MODELS_PATTERN,OSResourceMonitor,OTel,OTelContextRegistry,OllamaConnector,OpenAIConnector,OpenAIEmbeds,OpenAPIParser,PerplexityConnector,PineconeVectorDB,PromptGenerator,RAMCache,RAMVectorDB,REQUEST_CONTENT_TYPES,REQUEST_METHODS,RedisCache,ReverseLevelMap,ReverseRoleMap,RoleMap,RouterConnector,RouterService,RuntimeContext,S3Cache,S3Storage,S3_DAILY_PURGE_LIFECYCLE_TAG,S3_MONTHLY_PURGE_LIFECYCLE_TAG,S3_WEEKLY_PURGE_LIFECYCLE_TAG,SEARCH_TOOL_COSTS,SRE,SUPPORTED_MIME_TYPES_MAP,Schedule,SchedulerConnector,SchedulerService,ScrapflyWebScrape,SecretManagerManagedVault,SecretsManager,SecureConnector,ServerlessCode,SmythFS,SmythRuntime,SmythURI,StorageConnector,StorageService,SystemEvents,TAccessLevel,TAccessResult,TAccessRole,TConnectorService,THook,TLLMCredentials,TLLMEvent,TLLMMessageRole,TLLMProvider,TOOL_USE_DEFAULT_MODEL,TPLProcessor,TToolType,TavilyWebSearch,TelemetryConnector,TelemetryService,TemplateString,TemplateStringHelper,Trigger,USER_CUSTOM_MODELS_SETTING_KEY,VaultConnector,VaultHelper,VaultService,VectorDBConnector,VectorDBService,VertexAIConnector,VisionLLM,WhatsAppTrigger,ZapierAction,boot,buildOAuth1Header,cachePrefix,cacheTTL,calculateExecutionCost,checkAndInstallLifecycleRules,createOrUpdateLambdaFunction,customModels,destroyPublicUrls,escapeJsonField,escapeString,extractAdditionalParamsForOAuth1,extractAllKeyNamesFromTemplateVars,extractKeyFromTemplateVar,findSmythPath,findValidResourcePath,generateCodeFromLegacyComponent,generateCodeHash,generateExecutableCode,generateExpiryMetadata,generateLambdaCode,generateLifecycleRules,generateServiceKey,getCredentials,getCurrentEnvironmentVariables,getDeployedCodeHash,getDeployedFunction,getLLMCredentials,getLambdaCredentials,getLambdaFunctionName,getLambdaRolePolicy,getNonExistingRules,getSanitizeCodeHash,getSortedObjectValues,handleOAuthHeaders,hook,hookAsync,hookAsyncWithContext,hookableClass,inputErrMsg,invokeLambdaFunction,isAgent,isValidGroqReasoningEffort,isValidOpenAIReasoningEffort,models,parseArrayBufferResponse,parseData,parseHeaders,parseProxy,parseSmythFsUrl,parseUrl,performTypeInference,reportUsage,retrieveOAuthTokens,runJs,setDeployedCodeHash,ttlToExpiryDays,updateDeployedCodeTTL,validateAsyncMainFunction,validateServiceKey,verifyFunctionDeploymentStatus,version,waitForRoleDeploymentStatus,xAIConnector,zipCode};
|
|
286
|
+
`}var __defProp$7=Object.defineProperty,__defNormalProp$7=(obj,key,value)=>key in obj?__defProp$7(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$7=(obj,key,value)=>__defNormalProp$7(obj,typeof key!="symbol"?key+"":key,value);const console$2=Logger("ECMASandbox");class ECMASandbox2 extends CodeConnector{constructor(config2){super(config2),__publicField$7(this,"name","ECMASandbox"),__publicField$7(this,"sandboxUrl"),this.sandboxUrl=config2.sandboxUrl}async prepare(acRequest,codeUID,input,config2){return{prepared:!0,errors:[],warnings:[]}}async deploy(acRequest,codeUID,input,config2){return{id:codeUID,runtime:config2.runtime,createdAt:new Date,status:"Deployed"}}async execute(acRequest,codeUID,inputs,config2){try{const{isValid,error,parameters}=validateAsyncMainFunction(inputs.code);if(!isValid)return{output:void 0,executionTime:0,success:!1,errors:[error]};const executableCode=generateExecutableCode(inputs.code,parameters,inputs.inputs);if(this.sandboxUrl){console$2.debug("Running code in remote sandbox");const executionStartTime=Date.now(),result=await axios.post(this.sandboxUrl,{code:executableCode}).catch(error2=>({error:error2})),executionTime=Date.now()-executionStartTime;if(result.error){const error2=result.error?.response?.data||result.error?.message||result.error.toString()||"Unknown error";return console$2.error(`Error running code: ${JSON.stringify(error2,null,2)}`),{output:void 0,executionTime,success:!1,errors:[error2]}}else return console$2.debug(`Code result: ${result?.data?.Output}`),{output:result.data?.Output,executionTime,success:!0,errors:[]}}else{console$2.debug("Running code in isolated vm");const executionStartTime=Date.now(),result=await runJs(executableCode),executionTime=Date.now()-executionStartTime;return console$2.debug(`Code result: ${result}`),{output:result,executionTime,success:!0,errors:[]}}}catch(error){return console$2.error(`Error running code: ${error}`),{output:void 0,executionTime:0,success:!1,errors:[error]}}}async executeDeployment(acRequest,codeUID,deploymentId,inputs,config2){return await this.execute(acRequest,codeUID,inputs,config2)}async listDeployments(acRequest,codeUID,config2){return[]}async getDeployment(acRequest,codeUID,deploymentId,config2){return null}async deleteDeployment(acRequest,codeUID,deploymentId){}async getResourceACL(resourceId,candidate){const acl=new ACL;return acl.addAccess(candidate.role,candidate.id,TAccessLevel.Read),acl}}class CodeService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Code,"AWSLambda",AWSLambdaCode),ConnectorService.register(TConnectorService.Code,"ECMASandbox",ECMASandbox2)}}var __defProp$6=Object.defineProperty,__defNormalProp$6=(obj,key,value)=>key in obj?__defProp$6(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$6=(obj,key,value)=>__defNormalProp$6(obj,key+"",value);class SchedulerConnector extends SecureConnector{constructor(settings){super(settings),__publicField$6(this,"_eventEmitter"),this._eventEmitter=new EventEmitter$1}requester(candidate){return{list:async()=>await this.list(candidate.readRequest),add:async(jobId,job,schedule)=>{const accountConnector=ConnectorService.getAccountConnector(),agentTeam=await accountConnector.getCandidateTeam(AccessCandidate.agent(job.agentId)),candidateTeam=await accountConnector.getCandidateTeam(candidate);if(agentTeam!==candidateTeam)throw new Error(`Candidate ${candidate.id} is not authorized to schedule a job for agent ${job.agentId}`);await this.add(candidate.writeRequest,jobId,job,schedule)},delete:async jobId=>{await this.delete(candidate.writeRequest,jobId)},get:async jobId=>await this.get(candidate.readRequest,jobId),pause:async jobId=>{await this.pause(candidate.writeRequest,jobId)},resume:async jobId=>{await this.resume(candidate.writeRequest,jobId)},on:(event,listener)=>{this.on(event,listener)},off:(event,listener)=>{this.off(event,listener)}}}constructJobKey(candidate,jobId){return`${candidate.role}_${candidate.id}_${jobId}`}emit(event,...args){return this._eventEmitter.emit(event,...args)}on(event,listener){return this._eventEmitter.on(event,listener),this}off(event,listener){return this._eventEmitter.off(event,listener),this}}var __defProp$5=Object.defineProperty,__getOwnPropDesc$1=Object.getOwnPropertyDescriptor,__defNormalProp$5=(obj,key,value)=>key in obj?__defProp$5(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$1=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$1(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$5(target,key,result),result},__publicField$5=(obj,key,value)=>__defNormalProp$5(obj,typeof key!="symbol"?key+"":key,value);const logger$2=Logger("LocalScheduler"),_LocalScheduler=class _LocalScheduler2 extends SchedulerConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$5(this,"name","LocalScheduler"),__publicField$5(this,"id","local"),__publicField$5(this,"folder"),__publicField$5(this,"jobsPrefix","jobs"),__publicField$5(this,"runtimePrefix",".jobs.runtime"),__publicField$5(this,"isInitialized",!1),__publicField$5(this,"config"),this.config={folder:_settings?.folder||"",runJobs:_settings?.runJobs!==!1,persistExecutionHistory:_settings?.persistExecutionHistory!==!1,maxHistoryEntries:_settings?.maxHistoryEntries||100},this.folder=this.findSchedulerFolder(this.config.folder),this.initialize(),fs__default.existsSync(this.folder)||logger$2.warn(`Invalid folder provided: ${this.folder}`)}findSchedulerFolder(folder){let _schedulerFolder=folder;return _schedulerFolder&&fs__default.existsSync(_schedulerFolder)?_schedulerFolder:(_schedulerFolder=findSmythPath("scheduler"),fs__default.existsSync(_schedulerFolder)?(logger$2.warn("Using alternative scheduler folder found in : ",_schedulerFolder),_schedulerFolder):(logger$2.warn("!!! All attempts to find an existing scheduler folder failed !!!"),logger$2.warn("!!! I will use this folder: ",_schedulerFolder),_schedulerFolder))}async initialize(){const jobsFolderPath=path.join(this.folder,this.jobsPrefix);fs__default.existsSync(jobsFolderPath)||(fs__default.mkdirSync(jobsFolderPath,{recursive:!0}),fs__default.writeFileSync(path.join(jobsFolderPath,"README_IMPORTANT.txt"),"This folder contains scheduler job configurations. Do not delete it."));const runtimeFolderPath=path.join(this.folder,this.runtimePrefix);fs__default.existsSync(runtimeFolderPath)||(fs__default.mkdirSync(runtimeFolderPath,{recursive:!0}),fs__default.writeFileSync(path.join(runtimeFolderPath,"README_IMPORTANT.txt"),"This folder contains scheduler runtime data and execution history. Safe to delete if needed.")),this.config.runJobs&&await this.loadJobsFromDisk(),this.isInitialized=!0,logger$2.info(`LocalScheduler initialized (runJobs: ${this.config.runJobs})`)}getCandidateFolderName(candidate){return`${candidate.id}.${candidate.role}`}getJobFilePath(candidate,jobId,createFoldersIfNotExists=!1){const candidateFolder=this.getCandidateFolderName(candidate),jobFilename=jobId,fullPath=path.join(this.folder,this.jobsPrefix,candidateFolder,`${jobFilename}.json`);if(createFoldersIfNotExists){const folder=path.dirname(fullPath);fs__default.existsSync(folder)||fs__default.mkdirSync(folder,{recursive:!0})}return fullPath}getRuntimeFilePath(candidate,jobId,createFoldersIfNotExists=!1){const candidateFolder=this.getCandidateFolderName(candidate),jobFilename=jobId,fullPath=path.join(this.folder,this.runtimePrefix,candidateFolder,`${jobFilename}.json`);if(createFoldersIfNotExists){const folder=path.dirname(fullPath);fs__default.existsSync(folder)||fs__default.mkdirSync(folder,{recursive:!0})}return fullPath}async loadJobsFromDisk(){try{const jobsFolderPath=path.join(this.folder,this.jobsPrefix);if(!fs__default.existsSync(jobsFolderPath))return;const candidateFolders=fs__default.readdirSync(jobsFolderPath).filter(f=>{const fullPath=path.join(jobsFolderPath,f);return fs__default.statSync(fullPath).isDirectory()});for(const candidateFolder of candidateFolders){const lastDotIndex=candidateFolder.lastIndexOf(".");if(lastDotIndex===-1){logger$2.warn(`Invalid candidate folder format: ${candidateFolder}`);continue}const candidateId=candidateFolder.substring(0,lastDotIndex),candidateRole=candidateFolder.substring(lastDotIndex+1),candidate={id:candidateId,role:candidateRole},candidatePath=path.join(jobsFolderPath,candidateFolder),jobFiles=fs__default.readdirSync(candidatePath).filter(f=>f.endsWith(".json"));for(const file of jobFiles)try{const filePath=path.join(candidatePath,file),data=fs__default.readFileSync(filePath,"utf-8"),jobConfig=JSON.parse(data),runtimeData=await this.loadRuntimeDataFromDisk(candidate,jobConfig.id),jobData={...jobConfig,...runtimeData,candidateRole:candidate.role,candidateId:candidate.id},jobKey=this.constructJobKey(candidate,jobData.id);_LocalScheduler2.jobs.set(jobKey,jobData),jobData.status==="active"&&(logger$2.info(`Job ${jobData.id} loaded from ${candidateFolder} and scheduled for execution`),await this.scheduleJob(jobData))}catch(error){logger$2.warn(`Error loading job file ${file} from ${candidateFolder}:`,error)}}logger$2.info(`Loaded ${_LocalScheduler2.jobs.size} jobs from disk`)}catch(error){logger$2.warn("Error loading jobs from disk",error)}}async saveJobToDisk(candidate,jobData){try{const filePath=this.getJobFilePath(candidate,jobData.id,!0),{executionHistory,lastRun,nextRun,candidateRole,candidateId,createdBy,...configData}=jobData;fs__default.writeFileSync(filePath,JSON.stringify(configData,null,2),"utf-8")}catch(error){throw logger$2.warn(`Error saving job ${jobData.id} to disk`,error),error}}async saveRuntimeDataToDisk(candidate,jobData){try{const filePath=this.getRuntimeFilePath(candidate,jobData.id,!0),runtimeData={executionHistory:jobData.executionHistory||[],lastRun:jobData.lastRun,nextRun:jobData.nextRun};fs__default.writeFileSync(filePath,JSON.stringify(runtimeData,null,2),"utf-8")}catch(error){logger$2.warn(`Error saving runtime data for job ${jobData.id}`,error);return}}async loadRuntimeDataFromDisk(candidate,jobId){try{const filePath=this.getRuntimeFilePath(candidate,jobId);if(!fs__default.existsSync(filePath))return{};const data=fs__default.readFileSync(filePath,"utf-8");return JSON.parse(data)}catch(error){return logger$2.warn(`Error loading runtime data for job ${jobId}`,error),{}}}async deleteJobFromDisk(candidate,jobId){try{const jobFilePath=this.getJobFilePath(candidate,jobId);fs__default.existsSync(jobFilePath)&&fs__default.unlinkSync(jobFilePath);const runtimeFilePath=this.getRuntimeFilePath(candidate,jobId);fs__default.existsSync(runtimeFilePath)&&fs__default.unlinkSync(runtimeFilePath)}catch(error){logger$2.warn(`Error deleting job ${jobId} from disk`,error);return}}async scheduleJob(jobData){if(jobData.status!=="active")return;const validation=Schedule.fromJSON(jobData.schedule).validate();if(!validation.valid)throw logger$2.warn(`Invalid schedule for job ${jobData.id}: ${validation.error}`),new Error(`Invalid schedule for job ${jobData.id}: ${validation.error}`);const jobKey=this.constructJobKey({role:jobData.candidateRole,id:jobData.candidateId},jobData.id),existingTimer=_LocalScheduler2.timers.get(jobKey);if(existingTimer&&(logger$2.info(`Clearing existing timer for job ${jobData.id} (overwriting duplicate schedule)`),clearInterval(existingTimer),_LocalScheduler2.timers.delete(jobKey)),jobData.schedule.interval){const intervalMs=Schedule.parseInterval(jobData.schedule.interval),timer=setInterval(async()=>{await this.executeJob(jobData)},intervalMs);timer.unref(),_LocalScheduler2.timers.set(jobKey,timer)}if(jobData.schedule.cron)throw logger$2.warn(`Cron scheduling not yet implemented for job ${jobData.id}`),new Error(`Cron scheduling not yet implemented for job ${jobData.id}`)}async unscheduleJob(jobKey){const timer=_LocalScheduler2.timers.get(jobKey);timer&&(clearInterval(timer),_LocalScheduler2.timers.delete(jobKey))}async executeJob(jobData){if(!jobData.jobConfig){logger$2.warn(`Skipping execution of job ${jobData.id}: job configuration not available.`);return}const schedule=Schedule.fromJSON(jobData.schedule);if(!schedule.shouldRun()){logger$2.info(`Job ${jobData.id} skipped - outside schedule window`);return}const job=Job.fromJSON(jobData.jobConfig);logger$2.debug(`Executing job ${jobData.id} with metadata:`,JSON.stringify(jobData.jobConfig.metadata));const owner=jobData.createdBy;this.emit("executing",{id:jobData.id,job,owner});const result=await job.executeWithRetry();this.emit("executed",{id:jobData.id,job,owner,result}),jobData.lastRun=new Date().toISOString();const nextRun=schedule.calculateNextRun(new Date(jobData.lastRun));jobData.nextRun=nextRun?nextRun.toISOString():void 0,result.success||logger$2.warn(`Job ${jobData.id} failed:`,result.error?.message),this.config.persistExecutionHistory&&(jobData.executionHistory||(jobData.executionHistory=[]),jobData.executionHistory.unshift({timestamp:new Date().toISOString(),success:result.success,error:result.error?.message,executionTime:result.executionTime,retries:result.retries}),jobData.executionHistory.length>this.config.maxHistoryEntries&&(jobData.executionHistory=jobData.executionHistory.slice(0,this.config.maxHistoryEntries)));const candidate={role:jobData.candidateRole,id:jobData.candidateId};await this.saveJobToDisk(candidate,jobData),this.config.persistExecutionHistory&&await this.saveRuntimeDataToDisk(candidate,jobData)}async getResourceACL(resourceId,candidate){this.isInitialized||await this.initialize();const accountConnector=ConnectorService.getAccountConnector(),teamId=await accountConnector.getCandidateTeam(candidate),jobKey=this.constructJobKey(candidate,resourceId),jobData=_LocalScheduler2.jobs.get(jobKey),jobAgentTeamId=jobData?.jobConfig?.agentId?await accountConnector.getCandidateTeam(AccessCandidate.agent(jobData?.jobConfig?.agentId)):null;return jobAgentTeamId&&teamId!==jobAgentTeamId?new ACL:jobData?ACL.from(jobData.acl):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async list(acRequest){this.isInitialized||await this.initialize();const result=[];for(const[key,jobData]of _LocalScheduler2.jobs)if(jobData.candidateRole===acRequest.candidate.role&&jobData.candidateId===acRequest.candidate.id){const{candidateRole,candidateId,...serializableData}=jobData;result.push(serializableData)}return result}async add(acRequest,jobId,job,schedule){this.isInitialized||await this.initialize();const validation=schedule.validate();if(!validation.valid){logger$2.warn(`Invalid schedule: ${validation.error}`);return}const jobKey=this.constructJobKey(acRequest.candidate,jobId),existingJob=_LocalScheduler2.jobs.get(jobKey);let acl;existingJob?acl=ACL.from(existingJob.acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner):acl=new ACL().addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner);const nextRun=schedule.calculateNextRun(),jobData={id:jobId,schedule:schedule.toJSON(),jobConfig:job.toJSON(),acl:acl.ACL,status:"active",nextRun:nextRun?nextRun.toISOString():void 0,createdBy:{role:acRequest.candidate.role,id:acRequest.candidate.id},candidateRole:acRequest.candidate.role,candidateId:acRequest.candidate.id,executionHistory:existingJob?.executionHistory||[]};existingJob&&await this.unscheduleJob(jobKey),_LocalScheduler2.jobs.set(jobKey,jobData),await this.saveJobToDisk(acRequest.candidate,jobData),this.config.runJobs&&await this.scheduleJob(jobData),logger$2.info(`Job ${jobId} added successfully`)}async delete(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId);if(!_LocalScheduler2.jobs.get(jobKey)){logger$2.warn(`Job ${jobId} not found`);return}await this.unscheduleJob(jobKey),_LocalScheduler2.jobs.delete(jobKey),await this.deleteJobFromDisk(acRequest.candidate,jobId),logger$2.info(`Job ${jobId} deleted successfully`)}async get(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId),jobData=_LocalScheduler2.jobs.get(jobKey);if(!jobData)return;const{candidateRole,candidateId,...serializableData}=jobData;return serializableData}async pause(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId),jobData=_LocalScheduler2.jobs.get(jobKey);if(!jobData){logger$2.warn(`Job ${jobId} not found`);return}jobData.status!=="paused"&&(await this.unscheduleJob(jobKey),jobData.status="paused",await this.saveJobToDisk(acRequest.candidate,jobData),logger$2.info(`Job ${jobId} paused`))}async resume(acRequest,jobId){this.isInitialized||await this.initialize();const jobKey=this.constructJobKey(acRequest.candidate,jobId),jobData=_LocalScheduler2.jobs.get(jobKey);if(!jobData){logger$2.warn(`Job ${jobId} not found`);return}jobData.status==="paused"&&(jobData.status="active",await this.saveJobToDisk(acRequest.candidate,jobData),this.config.runJobs&&await this.scheduleJob(jobData),logger$2.info(`Job ${jobId} resumed`))}async shutdown(){logger$2.info("Shutting down LocalScheduler...");const timerCount=_LocalScheduler2.timers.size;for(const[jobKey,timer]of _LocalScheduler2.timers)clearInterval(timer);_LocalScheduler2.timers.clear(),logger$2.info(`LocalScheduler shutdown complete (cleared ${timerCount} timers)`)}};__publicField$5(_LocalScheduler,"jobs",new Map),__publicField$5(_LocalScheduler,"timers",new Map),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"list"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"add"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"delete"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"get"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"pause"),__decorateClass$1([SecureConnector.AccessControl],_LocalScheduler.prototype,"resume");let LocalScheduler=_LocalScheduler;class SchedulerService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Scheduler,"LocalScheduler",LocalScheduler)}}class TelemetryConnector extends SecureConnector{constructor(){super()}requester(candidate){return{}}}var __defProp$4=Object.defineProperty,__defNormalProp$4=(obj,key,value)=>key in obj?__defProp$4(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$4=(obj,key,value)=>__defNormalProp$4(obj,key+"",value);class OTelContextRegistry{static key(agentId,processId){return`${agentId}:${processId}`}static startProcess(agentId,processId,span){this.registry.set(this.key(agentId,processId),{agentId,processId,rootSpan:span})}static get(agentId,processId){return this.registry.get(this.key(agentId,processId))}static update(agentId,processId,ctx){const key=this.key(agentId,processId),current=this.registry.get(key);current&&this.registry.set(key,{...current,...ctx})}static endProcess(agentId,processId){this.registry.delete(this.key(agentId,processId))}}__publicField$4(OTelContextRegistry,"registry",new Map);var __defProp$3=Object.defineProperty,__defNormalProp$3=(obj,key,value)=>key in obj?__defProp$3(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$3=(obj,key,value)=>__defNormalProp$3(obj,typeof key!="symbol"?key+"":key,value);const outputLogger=Logger("OTel");class OTel extends TelemetryConnector{constructor(_settings){super(),this._settings=_settings,__publicField$3(this,"name","OTel"),__publicField$3(this,"id"),__publicField$3(this,"tracer"),__publicField$3(this,"logger"),__publicField$3(this,"tracerProvider"),__publicField$3(this,"loggerProvider"),outputLogger.log("Initializing Tracer ...");const traceExporter=new OTLPTraceExporter({url:`${_settings.endpoint}/v1/traces`,headers:_settings.headers}),spanProcessor=new BatchSpanProcessor(traceExporter),resource=resourceFromAttributes({[ATTR_SERVICE_NAME]:_settings.serviceName||"smythos",[ATTR_SERVICE_VERSION]:_settings.serviceVersion||"1.0.0"});this.tracerProvider=new NodeTracerProvider({resource,spanProcessors:[spanProcessor]}),this.tracerProvider.register(),outputLogger.log("Initializing Log Exporter ...");const logExporter=new OTLPLogExporter({url:`${_settings.endpoint}/v1/logs`,headers:_settings.headers}),logProcessor=new BatchLogRecordProcessor(logExporter);this.loggerProvider=new LoggerProvider({resource,processors:[logProcessor]}),logs.setGlobalLoggerProvider(this.loggerProvider),this.tracer=trace.getTracer("smythos.agent"),this.logger=logs.getLogger("smythos.agent"),this.id=`otel-${_settings.endpoint}`,this.setupHooks()}async stop(){outputLogger.log(`Stopping ${this.name} connector ...`),await this.tracerProvider.forceFlush?.().catch(error=>{outputLogger.error("Error forcing flush of tracer provider",error)}),await this.tracerProvider.shutdown?.().catch(error=>{outputLogger.error("Error shutting down tracer provider",error)}),await this.loggerProvider.forceFlush().catch(error=>{outputLogger.error("Error forcing flush of logger provider",error)}),await this.loggerProvider.shutdown().catch(error=>{outputLogger.error("Error shutting down logger provider",error)})}redactSensitiveData(data,redactFields){if(!redactFields||redactFields.length===0||typeof data!="object"||data===null)return data;const redacted=Array.isArray(data)?[...data]:{...data};for(const key in redacted)redactFields.some(field=>key.toLowerCase().includes(field.toLowerCase()))?redacted[key]="[REDACTED]":typeof redacted[key]=="object"&&redacted[key]!==null&&(redacted[key]=this.redactSensitiveData(redacted[key],redactFields));return redacted}formatOutputForLog(output,isError=!1){const config2=this._settings,maxSize=config2.maxOutputSize??10*1024;if((config2.fullOutputOnErrorOnly??!1)&&!isError)return;const redacted=this.redactSensitiveData(output,config2.redactFields),outputStr=JSON.stringify(redacted);return outputStr&&outputStr.length>maxSize?`${outputStr.substring(0,maxSize)}...[TRUNCATED: ${outputStr.length} bytes, limit: ${maxSize} bytes]`:outputStr}getResourceACL(resourceId,candidate){return Promise.resolve(new ACL)}log(acRequest,logData,callId){return Promise.resolve()}logTask(acRequest,tasks,isUsingTestDomain){return Promise.resolve()}prepareComponentData(data,prefix,maxEntryLength=200){const result={};for(let key in data)result[prefix?`${prefix}.${key}`:key]=(typeof data[key]=="object"?JSON.stringify(data[key]):data[key].toString()).substring(0,maxEntryLength);return result}setupHooks(){const tracer=this.tracer,logger2=this.logger,oTelInstance=this,createToolInfoHandler=function(hookContext){return function(toolInfo){const accessCandidate=AccessCandidate.agent(hookContext?.agentId);if(outputLogger.debug("createToolInfoHandler started",accessCandidate),!hookContext.curLLMGenSpan||!hookContext.convSpan)return;const modelId=toolInfo.model,lastContext=toolInfo.contextWindow.filter(context2=>context2.role==="user").slice(-2),toolNames=toolInfo.map(tool=>tool.name+"("+tool.arguments+")");hookContext.curLLMGenSpan.addEvent("llm.gen.tool.calls",{"tool.calls":toolNames.join(", "),"llm.model":modelId||"unknown","context.preview":JSON.stringify(lastContext).substring(0,200)});const spanContext=trace.setSpan(context.active(),hookContext.curLLMGenSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`LLM tool calls: ${toolNames.join(", ")}`,attributes:{"agent.id":hookContext.agentId,"conv.id":hookContext.processId,"llm.model":modelId||"unknown","context.preview":JSON.stringify(lastContext).substring(0,5e3)}})}),hookContext.curLLMGenSpan.end(),delete hookContext.curLLMGenSpan,outputLogger.debug("createToolInfoHandler completed",accessCandidate)}},createDataHandler=function(hookContext){return function(data,reqInfo){if(!hookContext.convSpan||hookContext.curLLMGenSpan)return;const accessCandidate=AccessCandidate.agent(hookContext?.agentId);outputLogger.debug("createDataHandler started",reqInfo?.requestId,accessCandidate);const modelId=reqInfo.model,lastContext=reqInfo.contextWindow.filter(context2=>context2.role==="user").slice(-2);if(hookContext?.latencySpans?.[reqInfo.requestId]){const ttfbSpan=hookContext.latencySpans[reqInfo.requestId];ttfbSpan.addEvent("llm.first.byte.received",{"request.id":reqInfo.requestId,"data.size":JSON.stringify(data||{}).length,"llm.model":modelId||"unknown"}),ttfbSpan.setStatus({code:SpanStatusCode.OK}),ttfbSpan.end(),delete hookContext.latencySpans[reqInfo.requestId]}const llmGenSpan=tracer.startSpan("Conv.GenAI",{attributes:{"agent.id":hookContext.agentId,"conv.id":hookContext.processId,"llm.model":modelId||"unknown"}},trace.setSpan(context.active(),hookContext.convSpan));llmGenSpan.addEvent("llm.gen.started",{"request.id":reqInfo.requestId,timestamp:Date.now(),"llm.model":modelId||"unknown","context.preview":JSON.stringify(lastContext).substring(0,200)}),hookContext.curLLMGenSpan=llmGenSpan,outputLogger.debug("createDataHandler completed",reqInfo?.requestId,accessCandidate)}},createRequestedHandler=function(hookContext){return function(reqInfo){if(!hookContext.convSpan)return;const accessCandidate=AccessCandidate.agent(hookContext?.agentId);outputLogger.debug("createRequestedHandler started",reqInfo?.requestId,accessCandidate),hookContext.latencySpans||(hookContext.latencySpans={});const lastContext=reqInfo.contextWindow.filter(context2=>context2.role==="user").slice(-2),modelId=reqInfo.model,llmGenLatencySpan=tracer.startSpan("Conv.GenAI.TTFB",{attributes:{"agent.id":hookContext.agentId,"conv.id":hookContext.processId,"request.id":reqInfo.requestId,"llm.model":modelId||"unknown","metric.type":"ttfb"}},trace.setSpan(context.active(),hookContext.convSpan));llmGenLatencySpan.addEvent("llm.requested",{"request.id":reqInfo.requestId,timestamp:Date.now(),"context.preview":JSON.stringify(lastContext).substring(0,200)}),hookContext.latencySpans[reqInfo.requestId]=llmGenLatencySpan,outputLogger.debug("createRequestedHandler completed",reqInfo?.requestId,accessCandidate)}};return HookService.register("Conversation.streamPrompt",async function(additionalContext,args){const conversation=this.instance,processId=conversation.id,agentId=conversation.agentId,message=typeof args=="object"?args?.message:args||null,hookContext=this.context;if(message==null)return;const accessCandidate=AccessCandidate.agent(agentId);outputLogger.debug("Conversation.streamPrompt started",{processId,message},accessCandidate);const modelId=typeof conversation?.model=="string"?conversation?.model:conversation?.model?.modelId,convSpan=tracer.startSpan("Agent.Conv",{attributes:{"gen_ai.operation.name":"chat","gen_ai.provider.name":conversation?.llmInference?.llmProviderName||"unknown","gen_ai.conversation.id":processId,"gen_ai.request.model":modelId||"unknown","agent.id":agentId,"conv.id":processId,"llm.model":modelId||"unknown"}});hookContext.convSpan=convSpan,hookContext.agentId=agentId,hookContext.processId=processId,hookContext.dataHandler=createDataHandler(hookContext),conversation.on(TLLMEvent.Data,hookContext.dataHandler),hookContext.requestedHandler=createRequestedHandler(hookContext),conversation.on(TLLMEvent.Requested,hookContext.requestedHandler),hookContext.toolInfoHandler=createToolInfoHandler(hookContext),conversation.on(TLLMEvent.ToolInfo,hookContext.toolInfoHandler),convSpan.addEvent("skill.process.started",{"input.size":JSON.stringify(message||{}).length,"input.preview":message.substring(0,200),"llm.model":modelId||"unknown"}),OTelContextRegistry.startProcess(agentId,processId,convSpan);const spanCtx=convSpan.spanContext(),spanContext=trace.setSpan(context.active(),convSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Conversation.streamPrompt started: ${processId}`,attributes:{trace_id:spanCtx.traceId,span_id:spanCtx.spanId,trace_flags:spanCtx.traceFlags,"agent.id":agentId,"conv.id":processId,"input.size":JSON.stringify(message||{}).length,"input.preview":message.substring(0,2e3)}})})},THook.NonBlocking),HookService.registerAfter("Conversation.streamPrompt",async function({result,args,error}){const conversation=this.instance,processId=conversation.id,agentId=conversation.agentId,message=typeof args?.[0]=="object"?args?.[0]?.message:args?.[0]||null,hookContext=this.context;if(message==null)return;const ctx=OTelContextRegistry.get(agentId,processId);if(!ctx)return;const accessCandidate=AccessCandidate.agent(agentId);outputLogger.debug("Conversation.streamPrompt completed",{processId},accessCandidate),hookContext.curLLMGenSpan&&(hookContext.curLLMGenSpan.addEvent("llm.gen.content",{"content.size":JSON.stringify(result||{}).length,"content.preview":result.substring(0,200)}),hookContext.curLLMGenSpan.end(),hookContext.toolInfoHandler&&conversation.off(TLLMEvent.ToolInfo,hookContext.toolInfoHandler),hookContext.dataHandler&&conversation.off(TLLMEvent.Data,hookContext.dataHandler),hookContext.requestedHandler&&conversation.off(TLLMEvent.Requested,hookContext.requestedHandler));const{rootSpan:convSpan}=ctx;convSpan.spanContext();const spanContext=trace.setSpan(context.active(),convSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Conversation.streamPrompt completed: ${processId}`,attributes:{"agent.id":agentId,"conv.id":processId,"output.size":JSON.stringify(result||{}).length,"output.preview":result.substring(0,2e3)}})}),convSpan.end(),OTelContextRegistry.endProcess(agentId,processId)},THook.NonBlocking),HookService.register("SREAgent.process",async function(endpointPath,inputData){const agent=this.instance,agentProcessId=agent.agentRuntime.processID,conversationId=agent.conversationId||agent.agentRequest?.header("X-CONVERSATION-ID"),processId=agentProcessId.split(":").shift(),agentId=agent.id,agentRequest=agent.agentRequest,teamId=agent.teamId,_hookContext=this.context,accessCandidate=AccessCandidate.agent(agentId);outputLogger.debug("SREAgent.process started",{processId,agentProcessId,endpointPath},accessCandidate);const body=oTelInstance.prepareComponentData(agentRequest.body||{}),query=oTelInstance.prepareComponentData(agentRequest.query||{}),headers=oTelInstance.prepareComponentData(agentRequest.headers||{}),agentInput=oTelInstance.prepareComponentData(inputData||{}),input={body,query,headers,processInput:agentInput};let convSpan;const ctx=OTelContextRegistry.get(agentId,processId)||OTelContextRegistry.get(agentId,conversationId);ctx&&(convSpan=ctx.rootSpan,_hookContext.otelSpan=convSpan);const agentSpan=tracer.startSpan("Agent.Skill",{attributes:{"agent.id":agentId,"team.id":teamId,"process.id":agentProcessId}},convSpan?trace.setSpan(context.active(),convSpan):void 0),inputPreview=JSON.stringify(input||{}).substring(0,200);agentSpan.addEvent("skill.process.started",{endpoint:endpointPath,"input.size":JSON.stringify(input||{}).length,"input.preview":inputPreview}),OTelContextRegistry.startProcess(agentId,agentProcessId,agentSpan);const spanCtx=agentSpan.spanContext(),spanContext=trace.setSpan(context.active(),agentSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Agent Skill process started: ${processId}`,attributes:{trace_id:spanCtx.traceId,span_id:spanCtx.spanId,trace_flags:spanCtx.traceFlags,agentId,processId:agentProcessId,input:agentInput,body,query,headers}})})},THook.NonBlocking),HookService.registerAfter("SREAgent.process",async function({result,error}){const agent=this.instance,agentProcessId=agent.agentRuntime.processID,agentId=agent.id;this.context;const ctx=OTelContextRegistry.get(agentId,agentProcessId);if(!ctx)return;const agentSpan=ctx.rootSpan;if(!agentSpan)return;const accessCandidate=AccessCandidate.agent(agentId);outputLogger.debug("SREAgent.process completed",{agentProcessId},accessCandidate),error?(agentSpan.recordException(error),agentSpan.setStatus({code:SpanStatusCode.ERROR,message:error.message}),agentSpan.addEvent("skill.process.error",{"error.message":error.message})):(agentSpan.setStatus({code:SpanStatusCode.OK}),agentSpan.addEvent("skill.process.completed",{"output.size":JSON.stringify(result||{}).length}),agentSpan.setAttributes({"output.size":JSON.stringify(result||{}).length}));const outputForLog=oTelInstance.formatOutputForLog(result,!!error),spanCtx=agentSpan.spanContext(),logAttributes={trace_id:spanCtx.traceId,span_id:spanCtx.spanId,trace_flags:spanCtx.traceFlags,agentId,processId:agentProcessId,hasError:!!error,"error.message":error?.message,"error.stack":error?.stack};outputForLog!==void 0&&(logAttributes["agent.output"]=outputForLog);const spanContext=trace.setSpan(context.active(),agentSpan);context.with(spanContext,()=>{logger2.emit({severityNumber:error?SeverityNumber.ERROR:SeverityNumber.INFO,severityText:error?"ERROR":"INFO",body:`Agent process ${error?"failed":"completed"}: ${agentProcessId}`,attributes:logAttributes})}),agentSpan.end(),OTelContextRegistry.endProcess(agentId,agentProcessId)},THook.NonBlocking),HookService.register("Component.process",async function(input,settings,agent){const processId=agent.agentRuntime.processID,agentId=agent.id;this.instance;const componentId=settings.id||"unknown",componentType=settings.name,componentName=settings.displayName||settings.name,eventId=settings.eventId,accessCandidate=AccessCandidate.agent(agentId);outputLogger.debug("Component.process started",{componentId},accessCandidate);const parentSpan=OTelContextRegistry.get(agentId,processId)?.rootSpan,compSettingsData=oTelInstance.prepareComponentData(settings?.data||{},"cmp.settings"),spanName=`Component.${componentType}`,span=tracer.startSpan(spanName,{attributes:{"agent.id":agentId,"process.id":processId,"event.id":eventId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,...compSettingsData}},parentSpan?trace.setSpan(context.active(),parentSpan):void 0);JSON.stringify(input||{});const compInputData=oTelInstance.prepareComponentData(input||{});span.addEvent("cmp.call",{"event.id":eventId,"cmp.input.size":JSON.stringify(input||{}).length,"cmp.input":JSON.stringify(compInputData)});const spanContext=trace.setSpan(context.active(),span);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Component ${componentType} started`,attributes:{"agent.id":agentId,"process.id":processId,"event.id":eventId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,"cmp.input":input}})}),this.context.otelSpan=span},THook.NonBlocking),HookService.registerAfter("Component.process",async function({result,error,args}){const span=this.context.otelSpan;if(!span)return;const agent=args[2],settings=args[1],eventId=settings.eventId,processId=agent.agentRuntime.processID,agentId=agent.id;this.instance;const componentId=settings.id||"unknown",componentType=settings.name,componentName=settings.displayName||settings.name,accessCandidate=AccessCandidate.agent(agentId);if(outputLogger.debug("Component.process completed",{componentId},accessCandidate),error){span.recordException(error),span.setStatus({code:SpanStatusCode.ERROR,message:error.message}),span.addEvent("cmp.call.error",{"event.id":eventId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,"error.type":error.name,"error.message":error.message,"error.stack":error.stack?.substring(0,500)});const spanContext=trace.setSpan(context.active(),span);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.ERROR,severityText:"ERROR",body:`Component ${componentType} (${componentId}) failed: ${error.message}`,attributes:{"agent.id":agentId,"process.id":processId,"event.id":eventId,"cmp.id":componentId,"cmp.name":componentName,"cmp.type":componentType,"error.type":error.name,"error.message":error.message,"error.stack":error.stack}})})}else{span.setStatus({code:SpanStatusCode.OK});const resultStr=JSON.stringify(result||{});span.addEvent("cmp.call.result",{"output.size":resultStr.length,"output.preview":resultStr.substring(0,200)}),span.setAttributes({"output.size":JSON.stringify(result||{}).length,"output.has_error":!!result?._error}),oTelInstance.formatOutputForLog(result,!1);const logAttributes={"agent.id":agentId,"cmp.id":componentId,"cmp.type":componentType,"cmp.name":componentName,"process.id":processId,"event.id":eventId,"cmp.output":result},spanContext=trace.setSpan(context.active(),span);context.with(spanContext,()=>{logger2.emit({severityNumber:SeverityNumber.INFO,severityText:"INFO",body:`Component ${componentType} (${componentId}) completed successfully`,attributes:logAttributes})})}span.end()},THook.NonBlocking),Promise.resolve()}}class TelemetryService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Telemetry,"OTel",OTel)}}const console$1=Logger("Boot");let _booted=!1;function boot(){if(_booted){console$1.warn("SRE already booted");return}_booted=!0,SystemEvents.emit("SRE:BootStart"),console$1.debug("SRE Boot sequence started");const service={};service.NKV=new NKVService,service.Account=new AccountService,service.Vault=new VaultService,service.ManagedVault=new ManagedVaultService,service.Cache=new CacheService,service.Storage=new StorageService,service.ModelsProvider=new ModelsProviderService,service.LLM=new LLMService,service.AgentData=new AgentDataService,service.CLI=new CLIService,service.VectorDB=new VectorDBService,service.Router=new RouterService,service.Log=new LogService,service.Component=new ComponentService,service.Code=new CodeService,service.Scheduler=new SchedulerService,service.Telemetry=new TelemetryService,SystemEvents.on("SRE:Initialized",()=>{console$1.debug("SRE Initialized");for(let key in service)service[key].init();SystemEvents.emit("SRE:Booted",service),console$1.debug("SRE Boot sequence completed")})}function generateServiceKey(serviceName){const secret=process.env.SRE_SECRET;if(!secret||secret.trim().length<32)throw new Error("SRE_SECRET must be at least 32 characters");return createHmac("sha256",secret).update(`sre-service:${serviceName}`).digest("hex")}function validateServiceKey(serviceName,providedKey){try{const expectedKey=generateServiceKey(serviceName);return timingSafeEqual(Buffer.from(expectedKey),Buffer.from(providedKey))}catch{return!1}}var __defProp$2=Object.defineProperty,__defNormalProp$2=(obj,key,value)=>key in obj?__defProp$2(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$2=(obj,key,value)=>__defNormalProp$2(obj,typeof key!="symbol"?key+"":key,value);const logger$1=Logger("ExternalEventsReceiver");class ExternalEventsReceiver{constructor(config2){if(__publicField$2(this,"server",null),__publicField$2(this,"wss",null),__publicField$2(this,"config"),__publicField$2(this,"isRunning",!1),this.config={enableHttp:!0,enableWebSocket:!0,path:"/ws",...config2},!this.config.authTokens||this.config.authTokens.length===0)throw logger$1.warn("At least one authentication token must be provided"),new Error("At least one authentication token must be provided")}async start(){if(this.isRunning){logger$1.warn("Server is already running");return}return this.server=createServer((req,res)=>this.handleHttpRequest(req,res)),this.config.enableWebSocket&&(this.wss=new WebSocketServer({server:this.server,path:this.config.path}),this.wss.on("connection",(ws,req)=>{this.handleWebSocketConnection(ws,req)})),new Promise((resolve,reject)=>{this.server.listen(this.config.port,"127.0.0.1",()=>{this.isRunning=!0,logger$1.debug(`Server started on port ${this.config.port}`+(this.config.enableHttp?" [HTTP]":"")+(this.config.enableWebSocket?` [WebSocket: ${this.config.path}]`:"")),resolve()}),this.server.on("error",error=>{logger$1.error("Server error",error),reject(error)})})}async stop(){if(this.isRunning)return new Promise((resolve,reject)=>{this.wss&&this.wss.close(err=>{err&&logger$1.error("Error closing WebSocket server",err)}),this.server?this.server.close(err=>{err?(logger$1.error("Error closing HTTP server",err),reject(err)):(this.isRunning=!1,logger$1.debug("Server stopped"),resolve())}):resolve()})}handleHttpRequest(req,res){if(!this.config.enableHttp){this.sendResponse(res,404,{error:"HTTP endpoint is disabled"});return}if(req.method!=="POST"){this.sendResponse(res,405,{error:"Method not allowed. Only POST requests are accepted."});return}const authResult=this.validateAuth(req.headers);if(!authResult.valid){this.sendResponse(res,401,{error:authResult.error});return}const connectorName=this.getConnectorName(req.headers);if(!connectorName){this.sendResponse(res,400,{error:"Missing x-connector-name header"});return}let body="";req.on("data",chunk=>{body+=chunk.toString()}),req.on("end",()=>{try{const data=body?JSON.parse(body):{};this.emitExternalEvent(connectorName,data),this.sendResponse(res,200,{success:!0,message:`Event EXT:${connectorName} emitted successfully`})}catch(error){logger$1.error("Error processing HTTP request",error),this.sendResponse(res,400,{error:"Invalid JSON payload"})}}),req.on("error",error=>{logger$1.error("HTTP request error",error),this.sendResponse(res,500,{error:"Internal server error"})})}handleWebSocketConnection(ws,req){logger$1.debug("New WebSocket connection");const authResult=this.validateAuth(req.headers);if(!authResult.valid){ws.close(1008,authResult.error);return}let connectorName=this.getConnectorName(req.headers);ws.on("message",message=>{try{const data=JSON.parse(message.toString());if(!connectorName&&(connectorName=data.connectorName||data["x-connector-name"],!connectorName)){ws.send(JSON.stringify({error:"Missing connector name in headers or message"}));return}this.emitExternalEvent(connectorName,data),ws.send(JSON.stringify({success:!0,message:`Event EXT:${connectorName} emitted successfully`}))}catch(error){logger$1.error("Error processing WebSocket message",error),ws.send(JSON.stringify({error:"Invalid JSON message"}))}}),ws.on("error",error=>{logger$1.error("WebSocket error",error)}),ws.on("close",()=>{logger$1.debug("WebSocket connection closed")})}validateAuth(headers){const authHeader=headers.authorization||headers.Authorization,serviceName=headers["x-service-name"]||headers["X-Service-Name"];if(!authHeader)return logger$1.warn("Missing Authorization header"),{valid:!1,error:"Missing Authorization header"};if(!serviceName||typeof serviceName!="string")return logger$1.warn("Missing or invalid X-Service-Name header"),{valid:!1,error:"Missing X-Service-Name header"};const token=authHeader.replace(/^Bearer\s+/i,"");return token?validateServiceKey(serviceName,token)?(logger$1.debug(`Authenticated service: ${serviceName}`),{valid:!0,serviceName}):(logger$1.warn(`Invalid key for service: ${serviceName}`),{valid:!1,error:"Invalid authentication"}):{valid:!1,error:"Invalid Authorization header format"}}getConnectorName(headers){const connectorName=headers["x-connector-name"]||headers["X-Connector-Name"];return typeof connectorName=="string"?connectorName:connectorName?.[0]||null}emitExternalEvent(connectorName,data){const eventName=`EXT:${connectorName}`,connector=ConnectorService.getInstance(TConnectorService[connectorName]);connector&&connector.handleEvent(eventName,data)}sendResponse(res,statusCode,body){res.statusCode=statusCode,res.setHeader("Content-Type","application/json"),res.end(JSON.stringify(body))}getStatus(){return{running:this.isRunning,port:this.config.port,config:this.config}}}var __defProp$1=Object.defineProperty,__defNormalProp$1=(obj,key,value)=>key in obj?__defProp$1(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1=(obj,key,value)=>__defNormalProp$1(obj,typeof key!="symbol"?key+"":key,value);const logger=Logger("SRE"),_SmythRuntime=class _SmythRuntime2{constructor(){__publicField$1(this,"started",!1),__publicField$1(this,"_smythDir"),__publicField$1(this,"_readyPromise"),__publicField$1(this,"_readyResolve"),__publicField$1(this,"defaultConfig",{Vault:{Connector:"JSONFileVault",Settings:{shared:"default"}},Account:{Connector:"DummyAccount"},Cache:{Connector:"RAM"},Storage:{Connector:"LocalStorage"},Code:{Connector:"DummyConnector"},NKV:{Connector:"LocalStorage"},VectorDB:{Connector:"RAMVec"},ModelsProvider:{Connector:"JSONModelsProvider"},AgentData:{Connector:"NullAgentData"},Component:{Connector:"LocalComponent"},ManagedVault:{Connector:"NullManagedVault"},Log:{Connector:"ConsoleLog"},Router:{Connector:"NullRouter"},Scheduler:{Connector:"LocalScheduler",Settings:{runJobs:!0,persistExecutionHistory:!0}}}),__publicField$1(this,"connectors",{}),__publicField$1(this,"connectorInstances",{}),__publicField$1(this,"_initializing",!1),__publicField$1(this,"_initialized",!1),__publicField$1(this,"_stopping",!1),this.started=!0,this._readyPromise=new Promise(resolve=>{this._readyResolve=resolve})}get smythDir(){return this._smythDir}get version(){return pkg.version}static get Instance(){return _SmythRuntime2.instance||(_SmythRuntime2.instance=new _SmythRuntime2),_SmythRuntime2.instance}get initializing(){return this._initializing}init(_config){if(logger.info(`SRE v${this.version} initializing...`),this._initialized)return console.warn("SRE already initialized ... skipping"),_SmythRuntime2.Instance;if(this._initializing)return console.warn("You tried to initialize SRE while it is already initializing ... skipping"),_SmythRuntime2.Instance;(!_config||JSON.stringify(_config)==="{}")&&(this._smythDir=findSmythPath(),logger.info(".smyth directory found in:",this._smythDir)),this._initializing=!0,SystemEvents.on("SRE:Booted",()=>{this._readyResolve(!0)}),boot();const config2=this.autoConf(_config);for(let connectorType in config2)for(let configEntry of config2[connectorType])ConnectorService.init(connectorType,configEntry.Connector,configEntry.Id,configEntry.Settings,configEntry.Default)||logger.warn(`Failed to initialize connector ${connectorType}:${configEntry.Id||configEntry.Connector}`);return this._initialized=!0,SystemEvents.emit("SRE:Initialized",_SmythRuntime2.Instance),this.setupShutdownHandlers(),_SmythRuntime2.Instance}autoConf(config2={}){const defaultConfig=JSON.parse(JSON.stringify(this.defaultConfig)),keys=Object.keys({...defaultConfig,...config2}),newConfig={};for(let connectorType of keys){newConfig[connectorType]=[];let entry=config2[connectorType]||defaultConfig[connectorType];Array.isArray(entry)||(entry=[entry]);let hasDefault=!1;for(let connector of entry){if(!connector.Connector){logger.warn(`Missing Connector Name in ${connectorType} entry ... it will be ignored`);continue}connector.Default&&(hasDefault&&logger.warn(`Entry ${connectorType} has more than one default Connector ... only the first one will be used`),hasDefault=!0),newConfig[connectorType].push(connector)}!hasDefault&&newConfig[connectorType].length>0&&(newConfig[connectorType][0].Default=!0)}return newConfig}ready(){return this._readyPromise}async _stop(){this._stopping||(this._stopping=!0,logger.info("Sending Shutdown Signals To All Subsystems..."),await ConnectorService._stop(),this.started=!1)}setupShutdownHandlers(){["SIGINT","SIGTERM"].forEach(signal=>{process.on(signal,async()=>{await shutdown(signal),process.exit(0)})}),process.on("beforeExit",code=>{shutdown("beforeExit")}),process.on("exit",code=>{logger.info("Goodbye!")})}};__publicField$1(_SmythRuntime,"instance");let SmythRuntime=_SmythRuntime;const SRE=SmythRuntime.Instance;let shuttingDown=!1;async function shutdown(reason){if(SmythRuntime.Instance.started&&!shuttingDown&&(shuttingDown=!0,logger.info(`Caught ${reason} ... Attempting graceful shutdown`),SmythRuntime.Instance))try{await SmythRuntime.Instance._stop()}catch(err){logger.error("Shutdown error:",err)}}class SmythURI{static agent(id){return`smyth:agent:${id}`}}class LLMMemoryConnector extends SecureConnector{requester(candidate){return{load:async messages=>await this.load(candidate.readRequest,messages)}}}var __defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp(target,key,result),result},__publicField=(obj,key,value)=>__defNormalProp(obj,key+"",value);Logger("HashicorpVault");class HashicorpVault extends VaultConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField(this,"name","HashicorpVault")}async get(acRequest,keyId){return null}async exists(acRequest,keyId){return!1}async listKeys(acRequest){return[]}async getResourceACL(resourceId,candidate){const teamId=await ConnectorService.getAccountConnector().getCandidateTeam(candidate),acl=new ACL;return acl.addAccess(TAccessRole.Team,teamId,TAccessLevel.Owner).addAccess(TAccessRole.Team,teamId,TAccessLevel.Read).addAccess(TAccessRole.Team,teamId,TAccessLevel.Write),acl}}__decorateClass([SecureConnector.AccessControl],HashicorpVault.prototype,"get"),__decorateClass([SecureConnector.AccessControl],HashicorpVault.prototype,"exists"),__decorateClass([SecureConnector.AccessControl],HashicorpVault.prototype,"listKeys");export{ACL,ACLAccessDeniedError,APICall,APIEndpoint,APIKeySource,APIOutput,AWSLambdaCode,AccessCandidate,AccessRequest,AccountConnector,AccountService,Agent,AgentDataConnector,AgentDataService,AgentLogger,AgentPlugin,AgentProcess,AgentRequest,AgentRuntime,AgentSSE,AgentSettings,AnthropicConnector,Async,Await,BUILT_IN_MODEL_PREFIX,BaseEmbedding,BedrockConnector,BinaryInput,BuiltinLLMProviders,CLIAgentDataConnector,CLIConnector,CLIService,COMP_NAMES,CacheConnector,CacheService,Classifier,CodeConnector,CodeService,Component,ComponentConnector,ComponentHost,ComponentInputType,ComponentInstances,ComponentService,Connector,ConnectorService,ConnectorServiceProvider,ConsoleLog,Conversation,Credentials,DEFAULT_MAX_TOKENS_FOR_LLM,DEFAULT_SMYTHOS_LLM_PROVIDERS_SETTINGS,DEFAULT_TEAM_ID,DataSourceCleaner,DataSourceCompError,DataSourceComponent,DataSourceLookup,DummyAccount,DummyConnector,EMBODIMENT_TYPES,ENTERPRISE_MODELS_SETTING_KEY,ERR_MSG_INVALID_BINARY,ERR_MSG_INVALID_IMAGE_SOURCE,ERR_MSG_MAX_ARRAY_SIZE,ERR_MSG_MAX_DEPTH,ERR_MSG_MAX_OBJECT_SIZE,EchoConnector,EmbeddingsFactory,EmbodimentSettings,ExpressRouter,ExternalEventsReceiver,FEncDec,FHash,FSign,FSleep,FTimestamp,FileStore,ForEach,ForkedAgent,GPTPlugin,GenAILLM,GmailTrigger,GoogleAIConnector,GoogleEmbeds,GroqConnector,HashicorpVault,HookService,HuggingFace,ImageGenerator,ImageSettingsConfig,JSONContent,JSONContentHelper,JSONExpression$1 as JSONExpression,JSONFileAccount,JSONFileVault,JSONFilter,JSONModelsProvider,JSON_RESPONSE_INSTRUCTION,Job,JobSchedulerTrigger,LLMAssistant,LLMCache,LLMConnector,LLMContext,LLMHelper,LLMInference$1 as LLMInference,LLMInterface,LLMMemoryConnector,LLMService,LLMStream,LevelMap,LocalAgentDataConnector,LocalCache,LocalComponentConnector,LocalScheduler,LocalStorage,LocalStorageCache,LogConnector,LogHelper,LogService,Logger,LogicAND,LogicAtLeast,LogicAtMost,LogicOR,LogicXOR,MAX_ARRAY_SIZE,MAX_DEPTH,MAX_FILE_COUNT,MAX_FILE_SIZE,MAX_OBJECT_SIZE,MCPClient,MODELS_WITHOUT_JSON_RESPONSE_SUPPORT,MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT,ManagedOAuth2Credentials,ManagedVaultConnector,ManagedVaultService,Match,MemoryDeleteKeyVal,MemoryReadKeyVal,MemoryWriteKeyVal,MemoryWriteObject,MilvusVectorDB,ModelsProviderConnector,ModelsProviderService,MultimodalLLM,MySQLAccount,NKVConnector,NKVLocalStorage,NKVRAM,NKVRedis,NKVService,NullAgentData,NullManagedVault,NullRouter,NullVault,O3_AND_O4_MODELS,O3_AND_O4_MODELS_PATTERN,OSResourceMonitor,OTel,OTelContextRegistry,OllamaConnector,OpenAIConnector,OpenAIEmbeds,OpenAPIParser,PerplexityConnector,PineconeVectorDB,PromptGenerator,RAMCache,RAMVectorDB,REQUEST_CONTENT_TYPES,REQUEST_METHODS,RedisCache,ReverseLevelMap,ReverseRoleMap,RoleMap,RouterConnector,RouterService,RuntimeContext,S3Cache,S3Storage,S3_DAILY_PURGE_LIFECYCLE_TAG,S3_MONTHLY_PURGE_LIFECYCLE_TAG,S3_WEEKLY_PURGE_LIFECYCLE_TAG,SEARCH_TOOL_COSTS,SRE,SUPPORTED_MIME_TYPES_MAP,Schedule,SchedulerConnector,SchedulerService,ScrapflyWebScrape,SecretManagerManagedVault,SecretsManager,SecureConnector,ServerlessCode,SmythFS,SmythRuntime,SmythURI,StorageConnector,StorageService,SystemEvents,TAccessLevel,TAccessResult,TAccessRole,TConnectorService,TDataSourceCompErrorCodes,THook,TLLMCredentials,TLLMEvent,TLLMMessageRole,TLLMProvider,TOOL_USE_DEFAULT_MODEL,TPLProcessor,TToolType,TavilyWebSearch,TelemetryConnector,TelemetryService,TemplateString,TemplateStringHelper,Trigger,USER_CUSTOM_MODELS_SETTING_KEY,VaultConnector,VaultHelper,VaultService,VectorDBConnector,VectorDBService,VertexAIConnector,VisionLLM,WhatsAppTrigger,ZapierAction,boot,buildOAuth1Header,cachePrefix,cacheTTL,calculateExecutionCost,checkAndInstallLifecycleRules,createOrUpdateLambdaFunction,customModels,destroyPublicUrls,escapeJsonField,escapeString,extractAdditionalParamsForOAuth1,extractAllKeyNamesFromTemplateVars,extractKeyFromTemplateVar,findSmythPath,findValidResourcePath,generateCodeFromLegacyComponent,generateCodeHash,generateExecutableCode,generateExpiryMetadata,generateLambdaCode,generateLifecycleRules,generateServiceKey,getCredentials,getCurrentEnvironmentVariables,getDeployedCodeHash,getDeployedFunction,getLLMCredentials,getLambdaCredentials,getLambdaFunctionName,getLambdaRolePolicy,getNonExistingRules,getSanitizeCodeHash,getSortedObjectValues,handleOAuthHeaders,hook,hookAsync,hookAsyncWithContext,hookableClass,inputErrMsg,invokeLambdaFunction,isAgent,isValidGroqReasoningEffort,isValidOpenAIReasoningEffort,models,parseArrayBufferResponse,parseData,parseHeaders,parseProxy,parseSmythFsUrl,parseUrl,performTypeInference,reportUsage,retrieveOAuthTokens,runJs,setDeployedCodeHash,ttlToExpiryDays,updateDeployedCodeTTL,validateAsyncMainFunction,validateServiceKey,verifyFunctionDeploymentStatus,version,waitForRoleDeploymentStatus,xAIConnector,zipCode};
|
|
249
287
|
//# sourceMappingURL=index.js.map
|