@elizaos/plugin-sql 1.0.0-alpha.57 → 1.0.0-alpha.59

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/README.md CHANGED
@@ -36,6 +36,26 @@ Important Note: Once an agent is initialized with a specific embedding dimension
36
36
  - Room and participant management
37
37
  - Goal tracking system
38
38
 
39
+ ## Database Schema
40
+
41
+ The plugin uses a structured schema with the following main tables:
42
+
43
+ ### Core Tables
44
+ - **Agent**: Stores agent information and configurations
45
+ - **Room**: Manages conversation rooms and their settings
46
+ - **Participant**: Tracks participants in rooms
47
+ - **Memory**: Stores agent memories with vector embeddings for semantic search
48
+ - **Embedding**: Manages vector embeddings for various entities
49
+ - **Entity**: Represents entities that agents can interact with
50
+ - **Relationship**: Tracks relationships between entities
51
+ - **Component**: Stores agent components and their configurations
52
+ - **Tasks**: Manages tasks and goals for agents
53
+ - **Log**: Stores system logs
54
+ - **Cache**: Provides a caching mechanism for frequently accessed data
55
+ - **World**: Manages world settings and configurations
56
+
57
+ Each table is defined using Drizzle ORM schema definitions in the `src/schema` directory. The schema is designed to support the ElizaOS ecosystem's requirements for agent-based systems.
58
+
39
59
  ## Usage
40
60
 
41
61
  The adapter is typically used as part of the ElizaOS runtime:
@@ -81,6 +101,16 @@ The adapter implements the following error handling configurations:
81
101
  - PostgreSQL with vector extension installed
82
102
  - Node.js or Bun (≥1.2.2)
83
103
 
104
+ ## Environment Variables
105
+
106
+ The plugin uses the following environment variables:
107
+
108
+ - `POSTGRES_URL`: Connection string for PostgreSQL database (e.g., `postgresql://user:password@localhost:5432/dbname`)
109
+ - If not provided, the plugin will use PGlite as a fallback
110
+ - `PGLITE_DATA_DIR`: (Optional) Directory for PGlite data storage (default: `../../pglite`)
111
+
112
+ These variables should be defined in a `.env` file at the root of your project.
113
+
84
114
  ## Database Pool Configuration
85
115
 
86
116
  Default pool configuration:
@@ -149,6 +179,50 @@ import { migrate } from "drizzle-orm/node-postgres/migrator";
149
179
  await migrate(db, { migrationsFolder: "./drizzle" });
150
180
  ```
151
181
 
182
+ c. Using the provided migration script:
183
+ ```bash
184
+ npm run migrate
185
+ # or
186
+ pnpm migrate
187
+ ```
188
+
189
+ d. Using drizzle-kit migrate command:
190
+ ```bash
191
+ npx drizzle-kit migrate
192
+ ```
193
+
194
+ This command will read the configuration from `drizzle.config.ts` and pull the PostgreSQL URI from the `.env` file. Make sure your `.env` file contains the `POSTGRES_URL` variable with the correct connection string.
195
+
196
+ ### Migration Configuration
197
+
198
+ The plugin uses a `drizzle.config.ts` file to configure migrations:
199
+
200
+ ```typescript
201
+ import { config } from "dotenv";
202
+ import { defineConfig } from "drizzle-kit";
203
+
204
+ config({ path: "../../.env" });
205
+
206
+ export default defineConfig({
207
+ dialect: "postgresql",
208
+ schema: "./src/schema/index.ts",
209
+ out: "./drizzle/migrations",
210
+ dbCredentials: {
211
+ url: process.env.POSTGRES_URL || "file://../../pglite",
212
+ },
213
+ breakpoints: true,
214
+ });
215
+ ```
216
+
217
+ ### Database Support
218
+
219
+ The plugin supports two database backends:
220
+
221
+ 1. **PostgreSQL**: Used when `POSTGRES_URL` environment variable is provided
222
+ 2. **PGlite**: Used as a fallback when no PostgreSQL URL is provided
223
+
224
+ Both backends use the same migration files, ensuring consistent schema across environments.
225
+
152
226
  ### Note on Vector Support
153
227
  Make sure the PostgreSQL vector extension is installed before running migrations. The adapter will validate vector setup during initialization.
154
228
 
@@ -160,3 +234,36 @@ The adapter implements cleanup handlers for:
160
234
  - beforeExit
161
235
 
162
236
  These ensure proper closing of database connections when the application shuts down.
237
+
238
+ ## Implementation Details
239
+
240
+ ### Connection Management
241
+
242
+ The plugin uses a global singleton pattern to manage database connections. This approach ensures that:
243
+
244
+ 1. **Single Connection Per Process**: Only one connection manager instance exists per Node.js process, regardless of how many times the package is imported or initialized.
245
+
246
+ 2. **Resource Efficiency**: Prevents multiple connection pools to the same database, which could lead to resource exhaustion.
247
+
248
+ 3. **Consistent State**: Ensures all parts of the application share the same database connection state.
249
+
250
+ 4. **Proper Cleanup**: Facilitates proper cleanup of database connections during application shutdown, preventing connection leaks.
251
+
252
+ This pattern is particularly important in monorepo setups or when the package is used by multiple modules within the same process. The implementation uses JavaScript Symbols to create a global registry that persists across module boundaries.
253
+
254
+ ```typescript
255
+ // Example of the singleton pattern implementation
256
+ const GLOBAL_SINGLETONS = Symbol.for("@elizaos/plugin-sql/global-singletons");
257
+
258
+ // Store managers in a global symbol registry
259
+ if (!globalSymbols[GLOBAL_SINGLETONS]) {
260
+ globalSymbols[GLOBAL_SINGLETONS] = {};
261
+ }
262
+
263
+ // Reuse existing managers or create new ones when needed
264
+ if (!globalSingletons.postgresConnectionManager) {
265
+ globalSingletons.postgresConnectionManager = new PostgresConnectionManager(config.postgresUrl);
266
+ }
267
+ ```
268
+
269
+ This approach is especially critical for PGlite connections, which require careful management to ensure proper shutdown and prevent resource leaks.
package/dist/index.js CHANGED
@@ -1047,6 +1047,24 @@ var BaseDrizzleAdapter = class extends DatabaseAdapter {
1047
1047
  }
1048
1048
  });
1049
1049
  }
1050
+ async getLogs(params) {
1051
+ const { entityId, roomId, type, count: count2, offset } = params;
1052
+ return this.withDatabase(async () => {
1053
+ const result = await this.db.select().from(logTable).where(
1054
+ and(
1055
+ eq(logTable.entityId, entityId),
1056
+ roomId ? eq(logTable.roomId, roomId) : void 0,
1057
+ type ? eq(logTable.type, type) : void 0
1058
+ )
1059
+ ).orderBy(desc(logTable.createdAt)).limit(count2 ?? 10).offset(offset ?? 0);
1060
+ return result;
1061
+ });
1062
+ }
1063
+ async deleteLog(logId) {
1064
+ return this.withDatabase(async () => {
1065
+ await this.db.delete(logTable).where(eq(logTable.id, logId));
1066
+ });
1067
+ }
1050
1068
  async searchMemories(params) {
1051
1069
  return await this.searchMemoriesByEmbedding(params.embedding, {
1052
1070
  match_threshold: params.match_threshold,
@@ -1096,6 +1114,7 @@ var BaseDrizzleAdapter = class extends DatabaseAdapter {
1096
1114
  });
1097
1115
  }
1098
1116
  async createMemory(memory, tableName) {
1117
+ console.log("memory.id is", memory.id);
1099
1118
  logger.debug("DrizzleAdapter createMemory:", {
1100
1119
  memoryId: memory.id,
1101
1120
  embeddingLength: memory.embedding?.length,
@@ -1145,21 +1164,20 @@ var BaseDrizzleAdapter = class extends DatabaseAdapter {
1145
1164
  });
1146
1165
  return memoryId;
1147
1166
  }
1148
- async removeMemory(memoryId, tableName) {
1167
+ async deleteMemory(memoryId) {
1149
1168
  return this.withDatabase(async () => {
1150
1169
  await this.db.transaction(async (tx) => {
1151
1170
  await tx.delete(embeddingTable).where(eq(embeddingTable.memoryId, memoryId));
1152
1171
  await tx.delete(memoryTable).where(
1153
- and(eq(memoryTable.id, memoryId), eq(memoryTable.type, tableName))
1172
+ and(eq(memoryTable.id, memoryId))
1154
1173
  );
1155
1174
  });
1156
1175
  logger.debug("Memory removed successfully:", {
1157
- memoryId,
1158
- tableName
1176
+ memoryId
1159
1177
  });
1160
1178
  });
1161
1179
  }
1162
- async removeAllMemories(roomId, tableName) {
1180
+ async deleteAllMemories(roomId, tableName) {
1163
1181
  return this.withDatabase(async () => {
1164
1182
  await this.db.transaction(async (tx) => {
1165
1183
  const memoryIds = await tx.select({ id: memoryTable.id }).from(memoryTable).where(
@@ -1571,6 +1589,7 @@ var BaseDrizzleAdapter = class extends DatabaseAdapter {
1571
1589
  });
1572
1590
  }
1573
1591
  async createWorld(world) {
1592
+ console.trace("*** creating world", world, "with id", world.id);
1574
1593
  return this.withDatabase(async () => {
1575
1594
  const newWorldId = world.id || v4();
1576
1595
  await this.db.insert(worldTable).values({
@@ -1593,6 +1612,7 @@ var BaseDrizzleAdapter = class extends DatabaseAdapter {
1593
1612
  });
1594
1613
  }
1595
1614
  async updateWorld(world) {
1615
+ console.trace("*** updating world", world, "with id", world.id);
1596
1616
  return this.withDatabase(async () => {
1597
1617
  await this.db.update(worldTable).set(world).where(eq(worldTable.id, world.id));
1598
1618
  });
@@ -1877,8 +1897,12 @@ var PgDatabaseAdapter = class extends BaseDrizzleAdapter {
1877
1897
  };
1878
1898
 
1879
1899
  // src/index.ts
1880
- var pgLiteClientManager;
1881
- var postgresConnectionManager;
1900
+ var GLOBAL_SINGLETONS = Symbol.for("@elizaos/plugin-sql/global-singletons");
1901
+ var globalSymbols = global;
1902
+ if (!globalSymbols[GLOBAL_SINGLETONS]) {
1903
+ globalSymbols[GLOBAL_SINGLETONS] = {};
1904
+ }
1905
+ var globalSingletons = globalSymbols[GLOBAL_SINGLETONS];
1882
1906
  function expandTildePath(filepath) {
1883
1907
  if (filepath && typeof filepath === "string" && filepath.startsWith("~")) {
1884
1908
  return filepath.replace(/^~/, os.homedir());
@@ -1891,18 +1915,18 @@ function createDatabaseAdapter(config, agentId) {
1891
1915
  config.dataDir = expandTildePath(config.dataDir);
1892
1916
  }
1893
1917
  if (config.postgresUrl) {
1894
- if (!postgresConnectionManager) {
1895
- postgresConnectionManager = new PostgresConnectionManager(
1918
+ if (!globalSingletons.postgresConnectionManager) {
1919
+ globalSingletons.postgresConnectionManager = new PostgresConnectionManager(
1896
1920
  config.postgresUrl
1897
1921
  );
1898
1922
  }
1899
- return new PgDatabaseAdapter(agentId, postgresConnectionManager);
1923
+ return new PgDatabaseAdapter(agentId, globalSingletons.postgresConnectionManager);
1900
1924
  }
1901
1925
  const dataDir = config.dataDir ?? "./elizadb";
1902
- if (!pgLiteClientManager) {
1903
- pgLiteClientManager = new PGliteClientManager({ dataDir });
1926
+ if (!globalSingletons.pgLiteClientManager) {
1927
+ globalSingletons.pgLiteClientManager = new PGliteClientManager({ dataDir });
1904
1928
  }
1905
- return new PgliteDatabaseAdapter(agentId, pgLiteClientManager);
1929
+ return new PgliteDatabaseAdapter(agentId, globalSingletons.pgLiteClientManager);
1906
1930
  }
1907
1931
  __name(createDatabaseAdapter, "createDatabaseAdapter");
1908
1932
  var drizzlePlugin = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/pg-lite/adapter.ts","../src/base.ts","../src/schema/embedding.ts","../src/schema/memory.ts","../src/schema/agent.ts","../src/schema/types.ts","../src/schema/entity.ts","../src/schema/room.ts","../src/schema/worldTable.ts","../src/schema/cache.ts","../src/schema/component.ts","../src/schema/log.ts","../src/schema/participant.ts","../src/schema/relationship.ts","../src/schema/tasks.ts","../src/pg/adapter.ts"],"sourceRoot":"./","sourcesContent":["import * as os from \"node:os\";\nimport type { IDatabaseAdapter, UUID } from \"@elizaos/core\";\nimport {\n\ttype IAgentRuntime,\n\ttype Plugin,\n\tlogger\n} from \"@elizaos/core\";\nimport { PgliteDatabaseAdapter } from \"./pg-lite/adapter\";\nimport { PGliteClientManager } from \"./pg-lite/manager\";\nimport { PgDatabaseAdapter } from \"./pg/adapter\";\nimport { PostgresConnectionManager } from \"./pg/manager\";\n\n// Singleton connection managers\nlet pgLiteClientManager: PGliteClientManager;\nlet postgresConnectionManager: PostgresConnectionManager;\n\n/**\n * Helper function to expand tilde in paths\n */\nfunction expandTildePath(filepath: string): string {\n\tif (filepath && typeof filepath === \"string\" && filepath.startsWith(\"~\")) {\n\t\treturn filepath.replace(/^~/, os.homedir());\n\t}\n\treturn filepath;\n}\n\n/**\n * Creates a database adapter based on the provided configuration.\n * If a postgresUrl is provided in the config, a PgDatabaseAdapter is initialized using the PostgresConnectionManager.\n * If no postgresUrl is provided, a PgliteDatabaseAdapter is initialized using PGliteClientManager with the dataDir from the config.\n *\n * @param {object} config - The configuration object.\n * @param {string} [config.dataDir] - The directory where data is stored. Defaults to \"./elizadb\".\n * @param {string} [config.postgresUrl] - The URL for the PostgreSQL database.\n * @param {UUID} agentId - The unique identifier for the agent.\n * @returns {IDatabaseAdapter} The created database adapter.\n */\nexport function createDatabaseAdapter(\n\tconfig: {\n\t\tdataDir?: string;\n\t\tpostgresUrl?: string;\n\t},\n\tagentId: UUID,\n): IDatabaseAdapter {\n\t// Expand tilde in database directory path if provided\n\tif (config.dataDir) {\n\t\tconfig.dataDir = expandTildePath(config.dataDir);\n\t}\n\n\tif (config.postgresUrl) {\n\t\tif (!postgresConnectionManager) {\n\t\t\tpostgresConnectionManager = new PostgresConnectionManager(\n\t\t\t\tconfig.postgresUrl,\n\t\t\t);\n\t\t}\n\t\treturn new PgDatabaseAdapter(agentId, postgresConnectionManager);\n\t}\n\n\tconst dataDir = config.dataDir ?? \"./elizadb\";\n\n\tif (!pgLiteClientManager) {\n\t\tpgLiteClientManager = new PGliteClientManager({ dataDir });\n\t}\n\treturn new PgliteDatabaseAdapter(agentId, pgLiteClientManager);\n}\n\n/**\n * Drizzle plugin for database adapter using Drizzle ORM\n *\n * @typedef {Object} Plugin\n * @property {string} name - The name of the plugin\n * @property {string} description - The description of the plugin\n * @property {Function} init - The initialization function for the plugin\n * @param {any} _ - Input parameter\n * @param {IAgentRuntime} runtime - The runtime environment for the agent\n */\nconst drizzlePlugin: Plugin = {\n\tname: \"drizzle\",\n\tdescription: \"Database adapter plugin using Drizzle ORM\",\n\tinit: async (_, runtime: IAgentRuntime) => {\n\t\tconst config = {\n\t\t\tdataDir: runtime.getSetting(\"PGLITE_DATA_DIR\") ?? \"./pglite\",\n\t\t\tpostgresUrl: runtime.getSetting(\"POSTGRES_URL\"),\n\t\t};\n\n\t\ttry {\n\t\t\tconst db = createDatabaseAdapter(config, runtime.agentId);\n\t\t\tlogger.success(\"Database connection established successfully\");\n\t\t\truntime.registerDatabaseAdapter(db);\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize database:\", error);\n\t\t\tthrow error;\n\t\t}\n\t},\n};\n\nexport default drizzlePlugin;\n","import { type UUID, logger } from \"@elizaos/core\";\nimport { type PgliteDatabase, drizzle } from \"drizzle-orm/pglite\";\nimport { BaseDrizzleAdapter } from \"../base\";\nimport {\n\tDIMENSION_MAP,\n\ttype EmbeddingDimensionColumn,\n} from \"../schema/embedding\";\nimport type { PGliteClientManager } from \"./manager\";\n\n/**\n * PgliteDatabaseAdapter class represents an adapter for interacting with a PgliteDatabase.\n * Extends BaseDrizzleAdapter<PgliteDatabase>.\n *\n * @constructor\n * @param {UUID} agentId - The ID of the agent.\n * @param {PGliteClientManager} manager - The manager for the PgliteDatabase.\n *\n * @method withDatabase\n * @param {() => Promise<T>} operation - The operation to perform on the database.\n * @return {Promise<T>} - The result of the operation.\n *\n * @method init\n * @return {Promise<void>} - A Promise that resolves when the initialization is complete.\n *\n * @method close\n * @return {void} - A Promise that resolves when the database is closed.\n */\nexport class PgliteDatabaseAdapter extends BaseDrizzleAdapter<PgliteDatabase> {\n\tprivate manager: PGliteClientManager;\n\tprotected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n\n\t/**\n\t * Constructor for creating an instance of a class.\n\t * @param {UUID} agentId - The unique identifier for the agent.\n\t * @param {PGliteClientManager} manager - The manager for the PGlite client.\n\t */\n\tconstructor(agentId: UUID, manager: PGliteClientManager) {\n\t\tsuper(agentId);\n\t\tthis.manager = manager;\n\t\tthis.db = drizzle(this.manager.getConnection());\n\t}\n\n\t/**\n\t * Asynchronously runs the provided database operation while checking if the database manager is currently shutting down.\n\t * If the database manager is shutting down, a warning is logged and null is returned.\n\t *\n\t * @param {Function} operation - The database operation to be performed.\n\t * @returns {Promise<T>} A promise that resolves with the result of the database operation.\n\t */\n\tprotected async withDatabase<T>(operation: () => Promise<T>): Promise<T> {\n\t\tif (this.manager.isShuttingDown()) {\n\t\t\tlogger.warn(\"Database is shutting down\");\n\t\t\treturn null as unknown as T;\n\t\t}\n\t\treturn operation();\n\t}\n\n\t/**\n\t * Asynchronously initializes the database by running migrations using the manager.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves when the database initialization is complete.\n\t */\n\tasync init(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.manager.runMigrations();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize database:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously closes the manager.\n\t */\n\tasync close() {\n\t\tawait this.manager.close();\n\t}\n}\n","import {\n\ttype Agent,\n\ttype Component,\n\tDatabaseAdapter,\n\ttype Entity,\n\ttype Memory,\n\ttype Participant,\n\ttype Relationship,\n\ttype Room,\n\ttype Task,\n\ttype UUID,\n\ttype World,\n\tlogger\n} from \"@elizaos/core\";\nimport {\n\tand,\n\tcosineDistance,\n\tcount,\n\tdesc,\n\teq,\n\tgte,\n\tinArray,\n\tlte,\n\tor,\n\tsql,\n} from \"drizzle-orm\";\nimport { v4 } from \"uuid\";\nimport {\n\tDIMENSION_MAP,\n\ttype EmbeddingDimensionColumn,\n} from \"./schema/embedding\";\nimport {\n\tagentTable,\n\tcacheTable,\n\tcomponentTable,\n\tembeddingTable,\n\tentityTable,\n\tlogTable,\n\tmemoryTable,\n\tparticipantTable,\n\trelationshipTable,\n\troomTable,\n\ttaskTable,\n\tworldTable\n} from \"./schema/index\";\nimport type { DrizzleOperations } from \"./types\";\n\n// Define the metadata type inline since we can't import it\n/**\n * Represents metadata information about memory.\n * @typedef {Object} MemoryMetadata\n * @property {string} type - The type of memory.\n * @property {string} [source] - The source of the memory.\n * @property {UUID} [sourceId] - The ID of the source.\n * @property {string} [scope] - The scope of the memory.\n * @property {number} [timestamp] - The timestamp of the memory.\n * @property {string[]} [tags] - The tags associated with the memory.\n * @property {UUID} [documentId] - The ID of the document associated with the memory.\n * @property {number} [position] - The position of the memory.\n */\n\ntype MemoryMetadata = {\n\ttype: string;\n\tsource?: string;\n\tsourceId?: UUID;\n\tscope?: string;\n\ttimestamp?: number;\n\ttags?: string[];\n\tdocumentId?: UUID;\n\tposition?: number;\n};\n\n/**\n * Abstract class representing a base Drizzle adapter for working with databases.\n * @template TDatabase - The type of Drizzle operations supported by the adapter.\n */\nexport abstract class BaseDrizzleAdapter<\n\tTDatabase extends DrizzleOperations,\n> extends DatabaseAdapter<TDatabase> {\n\tprotected readonly maxRetries: number = 3;\n\tprotected readonly baseDelay: number = 1000;\n\tprotected readonly maxDelay: number = 10000;\n\tprotected readonly jitterMax: number = 1000;\n\tprotected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n\n\tprotected abstract withDatabase<T>(operation: () => Promise<T>): Promise<T>;\n\tpublic abstract init(): Promise<void>;\n\tpublic abstract close(): Promise<void>;\n\n\tprotected agentId: UUID;\n\n\t/**\n\t * Constructor for creating a new instance of Agent with the specified agentId.\n\t *\n\t * @param {UUID} agentId - The unique identifier for the agent.\n\t */\n\tconstructor(agentId: UUID) {\n\t\tsuper();\n\t\tthis.agentId = agentId;\n\t}\n\n\t/**\n\t * Executes the given operation with retry logic.\n\t * @template T\n\t * @param {() => Promise<T>} operation - The operation to be executed.\n\t * @returns {Promise<T>} A promise that resolves with the result of the operation.\n\t */\n\tprotected async withRetry<T>(operation: () => Promise<T>): Promise<T> {\n\t\tlet lastError: Error = new Error(\"Unknown error\");\n\n\t\tfor (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await operation();\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error as Error;\n\n\t\t\t\tif (attempt < this.maxRetries) {\n\t\t\t\t\tconst backoffDelay = Math.min(\n\t\t\t\t\t\tthis.baseDelay * 2 ** (attempt - 1),\n\t\t\t\t\t\tthis.maxDelay,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst jitter = Math.random() * this.jitterMax;\n\t\t\t\t\tconst delay = backoffDelay + jitter;\n\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`Database operation failed (attempt ${attempt}/${this.maxRetries}):`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\tnextRetryIn: `${(delay / 1000).toFixed(1)}s`,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(\"Max retry attempts reached:\", {\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\ttotalAttempts: attempt,\n\t\t\t\t\t});\n\t\t\t\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthrow lastError;\n\t}\n\n\t/**\n\t * Ensure that an agent exists by checking if an agent with the same name already exists in the system.\n\t * If the agent does not exist, it will be created with the provided data.\n\t *\n\t * @param {Partial<Agent>} agent - The partial data of the agent to ensure its existence.\n\t * @returns {Promise<void>} - A promise that resolves when the agent is successfully ensured.\n\t * @throws {Error} - If the agent name is not provided or if there is an issue creating the agent.\n\t */\n\tasync ensureAgentExists(agent: Partial<Agent>): Promise<void> {\n\t\tif (!agent.name) {\n\t\t\tthrow new Error(\"Agent name is required\");\n\t\t}\n\n\t\tconst agents = await this.getAgents();\n\t\tconst existingAgent = agents.find(\n\t\t\t(a: Partial<Agent & { status: string }>) => a.name === agent.name,\n\t\t);\n\n\t\tif (!existingAgent) {\n\t\t\tawait this.createAgent(agent);\n\t\t}\n\t}\n\n\t/**\n\t * Ensure that the given embedding dimension is valid for the agent.\n\t *\n\t * @param {number} dimension - The dimension to ensure for the embedding.\n\t * @returns {Promise<void>} - Resolves once the embedding dimension is ensured.\n\t */\n\tasync ensureEmbeddingDimension(dimension: number) {\n\t\tconst existingMemory = await this.db\n\t\t\t.select({\n\t\t\t\tembedding: embeddingTable,\n\t\t\t})\n\t\t\t.from(memoryTable)\n\t\t\t.innerJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n\t\t\t.where(eq(memoryTable.agentId, this.agentId))\n\t\t\t.limit(1);\n\n\t\tif (existingMemory.length > 0) {\n\t\t\tconst usedDimension = Object.entries(DIMENSION_MAP).find(\n\t\t\t\t([_, colName]) => existingMemory[0].embedding[colName] !== null,\n\t\t\t);\n\t\t}\n\n\t\tthis.embeddingDimension = DIMENSION_MAP[dimension];\n\t}\n\n\t/**\n\t * Asynchronously retrieves an agent by their ID from the database.\n\t * @param {UUID} agentId - The ID of the agent to retrieve.\n\t * @returns {Promise<Agent | null>} A promise that resolves to the retrieved agent or null if not found.\n\t */\n\tasync getAgent(agentId: UUID): Promise<Agent | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(agentTable)\n\t\t\t\t.where(eq(agentTable.id, agentId))\n\t\t\t\t.limit(1);\n\n\t\t\tif (result.length === 0) return null;\n\t\t\treturn result[0];\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously retrieves a list of agents from the database.\n\t *\n\t * @returns {Promise<Agent[]>} A Promise that resolves to an array of Agent objects.\n\t */\n\tasync getAgents(): Promise<Agent[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db.select().from(agentTable);\n\n\t\t\treturn result;\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously creates a new agent record in the database.\n\t *\n\t * @param {Partial<Agent>} agent The agent object to be created.\n\t * @returns {Promise<boolean>} A promise that resolves to a boolean indicating the success of the operation.\n\t */\n\tasync createAgent(agent: Partial<Agent>): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(agentTable).values({\n\t\t\t\t\t\t...agent,\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tlogger.debug(\"Agent created successfully:\", {\n\t\t\t\t\tagentId: agent.id,\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error creating agent:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tagentId: agent.id,\n\t\t\t\t\tagent,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Updates an agent in the database with the provided agent ID and data.\n\t * @param {UUID} agentId - The unique identifier of the agent to update.\n\t * @param {Partial<Agent>} agent - The partial agent object containing the fields to update.\n\t * @returns {Promise<boolean>} - A boolean indicating if the agent was successfully updated.\n\t */\n\tasync updateAgent(agentId: UUID, agent: Partial<Agent>): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tif (!agent.id) {\n\t\t\t\t\tthrow new Error(\"Agent ID is required for update\");\n\t\t\t\t}\n\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.update(agentTable)\n\t\t\t\t\t\t.set({\n\t\t\t\t\t\t\t...agent,\n\t\t\t\t\t\t\tupdatedAt: Date.now(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.where(eq(agentTable.id, agentId));\n\t\t\t\t});\n\n\t\t\t\tlogger.debug(\"Agent updated successfully:\", {\n\t\t\t\t\tagentId,\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error updating agent:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tagentId,\n\t\t\t\t\tagent,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously deletes an agent with the specified UUID and all related entries.\n\t *\n\t * @param {UUID} agentId - The UUID of the agent to be deleted.\n\t * @returns {Promise<boolean>} - A boolean indicating if the deletion was successful.\n\t */\n\tasync deleteAgent(agentId: UUID): Promise<boolean> {\n\t\t// casacade delete all related for the agent\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tawait tx.delete(agentTable).where(eq(agentTable.id, agentId));\n\t\t\t});\n\t\t\treturn true;\n\t\t});\n\t}\n\n\t/**\n\t * Count all agents in the database\n\t * Used primarily for maintenance and cleanup operations\n\t */\n\t/**\n\t * Asynchronously counts the number of agents in the database.\n\t * @returns {Promise<number>} A Promise that resolves to the number of agents in the database.\n\t */\n\tasync countAgents(): Promise<number> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select({ count: count() })\n\t\t\t\t\t.from(agentTable);\n\n\t\t\t\treturn result[0]?.count || 0;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error counting agents:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Clean up the agents table by removing all agents\n\t * This is used during server startup to ensure no orphaned agents exist\n\t * from previous crashes or improper shutdowns\n\t */\n\tasync cleanupAgents(): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.delete(agentTable);\n\t\t\t\tlogger.success(\"Successfully cleaned up agent table\");\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error cleaning up agent table:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getEntityById(entityId: UUID): Promise<Entity | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tentity: entityTable,\n\t\t\t\t\tcomponents: componentTable,\n\t\t\t\t})\n\t\t\t\t.from(entityTable)\n\t\t\t\t.leftJoin(componentTable, eq(componentTable.entityId, entityTable.id))\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(entityTable.id, entityId),\n\t\t\t\t\t\teq(entityTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tif (result.length === 0) return null;\n\n\t\t\t// Group components by entity\n\t\t\tconst entity = result[0].entity;\n\t\t\tentity.components = result\n\t\t\t\t.filter((row) => row.components)\n\t\t\t\t.map((row) => row.components);\n\n\t\t\treturn entity;\n\t\t});\n\t}\n\n\tasync getEntitiesForRoom(\n\t\troomId: UUID,\n\t\tincludeComponents?: boolean,\n\t): Promise<Entity[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst query = this.db\n\t\t\t\t.select({\n\t\t\t\t\tentity: entityTable,\n\t\t\t\t\t...(includeComponents && { components: componentTable }),\n\t\t\t\t})\n\t\t\t\t.from(participantTable)\n\t\t\t\t.leftJoin(\n\t\t\t\t\tentityTable,\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.entityId, entityTable.id),\n\t\t\t\t\t\teq(entityTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tif (includeComponents) {\n\t\t\t\tquery.leftJoin(\n\t\t\t\t\tcomponentTable,\n\t\t\t\t\teq(componentTable.entityId, entityTable.id),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = await query.where(eq(participantTable.roomId, roomId));\n\n\t\t\t// Group components by entity if includeComponents is true\n\t\t\tconst entitiesByIdMap = new Map<UUID, Entity>();\n\n\t\t\tfor (const row of result) {\n\t\t\t\tif (!row.entity) continue;\n\n\t\t\t\tconst entityId = row.entity.id as UUID;\n\t\t\t\tif (!entitiesByIdMap.has(entityId)) {\n\t\t\t\t\tconst entity: Entity = {\n\t\t\t\t\t\t...row.entity,\n\t\t\t\t\t\tcomponents: includeComponents ? [] : undefined,\n\t\t\t\t\t};\n\t\t\t\t\tentitiesByIdMap.set(entityId, entity);\n\t\t\t\t}\n\n\t\t\t\tif (includeComponents && row.components) {\n\t\t\t\t\tconst entity = entitiesByIdMap.get(entityId);\n\t\t\t\t\tif (entity) {\n\t\t\t\t\t\tif (!entity.components) {\n\t\t\t\t\t\t\tentity.components = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity.components.push(row.components);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn Array.from(entitiesByIdMap.values());\n\t\t});\n\t}\n\n\tasync createEntity(entity: Entity): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\treturn await this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(entityTable).values(entity);\n\n\t\t\t\t\tlogger.debug(\"Entity created successfully:\", {\n\t\t\t\t\t\tentity,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error creating entity:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tentityId: entity.id,\n\t\t\t\t\tname: entity.metadata?.name,\n\t\t\t\t});\n\t\t\t\t// trace the error\n\t\t\t\tconsole.trace(error);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Ensures an entity exists, creating it if it doesn't\n\t * @param entity The entity to ensure exists\n\t * @returns Promise resolving to boolean indicating success\n\t */\n\tprotected async ensureEntityExists(entity: Entity): Promise<boolean> {\n\t\tif (!entity.id) {\n\t\t\tlogger.error(\"Entity ID is required for ensureEntityExists\");\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tconst existingEntity = await this.getEntityById(entity.id);\n\n\t\t\tif (!existingEntity) {\n\t\t\t\treturn await this.createEntity(entity);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error ensuring entity exists:\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tentityId: entity.id,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync updateEntity(entity: Entity): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(entityTable)\n\t\t\t\t.set(entity)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(entityTable.id, entity.id as UUID),\n\t\t\t\t\t\teq(entityTable.agentId, entity.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t});\n\t}\n\n\tasync getComponent(\n\t\tentityId: UUID,\n\t\ttype: string,\n\t\tworldId?: UUID,\n\t\tsourceEntityId?: UUID,\n\t): Promise<Component | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [\n\t\t\t\teq(componentTable.entityId, entityId),\n\t\t\t\teq(componentTable.type, type),\n\t\t\t];\n\n\t\t\tif (worldId) {\n\t\t\t\tconditions.push(eq(componentTable.worldId, worldId));\n\t\t\t}\n\n\t\t\tif (sourceEntityId) {\n\t\t\t\tconditions.push(eq(componentTable.sourceEntityId, sourceEntityId));\n\t\t\t}\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(componentTable)\n\t\t\t\t.where(and(...conditions));\n\t\t\treturn result.length > 0 ? result[0] : null;\n\t\t});\n\t}\n\n\tasync getComponents(\n\t\tentityId: UUID,\n\t\tworldId?: UUID,\n\t\tsourceEntityId?: UUID,\n\t): Promise<Component[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [eq(componentTable.entityId, entityId)];\n\n\t\t\tif (worldId) {\n\t\t\t\tconditions.push(eq(componentTable.worldId, worldId));\n\t\t\t}\n\n\t\t\tif (sourceEntityId) {\n\t\t\t\tconditions.push(eq(componentTable.sourceEntityId, sourceEntityId));\n\t\t\t}\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: componentTable.id,\n\t\t\t\t\tentityId: componentTable.entityId,\n\t\t\t\t\ttype: componentTable.type,\n\t\t\t\t\tdata: componentTable.data,\n\t\t\t\t\tworldId: componentTable.worldId,\n\t\t\t\t\tsourceEntityId: componentTable.sourceEntityId,\n\t\t\t\t\tcreatedAt: componentTable.createdAt,\n\t\t\t\t})\n\t\t\t\t.from(componentTable)\n\t\t\t\t.where(and(...conditions));\n\t\t\treturn result;\n\t\t});\n\t}\n\n\tasync createComponent(component: Component): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.insert(componentTable).values(component);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tasync updateComponent(component: Component): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(componentTable)\n\t\t\t\t.set(component)\n\t\t\t\t.where(eq(componentTable.id, component.id));\n\t\t});\n\t}\n\n\tasync deleteComponent(componentId: UUID): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.delete(componentTable)\n\t\t\t\t.where(eq(componentTable.id, componentId));\n\t\t});\n\t}\n\n\tasync getMemories(params: {\n\t\troomId: UUID;\n\t\tcount?: number;\n\t\tunique?: boolean;\n\t\ttableName: string;\n\t\tstart?: number;\n\t\tend?: number;\n\t}): Promise<Memory[]> {\n\t\tif (!params.tableName) throw new Error(\"tableName is required\");\n\t\tif (!params.roomId) throw new Error(\"roomId is required\");\n\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [\n\t\t\t\teq(memoryTable.type, params.tableName),\n\t\t\t\teq(memoryTable.roomId, params.roomId),\n\t\t\t];\n\n\t\t\tif (params.start) {\n\t\t\t\tconditions.push(gte(memoryTable.createdAt, params.start));\n\t\t\t}\n\n\t\t\tif (params.end) {\n\t\t\t\tconditions.push(lte(memoryTable.createdAt, params.end));\n\t\t\t}\n\n\t\t\tif (params.unique) {\n\t\t\t\tconditions.push(eq(memoryTable.unique, true));\n\t\t\t}\n\n\t\t\tconditions.push(eq(memoryTable.agentId, this.agentId));\n\n\t\t\tconst query = this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: {\n\t\t\t\t\t\tid: memoryTable.id,\n\t\t\t\t\t\ttype: memoryTable.type,\n\t\t\t\t\t\tcreatedAt: memoryTable.createdAt,\n\t\t\t\t\t\tcontent: memoryTable.content,\n\t\t\t\t\t\tentityId: memoryTable.entityId,\n\t\t\t\t\t\tagentId: memoryTable.agentId,\n\t\t\t\t\t\troomId: memoryTable.roomId,\n\t\t\t\t\t\tunique: memoryTable.unique,\n\t\t\t\t\t},\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.leftJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(memoryTable.createdAt));\n\n\t\t\tconst rows = params.count ? await query.limit(params.count) : await query;\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\ttype: row.memory.type,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ? Array.from(row.embedding) : undefined,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync getMemoriesByRoomIds(params: {\n\t\troomIds: UUID[];\n\t\ttableName: string;\n\t\tlimit?: number;\n\t}): Promise<Memory[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tif (params.roomIds.length === 0) return [];\n\n\t\t\tconst conditions = [\n\t\t\t\teq(memoryTable.type, params.tableName),\n\t\t\t\tinArray(memoryTable.roomId, params.roomIds),\n\t\t\t];\n\n\t\t\tconditions.push(eq(memoryTable.agentId, this.agentId));\n\n\t\t\tconst query = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: memoryTable.id,\n\t\t\t\t\ttype: memoryTable.type,\n\t\t\t\t\tcreatedAt: memoryTable.createdAt,\n\t\t\t\t\tcontent: memoryTable.content,\n\t\t\t\t\tentityId: memoryTable.entityId,\n\t\t\t\t\tagentId: memoryTable.agentId,\n\t\t\t\t\troomId: memoryTable.roomId,\n\t\t\t\t\tunique: memoryTable.unique,\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(memoryTable.createdAt));\n\n\t\t\tconst rows = params.limit ? await query.limit(params.limit) : await query;\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tid: row.id as UUID,\n\t\t\t\tcreatedAt: row.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.content)\n\t\t\t\t\t\t: row.content,\n\t\t\t\tentityId: row.entityId as UUID,\n\t\t\t\tagentId: row.agentId as UUID,\n\t\t\t\troomId: row.roomId as UUID,\n\t\t\t\tunique: row.unique,\n\t\t\t})) as Memory[];\n\t\t});\n\t}\n\n\tasync getMemoryById(id: UUID): Promise<Memory | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: memoryTable,\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.leftJoin(embeddingTable, eq(memoryTable.id, embeddingTable.memoryId))\n\t\t\t\t.where(eq(memoryTable.id, id))\n\t\t\t\t.limit(1);\n\n\t\t\tif (result.length === 0) return null;\n\n\t\t\tconst row = result[0];\n\t\t\treturn {\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ?? undefined,\n\t\t\t};\n\t\t});\n\t}\n\n\tasync getMemoriesByIds(\n\t\tmemoryIds: UUID[],\n\t\ttableName?: string,\n\t): Promise<Memory[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tif (memoryIds.length === 0) return [];\n\n\t\t\tconst conditions = [inArray(memoryTable.id, memoryIds)];\n\n\t\t\tif (tableName) {\n\t\t\t\tconditions.push(eq(memoryTable.type, tableName));\n\t\t\t}\n\n\t\t\tconst rows = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: memoryTable,\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.leftJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(memoryTable.createdAt));\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ?? undefined,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync getCachedEmbeddings(opts: {\n\t\tquery_table_name: string;\n\t\tquery_threshold: number;\n\t\tquery_input: string;\n\t\tquery_field_name: string;\n\t\tquery_field_sub_name: string;\n\t\tquery_match_count: number;\n\t}): Promise<{ embedding: number[]; levenshtein_score: number }[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst results = await this.db.execute<{\n\t\t\t\t\tembedding: number[];\n\t\t\t\t\tlevenshtein_score: number;\n\t\t\t\t}>(sql`\n WITH content_text AS (\n SELECT\n m.id,\n COALESCE(\n m.content->>${opts.query_field_sub_name},\n ''\n ) as content_text\n FROM memories m\n WHERE m.type = ${opts.query_table_name}\n AND m.content->>${opts.query_field_sub_name} IS NOT NULL\n ),\n embedded_text AS (\n SELECT \n ct.content_text,\n COALESCE(\n e.dim_384,\n e.dim_512,\n e.dim_768,\n e.dim_1024,\n e.dim_1536,\n e.dim_3072\n ) as embedding\n FROM content_text ct\n LEFT JOIN embeddings e ON e.memory_id = ct.id\n WHERE e.memory_id IS NOT NULL\n )\n SELECT\n embedding,\n levenshtein(${opts.query_input}, content_text) as levenshtein_score\n FROM embedded_text\n WHERE levenshtein(${opts.query_input}, content_text) <= ${opts.query_threshold}\n ORDER BY levenshtein_score\n LIMIT ${opts.query_match_count}\n `);\n\n\t\t\t\treturn results.rows\n\t\t\t\t\t.map((row) => ({\n\t\t\t\t\t\tembedding: Array.isArray(row.embedding)\n\t\t\t\t\t\t\t? row.embedding\n\t\t\t\t\t\t\t: typeof row.embedding === \"string\"\n\t\t\t\t\t\t\t\t? JSON.parse(row.embedding)\n\t\t\t\t\t\t\t\t: [],\n\t\t\t\t\t\tlevenshtein_score: Number(row.levenshtein_score),\n\t\t\t\t\t}))\n\t\t\t\t\t.filter((row) => Array.isArray(row.embedding));\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error in getCachedEmbeddings:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\ttableName: opts.query_table_name,\n\t\t\t\t\tfieldName: opts.query_field_name,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\terror instanceof Error &&\n\t\t\t\t\terror.message ===\n\t\t\t\t\t\t\"levenshtein argument exceeds maximum length of 255 characters\"\n\t\t\t\t) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync log(params: {\n\t\tbody: { [key: string]: unknown };\n\t\tentityId: UUID;\n\t\troomId: UUID;\n\t\ttype: string;\n\t}): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(logTable).values({\n\t\t\t\t\t\tbody: sql`${params.body}::jsonb`,\n\t\t\t\t\t\tentityId: params.entityId,\n\t\t\t\t\t\troomId: params.roomId,\n\t\t\t\t\t\ttype: params.type,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Failed to create log entry:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\ttype: params.type,\n\t\t\t\t\troomId: params.roomId,\n\t\t\t\t\tentityId: params.entityId,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync searchMemories(params: {\n\t\ttableName: string;\n\t\troomId: UUID;\n\t\tembedding: number[];\n\t\tmatch_threshold: number;\n\t\tcount: number;\n\t\tunique: boolean;\n\t}): Promise<Memory[]> {\n\t\treturn await this.searchMemoriesByEmbedding(params.embedding, {\n\t\t\tmatch_threshold: params.match_threshold,\n\t\t\tcount: params.count,\n\t\t\troomId: params.roomId,\n\t\t\tunique: params.unique,\n\t\t\ttableName: params.tableName,\n\t\t});\n\t}\n\n\tasync searchMemoriesByEmbedding(\n\t\tembedding: number[],\n\t\tparams: {\n\t\t\tmatch_threshold?: number;\n\t\t\tcount?: number;\n\t\t\troomId?: UUID;\n\t\t\tunique?: boolean;\n\t\t\ttableName: string;\n\t\t},\n\t): Promise<Memory[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst cleanVector = embedding.map((n) =>\n\t\t\t\tNumber.isFinite(n) ? Number(n.toFixed(6)) : 0,\n\t\t\t);\n\n\t\t\tconst similarity = sql<number>`1 - (${cosineDistance(\n\t\t\t\tembeddingTable[this.embeddingDimension],\n\t\t\t\tcleanVector,\n\t\t\t)})`;\n\n\t\t\tconst conditions = [eq(memoryTable.type, params.tableName)];\n\n\t\t\tif (params.unique) {\n\t\t\t\tconditions.push(eq(memoryTable.unique, true));\n\t\t\t}\n\n\t\t\tconditions.push(eq(memoryTable.agentId, this.agentId));\n\n\t\t\tif (params.roomId) {\n\t\t\t\tconditions.push(eq(memoryTable.roomId, params.roomId));\n\t\t\t}\n\n\t\t\tif (params.match_threshold) {\n\t\t\t\tconditions.push(gte(similarity, params.match_threshold));\n\t\t\t}\n\n\t\t\tconst results = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: memoryTable,\n\t\t\t\t\tsimilarity,\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(embeddingTable)\n\t\t\t\t.innerJoin(memoryTable, eq(memoryTable.id, embeddingTable.memoryId))\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(similarity))\n\t\t\t\t.limit(params.count ?? 10);\n\n\t\t\treturn results.map((row) => ({\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\ttype: row.memory.type,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ?? undefined,\n\t\t\t\tsimilarity: row.similarity,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync createMemory(\n\t\tmemory: Memory & { metadata?: MemoryMetadata },\n\t\ttableName: string,\n\t): Promise<UUID> {\n\t\tlogger.debug(\"DrizzleAdapter createMemory:\", {\n\t\t\tmemoryId: memory.id,\n\t\t\tembeddingLength: memory.embedding?.length,\n\t\t\tcontentLength: memory.content?.text?.length,\n\t\t});\n\n\t\tlet isUnique = true;\n\t\tif (memory.embedding && Array.isArray(memory.embedding)) {\n\t\t\tconst similarMemories = await this.searchMemoriesByEmbedding(\n\t\t\t\tmemory.embedding,\n\t\t\t\t{\n\t\t\t\t\ttableName,\n\t\t\t\t\troomId: memory.roomId,\n\t\t\t\t\tmatch_threshold: 0.95,\n\t\t\t\t\tcount: 1,\n\t\t\t\t},\n\t\t\t);\n\t\t\tisUnique = similarMemories.length === 0;\n\t\t}\n\n\t\tconst contentToInsert =\n\t\t\ttypeof memory.content === \"string\"\n\t\t\t\t? JSON.parse(memory.content)\n\t\t\t\t: memory.content;\n\n\t\tconst memoryId = memory.id ?? (v4() as UUID);\n\n\t\tawait this.db.transaction(async (tx) => {\n\t\t\tawait tx.insert(memoryTable).values([\n\t\t\t\t{\n\t\t\t\t\tid: memoryId,\n\t\t\t\t\ttype: tableName,\n\t\t\t\t\tcontent: sql`${contentToInsert}::jsonb`,\n\t\t\t\t\tmetadata: sql`${memory.metadata || {}}::jsonb`,\n\t\t\t\t\tentityId: memory.entityId,\n\t\t\t\t\troomId: memory.roomId,\n\t\t\t\t\tagentId: memory.agentId,\n\t\t\t\t\tunique: memory.unique ?? isUnique,\n\t\t\t\t\tcreatedAt: memory.createdAt,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tif (memory.embedding && Array.isArray(memory.embedding)) {\n\t\t\t\tconst embeddingValues: Record<string, unknown> = {\n\t\t\t\t\tid: v4(),\n\t\t\t\t\tmemoryId: memoryId,\n\t\t\t\t\tcreatedAt: memory.createdAt,\n\t\t\t\t};\n\n\t\t\t\tconst cleanVector = memory.embedding.map((n) =>\n\t\t\t\t\tNumber.isFinite(n) ? Number(n.toFixed(6)) : 0,\n\t\t\t\t);\n\n\t\t\t\tembeddingValues[this.embeddingDimension] = cleanVector;\n\n\t\t\t\tawait tx.insert(embeddingTable).values([embeddingValues]);\n\t\t\t}\n\t\t});\n\n\t\treturn memoryId;\n\t}\n\n\tasync removeMemory(memoryId: UUID, tableName: string): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tawait tx\n\t\t\t\t\t.delete(embeddingTable)\n\t\t\t\t\t.where(eq(embeddingTable.memoryId, memoryId));\n\n\t\t\t\tawait tx\n\t\t\t\t\t.delete(memoryTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(memoryTable.id, memoryId), eq(memoryTable.type, tableName)),\n\t\t\t\t\t);\n\t\t\t});\n\n\t\t\tlogger.debug(\"Memory removed successfully:\", {\n\t\t\t\tmemoryId,\n\t\t\t\ttableName,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync removeAllMemories(roomId: UUID, tableName: string): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tconst memoryIds = await tx\n\t\t\t\t\t.select({ id: memoryTable.id })\n\t\t\t\t\t.from(memoryTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\teq(memoryTable.roomId, roomId),\n\t\t\t\t\t\t\teq(memoryTable.type, tableName),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tif (memoryIds.length > 0) {\n\t\t\t\t\tawait tx.delete(embeddingTable).where(\n\t\t\t\t\t\tinArray(\n\t\t\t\t\t\t\tembeddingTable.memoryId,\n\t\t\t\t\t\t\tmemoryIds.map((m) => m.id),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.delete(memoryTable)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(memoryTable.roomId, roomId),\n\t\t\t\t\t\t\t\teq(memoryTable.type, tableName),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlogger.debug(\"All memories removed successfully:\", {\n\t\t\t\troomId,\n\t\t\t\ttableName,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync countMemories(\n\t\troomId: UUID,\n\t\tunique = true,\n\t\ttableName = \"\",\n\t): Promise<number> {\n\t\tif (!tableName) throw new Error(\"tableName is required\");\n\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [\n\t\t\t\teq(memoryTable.roomId, roomId),\n\t\t\t\teq(memoryTable.type, tableName),\n\t\t\t];\n\n\t\t\tif (unique) {\n\t\t\t\tconditions.push(eq(memoryTable.unique, true));\n\t\t\t}\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ count: sql<number>`count(*)` })\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.where(and(...conditions));\n\n\t\t\treturn Number(result[0]?.count ?? 0);\n\t\t});\n\t}\n\n\tasync getRoom(roomId: UUID): Promise<Room | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: roomTable.id,\n\t\t\t\t\tchannelId: roomTable.channelId,\n\t\t\t\t\tagentId: roomTable.agentId,\n\t\t\t\t\tserverId: roomTable.serverId,\n\t\t\t\t\tworldId: roomTable.worldId,\n\t\t\t\t\ttype: roomTable.type,\n\t\t\t\t\tsource: roomTable.source,\n\t\t\t\t})\n\t\t\t\t.from(roomTable)\n\t\t\t\t.where(\n\t\t\t\t\tand(eq(roomTable.id, roomId), eq(roomTable.agentId, this.agentId)),\n\t\t\t\t)\n\t\t\t\t.limit(1);\n\t\t\tif (result.length === 0) return null;\n\t\t\treturn result[0];\n\t\t});\n\t}\n\n\tasync getRooms(worldId: UUID): Promise<Room[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(roomTable)\n\t\t\t\t.where(eq(roomTable.worldId, worldId));\n\t\t\treturn result;\n\t\t});\n\t}\n\n\tasync updateRoom(room: Room): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(roomTable)\n\t\t\t\t.set({ ...room, agentId: this.agentId })\n\t\t\t\t.where(eq(roomTable.id, room.id));\n\t\t});\n\t}\n\n\tasync createRoom({\n\t\tid,\n\t\tname,\n\t\tsource,\n\t\ttype,\n\t\tchannelId,\n\t\tserverId,\n\t\tworldId,\n\t}: Room): Promise<UUID> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst newRoomId = id || v4();\n\t\t\tawait this.db\n\t\t\t\t.insert(roomTable)\n\t\t\t\t.values({\n\t\t\t\t\tid: newRoomId,\n\t\t\t\t\tname,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t\tsource,\n\t\t\t\t\ttype,\n\t\t\t\t\tchannelId,\n\t\t\t\t\tserverId,\n\t\t\t\t\tworldId,\n\t\t\t\t})\n\t\t\t\t.onConflictDoNothing({ target: roomTable.id });\n\t\t\treturn newRoomId as UUID;\n\t\t});\n\t}\n\n\tasync deleteRoom(roomId: UUID): Promise<void> {\n\t\tif (!roomId) throw new Error(\"Room ID is required\");\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tawait tx.delete(roomTable).where(eq(roomTable.id, roomId));\n\t\t\t});\n\t\t});\n\t}\n\n\tasync getRoomsForParticipant(entityId: UUID): Promise<UUID[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ roomId: participantTable.roomId })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.innerJoin(roomTable, eq(participantTable.roomId, roomTable.id))\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\teq(roomTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\treturn result.map((row) => row.roomId as UUID);\n\t\t});\n\t}\n\n\tasync getRoomsForParticipants(entityIds: UUID[]): Promise<UUID[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.selectDistinct({ roomId: participantTable.roomId })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.innerJoin(roomTable, eq(participantTable.roomId, roomTable.id))\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\tinArray(participantTable.entityId, entityIds),\n\t\t\t\t\t\teq(roomTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\treturn result.map((row) => row.roomId as UUID);\n\t\t});\n\t}\n\n\tasync addParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db\n\t\t\t\t\t.insert(participantTable)\n\t\t\t\t\t.values({\n\t\t\t\t\t\tentityId,\n\t\t\t\t\t\troomId,\n\t\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t\t})\n\t\t\t\t\t.onConflictDoNothing();\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error adding participant\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tentityId,\n\t\t\t\t\troomId,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync removeParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.transaction(async (tx) => {\n\t\t\t\t\treturn await tx\n\t\t\t\t\t\t.delete(participantTable)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.returning();\n\t\t\t\t});\n\n\t\t\t\tconst removed = result.length > 0;\n\t\t\t\tlogger.debug(`Participant ${removed ? \"removed\" : \"not found\"}:`, {\n\t\t\t\t\tentityId,\n\t\t\t\t\troomId,\n\t\t\t\t\tremoved,\n\t\t\t\t});\n\n\t\t\t\treturn removed;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Failed to remove participant:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tentityId,\n\t\t\t\t\troomId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getParticipantsForEntity(entityId: UUID): Promise<Participant[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: participantTable.id,\n\t\t\t\t\tentityId: participantTable.entityId,\n\t\t\t\t\troomId: participantTable.roomId,\n\t\t\t\t})\n\t\t\t\t.from(participantTable)\n\t\t\t\t.where(eq(participantTable.entityId, entityId));\n\n\t\t\tconst entity = await this.getEntityById(entityId);\n\n\t\t\tif (!entity) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn result.map((row) => ({\n\t\t\t\tid: row.id as UUID,\n\t\t\t\tentity: entity,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync getParticipantsForRoom(roomId: UUID): Promise<UUID[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ entityId: participantTable.entityId })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\teq(participantTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\treturn result.map((row) => row.entityId as UUID);\n\t\t});\n\t}\n\n\tasync getParticipantUserState(\n\t\troomId: UUID,\n\t\tentityId: UUID,\n\t): Promise<\"FOLLOWED\" | \"MUTED\" | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ roomState: participantTable.roomState })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\teq(participantTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.limit(1);\n\n\t\t\treturn (result[0]?.roomState as \"FOLLOWED\" | \"MUTED\" | null) ?? null;\n\t\t});\n\t}\n\n\tasync setParticipantUserState(\n\t\troomId: UUID,\n\t\tentityId: UUID,\n\t\tstate: \"FOLLOWED\" | \"MUTED\" | null,\n\t): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.update(participantTable)\n\t\t\t\t\t\t.set({ roomState: state })\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\t\t\teq(participantTable.agentId, this.agentId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Failed to set participant user state:\", {\n\t\t\t\t\troomId,\n\t\t\t\t\tentityId,\n\t\t\t\t\tstate,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync createRelationship(params: {\n\t\tsourceEntityId: UUID;\n\t\ttargetEntityId: UUID;\n\t\ttags?: string[];\n\t\tmetadata?: { [key: string]: unknown };\n\t}): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst id = v4();\n\t\t\tconst saveParams = {\n\t\t\t\tid,\n\t\t\t\tsourceEntityId: params.sourceEntityId,\n\t\t\t\ttargetEntityId: params.targetEntityId,\n\t\t\t\tagentId: this.agentId,\n\t\t\t\ttags: params.tags || [],\n\t\t\t\tmetadata: params.metadata || {},\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tawait this.db.insert(relationshipTable).values(saveParams);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error creating relationship:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tsaveParams,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync updateRelationship(relationship: Relationship): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db\n\t\t\t\t\t.update(relationshipTable)\n\t\t\t\t\t.set({\n\t\t\t\t\t\ttags: relationship.tags || [],\n\t\t\t\t\t\tmetadata: relationship.metadata || {},\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(relationshipTable.id, relationship.id));\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error updating relationship:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\trelationship,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getRelationship(params: {\n\t\tsourceEntityId: UUID;\n\t\ttargetEntityId: UUID;\n\t}): Promise<Relationship | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(relationshipTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\teq(relationshipTable.sourceEntityId, params.sourceEntityId),\n\t\t\t\t\t\t\teq(relationshipTable.targetEntityId, params.targetEntityId),\n\t\t\t\t\t\t\teq(relationshipTable.agentId, this.agentId),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t.limit(1);\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tid: result[0].id,\n\t\t\t\t\tsourceEntityId: result[0].sourceEntityId,\n\t\t\t\t\ttargetEntityId: result[0].targetEntityId,\n\t\t\t\t\tagentId: result[0].agentId,\n\t\t\t\t\ttags: result[0].tags || [],\n\t\t\t\t\tmetadata: result[0].metadata || {},\n\t\t\t\t\tcreatedAt: result[0].createdAt?.toString(),\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error getting relationship:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t\treturn null;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getRelationships(params: {\n\t\tentityId: UUID;\n\t\ttags?: string[];\n\t}): Promise<Relationship[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tlet query = this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(relationshipTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\tor(\n\t\t\t\t\t\t\t\teq(relationshipTable.sourceEntityId, params.entityId),\n\t\t\t\t\t\t\t\teq(relationshipTable.targetEntityId, params.entityId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\teq(relationshipTable.agentId, this.agentId),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t// Filter by tags if provided\n\t\t\t\tif (params.tags && params.tags.length > 0) {\n\t\t\t\t\t// Filter by tags - find tasks that have ALL of the specified tags\n\t\t\t\t\t// Using @> operator which checks if left array contains all elements from right array\n\t\t\t\t\tconst tagParams = params.tags\n\t\t\t\t\t\t.map((tag) => `'${tag.replace(/'/g, \"''\")}'`)\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\tquery = query.where(\n\t\t\t\t\t\tsql`${relationshipTable.tags} @> ARRAY[${sql.raw(\n\t\t\t\t\t\t\ttagParams,\n\t\t\t\t\t\t)}]::text[]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst results = await query;\n\n\t\t\t\treturn results.map((result) => ({\n\t\t\t\t\tid: result.id,\n\t\t\t\t\tsourceEntityId: result.sourceEntityId,\n\t\t\t\t\ttargetEntityId: result.targetEntityId,\n\t\t\t\t\tagentId: result.agentId,\n\t\t\t\t\ttags: result.tags || [],\n\t\t\t\t\tmetadata: result.metadata || {},\n\t\t\t\t\tcreatedAt: result.createdAt?.toString(),\n\t\t\t\t}));\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error getting relationships:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t\treturn [];\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getCache<T>(key: string): Promise<T | undefined> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(cacheTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(cacheTable.agentId, this.agentId), eq(cacheTable.key, key)),\n\t\t\t\t\t);\n\n\t\t\t\treturn result[0]?.value as T | undefined;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error fetching cache\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tkey: key,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync setCache<T>(key: string, value: T): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.insert(cacheTable)\n\t\t\t\t\t\t.values({\n\t\t\t\t\t\t\tkey: key,\n\t\t\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\t\t\ttarget: [cacheTable.key, cacheTable.agentId],\n\t\t\t\t\t\t\tset: {\n\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error setting cache\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tkey: key,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync deleteCache(key: string): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.delete(cacheTable)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(cacheTable.agentId, this.agentId),\n\t\t\t\t\t\t\t\teq(cacheTable.key, key),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error deleting cache\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tkey: key,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync createWorld(world: World): Promise<UUID> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst newWorldId = world.id || v4();\n\t\t\tawait this.db.insert(worldTable).values({\n\t\t\t\t...world,\n\t\t\t\tid: newWorldId,\n\t\t\t});\n\t\t\treturn newWorldId;\n\t\t});\n\t}\n\n\tasync getWorld(id: UUID): Promise<World | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(worldTable)\n\t\t\t\t.where(eq(worldTable.id, id));\n\t\t\treturn result[0] as World | null;\n\t\t});\n\t}\n\n\tasync getAllWorlds(): Promise<World[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(worldTable)\n\t\t\t\t.where(eq(worldTable.agentId, this.agentId));\n\t\t\treturn result as World[];\n\t\t});\n\t}\n\n\tasync updateWorld(world: World): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(worldTable)\n\t\t\t\t.set(world)\n\t\t\t\t.where(eq(worldTable.id, world.id));\n\t\t});\n\t}\n\n\tasync removeWorld(id: UUID): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.delete(worldTable).where(eq(worldTable.id, id));\n\t\t});\n\t}\n\n\t/**\n\t * Creates a new task in the database.\n\t * @param task The task object to create\n\t * @returns Promise resolving to the UUID of the created task\n\t */\n\tasync createTask(task: Task): Promise<UUID> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tconst now = new Date();\n\t\t\t\tconst metadata = task.metadata || {};\n\n\t\t\t\tconst values = {\n\t\t\t\t\tid: task.id as UUID,\n\t\t\t\t\tname: task.name,\n\t\t\t\t\tdescription: task.description,\n\t\t\t\t\troomId: task.roomId,\n\t\t\t\t\tworldId: task.worldId,\n\t\t\t\t\ttags: task.tags,\n\t\t\t\t\tmetadata: metadata,\n\t\t\t\t\tcreatedAt: now,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t};\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.insert(taskTable)\n\t\t\t\t\t.values(values)\n\t\t\t\t\t.returning({ id: taskTable.id });\n\n\t\t\t\treturn result[0].id;\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves tasks based on specified parameters.\n\t * @param params Object containing optional roomId and tags to filter tasks\n\t * @returns Promise resolving to an array of Task objects\n\t */\n\tasync getTasks(params: { roomId?: UUID; tags?: string[] }): Promise<Task[]> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tlet query = this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(taskTable)\n\t\t\t\t\t.where(eq(taskTable.agentId, this.agentId));\n\n\t\t\t\t// Apply filters if provided\n\t\t\t\tif (params.roomId) {\n\t\t\t\t\tquery = query.where(eq(taskTable.roomId, params.roomId));\n\t\t\t\t}\n\n\t\t\t\tif (params.tags && params.tags.length > 0) {\n\t\t\t\t\t// Filter by tags - find tasks that have ALL of the specified tags\n\t\t\t\t\t// Using @> operator which checks if left array contains all elements from right array\n\t\t\t\t\tconst tagParams = params.tags\n\t\t\t\t\t\t.map((tag) => `'${tag.replace(/'/g, \"''\")}'`)\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\tquery = query.where(\n\t\t\t\t\t\tsql`${taskTable.tags} @> ARRAY[${sql.raw(tagParams)}]::text[]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst result = await query;\n\n\t\t\t\treturn result.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tdescription: row.description,\n\t\t\t\t\troomId: row.roomId,\n\t\t\t\t\tworldId: row.worldId,\n\t\t\t\t\ttags: row.tags,\n\t\t\t\t\tmetadata: row.metadata,\n\t\t\t\t}));\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves a specific task by its name.\n\t * @param name The name of the task to retrieve\n\t * @returns Promise resolving to the Task object if found, null otherwise\n\t */\n\tasync getTasksByName(name: string): Promise<Task[]> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(taskTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(taskTable.name, name), eq(taskTable.agentId, this.agentId)),\n\t\t\t\t\t);\n\n\t\t\t\treturn result.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tdescription: row.description,\n\t\t\t\t\troomId: row.roomId,\n\t\t\t\t\tworldId: row.worldId,\n\t\t\t\t\ttags: row.tags || [],\n\t\t\t\t\tmetadata: row.metadata || {},\n\t\t\t\t}));\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves a specific task by its ID.\n\t * @param id The UUID of the task to retrieve\n\t * @returns Promise resolving to the Task object if found, null otherwise\n\t */\n\tasync getTask(id: UUID): Promise<Task | null> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(taskTable)\n\t\t\t\t\t.where(and(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)))\n\t\t\t\t\t.limit(1);\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst row = result[0];\n\t\t\t\treturn {\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tdescription: row.description,\n\t\t\t\t\troomId: row.roomId,\n\t\t\t\t\tworldId: row.worldId,\n\t\t\t\t\ttags: row.tags || [],\n\t\t\t\t\tmetadata: row.metadata || {},\n\t\t\t\t};\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Updates an existing task in the database.\n\t * @param id The UUID of the task to update\n\t * @param task Partial Task object containing the fields to update\n\t * @returns Promise resolving when the update is complete\n\t */\n\tasync updateTask(id: UUID, task: Partial<Task>): Promise<void> {\n\t\tawait this.withRetry(async () => {\n\t\t\tawait this.withDatabase(async () => {\n\t\t\t\tconst updateValues: Partial<Task> = {};\n\n\t\t\t\t// Add fields to update if they exist in the partial task object\n\t\t\t\tif (task.name !== undefined) updateValues.name = task.name;\n\t\t\t\tif (task.description !== undefined)\n\t\t\t\t\tupdateValues.description = task.description;\n\t\t\t\tif (task.roomId !== undefined) updateValues.roomId = task.roomId;\n\t\t\t\tif (task.worldId !== undefined) updateValues.worldId = task.worldId;\n\t\t\t\tif (task.tags !== undefined) updateValues.tags = task.tags;\n\n\t\t\t\ttask.updatedAt = Date.now();\n\n\t\t\t\t// Handle metadata updates\n\t\t\t\tif (task.metadata) {\n\t\t\t\t\t// Get current task to merge metadata\n\t\t\t\t\tconst currentTask = await this.getTask(id);\n\t\t\t\t\tif (currentTask) {\n\t\t\t\t\t\tconst currentMetadata = currentTask.metadata || {};\n\t\t\t\t\t\tconst newMetadata = {\n\t\t\t\t\t\t\t...currentMetadata,\n\t\t\t\t\t\t\t...task.metadata,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tupdateValues.metadata = newMetadata;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tupdateValues.metadata = {\n\t\t\t\t\t\t\t...task.metadata,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tawait this.db\n\t\t\t\t\t.update(taskTable)\n\t\t\t\t\t.set(updateValues)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)),\n\t\t\t\t\t);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Deletes a task from the database.\n\t * @param id The UUID of the task to delete\n\t * @returns Promise resolving when the deletion is complete\n\t */\n\tasync deleteTask(id: UUID): Promise<void> {\n\t\tawait this.withRetry(async () => {\n\t\t\tawait this.withDatabase(async () => {\n\t\t\t\tawait this.db\n\t\t\t\t\t.delete(taskTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)),\n\t\t\t\t\t);\n\t\t\t});\n\t\t});\n\t}\n}\n","import { sql } from \"drizzle-orm\";\nimport {\n\tcheck,\n\tforeignKey,\n\tindex,\n\tpgTable,\n\tuuid,\n\tvector,\n} from \"drizzle-orm/pg-core\";\nimport { memoryTable } from \"./memory\";\nimport { numberTimestamp } from \"./types\";\n\nexport const VECTOR_DIMS = {\n\tSMALL: 384,\n\tMEDIUM: 512,\n\tLARGE: 768,\n\tXL: 1024,\n\tXXL: 1536,\n\tXXXL: 3072,\n} as const;\n\nexport const DIMENSION_MAP = {\n\t[VECTOR_DIMS.SMALL]: \"dim384\",\n\t[VECTOR_DIMS.MEDIUM]: \"dim512\",\n\t[VECTOR_DIMS.LARGE]: \"dim768\",\n\t[VECTOR_DIMS.XL]: \"dim1024\",\n\t[VECTOR_DIMS.XXL]: \"dim1536\",\n\t[VECTOR_DIMS.XXXL]: \"dim3072\",\n} as const;\n\n/**\n * Definition of the embeddings table in the database.\n * Contains columns for ID, Memory ID, Creation Timestamp, and multiple vector dimensions.\n */\nexport const embeddingTable = pgTable(\n\t\"embeddings\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().defaultRandom().notNull(),\n\t\tmemoryId: uuid(\"memory_id\").references(() => memoryTable.id),\n\t\tcreatedAt: numberTimestamp(\"created_at\").default(sql`now()`).notNull(),\n\t\tdim384: vector(\"dim_384\", { dimensions: VECTOR_DIMS.SMALL }),\n\t\tdim512: vector(\"dim_512\", { dimensions: VECTOR_DIMS.MEDIUM }),\n\t\tdim768: vector(\"dim_768\", { dimensions: VECTOR_DIMS.LARGE }),\n\t\tdim1024: vector(\"dim_1024\", { dimensions: VECTOR_DIMS.XL }),\n\t\tdim1536: vector(\"dim_1536\", { dimensions: VECTOR_DIMS.XXL }),\n\t\tdim3072: vector(\"dim_3072\", { dimensions: VECTOR_DIMS.XXXL }),\n\t},\n\t(table) => [\n\t\tcheck(\"embedding_source_check\", sql`\"memory_id\" IS NOT NULL`),\n\t\tindex(\"idx_embedding_memory\").on(table.memoryId),\n\t\tforeignKey({\n\t\t\tname: \"fk_embedding_memory\",\n\t\t\tcolumns: [table.memoryId],\n\t\t\tforeignColumns: [memoryTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n\n/**\n * Defines the possible values for the Embedding Dimension Column.\n * It can be \"dim384\", \"dim512\", \"dim768\", \"dim1024\", \"dim1536\", or \"dim3072\".\n */\nexport type EmbeddingDimensionColumn =\n\t| \"dim384\"\n\t| \"dim512\"\n\t| \"dim768\"\n\t| \"dim1024\"\n\t| \"dim1536\"\n\t| \"dim3072\";\n\n/**\n * Retrieve the type of a specific column in the EmbeddingTable based on the EmbeddingDimensionColumn key.\n */\nexport type EmbeddingTableColumn =\n\t(typeof embeddingTable._.columns)[EmbeddingDimensionColumn];\n","import { relations, sql } from \"drizzle-orm\";\nimport {\n\tboolean,\n\tcheck,\n\tforeignKey,\n\tindex,\n\tjsonb,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n\tvector,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { embeddingTable } from \"./embedding\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Definition of the memory table in the database.\n *\n * @param {string} tableName - The name of the table.\n * @param {object} columns - An object containing the column definitions.\n * @param {function} indexes - A function that defines the indexes for the table.\n * @returns {object} - The memory table object.\n */\nexport const memoryTable = pgTable(\n\t\"memories\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().notNull(),\n\t\ttype: text(\"type\").notNull(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tcontent: jsonb(\"content\").notNull(),\n\t\tentityId: uuid(\"entityId\").references(() => entityTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tagentId: uuid(\"agentId\").references(() => agentTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\troomId: uuid(\"roomId\").references(() => roomTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tunique: boolean(\"unique\").default(true).notNull(),\n\t\tmetadata: jsonb(\"metadata\").default({}).notNull(),\n\t},\n\t(table) => [\n\t\tindex(\"idx_memories_type_room\").on(table.type, table.roomId),\n\t\tforeignKey({\n\t\t\tname: \"fk_room\",\n\t\t\tcolumns: [table.roomId],\n\t\t\tforeignColumns: [roomTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user\",\n\t\t\tcolumns: [table.entityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_agent\",\n\t\t\tcolumns: [table.agentId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tindex(\"idx_memories_metadata_type\").on(sql`((metadata->>'type'))`),\n\t\tindex(\"idx_memories_document_id\").on(sql`((metadata->>'documentId'))`),\n\t\tindex(\"idx_fragments_order\").on(\n\t\t\tsql`((metadata->>'documentId'))`,\n\t\t\tsql`((metadata->>'position'))`,\n\t\t),\n\t\tcheck(\n\t\t\t\"fragment_metadata_check\",\n\t\t\tsql`\n CASE \n WHEN metadata->>'type' = 'fragment' THEN\n metadata ? 'documentId' AND \n metadata ? 'position'\n ELSE true\n END\n `,\n\t\t),\n\t\tcheck(\n\t\t\t\"document_metadata_check\",\n\t\t\tsql`\n CASE \n WHEN metadata->>'type' = 'document' THEN\n metadata ? 'timestamp'\n ELSE true\n END\n `,\n\t\t),\n\t],\n);\n\nexport const memoryRelations = relations(memoryTable, ({ one }) => ({\n\tembedding: one(embeddingTable),\n}));\n","import type { MessageExample } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport {\n\tboolean,\n\tjsonb,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n} from \"drizzle-orm/pg-core\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents a table for storing agent data.\n *\n * @type {Table}\n */\nexport const agentTable = pgTable(\n\t\"agents\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\n\t\tupdatedAt: numberTimestamp(\"updatedAt\").default(sql`now()`).notNull(),\n\n\t\t// Character\n\t\tname: text(\"name\"),\n\t\tusername: text(\"username\"),\n\t\tsystem: text(\"system\"),\n\t\tbio: jsonb(\"bio\").$type<string | string[]>().notNull(),\n\t\tmessageExamples: jsonb(\"message_examples\")\n\t\t\t.$type<MessageExample[][]>()\n\t\t\t.default(sql`'[]'::jsonb`),\n\t\tpostExamples: jsonb(\"post_examples\")\n\t\t\t.$type<string[]>()\n\t\t\t.default(sql`'[]'::jsonb`),\n\t\ttopics: jsonb(\"topics\").$type<string[]>().default(sql`'[]'::jsonb`),\n\t\tadjectives: jsonb(\"adjectives\").$type<string[]>().default(sql`'[]'::jsonb`),\n\t\tknowledge: jsonb(\"knowledge\")\n\t\t\t.$type<(string | { path: string; shared?: boolean })[]>()\n\t\t\t.default(sql`'[]'::jsonb`),\n\t\tplugins: jsonb(\"plugins\").$type<string[]>().default(sql`'[]'::jsonb`),\n\t\tsettings: jsonb(\"settings\")\n\t\t\t.$type<{\n\t\t\t\tsecrets?: { [key: string]: string | boolean | number };\n\t\t\t\t[key: string]: unknown;\n\t\t\t}>()\n\t\t\t.default(sql`'{}'::jsonb`),\n\t\tstyle: jsonb(\"style\")\n\t\t\t.$type<{\n\t\t\t\tall?: string[];\n\t\t\t\tchat?: string[];\n\t\t\t\tpost?: string[];\n\t\t\t}>()\n\t\t\t.default(sql`'{}'::jsonb`),\n\t},\n\t(table) => {\n\t\treturn {\n\t\t\tnameUnique: unique(\"name_unique\").on(table.name),\n\t\t};\n\t},\n);\n","import { customType } from \"drizzle-orm/pg-core\";\n\nexport const stringJsonb = customType<{ data: string; driverData: string }>({\n\tdataType() {\n\t\treturn \"jsonb\";\n\t},\n\ttoDriver(value: string): string {\n\t\treturn JSON.stringify(value);\n\t},\n\tfromDriver(value: string): string {\n\t\treturn JSON.stringify(value);\n\t},\n});\n\n/**\n * Represents a custom type for converting a number to a timestamp string and vice versa.\n * @param {Object} options - The options for the custom type.\n * @param {Function} options.dataType - A function that returns the data type as \"timestamptz\".\n * @param {Function} options.toDriver - A function that converts a number to a timestamp string using the Date object's toISOString method.\n * @param {Function} options.fromDriver - A function that converts a timestamp string to a number using the Date object's getTime method.\n * @returns {Object} - The custom type for number to timestamp conversion.\n */\nexport const numberTimestamp = customType<{ data: number; driverData: string }>(\n\t{\n\t\tdataType() {\n\t\t\treturn \"timestamptz\";\n\t\t},\n\t\ttoDriver(value: number): string {\n\t\t\treturn new Date(value).toISOString();\n\t\t},\n\t\tfromDriver(value: string): number {\n\t\t\treturn new Date(value).getTime();\n\t\t},\n\t},\n);\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, unique, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents an entity table in the database.\n * Includes columns for id, agentId, createdAt, names, and metadata.\n */\nexport const entityTable = pgTable(\n\t\"entities\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey(),\n\t\tagentId: uuid(\"agentId\")\n\t\t\t.notNull()\n\t\t\t.references(() => agentTable.id, {\n\t\t\t\tonDelete: \"cascade\",\n\t\t\t}),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tnames: text(\"names\").array().default(sql`'{}'::text[]`),\n\t\tmetadata: jsonb(\"metadata\").default(sql`'{}'::jsonb`),\n\t},\n\t(table) => {\n\t\treturn {\n\t\t\tidAgentIdUnique: unique(\"id_agent_id_unique\").on(table.id, table.agentId),\n\t\t};\n\t},\n);\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\nimport { worldTable } from \"./worldTable\";\n\n/**\n * Defines a table schema for 'rooms' in the database.\n *\n * @typedef {object} RoomTable\n * @property {string} id - The unique identifier for the room.\n * @property {string} agentId - The UUID of the agent associated with the room.\n * @property {string} source - The source of the room.\n * @property {string} type - The type of the room.\n * @property {string} serverId - The server ID of the room.\n * @property {string} worldId - The UUID of the world associated with the room.\n * @property {string} name - The name of the room.\n * @property {object} metadata - Additional metadata for the room in JSON format.\n * @property {string} channelId - The channel ID of the room.\n * @property {number} createdAt - The timestamp of when the room was created.\n */\nexport const roomTable = pgTable(\"rooms\", {\n\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\tagentId: uuid(\"agentId\").references(() => agentTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tsource: text(\"source\").notNull(),\n\ttype: text(\"type\").notNull(),\n\tserverId: text(\"serverId\"),\n\tworldId: uuid(\"worldId\").references(() => worldTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tname: text(\"name\"),\n\tmetadata: jsonb(\"metadata\"),\n\tchannelId: text(\"channelId\"),\n\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n});\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\n\nexport const worldTable = pgTable(\"worlds\", {\n\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\tagentId: uuid(\"agentId\")\n\t\t.notNull()\n\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\tname: text(\"name\").notNull(),\n\tmetadata: jsonb(\"metadata\"),\n\tserverId: text(\"serverId\").notNull(),\n\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n});\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, unique, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents a PostgreSQL table for caching data.\n *\n * @type {pgTable}\n */\nexport const cacheTable = pgTable(\n\t\"cache\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\t\tkey: text(\"key\").notNull(),\n\t\tagentId: uuid(\"agentId\")\n\t\t\t.notNull()\n\t\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\t\tvalue: jsonb(\"value\").notNull(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\texpiresAt: numberTimestamp(\"expiresAt\"),\n\t},\n\t(table) => [unique(\"cache_key_agent_unique\").on(table.key, table.agentId)],\n);\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\nimport { worldTable } from \"./worldTable\";\n\n/**\n * Definition of a table representing components in the database.\n *\n * @type {Table}\n */\nexport const componentTable = pgTable(\"components\", {\n\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\tentityId: uuid(\"entityId\")\n\t\t.notNull()\n\t\t.references(() => entityTable.id, { onDelete: \"cascade\" }),\n\tagentId: uuid(\"agentId\")\n\t\t.notNull()\n\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\troomId: uuid(\"roomId\")\n\t\t.notNull()\n\t\t.references(() => roomTable.id, { onDelete: \"cascade\" }),\n\tworldId: uuid(\"worldId\").references(() => worldTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tsourceEntityId: uuid(\"sourceEntityId\").references(() => entityTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\ttype: text(\"type\").notNull(),\n\tdata: jsonb(\"data\").default(sql`'{}'::jsonb`),\n\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n});\n","import { sql } from \"drizzle-orm\";\nimport { foreignKey, jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents a PostgreSQL table for storing logs.\n *\n * @type {Table}\n */\n\nexport const logTable = pgTable(\n\t\"logs\",\n\t{\n\t\tid: uuid(\"id\").defaultRandom().notNull(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tentityId: uuid(\"entityId\")\n\t\t\t.notNull()\n\t\t\t.references(() => entityTable.id),\n\t\tbody: jsonb(\"body\").notNull(),\n\t\ttype: text(\"type\").notNull(),\n\t\troomId: uuid(\"roomId\")\n\t\t\t.notNull()\n\t\t\t.references(() => roomTable.id),\n\t},\n\t(table) => [\n\t\tforeignKey({\n\t\t\tname: \"fk_room\",\n\t\t\tcolumns: [table.roomId],\n\t\t\tforeignColumns: [roomTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user\",\n\t\t\tcolumns: [table.entityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n","import { sql } from \"drizzle-orm\";\nimport {\n\tforeignKey,\n\tindex,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Defines the schema for the \"participants\" table in the database.\n *\n * @type {import('knex').TableBuilder}\n */\nexport const participantTable = pgTable(\n\t\"participants\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tentityId: uuid(\"entityId\").references(() => entityTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\troomId: uuid(\"roomId\").references(() => roomTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tagentId: uuid(\"agentId\").references(() => agentTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\troomState: text(\"roomState\"),\n\t},\n\t(table) => [\n\t\t// unique(\"participants_user_room_agent_unique\").on(table.entityId, table.roomId, table.agentId),\n\t\tindex(\"idx_participants_user\").on(table.entityId),\n\t\tindex(\"idx_participants_room\").on(table.roomId),\n\t\tforeignKey({\n\t\t\tname: \"fk_room\",\n\t\t\tcolumns: [table.roomId],\n\t\t\tforeignColumns: [roomTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user\",\n\t\t\tcolumns: [table.entityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n","import { sql } from \"drizzle-orm\";\nimport {\n\tforeignKey,\n\tindex,\n\tjsonb,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Defines the relationshipTable containing information about relationships between entities and agents.\n * @type {import('knex').TableBuilder}\n */\nexport const relationshipTable = pgTable(\n\t\"relationships\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tsourceEntityId: uuid(\"sourceEntityId\")\n\t\t\t.notNull()\n\t\t\t.references(() => entityTable.id, { onDelete: \"cascade\" }),\n\t\ttargetEntityId: uuid(\"targetEntityId\")\n\t\t\t.notNull()\n\t\t\t.references(() => entityTable.id, { onDelete: \"cascade\" }),\n\t\tagentId: uuid(\"agentId\")\n\t\t\t.notNull()\n\t\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\t\ttags: text(\"tags\").array(),\n\t\tmetadata: jsonb(\"metadata\"),\n\t},\n\t(table) => [\n\t\tindex(\"idx_relationships_users\").on(\n\t\t\ttable.sourceEntityId,\n\t\t\ttable.targetEntityId,\n\t\t),\n\t\tunique(\"unique_relationship\").on(\n\t\t\ttable.sourceEntityId,\n\t\t\ttable.targetEntityId,\n\t\t\ttable.agentId,\n\t\t),\n\t\tforeignKey({\n\t\t\tname: \"fk_user_a\",\n\t\t\tcolumns: [table.sourceEntityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user_b\",\n\t\t\tcolumns: [table.targetEntityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n","import { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\n/**\n * Represents a table schema for tasks in the database.\n *\n * @type {PgTable}\n */\nexport const taskTable = pgTable(\"tasks\", {\n\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\tname: text(\"name\").notNull(),\n\tdescription: text(\"description\").notNull(),\n\troomId: uuid(\"room_id\"),\n\tworldId: uuid(\"world_id\"),\n\tagentId: uuid(\"agent_id\").notNull(),\n\ttags: text(\"tags\").array(),\n\tmetadata: jsonb(\"metadata\"),\n\tcreatedAt: timestamp(\"created_at\").defaultNow(),\n\tupdatedAt: timestamp(\"updated_at\").defaultNow(),\n});\n","import { type UUID, logger } from \"@elizaos/core\";\nimport { type NodePgDatabase, drizzle } from \"drizzle-orm/node-postgres\";\nimport { BaseDrizzleAdapter } from \"../base\";\nimport {\n\tDIMENSION_MAP,\n\ttype EmbeddingDimensionColumn,\n} from \"../schema/embedding\";\nimport type { PostgresConnectionManager } from \"./manager\";\n\n/**\n * Adapter class for interacting with a PostgreSQL database.\n * Extends BaseDrizzleAdapter<NodePgDatabase>.\n */\nexport class PgDatabaseAdapter extends BaseDrizzleAdapter<NodePgDatabase> {\n\tprotected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n\n\t/**\n\t * Constructor for creating a new instance of a class.\n\t * @param {UUID} agentId - The unique identifier for the agent.\n\t * @param {PostgresConnectionManager} manager - The Postgres connection manager for the instance.\n\t */\n\tconstructor(\n\t\tagentId: UUID,\n\t\tprivate manager: PostgresConnectionManager,\n\t) {\n\t\tsuper(agentId);\n\t\tthis.manager = manager;\n\t}\n\n\t/**\n\t * Executes the provided operation with a database connection.\n\t *\n\t * @template T\n\t * @param {() => Promise<T>} operation - The operation to be executed with the database connection.\n\t * @returns {Promise<T>} A promise that resolves with the result of the operation.\n\t */\n\tprotected async withDatabase<T>(operation: () => Promise<T>): Promise<T> {\n\t\treturn await this.withRetry(async () => {\n\t\t\tconst client = await this.manager.getClient();\n\t\t\ttry {\n\t\t\t\tconst db = drizzle(client);\n\t\t\t\tthis.db = db;\n\n\t\t\t\treturn await operation();\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously initializes the PgDatabaseAdapter by running migrations using the manager.\n\t * Logs a success message if initialization is successful, otherwise logs an error message.\n\t *\n\t * @returns {Promise<void>} A promise that resolves when initialization is complete.\n\t */\n\tasync init(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.manager.runMigrations();\n\t\t\tlogger.info(\"PgDatabaseAdapter initialized successfully\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize PgDatabaseAdapter:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously closes the manager associated with this instance.\n\t *\n\t * @returns A Promise that resolves once the manager is closed.\n\t */\n\tasync close(): Promise<void> {\n\t\tawait this.manager.close();\n\t}\n}\n"],"mappings":"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","names":["logger","logger","sql","sql","check","foreignKey","index","pgTable","uuid","vector","sql","boolean","jsonb","pgTable","text","uuid","sql","jsonb","pgTable","text","unique","uuid","pgTable","uuid","sql","text","jsonb","unique","sql","jsonb","pgTable","text","uuid","sql","jsonb","pgTable","text","uuid","pgTable","uuid","sql","text","jsonb","pgTable","uuid","sql","text","jsonb","pgTable","uuid","text","sql","jsonb","boolean","pgTable","uuid","sql","vector","check","index","foreignKey","sql","jsonb","pgTable","text","unique","uuid","pgTable","uuid","sql","text","jsonb","unique","sql","jsonb","pgTable","text","uuid","pgTable","uuid","text","jsonb","sql","sql","foreignKey","jsonb","pgTable","text","uuid","pgTable","uuid","sql","jsonb","text","foreignKey","sql","foreignKey","index","pgTable","text","uuid","pgTable","uuid","sql","text","index","foreignKey","sql","foreignKey","index","jsonb","pgTable","text","unique","uuid","pgTable","uuid","sql","text","jsonb","index","unique","foreignKey","jsonb","pgTable","text","uuid","sql","unique","logger","logger","drizzle","drizzle","logger","logger"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/pg-lite/adapter.ts","../src/base.ts","../src/schema/embedding.ts","../src/schema/memory.ts","../src/schema/agent.ts","../src/schema/types.ts","../src/schema/entity.ts","../src/schema/room.ts","../src/schema/worldTable.ts","../src/schema/cache.ts","../src/schema/component.ts","../src/schema/log.ts","../src/schema/participant.ts","../src/schema/relationship.ts","../src/schema/tasks.ts","../src/pg/adapter.ts"],"sourceRoot":"./","sourcesContent":["import * as os from \"node:os\";\nimport type { IDatabaseAdapter, UUID } from \"@elizaos/core\";\nimport {\n\ttype IAgentRuntime,\n\ttype Plugin,\n\tlogger\n} from \"@elizaos/core\";\nimport { PgliteDatabaseAdapter } from \"./pg-lite/adapter\";\nimport { PGliteClientManager } from \"./pg-lite/manager\";\nimport { PgDatabaseAdapter } from \"./pg/adapter\";\nimport { PostgresConnectionManager } from \"./pg/manager\";\n\n/**\n * Global Singleton Instances (Package-scoped)\n *\n * These instances are stored globally within the package scope to ensure a single shared instance across multiple adapters within this package.\n * This approach prevents multiple instantiations due to module caching or multiple imports within the same process.\n *\n * IMPORTANT:\n * - Do NOT directly modify these instances outside their intended initialization logic.\n * - These instances are NOT exported and should NOT be accessed outside this package.\n */\nconst GLOBAL_SINGLETONS = Symbol.for(\"@elizaos/plugin-sql/global-singletons\");\n\ninterface GlobalSingletons {\n\tpgLiteClientManager?: PGliteClientManager;\n\tpostgresConnectionManager?: PostgresConnectionManager;\n}\n\nconst globalSymbols = global as unknown as Record<symbol, GlobalSingletons>;\n\nif (!globalSymbols[GLOBAL_SINGLETONS]) {\n\tglobalSymbols[GLOBAL_SINGLETONS] = {};\n}\n\nconst globalSingletons = globalSymbols[GLOBAL_SINGLETONS];\n\n/**\n * Helper function to expand tilde in paths\n */\nfunction expandTildePath(filepath: string): string {\n\tif (filepath && typeof filepath === \"string\" && filepath.startsWith(\"~\")) {\n\t\treturn filepath.replace(/^~/, os.homedir());\n\t}\n\treturn filepath;\n}\n\n/**\n * Creates a database adapter based on the provided configuration.\n * If a postgresUrl is provided in the config, a PgDatabaseAdapter is initialized using the PostgresConnectionManager.\n * If no postgresUrl is provided, a PgliteDatabaseAdapter is initialized using PGliteClientManager with the dataDir from the config.\n *\n * @param {object} config - The configuration object.\n * @param {string} [config.dataDir] - The directory where data is stored. Defaults to \"./elizadb\".\n * @param {string} [config.postgresUrl] - The URL for the PostgreSQL database.\n * @param {UUID} agentId - The unique identifier for the agent.\n * @returns {IDatabaseAdapter} The created database adapter.\n */\nexport function createDatabaseAdapter(\n\tconfig: {\n\t\tdataDir?: string;\n\t\tpostgresUrl?: string;\n\t},\n\tagentId: UUID,\n): IDatabaseAdapter {\n\tif (config.dataDir) {\n\t\tconfig.dataDir = expandTildePath(config.dataDir);\n\t}\n\n\tif (config.postgresUrl) {\n\t\tif (!globalSingletons.postgresConnectionManager) {\n\t\t\tglobalSingletons.postgresConnectionManager = new PostgresConnectionManager(\n\t\t\t\tconfig.postgresUrl,\n\t\t\t);\n\t\t}\n\t\treturn new PgDatabaseAdapter(agentId, globalSingletons.postgresConnectionManager);\n\t}\n\n\tconst dataDir = config.dataDir ?? \"./elizadb\";\n\n\tif (!globalSingletons.pgLiteClientManager) {\n\t\tglobalSingletons.pgLiteClientManager = new PGliteClientManager({ dataDir });\n\t}\n\n\treturn new PgliteDatabaseAdapter(agentId, globalSingletons.pgLiteClientManager);\n}\n\n/**\n * Drizzle plugin for database adapter using Drizzle ORM\n *\n * @typedef {Object} Plugin\n * @property {string} name - The name of the plugin\n * @property {string} description - The description of the plugin\n * @property {Function} init - The initialization function for the plugin\n * @param {any} _ - Input parameter\n * @param {IAgentRuntime} runtime - The runtime environment for the agent\n */\nconst drizzlePlugin: Plugin = {\n\tname: \"drizzle\",\n\tdescription: \"Database adapter plugin using Drizzle ORM\",\n\tinit: async (_, runtime: IAgentRuntime) => {\n\t\tconst config = {\n\t\t\tdataDir: runtime.getSetting(\"PGLITE_DATA_DIR\") ?? \"./pglite\",\n\t\t\tpostgresUrl: runtime.getSetting(\"POSTGRES_URL\"),\n\t\t};\n\n\t\ttry {\n\t\t\tconst db = createDatabaseAdapter(config, runtime.agentId);\n\t\t\tlogger.success(\"Database connection established successfully\");\n\t\t\truntime.registerDatabaseAdapter(db);\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize database:\", error);\n\t\t\tthrow error;\n\t\t}\n\t},\n};\n\nexport default drizzlePlugin;\n","import { type UUID, logger } from \"@elizaos/core\";\nimport { type PgliteDatabase, drizzle } from \"drizzle-orm/pglite\";\nimport { BaseDrizzleAdapter } from \"../base\";\nimport {\n\tDIMENSION_MAP,\n\ttype EmbeddingDimensionColumn,\n} from \"../schema/embedding\";\nimport type { PGliteClientManager } from \"./manager\";\n\n/**\n * PgliteDatabaseAdapter class represents an adapter for interacting with a PgliteDatabase.\n * Extends BaseDrizzleAdapter<PgliteDatabase>.\n *\n * @constructor\n * @param {UUID} agentId - The ID of the agent.\n * @param {PGliteClientManager} manager - The manager for the PgliteDatabase.\n *\n * @method withDatabase\n * @param {() => Promise<T>} operation - The operation to perform on the database.\n * @return {Promise<T>} - The result of the operation.\n *\n * @method init\n * @return {Promise<void>} - A Promise that resolves when the initialization is complete.\n *\n * @method close\n * @return {void} - A Promise that resolves when the database is closed.\n */\nexport class PgliteDatabaseAdapter extends BaseDrizzleAdapter<PgliteDatabase> {\n\tprivate manager: PGliteClientManager;\n\tprotected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n\n\t/**\n\t * Constructor for creating an instance of a class.\n\t * @param {UUID} agentId - The unique identifier for the agent.\n\t * @param {PGliteClientManager} manager - The manager for the PGlite client.\n\t */\n\tconstructor(agentId: UUID, manager: PGliteClientManager) {\n\t\tsuper(agentId);\n\t\tthis.manager = manager;\n\t\tthis.db = drizzle(this.manager.getConnection());\n\t}\n\n\t/**\n\t * Asynchronously runs the provided database operation while checking if the database manager is currently shutting down.\n\t * If the database manager is shutting down, a warning is logged and null is returned.\n\t *\n\t * @param {Function} operation - The database operation to be performed.\n\t * @returns {Promise<T>} A promise that resolves with the result of the database operation.\n\t */\n\tprotected async withDatabase<T>(operation: () => Promise<T>): Promise<T> {\n\t\tif (this.manager.isShuttingDown()) {\n\t\t\tlogger.warn(\"Database is shutting down\");\n\t\t\treturn null as unknown as T;\n\t\t}\n\t\treturn operation();\n\t}\n\n\t/**\n\t * Asynchronously initializes the database by running migrations using the manager.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves when the database initialization is complete.\n\t */\n\tasync init(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.manager.runMigrations();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize database:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously closes the manager.\n\t */\n\tasync close() {\n\t\tawait this.manager.close();\n\t}\n}\n","import {\n\ttype Agent,\n\ttype Component,\n\tDatabaseAdapter,\n\ttype Entity,\n\ttype Memory,\n\ttype Participant,\n\ttype Relationship,\n\ttype Room,\n\ttype Task,\n\ttype UUID,\n\ttype World,\n\tlogger\n} from \"@elizaos/core\";\nimport type { Log } from \"@elizaos/core\";\nimport {\n\tand,\n\tcosineDistance,\n\tcount,\n\tdesc,\n\teq,\n\tgte,\n\tinArray,\n\tlte,\n\tor,\n\tsql,\n} from \"drizzle-orm\";\nimport { v4 } from \"uuid\";\nimport {\n\tDIMENSION_MAP,\n\ttype EmbeddingDimensionColumn,\n} from \"./schema/embedding\";\nimport {\n\tagentTable,\n\tcacheTable,\n\tcomponentTable,\n\tembeddingTable,\n\tentityTable,\n\tlogTable,\n\tmemoryTable,\n\tparticipantTable,\n\trelationshipTable,\n\troomTable,\n\ttaskTable,\n\tworldTable\n} from \"./schema/index\";\nimport type { DrizzleOperations } from \"./types\";\n\n// Define the metadata type inline since we can't import it\n/**\n * Represents metadata information about memory.\n * @typedef {Object} MemoryMetadata\n * @property {string} type - The type of memory.\n * @property {string} [source] - The source of the memory.\n * @property {UUID} [sourceId] - The ID of the source.\n * @property {string} [scope] - The scope of the memory.\n * @property {number} [timestamp] - The timestamp of the memory.\n * @property {string[]} [tags] - The tags associated with the memory.\n * @property {UUID} [documentId] - The ID of the document associated with the memory.\n * @property {number} [position] - The position of the memory.\n */\n\ntype MemoryMetadata = {\n\ttype: string;\n\tsource?: string;\n\tsourceId?: UUID;\n\tscope?: string;\n\ttimestamp?: number;\n\ttags?: string[];\n\tdocumentId?: UUID;\n\tposition?: number;\n};\n\n/**\n * Abstract class representing a base Drizzle adapter for working with databases.\n * @template TDatabase - The type of Drizzle operations supported by the adapter.\n */\nexport abstract class BaseDrizzleAdapter<\n\tTDatabase extends DrizzleOperations,\n> extends DatabaseAdapter<TDatabase> {\n\tprotected readonly maxRetries: number = 3;\n\tprotected readonly baseDelay: number = 1000;\n\tprotected readonly maxDelay: number = 10000;\n\tprotected readonly jitterMax: number = 1000;\n\tprotected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n\n\tprotected abstract withDatabase<T>(operation: () => Promise<T>): Promise<T>;\n\tpublic abstract init(): Promise<void>;\n\tpublic abstract close(): Promise<void>;\n\n\tprotected agentId: UUID;\n\n\t/**\n\t * Constructor for creating a new instance of Agent with the specified agentId.\n\t *\n\t * @param {UUID} agentId - The unique identifier for the agent.\n\t */\n\tconstructor(agentId: UUID) {\n\t\tsuper();\n\t\tthis.agentId = agentId;\n\t}\n\n\t/**\n\t * Executes the given operation with retry logic.\n\t * @template T\n\t * @param {() => Promise<T>} operation - The operation to be executed.\n\t * @returns {Promise<T>} A promise that resolves with the result of the operation.\n\t */\n\tprotected async withRetry<T>(operation: () => Promise<T>): Promise<T> {\n\t\tlet lastError: Error = new Error(\"Unknown error\");\n\n\t\tfor (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await operation();\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error as Error;\n\n\t\t\t\tif (attempt < this.maxRetries) {\n\t\t\t\t\tconst backoffDelay = Math.min(\n\t\t\t\t\t\tthis.baseDelay * 2 ** (attempt - 1),\n\t\t\t\t\t\tthis.maxDelay,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst jitter = Math.random() * this.jitterMax;\n\t\t\t\t\tconst delay = backoffDelay + jitter;\n\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`Database operation failed (attempt ${attempt}/${this.maxRetries}):`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\tnextRetryIn: `${(delay / 1000).toFixed(1)}s`,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(\"Max retry attempts reached:\", {\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\ttotalAttempts: attempt,\n\t\t\t\t\t});\n\t\t\t\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthrow lastError;\n\t}\n\n\t/**\n\t * Ensure that an agent exists by checking if an agent with the same name already exists in the system.\n\t * If the agent does not exist, it will be created with the provided data.\n\t *\n\t * @param {Partial<Agent>} agent - The partial data of the agent to ensure its existence.\n\t * @returns {Promise<void>} - A promise that resolves when the agent is successfully ensured.\n\t * @throws {Error} - If the agent name is not provided or if there is an issue creating the agent.\n\t */\n\tasync ensureAgentExists(agent: Partial<Agent>): Promise<void> {\n\t\tif (!agent.name) {\n\t\t\tthrow new Error(\"Agent name is required\");\n\t\t}\n\n\t\tconst agents = await this.getAgents();\n\t\tconst existingAgent = agents.find(\n\t\t\t(a: Partial<Agent & { status: string }>) => a.name === agent.name,\n\t\t);\n\n\t\tif (!existingAgent) {\n\t\t\tawait this.createAgent(agent);\n\t\t}\n\t}\n\n\t/**\n\t * Ensure that the given embedding dimension is valid for the agent.\n\t *\n\t * @param {number} dimension - The dimension to ensure for the embedding.\n\t * @returns {Promise<void>} - Resolves once the embedding dimension is ensured.\n\t */\n\tasync ensureEmbeddingDimension(dimension: number) {\n\t\tconst existingMemory = await this.db\n\t\t\t.select({\n\t\t\t\tembedding: embeddingTable,\n\t\t\t})\n\t\t\t.from(memoryTable)\n\t\t\t.innerJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n\t\t\t.where(eq(memoryTable.agentId, this.agentId))\n\t\t\t.limit(1);\n\n\t\tif (existingMemory.length > 0) {\n\t\t\tconst usedDimension = Object.entries(DIMENSION_MAP).find(\n\t\t\t\t([_, colName]) => existingMemory[0].embedding[colName] !== null,\n\t\t\t);\n\t\t}\n\n\t\tthis.embeddingDimension = DIMENSION_MAP[dimension];\n\t}\n\n\t/**\n\t * Asynchronously retrieves an agent by their ID from the database.\n\t * @param {UUID} agentId - The ID of the agent to retrieve.\n\t * @returns {Promise<Agent | null>} A promise that resolves to the retrieved agent or null if not found.\n\t */\n\tasync getAgent(agentId: UUID): Promise<Agent | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(agentTable)\n\t\t\t\t.where(eq(agentTable.id, agentId))\n\t\t\t\t.limit(1);\n\n\t\t\tif (result.length === 0) return null;\n\t\t\treturn result[0];\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously retrieves a list of agents from the database.\n\t *\n\t * @returns {Promise<Agent[]>} A Promise that resolves to an array of Agent objects.\n\t */\n\tasync getAgents(): Promise<Agent[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db.select().from(agentTable);\n\n\t\t\treturn result;\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously creates a new agent record in the database.\n\t *\n\t * @param {Partial<Agent>} agent The agent object to be created.\n\t * @returns {Promise<boolean>} A promise that resolves to a boolean indicating the success of the operation.\n\t */\n\tasync createAgent(agent: Partial<Agent>): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(agentTable).values({\n\t\t\t\t\t\t...agent,\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tlogger.debug(\"Agent created successfully:\", {\n\t\t\t\t\tagentId: agent.id,\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error creating agent:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tagentId: agent.id,\n\t\t\t\t\tagent,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Updates an agent in the database with the provided agent ID and data.\n\t * @param {UUID} agentId - The unique identifier of the agent to update.\n\t * @param {Partial<Agent>} agent - The partial agent object containing the fields to update.\n\t * @returns {Promise<boolean>} - A boolean indicating if the agent was successfully updated.\n\t */\n\tasync updateAgent(agentId: UUID, agent: Partial<Agent>): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tif (!agent.id) {\n\t\t\t\t\tthrow new Error(\"Agent ID is required for update\");\n\t\t\t\t}\n\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.update(agentTable)\n\t\t\t\t\t\t.set({\n\t\t\t\t\t\t\t...agent,\n\t\t\t\t\t\t\tupdatedAt: Date.now(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.where(eq(agentTable.id, agentId));\n\t\t\t\t});\n\n\t\t\t\tlogger.debug(\"Agent updated successfully:\", {\n\t\t\t\t\tagentId,\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error updating agent:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tagentId,\n\t\t\t\t\tagent,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously deletes an agent with the specified UUID and all related entries.\n\t *\n\t * @param {UUID} agentId - The UUID of the agent to be deleted.\n\t * @returns {Promise<boolean>} - A boolean indicating if the deletion was successful.\n\t */\n\tasync deleteAgent(agentId: UUID): Promise<boolean> {\n\t\t// casacade delete all related for the agent\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tawait tx.delete(agentTable).where(eq(agentTable.id, agentId));\n\t\t\t});\n\t\t\treturn true;\n\t\t});\n\t}\n\n\t/**\n\t * Count all agents in the database\n\t * Used primarily for maintenance and cleanup operations\n\t */\n\t/**\n\t * Asynchronously counts the number of agents in the database.\n\t * @returns {Promise<number>} A Promise that resolves to the number of agents in the database.\n\t */\n\tasync countAgents(): Promise<number> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select({ count: count() })\n\t\t\t\t\t.from(agentTable);\n\n\t\t\t\treturn result[0]?.count || 0;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error counting agents:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Clean up the agents table by removing all agents\n\t * This is used during server startup to ensure no orphaned agents exist\n\t * from previous crashes or improper shutdowns\n\t */\n\tasync cleanupAgents(): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.delete(agentTable);\n\t\t\t\tlogger.success(\"Successfully cleaned up agent table\");\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error cleaning up agent table:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getEntityById(entityId: UUID): Promise<Entity | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tentity: entityTable,\n\t\t\t\t\tcomponents: componentTable,\n\t\t\t\t})\n\t\t\t\t.from(entityTable)\n\t\t\t\t.leftJoin(componentTable, eq(componentTable.entityId, entityTable.id))\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(entityTable.id, entityId),\n\t\t\t\t\t\teq(entityTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tif (result.length === 0) return null;\n\n\t\t\t// Group components by entity\n\t\t\tconst entity = result[0].entity;\n\t\t\tentity.components = result\n\t\t\t\t.filter((row) => row.components)\n\t\t\t\t.map((row) => row.components);\n\n\t\t\treturn entity;\n\t\t});\n\t}\n\n\tasync getEntitiesForRoom(\n\t\troomId: UUID,\n\t\tincludeComponents?: boolean,\n\t): Promise<Entity[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst query = this.db\n\t\t\t\t.select({\n\t\t\t\t\tentity: entityTable,\n\t\t\t\t\t...(includeComponents && { components: componentTable }),\n\t\t\t\t})\n\t\t\t\t.from(participantTable)\n\t\t\t\t.leftJoin(\n\t\t\t\t\tentityTable,\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.entityId, entityTable.id),\n\t\t\t\t\t\teq(entityTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\tif (includeComponents) {\n\t\t\t\tquery.leftJoin(\n\t\t\t\t\tcomponentTable,\n\t\t\t\t\teq(componentTable.entityId, entityTable.id),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = await query.where(eq(participantTable.roomId, roomId));\n\n\t\t\t// Group components by entity if includeComponents is true\n\t\t\tconst entitiesByIdMap = new Map<UUID, Entity>();\n\n\t\t\tfor (const row of result) {\n\t\t\t\tif (!row.entity) continue;\n\n\t\t\t\tconst entityId = row.entity.id as UUID;\n\t\t\t\tif (!entitiesByIdMap.has(entityId)) {\n\t\t\t\t\tconst entity: Entity = {\n\t\t\t\t\t\t...row.entity,\n\t\t\t\t\t\tcomponents: includeComponents ? [] : undefined,\n\t\t\t\t\t};\n\t\t\t\t\tentitiesByIdMap.set(entityId, entity);\n\t\t\t\t}\n\n\t\t\t\tif (includeComponents && row.components) {\n\t\t\t\t\tconst entity = entitiesByIdMap.get(entityId);\n\t\t\t\t\tif (entity) {\n\t\t\t\t\t\tif (!entity.components) {\n\t\t\t\t\t\t\tentity.components = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity.components.push(row.components);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn Array.from(entitiesByIdMap.values());\n\t\t});\n\t}\n\n\tasync createEntity(entity: Entity): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\treturn await this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(entityTable).values(entity);\n\n\t\t\t\t\tlogger.debug(\"Entity created successfully:\", {\n\t\t\t\t\t\tentity,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error creating entity:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tentityId: entity.id,\n\t\t\t\t\tname: entity.metadata?.name,\n\t\t\t\t});\n\t\t\t\t// trace the error\n\t\t\t\tconsole.trace(error);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Ensures an entity exists, creating it if it doesn't\n\t * @param entity The entity to ensure exists\n\t * @returns Promise resolving to boolean indicating success\n\t */\n\tprotected async ensureEntityExists(entity: Entity): Promise<boolean> {\n\t\tif (!entity.id) {\n\t\t\tlogger.error(\"Entity ID is required for ensureEntityExists\");\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tconst existingEntity = await this.getEntityById(entity.id);\n\n\t\t\tif (!existingEntity) {\n\t\t\t\treturn await this.createEntity(entity);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error ensuring entity exists:\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tentityId: entity.id,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync updateEntity(entity: Entity): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(entityTable)\n\t\t\t\t.set(entity)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(entityTable.id, entity.id as UUID),\n\t\t\t\t\t\teq(entityTable.agentId, entity.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t});\n\t}\n\n\tasync getComponent(\n\t\tentityId: UUID,\n\t\ttype: string,\n\t\tworldId?: UUID,\n\t\tsourceEntityId?: UUID,\n\t): Promise<Component | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [\n\t\t\t\teq(componentTable.entityId, entityId),\n\t\t\t\teq(componentTable.type, type),\n\t\t\t];\n\n\t\t\tif (worldId) {\n\t\t\t\tconditions.push(eq(componentTable.worldId, worldId));\n\t\t\t}\n\n\t\t\tif (sourceEntityId) {\n\t\t\t\tconditions.push(eq(componentTable.sourceEntityId, sourceEntityId));\n\t\t\t}\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(componentTable)\n\t\t\t\t.where(and(...conditions));\n\t\t\treturn result.length > 0 ? result[0] : null;\n\t\t});\n\t}\n\n\tasync getComponents(\n\t\tentityId: UUID,\n\t\tworldId?: UUID,\n\t\tsourceEntityId?: UUID,\n\t): Promise<Component[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [eq(componentTable.entityId, entityId)];\n\n\t\t\tif (worldId) {\n\t\t\t\tconditions.push(eq(componentTable.worldId, worldId));\n\t\t\t}\n\n\t\t\tif (sourceEntityId) {\n\t\t\t\tconditions.push(eq(componentTable.sourceEntityId, sourceEntityId));\n\t\t\t}\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: componentTable.id,\n\t\t\t\t\tentityId: componentTable.entityId,\n\t\t\t\t\ttype: componentTable.type,\n\t\t\t\t\tdata: componentTable.data,\n\t\t\t\t\tworldId: componentTable.worldId,\n\t\t\t\t\tsourceEntityId: componentTable.sourceEntityId,\n\t\t\t\t\tcreatedAt: componentTable.createdAt,\n\t\t\t\t})\n\t\t\t\t.from(componentTable)\n\t\t\t\t.where(and(...conditions));\n\t\t\treturn result;\n\t\t});\n\t}\n\n\tasync createComponent(component: Component): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.insert(componentTable).values(component);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tasync updateComponent(component: Component): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(componentTable)\n\t\t\t\t.set(component)\n\t\t\t\t.where(eq(componentTable.id, component.id));\n\t\t});\n\t}\n\n\tasync deleteComponent(componentId: UUID): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.delete(componentTable)\n\t\t\t\t.where(eq(componentTable.id, componentId));\n\t\t});\n\t}\n\n\tasync getMemories(params: {\n\t\troomId: UUID;\n\t\tcount?: number;\n\t\tunique?: boolean;\n\t\ttableName: string;\n\t\tstart?: number;\n\t\tend?: number;\n\t}): Promise<Memory[]> {\n\t\tif (!params.tableName) throw new Error(\"tableName is required\");\n\t\tif (!params.roomId) throw new Error(\"roomId is required\");\n\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [\n\t\t\t\teq(memoryTable.type, params.tableName),\n\t\t\t\teq(memoryTable.roomId, params.roomId),\n\t\t\t];\n\n\t\t\tif (params.start) {\n\t\t\t\tconditions.push(gte(memoryTable.createdAt, params.start));\n\t\t\t}\n\n\t\t\tif (params.end) {\n\t\t\t\tconditions.push(lte(memoryTable.createdAt, params.end));\n\t\t\t}\n\n\t\t\tif (params.unique) {\n\t\t\t\tconditions.push(eq(memoryTable.unique, true));\n\t\t\t}\n\n\t\t\tconditions.push(eq(memoryTable.agentId, this.agentId));\n\n\t\t\tconst query = this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: {\n\t\t\t\t\t\tid: memoryTable.id,\n\t\t\t\t\t\ttype: memoryTable.type,\n\t\t\t\t\t\tcreatedAt: memoryTable.createdAt,\n\t\t\t\t\t\tcontent: memoryTable.content,\n\t\t\t\t\t\tentityId: memoryTable.entityId,\n\t\t\t\t\t\tagentId: memoryTable.agentId,\n\t\t\t\t\t\troomId: memoryTable.roomId,\n\t\t\t\t\t\tunique: memoryTable.unique,\n\t\t\t\t\t},\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.leftJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(memoryTable.createdAt));\n\n\t\t\tconst rows = params.count ? await query.limit(params.count) : await query;\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\ttype: row.memory.type,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ? Array.from(row.embedding) : undefined,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync getMemoriesByRoomIds(params: {\n\t\troomIds: UUID[];\n\t\ttableName: string;\n\t\tlimit?: number;\n\t}): Promise<Memory[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tif (params.roomIds.length === 0) return [];\n\n\t\t\tconst conditions = [\n\t\t\t\teq(memoryTable.type, params.tableName),\n\t\t\t\tinArray(memoryTable.roomId, params.roomIds),\n\t\t\t];\n\n\t\t\tconditions.push(eq(memoryTable.agentId, this.agentId));\n\n\t\t\tconst query = this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: memoryTable.id,\n\t\t\t\t\ttype: memoryTable.type,\n\t\t\t\t\tcreatedAt: memoryTable.createdAt,\n\t\t\t\t\tcontent: memoryTable.content,\n\t\t\t\t\tentityId: memoryTable.entityId,\n\t\t\t\t\tagentId: memoryTable.agentId,\n\t\t\t\t\troomId: memoryTable.roomId,\n\t\t\t\t\tunique: memoryTable.unique,\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(memoryTable.createdAt));\n\n\t\t\tconst rows = params.limit ? await query.limit(params.limit) : await query;\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tid: row.id as UUID,\n\t\t\t\tcreatedAt: row.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.content)\n\t\t\t\t\t\t: row.content,\n\t\t\t\tentityId: row.entityId as UUID,\n\t\t\t\tagentId: row.agentId as UUID,\n\t\t\t\troomId: row.roomId as UUID,\n\t\t\t\tunique: row.unique,\n\t\t\t})) as Memory[];\n\t\t});\n\t}\n\n\tasync getMemoryById(id: UUID): Promise<Memory | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: memoryTable,\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.leftJoin(embeddingTable, eq(memoryTable.id, embeddingTable.memoryId))\n\t\t\t\t.where(eq(memoryTable.id, id))\n\t\t\t\t.limit(1);\n\n\t\t\tif (result.length === 0) return null;\n\n\t\t\tconst row = result[0];\n\t\t\treturn {\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ?? undefined,\n\t\t\t};\n\t\t});\n\t}\n\n\tasync getMemoriesByIds(\n\t\tmemoryIds: UUID[],\n\t\ttableName?: string,\n\t): Promise<Memory[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tif (memoryIds.length === 0) return [];\n\n\t\t\tconst conditions = [inArray(memoryTable.id, memoryIds)];\n\n\t\t\tif (tableName) {\n\t\t\t\tconditions.push(eq(memoryTable.type, tableName));\n\t\t\t}\n\n\t\t\tconst rows = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: memoryTable,\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.leftJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(memoryTable.createdAt));\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ?? undefined,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync getCachedEmbeddings(opts: {\n\t\tquery_table_name: string;\n\t\tquery_threshold: number;\n\t\tquery_input: string;\n\t\tquery_field_name: string;\n\t\tquery_field_sub_name: string;\n\t\tquery_match_count: number;\n\t}): Promise<{ embedding: number[]; levenshtein_score: number }[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst results = await this.db.execute<{\n\t\t\t\t\tembedding: number[];\n\t\t\t\t\tlevenshtein_score: number;\n\t\t\t\t}>(sql`\n WITH content_text AS (\n SELECT\n m.id,\n COALESCE(\n m.content->>${opts.query_field_sub_name},\n ''\n ) as content_text\n FROM memories m\n WHERE m.type = ${opts.query_table_name}\n AND m.content->>${opts.query_field_sub_name} IS NOT NULL\n ),\n embedded_text AS (\n SELECT \n ct.content_text,\n COALESCE(\n e.dim_384,\n e.dim_512,\n e.dim_768,\n e.dim_1024,\n e.dim_1536,\n e.dim_3072\n ) as embedding\n FROM content_text ct\n LEFT JOIN embeddings e ON e.memory_id = ct.id\n WHERE e.memory_id IS NOT NULL\n )\n SELECT\n embedding,\n levenshtein(${opts.query_input}, content_text) as levenshtein_score\n FROM embedded_text\n WHERE levenshtein(${opts.query_input}, content_text) <= ${opts.query_threshold}\n ORDER BY levenshtein_score\n LIMIT ${opts.query_match_count}\n `);\n\n\t\t\t\treturn results.rows\n\t\t\t\t\t.map((row) => ({\n\t\t\t\t\t\tembedding: Array.isArray(row.embedding)\n\t\t\t\t\t\t\t? row.embedding\n\t\t\t\t\t\t\t: typeof row.embedding === \"string\"\n\t\t\t\t\t\t\t\t? JSON.parse(row.embedding)\n\t\t\t\t\t\t\t\t: [],\n\t\t\t\t\t\tlevenshtein_score: Number(row.levenshtein_score),\n\t\t\t\t\t}))\n\t\t\t\t\t.filter((row) => Array.isArray(row.embedding));\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error in getCachedEmbeddings:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\ttableName: opts.query_table_name,\n\t\t\t\t\tfieldName: opts.query_field_name,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\terror instanceof Error &&\n\t\t\t\t\terror.message ===\n\t\t\t\t\t\t\"levenshtein argument exceeds maximum length of 255 characters\"\n\t\t\t\t) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync log(params: {\n\t\tbody: { [key: string]: unknown };\n\t\tentityId: UUID;\n\t\troomId: UUID;\n\t\ttype: string;\n\t}): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx.insert(logTable).values({\n\t\t\t\t\t\tbody: sql`${params.body}::jsonb`,\n\t\t\t\t\t\tentityId: params.entityId,\n\t\t\t\t\t\troomId: params.roomId,\n\t\t\t\t\t\ttype: params.type,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Failed to create log entry:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\ttype: params.type,\n\t\t\t\t\troomId: params.roomId,\n\t\t\t\t\tentityId: params.entityId,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getLogs(\n\t\tparams: {\n\t\t\tentityId: UUID;\n\t\t\troomId?: UUID;\n\t\t\ttype?: string;\n\t\t\tcount?: number;\n\t\t\toffset?: number;\n\t\t},\n\t): Promise<Log[]> {\n\t\tconst { entityId, roomId, type, count, offset } = params;\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(logTable)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(logTable.entityId, entityId),\n\t\t\t\t\t\troomId ? eq(logTable.roomId, roomId) : undefined,\n\t\t\t\t\t\ttype ? eq(logTable.type, type) : undefined,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.orderBy(desc(logTable.createdAt))\n\t\t\t\t.limit(count ?? 10)\n\t\t\t\t.offset(offset ?? 0);\n\t\t\treturn result;\n\t\t});\n\n\t}\n\n\tasync deleteLog(logId: UUID): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.delete(logTable).where(eq(logTable.id, logId));\n\t\t});\n\t}\n\n\tasync searchMemories(params: {\n\t\ttableName: string;\n\t\troomId: UUID;\n\t\tembedding: number[];\n\t\tmatch_threshold: number;\n\t\tcount: number;\n\t\tunique: boolean;\n\t}): Promise<Memory[]> {\n\t\treturn await this.searchMemoriesByEmbedding(params.embedding, {\n\t\t\tmatch_threshold: params.match_threshold,\n\t\t\tcount: params.count,\n\t\t\troomId: params.roomId,\n\t\t\tunique: params.unique,\n\t\t\ttableName: params.tableName,\n\t\t});\n\t}\n\n\tasync searchMemoriesByEmbedding(\n\t\tembedding: number[],\n\t\tparams: {\n\t\t\tmatch_threshold?: number;\n\t\t\tcount?: number;\n\t\t\troomId?: UUID;\n\t\t\tunique?: boolean;\n\t\t\ttableName: string;\n\t\t},\n\t): Promise<Memory[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst cleanVector = embedding.map((n) =>\n\t\t\t\tNumber.isFinite(n) ? Number(n.toFixed(6)) : 0,\n\t\t\t);\n\n\t\t\tconst similarity = sql<number>`1 - (${cosineDistance(\n\t\t\t\tembeddingTable[this.embeddingDimension],\n\t\t\t\tcleanVector,\n\t\t\t)})`;\n\n\t\t\tconst conditions = [eq(memoryTable.type, params.tableName)];\n\n\t\t\tif (params.unique) {\n\t\t\t\tconditions.push(eq(memoryTable.unique, true));\n\t\t\t}\n\n\t\t\tconditions.push(eq(memoryTable.agentId, this.agentId));\n\n\t\t\tif (params.roomId) {\n\t\t\t\tconditions.push(eq(memoryTable.roomId, params.roomId));\n\t\t\t}\n\n\t\t\tif (params.match_threshold) {\n\t\t\t\tconditions.push(gte(similarity, params.match_threshold));\n\t\t\t}\n\n\t\t\tconst results = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tmemory: memoryTable,\n\t\t\t\t\tsimilarity,\n\t\t\t\t\tembedding: embeddingTable[this.embeddingDimension],\n\t\t\t\t})\n\t\t\t\t.from(embeddingTable)\n\t\t\t\t.innerJoin(memoryTable, eq(memoryTable.id, embeddingTable.memoryId))\n\t\t\t\t.where(and(...conditions))\n\t\t\t\t.orderBy(desc(similarity))\n\t\t\t\t.limit(params.count ?? 10);\n\n\t\t\treturn results.map((row) => ({\n\t\t\t\tid: row.memory.id as UUID,\n\t\t\t\ttype: row.memory.type,\n\t\t\t\tcreatedAt: row.memory.createdAt,\n\t\t\t\tcontent:\n\t\t\t\t\ttypeof row.memory.content === \"string\"\n\t\t\t\t\t\t? JSON.parse(row.memory.content)\n\t\t\t\t\t\t: row.memory.content,\n\t\t\t\tentityId: row.memory.entityId as UUID,\n\t\t\t\tagentId: row.memory.agentId as UUID,\n\t\t\t\troomId: row.memory.roomId as UUID,\n\t\t\t\tunique: row.memory.unique,\n\t\t\t\tembedding: row.embedding ?? undefined,\n\t\t\t\tsimilarity: row.similarity,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync createMemory(\n\t\tmemory: Memory & { metadata?: MemoryMetadata },\n\t\ttableName: string,\n\t): Promise<UUID> {\n\t\tconsole.log(\"memory.id is\", memory.id)\n\t\tlogger.debug(\"DrizzleAdapter createMemory:\", {\n\t\t\tmemoryId: memory.id,\n\t\t\tembeddingLength: memory.embedding?.length,\n\t\t\tcontentLength: memory.content?.text?.length,\n\t\t});\n\n\t\tlet isUnique = true;\n\t\tif (memory.embedding && Array.isArray(memory.embedding)) {\n\t\t\tconst similarMemories = await this.searchMemoriesByEmbedding(\n\t\t\t\tmemory.embedding,\n\t\t\t\t{\n\t\t\t\t\ttableName,\n\t\t\t\t\troomId: memory.roomId,\n\t\t\t\t\tmatch_threshold: 0.95,\n\t\t\t\t\tcount: 1,\n\t\t\t\t},\n\t\t\t);\n\t\t\tisUnique = similarMemories.length === 0;\n\t\t}\n\n\t\tconst contentToInsert =\n\t\t\ttypeof memory.content === \"string\"\n\t\t\t\t? JSON.parse(memory.content)\n\t\t\t\t: memory.content;\n\n\t\tconst memoryId = memory.id ?? (v4() as UUID);\n\n\t\tawait this.db.transaction(async (tx) => {\n\t\t\tawait tx.insert(memoryTable).values([\n\t\t\t\t{\n\t\t\t\t\tid: memoryId,\n\t\t\t\t\ttype: tableName,\n\t\t\t\t\tcontent: sql`${contentToInsert}::jsonb`,\n\t\t\t\t\tmetadata: sql`${memory.metadata || {}}::jsonb`,\n\t\t\t\t\tentityId: memory.entityId,\n\t\t\t\t\troomId: memory.roomId,\n\t\t\t\t\tagentId: memory.agentId,\n\t\t\t\t\tunique: memory.unique ?? isUnique,\n\t\t\t\t\tcreatedAt: memory.createdAt,\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tif (memory.embedding && Array.isArray(memory.embedding)) {\n\t\t\t\tconst embeddingValues: Record<string, unknown> = {\n\t\t\t\t\tid: v4(),\n\t\t\t\t\tmemoryId: memoryId,\n\t\t\t\t\tcreatedAt: memory.createdAt,\n\t\t\t\t};\n\n\t\t\t\tconst cleanVector = memory.embedding.map((n) =>\n\t\t\t\t\tNumber.isFinite(n) ? Number(n.toFixed(6)) : 0,\n\t\t\t\t);\n\n\t\t\t\tembeddingValues[this.embeddingDimension] = cleanVector;\n\n\t\t\t\tawait tx.insert(embeddingTable).values([embeddingValues]);\n\t\t\t}\n\t\t});\n\n\t\treturn memoryId;\n\t}\n\n\tasync deleteMemory(memoryId: UUID): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tawait tx\n\t\t\t\t\t.delete(embeddingTable)\n\t\t\t\t\t.where(eq(embeddingTable.memoryId, memoryId));\n\n\t\t\t\tawait tx\n\t\t\t\t\t.delete(memoryTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(memoryTable.id, memoryId)),\n\t\t\t\t\t);\n\t\t\t});\n\n\t\t\tlogger.debug(\"Memory removed successfully:\", {\n\t\t\t\tmemoryId\n\t\t\t});\n\t\t});\n\t}\n\n\tasync deleteAllMemories(roomId: UUID, tableName: string): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tconst memoryIds = await tx\n\t\t\t\t\t.select({ id: memoryTable.id })\n\t\t\t\t\t.from(memoryTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\teq(memoryTable.roomId, roomId),\n\t\t\t\t\t\t\teq(memoryTable.type, tableName),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\tif (memoryIds.length > 0) {\n\t\t\t\t\tawait tx.delete(embeddingTable).where(\n\t\t\t\t\t\tinArray(\n\t\t\t\t\t\t\tembeddingTable.memoryId,\n\t\t\t\t\t\t\tmemoryIds.map((m) => m.id),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.delete(memoryTable)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(memoryTable.roomId, roomId),\n\t\t\t\t\t\t\t\teq(memoryTable.type, tableName),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlogger.debug(\"All memories removed successfully:\", {\n\t\t\t\troomId,\n\t\t\t\ttableName,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync countMemories(\n\t\troomId: UUID,\n\t\tunique = true,\n\t\ttableName = \"\",\n\t): Promise<number> {\n\t\tif (!tableName) throw new Error(\"tableName is required\");\n\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst conditions = [\n\t\t\t\teq(memoryTable.roomId, roomId),\n\t\t\t\teq(memoryTable.type, tableName),\n\t\t\t];\n\n\t\t\tif (unique) {\n\t\t\t\tconditions.push(eq(memoryTable.unique, true));\n\t\t\t}\n\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ count: sql<number>`count(*)` })\n\t\t\t\t.from(memoryTable)\n\t\t\t\t.where(and(...conditions));\n\n\t\t\treturn Number(result[0]?.count ?? 0);\n\t\t});\n\t}\n\n\tasync getRoom(roomId: UUID): Promise<Room | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: roomTable.id,\n\t\t\t\t\tchannelId: roomTable.channelId,\n\t\t\t\t\tagentId: roomTable.agentId,\n\t\t\t\t\tserverId: roomTable.serverId,\n\t\t\t\t\tworldId: roomTable.worldId,\n\t\t\t\t\ttype: roomTable.type,\n\t\t\t\t\tsource: roomTable.source,\n\t\t\t\t})\n\t\t\t\t.from(roomTable)\n\t\t\t\t.where(\n\t\t\t\t\tand(eq(roomTable.id, roomId), eq(roomTable.agentId, this.agentId)),\n\t\t\t\t)\n\t\t\t\t.limit(1);\n\t\t\tif (result.length === 0) return null;\n\t\t\treturn result[0];\n\t\t});\n\t}\n\n\tasync getRooms(worldId: UUID): Promise<Room[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(roomTable)\n\t\t\t\t.where(eq(roomTable.worldId, worldId));\n\t\t\treturn result;\n\t\t});\n\t}\n\n\tasync updateRoom(room: Room): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(roomTable)\n\t\t\t\t.set({ ...room, agentId: this.agentId })\n\t\t\t\t.where(eq(roomTable.id, room.id));\n\t\t});\n\t}\n\n\tasync createRoom({\n\t\tid,\n\t\tname,\n\t\tsource,\n\t\ttype,\n\t\tchannelId,\n\t\tserverId,\n\t\tworldId,\n\t}: Room): Promise<UUID> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst newRoomId = id || v4();\n\t\t\tawait this.db\n\t\t\t\t.insert(roomTable)\n\t\t\t\t.values({\n\t\t\t\t\tid: newRoomId,\n\t\t\t\t\tname,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t\tsource,\n\t\t\t\t\ttype,\n\t\t\t\t\tchannelId,\n\t\t\t\t\tserverId,\n\t\t\t\t\tworldId,\n\t\t\t\t})\n\t\t\t\t.onConflictDoNothing({ target: roomTable.id });\n\t\t\treturn newRoomId as UUID;\n\t\t});\n\t}\n\n\tasync deleteRoom(roomId: UUID): Promise<void> {\n\t\tif (!roomId) throw new Error(\"Room ID is required\");\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\tawait tx.delete(roomTable).where(eq(roomTable.id, roomId));\n\t\t\t});\n\t\t});\n\t}\n\n\tasync getRoomsForParticipant(entityId: UUID): Promise<UUID[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ roomId: participantTable.roomId })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.innerJoin(roomTable, eq(participantTable.roomId, roomTable.id))\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\teq(roomTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\treturn result.map((row) => row.roomId as UUID);\n\t\t});\n\t}\n\n\tasync getRoomsForParticipants(entityIds: UUID[]): Promise<UUID[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.selectDistinct({ roomId: participantTable.roomId })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.innerJoin(roomTable, eq(participantTable.roomId, roomTable.id))\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\tinArray(participantTable.entityId, entityIds),\n\t\t\t\t\t\teq(roomTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\treturn result.map((row) => row.roomId as UUID);\n\t\t});\n\t}\n\n\tasync addParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db\n\t\t\t\t\t.insert(participantTable)\n\t\t\t\t\t.values({\n\t\t\t\t\t\tentityId,\n\t\t\t\t\t\troomId,\n\t\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t\t})\n\t\t\t\t\t.onConflictDoNothing();\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error adding participant\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tentityId,\n\t\t\t\t\troomId,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync removeParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db.transaction(async (tx) => {\n\t\t\t\t\treturn await tx\n\t\t\t\t\t\t.delete(participantTable)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.returning();\n\t\t\t\t});\n\n\t\t\t\tconst removed = result.length > 0;\n\t\t\t\tlogger.debug(`Participant ${removed ? \"removed\" : \"not found\"}:`, {\n\t\t\t\t\tentityId,\n\t\t\t\t\troomId,\n\t\t\t\t\tremoved,\n\t\t\t\t});\n\n\t\t\t\treturn removed;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Failed to remove participant:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tentityId,\n\t\t\t\t\troomId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getParticipantsForEntity(entityId: UUID): Promise<Participant[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({\n\t\t\t\t\tid: participantTable.id,\n\t\t\t\t\tentityId: participantTable.entityId,\n\t\t\t\t\troomId: participantTable.roomId,\n\t\t\t\t})\n\t\t\t\t.from(participantTable)\n\t\t\t\t.where(eq(participantTable.entityId, entityId));\n\n\t\t\tconst entity = await this.getEntityById(entityId);\n\n\t\t\tif (!entity) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn result.map((row) => ({\n\t\t\t\tid: row.id as UUID,\n\t\t\t\tentity: entity,\n\t\t\t}));\n\t\t});\n\t}\n\n\tasync getParticipantsForRoom(roomId: UUID): Promise<UUID[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ entityId: participantTable.entityId })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\teq(participantTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\treturn result.map((row) => row.entityId as UUID);\n\t\t});\n\t}\n\n\tasync getParticipantUserState(\n\t\troomId: UUID,\n\t\tentityId: UUID,\n\t): Promise<\"FOLLOWED\" | \"MUTED\" | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select({ roomState: participantTable.roomState })\n\t\t\t\t.from(participantTable)\n\t\t\t\t.where(\n\t\t\t\t\tand(\n\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\teq(participantTable.agentId, this.agentId),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.limit(1);\n\n\t\t\treturn (result[0]?.roomState as \"FOLLOWED\" | \"MUTED\" | null) ?? null;\n\t\t});\n\t}\n\n\tasync setParticipantUserState(\n\t\troomId: UUID,\n\t\tentityId: UUID,\n\t\tstate: \"FOLLOWED\" | \"MUTED\" | null,\n\t): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.update(participantTable)\n\t\t\t\t\t\t.set({ roomState: state })\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(participantTable.roomId, roomId),\n\t\t\t\t\t\t\t\teq(participantTable.entityId, entityId),\n\t\t\t\t\t\t\t\teq(participantTable.agentId, this.agentId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Failed to set participant user state:\", {\n\t\t\t\t\troomId,\n\t\t\t\t\tentityId,\n\t\t\t\t\tstate,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync createRelationship(params: {\n\t\tsourceEntityId: UUID;\n\t\ttargetEntityId: UUID;\n\t\ttags?: string[];\n\t\tmetadata?: { [key: string]: unknown };\n\t}): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst id = v4();\n\t\t\tconst saveParams = {\n\t\t\t\tid,\n\t\t\t\tsourceEntityId: params.sourceEntityId,\n\t\t\t\ttargetEntityId: params.targetEntityId,\n\t\t\t\tagentId: this.agentId,\n\t\t\t\ttags: params.tags || [],\n\t\t\t\tmetadata: params.metadata || {},\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tawait this.db.insert(relationshipTable).values(saveParams);\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error creating relationship:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tsaveParams,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync updateRelationship(relationship: Relationship): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db\n\t\t\t\t\t.update(relationshipTable)\n\t\t\t\t\t.set({\n\t\t\t\t\t\ttags: relationship.tags || [],\n\t\t\t\t\t\tmetadata: relationship.metadata || {},\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(relationshipTable.id, relationship.id));\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error updating relationship:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\trelationship,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getRelationship(params: {\n\t\tsourceEntityId: UUID;\n\t\ttargetEntityId: UUID;\n\t}): Promise<Relationship | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(relationshipTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\teq(relationshipTable.sourceEntityId, params.sourceEntityId),\n\t\t\t\t\t\t\teq(relationshipTable.targetEntityId, params.targetEntityId),\n\t\t\t\t\t\t\teq(relationshipTable.agentId, this.agentId),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t.limit(1);\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tid: result[0].id,\n\t\t\t\t\tsourceEntityId: result[0].sourceEntityId,\n\t\t\t\t\ttargetEntityId: result[0].targetEntityId,\n\t\t\t\t\tagentId: result[0].agentId,\n\t\t\t\t\ttags: result[0].tags || [],\n\t\t\t\t\tmetadata: result[0].metadata || {},\n\t\t\t\t\tcreatedAt: result[0].createdAt?.toString(),\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error getting relationship:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t\treturn null;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getRelationships(params: {\n\t\tentityId: UUID;\n\t\ttags?: string[];\n\t}): Promise<Relationship[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tlet query = this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(relationshipTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(\n\t\t\t\t\t\t\tor(\n\t\t\t\t\t\t\t\teq(relationshipTable.sourceEntityId, params.entityId),\n\t\t\t\t\t\t\t\teq(relationshipTable.targetEntityId, params.entityId),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\teq(relationshipTable.agentId, this.agentId),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t// Filter by tags if provided\n\t\t\t\tif (params.tags && params.tags.length > 0) {\n\t\t\t\t\t// Filter by tags - find tasks that have ALL of the specified tags\n\t\t\t\t\t// Using @> operator which checks if left array contains all elements from right array\n\t\t\t\t\tconst tagParams = params.tags\n\t\t\t\t\t\t.map((tag) => `'${tag.replace(/'/g, \"''\")}'`)\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\tquery = query.where(\n\t\t\t\t\t\tsql`${relationshipTable.tags} @> ARRAY[${sql.raw(\n\t\t\t\t\t\t\ttagParams,\n\t\t\t\t\t\t)}]::text[]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst results = await query;\n\n\t\t\t\treturn results.map((result) => ({\n\t\t\t\t\tid: result.id,\n\t\t\t\t\tsourceEntityId: result.sourceEntityId,\n\t\t\t\t\ttargetEntityId: result.targetEntityId,\n\t\t\t\t\tagentId: result.agentId,\n\t\t\t\t\ttags: result.tags || [],\n\t\t\t\t\tmetadata: result.metadata || {},\n\t\t\t\t\tcreatedAt: result.createdAt?.toString(),\n\t\t\t\t}));\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error getting relationships:\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t\treturn [];\n\t\t\t}\n\t\t});\n\t}\n\n\tasync getCache<T>(key: string): Promise<T | undefined> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(cacheTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(cacheTable.agentId, this.agentId), eq(cacheTable.key, key)),\n\t\t\t\t\t);\n\n\t\t\t\treturn result[0]?.value as T | undefined;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error fetching cache\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tkey: key,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync setCache<T>(key: string, value: T): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.insert(cacheTable)\n\t\t\t\t\t\t.values({\n\t\t\t\t\t\t\tkey: key,\n\t\t\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\t\t\ttarget: [cacheTable.key, cacheTable.agentId],\n\t\t\t\t\t\t\tset: {\n\t\t\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error setting cache\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tkey: key,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync deleteCache(key: string): Promise<boolean> {\n\t\treturn this.withDatabase(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.db.transaction(async (tx) => {\n\t\t\t\t\tawait tx\n\t\t\t\t\t\t.delete(cacheTable)\n\t\t\t\t\t\t.where(\n\t\t\t\t\t\t\tand(\n\t\t\t\t\t\t\t\teq(cacheTable.agentId, this.agentId),\n\t\t\t\t\t\t\t\teq(cacheTable.key, key),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Error deleting cache\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tkey: key,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync createWorld(world: World): Promise<UUID> {\n\t\tconsole.trace(\"*** creating world\", world, \"with id\", world.id);\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst newWorldId = world.id || v4();\n\t\t\tawait this.db.insert(worldTable).values({\n\t\t\t\t...world,\n\t\t\t\tid: newWorldId,\n\t\t\t});\n\t\t\treturn newWorldId;\n\t\t});\n\t}\n\n\tasync getWorld(id: UUID): Promise<World | null> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(worldTable)\n\t\t\t\t.where(eq(worldTable.id, id));\n\t\t\treturn result[0] as World | null;\n\t\t});\n\t}\n\n\tasync getAllWorlds(): Promise<World[]> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tconst result = await this.db\n\t\t\t\t.select()\n\t\t\t\t.from(worldTable)\n\t\t\t\t.where(eq(worldTable.agentId, this.agentId));\n\t\t\treturn result as World[];\n\t\t});\n\t}\n\n\tasync updateWorld(world: World): Promise<void> {\n\t\tconsole.trace(\"*** updating world\", world, \"with id\", world.id);\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db\n\t\t\t\t.update(worldTable)\n\t\t\t\t.set(world)\n\t\t\t\t.where(eq(worldTable.id, world.id));\n\t\t});\n\t}\n\n\tasync removeWorld(id: UUID): Promise<void> {\n\t\treturn this.withDatabase(async () => {\n\t\t\tawait this.db.delete(worldTable).where(eq(worldTable.id, id));\n\t\t});\n\t}\n\n\t/**\n\t * Creates a new task in the database.\n\t * @param task The task object to create\n\t * @returns Promise resolving to the UUID of the created task\n\t */\n\tasync createTask(task: Task): Promise<UUID> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tconst now = new Date();\n\t\t\t\tconst metadata = task.metadata || {};\n\n\t\t\t\tconst values = {\n\t\t\t\t\tid: task.id as UUID,\n\t\t\t\t\tname: task.name,\n\t\t\t\t\tdescription: task.description,\n\t\t\t\t\troomId: task.roomId,\n\t\t\t\t\tworldId: task.worldId,\n\t\t\t\t\ttags: task.tags,\n\t\t\t\t\tmetadata: metadata,\n\t\t\t\t\tcreatedAt: now,\n\t\t\t\t\tupdatedAt: now,\n\t\t\t\t\tagentId: this.agentId,\n\t\t\t\t};\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.insert(taskTable)\n\t\t\t\t\t.values(values)\n\t\t\t\t\t.returning({ id: taskTable.id });\n\n\t\t\t\treturn result[0].id;\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves tasks based on specified parameters.\n\t * @param params Object containing optional roomId and tags to filter tasks\n\t * @returns Promise resolving to an array of Task objects\n\t */\n\tasync getTasks(params: { roomId?: UUID; tags?: string[] }): Promise<Task[]> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tlet query = this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(taskTable)\n\t\t\t\t\t.where(eq(taskTable.agentId, this.agentId));\n\n\t\t\t\t// Apply filters if provided\n\t\t\t\tif (params.roomId) {\n\t\t\t\t\tquery = query.where(eq(taskTable.roomId, params.roomId));\n\t\t\t\t}\n\n\t\t\t\tif (params.tags && params.tags.length > 0) {\n\t\t\t\t\t// Filter by tags - find tasks that have ALL of the specified tags\n\t\t\t\t\t// Using @> operator which checks if left array contains all elements from right array\n\t\t\t\t\tconst tagParams = params.tags\n\t\t\t\t\t\t.map((tag) => `'${tag.replace(/'/g, \"''\")}'`)\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\tquery = query.where(\n\t\t\t\t\t\tsql`${taskTable.tags} @> ARRAY[${sql.raw(tagParams)}]::text[]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst result = await query;\n\n\t\t\t\treturn result.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tdescription: row.description,\n\t\t\t\t\troomId: row.roomId,\n\t\t\t\t\tworldId: row.worldId,\n\t\t\t\t\ttags: row.tags,\n\t\t\t\t\tmetadata: row.metadata,\n\t\t\t\t}));\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves a specific task by its name.\n\t * @param name The name of the task to retrieve\n\t * @returns Promise resolving to the Task object if found, null otherwise\n\t */\n\tasync getTasksByName(name: string): Promise<Task[]> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(taskTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(taskTable.name, name), eq(taskTable.agentId, this.agentId)),\n\t\t\t\t\t);\n\n\t\t\t\treturn result.map((row) => ({\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tdescription: row.description,\n\t\t\t\t\troomId: row.roomId,\n\t\t\t\t\tworldId: row.worldId,\n\t\t\t\t\ttags: row.tags || [],\n\t\t\t\t\tmetadata: row.metadata || {},\n\t\t\t\t}));\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves a specific task by its ID.\n\t * @param id The UUID of the task to retrieve\n\t * @returns Promise resolving to the Task object if found, null otherwise\n\t */\n\tasync getTask(id: UUID): Promise<Task | null> {\n\t\treturn this.withRetry(async () => {\n\t\t\treturn this.withDatabase(async () => {\n\t\t\t\tconst result = await this.db\n\t\t\t\t\t.select()\n\t\t\t\t\t.from(taskTable)\n\t\t\t\t\t.where(and(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)))\n\t\t\t\t\t.limit(1);\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst row = result[0];\n\t\t\t\treturn {\n\t\t\t\t\tid: row.id,\n\t\t\t\t\tname: row.name,\n\t\t\t\t\tdescription: row.description,\n\t\t\t\t\troomId: row.roomId,\n\t\t\t\t\tworldId: row.worldId,\n\t\t\t\t\ttags: row.tags || [],\n\t\t\t\t\tmetadata: row.metadata || {},\n\t\t\t\t};\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Updates an existing task in the database.\n\t * @param id The UUID of the task to update\n\t * @param task Partial Task object containing the fields to update\n\t * @returns Promise resolving when the update is complete\n\t */\n\tasync updateTask(id: UUID, task: Partial<Task>): Promise<void> {\n\t\tawait this.withRetry(async () => {\n\t\t\tawait this.withDatabase(async () => {\n\t\t\t\tconst updateValues: Partial<Task> = {};\n\n\t\t\t\t// Add fields to update if they exist in the partial task object\n\t\t\t\tif (task.name !== undefined) updateValues.name = task.name;\n\t\t\t\tif (task.description !== undefined)\n\t\t\t\t\tupdateValues.description = task.description;\n\t\t\t\tif (task.roomId !== undefined) updateValues.roomId = task.roomId;\n\t\t\t\tif (task.worldId !== undefined) updateValues.worldId = task.worldId;\n\t\t\t\tif (task.tags !== undefined) updateValues.tags = task.tags;\n\n\t\t\t\ttask.updatedAt = Date.now();\n\n\t\t\t\t// Handle metadata updates\n\t\t\t\tif (task.metadata) {\n\t\t\t\t\t// Get current task to merge metadata\n\t\t\t\t\tconst currentTask = await this.getTask(id);\n\t\t\t\t\tif (currentTask) {\n\t\t\t\t\t\tconst currentMetadata = currentTask.metadata || {};\n\t\t\t\t\t\tconst newMetadata = {\n\t\t\t\t\t\t\t...currentMetadata,\n\t\t\t\t\t\t\t...task.metadata,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tupdateValues.metadata = newMetadata;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tupdateValues.metadata = {\n\t\t\t\t\t\t\t...task.metadata,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tawait this.db\n\t\t\t\t\t.update(taskTable)\n\t\t\t\t\t.set(updateValues)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)),\n\t\t\t\t\t);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Deletes a task from the database.\n\t * @param id The UUID of the task to delete\n\t * @returns Promise resolving when the deletion is complete\n\t */\n\tasync deleteTask(id: UUID): Promise<void> {\n\t\tawait this.withRetry(async () => {\n\t\t\tawait this.withDatabase(async () => {\n\t\t\t\tawait this.db\n\t\t\t\t\t.delete(taskTable)\n\t\t\t\t\t.where(\n\t\t\t\t\t\tand(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)),\n\t\t\t\t\t);\n\t\t\t});\n\t\t});\n\t}\n}\n","import { sql } from \"drizzle-orm\";\nimport {\n\tcheck,\n\tforeignKey,\n\tindex,\n\tpgTable,\n\tuuid,\n\tvector,\n} from \"drizzle-orm/pg-core\";\nimport { memoryTable } from \"./memory\";\nimport { numberTimestamp } from \"./types\";\n\nexport const VECTOR_DIMS = {\n\tSMALL: 384,\n\tMEDIUM: 512,\n\tLARGE: 768,\n\tXL: 1024,\n\tXXL: 1536,\n\tXXXL: 3072,\n} as const;\n\nexport const DIMENSION_MAP = {\n\t[VECTOR_DIMS.SMALL]: \"dim384\",\n\t[VECTOR_DIMS.MEDIUM]: \"dim512\",\n\t[VECTOR_DIMS.LARGE]: \"dim768\",\n\t[VECTOR_DIMS.XL]: \"dim1024\",\n\t[VECTOR_DIMS.XXL]: \"dim1536\",\n\t[VECTOR_DIMS.XXXL]: \"dim3072\",\n} as const;\n\n/**\n * Definition of the embeddings table in the database.\n * Contains columns for ID, Memory ID, Creation Timestamp, and multiple vector dimensions.\n */\nexport const embeddingTable = pgTable(\n\t\"embeddings\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().defaultRandom().notNull(),\n\t\tmemoryId: uuid(\"memory_id\").references(() => memoryTable.id),\n\t\tcreatedAt: numberTimestamp(\"created_at\").default(sql`now()`).notNull(),\n\t\tdim384: vector(\"dim_384\", { dimensions: VECTOR_DIMS.SMALL }),\n\t\tdim512: vector(\"dim_512\", { dimensions: VECTOR_DIMS.MEDIUM }),\n\t\tdim768: vector(\"dim_768\", { dimensions: VECTOR_DIMS.LARGE }),\n\t\tdim1024: vector(\"dim_1024\", { dimensions: VECTOR_DIMS.XL }),\n\t\tdim1536: vector(\"dim_1536\", { dimensions: VECTOR_DIMS.XXL }),\n\t\tdim3072: vector(\"dim_3072\", { dimensions: VECTOR_DIMS.XXXL }),\n\t},\n\t(table) => [\n\t\tcheck(\"embedding_source_check\", sql`\"memory_id\" IS NOT NULL`),\n\t\tindex(\"idx_embedding_memory\").on(table.memoryId),\n\t\tforeignKey({\n\t\t\tname: \"fk_embedding_memory\",\n\t\t\tcolumns: [table.memoryId],\n\t\t\tforeignColumns: [memoryTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n\n/**\n * Defines the possible values for the Embedding Dimension Column.\n * It can be \"dim384\", \"dim512\", \"dim768\", \"dim1024\", \"dim1536\", or \"dim3072\".\n */\nexport type EmbeddingDimensionColumn =\n\t| \"dim384\"\n\t| \"dim512\"\n\t| \"dim768\"\n\t| \"dim1024\"\n\t| \"dim1536\"\n\t| \"dim3072\";\n\n/**\n * Retrieve the type of a specific column in the EmbeddingTable based on the EmbeddingDimensionColumn key.\n */\nexport type EmbeddingTableColumn =\n\t(typeof embeddingTable._.columns)[EmbeddingDimensionColumn];\n","import { relations, sql } from \"drizzle-orm\";\nimport {\n\tboolean,\n\tcheck,\n\tforeignKey,\n\tindex,\n\tjsonb,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n\tvector,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { embeddingTable } from \"./embedding\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Definition of the memory table in the database.\n *\n * @param {string} tableName - The name of the table.\n * @param {object} columns - An object containing the column definitions.\n * @param {function} indexes - A function that defines the indexes for the table.\n * @returns {object} - The memory table object.\n */\nexport const memoryTable = pgTable(\n\t\"memories\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().notNull(),\n\t\ttype: text(\"type\").notNull(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tcontent: jsonb(\"content\").notNull(),\n\t\tentityId: uuid(\"entityId\").references(() => entityTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tagentId: uuid(\"agentId\").references(() => agentTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\troomId: uuid(\"roomId\").references(() => roomTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tunique: boolean(\"unique\").default(true).notNull(),\n\t\tmetadata: jsonb(\"metadata\").default({}).notNull(),\n\t},\n\t(table) => [\n\t\tindex(\"idx_memories_type_room\").on(table.type, table.roomId),\n\t\tforeignKey({\n\t\t\tname: \"fk_room\",\n\t\t\tcolumns: [table.roomId],\n\t\t\tforeignColumns: [roomTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user\",\n\t\t\tcolumns: [table.entityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_agent\",\n\t\t\tcolumns: [table.agentId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tindex(\"idx_memories_metadata_type\").on(sql`((metadata->>'type'))`),\n\t\tindex(\"idx_memories_document_id\").on(sql`((metadata->>'documentId'))`),\n\t\tindex(\"idx_fragments_order\").on(\n\t\t\tsql`((metadata->>'documentId'))`,\n\t\t\tsql`((metadata->>'position'))`,\n\t\t),\n\t\tcheck(\n\t\t\t\"fragment_metadata_check\",\n\t\t\tsql`\n CASE \n WHEN metadata->>'type' = 'fragment' THEN\n metadata ? 'documentId' AND \n metadata ? 'position'\n ELSE true\n END\n `,\n\t\t),\n\t\tcheck(\n\t\t\t\"document_metadata_check\",\n\t\t\tsql`\n CASE \n WHEN metadata->>'type' = 'document' THEN\n metadata ? 'timestamp'\n ELSE true\n END\n `,\n\t\t),\n\t],\n);\n\nexport const memoryRelations = relations(memoryTable, ({ one }) => ({\n\tembedding: one(embeddingTable),\n}));\n","import type { MessageExample } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport {\n\tboolean,\n\tjsonb,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n} from \"drizzle-orm/pg-core\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents a table for storing agent data.\n *\n * @type {Table}\n */\nexport const agentTable = pgTable(\n\t\"agents\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\n\t\tupdatedAt: numberTimestamp(\"updatedAt\").default(sql`now()`).notNull(),\n\n\t\t// Character\n\t\tname: text(\"name\"),\n\t\tusername: text(\"username\"),\n\t\tsystem: text(\"system\"),\n\t\tbio: jsonb(\"bio\").$type<string | string[]>().notNull(),\n\t\tmessageExamples: jsonb(\"message_examples\")\n\t\t\t.$type<MessageExample[][]>()\n\t\t\t.default(sql`'[]'::jsonb`),\n\t\tpostExamples: jsonb(\"post_examples\")\n\t\t\t.$type<string[]>()\n\t\t\t.default(sql`'[]'::jsonb`),\n\t\ttopics: jsonb(\"topics\").$type<string[]>().default(sql`'[]'::jsonb`),\n\t\tadjectives: jsonb(\"adjectives\").$type<string[]>().default(sql`'[]'::jsonb`),\n\t\tknowledge: jsonb(\"knowledge\")\n\t\t\t.$type<(string | { path: string; shared?: boolean })[]>()\n\t\t\t.default(sql`'[]'::jsonb`),\n\t\tplugins: jsonb(\"plugins\").$type<string[]>().default(sql`'[]'::jsonb`),\n\t\tsettings: jsonb(\"settings\")\n\t\t\t.$type<{\n\t\t\t\tsecrets?: { [key: string]: string | boolean | number };\n\t\t\t\t[key: string]: unknown;\n\t\t\t}>()\n\t\t\t.default(sql`'{}'::jsonb`),\n\t\tstyle: jsonb(\"style\")\n\t\t\t.$type<{\n\t\t\t\tall?: string[];\n\t\t\t\tchat?: string[];\n\t\t\t\tpost?: string[];\n\t\t\t}>()\n\t\t\t.default(sql`'{}'::jsonb`),\n\t},\n\t(table) => {\n\t\treturn {\n\t\t\tnameUnique: unique(\"name_unique\").on(table.name),\n\t\t};\n\t},\n);\n","import { customType } from \"drizzle-orm/pg-core\";\n\nexport const stringJsonb = customType<{ data: string; driverData: string }>({\n\tdataType() {\n\t\treturn \"jsonb\";\n\t},\n\ttoDriver(value: string): string {\n\t\treturn JSON.stringify(value);\n\t},\n\tfromDriver(value: string): string {\n\t\treturn JSON.stringify(value);\n\t},\n});\n\n/**\n * Represents a custom type for converting a number to a timestamp string and vice versa.\n * @param {Object} options - The options for the custom type.\n * @param {Function} options.dataType - A function that returns the data type as \"timestamptz\".\n * @param {Function} options.toDriver - A function that converts a number to a timestamp string using the Date object's toISOString method.\n * @param {Function} options.fromDriver - A function that converts a timestamp string to a number using the Date object's getTime method.\n * @returns {Object} - The custom type for number to timestamp conversion.\n */\nexport const numberTimestamp = customType<{ data: number; driverData: string }>(\n\t{\n\t\tdataType() {\n\t\t\treturn \"timestamptz\";\n\t\t},\n\t\ttoDriver(value: number): string {\n\t\t\treturn new Date(value).toISOString();\n\t\t},\n\t\tfromDriver(value: string): number {\n\t\t\treturn new Date(value).getTime();\n\t\t},\n\t},\n);\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, unique, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents an entity table in the database.\n * Includes columns for id, agentId, createdAt, names, and metadata.\n */\nexport const entityTable = pgTable(\n\t\"entities\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey(),\n\t\tagentId: uuid(\"agentId\")\n\t\t\t.notNull()\n\t\t\t.references(() => agentTable.id, {\n\t\t\t\tonDelete: \"cascade\",\n\t\t\t}),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tnames: text(\"names\").array().default(sql`'{}'::text[]`),\n\t\tmetadata: jsonb(\"metadata\").default(sql`'{}'::jsonb`),\n\t},\n\t(table) => {\n\t\treturn {\n\t\t\tidAgentIdUnique: unique(\"id_agent_id_unique\").on(table.id, table.agentId),\n\t\t};\n\t},\n);\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\nimport { worldTable } from \"./worldTable\";\n\n/**\n * Defines a table schema for 'rooms' in the database.\n *\n * @typedef {object} RoomTable\n * @property {string} id - The unique identifier for the room.\n * @property {string} agentId - The UUID of the agent associated with the room.\n * @property {string} source - The source of the room.\n * @property {string} type - The type of the room.\n * @property {string} serverId - The server ID of the room.\n * @property {string} worldId - The UUID of the world associated with the room.\n * @property {string} name - The name of the room.\n * @property {object} metadata - Additional metadata for the room in JSON format.\n * @property {string} channelId - The channel ID of the room.\n * @property {number} createdAt - The timestamp of when the room was created.\n */\nexport const roomTable = pgTable(\"rooms\", {\n\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\tagentId: uuid(\"agentId\").references(() => agentTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tsource: text(\"source\").notNull(),\n\ttype: text(\"type\").notNull(),\n\tserverId: text(\"serverId\"),\n\tworldId: uuid(\"worldId\").references(() => worldTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tname: text(\"name\"),\n\tmetadata: jsonb(\"metadata\"),\n\tchannelId: text(\"channelId\"),\n\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n});\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\n\nexport const worldTable = pgTable(\"worlds\", {\n\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\tagentId: uuid(\"agentId\")\n\t\t.notNull()\n\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\tname: text(\"name\").notNull(),\n\tmetadata: jsonb(\"metadata\"),\n\tserverId: text(\"serverId\").notNull(),\n\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n});\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, unique, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents a PostgreSQL table for caching data.\n *\n * @type {pgTable}\n */\nexport const cacheTable = pgTable(\n\t\"cache\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\t\tkey: text(\"key\").notNull(),\n\t\tagentId: uuid(\"agentId\")\n\t\t\t.notNull()\n\t\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\t\tvalue: jsonb(\"value\").notNull(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\texpiresAt: numberTimestamp(\"expiresAt\"),\n\t},\n\t(table) => [unique(\"cache_key_agent_unique\").on(table.key, table.agentId)],\n);\n","import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\nimport { worldTable } from \"./worldTable\";\n\n/**\n * Definition of a table representing components in the database.\n *\n * @type {Table}\n */\nexport const componentTable = pgTable(\"components\", {\n\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\tentityId: uuid(\"entityId\")\n\t\t.notNull()\n\t\t.references(() => entityTable.id, { onDelete: \"cascade\" }),\n\tagentId: uuid(\"agentId\")\n\t\t.notNull()\n\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\troomId: uuid(\"roomId\")\n\t\t.notNull()\n\t\t.references(() => roomTable.id, { onDelete: \"cascade\" }),\n\tworldId: uuid(\"worldId\").references(() => worldTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tsourceEntityId: uuid(\"sourceEntityId\").references(() => entityTable.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\ttype: text(\"type\").notNull(),\n\tdata: jsonb(\"data\").default(sql`'{}'::jsonb`),\n\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n});\n","import { sql } from \"drizzle-orm\";\nimport { foreignKey, jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Represents a PostgreSQL table for storing logs.\n *\n * @type {Table}\n */\n\nexport const logTable = pgTable(\n\t\"logs\",\n\t{\n\t\tid: uuid(\"id\").defaultRandom().notNull(),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tentityId: uuid(\"entityId\")\n\t\t\t.notNull()\n\t\t\t.references(() => entityTable.id),\n\t\tbody: jsonb(\"body\").notNull(),\n\t\ttype: text(\"type\").notNull(),\n\t\troomId: uuid(\"roomId\")\n\t\t\t.notNull()\n\t\t\t.references(() => roomTable.id),\n\t},\n\t(table) => [\n\t\tforeignKey({\n\t\t\tname: \"fk_room\",\n\t\t\tcolumns: [table.roomId],\n\t\t\tforeignColumns: [roomTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user\",\n\t\t\tcolumns: [table.entityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n","import { sql } from \"drizzle-orm\";\nimport {\n\tforeignKey,\n\tindex,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Defines the schema for the \"participants\" table in the database.\n *\n * @type {import('knex').TableBuilder}\n */\nexport const participantTable = pgTable(\n\t\"participants\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tentityId: uuid(\"entityId\").references(() => entityTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\troomId: uuid(\"roomId\").references(() => roomTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tagentId: uuid(\"agentId\").references(() => agentTable.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\troomState: text(\"roomState\"),\n\t},\n\t(table) => [\n\t\t// unique(\"participants_user_room_agent_unique\").on(table.entityId, table.roomId, table.agentId),\n\t\tindex(\"idx_participants_user\").on(table.entityId),\n\t\tindex(\"idx_participants_room\").on(table.roomId),\n\t\tforeignKey({\n\t\t\tname: \"fk_room\",\n\t\t\tcolumns: [table.roomId],\n\t\t\tforeignColumns: [roomTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user\",\n\t\t\tcolumns: [table.entityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n","import { sql } from \"drizzle-orm\";\nimport {\n\tforeignKey,\n\tindex,\n\tjsonb,\n\tpgTable,\n\ttext,\n\tunique,\n\tuuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { numberTimestamp } from \"./types\";\n\n/**\n * Defines the relationshipTable containing information about relationships between entities and agents.\n * @type {import('knex').TableBuilder}\n */\nexport const relationshipTable = pgTable(\n\t\"relationships\",\n\t{\n\t\tid: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n\t\tcreatedAt: numberTimestamp(\"createdAt\").default(sql`now()`).notNull(),\n\t\tsourceEntityId: uuid(\"sourceEntityId\")\n\t\t\t.notNull()\n\t\t\t.references(() => entityTable.id, { onDelete: \"cascade\" }),\n\t\ttargetEntityId: uuid(\"targetEntityId\")\n\t\t\t.notNull()\n\t\t\t.references(() => entityTable.id, { onDelete: \"cascade\" }),\n\t\tagentId: uuid(\"agentId\")\n\t\t\t.notNull()\n\t\t\t.references(() => agentTable.id, { onDelete: \"cascade\" }),\n\t\ttags: text(\"tags\").array(),\n\t\tmetadata: jsonb(\"metadata\"),\n\t},\n\t(table) => [\n\t\tindex(\"idx_relationships_users\").on(\n\t\t\ttable.sourceEntityId,\n\t\t\ttable.targetEntityId,\n\t\t),\n\t\tunique(\"unique_relationship\").on(\n\t\t\ttable.sourceEntityId,\n\t\t\ttable.targetEntityId,\n\t\t\ttable.agentId,\n\t\t),\n\t\tforeignKey({\n\t\t\tname: \"fk_user_a\",\n\t\t\tcolumns: [table.sourceEntityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t\tforeignKey({\n\t\t\tname: \"fk_user_b\",\n\t\t\tcolumns: [table.targetEntityId],\n\t\t\tforeignColumns: [entityTable.id],\n\t\t}).onDelete(\"cascade\"),\n\t],\n);\n","import { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\n/**\n * Represents a table schema for tasks in the database.\n *\n * @type {PgTable}\n */\nexport const taskTable = pgTable(\"tasks\", {\n\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\tname: text(\"name\").notNull(),\n\tdescription: text(\"description\").notNull(),\n\troomId: uuid(\"room_id\"),\n\tworldId: uuid(\"world_id\"),\n\tagentId: uuid(\"agent_id\").notNull(),\n\ttags: text(\"tags\").array(),\n\tmetadata: jsonb(\"metadata\"),\n\tcreatedAt: timestamp(\"created_at\").defaultNow(),\n\tupdatedAt: timestamp(\"updated_at\").defaultNow(),\n});\n","import { type UUID, logger } from \"@elizaos/core\";\nimport { type NodePgDatabase, drizzle } from \"drizzle-orm/node-postgres\";\nimport { BaseDrizzleAdapter } from \"../base\";\nimport {\n\tDIMENSION_MAP,\n\ttype EmbeddingDimensionColumn,\n} from \"../schema/embedding\";\nimport type { PostgresConnectionManager } from \"./manager\";\n\n/**\n * Adapter class for interacting with a PostgreSQL database.\n * Extends BaseDrizzleAdapter<NodePgDatabase>.\n */\nexport class PgDatabaseAdapter extends BaseDrizzleAdapter<NodePgDatabase> {\n\tprotected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n\n\t/**\n\t * Constructor for creating a new instance of a class.\n\t * @param {UUID} agentId - The unique identifier for the agent.\n\t * @param {PostgresConnectionManager} manager - The Postgres connection manager for the instance.\n\t */\n\tconstructor(\n\t\tagentId: UUID,\n\t\tprivate manager: PostgresConnectionManager,\n\t) {\n\t\tsuper(agentId);\n\t\tthis.manager = manager;\n\t}\n\n\t/**\n\t * Executes the provided operation with a database connection.\n\t *\n\t * @template T\n\t * @param {() => Promise<T>} operation - The operation to be executed with the database connection.\n\t * @returns {Promise<T>} A promise that resolves with the result of the operation.\n\t */\n\tprotected async withDatabase<T>(operation: () => Promise<T>): Promise<T> {\n\t\treturn await this.withRetry(async () => {\n\t\t\tconst client = await this.manager.getClient();\n\t\t\ttry {\n\t\t\t\tconst db = drizzle(client);\n\t\t\t\tthis.db = db;\n\n\t\t\t\treturn await operation();\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously initializes the PgDatabaseAdapter by running migrations using the manager.\n\t * Logs a success message if initialization is successful, otherwise logs an error message.\n\t *\n\t * @returns {Promise<void>} A promise that resolves when initialization is complete.\n\t */\n\tasync init(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.manager.runMigrations();\n\t\t\tlogger.info(\"PgDatabaseAdapter initialized successfully\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize PgDatabaseAdapter:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously closes the manager associated with this instance.\n\t *\n\t * @returns A Promise that resolves once the manager is closed.\n\t */\n\tasync close(): Promise<void> {\n\t\tawait this.manager.close();\n\t}\n}\n"],"mappings":"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","names":["logger","logger","sql","sql","check","foreignKey","index","pgTable","uuid","vector","sql","boolean","jsonb","pgTable","text","uuid","sql","jsonb","pgTable","text","unique","uuid","pgTable","uuid","sql","text","jsonb","unique","sql","jsonb","pgTable","text","uuid","sql","jsonb","pgTable","text","uuid","pgTable","uuid","sql","text","jsonb","pgTable","uuid","sql","text","jsonb","pgTable","uuid","text","sql","jsonb","boolean","pgTable","uuid","sql","vector","check","index","foreignKey","sql","jsonb","pgTable","text","unique","uuid","pgTable","uuid","sql","text","jsonb","unique","sql","jsonb","pgTable","text","uuid","pgTable","uuid","text","jsonb","sql","sql","foreignKey","jsonb","pgTable","text","uuid","pgTable","uuid","sql","jsonb","text","foreignKey","sql","foreignKey","index","pgTable","text","uuid","pgTable","uuid","sql","text","index","foreignKey","sql","foreignKey","index","jsonb","pgTable","text","unique","uuid","pgTable","uuid","sql","text","jsonb","index","unique","foreignKey","jsonb","pgTable","text","uuid","sql","count","unique","logger","logger","drizzle","drizzle","logger","logger"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-sql",
3
- "version": "1.0.0-alpha.57",
3
+ "version": "1.0.0-alpha.59",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -27,7 +27,7 @@
27
27
  ],
28
28
  "dependencies": {
29
29
  "@electric-sql/pglite": "^0.2.17",
30
- "@elizaos/core": "^1.0.0-alpha.57",
30
+ "@elizaos/core": "^1.0.0-alpha.59",
31
31
  "@types/pg": "8.11.10",
32
32
  "drizzle-kit": "^0.30.4",
33
33
  "drizzle-orm": "^0.39.1",
@@ -48,5 +48,5 @@
48
48
  "peerDependencies": {
49
49
  "typescript": "5.8.2"
50
50
  },
51
- "gitHead": "9320c2ea5fd06c122aa66301a1c537ef6d864981"
51
+ "gitHead": "e450585943baaa522b53b236a7cb0268b72b3901"
52
52
  }