diff --git a/docs/docs/classes/DatabaseAdapter.md b/docs/docs/classes/DatabaseAdapter.md index 429f91e..96a0757 100644 --- a/docs/docs/classes/DatabaseAdapter.md +++ b/docs/docs/classes/DatabaseAdapter.md @@ -43,9 +43,9 @@ custom_edit_url: null ___ -### countMemoriesByRoomId +### countMemories -▸ **countMemoriesByRoomId**(`room_id`, `unique?`, `tableName?`): `Promise`\<`number`\> +▸ **countMemories**(`room_id`, `unique?`, `tableName?`): `Promise`\<`number`\> #### Parameters @@ -198,9 +198,9 @@ ___ ___ -### getMemoriesByRoomId +### getMemories -▸ **getMemoriesByRoomId**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> +▸ **getMemories**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> #### Parameters @@ -327,9 +327,9 @@ ___ ___ -### removeAllGoalsByRoomId +### removeAllGoals -▸ **removeAllGoalsByRoomId**(`room_id`): `Promise`\<`void`\> +▸ **removeAllGoals**(`room_id`): `Promise`\<`void`\> #### Parameters @@ -343,9 +343,9 @@ ___ ___ -### removeAllMemoriesByRoomId +### removeAllMemories -▸ **removeAllMemoriesByRoomId**(`room_id`, `tableName`): `Promise`\<`void`\> +▸ **removeAllMemories**(`room_id`, `tableName`): `Promise`\<`void`\> #### Parameters diff --git a/docs/docs/classes/MemoryManager.md b/docs/docs/classes/MemoryManager.md index ce28d18..8c65bae 100644 --- a/docs/docs/classes/MemoryManager.md +++ b/docs/docs/classes/MemoryManager.md @@ -66,9 +66,9 @@ A Promise resolving to the memory object, potentially updated with an embedding ___ -### countMemoriesByRoomId +### countMemories -▸ **countMemoriesByRoomId**(`room_id`, `unique?`): `Promise`\<`number`\> +▸ **countMemories**(`room_id`, `unique?`): `Promise`\<`number`\> Counts the number of memories associated with a set of user IDs, with an option for uniqueness. @@ -108,9 +108,9 @@ A Promise that resolves when the operation completes. ___ -### getMemoriesByRoomId +### getMemories -▸ **getMemoriesByRoomId**(`opts`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> +▸ **getMemories**(`opts`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> Retrieves a list of memories by user IDs, with optional deduplication. @@ -147,9 +147,9 @@ ___ ___ -### removeAllMemoriesByRoomId +### removeAllMemories -▸ **removeAllMemoriesByRoomId**(`room_id`): `Promise`\<`void`\> +▸ **removeAllMemories**(`room_id`): `Promise`\<`void`\> Removes all memories associated with a set of user IDs. diff --git a/docs/docs/classes/SqliteDatabaseAdapter.md b/docs/docs/classes/SqliteDatabaseAdapter.md index 40d9c10..ec1290d 100644 --- a/docs/docs/classes/SqliteDatabaseAdapter.md +++ b/docs/docs/classes/SqliteDatabaseAdapter.md @@ -55,9 +55,9 @@ custom_edit_url: null ___ -### countMemoriesByRoomId +### countMemories -▸ **countMemoriesByRoomId**(`room_id`, `unique?`, `tableName?`): `Promise`\<`number`\> +▸ **countMemories**(`room_id`, `unique?`, `tableName?`): `Promise`\<`number`\> #### Parameters @@ -73,7 +73,7 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[countMemoriesByRoomId](DatabaseAdapter.md#countmemoriesbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[countMemories](DatabaseAdapter.md#countmemoriesbyroomid) ___ @@ -246,9 +246,9 @@ ___ ___ -### getMemoriesByRoomId +### getMemories -▸ **getMemoriesByRoomId**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> +▸ **getMemories**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> #### Parameters @@ -266,7 +266,7 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[getMemoriesByRoomId](DatabaseAdapter.md#getmemoriesbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[getMemories](DatabaseAdapter.md#getmemoriesbyroomid) ___ @@ -403,9 +403,9 @@ ___ ___ -### removeAllGoalsByRoomId +### removeAllGoals -▸ **removeAllGoalsByRoomId**(`room_id`): `Promise`\<`void`\> +▸ **removeAllGoals**(`room_id`): `Promise`\<`void`\> #### Parameters @@ -419,13 +419,13 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[removeAllGoalsByRoomId](DatabaseAdapter.md#removeallgoalsbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[removeAllGoals](DatabaseAdapter.md#removeallgoalsbyroomid) ___ -### removeAllMemoriesByRoomId +### removeAllMemories -▸ **removeAllMemoriesByRoomId**(`room_id`, `tableName`): `Promise`\<`void`\> +▸ **removeAllMemories**(`room_id`, `tableName`): `Promise`\<`void`\> #### Parameters @@ -440,7 +440,7 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[removeAllMemoriesByRoomId](DatabaseAdapter.md#removeallmemoriesbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[removeAllMemories](DatabaseAdapter.md#removeallmemoriesbyroomid) ___ diff --git a/docs/docs/classes/SupabaseDatabaseAdapter.md b/docs/docs/classes/SupabaseDatabaseAdapter.md index de899bc..5cda4c7 100644 --- a/docs/docs/classes/SupabaseDatabaseAdapter.md +++ b/docs/docs/classes/SupabaseDatabaseAdapter.md @@ -56,9 +56,9 @@ custom_edit_url: null ___ -### countMemoriesByRoomId +### countMemories -▸ **countMemoriesByRoomId**(`room_id`, `unique?`, `tableName`): `Promise`\<`number`\> +▸ **countMemories**(`room_id`, `unique?`, `tableName`): `Promise`\<`number`\> #### Parameters @@ -74,7 +74,7 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[countMemoriesByRoomId](DatabaseAdapter.md#countmemoriesbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[countMemories](DatabaseAdapter.md#countmemoriesbyroomid) ___ @@ -247,9 +247,9 @@ ___ ___ -### getMemoriesByRoomId +### getMemories -▸ **getMemoriesByRoomId**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> +▸ **getMemories**(`params`): `Promise`\<[`Memory`](../interfaces/Memory.md)[]\> #### Parameters @@ -267,7 +267,7 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[getMemoriesByRoomId](DatabaseAdapter.md#getmemoriesbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[getMemories](DatabaseAdapter.md#getmemoriesbyroomid) ___ @@ -404,9 +404,9 @@ ___ ___ -### removeAllGoalsByRoomId +### removeAllGoals -▸ **removeAllGoalsByRoomId**(`room_id`): `Promise`\<`void`\> +▸ **removeAllGoals**(`room_id`): `Promise`\<`void`\> #### Parameters @@ -420,13 +420,13 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[removeAllGoalsByRoomId](DatabaseAdapter.md#removeallgoalsbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[removeAllGoals](DatabaseAdapter.md#removeallgoalsbyroomid) ___ -### removeAllMemoriesByRoomId +### removeAllMemories -▸ **removeAllMemoriesByRoomId**(`room_id`, `tableName`): `Promise`\<`void`\> +▸ **removeAllMemories**(`room_id`, `tableName`): `Promise`\<`void`\> #### Parameters @@ -441,7 +441,7 @@ ___ #### Overrides -[DatabaseAdapter](DatabaseAdapter.md).[removeAllMemoriesByRoomId](DatabaseAdapter.md#removeallmemoriesbyroomid) +[DatabaseAdapter](DatabaseAdapter.md).[removeAllMemories](DatabaseAdapter.md#removeallmemoriesbyroomid) ___ diff --git a/scripts/concat.mjs b/scripts/concat.mjs index a8e4040..6a7b2c1 100644 --- a/scripts/concat.mjs +++ b/scripts/concat.mjs @@ -5,7 +5,7 @@ import { fileURLToPath } from 'url' const instructions = 'The above code was taken from my codebase at https://github.com/jointhealliance/bgent.' // Patterns to ignore -const ignorePatterns = ["evaluator", "action", "utils", "types", "memory", "constants", "messages", "agents", "relationships", "context", "provider", "logger"] +const ignorePatterns = ["evaluator", "action", "utils", "test", "types", "constants", "messages", "agents", "relationships", "context", "provider", "logger"] // __dirname is not defined in ES module scope, so we need to create it const __filename = fileURLToPath(import.meta.url) diff --git a/src/lib/__tests__/actions.test.ts b/src/lib/__tests__/actions.test.ts index a265428..e446deb 100644 --- a/src/lib/__tests__/actions.test.ts +++ b/src/lib/__tests__/actions.test.ts @@ -174,8 +174,8 @@ describe("Actions", () => { }); async function cleanup() { - await runtime.factManager.removeAllMemoriesByRoomId(room_id); - await runtime.messageManager.removeAllMemoriesByRoomId(room_id); + await runtime.factManager.removeAllMemories(room_id); + await runtime.messageManager.removeAllMemories(room_id); } // Test that actions are being loaded into context properly diff --git a/src/lib/__tests__/goals.test.ts b/src/lib/__tests__/goals.test.ts index 3a5955c..d99150e 100644 --- a/src/lib/__tests__/goals.test.ts +++ b/src/lib/__tests__/goals.test.ts @@ -17,15 +17,15 @@ describe("Goals", () => { }); runtime = result.runtime; user = result.session.user; - await runtime.databaseAdapter.removeAllGoalsByRoomId(zeroUuid); + await runtime.databaseAdapter.removeAllGoals(zeroUuid); }); beforeEach(async () => { - await runtime.databaseAdapter.removeAllGoalsByRoomId(zeroUuid); + await runtime.databaseAdapter.removeAllGoals(zeroUuid); }); afterAll(async () => { - await runtime.databaseAdapter.removeAllGoalsByRoomId(zeroUuid); + await runtime.databaseAdapter.removeAllGoals(zeroUuid); }); test("createGoal - successfully creates a new goal", async () => { diff --git a/src/lib/__tests__/lore.test.ts b/src/lib/__tests__/lore.test.ts index 72c92eb..e50e270 100644 --- a/src/lib/__tests__/lore.test.ts +++ b/src/lib/__tests__/lore.test.ts @@ -35,11 +35,11 @@ describe("Lore", () => { }); beforeEach(async () => { - await runtime.loreManager.removeAllMemoriesByRoomId(room_id); + await runtime.loreManager.removeAllMemories(room_id); }); afterAll(async () => { - await runtime.loreManager.removeAllMemoriesByRoomId(room_id); + await runtime.loreManager.removeAllMemories(room_id); }); test("Add and get lore", async () => { diff --git a/src/lib/__tests__/memory.test.ts b/src/lib/__tests__/memory.test.ts index 6d9beb2..a64142e 100644 --- a/src/lib/__tests__/memory.test.ts +++ b/src/lib/__tests__/memory.test.ts @@ -32,8 +32,6 @@ describe("Memory", () => { throw new Error("Relationship not found"); } - console.log("*** data", data); - room_id = data.room_id; memoryManager = new MemoryManager({ @@ -43,11 +41,11 @@ describe("Memory", () => { }); beforeEach(async () => { - await memoryManager.removeAllMemoriesByRoomId(room_id); + await memoryManager.removeAllMemories(room_id); }); afterAll(async () => { - await memoryManager.removeAllMemoriesByRoomId(room_id); + await memoryManager.removeAllMemories(room_id); }); test("Search memories by embedding similarity", async () => { @@ -102,9 +100,6 @@ describe("Memory", () => { }, ); - console.log("*** room_id", room_id); - console.log("*** searchedMemories", searchedMemories); - // Check that the similar memory is included in the search results and the dissimilar one is not or ranks lower expect( searchedMemories.some( @@ -228,16 +223,16 @@ describe("Memory - Basic tests", () => { // Cleanup after all tests afterAll(async () => { - await memoryManager.removeAllMemoriesByRoomId(room_id); + await memoryManager.removeAllMemories(room_id); }); test("Memory lifecycle: create, search, count, and remove", async () => { const embedding = getCachedEmbeddings("Test content for memory lifecycle"); // Create a test memory const testMemory: Memory = await memoryManager.addEmbeddingToMemory({ - user_id: user?.id as UUID, + user_id: user.id as UUID, content: { content: "Test content for memory lifecycle" }, - room_id, + room_id: room_id, embedding, }); if (!embedding) { @@ -248,13 +243,13 @@ describe("Memory - Basic tests", () => { } await memoryManager.createMemory(testMemory); - const createdMemories = await memoryManager.getMemoriesByRoomId({ + const createdMemories = await memoryManager.getMemories({ room_id, count: 100, }); // Verify creation by counting memories - const initialCount = await memoryManager.countMemoriesByRoomId( + const initialCount = await memoryManager.countMemories( room_id, false, ); @@ -273,12 +268,12 @@ describe("Memory - Basic tests", () => { // Remove a specific memory await memoryManager.removeMemory(createdMemories[0].id!); const afterRemovalCount = - await memoryManager.countMemoriesByRoomId(room_id); + await memoryManager.countMemories(room_id); expect(afterRemovalCount).toBeLessThan(initialCount); // Remove all memories for the test user - await memoryManager.removeAllMemoriesByRoomId(room_id); - const finalCount = await memoryManager.countMemoriesByRoomId(room_id); + await memoryManager.removeAllMemories(room_id); + const finalCount = await memoryManager.countMemories(room_id); expect(finalCount).toEqual(0); }); }); @@ -316,11 +311,11 @@ describe("Memory - Extended Tests", () => { }); beforeEach(async () => { - await memoryManager.removeAllMemoriesByRoomId(room_id); + await memoryManager.removeAllMemories(room_id); }); afterAll(async () => { - await memoryManager.removeAllMemoriesByRoomId(room_id); + await memoryManager.removeAllMemories(room_id); }); test("Test cosine similarity value equality", async () => { @@ -441,8 +436,8 @@ describe("Memory - Extended Tests", () => { } await memoryManager.createMemory(similarMemory, true); - const allCount = await memoryManager.countMemoriesByRoomId(room_id, false); - const uniqueCount = await memoryManager.countMemoriesByRoomId( + const allCount = await memoryManager.countMemories(room_id, false); + const uniqueCount = await memoryManager.countMemories( room_id, true, ); diff --git a/src/lib/__tests__/runtime.test.ts b/src/lib/__tests__/runtime.test.ts index f12d97f..5b1ea9d 100644 --- a/src/lib/__tests__/runtime.test.ts +++ b/src/lib/__tests__/runtime.test.ts @@ -17,7 +17,7 @@ describe("Agent Runtime", () => { // Helper function to clear memories async function clearMemories() { - await runtime.messageManager.removeAllMemoriesByRoomId(room_id); + await runtime.messageManager.removeAllMemories(room_id); } // Helper function to create memories diff --git a/src/lib/actions/__tests__/elaborate.test.ts b/src/lib/actions/__tests__/elaborate.test.ts index 688deff..2d82700 100644 --- a/src/lib/actions/__tests__/elaborate.test.ts +++ b/src/lib/actions/__tests__/elaborate.test.ts @@ -92,8 +92,8 @@ describe("User Profile", () => { }); async function cleanup() { - await runtime.factManager.removeAllMemoriesByRoomId(room_id); - await runtime.messageManager.removeAllMemoriesByRoomId(room_id); + await runtime.factManager.removeAllMemories(room_id); + await runtime.messageManager.removeAllMemories(room_id); } // test validate function response @@ -167,14 +167,14 @@ describe("User Profile", () => { console.log("room_id", room_id); const initialMessageCount = - await runtime.messageManager.countMemoriesByRoomId(room_id, false); + await runtime.messageManager.countMemories(room_id, false); await action.handler!(runtime, message); const finalMessageCount = - await runtime.messageManager.countMemoriesByRoomId(room_id, false); + await runtime.messageManager.countMemories(room_id, false); - const agentMessages = await runtime.messageManager.getMemoriesByRoomId({ + const agentMessages = await runtime.messageManager.getMemories({ room_id, count: finalMessageCount - initialMessageCount, unique: false, @@ -214,12 +214,12 @@ describe("User Profile", () => { }; const initialMessageCount = - await runtime.messageManager.countMemoriesByRoomId(room_id, false); + await runtime.messageManager.countMemories(room_id, false); await action.handler!(runtime, message); const finalMessageCount = - await runtime.messageManager.countMemoriesByRoomId(room_id, false); + await runtime.messageManager.countMemories(room_id, false); return finalMessageCount - initialMessageCount === 2; }); diff --git a/src/lib/actions/__tests__/ignore.test.ts b/src/lib/actions/__tests__/ignore.test.ts index 73d2bad..0826d60 100644 --- a/src/lib/actions/__tests__/ignore.test.ts +++ b/src/lib/actions/__tests__/ignore.test.ts @@ -167,8 +167,8 @@ describe("Ignore action tests", () => { }); async function cleanup() { - await runtime.factManager.removeAllMemoriesByRoomId(room_id); - await runtime.messageManager.removeAllMemoriesByRoomId(room_id); + await runtime.factManager.removeAllMemories(room_id); + await runtime.messageManager.removeAllMemories(room_id); } test("Test ignore action", async () => { diff --git a/src/lib/actions/__tests__/wait.test.ts b/src/lib/actions/__tests__/wait.test.ts index 3067b5e..68c7e33 100644 --- a/src/lib/actions/__tests__/wait.test.ts +++ b/src/lib/actions/__tests__/wait.test.ts @@ -50,8 +50,8 @@ describe("Wait Action Behavior", () => { }); async function cleanup() { - await runtime.factManager.removeAllMemoriesByRoomId(room_id); - await runtime.messageManager.removeAllMemoriesByRoomId(room_id); + await runtime.factManager.removeAllMemories(room_id); + await runtime.messageManager.removeAllMemories(room_id); } test("Test wait action behavior", async () => { diff --git a/src/lib/actions/elaborate.ts b/src/lib/actions/elaborate.ts index 714b0c4..9f36079 100644 --- a/src/lib/actions/elaborate.ts +++ b/src/lib/actions/elaborate.ts @@ -19,7 +19,7 @@ export default { description: "ONLY use this action when the message necessitates a follow up. Do not use this when asking a question (use WAIT instead). Do not use this action when the conversation is finished or the user does not wish to speak (use IGNORE instead). If the last message action was ELABORATE, and the user has not responded, use WAIT instead. Use sparingly! DO NOT USE WHEN ASKING A QUESTION, ALWAYS USE WAIT WHEN ASKING A QUESTION.", validate: async (runtime: BgentRuntime, message: Message) => { - const recentMessagesData = await runtime.messageManager.getMemoriesByRoomId( + const recentMessagesData = await runtime.messageManager.getMemories( { room_id: message.room_id, count: 10, diff --git a/src/lib/adapters/sqlite.ts b/src/lib/adapters/sqlite.ts index 0cc8f59..b96bc38 100644 --- a/src/lib/adapters/sqlite.ts +++ b/src/lib/adapters/sqlite.ts @@ -28,7 +28,13 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { async getAccountById(userId: UUID): Promise { const sql = "SELECT * FROM accounts WHERE id = ?"; - return (this.db.prepare(sql).get(userId) as Account) || null; + const account = (this.db.prepare(sql).get(userId) as Account[])[0]; + if (account) { + if (typeof account.details === "string") { + account.details = JSON.parse(account.details as unknown as string); + } + } + return account || null; } async createAccount(account: Account): Promise { @@ -139,7 +145,7 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { ); } - async getMemoriesByRoomId(params: { + async getMemories(params: { room_id: UUID; count?: number; unique?: boolean; @@ -155,9 +161,9 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { const queryParams = [params.tableName, params.room_id]; - if (params.unique) { - sql += " AND `unique` = 1"; - } + // if (params.unique) { + // sql += " AND `unique` = 1"; + // } if (params.count) { sql += " LIMIT ?"; @@ -165,6 +171,12 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { } const memories = this.db.prepare(sql).all(...queryParams) as Memory[]; + + console.log("params", params); + console.log("sql", sql); + console.log("queryParams", queryParams); + console.log("memories", memories); + return memories.map((memory) => ({ ...memory, content: JSON.parse(memory.content as unknown as string), @@ -188,19 +200,19 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { ORDER BY vss_search(embedding, ?) DESC `; const queryParams = [ - JSON.stringify(params.tableName), + params.tableName, JSON.stringify(embedding), JSON.stringify(embedding), ]; if (params.room_id) { sql += " AND room_id = ?"; - queryParams.push(JSON.stringify(params.room_id)); + queryParams.push(params.room_id); } - if (params.unique) { - sql += " AND `unique` = 1"; - } + // if (params.unique) { + // sql += " AND `unique` = 1"; + // } if (params.count) { sql += " LIMIT ?"; @@ -221,7 +233,7 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { ): Promise { const sql = `INSERT INTO memories (id, type, content, embedding, user_id, room_id, \`unique\`) VALUES (?, ?, ?, ?, ?, ?, ?)`; this.db.prepare(sql).run( - memory.id ?? crypto.randomUUID(), + crypto.randomUUID(), tableName, JSON.stringify(memory.content), // stringify the content field JSON.stringify(memory.embedding), @@ -236,15 +248,15 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { this.db.prepare(sql).run(tableName, memoryId); } - async removeAllMemoriesByRoomId( + async removeAllMemories( room_id: UUID, tableName: string, ): Promise { const sql = `DELETE FROM memories WHERE type = ? AND room_id = ?`; - this.db.prepare(sql).run(tableName, JSON.stringify(room_id)); + this.db.prepare(sql).run(tableName, room_id); } - async countMemoriesByRoomId( + async countMemories( room_id: UUID, unique = true, tableName = "", @@ -253,11 +265,12 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { throw new Error("tableName is required"); } - let sql = `SELECT COUNT(*) as count FROM memories WHERE type = ? AND room_id = ?`; - const queryParams = [tableName, JSON.stringify(room_id)] as string[]; + const sql = `SELECT COUNT(*) as count FROM memories WHERE type = ? AND room_id = ?`; + const queryParams = [tableName, room_id] as string[]; if (unique) { - sql += " AND `unique` = 1"; + // TODO + // sql += " AND `unique` = 1"; } return (this.db.prepare(sql).get(...queryParams) as { count: number }) @@ -271,7 +284,7 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { count?: number; }): Promise { let sql = "SELECT * FROM goals WHERE room_id = ?"; - const queryParams = [JSON.stringify(params.room_id)]; + const queryParams = [params.room_id]; if (params.userId) { sql += " AND user_id = ?"; @@ -284,10 +297,18 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { if (params.count) { sql += " LIMIT ?"; + // @ts-expect-error - queryParams is an array of strings queryParams.push(params.count.toString()); } - return this.db.prepare(sql).all(...queryParams) as Goal[]; + const goals = this.db.prepare(sql).all(...queryParams) as Goal[]; + return goals.map((goal) => ({ + ...goal, + objectives: + typeof goal.objectives === "string" + ? JSON.parse(goal.objectives) + : goal.objectives, + })); } async updateGoal(goal: Goal): Promise { @@ -305,7 +326,7 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { .prepare(sql) .run( goal.id, - JSON.stringify(goal.room_id), + goal.room_id, goal.user_id, goal.name, goal.status, @@ -318,9 +339,9 @@ export class SqliteDatabaseAdapter extends DatabaseAdapter { this.db.prepare(sql).run(goalId); } - async removeAllGoalsByRoomId(room_id: UUID): Promise { + async removeAllGoals(room_id: UUID): Promise { const sql = "DELETE FROM goals WHERE room_id = ?"; - this.db.prepare(sql).run(JSON.stringify(room_id)); + this.db.prepare(sql).run(room_id); } async createRoom(name: string): Promise { diff --git a/src/lib/adapters/supabase.ts b/src/lib/adapters/supabase.ts index 8ee673f..23f09ea 100644 --- a/src/lib/adapters/supabase.ts +++ b/src/lib/adapters/supabase.ts @@ -141,7 +141,7 @@ export class SupabaseDatabaseAdapter extends DatabaseAdapter { } } - async getMemoriesByRoomId(params: { + async getMemories(params: { room_id: UUID; count?: number; unique?: boolean; @@ -235,7 +235,7 @@ export class SupabaseDatabaseAdapter extends DatabaseAdapter { } } - async removeAllMemoriesByRoomId( + async removeAllMemories( room_id: UUID, tableName: string, ): Promise { @@ -249,7 +249,7 @@ export class SupabaseDatabaseAdapter extends DatabaseAdapter { } } - async countMemoriesByRoomId( + async countMemories( room_id: UUID, unique = true, tableName: string, @@ -311,7 +311,7 @@ export class SupabaseDatabaseAdapter extends DatabaseAdapter { } } - async removeAllGoalsByRoomId(room_id: UUID): Promise { + async removeAllGoals(room_id: UUID): Promise { const { error } = await this.supabase .from("goals") .delete() diff --git a/src/lib/database.ts b/src/lib/database.ts index 595d3ce..2daf12f 100644 --- a/src/lib/database.ts +++ b/src/lib/database.ts @@ -5,14 +5,15 @@ import { GoalStatus, type Goal, type Memory, - type Relationship + type Relationship, } from "./types"; export abstract class DatabaseAdapter { abstract getAccountById(userId: UUID): Promise; + abstract createAccount(account: Account): Promise; - abstract getMemoriesByRoomId(params: { + abstract getMemories(params: { room_id: UUID; count?: number; unique?: boolean; @@ -57,6 +58,7 @@ export abstract class DatabaseAdapter { match_count: number; unique: boolean; }): Promise; + abstract updateGoalStatus(params: { goalId: UUID; status: GoalStatus; @@ -81,12 +83,9 @@ export abstract class DatabaseAdapter { abstract removeMemory(memoryId: UUID, tableName: string): Promise; - abstract removeAllMemoriesByRoomId( - room_id: UUID, - tableName: string, - ): Promise; + abstract removeAllMemories(room_id: UUID, tableName: string): Promise; - abstract countMemoriesByRoomId( + abstract countMemories( room_id: UUID, unique?: boolean, tableName?: string, @@ -105,7 +104,7 @@ export abstract class DatabaseAdapter { abstract removeGoal(goalId: UUID): Promise; - abstract removeAllGoalsByRoomId(room_id: UUID): Promise; + abstract removeAllGoals(room_id: UUID): Promise; abstract createRoom(name: string): Promise; diff --git a/src/lib/evaluators/__tests__/fact.test.ts b/src/lib/evaluators/__tests__/fact.test.ts index ec53e2d..34861af 100644 --- a/src/lib/evaluators/__tests__/fact.test.ts +++ b/src/lib/evaluators/__tests__/fact.test.ts @@ -103,8 +103,8 @@ describe("Facts Evaluator", () => { }); async function cleanup(runtime: BgentRuntime, room_id: UUID) { - await runtime.factManager.removeAllMemoriesByRoomId(room_id); - await runtime.messageManager.removeAllMemoriesByRoomId(room_id); + await runtime.factManager.removeAllMemories(room_id); + await runtime.messageManager.removeAllMemories(room_id); } async function addFacts( diff --git a/src/lib/evaluators/__tests__/goal.test.ts b/src/lib/evaluators/__tests__/goal.test.ts index 67a0e6d..0a7bb10 100644 --- a/src/lib/evaluators/__tests__/goal.test.ts +++ b/src/lib/evaluators/__tests__/goal.test.ts @@ -49,7 +49,7 @@ describe("Goals Evaluator", () => { async function cleanup() { // delete all goals for the user - await runtime.databaseAdapter.removeAllMemoriesByRoomId(room_id, "goals"); + await runtime.databaseAdapter.removeAllMemories(room_id, "goals"); } async function createTestGoal(name: string, objectives: Objective[]) { diff --git a/src/lib/evaluators/fact.ts b/src/lib/evaluators/fact.ts index 68cf5c2..a652b32 100644 --- a/src/lib/evaluators/fact.ts +++ b/src/lib/evaluators/fact.ts @@ -130,7 +130,7 @@ export default { // eslint-disable-next-line @typescript-eslint/no-unused-vars message: Message, ): Promise => { - const messageCount = (await runtime.messageManager.countMemoriesByRoomId( + const messageCount = (await runtime.messageManager.countMemories( message.room_id, )) as number; diff --git a/src/lib/memory.ts b/src/lib/memory.ts index 3626c1d..ae1196c 100644 --- a/src/lib/memory.ts +++ b/src/lib/memory.ts @@ -65,7 +65,7 @@ export class MemoryManager { * @param opts.unique Whether to retrieve unique memories only. * @returns A Promise resolving to an array of Memory objects. */ - async getMemoriesByRoomId({ + async getMemories({ room_id, count = 10, unique = true, @@ -74,7 +74,7 @@ export class MemoryManager { count?: number; unique?: boolean; }): Promise { - const result = await this.runtime.databaseAdapter.getMemoriesByRoomId({ + const result = await this.runtime.databaseAdapter.getMemories({ room_id, count, unique, @@ -169,8 +169,8 @@ export class MemoryManager { * @param room_id The room ID to remove memories for. * @returns A Promise that resolves when the operation completes. */ - async removeAllMemoriesByRoomId(room_id: UUID): Promise { - await this.runtime.databaseAdapter.removeAllMemoriesByRoomId( + async removeAllMemories(room_id: UUID): Promise { + await this.runtime.databaseAdapter.removeAllMemories( room_id, this.tableName, ); @@ -182,8 +182,8 @@ export class MemoryManager { * @param unique Whether to count unique memories only. * @returns A Promise resolving to the count of memories. */ - async countMemoriesByRoomId(room_id: UUID, unique = true): Promise { - return await this.runtime.databaseAdapter.countMemoriesByRoomId( + async countMemories(room_id: UUID, unique = true): Promise { + return await this.runtime.databaseAdapter.countMemories( room_id, unique, this.tableName, diff --git a/src/lib/runtime.ts b/src/lib/runtime.ts index cb6a96d..ef6fc72 100644 --- a/src/lib/runtime.ts +++ b/src/lib/runtime.ts @@ -461,12 +461,12 @@ export class BgentRuntime { ]: [Actor[], Memory[], Memory[], Goal[], Memory[], string] = await Promise.all([ getActorDetails({ runtime: this, room_id }), - this.messageManager.getMemoriesByRoomId({ + this.messageManager.getMemories({ room_id, count: recentMessageCount, unique: false, }), - this.factManager.getMemoriesByRoomId({ + this.factManager.getMemories({ room_id, count: recentFactsCount, }), diff --git a/src/lib/types.ts b/src/lib/types.ts index bac689e..9e8636c 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -202,7 +202,7 @@ export interface Relationship { export interface Account { id: UUID; name: string; - details?: string; + details?: { [key: string]: unknown }; email?: string; avatar_url?: string; }