@elizaos/plugin-sql 1.0.0-alpha.35 → 1.0.0-alpha.36

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.
@@ -93,21 +93,6 @@ var PGliteClientManager = class {
93
93
  await this.gracefulShutdown();
94
94
  });
95
95
  }
96
- /**
97
- * Asynchronously checks if migrations exist in the database.
98
- * @returns {Promise<boolean>} A Promise that resolves to true if migrations exist, otherwise false.
99
- */
100
- async hasMigrations() {
101
- try {
102
- const result = await this.client.query(
103
- "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = '__drizzle_migrations')"
104
- );
105
- return result.rows[0].exists;
106
- } catch (error) {
107
- logger.error("Failed to check migrations:", error);
108
- return false;
109
- }
110
- }
111
96
  /**
112
97
  * Initializes the client for PGlite.
113
98
  *
@@ -143,20 +128,19 @@ var PGliteClientManager = class {
143
128
  }
144
129
  /**
145
130
  * Asynchronously runs database migrations using Drizzle.
131
+ *
132
+ * Drizzle will first check if the migrations are already applied.
133
+ * If there is a diff between database schema and migrations, it will apply the migrations.
134
+ * If they are already applied, it will skip them.
146
135
  *
147
136
  * @returns {Promise<void>} A Promise that resolves once the migrations are completed successfully.
148
137
  */
149
138
  async runMigrations() {
150
139
  try {
151
140
  const db = drizzle(this.client);
152
- if (await this.hasMigrations()) {
153
- logger.info("Migrations already exist, skipping...");
154
- return;
155
- }
156
141
  await migrate(db, {
157
142
  migrationsFolder: path.resolve(__dirname, "../drizzle/migrations")
158
143
  });
159
- logger.info("Migrations completed successfully!");
160
144
  } catch (error) {
161
145
  logger.error("Failed to run database migrations (pglite):", error);
162
146
  console.trace(error);
@@ -316,21 +300,6 @@ var PostgresConnectionManager = class {
316
300
  async close() {
317
301
  await this.cleanup();
318
302
  }
319
- /**
320
- * Asynchronously checks if migrations exist in the database.
321
- * @returns {Promise<boolean>} A Promise that resolves to true if migrations exist, otherwise false.
322
- */
323
- async hasMigrations() {
324
- try {
325
- const result = await this.pool.query(
326
- "SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = '__drizzle_migrations')"
327
- );
328
- return result.rows[0].exists;
329
- } catch (error) {
330
- logger2.error("Failed to check migrations:", error);
331
- return false;
332
- }
333
- }
334
303
  /**
335
304
  * Cleans up and closes the database pool.
336
305
  * @returns {Promise<void>} A Promise that resolves when the database pool is closed.
@@ -346,19 +315,18 @@ var PostgresConnectionManager = class {
346
315
  /**
347
316
  * Asynchronously runs database migrations using the Drizzle library.
348
317
  *
318
+ * Drizzle will first check if the migrations are already applied.
319
+ * If there is a diff between database schema and migrations, it will apply the migrations.
320
+ * If they are already applied, it will skip them.
321
+ *
349
322
  * @returns {Promise<void>} A Promise that resolves once the migrations are completed successfully.
350
323
  */
351
324
  async runMigrations() {
352
325
  try {
353
326
  const db = drizzle2(this.pool);
354
- if (await this.hasMigrations()) {
355
- logger2.info("Migrations already exist, skipping...");
356
- return;
357
- }
358
327
  await migrate2(db, {
359
328
  migrationsFolder: path2.resolve(__dirname2, "../drizzle/migrations")
360
329
  });
361
- logger2.info("Migrations completed successfully!");
362
330
  } catch (error) {
363
331
  logger2.error("Failed to run database migrations (pg):", error);
364
332
  console.trace(error);
@@ -371,4 +339,4 @@ export {
371
339
  PGliteClientManager,
372
340
  PostgresConnectionManager
373
341
  };
374
- //# sourceMappingURL=chunk-RJZ6IRRA.js.map
342
+ //# sourceMappingURL=chunk-DOWRSD2R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pg-lite/manager.ts","../src/pg/manager.ts"],"sourceRoot":"./","sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { PGlite, type PGliteOptions } from \"@electric-sql/pglite\";\nimport { fuzzystrmatch } from \"@electric-sql/pglite/contrib/fuzzystrmatch\";\nimport { vector } from \"@electric-sql/pglite/vector\";\nimport { logger } from \"@elizaos/core\";\nimport { drizzle } from \"drizzle-orm/pglite\";\nimport { migrate } from \"drizzle-orm/pglite/migrator\";\nimport type { IDatabaseClientManager } from \"../types\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Class representing a database client manager for PGlite.\n * @implements { IDatabaseClientManager }\n */\nexport class PGliteClientManager implements IDatabaseClientManager<PGlite> {\n\tprivate client: PGlite;\n\tprivate shuttingDown = false;\n\tprivate readonly shutdownTimeout = 500;\n\n\t/**\n\t * Constructor for creating a new instance of PGlite with the provided options.\n\t * Initializes the PGlite client with additional extensions.\n\t * @param {PGliteOptions} options - The options to configure the PGlite client.\n\t */\n\tconstructor(options: PGliteOptions) {\n\t\tthis.client = new PGlite({\n\t\t\t...options,\n\t\t\textensions: {\n\t\t\t\tvector,\n\t\t\t\tfuzzystrmatch,\n\t\t\t},\n\t\t});\n\t\tthis.setupShutdownHandlers();\n\t}\n\n\t/**\n\t * Retrieves the PostgreSQL lite connection.\n\t *\n\t * @returns {PGlite} The PostgreSQL lite connection.\n\t * @throws {Error} If the client manager is currently shutting down.\n\t */\n\tpublic getConnection(): PGlite {\n\t\tif (this.shuttingDown) {\n\t\t\tthrow new Error(\"Client manager is shutting down\");\n\t\t}\n\t\treturn this.client;\n\t}\n\n\t/**\n\t * Initiates a graceful shutdown of the PGlite client.\n\t * Checks if the client is already in the process of shutting down.\n\t * Logs the start of shutdown process and sets shuttingDown flag to true.\n\t * Sets a timeout for the shutdown process and forces closure of database connection if timeout is reached.\n\t * Handles the shutdown process, closes the client connection, clears the timeout, and logs the completion of shutdown.\n\t * Logs any errors that occur during the shutdown process.\n\t */\n\tprivate async gracefulShutdown() {\n\t\tif (this.shuttingDown) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.shuttingDown = true;\n\t\tlogger.info(\"Starting graceful shutdown of PGlite client...\");\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tlogger.warn(\n\t\t\t\t\"Shutdown timeout reached, forcing database connection closure...\",\n\t\t\t);\n\t\t\tthis.client.close().finally(() => {\n\t\t\t\tprocess.exit(1);\n\t\t\t});\n\t\t}, this.shutdownTimeout);\n\n\t\ttry {\n\t\t\tawait this.client.close();\n\t\t\tclearTimeout(timeout);\n\t\t\tlogger.info(\"PGlite client shutdown completed successfully\");\n\t\t\tprocess.exit(0);\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error during graceful shutdown:\", error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\t/**\n\t * Sets up shutdown handlers for SIGINT, SIGTERM, and beforeExit events to gracefully shutdown the application.\n\t * @private\n\t */\n\tprivate setupShutdownHandlers() {\n\t\tprocess.on(\"SIGINT\", async () => {\n\t\t\tawait this.gracefulShutdown();\n\t\t});\n\n\t\tprocess.on(\"SIGTERM\", async () => {\n\t\t\tawait this.gracefulShutdown();\n\t\t});\n\n\t\tprocess.on(\"beforeExit\", async () => {\n\t\t\tawait this.gracefulShutdown();\n\t\t});\n\t}\n\n\t/**\n\t * Initializes the client for PGlite.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves when the client is initialized successfully\n\t */\n\tpublic async initialize(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.client.waitReady;\n\t\t\tlogger.info(\"PGlite client initialized successfully\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize PGlite client:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously closes the resource. If the resource is not already shutting down,\n\t * it performs a graceful shutdown before closing.\n\t *\n\t * @returns A promise that resolves once the resource has been closed.\n\t */\n\tpublic async close(): Promise<void> {\n\t\tif (!this.shuttingDown) {\n\t\t\tawait this.gracefulShutdown();\n\t\t}\n\t}\n\n\t/**\n\t * Check if the system is currently shutting down.\n\t *\n\t * @returns {boolean} True if the system is shutting down, false otherwise.\n\t */\n\tpublic isShuttingDown(): boolean {\n\t\treturn this.shuttingDown;\n\t}\n\n\t/**\n\t * Asynchronously runs database migrations using Drizzle.\n\t * \n\t * Drizzle will first check if the migrations are already applied.\n\t * If there is a diff between database schema and migrations, it will apply the migrations.\n\t * If they are already applied, it will skip them.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves once the migrations are completed successfully.\n\t */\n\tasync runMigrations(): Promise<void> {\n\t\ttry {\n\t\t\tconst db = drizzle(this.client);\n\t\t\tawait migrate(db, {\n\t\t\t\tmigrationsFolder: path.resolve(__dirname, \"../drizzle/migrations\"),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to run database migrations (pglite):\", error);\n\t\t\t// throw error;\n\t\t\tconsole.trace(error);\n\t\t}\n\t}\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { logger } from \"@elizaos/core\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { migrate } from \"drizzle-orm/node-postgres/migrator\";\nimport pkg, { type Pool as PgPool } from \"pg\";\nimport type { IDatabaseClientManager } from \"../types\";\n\nconst { Pool } = pkg;\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Manages connections to a PostgreSQL database using a connection pool.\n * Implements IDatabaseClientManager interface.\n */\n\nexport class PostgresConnectionManager\n\timplements IDatabaseClientManager<PgPool>\n{\n\tprivate pool: PgPool;\n\tprivate isShuttingDown = false;\n\tprivate readonly connectionTimeout: number = 5000;\n\n\t/**\n\t * Constructor for creating a connection pool.\n\t * @param {string} connectionString - The connection string used to connect to the database.\n\t */\n\tconstructor(connectionString: string) {\n\t\tconst defaultConfig = {\n\t\t\tmax: 20,\n\t\t\tidleTimeoutMillis: 30000,\n\t\t\tconnectionTimeoutMillis: this.connectionTimeout,\n\t\t};\n\n\t\tthis.pool = new Pool({\n\t\t\t...defaultConfig,\n\t\t\tconnectionString,\n\t\t});\n\n\t\tthis.pool.on(\"error\", (err) => {\n\t\t\tlogger.error(\"Unexpected pool error\", err);\n\t\t\tthis.handlePoolError(err);\n\t\t});\n\n\t\tthis.setupPoolErrorHandling();\n\t\tthis.testConnection();\n\t}\n\n\t/**\n\t * Handles a pool error by attempting to reconnect the pool.\n\t *\n\t * @param {Error} error The error that occurred in the pool.\n\t * @throws {Error} If failed to reconnect the pool.\n\t */\n\tprivate async handlePoolError(error: Error) {\n\t\tlogger.error(\"Pool error occurred, attempting to reconnect\", {\n\t\t\terror: error.message,\n\t\t});\n\n\t\ttry {\n\t\t\tawait this.pool.end();\n\n\t\t\tthis.pool = new Pool({\n\t\t\t\t...this.pool.options,\n\t\t\t\tconnectionTimeoutMillis: this.connectionTimeout,\n\t\t\t});\n\n\t\t\tawait this.testConnection();\n\t\t\tlogger.success(\"Pool reconnection successful\");\n\t\t} catch (reconnectError) {\n\t\t\tlogger.error(\"Failed to reconnect pool\", {\n\t\t\t\terror:\n\t\t\t\t\treconnectError instanceof Error\n\t\t\t\t\t\t? reconnectError.message\n\t\t\t\t\t\t: String(reconnectError),\n\t\t\t});\n\t\t\tthrow reconnectError;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously tests the database connection by executing a query to get the current timestamp.\n\t *\n\t * @returns {Promise<boolean>} - A Promise that resolves to true if the database connection test is successful.\n\t */\n\tasync testConnection(): Promise<boolean> {\n\t\tlet client: pkg.PoolClient | null = null;\n\t\ttry {\n\t\t\tclient = await this.pool.connect();\n\t\t\tconst result = await client.query(\"SELECT NOW()\");\n\t\t\tlogger.success(\"Database connection test successful:\", result.rows[0]);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Database connection test failed:\", error);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to connect to database: ${(error as Error).message}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tif (client) client.release();\n\t\t}\n\t}\n\n\t/**\n\t * Sets up event listeners to handle pool cleanup on SIGINT, SIGTERM, and beforeExit events.\n\t */\n\tprivate setupPoolErrorHandling() {\n\t\tprocess.on(\"SIGINT\", async () => {\n\t\t\tawait this.cleanup();\n\t\t\tprocess.exit(0);\n\t\t});\n\n\t\tprocess.on(\"SIGTERM\", async () => {\n\t\t\tawait this.cleanup();\n\t\t\tprocess.exit(0);\n\t\t});\n\n\t\tprocess.on(\"beforeExit\", async () => {\n\t\t\tawait this.cleanup();\n\t\t});\n\t}\n\n\t/**\n\t * Get the connection pool.\n\t * @returns {PgPool} The connection pool\n\t * @throws {Error} If the connection manager is shutting down or an error occurs when trying to get the connection from the pool\n\t */\n\tpublic getConnection(): PgPool {\n\t\tif (this.isShuttingDown) {\n\t\t\tthrow new Error(\"Connection manager is shutting down\");\n\t\t}\n\n\t\ttry {\n\t\t\treturn this.pool;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to get connection from pool:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously acquires a database client from the connection pool.\n\t *\n\t * @returns {Promise<pkg.PoolClient>} A Promise that resolves with the acquired database client.\n\t * @throws {Error} If an error occurs while acquiring the database client.\n\t */\n\tpublic async getClient(): Promise<pkg.PoolClient> {\n\t\ttry {\n\t\t\treturn await this.pool.connect();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to acquire a database client:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Initializes the PostgreSQL connection manager by testing the connection and logging the result.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves once the manager is successfully initialized\n\t * @throws {Error} If there is an error initializing the connection manager\n\t */\n\tpublic async initialize(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.testConnection();\n\t\t\tlogger.info(\"PostgreSQL connection manager initialized successfully\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize connection manager:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously close the current process by executing a cleanup function.\n\t * @returns A promise that resolves once the cleanup is complete.\n\t */\n\tpublic async close(): Promise<void> {\n\t\tawait this.cleanup();\n\t}\n\n\t/**\n\t * Cleans up and closes the database pool.\n\t * @returns {Promise<void>} A Promise that resolves when the database pool is closed.\n\t */\n\tasync cleanup(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.pool.end();\n\t\t\tlogger.info(\"Database pool closed\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error closing database pool:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously runs database migrations using the Drizzle library.\n\t *\n\t * Drizzle will first check if the migrations are already applied.\n\t * If there is a diff between database schema and migrations, it will apply the migrations.\n\t * If they are already applied, it will skip them.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves once the migrations are completed successfully.\n\t */\n\tasync runMigrations(): Promise<void> {\n\t\ttry {\n\t\t\tconst db = drizzle(this.pool);\n\t\t\tawait migrate(db, {\n\t\t\t\tmigrationsFolder: path.resolve(__dirname, \"../drizzle/migrations\"),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to run database migrations (pg):\", error);\n\t\t\tconsole.trace(error);\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["path","fileURLToPath","logger","drizzle","migrate","__filename","fileURLToPath","__dirname","path","logger","drizzle","migrate"]}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  PGliteClientManager,
3
3
  PostgresConnectionManager,
4
4
  __name
5
- } from "./chunk-RJZ6IRRA.js";
5
+ } from "./chunk-DOWRSD2R.js";
6
6
 
7
7
  // src/index.ts
8
8
  import * as os from "node:os";
@@ -60,7 +60,6 @@ import {
60
60
  // src/schema/agent.ts
61
61
  import { sql } from "drizzle-orm";
62
62
  import {
63
- boolean,
64
63
  jsonb,
65
64
  pgTable,
66
65
  text,
@@ -102,7 +101,6 @@ var agentTable = pgTable(
102
101
  id: uuid("id").primaryKey().defaultRandom(),
103
102
  createdAt: numberTimestamp("createdAt").default(sql`now()`).notNull(),
104
103
  updatedAt: numberTimestamp("updatedAt").default(sql`now()`).notNull(),
105
- enabled: boolean("enabled").default(true).notNull(),
106
104
  // Character
107
105
  name: text("name"),
108
106
  username: text("username"),
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\tenabled: boolean(\"enabled\").default(true).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// 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"]}
package/dist/migrate.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  PGliteClientManager,
3
3
  PostgresConnectionManager,
4
4
  __name
5
- } from "./chunk-RJZ6IRRA.js";
5
+ } from "./chunk-DOWRSD2R.js";
6
6
 
7
7
  // src/migrate.ts
8
8
  import { logger } from "@elizaos/core";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-sql",
3
- "version": "1.0.0-alpha.35",
3
+ "version": "1.0.0-alpha.36",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "dependencies": {
28
28
  "@electric-sql/pglite": "^0.2.17",
29
- "@elizaos/core": "1.0.0-alpha.35",
29
+ "@elizaos/core": "1.0.0-alpha.36",
30
30
  "@types/pg": "8.11.10",
31
31
  "drizzle-kit": "^0.30.4",
32
32
  "drizzle-orm": "^0.39.1",
@@ -47,5 +47,5 @@
47
47
  "peerDependencies": {
48
48
  "typescript": "5.8.2"
49
49
  },
50
- "gitHead": "cc0c7be622fd60cdb16422661ee170ef897c744b"
50
+ "gitHead": "3ab6794ec27dfee9891ce79fcf7643aa8bc6b196"
51
51
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pg-lite/manager.ts","../src/pg/manager.ts"],"sourceRoot":"./","sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { PGlite, type PGliteOptions } from \"@electric-sql/pglite\";\nimport { fuzzystrmatch } from \"@electric-sql/pglite/contrib/fuzzystrmatch\";\nimport { vector } from \"@electric-sql/pglite/vector\";\nimport { logger } from \"@elizaos/core\";\nimport { drizzle } from \"drizzle-orm/pglite\";\nimport { migrate } from \"drizzle-orm/pglite/migrator\";\nimport type { IDatabaseClientManager } from \"../types\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Class representing a database client manager for PGlite.\n * @implements { IDatabaseClientManager }\n */\nexport class PGliteClientManager implements IDatabaseClientManager<PGlite> {\n\tprivate client: PGlite;\n\tprivate shuttingDown = false;\n\tprivate readonly shutdownTimeout = 500;\n\n\t/**\n\t * Constructor for creating a new instance of PGlite with the provided options.\n\t * Initializes the PGlite client with additional extensions.\n\t * @param {PGliteOptions} options - The options to configure the PGlite client.\n\t */\n\tconstructor(options: PGliteOptions) {\n\t\tthis.client = new PGlite({\n\t\t\t...options,\n\t\t\textensions: {\n\t\t\t\tvector,\n\t\t\t\tfuzzystrmatch,\n\t\t\t},\n\t\t});\n\t\tthis.setupShutdownHandlers();\n\t}\n\n\t/**\n\t * Retrieves the PostgreSQL lite connection.\n\t *\n\t * @returns {PGlite} The PostgreSQL lite connection.\n\t * @throws {Error} If the client manager is currently shutting down.\n\t */\n\tpublic getConnection(): PGlite {\n\t\tif (this.shuttingDown) {\n\t\t\tthrow new Error(\"Client manager is shutting down\");\n\t\t}\n\t\treturn this.client;\n\t}\n\n\t/**\n\t * Initiates a graceful shutdown of the PGlite client.\n\t * Checks if the client is already in the process of shutting down.\n\t * Logs the start of shutdown process and sets shuttingDown flag to true.\n\t * Sets a timeout for the shutdown process and forces closure of database connection if timeout is reached.\n\t * Handles the shutdown process, closes the client connection, clears the timeout, and logs the completion of shutdown.\n\t * Logs any errors that occur during the shutdown process.\n\t */\n\tprivate async gracefulShutdown() {\n\t\tif (this.shuttingDown) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.shuttingDown = true;\n\t\tlogger.info(\"Starting graceful shutdown of PGlite client...\");\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tlogger.warn(\n\t\t\t\t\"Shutdown timeout reached, forcing database connection closure...\",\n\t\t\t);\n\t\t\tthis.client.close().finally(() => {\n\t\t\t\tprocess.exit(1);\n\t\t\t});\n\t\t}, this.shutdownTimeout);\n\n\t\ttry {\n\t\t\tawait this.client.close();\n\t\t\tclearTimeout(timeout);\n\t\t\tlogger.info(\"PGlite client shutdown completed successfully\");\n\t\t\tprocess.exit(0);\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error during graceful shutdown:\", error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\t/**\n\t * Sets up shutdown handlers for SIGINT, SIGTERM, and beforeExit events to gracefully shutdown the application.\n\t * @private\n\t */\n\tprivate setupShutdownHandlers() {\n\t\tprocess.on(\"SIGINT\", async () => {\n\t\t\tawait this.gracefulShutdown();\n\t\t});\n\n\t\tprocess.on(\"SIGTERM\", async () => {\n\t\t\tawait this.gracefulShutdown();\n\t\t});\n\n\t\tprocess.on(\"beforeExit\", async () => {\n\t\t\tawait this.gracefulShutdown();\n\t\t});\n\t}\n\n\t/**\n\t * Asynchronously checks if migrations exist in the database.\n\t * @returns {Promise<boolean>} A Promise that resolves to true if migrations exist, otherwise false.\n\t */\n\tprivate async hasMigrations(): Promise<boolean> {\n\t\ttry {\n\t\t\tconst result = await this.client.query(\n\t\t\t\t\"SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = '__drizzle_migrations')\"\n\t\t\t);\n\t\t\treturn (result.rows[0] as any).exists;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to check migrations:\", error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\t/**\n\t * Initializes the client for PGlite.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves when the client is initialized successfully\n\t */\n\tpublic async initialize(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.client.waitReady;\n\t\t\tlogger.info(\"PGlite client initialized successfully\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize PGlite client:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously closes the resource. If the resource is not already shutting down,\n\t * it performs a graceful shutdown before closing.\n\t *\n\t * @returns A promise that resolves once the resource has been closed.\n\t */\n\tpublic async close(): Promise<void> {\n\t\tif (!this.shuttingDown) {\n\t\t\tawait this.gracefulShutdown();\n\t\t}\n\t}\n\n\t/**\n\t * Check if the system is currently shutting down.\n\t *\n\t * @returns {boolean} True if the system is shutting down, false otherwise.\n\t */\n\tpublic isShuttingDown(): boolean {\n\t\treturn this.shuttingDown;\n\t}\n\n\t/**\n\t * Asynchronously runs database migrations using Drizzle.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves once the migrations are completed successfully.\n\t */\n\tasync runMigrations(): Promise<void> {\n\t\ttry {\n\t\t\tconst db = drizzle(this.client);\n\t\t\tif (await this.hasMigrations()) {\n\t\t\t\tlogger.info(\"Migrations already exist, skipping...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait migrate(db, {\n\t\t\t\tmigrationsFolder: path.resolve(__dirname, \"../drizzle/migrations\"),\n\t\t\t});\n\t\t\tlogger.info(\"Migrations completed successfully!\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to run database migrations (pglite):\", error);\n\t\t\t// throw error;\n\t\t\tconsole.trace(error);\n\t\t}\n\t}\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { logger } from \"@elizaos/core\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\nimport { migrate } from \"drizzle-orm/node-postgres/migrator\";\nimport pkg, { type Pool as PgPool } from \"pg\";\nimport type { IDatabaseClientManager } from \"../types\";\n\nconst { Pool } = pkg;\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Manages connections to a PostgreSQL database using a connection pool.\n * Implements IDatabaseClientManager interface.\n */\n\nexport class PostgresConnectionManager\n\timplements IDatabaseClientManager<PgPool>\n{\n\tprivate pool: PgPool;\n\tprivate isShuttingDown = false;\n\tprivate readonly connectionTimeout: number = 5000;\n\n\t/**\n\t * Constructor for creating a connection pool.\n\t * @param {string} connectionString - The connection string used to connect to the database.\n\t */\n\tconstructor(connectionString: string) {\n\t\tconst defaultConfig = {\n\t\t\tmax: 20,\n\t\t\tidleTimeoutMillis: 30000,\n\t\t\tconnectionTimeoutMillis: this.connectionTimeout,\n\t\t};\n\n\t\tthis.pool = new Pool({\n\t\t\t...defaultConfig,\n\t\t\tconnectionString,\n\t\t});\n\n\t\tthis.pool.on(\"error\", (err) => {\n\t\t\tlogger.error(\"Unexpected pool error\", err);\n\t\t\tthis.handlePoolError(err);\n\t\t});\n\n\t\tthis.setupPoolErrorHandling();\n\t\tthis.testConnection();\n\t}\n\n\t/**\n\t * Handles a pool error by attempting to reconnect the pool.\n\t *\n\t * @param {Error} error The error that occurred in the pool.\n\t * @throws {Error} If failed to reconnect the pool.\n\t */\n\tprivate async handlePoolError(error: Error) {\n\t\tlogger.error(\"Pool error occurred, attempting to reconnect\", {\n\t\t\terror: error.message,\n\t\t});\n\n\t\ttry {\n\t\t\tawait this.pool.end();\n\n\t\t\tthis.pool = new Pool({\n\t\t\t\t...this.pool.options,\n\t\t\t\tconnectionTimeoutMillis: this.connectionTimeout,\n\t\t\t});\n\n\t\t\tawait this.testConnection();\n\t\t\tlogger.success(\"Pool reconnection successful\");\n\t\t} catch (reconnectError) {\n\t\t\tlogger.error(\"Failed to reconnect pool\", {\n\t\t\t\terror:\n\t\t\t\t\treconnectError instanceof Error\n\t\t\t\t\t\t? reconnectError.message\n\t\t\t\t\t\t: String(reconnectError),\n\t\t\t});\n\t\t\tthrow reconnectError;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously tests the database connection by executing a query to get the current timestamp.\n\t *\n\t * @returns {Promise<boolean>} - A Promise that resolves to true if the database connection test is successful.\n\t */\n\tasync testConnection(): Promise<boolean> {\n\t\tlet client: pkg.PoolClient | null = null;\n\t\ttry {\n\t\t\tclient = await this.pool.connect();\n\t\t\tconst result = await client.query(\"SELECT NOW()\");\n\t\t\tlogger.success(\"Database connection test successful:\", result.rows[0]);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Database connection test failed:\", error);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to connect to database: ${(error as Error).message}`,\n\t\t\t);\n\t\t} finally {\n\t\t\tif (client) client.release();\n\t\t}\n\t}\n\n\t/**\n\t * Sets up event listeners to handle pool cleanup on SIGINT, SIGTERM, and beforeExit events.\n\t */\n\tprivate setupPoolErrorHandling() {\n\t\tprocess.on(\"SIGINT\", async () => {\n\t\t\tawait this.cleanup();\n\t\t\tprocess.exit(0);\n\t\t});\n\n\t\tprocess.on(\"SIGTERM\", async () => {\n\t\t\tawait this.cleanup();\n\t\t\tprocess.exit(0);\n\t\t});\n\n\t\tprocess.on(\"beforeExit\", async () => {\n\t\t\tawait this.cleanup();\n\t\t});\n\t}\n\n\t/**\n\t * Get the connection pool.\n\t * @returns {PgPool} The connection pool\n\t * @throws {Error} If the connection manager is shutting down or an error occurs when trying to get the connection from the pool\n\t */\n\tpublic getConnection(): PgPool {\n\t\tif (this.isShuttingDown) {\n\t\t\tthrow new Error(\"Connection manager is shutting down\");\n\t\t}\n\n\t\ttry {\n\t\t\treturn this.pool;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to get connection from pool:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously acquires a database client from the connection pool.\n\t *\n\t * @returns {Promise<pkg.PoolClient>} A Promise that resolves with the acquired database client.\n\t * @throws {Error} If an error occurs while acquiring the database client.\n\t */\n\tpublic async getClient(): Promise<pkg.PoolClient> {\n\t\ttry {\n\t\t\treturn await this.pool.connect();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to acquire a database client:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Initializes the PostgreSQL connection manager by testing the connection and logging the result.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves once the manager is successfully initialized\n\t * @throws {Error} If there is an error initializing the connection manager\n\t */\n\tpublic async initialize(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.testConnection();\n\t\t\tlogger.info(\"PostgreSQL connection manager initialized successfully\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize connection manager:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously close the current process by executing a cleanup function.\n\t * @returns A promise that resolves once the cleanup is complete.\n\t */\n\tpublic async close(): Promise<void> {\n\t\tawait this.cleanup();\n\t}\n\n\t/**\n\t * Asynchronously checks if migrations exist in the database.\n\t * @returns {Promise<boolean>} A Promise that resolves to true if migrations exist, otherwise false.\n\t */\n\tprivate async hasMigrations(): Promise<boolean> {\n\t\ttry {\n\t\t\tconst result = await this.pool.query(\n\t\t\t\t\"SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = '__drizzle_migrations')\"\n\t\t\t);\n\t\t\treturn result.rows[0].exists;\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to check migrations:\", error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Cleans up and closes the database pool.\n\t * @returns {Promise<void>} A Promise that resolves when the database pool is closed.\n\t */\n\tasync cleanup(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.pool.end();\n\t\t\tlogger.info(\"Database pool closed\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error closing database pool:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Asynchronously runs database migrations using the Drizzle library.\n\t *\n\t * @returns {Promise<void>} A Promise that resolves once the migrations are completed successfully.\n\t */\n\tasync runMigrations(): Promise<void> {\n\t\ttry {\n\t\t\tconst db = drizzle(this.pool);\n\t\t\tif (await this.hasMigrations()) {\n\t\t\t\tlogger.info(\"Migrations already exist, skipping...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait migrate(db, {\n\t\t\t\tmigrationsFolder: path.resolve(__dirname, \"../drizzle/migrations\"),\n\t\t\t});\n\t\t\tlogger.info(\"Migrations completed successfully!\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to run database migrations (pg):\", error);\n\t\t\t// throw error;\n\t\t\tconsole.trace(error);\n\t\t}\n\t}\n}\n"],"mappings":";;;;AAAA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAC9B,SAAS,cAAkC;AAC3C,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AACvB,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,eAAe;AAGxB,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,KAAK,QAAQ,UAAU;AAMlC,IAAM,sBAAN,MAAoE;AAAA,EAjB3E,OAiB2E;AAAA;AAAA;AAAA,EAClE;AAAA,EACA,eAAe;AAAA,EACN,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnC,YAAY,SAAwB;AACnC,SAAK,SAAS,IAAI,OAAO;AAAA,MACxB,GAAG;AAAA,MACH,YAAY;AAAA,QACX;AAAA,QACA;AAAA,MACD;AAAA,IACD,CAAC;AACD,SAAK,sBAAsB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,gBAAwB;AAC9B,QAAI,KAAK,cAAc;AACtB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IAClD;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,mBAAmB;AAChC,QAAI,KAAK,cAAc;AACtB;AAAA,IACD;AAEA,SAAK,eAAe;AACpB,WAAO,KAAK,gDAAgD;AAE5D,UAAM,UAAU,WAAW,MAAM;AAChC,aAAO;AAAA,QACN;AAAA,MACD;AACA,WAAK,OAAO,MAAM,EAAE,QAAQ,MAAM;AACjC,gBAAQ,KAAK,CAAC;AAAA,MACf,CAAC;AAAA,IACF,GAAG,KAAK,eAAe;AAEvB,QAAI;AACH,YAAM,KAAK,OAAO,MAAM;AACxB,mBAAa,OAAO;AACpB,aAAO,KAAK,+CAA+C;AAC3D,cAAQ,KAAK,CAAC;AAAA,IACf,SAAS,OAAO;AACf,aAAO,MAAM,mCAAmC,KAAK;AACrD,cAAQ,KAAK,CAAC;AAAA,IACf;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAwB;AAC/B,YAAQ,GAAG,UAAU,YAAY;AAChC,YAAM,KAAK,iBAAiB;AAAA,IAC7B,CAAC;AAED,YAAQ,GAAG,WAAW,YAAY;AACjC,YAAM,KAAK,iBAAiB;AAAA,IAC7B,CAAC;AAED,YAAQ,GAAG,cAAc,YAAY;AACpC,YAAM,KAAK,iBAAiB;AAAA,IAC7B,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAkC;AAC/C,QAAI;AACH,YAAM,SAAS,MAAM,KAAK,OAAO;AAAA,QAChC;AAAA,MACD;AACA,aAAQ,OAAO,KAAK,CAAC,EAAU;AAAA,IAChC,SAAS,OAAO;AACf,aAAO,MAAM,+BAA+B,KAAK;AACjD,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,aAA4B;AACxC,QAAI;AACH,YAAM,KAAK,OAAO;AAClB,aAAO,KAAK,wCAAwC;AAAA,IACrD,SAAS,OAAO;AACf,aAAO,MAAM,uCAAuC,KAAK;AACzD,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,QAAuB;AACnC,QAAI,CAAC,KAAK,cAAc;AACvB,YAAM,KAAK,iBAAiB;AAAA,IAC7B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,iBAA0B;AAChC,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAA+B;AACpC,QAAI;AACH,YAAM,KAAK,QAAQ,KAAK,MAAM;AAC9B,UAAI,MAAM,KAAK,cAAc,GAAG;AAC/B,eAAO,KAAK,uCAAuC;AACnD;AAAA,MACD;AACA,YAAM,QAAQ,IAAI;AAAA,QACjB,kBAAkB,KAAK,QAAQ,WAAW,uBAAuB;AAAA,MAClE,CAAC;AACD,aAAO,KAAK,oCAAoC;AAAA,IACjD,SAAS,OAAO;AACf,aAAO,MAAM,+CAA+C,KAAK;AAEjE,cAAQ,MAAM,KAAK;AAAA,IACpB;AAAA,EACD;AACD;;;ACpLA,OAAOA,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,gBAAe;AACxB,OAAO,SAAkC;AAGzC,IAAM,EAAE,KAAK,IAAI;AAEjB,IAAMC,cAAaC,eAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,MAAK,QAAQH,WAAU;AAOlC,IAAM,4BAAN,MAEP;AAAA,EApBA,OAoBA;AAAA;AAAA;AAAA,EACS;AAAA,EACA,iBAAiB;AAAA,EACR,oBAA4B;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7C,YAAY,kBAA0B;AACrC,UAAM,gBAAgB;AAAA,MACrB,KAAK;AAAA,MACL,mBAAmB;AAAA,MACnB,yBAAyB,KAAK;AAAA,IAC/B;AAEA,SAAK,OAAO,IAAI,KAAK;AAAA,MACpB,GAAG;AAAA,MACH;AAAA,IACD,CAAC;AAED,SAAK,KAAK,GAAG,SAAS,CAAC,QAAQ;AAC9B,MAAAI,QAAO,MAAM,yBAAyB,GAAG;AACzC,WAAK,gBAAgB,GAAG;AAAA,IACzB,CAAC;AAED,SAAK,uBAAuB;AAC5B,SAAK,eAAe;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,gBAAgB,OAAc;AAC3C,IAAAA,QAAO,MAAM,gDAAgD;AAAA,MAC5D,OAAO,MAAM;AAAA,IACd,CAAC;AAED,QAAI;AACH,YAAM,KAAK,KAAK,IAAI;AAEpB,WAAK,OAAO,IAAI,KAAK;AAAA,QACpB,GAAG,KAAK,KAAK;AAAA,QACb,yBAAyB,KAAK;AAAA,MAC/B,CAAC;AAED,YAAM,KAAK,eAAe;AAC1B,MAAAA,QAAO,QAAQ,8BAA8B;AAAA,IAC9C,SAAS,gBAAgB;AACxB,MAAAA,QAAO,MAAM,4BAA4B;AAAA,QACxC,OACC,0BAA0B,QACvB,eAAe,UACf,OAAO,cAAc;AAAA,MAC1B,CAAC;AACD,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAmC;AACxC,QAAI,SAAgC;AACpC,QAAI;AACH,eAAS,MAAM,KAAK,KAAK,QAAQ;AACjC,YAAM,SAAS,MAAM,OAAO,MAAM,cAAc;AAChD,MAAAA,QAAO,QAAQ,wCAAwC,OAAO,KAAK,CAAC,CAAC;AACrE,aAAO;AAAA,IACR,SAAS,OAAO;AACf,MAAAA,QAAO,MAAM,oCAAoC,KAAK;AACtD,YAAM,IAAI;AAAA,QACT,kCAAmC,MAAgB,OAAO;AAAA,MAC3D;AAAA,IACD,UAAE;AACD,UAAI,OAAQ,QAAO,QAAQ;AAAA,IAC5B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB;AAChC,YAAQ,GAAG,UAAU,YAAY;AAChC,YAAM,KAAK,QAAQ;AACnB,cAAQ,KAAK,CAAC;AAAA,IACf,CAAC;AAED,YAAQ,GAAG,WAAW,YAAY;AACjC,YAAM,KAAK,QAAQ;AACnB,cAAQ,KAAK,CAAC;AAAA,IACf,CAAC;AAED,YAAQ,GAAG,cAAc,YAAY;AACpC,YAAM,KAAK,QAAQ;AAAA,IACpB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,gBAAwB;AAC9B,QAAI,KAAK,gBAAgB;AACxB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACtD;AAEA,QAAI;AACH,aAAO,KAAK;AAAA,IACb,SAAS,OAAO;AACf,MAAAA,QAAO,MAAM,uCAAuC,KAAK;AACzD,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,YAAqC;AACjD,QAAI;AACH,aAAO,MAAM,KAAK,KAAK,QAAQ;AAAA,IAChC,SAAS,OAAO;AACf,MAAAA,QAAO,MAAM,wCAAwC,KAAK;AAC1D,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,aAA4B;AACxC,QAAI;AACH,YAAM,KAAK,eAAe;AAC1B,MAAAA,QAAO,KAAK,wDAAwD;AAAA,IACrE,SAAS,OAAO;AACf,MAAAA,QAAO,MAAM,4CAA4C,KAAK;AAC9D,YAAM;AAAA,IACP;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,QAAuB;AACnC,UAAM,KAAK,QAAQ;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAkC;AAC/C,QAAI;AACH,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC9B;AAAA,MACD;AACA,aAAO,OAAO,KAAK,CAAC,EAAE;AAAA,IACvB,SAAS,OAAO;AACf,MAAAA,QAAO,MAAM,+BAA+B,KAAK;AACjD,aAAO;AAAA,IACR;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAyB;AAC9B,QAAI;AACH,YAAM,KAAK,KAAK,IAAI;AACpB,MAAAA,QAAO,KAAK,sBAAsB;AAAA,IACnC,SAAS,OAAO;AACf,MAAAA,QAAO,MAAM,gCAAgC,KAAK;AAAA,IACnD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAA+B;AACpC,QAAI;AACH,YAAM,KAAKC,SAAQ,KAAK,IAAI;AAC5B,UAAI,MAAM,KAAK,cAAc,GAAG;AAC/B,QAAAD,QAAO,KAAK,uCAAuC;AACnD;AAAA,MACD;AACA,YAAME,SAAQ,IAAI;AAAA,QACjB,kBAAkBH,MAAK,QAAQD,YAAW,uBAAuB;AAAA,MAClE,CAAC;AACD,MAAAE,QAAO,KAAK,oCAAoC;AAAA,IACjD,SAAS,OAAO;AACf,MAAAA,QAAO,MAAM,2CAA2C,KAAK;AAE7D,cAAQ,MAAM,KAAK;AAAA,IACpB;AAAA,EACD;AACD;","names":["path","fileURLToPath","logger","drizzle","migrate","__filename","fileURLToPath","__dirname","path","logger","drizzle","migrate"]}