UNPKG

@astreus-ai/astreus

Version:

AI Agent Framework with Chat Management

11 lines 106 kB
var tt=Object.defineProperty;var $=(i,e)=>()=>(i&&(e=i(i=0)),e);var Ae=(i,e)=>{for(var t in e)tt(i,t,{get:e[t],enumerable:!0})};function z(i){return S.prefix?`${i}[${Te}]${x.reset} `:""}function st(){if(!S.timestamp)return"";let i=Date.now();if(Math.abs(i-xe)<1e3)return"";xe=i;let e=new Date(i);return`${x.gray}[${e.toLocaleTimeString()}]${x.reset} `}function D(i,e,...t){if(i<S.level)return;let r=z(e),n=st();if(S.lineBreak&&i>=3&&U("log"),S.colors){let a=t.map(o=>typeof o=="string"?`${e}${o}${x.reset}`:o);U("log",`${n}${r}${a.join(" ")}`)}else{let o=(c=>{let g="",d=!1;for(let l=0;l<c.length;l++){if(c[l]==="\x1B"&&c[l+1]==="["){d=!0,l++;continue}if(d){c[l]==="m"&&(d=!1);continue}g+=c[l]}return g})(r);U("log",`${n}${o}${t.join(" ")}`)}}function U(i,...e){i==="log"?console.log(...e):i==="info"?console.info(...e):i==="warn"?console.warn(...e):i==="error"&&console.error(...e)}function Pe(i){S={...S,...i}}function at(){S.level>1||(U("log"),U("log",`${x.cyan}${x.bright}${Te} AI Framework v${rt}${x.reset}`),U("log"))}var x,Te,rt,ve,nt,S,xe,s,_=$(()=>{"use strict";x={reset:"\x1B[0m",bright:"\x1B[1m",dim:"\x1B[2m",underscore:"\x1B[4m",blink:"\x1B[5m",reverse:"\x1B[7m",hidden:"\x1B[8m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"},Te="Astreus",rt="0.1.0",ve=(o=>(o[o.DEBUG=0]="DEBUG",o[o.INFO=1]="INFO",o[o.SUCCESS=2]="SUCCESS",o[o.WARN=3]="WARN",o[o.ERROR=4]="ERROR",o[o.NONE=5]="NONE",o))(ve||{}),nt={level:1,prefix:!0,colors:!0,lineBreak:!1,timestamp:!1},S={...nt},xe=0;s={debug:(...i)=>D(0,x.gray,...i),info:(...i)=>D(1,x.blue,...i),success:(...i)=>D(2,x.green,...i),warn:(...i)=>D(3,x.yellow,...i),error:(...i)=>D(4,x.red,...i),task:(i,e,t)=>{let r=t?`Task [${t}]:`:"Task:";D(1,x.magenta,`${r} ${e}`)},agent:(i,e)=>{D(1,x.cyan,`Agent [${i}]: ${e}`)},database:(i,e)=>{D(0,x.blue,`${i}: ${e}`)},memory:(i,e)=>{D(0,x.magenta,`${i}: ${e}`)},session:(i,e)=>{let t=i.substring(0,8);D(1,x.green,`${t}: ${e}`)},plugin:(i,e)=>{let t=i.charAt(0).toUpperCase()+i.slice(1);D(1,x.yellow,`${t}: ${e}`)},workflow:(i,e)=>{D(1,x.cyan,`${i}: ${e}`)},startProgress:i=>{if(S.level>1)return setInterval(()=>{},1e3);S.lineBreak&&U("log"),process.stdout.write(`${z(x.blue)}${x.blue}${i}`);let e=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],t=0;return setInterval(()=>{process.stdout.write(`\r${z(x.blue)}${x.blue}${i} ${x.cyan}${e[t]}${x.reset}`),t=(t+1)%e.length},100)},endProgress:(i,e)=>{clearInterval(i),!(S.level>1)&&(e?process.stdout.write(`\r${z(x.blue)}${x.green}${e} \u2713${x.reset} `):process.stdout.write(`\r${z(x.blue)}${x.green}Done \u2713${x.reset} `))},setLineBreak:i=>{Pe({lineBreak:i})}}});var re,Jt,ne,se,Re=$(()=>{"use strict";re="astreus-agent",Jt="gpt-4o-mini",ne=.3,se=4096});var ae,$e=$(()=>{"use strict";ae=10});var De,Kt,Se=$(()=>{"use strict";De="./.astreus/db",Kt={SAME_AS_MAIN:"same_as_main",POSTGRES:"postgres",QDRANT:"qdrant",PINECONE:"pinecone",MILVUS:"milvus",WEAVIATE:"weaviate"}});var Yt,Ht,Ne,oe,Qt,Oe=$(()=>{"use strict";Yt={OPENAI:"openai",OLLAMA:"ollama"},Ht="https://api.openai.com/v1",Ne="text-embedding-3-small",oe="http://localhost:11434",Qt={openai:{"gpt-4o":{apiKey:process.env.OPENAI_API_KEY||"",baseUrl:process.env.OPENAI_BASE_URL,temperature:.7,maxTokens:4096},"gpt-4o-mini":{apiKey:process.env.OPENAI_API_KEY||"",baseUrl:process.env.OPENAI_BASE_URL,temperature:.7,maxTokens:2048},"gpt-4":{apiKey:process.env.OPENAI_API_KEY||"",baseUrl:process.env.OPENAI_BASE_URL,temperature:.7,maxTokens:4096},"gpt-3.5-turbo":{apiKey:process.env.OPENAI_API_KEY||"",baseUrl:process.env.OPENAI_BASE_URL,temperature:.7,maxTokens:2048}},ollama:{llama3:{baseUrl:process.env.OLLAMA_BASE_URL||"http://localhost:11434",temperature:.7,maxTokens:2048},mistral:{baseUrl:process.env.OLLAMA_BASE_URL||"http://localhost:11434",temperature:.7,maxTokens:2048}}}});var _e,Le,Ge,Ue,Be=$(()=>{"use strict";_e=1e3,Le=200,Ge=.7,Ue=10});var er,tr,rr,Fe=$(()=>{"use strict";er=5,tr=3,rr={PENDING:"pending",RUNNING:"running",COMPLETED:"completed",FAILED:"failed"}});var sr,qe=$(()=>{"use strict";sr={MISSING_PARAMETER:"Missing required parameter:",INVALID_PROVIDER:"Invalid provider configuration",INVALID_MEMORY:"Invalid memory configuration",INVALID_DATABASE:"Invalid database configuration",INVALID_RAG:"Invalid RAG configuration",INVALID_VECTOR_DB:"Invalid vector database configuration",INVALID_TASK:"Invalid task configuration",INVALID_EMBEDDING:"Invalid embedding configuration"}});var L=$(()=>{"use strict";Re();$e();Se();Oe();Be();Fe();qe()});import{OpenAI as ut}from"openai";function W(i,e){return{name:i,apiKey:process.env.OPENAI_API_KEY,baseUrl:process.env.OPENAI_BASE_URL,temperature:.7,maxTokens:2048,...e}}var V,de=$(()=>{"use strict";_();V=class{constructor(e,t){this.provider=e,this.name=t.name,this.config=t,this.client=new ut({apiKey:t.apiKey||process.env.OPENAI_API_KEY,baseURL:t.baseUrl||process.env.OPENAI_BASE_URL})}async complete(e,t){try{let r=this.prepareMessages(e,t?.systemMessage),n=this.buildRequestOptions(r,t);s.debug(`OpenAI request: model=${this.name}`,{messages:r.length,hasTools:!!n.tools,toolCount:n.tools?.length||0});let a=await this.client.chat.completions.create(n);return this.processResponse(a)}catch(r){throw this.handleError(r),r}}async streamComplete(e,t,r){try{let n=this.prepareMessages(e,t?.systemMessage),a=this.buildRequestOptions(n,t);a.stream=!0,s.debug(`OpenAI streaming request: model=${this.name}`,{messages:n.length,hasTools:!!a.tools,toolCount:a.tools?.length||0});let o=await this.client.chat.completions.create(a),c="";for await(let g of o){let d=g.choices[0]?.delta?.content||"";d&&(c+=d,r&&r(c))}return c}catch(n){throw this.handleError(n),n}}prepareMessages(e,t){let r=e.map(n=>({role:n.role,content:n.content}));return t&&r.unshift({role:"system",content:t}),r}buildRequestOptions(e,t){let r={model:this.name,messages:e,temperature:t?.temperature??this.config.temperature??.7,max_tokens:t?.maxTokens??this.config.maxTokens};return t?.tools&&t.tools.length>0&&(r.tools=t.tools.map(n=>({type:"function",function:{name:n.name,description:n.description||"",parameters:this.formatToolParameters(n.parameters)}})),t.toolCalling&&(r.tool_choice="auto")),r}formatToolParameters(e){let t={type:"object",properties:{},additionalProperties:!1};if(!e)return t;if(typeof e=="object"){if("type"in e&&e.type==="object")return e;if("properties"in e)return t.properties=e.properties,Array.isArray(e.required)&&e.required.length>0&&(t.required=e.required),t;if(Array.isArray(e)){let r=[];e.forEach(n=>{if(typeof n=="object"&&n.name&&n.type){let a={type:n.type,description:n.description||`Parameter ${n.name}`};n.type==="array"&&(a.items=n.items||{type:"string"},n.minItems!==void 0&&(a.minItems=n.minItems),n.maxItems!==void 0&&(a.maxItems=n.maxItems)),n.default!==void 0&&(a.default=n.default),t.properties[n.name]=a,n.required&&r.push(n.name)}}),r.length>0&&(t.required=r)}}return t}processResponse(e){if(!e.choices?.[0]?.message)throw s.error("Unexpected OpenAI API response structure:",{responseId:e.id,responseObject:JSON.stringify(e),hasChoices:!!e.choices,choicesLength:e.choices?.length,firstChoice:e.choices?.[0]?"exists":"missing",hasMessage:!!e.choices?.[0]?.message}),e.choices?e.choices.length?e.choices[0].message?new Error(`OpenAI API unexpected response structure: ${JSON.stringify(e)}`):new Error(`OpenAI API response missing 'message' in first choice: ${JSON.stringify(e.choices[0])}`):new Error(`OpenAI API response has empty 'choices' array: ${JSON.stringify(e)}`):new Error(`OpenAI API response missing 'choices' field: ${JSON.stringify(e)}`);let t=e.choices[0].message,r=t.tool_calls;return r?.length>0?(s.debug("OpenAI raw tool calls:",JSON.stringify(r,null,2)),{content:t.content||"",tool_calls:r.map(n=>{try{if(n.type==="function"){let a={};if(n.function?.arguments)try{a=typeof n.function.arguments=="string"?JSON.parse(n.function.arguments):n.function.arguments}catch(o){s.error("Error parsing function arguments",{error:o})}return{type:"function",id:n.id,name:n.function?.name,arguments:a}}return n}catch(a){return s.error("Error processing tool call",{error:a}),{type:"error",error:a instanceof Error?a.message:String(a)}}})}):t.content||""}handleError(e){e&&(s.error("OpenAI API error:",{message:e.message,status:e.status,type:e.type,headers:e.headers,code:e.code,param:e.param,error:e.error}),e.stack&&s.debug(`Error stack: ${e.stack}`))}}});function j(i,e){return{name:i,baseUrl:process.env.OLLAMA_BASE_URL||oe,temperature:.7,maxTokens:2048,...e}}var J,le=$(()=>{"use strict";L();_();J=class{constructor(e,t){this.provider=e,this.name=t.name,this.config=t,this.baseUrl=t.baseUrl||process.env.OLLAMA_BASE_URL||oe}async complete(e,t){try{let r=this.prepareMessages(e,t?.systemMessage),n=this.buildRequestOptions(r,t);s.debug(`Ollama request: model=${this.name}`,{messages:r.length,hasTools:!!t?.tools,toolCount:t?.tools?.length||0});let a=await fetch(`${this.baseUrl}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!a.ok){let c=await a.text();throw new Error(`Ollama API error: ${a.status} ${c}`)}let o=await a.json();return this.processResponse(o)}catch(r){throw this.handleError(r),r}}prepareMessages(e,t){let r=e.map(n=>({role:n.role,content:n.content}));return t&&r.unshift({role:"system",content:t}),r}buildRequestOptions(e,t){let r={model:this.name,messages:e,options:{temperature:t?.temperature??this.config.temperature??.7,num_predict:t?.maxTokens??this.config.maxTokens},stream:!1};return t?.tools&&t.tools.length>0&&t.toolCalling&&(r.tools=t.tools.map(n=>({type:"function",function:{name:n.name,description:n.description||"",parameters:this.formatToolParameters(n.parameters)}}))),r}formatToolParameters(e){let t={type:"object",properties:{},additionalProperties:!1};if(!e)return t;if(typeof e=="object"){if("type"in e&&e.type==="object")return e;if("properties"in e)return t.properties=e.properties,Array.isArray(e.required)&&e.required.length>0&&(t.required=e.required),t;if(Array.isArray(e)){let r=[];e.forEach(n=>{if(typeof n=="object"&&n.name&&n.type){let a={type:n.type,description:n.description||`Parameter ${n.name}`};n.type==="array"&&(a.items=n.items||{type:"string"},n.minItems!==void 0&&(a.minItems=n.minItems),n.maxItems!==void 0&&(a.maxItems=n.maxItems)),n.default!==void 0&&(a.default=n.default),t.properties[n.name]=a,n.required&&r.push(n.name)}}),r.length>0&&(t.required=r)}}return t}processResponse(e){if(!e?.message)throw s.error("Unexpected Ollama API response structure:",{responseObject:JSON.stringify(e)}),new Error(`Ollama API unexpected response structure: ${JSON.stringify(e)}`);let t=e.message,r=t.tool_calls;return r?.length>0?(s.debug("Ollama raw tool calls:",JSON.stringify(r,null,2)),{content:t.content||"",tool_calls:r.map(n=>{try{if(n.type==="function"){let a={};if(n.function?.arguments)try{a=typeof n.function.arguments=="string"?JSON.parse(n.function.arguments):n.function.arguments}catch(o){s.error("Error parsing function arguments",{error:o})}return{type:"function",id:n.id,name:n.function?.name,arguments:a}}return n}catch(a){return s.error("Error processing tool call",{error:a}),{type:"error",error:a instanceof Error?a.message:String(a)}}})}):t.content||""}handleError(e){e&&s.error("Ollama API error:",{message:e.message,status:e.status,type:e.type,stack:e.stack})}}});var Je={};Ae(Je,{Embedding:()=>N});import ht from"openai";import ft from"dotenv";var N,me=$(()=>{"use strict";_();L();ft.config();N=class{static initClient(){if(!this.client){let e=process.env.OPENAI_EMBEDDING_API_KEY||process.env.OPENAI_API_KEY;if(!e)throw new Error("OpenAI API key is required for embeddings - set OPENAI_API_KEY or OPENAI_EMBEDDING_API_KEY");this.client=new ht({apiKey:e,baseURL:"https://api.openai.com/v1"})}return this.client}static async generateEmbedding(e,t=process.env.OPENAI_EMBEDDING_MODEL||Ne){try{if(!e||typeof e!="string")throw new Error("Invalid text input for embedding generation");let r=this.initClient();return s.debug(`Generating embedding for text with model: ${t}`),(await r.embeddings.create({model:t,input:e,encoding_format:"float"})).data[0].embedding}catch(r){throw s.error("Error generating embedding:",r),r}}static calculateSimilarity(e,t){if(!e||!t||e.length!==t.length)return 0;let r=0,n=0,a=0;for(let o=0;o<e.length;o++)r+=e[o]*t[o],n+=e[o]*e[o],a+=t[o]*t[o];return n=Math.sqrt(n),a=Math.sqrt(a),n===0||a===0?0:r/(n*a)}static findSimilarTexts(e,t,r=5){return!e||!t||t.length===0?[]:t.map(({text:a,embedding:o})=>({text:a,similarity:this.calculateSimilarity(e,o)})).sort((a,o)=>o.similarity-a.similarity).slice(0,r)}static async isAvailable(e){try{if(!(process.env.OPENAI_EMBEDDING_API_KEY||process.env.OPENAI_API_KEY))return s.warn("OpenAI API key not found for embeddings"),!1;let r=await this.generateEmbedding("test",e);return Array.isArray(r)&&r.length>0}catch(t){return s.warn("Embedding test failed:",t),!1}}static async listAvailableModels(){try{return(await this.initClient().models.list()).data.filter(r=>r.id.includes("embedding")).map(r=>r.id)}catch(e){return s.error("Error listing available models:",e),[]}}};N.client=null});var B={};Ae(B,{Embedding:()=>N,OllamaProvider:()=>J,OpenAIProvider:()=>V,createOllamaConfig:()=>j,createOpenAIConfig:()=>W,createProvider:()=>ze});var ze,O=$(()=>{"use strict";de();le();me();de();le();ze=i=>{if(i.type==="openai")return{type:"openai",listModels(){return i.models||[i.model||"gpt-3.5-turbo"]},getModel(e){let t=W(e,i);return new V("openai",t)},getDefaultModel(){return i.model||"gpt-3.5-turbo"},getEmbeddingModel(){return i.embeddingModel||"text-embedding-3-small"},async generateEmbedding(e){try{let{Embedding:t}=await Promise.resolve().then(()=>(me(),Je)),r=i.embeddingModel||"text-embedding-3-small";return await t.generateEmbedding(e,r)}catch(t){return console.error("Error generating embedding:",t),null}}};if(i.type==="ollama")return{type:"ollama",listModels(){return i.models||[i.model||"llama2"]},getModel(e){let t={name:e,...i},r=j?j(e,i):t;return new J("ollama",r)},getDefaultModel(){return i.model||"llama2"}};throw new Error(`Unknown provider type: ${i.type}`)}});_();import{v4 as mt}from"uuid";import Ve from"fs";import ct from"path";import dt from"dotenv";import ot from"knex";function Me(i){return ot({client:"sqlite3",connection:{filename:typeof i.connection=="string"?i.connection:":memory:"},useNullAsDefault:!0})}import it from"knex";function Ce(i){return it({client:"pg",connection:i.connection})}import{v4 as lt}from"uuid";_();function T(i,e,t){if(!i||typeof i!="object")throw new Error(`Invalid parameters object for ${t}: expected an object but got ${typeof i}`);let r=[];for(let n of e)n in i?(i[n]===void 0||i[n]===null)&&r.push(n):r.push(n);if(r.length>0)throw new Error(`Missing required parameter${r.length>1?"s":""} for ${t}: ${r.join(", ")}`)}function m(i,e,t){if(i==null)throw new Error(`Missing required parameter '${e}' for ${t}`)}_();function te(i){let e=[];if(e.push({name:"rag_search",description:"Search through documents using semantic similarity to find relevant information",parameters:[{name:"query",type:"string",description:"The search query to find relevant documents or content",required:!0},{name:"limit",type:"number",description:"Maximum number of results to return",required:!1,default:5}],execute:async t=>{try{let r=t.query,n=t.limit;if(!r)throw new Error("Query parameter is required");let a=await i.search(r,n);return{success:!0,results:a.map(o=>({content:o.content,metadata:o.metadata,similarity:o.similarity,sourceId:o.sourceId})),query:r,resultCount:a.length}}catch(r){return s.error("Error executing RAG search:",r),{success:!1,error:r instanceof Error?r.message:"Unknown error occurred during search",query:t.query}}}}),"searchByVector"in i){let t=i;e.push({name:"rag_add_document",description:"Add a new document to the RAG system for future searches",parameters:[{name:"content",type:"string",description:"The document content to add",required:!0},{name:"metadata",type:"object",description:"Additional metadata for the document",required:!1,default:{}}],execute:async r=>{try{let n=r.content,a=r.metadata;if(!n)throw new Error("Content parameter is required");return{success:!0,documentId:await t.addDocument({content:n,metadata:a||{}}),message:"Document added successfully"}}catch(n){return s.error("Error adding document to RAG:",n),{success:!1,error:n instanceof Error?n.message:"Unknown error occurred while adding document"}}}}),e.push({name:"rag_get_document",description:"Retrieve a specific document by its ID",parameters:[{name:"documentId",type:"string",description:"The ID of the document to retrieve",required:!0}],execute:async r=>{try{let n=r.documentId;if(!n)throw new Error("DocumentId parameter is required");let a=await t.getDocumentById(n);return a?{success:!0,document:{id:a.id,content:a.content,metadata:a.metadata}}:{success:!1,error:"Document not found",documentId:n}}catch(n){return s.error("Error retrieving document from RAG:",n),{success:!1,error:n instanceof Error?n.message:"Unknown error occurred while retrieving document",documentId:r.documentId}}}}),e.push({name:"rag_delete_document",description:"Delete a document from the RAG system",parameters:[{name:"documentId",type:"string",description:"The ID of the document to delete",required:!0}],execute:async r=>{try{let n=r.documentId;if(!n)throw new Error("DocumentId parameter is required");return await t.deleteDocument(n),{success:!0,message:"Document deleted successfully",documentId:n}}catch(n){return s.error("Error deleting document from RAG:",n),{success:!1,error:n instanceof Error?n.message:"Unknown error occurred while deleting document",documentId:r.documentId}}}})}if("searchByMetadata"in i){let t=i;e.push({name:"rag_search_by_metadata",description:"Search documents by their metadata properties",parameters:[{name:"filter",type:"object",description:"Metadata filter criteria as key-value pairs",required:!0},{name:"limit",type:"number",description:"Maximum number of results to return",required:!1,default:5}],execute:async r=>{try{let n=r.filter,a=r.limit;if(!n)throw new Error("Filter parameter is required");let o=await t.searchByMetadata(n,a);return{success:!0,results:o.map(c=>({content:c.content,metadata:c.metadata,similarity:c.similarity,sourceId:c.sourceId})),filter:n,resultCount:o.length}}catch(n){return s.error("Error executing RAG metadata search:",n),{success:!1,error:n instanceof Error?n.message:"Unknown error occurred during metadata search",filter:r.filter}}}})}return s.debug(`Created ${e.length} RAG tools for agent use`),e}L();import{v4 as fr}from"uuid";dt.config();var ie=class{constructor(e){this.initialized=!1;this.customTables=new Map;m(e,"config","Database constructor"),T(e,["type"],"Database constructor"),this.config=e;let t=e.tablePrefix||"";if(this.tableNames={agents:t+(e.tableNames?.agents||"agents"),users:t+(e.tableNames?.users||"users"),tasks:t+(e.tableNames?.tasks||"tasks"),memories:t+(e.tableNames?.memories||"memories"),chats:t+(e.tableNames?.chats||"chats"),custom:e.tableNames?.custom||{}},e.tableNames?.custom&&Object.entries(e.tableNames.custom).forEach(([r,n])=>{this.customTables.set(r,t+n)}),e.type==="sqlite")this.knex=Me(e);else if(e.type==="postgresql")this.knex=Ce(e);else throw new Error(`Unsupported database type: ${e.type}`)}async connect(){try{await this.knex.raw("SELECT 1"),s.database("Connect",`Connected to ${this.config.type} database`)}catch(e){throw s.error(`Error connecting to ${this.config.type} database:`,e),e}}async disconnect(){await this.knex.destroy(),s.database("Disconnect",`Disconnected from ${this.config.type} database`)}async executeQuery(e,t=[]){m(e,"query","executeQuery");try{return this.knex.raw(e,t)}catch(r){throw s.error("Error executing query:",r),r}}async hasTable(e){return m(e,"tableName","hasTable"),await this.knex.schema.hasTable(e)}async createTable(e,t){m(e,"tableName","createTable"),m(t,"schema","createTable");try{await this.knex.schema.createTable(e,t),s.database("CreateTable",`Created table: ${e}`)}catch(r){throw s.error(`Error creating table ${e}:`,r),r}}async dropTable(e){m(e,"tableName","dropTable");try{await this.knex.schema.dropTableIfExists(e),s.database("DropTable",`Dropped table: ${e}`)}catch(t){throw s.error(`Error dropping table ${e}:`,t),t}}async ensureTable(e,t){m(e,"tableName","ensureTable"),m(t,"schema","ensureTable"),await this.hasTable(e)?s.database("EnsureTable",`Table ${e} already exists`):await this.createTable(e,t)}registerCustomTable(e,t){m(e,"name","registerCustomTable"),m(t,"tableName","registerCustomTable");let r=this.config.tablePrefix||"";this.customTables.set(e,r+t),s.database("RegisterCustomTable",`Registered custom table: ${e} -> ${r+t}`)}getCustomTableName(e){return this.customTables.get(e)}async initializeSchema(){try{await this.migrateLegacyTables(),this.initialized=!0,s.database("InitializeSchema","Database schema initialization complete (legacy migrations only)")}catch(e){throw s.error("Error initializing database schema:",e),e}}async migrateLegacyTables(e){let t=e||this.tableNames.memories;if(await this.knex.schema.hasTable("task_contexts")){try{let n=await this.knex("task_contexts").select("*");if(n.length>0)if(s.database("InitializeSchema",`Migrating ${n.length} task contexts to memory system...`),!await this.knex.schema.hasTable(t))s.warn(`Memories table '${t}' does not exist. Skipping task contexts migration.`);else{let o=n.map(c=>({id:lt(),agentId:"system",sessionId:c.sessionId,userId:"",role:"task_context",content:c.data,timestamp:c.updatedAt||new Date,metadata:JSON.stringify({contextType:"task_execution_context",migratedFrom:"task_contexts"})}));await this.knex(t).insert(o),s.database("InitializeSchema","Task contexts migration completed successfully")}}catch(n){s.error("Error migrating task contexts:",n)}await this.knex.schema.dropTable("task_contexts"),s.database("InitializeSchema","Dropped deprecated task_contexts table")}}getTable(e){m(e,"tableName","getTable");let t=this.knex;return{async insert(r){m(r,"data","insert");try{return(await t(e).insert(r))[0]}catch(n){throw s.error(`Error inserting into ${e}:`,n),n}},async find(r){try{let n=t(e);return r&&(n=n.where(r)),n.select("*")}catch(n){throw s.error(`Error finding in ${e}:`,n),n}},async findOne(r){m(r,"filter","findOne");try{return await t(e).where(r).first()||null}catch(n){throw s.error(`Error finding one in ${e}:`,n),n}},async update(r,n){m(r,"filter","update"),m(n,"data","update");try{return await t(e).where(r).update(n)}catch(a){throw s.error(`Error updating in ${e}:`,a),a}},async delete(r){m(r,"filter","delete");try{return await t(e).where(r).delete()}catch(n){throw s.error(`Error deleting from ${e}:`,n),n}}}}isInitialized(){return this.initialized}getTableNames(){return this.tableNames}},F=async i=>{if(i)T(i,["type"],"createDatabase");else{let t=process.env.DATABASE_TYPE||"sqlite";if(t==="sqlite"){let r=process.env.DATABASE_PATH||De,n=ct.dirname(r);Ve.existsSync(n)||(Ve.mkdirSync(n,{recursive:!0}),s.database("CreateDatabase",`Created database directory: ${n}`)),i={type:"sqlite",connection:r},s.database("CreateDatabase",`Using SQLite database at ${r}`)}else if(t==="postgresql")if(process.env.DATABASE_URL){let r=new URL(process.env.DATABASE_URL),n=r.hostname,a=parseInt(r.port||"5432"),o=r.username,c=r.password,g=r.pathname.substring(1);i={type:"postgresql",connection:{host:n,port:a,user:o,password:c,database:g}},s.database("CreateDatabase",`Using PostgreSQL database from URL: ${n}:${a}/${g}`)}else throw new Error("PostgreSQL connection requires DATABASE_URL environment variable");else throw new Error(`Unsupported database type: ${t}`)}let e=new ie(i);return await e.connect(),await e.initializeSchema(),e};var q=class q{constructor(e){m(e,"config","PluginManager constructor"),T(e,["name","tools"],"PluginManager constructor"),this.config={...e,description:e.description||`Plugin manager for ${e.name}`,version:e.version||"1.0.0",tools:e.tools||[]},this.tools=new Map,this.config.tools&&this.config.tools.forEach(t=>{this.registerTool(t)}),s.info(`Plugin manager initialized with ${this.tools.size} tools`)}getTools(){return Array.from(this.tools.values())}getTool(e){return m(e,"name","getTool"),this.tools.get(e)}registerTool(e){m(e,"tool","registerTool");try{if(!e.name){s.warn("Cannot register tool: Missing name property");return}if(!e.execute||typeof e.execute!="function"){s.warn(`Cannot register tool "${e.name}": Missing execute method`);return}this.tools.set(e.name,e),q.register(e),s.debug(`Tool "${e.name}" registered successfully`)}catch(t){throw s.error(`Failed to register tool: ${t}`),t}}removeTool(e){m(e,"name","removeTool");let t=this.tools.delete(e);return t&&(q.unregister(e),s.debug(`Tool "${e}" removed`)),t}hasTool(e){return m(e,"name","hasTool"),this.tools.has(e)}getToolCount(){return this.tools.size}static register(e){m(e,"plugin","PluginManager.register");try{if(!e.name){s.warn("Cannot register plugin: Missing name property");return}if(!e.execute||typeof e.execute!="function"){s.warn(`Cannot register plugin "${e.name}": Missing execute method`);return}this.registry.set(e.name,e),s.debug(`Plugin "${e.name}" registered in global registry`)}catch(t){throw s.error(`Failed to register plugin in global registry: ${t}`),t}}static unregister(e){m(e,"name","PluginManager.unregister");let t=this.registry.delete(e);return t&&s.debug(`Plugin "${e}" unregistered from global registry`),t}static get(e){return m(e,"name","PluginManager.get"),this.registry.get(e)}static getAll(){return Array.from(this.registry.values())}static getByAgent(e){try{m(e,"agentId","getByAgent"),s.debug(`Getting plugins for agent ${e}`),s.debug(`Total plugins in registry: ${this.registry.size}`);let t=Array.from(this.registry.values());return t.forEach((r,n)=>{let a=r?.name||"unnamed";s.debug(`Plugin ${n}: ${a}`)}),t}catch(t){return s.error(`Error getting plugins for agent ${e}:`,t),[]}}static reset(){this.registry.clear(),s.info("Global plugin registry reset")}static has(e){return m(e,"name","PluginManager.has"),this.registry.has(e)}static count(){return this.registry.size}static async load(e){m(e,"pluginOrPath","PluginManager.load");try{if(typeof e=="string")try{let t=await import(e),r=t.default||t;if(r&&typeof r=="object")this.register(r),s.info(`Plugin loaded from path: ${e}`);else{let n=`Plugin module at ${e} does not export a valid plugin`;throw s.warn(n),new Error(n)}}catch(t){throw s.error(`Failed to load plugin from ${e}:`,t),t}else if(e&&typeof e=="object")this.register(e),s.info(`Plugin "${e.name}" loaded directly`);else throw new Error("Invalid plugin format")}catch(t){throw s.error("Error loading plugin:",t),t}}static async loadMany(e){m(e,"plugins","PluginManager.loadMany");try{await Promise.all(e.map(t=>this.load(t))),s.info(`Loaded ${e.length} plugins`)}catch(t){throw s.error("Error loading multiple plugins:",t),t}}static create(e){return m(e,"config","PluginManager.create"),T(e,["name","tools"],"PluginManager.create"),new q(e)}};q.registry=new Map;var G=q;_();L();var ce=class{constructor(e){if(m(e,"config","Agent constructor"),T(e,["memory"],"Agent constructor"),!e.model&&!e.provider)throw new Error("Either 'model' or 'provider' must be specified in agent config");if(e.provider&&!e.model){let t=e.provider.getDefaultModel?.()||e.provider.listModels()[0];if(t)e.model=e.provider.getModel(t);else throw new Error("No default model available in provider")}if(!e.model)throw new Error("No model could be determined for the agent");if(this.id=e.id||mt(),this.config={...e,name:e.name||re,description:e.description||`Agent ${e.name||re}`,tools:e.tools||[],plugins:e.plugins||[]},this.memory=e.memory,this.tools=new Map,this.chatManager=e.chat,this.config.tools&&this.config.tools.forEach(t=>{this.tools.set(t.name,t)}),this.config.rag){let t=te(this.config.rag);t.forEach(r=>{this.tools.set(r.name,r)}),s.debug(`Added ${t.length} RAG tools to agent ${this.config.name}`)}if(this.config.plugins){for(let t of this.config.plugins)if(t&&"getTools"in t&&typeof t.getTools=="function"){let r=t.getTools();r&&Array.isArray(r)&&r.forEach(n=>{n&&n.name&&(this.tools.set(n.name,n),G.register(n))})}else if(t&&"name"in t&&t.name&&"execute"in t){let r=t;this.tools.set(r.name,r),G.register(r)}}}getModel(){if(!this.config.model)throw new Error("No model specified for agent");return this.config.model}getProvider(){return this.config.provider}async getHistory(e,t){return m(e,"sessionId","getHistory"),await this.memory.getBySession(e,t)}async clearHistory(e){m(e,"sessionId","clearHistory"),await this.memory.clear(e)}async addToMemory(e){return m(e.sessionId,"params.sessionId","addToMemory"),m(e.role,"params.role","addToMemory"),m(e.content,"params.content","addToMemory"),await this.memory.add({agentId:this.id,sessionId:e.sessionId,role:e.role,content:e.content,metadata:e.metadata||{}})}async listSessions(e){try{return(await this.memory.listSessions(this.id,e)).map(r=>({sessionId:r.sessionId,lastMessage:r.lastMessage||r.content,messageCount:r.messageCount||1,lastActivity:r.lastActivity||r.createdAt||new Date,metadata:r.metadata||{}}))}catch(t){return s.error(`Error listing sessions for agent ${this.id}:`,t),[]}}async chat(e){m(e.message,"params.message","chat");let{message:t,sessionId:r=`session-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,systemPrompt:n=this.config.systemPrompt,temperature:a=.7,maxTokens:o=2e3,metadata:c={}}=e,g=r?await this.getHistory(r):[],d=[...n?[{role:"system",content:n}]:[],...g.map(w=>({role:w.role==="user"?"user":"assistant",content:w.content})),{role:"user",content:t}],h=await this.getModel().complete(d,{temperature:a,maxTokens:o}),f=typeof h=="string"?h:h.content;return await this.addToMemory({sessionId:r,role:"user",content:t,metadata:c}),await this.addToMemory({sessionId:r,role:"assistant",content:f,metadata:c}),f}async streamChat(e){m(e.message,"params.message","streamChat");let{message:t,sessionId:r=`session-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,systemPrompt:n=this.config.systemPrompt,temperature:a=.7,maxTokens:o=2e3,metadata:c={},onChunk:g}=e,d=r?await this.getHistory(r):[],l=[...n?[{role:"system",content:n}]:[],...d.map(p=>({role:p.role==="user"?"user":"assistant",content:p.content})),{role:"user",content:t}],h="",f=this.getModel(),b=this.getProvider()?.client||f?.client;if(b&&b.chat&&b.chat.completions){s.debug(`Agent ${this.config.name}: Using real OpenAI streaming`);let p=await b.chat.completions.create({model:f.name||"gpt-4o-mini",messages:l,stream:!0,temperature:a,max_tokens:o});for await(let y of p){let k=y.choices[0]?.delta?.content||"";k&&(h+=k,g&&g(k))}}else if(f.complete){s.debug(`Agent ${this.config.name}: Using simulated streaming`);let p=await f.complete(l,{temperature:a,maxTokens:o}),y=typeof p=="string"?p:p.content;if(h=y,g){let k=y.split(" ");for(let u=0;u<k.length;u++){let P=k[u]+(u<k.length-1?" ":"");g(P),await new Promise(I=>setTimeout(I,50))}}}else throw new Error("No suitable model method available for streaming");return await this.addToMemory({sessionId:r,role:"user",content:t,metadata:c}),await this.addToMemory({sessionId:r,role:"assistant",content:h,metadata:c}),h}getAvailableTools(){return Array.from(this.tools.keys())}addTool(e){m(e,"tool","addTool"),T(e,["name","description","execute"],"addTool"),this.tools.set(e.name,e)}getChatManager(){return this.chatManager}setChatManager(e){this.chatManager=e}async createChat(e){if(!this.chatManager)throw new Error("Chat manager not configured for this agent");return await this.chatManager.createChat({chatId:e.chatId,userId:e.userId,agentId:this.id,title:e.title,metadata:e.metadata})}async getChat(e){if(m(e,"chatId","getChat"),!this.chatManager)throw new Error("Chat manager not configured for this agent");return await this.chatManager.getChat(e)}async updateChat(e,t){if(m(e,"chatId","updateChat"),!this.chatManager)throw new Error("Chat manager not configured for this agent");await this.chatManager.updateChat(e,t)}async deleteChat(e){if(m(e,"chatId","deleteChat"),!this.chatManager)throw new Error("Chat manager not configured for this agent");await this.chatManager.deleteChat(e)}async archiveChat(e){if(m(e,"chatId","archiveChat"),!this.chatManager)throw new Error("Chat manager not configured for this agent");await this.chatManager.archiveChat(e)}async listChats(e){if(!this.chatManager)throw new Error("Chat manager not configured for this agent");return await this.chatManager.listChats({...e,agentId:this.id})}async searchChats(e){if(m(e.query,"params.query","searchChats"),!this.chatManager)throw new Error("Chat manager not configured for this agent");return await this.chatManager.searchChats({...e,agentId:this.id})}async getChatStats(e){if(!this.chatManager)throw new Error("Chat manager not configured for this agent");return await this.chatManager.getChatStats({...e,agentId:this.id})}async chatWithId(e){if(m(e.message,"params.message","chatWithId"),m(e.chatId,"params.chatId","chatWithId"),!this.chatManager)throw new Error("Chat manager not configured for this agent");return await this.chatManager.getChat(e.chatId)||await this.chatManager.createChat({chatId:e.chatId,userId:e.userId,agentId:this.id,metadata:e.metadata}),await this.chatManager.chat({message:e.message,chatId:e.chatId,agentId:this.id,userId:e.userId,model:this.getModel(),systemPrompt:e.systemPrompt||this.config.systemPrompt,tools:Array.from(this.tools.values()),metadata:e.metadata,temperature:e.temperature,maxTokens:e.maxTokens})}async streamChatWithId(e){if(m(e.message,"params.message","streamChatWithId"),m(e.chatId,"params.chatId","streamChatWithId"),!this.chatManager)throw new Error("Chat manager not configured for this agent");await this.chatManager.getChat(e.chatId)||await this.chatManager.createChat({chatId:e.chatId,userId:e.userId,agentId:this.id,metadata:e.metadata});let r=await this.chatManager.chat({message:e.message,chatId:e.chatId,agentId:this.id,userId:e.userId,model:this.getModel(),systemPrompt:e.systemPrompt||this.config.systemPrompt,tools:Array.from(this.tools.values()),metadata:e.metadata,temperature:e.temperature,maxTokens:e.maxTokens});return e.onChunk&&e.onChunk(r),r}},gt=async i=>{if(m(i,"config","createAgent"),T(i,["memory"],"createAgent"),!i.model&&!i.provider)throw new Error("Either 'model' or 'provider' must be specified in agent config");let e=new ce(i);try{let t=i.database||await F(),r=t.getTableNames();await t.ensureTable(r.agents,o=>{o.string("id").primary(),o.string("name").notNullable(),o.text("description").nullable(),o.text("systemPrompt").nullable(),o.string("modelName").notNullable(),o.timestamp("createdAt").defaultTo(t.knex.fn.now()),o.timestamp("updatedAt").defaultTo(t.knex.fn.now()),o.json("configuration").nullable()});let n=t.getTable(r.agents);await n.findOne({id:e.id})?(await n.update({id:e.id},{name:e.config.name,description:e.config.description||null,systemPrompt:e.config.systemPrompt||null,modelName:e.config.model?.name||"unknown",updatedAt:new Date,configuration:JSON.stringify({hasTools:e.getAvailableTools().length>0,supportsTaskSystem:!0})}),s.agent(e.config.name,`Agent updated in database with ID: ${e.id}`)):(await n.insert({id:e.id,name:e.config.name,description:e.config.description||null,systemPrompt:e.config.systemPrompt||null,modelName:e.config.model?.name||"unknown",createdAt:new Date,updatedAt:new Date,configuration:JSON.stringify({hasTools:e.getAvailableTools().length>0,supportsTaskSystem:!0})}),s.agent(e.config.name,`Agent saved to database with ID: ${e.id}`))}catch(t){s.error("Error saving agent to database:",t)}return e};O();O();import{v4 as pt}from"uuid";L();var ge=class i{constructor(e){m(e,"config","MemoryManager constructor"),T(e,["database"],"MemoryManager constructor"),this.config={...e,tableName:e.tableName||"memories",maxEntries:e.maxEntries||10,enableEmbeddings:e.enableEmbeddings||!1},s.debug("Memory manager initialized")}static async create(e){m(e,"config","MemoryManager.create"),T(e,["database"],"MemoryManager.create");try{let{database:t}=e,r={...e,tableName:e.tableName||"memories",maxEntries:e.maxEntries||10,enableEmbeddings:e.enableEmbeddings||!1},{tableName:n}=r;return await t.ensureTable(n,a=>{a.string("id").primary(),a.string("agentId").notNullable().index(),a.string("sessionId").notNullable().index(),a.string("userId").nullable().index(),a.string("role").notNullable(),a.text("content").notNullable(),a.timestamp("timestamp").defaultTo(t.knex.fn.now()),a.json("embedding").nullable(),a.json("metadata")}),r.enableEmbeddings&&(s.info(`Memory initialized with embedding support using table: ${n}`),await t.knex.schema.hasColumn(n,"embedding")||(s.warn(`Adding embedding column to memory table: ${n}`),await t.knex.schema.table(n,o=>{o.json("embedding")}))),s.info(`Memory created with custom table: ${n}`),new i(r)}catch(t){throw s.error("Error creating memory instance:",t),t}}async add(e){m(e,"entry","add"),T(e,["agentId","sessionId","role","content"],"add");try{let{database:t,tableName:r,enableEmbeddings:n}=this.config,a=pt(),o=new Date,c={...e};if(c.role=this.validateRole(c.role),n&&!c.embedding&&c.content)try{s.debug(`Generating embedding for memory entry ${a}`);let d=await N.generateEmbedding(c.content);c.embedding=d,s.debug(`Generated embedding for memory entry ${a} (${d.length} dimensions)`)}catch(d){s.warn(`Failed to generate embedding for memory entry ${a}:`,d)}let g={...c,id:a,timestamp:o};return c.embedding&&(typeof c.embedding=="string"?c.embedding==="[object Object]"?g.embedding=null:g.embedding=c.embedding:Array.isArray(c.embedding)?g.embedding=JSON.stringify(c.embedding):(s.warn(`Unexpected embedding type for entry ${a}, setting to null`),g.embedding=null)),await t.getTable(r).insert(g),s.debug(`Added memory entry ${a}${c.embedding?" with embedding":""} with role: ${c.role}`),a}catch(t){throw s.error("Error adding memory entry:",t),t}}async getBySession(e,t){m(e,"sessionId","getBySession");try{let{database:r,tableName:n,maxEntries:a}=this.config,o=await r.knex(n).where({sessionId:e}).orderBy("timestamp","asc").limit(t||a);return s.debug(`Retrieved ${o.length} entries for session ${e}`),this.processEntriesBeforeReturn(o)}catch(r){throw s.error(`Error getting entries for session ${e}:`,r),r}}async getByAgent(e,t){m(e,"agentId","getByAgent");try{let{database:r,tableName:n,maxEntries:a}=this.config,o=await r.knex(n).where({agentId:e}).orderBy("timestamp","asc").limit(t||a);return s.debug(`Retrieved ${o.length} entries for agent ${e}`),this.processEntriesBeforeReturn(o)}catch(r){throw s.error(`Error getting entries for agent ${e}:`,r),r}}async getByUser(e,t){m(e,"userId","getByUser");try{let{database:r,tableName:n,maxEntries:a}=this.config,o=await r.knex(n).where({userId:e}).orderBy("timestamp","desc").limit(t||a);return s.debug(`Retrieved ${o.length} entries for user ${e}`),this.processEntriesBeforeReturn(o)}catch(r){throw s.error(`Error getting entries for user ${e}:`,r),r}}async getById(e){m(e,"id","getById");try{let{database:t,tableName:r}=this.config,n=await t.knex(r).where({id:e}).first();return n?(s.debug(`Retrieved memory entry with ID ${e}`),this.processEntriesBeforeReturn([n])[0]):(s.debug(`Memory entry with ID ${e} not found`),null)}catch(t){throw s.error(`Error getting memory entry by ID ${e}:`,t),t}}async delete(e){m(e,"id","delete");try{let{database:t,tableName:r}=this.config;await t.knex(r).where({id:e}).delete()===0?s.warn(`No memory entry found for deletion with ID ${e}`):s.debug(`Deleted memory entry with ID ${e}`)}catch(t){throw s.error(`Error deleting memory entry with ID ${e}:`,t),t}}processEntriesBeforeReturn(e){return e.map(t=>{let r=t,n={id:String(r.id||""),agentId:String(r.agentId||""),sessionId:String(r.sessionId||""),role:this.validateRole(String(r.role||"")),content:String(r.content||""),timestamp:r.timestamp instanceof Date?r.timestamp:new Date(String(r.timestamp||"")),metadata:r.metadata};if(r.embedding)if(typeof r.embedding=="string")if(r.embedding==="[object Object]")n.embedding=void 0;else try{n.embedding=JSON.parse(r.embedding)}catch(a){s.error(`Error parsing embedding for entry ${String(r.id)}:`,a),n.embedding=void 0}else Array.isArray(r.embedding)&&(n.embedding=r.embedding);return n})}async searchByText(e,t=10){m(e,"query","searchByText");try{let{database:r,tableName:n}=this.config;if(!e)return[];let a=await r.knex(n).whereRaw("LOWER(content) LIKE ?",[`%${e.toLowerCase()}%`]).orderBy("timestamp","desc").limit(t);return s.debug(`Text search for "${e}" found ${a.length} results`),this.processEntriesBeforeReturn(a)}catch(r){return s.error("Error searching memories by text:",r),[]}}async searchByEmbedding(e,t=5,r=0){m(e,"embedding","searchByEmbedding");try{let{database:n,tableName:a}=this.config;if(!e||!e.length)return[];let d=(await n.knex(a).whereNotNull("embedding").orderBy("timestamp","desc").limit(100)).map(l=>{let h;if(l.embedding)try{typeof l.embedding=="string"?h=JSON.parse(l.embedding):Array.isArray(l.embedding)&&(h=l.embedding)}catch(f){s.error(`Error parsing embedding for entry ${l.id}:`,f)}return h&&Array.isArray(h)?{...l,embedding:h}:null}).filter(Boolean).map(l=>{let h=N.calculateSimilarity(e,l.embedding);return{...this.processEntriesBeforeReturn([l])[0],similarity:h}}).filter(l=>l.similarity>=r).sort((l,h)=>h.similarity-l.similarity).slice(0,t);return s.debug(`Found ${d.length} results in embedding search with threshold ${r}`),d}catch(n){return s.error("Error searching memories by embedding:",n),[]}}async clear(e){m(e,"sessionId","clear");try{let{database:t,tableName:r}=this.config,n=await t.knex(r).where({sessionId:e}).delete();s.debug(`Cleared ${n} entries for session ${e}`)}catch(t){throw s.error(`Error clearing entries for session ${e}:`,t),t}}async summarize(e){m(e,"sessionId","summarize");try{let t=await this.getBySession(e);if(!t.length)return"No conversation history available.";let r=`Conversation with ${t.length} messages starting at ${t[0].timestamp.toISOString()}.`;return s.debug(`Generated summary for session ${e}`),r}catch(t){throw s.error(`Error summarizing session ${e}:`,t),t}}async addWithEmbedding(e,t){m(e,"entry","addWithEmbedding"),m(t,"embedding","addWithEmbedding"),T(e,["agentId","sessionId","role","content"],"addWithEmbedding");try{let r=await this.add({...e,embedding:t});return s.debug(`Added memory entry ${r} with embedding`),r}catch(r){throw s.error("Error adding memory entry with embedding:",r),r}}validateRole(e){let t=["system","user","assistant","task_context","task_event","task_tool","task_result"];return e.startsWith("task_")?"user":t.includes(e)?e:"user"}async listSessions(e,t){m(e,"agentId","listSessions");try{let{database:r,tableName:n,maxEntries:a}=this.config,o=await r.knex(n).select("sessionId").select(r.knex.raw("COUNT(*) as messageCount")).select(r.knex.raw("MAX(timestamp) as lastActivity")).select(r.knex.raw("(SELECT content FROM "+n+" WHERE sessionId = t.sessionId AND agentId = ? ORDER BY timestamp DESC LIMIT 1) as lastMessage",[e])).select(r.knex.raw("(SELECT metadata FROM "+n+" WHERE sessionId = t.sessionId AND agentId = ? ORDER BY timestamp DESC LIMIT 1) as metadata",[e])).from(n+" as t").where({agentId:e}).groupBy("sessionId").orderBy("lastActivity","desc").limit(t||a);return s.debug(`Retrieved ${o.length} sessions for agent ${e}`),o.map(c=>({sessionId:c.sessionId,lastMessage:c.lastMessage||void 0,messageCount:parseInt(c.messageCount)||0,lastActivity:c.lastActivity instanceof Date?c.lastActivity:new Date(c.lastActivity),metadata:c.metadata?typeof c.metadata=="string"?JSON.parse(c.metadata):c.metadata:void 0}))}catch(r){throw s.error(`Error listing sessions for agent ${e}:`,r),r}}},yt=async i=>(m(i,"config","createMemory"),T(i,["database"],"createMemory"),ge.create(i));import{v4 as ye}from"uuid";var ue=(o=>(o.SAME_AS_MAIN="same_as_main",o.POSTGRES="postgres",o.QDRANT="qdrant",o.PINECONE="pinecone",o.MILVUS="milvus",o.WEAVIATE="weaviate",o))(ue||{}),je=(t=>(t.VECTOR="vector",t.DOCUMENT="document",t))(je||{});import bt from"dotenv";import wt from"knex";bt.config();var Y=class{constructor(e){this.config=e}},he=class extends Y{constructor(t){super(t);this.connected=!1;this.tableName=t.options?.tableName||"vector_embeddings",this.knex=wt({client:"pg",connection:t.connectionString||{host:process.env.POSTGRES_HOST||"localhost",port:parseInt(process.env.POSTGRES_PORT||"5432"),user:process.env.POSTGRES_USER||"postgres",password:process.env.POSTGRES_PASSWORD||"",database:process.env.POSTGRES_DB||"postgres"}}),s.debug("PostgreSQL vector database connector initialized")}async ensureConnection(){if(!this.connected)try{await this.knex.raw("SELECT 1"),await this.knex.raw("CREATE EXTENSION IF NOT EXISTS vector"),await this.knex.schema.hasTable(this.tableName)||(await this.knex.schema.createTable(this.tableName,r=>{r.string("id").primary(),r.string("documentId").notNullable(),r.text("content").notNullable(),r.specificType("embedding","vector"),r.jsonb("metadata"),r.timestamp("createdAt").defaultTo(this.knex.fn.now())}),await this.knex.raw(`CREATE INDEX ${this.tableName}_embedding_idx ON ${this.tableName} USING ivfflat (embedding vector_l2_ops)`),s.debug(`Created ${this.tableName} table with pgvector index`)),this.connected=!0,s.debug("Connected to PostgreSQL vector database")}catch(t){throw s.error("Error connecting to PostgreSQL vector database:",t),new Error(`Failed to initialize PostgreSQL vector database: ${t}`)}}async addVectors(t){try{await this.ensureConnection();let r=t.map(({id:a,vector:o,metadata:c})=>{let{documentId:g,content:d,...l}=c;return{id:a,documentId:g||"unknown",content:d||"",embedding:this.knex.raw(`'[${o.join(",")}]'::vector`),metadata:JSON.stringify(l),createdAt:new Date}}),n=50;for(let a=0;a<r.length;a+=n){let o=r.slice(a,a+n);await this.knex(this.tableName).insert(o)}s.debug(`Added ${t.length} vectors to PostgreSQL`)}catch(r){throw s.error("Error adding vectors to PostgreSQL:",r),r}}async searchVectors(t,r=10,n=.7){try{await this.ensureConnection();let a=Math.sqrt(2*(1-n)),c=(await this.knex.raw(` SELECT id, 1 - (embedding <-> ?) / 2 as similarity FROM ${this.tableName} WHERE embedding <-> ? < ? ORDER BY similarity DESC LIMIT ? `,[`[${t.join(",")}]`,`[${t.join(",")}]`,a,r])).rows;return s.debug(`Found ${c.length} similar vectors in PostgreSQL`),c.map(g=>({id:g.id,similarity:parseFloat(g.similarity)}))}catch(a){throw s.error("Error searching vectors in PostgreSQL:",a),a}}async getVectorMetadata(t){try{await this.ensureConnection();let r=await this.knex(this.tableName).where("id",t).select("metadata").first();return r?JSON.parse(r.metadata):null}catch(r){throw s.error(`Error getting metadata for vector ${t}:`,r),r}}async deleteVectors(t){try{await this.ensureConnection(),await this.knex(this.tableName).whereIn("id",t).delete(),s.debug(`Deleted ${t.length} vectors from PostgreSQL`)}catch(r){throw s.error("Error deleting vectors from PostgreSQL:",r),r}}async close(){try{this.knex&&(await this.knex.destroy(),this.connected=!1,s.debug("Closed PostgreSQL vector database connection"))}catch(t){throw s.error("Error closing PostgreSQL connection:",t),t}}},fe=class extends Y{constructor(e,t){super(e),this.database=t;let r=t.getTableNames();this.tableName=e.options?.tableName||t.getCustomTableName("vector_embeddings")||"vector_embeddings",s.debug("Main database vector connector initialized")}async addVectors(e){try{let t=e.map(({id:n,vector:a,metadata:o})=>{let{documentId:c,content:g,...d}=o;return{id:n,documentId:c||"unknown",content:g||"",embedding:JSON.stringify(a),metadata:JSON.stringify(d),createdAt:new Date}}),r=50;for(let n=0;n<t.length;n+=r){let a=t.slice(n,n+r);await this.database.knex(this.tableName).insert(a)}s.debug(`Added ${e.length} vectors to main database`)}catch(t){throw s.error("Error adding vectors to main database:",t),t}}async searchVectors(e,t=10,r=.7){try{let a=(await this.database.knex(this.tableName).select("id","embedding")).map(o=>{try{let c;if(!o.embedding)return s.warn(`Empty embedding for vector ${o.id}, skipping`),null;if(Array.isArray(o.embedding))c=o.embedding;else if(typeof o.embedding=="string"){if(o.embedding.trim()==="")return s.warn(`Empty embedding string for vector ${o.id}, skipping`),null;c=JSON.parse(o.embedding)}else if(typeof o.embedding=="object")c=o.embedding;else return s.warn(`Unknown embedding type for vector ${o.id}, skipping`),null;if(!Array.isArray(c)||c.length===0)return s.warn(`Invalid embedding format for vector ${o.id}, skipping`),null;let g=this.calculateCosineSimilarity(e,c);return{id:o.id,similarity:g}}catch(c){return s.warn(`Failed to parse embedding for vector ${o.id}:`,c),null}}).filter(o=>o!==null&&o.similarity>=r).sort((o,c)=>c.similarity-o.similarity).slice(0,t);return s.debug(`Found ${a.length} similar vectors in main database`),a}catch(n){throw s.error("Error searching vectors in main database:",n),n}}async getVectorMetadata(e){try{let t=await this.database.knex(this.tableName).where("id",e).select("metadata").first();return t?JSON.parse(t.metadata):null}catch(t){throw s.error(`Error getting metadata for vector ${e}:`,t),t}}calculateCosineSimilarity(e,t){if(e.length!==t.length)throw new Error("Vector dimensions do not match");let r=0,n=0,a=0;for(let o=0;o<e.length;o++)r+=e[o]*t[o],n+=e[o]*e[o],a+=t[o]*t[o];return n=Math.sqrt(n),a=Math.sqrt(a),n===0||a===0?0:r/(n*a)}async deleteVectors(e){try{await this.database.knex(this.tableName).whereIn("id",e).delete(),s.debug(`Deleted ${e.length} vectors from main database`)}catch(t){throw s.error("Error deleting vectors from main database:",t),t}}async close(){s.debug("Main database vector connector closed")}};function pe(i,e){if(i||(i=Ke()),!i||i.type==="same_as_main"){if(!e)throw new Error("Database instance is required when using SAME_AS_MAIN vector database type");let t=i||{type:"same_as_main"};return new fe(t,e)}switch(i.type){case"postgre