@elizaos/plugin-inmemorydb 2.0.0-beta.1 → 2.0.3-beta.3

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.
@@ -1,14 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../index.ts", "../../adapter.ts", "../../hnsw.ts", "../../types.ts", "../../storage-memory.ts"],
4
- "sourcesContent": [
5
- "import {\n type IAgentRuntime,\n type IDatabaseAdapter,\n logger,\n type Plugin,\n type UUID,\n} from \"@elizaos/core\";\nimport { InMemoryDatabaseAdapter } from \"./adapter\";\nimport { MemoryStorage } from \"./storage-memory\";\n\nconst GLOBAL_SINGLETONS = Symbol.for(\"elizaos.plugin-inmemorydb.global-singletons\");\ntype GlobalSymbols = typeof globalThis & {\n [GLOBAL_SINGLETONS]?: {\n storageManager?: MemoryStorage;\n };\n};\nconst globalSymbols: GlobalSymbols = globalThis as GlobalSymbols;\n\nif (!globalSymbols[GLOBAL_SINGLETONS]) {\n globalSymbols[GLOBAL_SINGLETONS] = {};\n}\nconst globalSingletons = globalSymbols[GLOBAL_SINGLETONS];\n\nexport function createDatabaseAdapter(agentId: UUID): InMemoryDatabaseAdapter {\n if (!globalSingletons.storageManager) {\n globalSingletons.storageManager = new MemoryStorage();\n }\n return new InMemoryDatabaseAdapter(globalSingletons.storageManager, agentId);\n}\n\n// `IAgentRuntime` historically didn't expose `registerDatabaseAdapter` on the\n// public type — at runtime it does. We narrow the runtime to the registration\n// surface we need and call it defensively so the plugin still loads against\n// runtimes that don't accept adapter registration.\ntype RuntimeWithRegister = IAgentRuntime & {\n registerDatabaseAdapter?: (adapter: IDatabaseAdapter) => void;\n adapter?: IDatabaseAdapter;\n databaseAdapter?: IDatabaseAdapter;\n hasDatabaseAdapter?: () => boolean;\n};\n\nexport const plugin: Plugin = {\n name: \"@elizaos/plugin-inmemorydb\",\n description: \"Pure in-memory, ephemeral database storage for elizaOS - no persistence\",\n\n async init(_config: Record<string, string>, runtime: IAgentRuntime): Promise<void> {\n logger.info({ src: \"plugin:inmemorydb\" }, \"Initializing in-memory database plugin\");\n\n const r = runtime as RuntimeWithRegister;\n const hasAdapter =\n r.adapter !== undefined ||\n r.databaseAdapter !== undefined ||\n (r.hasDatabaseAdapter?.() ?? false);\n\n if (hasAdapter) {\n logger.debug(\n { src: \"plugin:inmemorydb\" },\n \"Database adapter already exists, skipping initialization\"\n );\n return;\n }\n\n const adapter = createDatabaseAdapter(runtime.agentId);\n await adapter.initialize();\n r.registerDatabaseAdapter?.(adapter);\n\n logger.success(\n { src: \"plugin:inmemorydb\" },\n \"In-memory database adapter registered successfully\"\n );\n },\n};\n\nexport { InMemoryDatabaseAdapter } from \"./adapter\";\nexport { EphemeralHNSW } from \"./hnsw\";\nexport { MemoryStorage } from \"./storage-memory\";\nexport * from \"./types\";\n\nexport default plugin;\n",
6
- "/**\n * InMemoryDatabaseAdapter\n *\n * Pure in-memory, ephemeral implementation of the elizaOS `DatabaseAdapter`\n * abstract base. Backed by `MemoryStorage` (a Map-of-Maps) for record CRUD and\n * `EphemeralHNSW` for vector search. No persistence, no migrations, no\n * transaction atomicity — intended for tests, scenarios, and short-lived\n * one-shot runs where speed and zero setup matter more than durability.\n *\n * Implements the full batch-first interface from `@elizaos/core`'s\n * `DatabaseAdapter`. Single-item helpers from earlier revisions of this plugin\n * have been removed — call sites should use the batch APIs (`createEntities`,\n * `getMemoriesByIds`, etc.).\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport {\n type Agent,\n type Component,\n type Content,\n DatabaseAdapter,\n type EntitiesForRoomsResult,\n type Entity,\n type IDatabaseAdapter,\n type JsonValue,\n type Log,\n type LogBody,\n logger,\n type Memory,\n type MemoryMetadata,\n type MemoryTypeAlias,\n type Metadata,\n type PairingAllowlistEntry,\n type PairingAllowlistsResult,\n type PairingChannel,\n type PairingRequest,\n type PairingRequestsResult,\n type Participant,\n type ParticipantsForRoomsResult,\n type ParticipantUpdateFields,\n type ParticipantUserState,\n type PatchOp,\n type Relationship,\n type Room,\n type Task,\n type UUID,\n type World,\n} from \"@elizaos/core\";\nimport { EphemeralHNSW } from \"./hnsw\";\nimport { COLLECTIONS, type IStorage } from \"./types\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Internal stored shapes\n// ────────────────────────────────────────────────────────────────────────────\n\ninterface StoredParticipant {\n id: string;\n entityId: string;\n roomId: string;\n userState?: ParticipantUserState;\n metadata?: Record<string, unknown>;\n}\n\ninterface StoredMemory {\n id?: string;\n entityId: string;\n agentId?: string;\n createdAt?: number;\n content: Content;\n embedding?: number[];\n roomId: string;\n worldId?: string;\n unique?: boolean;\n similarity?: number;\n metadata?: MemoryMetadata;\n}\n\ninterface StoredRelationship {\n id: string;\n sourceEntityId: string;\n targetEntityId: string;\n agentId?: string;\n tags?: string[];\n metadata?: Metadata;\n createdAt?: string;\n}\n\ninterface StoredCacheEntry<T = unknown> {\n value: T;\n expiresAt?: number;\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction toMemory(stored: StoredMemory): Memory {\n return {\n id: stored.id as UUID | undefined,\n entityId: stored.entityId as UUID,\n agentId: stored.agentId as UUID | undefined,\n createdAt: stored.createdAt,\n content: stored.content,\n embedding: stored.embedding,\n roomId: stored.roomId as UUID,\n worldId: stored.worldId as UUID | undefined,\n unique: stored.unique,\n similarity: stored.similarity,\n metadata: stored.metadata,\n };\n}\n\nfunction relationshipFromStored(r: StoredRelationship, fallbackAgentId: UUID): Relationship {\n return {\n id: r.id as UUID,\n sourceEntityId: r.sourceEntityId as UUID,\n targetEntityId: r.targetEntityId as UUID,\n agentId: (r.agentId as UUID) ?? fallbackAgentId,\n tags: r.tags ?? [],\n metadata: r.metadata ?? {},\n createdAt: r.createdAt,\n };\n}\n\n/**\n * Apply a single JSON patch operation to a deeply-nested target object,\n * resolving the dot-separated `path` to a leaf and mutating in place.\n *\n * This is a best-effort implementation that mirrors what Postgres's JSONB\n * patch operators do for the SQL adapter. It supports `set`, `push`,\n * `remove`, and `increment`.\n */\nfunction applyPatchOp(target: Record<string, unknown>, op: PatchOp): void {\n if (!op.path) return;\n const parts = op.path.split(\".\");\n const last = parts.pop();\n if (last === undefined) return;\n\n let parent: Record<string, unknown> = target;\n for (const segment of parts) {\n const next = parent[segment];\n if (next === null || typeof next !== \"object\") {\n const created: Record<string, unknown> = {};\n parent[segment] = created;\n parent = created;\n } else {\n parent = next as Record<string, unknown>;\n }\n }\n\n switch (op.op) {\n case \"set\":\n parent[last] = op.value;\n break;\n case \"remove\":\n delete parent[last];\n break;\n case \"push\": {\n const existing = parent[last];\n if (Array.isArray(existing)) {\n existing.push(op.value);\n } else {\n parent[last] = [op.value];\n }\n break;\n }\n case \"increment\": {\n const existing = parent[last];\n const delta = typeof op.value === \"number\" ? op.value : 1;\n parent[last] = typeof existing === \"number\" ? existing + delta : delta;\n break;\n }\n }\n}\n\nfunction levenshtein(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n const prev = new Array(b.length + 1);\n const curr = new Array(b.length + 1);\n for (let j = 0; j <= b.length; j++) prev[j] = j;\n for (let i = 1; i <= a.length; i++) {\n curr[0] = i;\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);\n }\n for (let j = 0; j <= b.length; j++) prev[j] = curr[j];\n }\n return curr[b.length];\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Adapter\n// ────────────────────────────────────────────────────────────────────────────\n\nexport class InMemoryDatabaseAdapter extends DatabaseAdapter<IStorage> {\n private storage: IStorage;\n private vectorIndex: EphemeralHNSW;\n private embeddingDimension = 384;\n private ready = false;\n private readonly agentId: UUID;\n\n constructor(storage: IStorage, agentId: UUID) {\n super();\n this.storage = storage;\n this.agentId = agentId;\n this.db = storage;\n this.vectorIndex = new EphemeralHNSW();\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────\n\n async initialize(_config?: Record<string, string | number | boolean | null>): Promise<void> {\n await this.storage.init();\n await this.vectorIndex.init(this.embeddingDimension);\n this.ready = true;\n logger.info({ src: \"plugin:inmemorydb\" }, \"In-memory database initialized\");\n }\n\n /** Backward-compat alias used by `plugin-inmemorydb`'s plugin init hook. */\n async init(): Promise<void> {\n await this.initialize();\n }\n\n async runPluginMigrations(\n _plugins: Array<{ name: string; schema?: Record<string, JsonValue> }>,\n _options?: { verbose?: boolean; force?: boolean; dryRun?: boolean }\n ): Promise<void> {\n logger.debug(\n { src: \"plugin:inmemorydb\" },\n \"Plugin migrations not needed for in-memory storage\"\n );\n }\n\n async isReady(): Promise<boolean> {\n return this.ready && (await this.storage.isReady());\n }\n\n async close(): Promise<void> {\n await this.vectorIndex.clear();\n await this.storage.close();\n this.ready = false;\n logger.info({ src: \"plugin:inmemorydb\" }, \"In-memory database closed\");\n }\n\n async getConnection(): Promise<IStorage> {\n return this.storage;\n }\n\n // ── Transactions ──────────────────────────────────────────────────────\n // No atomicity guarantees: just invoke the callback with `this`. This\n // matches what other in-memory adapters do — callers that need real\n // transactions should use a real database backend.\n\n async transaction<T>(\n callback: (tx: IDatabaseAdapter<IStorage>) => Promise<T>,\n _options?: { entityContext?: UUID }\n ): Promise<T> {\n return callback(this as IDatabaseAdapter<IStorage>);\n }\n\n // ── Embedding ─────────────────────────────────────────────────────────\n\n async ensureEmbeddingDimension(dimension: number): Promise<void> {\n if (this.embeddingDimension !== dimension) {\n this.embeddingDimension = dimension;\n await this.vectorIndex.init(dimension);\n }\n }\n\n // ── Entity CRUD ───────────────────────────────────────────────────────\n\n async createEntities(entities: Entity[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const entity of entities) {\n const id = (entity.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.ENTITIES, id, { ...entity, id });\n ids.push(id);\n }\n return ids;\n }\n\n async upsertEntities(entities: Entity[]): Promise<void> {\n for (const entity of entities) {\n if (!entity.id) continue;\n const existing = await this.storage.get<Entity>(COLLECTIONS.ENTITIES, entity.id);\n await this.storage.set(COLLECTIONS.ENTITIES, entity.id, {\n ...(existing ?? {}),\n ...entity,\n });\n }\n }\n\n async getEntitiesByIds(entityIds: UUID[]): Promise<Entity[]> {\n const entities: Entity[] = [];\n for (const id of entityIds) {\n const entity = await this.storage.get<Entity>(COLLECTIONS.ENTITIES, id);\n if (entity) entities.push(entity);\n }\n return entities;\n }\n\n async updateEntities(entities: Entity[]): Promise<void> {\n for (const entity of entities) {\n if (!entity.id) continue;\n const existing = await this.storage.get<Entity>(COLLECTIONS.ENTITIES, entity.id);\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.ENTITIES, entity.id, {\n ...existing,\n ...entity,\n });\n }\n }\n\n async deleteEntities(entityIds: UUID[]): Promise<void> {\n for (const id of entityIds) {\n await this.storage.delete(COLLECTIONS.ENTITIES, id);\n }\n }\n\n async getEntitiesForRooms(\n roomIds: UUID[],\n includeComponents = false\n ): Promise<EntitiesForRoomsResult> {\n const result: EntitiesForRoomsResult = [];\n for (const roomId of roomIds) {\n const participants = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.roomId === roomId\n );\n const entityIds = [...new Set(participants.map((p) => p.entityId))] as UUID[];\n const entities = await this.getEntitiesByIds(entityIds);\n\n if (includeComponents) {\n for (const entity of entities) {\n if (!entity.id) continue;\n const components = await this.getComponentsForEntities([entity.id]);\n (entity as Entity & { components?: Component[] }).components = components;\n }\n }\n\n result.push({ roomId, entities });\n }\n return result;\n }\n\n async getEntitiesByNames(params: { names: string[]; agentId: UUID }): Promise<Entity[]> {\n if (params.names.length === 0) return [];\n const set = new Set(params.names);\n return this.storage.getWhere<Entity>(COLLECTIONS.ENTITIES, (e) => {\n const names = (e as Entity & { names?: string[] }).names ?? [];\n return names.some((name) => set.has(name));\n });\n }\n\n async searchEntitiesByName(params: {\n query: string;\n agentId: UUID;\n limit?: number;\n }): Promise<Entity[]> {\n const q = params.query.toLowerCase();\n const matches = await this.storage.getWhere<Entity>(COLLECTIONS.ENTITIES, (e) => {\n const names = (e as Entity & { names?: string[] }).names ?? [];\n return names.some((name) => name.toLowerCase().includes(q));\n });\n return params.limit ? matches.slice(0, params.limit) : matches;\n }\n\n async queryEntities(params: {\n componentType?: string;\n componentDataFilter?: Record<string, unknown>;\n agentId?: UUID;\n entityIds?: UUID[];\n worldId?: UUID;\n limit?: number;\n offset?: number;\n includeAllComponents?: boolean;\n entityContext?: UUID;\n }): Promise<Entity[]> {\n let entityIds: UUID[];\n if (params.entityIds && params.entityIds.length > 0) {\n entityIds = params.entityIds;\n } else {\n const allComponents = await this.storage.getWhere<Component>(COLLECTIONS.COMPONENTS, (c) => {\n if (params.componentType && c.type !== params.componentType) return false;\n if (params.worldId && c.worldId !== params.worldId) return false;\n if (params.componentDataFilter) {\n const data = (c as Component & { data?: Record<string, unknown> }).data;\n if (!data || typeof data !== \"object\") return false;\n for (const [k, v] of Object.entries(params.componentDataFilter)) {\n if (data[k] !== v) return false;\n }\n }\n return true;\n });\n entityIds = [...new Set(allComponents.map((c) => c.entityId as UUID))];\n }\n\n const offset = params.offset ?? 0;\n const limit = params.limit;\n const sliced =\n limit !== undefined ? entityIds.slice(offset, offset + limit) : entityIds.slice(offset);\n\n const entities = await this.getEntitiesByIds(sliced);\n if (params.includeAllComponents) {\n for (const entity of entities) {\n if (!entity.id) continue;\n const components = await this.getComponentsForEntities([entity.id]);\n (entity as Entity & { components?: Component[] }).components = components;\n }\n }\n return entities;\n }\n\n // ── Component CRUD ────────────────────────────────────────────────────\n\n async createComponents(components: Component[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const component of components) {\n const id = (component.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.COMPONENTS, id, { ...component, id });\n ids.push(id);\n }\n return ids;\n }\n\n async getComponentsByIds(componentIds: UUID[]): Promise<Component[]> {\n const components: Component[] = [];\n for (const id of componentIds) {\n const c = await this.storage.get<Component>(COLLECTIONS.COMPONENTS, id);\n if (c) components.push(c);\n }\n return components;\n }\n\n async updateComponents(components: Component[]): Promise<void> {\n for (const component of components) {\n if (!component.id) continue;\n const existing = await this.storage.get<Component>(COLLECTIONS.COMPONENTS, component.id);\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.COMPONENTS, component.id, {\n ...existing,\n ...component,\n });\n }\n }\n\n async deleteComponents(componentIds: UUID[]): Promise<void> {\n for (const id of componentIds) {\n await this.storage.delete(COLLECTIONS.COMPONENTS, id);\n }\n }\n\n async upsertComponents(\n components: Component[],\n _options?: { entityContext?: UUID }\n ): Promise<void> {\n for (const component of components) {\n const naturalKey = await this.storage.getWhere<Component>(\n COLLECTIONS.COMPONENTS,\n (c) =>\n c.entityId === component.entityId &&\n c.type === component.type &&\n (c.worldId ?? null) === (component.worldId ?? null) &&\n (c.sourceEntityId ?? null) === (component.sourceEntityId ?? null)\n );\n\n const existing = naturalKey[0];\n if (existing) {\n await this.storage.set(COLLECTIONS.COMPONENTS, existing.id, {\n ...existing,\n ...component,\n id: existing.id,\n });\n } else {\n const id = (component.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.COMPONENTS, id, {\n ...component,\n id,\n });\n }\n }\n }\n\n async patchComponents(\n updates: Array<{ componentId: UUID; ops: PatchOp[] }>,\n _options?: { entityContext?: UUID }\n ): Promise<void> {\n for (const update of updates) {\n const component = await this.storage.get<Component>(\n COLLECTIONS.COMPONENTS,\n update.componentId\n );\n if (!component) continue;\n const data = { ...(component.data ?? {}) } as Record<string, unknown>;\n for (const op of update.ops) {\n applyPatchOp(data, op);\n }\n component.data = data as Component[\"data\"];\n await this.storage.set(COLLECTIONS.COMPONENTS, update.componentId, component);\n }\n }\n\n async getComponentsByNaturalKeys(\n keys: Array<{\n entityId: UUID;\n type: string;\n worldId?: UUID;\n sourceEntityId?: UUID;\n }>\n ): Promise<(Component | null)[]> {\n const result: (Component | null)[] = [];\n for (const key of keys) {\n const matches = await this.storage.getWhere<Component>(\n COLLECTIONS.COMPONENTS,\n (c) =>\n c.entityId === key.entityId &&\n c.type === key.type &&\n (c.worldId ?? null) === (key.worldId ?? null) &&\n (c.sourceEntityId ?? null) === (key.sourceEntityId ?? null)\n );\n result.push(matches[0] ?? null);\n }\n return result;\n }\n\n async getComponentsForEntities(\n entityIds: UUID[],\n worldId?: UUID,\n sourceEntityId?: UUID\n ): Promise<Component[]> {\n if (entityIds.length === 0) return [];\n const idSet = new Set(entityIds);\n return this.storage.getWhere<Component>(COLLECTIONS.COMPONENTS, (c) => {\n if (!idSet.has(c.entityId as UUID)) return false;\n if (worldId !== undefined && c.worldId !== worldId) return false;\n if (sourceEntityId !== undefined && c.sourceEntityId !== sourceEntityId) return false;\n return true;\n });\n }\n\n // ── Memory CRUD ───────────────────────────────────────────────────────\n\n async getMemories(params: {\n entityId?: UUID;\n agentId?: UUID;\n limit?: number;\n count?: number;\n offset?: number;\n unique?: boolean;\n tableName: string;\n start?: number;\n end?: number;\n roomId?: UUID;\n worldId?: UUID;\n metadata?: Record<string, unknown>;\n }): Promise<Memory[]> {\n let memories = await this.storage.getWhere<StoredMemory>(COLLECTIONS.MEMORIES, (m) => {\n if (params.entityId && m.entityId !== params.entityId) return false;\n if (params.agentId && m.agentId !== params.agentId) return false;\n if (params.roomId && m.roomId !== params.roomId) return false;\n if (params.worldId && m.worldId !== params.worldId) return false;\n if (params.tableName && m.metadata?.type !== params.tableName) return false;\n if (params.start && m.createdAt && m.createdAt < params.start) return false;\n if (params.end && m.createdAt && m.createdAt > params.end) return false;\n if (params.unique && !m.unique) return false;\n if (params.metadata) {\n const md = (m.metadata ?? {}) as Record<string, unknown>;\n for (const [k, v] of Object.entries(params.metadata)) {\n if (md[k] !== v) return false;\n }\n }\n return true;\n });\n\n memories.sort((a, b) => (b.createdAt ?? 0) - (a.createdAt ?? 0));\n\n const offset = params.offset ?? 0;\n const limit = params.limit ?? params.count;\n if (offset > 0) memories = memories.slice(offset);\n if (limit !== undefined) memories = memories.slice(0, limit);\n\n return memories.map(toMemory);\n }\n\n async getMemoriesByRoomIds(params: {\n roomIds: UUID[];\n tableName: string;\n limit?: number;\n }): Promise<Memory[]> {\n if (params.roomIds.length === 0) return [];\n const roomSet = new Set(params.roomIds);\n const memories = await this.storage.getWhere<StoredMemory>(\n COLLECTIONS.MEMORIES,\n (m) =>\n roomSet.has(m.roomId as UUID) &&\n (params.tableName ? m.metadata?.type === params.tableName : true)\n );\n memories.sort((a, b) => (b.createdAt ?? 0) - (a.createdAt ?? 0));\n const sliced = params.limit ? memories.slice(0, params.limit) : memories;\n return sliced.map(toMemory);\n }\n\n async getMemoriesByIds(memoryIds: UUID[], tableName?: string): Promise<Memory[]> {\n const memories: Memory[] = [];\n for (const id of memoryIds) {\n const m = await this.storage.get<StoredMemory>(COLLECTIONS.MEMORIES, id);\n if (!m) continue;\n if (tableName && m.metadata?.type !== tableName) continue;\n memories.push(toMemory(m));\n }\n return memories;\n }\n\n async getCachedEmbeddings(params: {\n query_table_name: string;\n query_threshold: number;\n query_input: string;\n query_field_name: string;\n query_field_sub_name: string;\n query_match_count: number;\n }): Promise<{ embedding: number[]; levenshtein_score: number }[]> {\n const memories = await this.storage.getWhere<StoredMemory>(\n COLLECTIONS.MEMORIES,\n (m) => m.metadata?.type === params.query_table_name && !!m.embedding\n );\n\n const results: { embedding: number[]; levenshtein_score: number }[] = [];\n for (const memory of memories) {\n if (!memory.embedding) continue;\n const record = memory as StoredMemory & Record<string, unknown>;\n const fieldValue = record[params.query_field_name];\n const text = String(fieldValue ?? \"\");\n const score = levenshtein(params.query_input, text);\n if (score <= params.query_threshold) {\n results.push({ embedding: memory.embedding, levenshtein_score: score });\n }\n }\n results.sort((a, b) => a.levenshtein_score - b.levenshtein_score);\n return results.slice(0, params.query_match_count);\n }\n\n async searchMemories(params: {\n tableName: string;\n embedding: number[];\n match_threshold?: number;\n limit?: number;\n unique?: boolean;\n query?: string;\n roomId?: UUID;\n worldId?: UUID;\n entityId?: UUID;\n }): Promise<Memory[]> {\n const threshold = params.match_threshold ?? 0.5;\n const limit = params.limit ?? 10;\n\n const results = await this.vectorIndex.search(params.embedding, limit * 2, threshold);\n\n const memories: Memory[] = [];\n for (const result of results) {\n const memory = await this.storage.get<StoredMemory>(COLLECTIONS.MEMORIES, result.id);\n if (!memory) continue;\n if (params.tableName && memory.metadata?.type !== params.tableName) continue;\n if (params.roomId && memory.roomId !== params.roomId) continue;\n if (params.worldId && memory.worldId !== params.worldId) continue;\n if (params.entityId && memory.entityId !== params.entityId) continue;\n if (params.unique && !memory.unique) continue;\n memories.push({ ...toMemory(memory), similarity: result.similarity });\n }\n\n return memories.slice(0, limit);\n }\n\n async createMemories(\n memories: Array<{ memory: Memory; tableName: string; unique?: boolean }>\n ): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const { memory, tableName, unique = false } of memories) {\n const id = (memory.id ?? randomUUID()) as UUID;\n const stored: StoredMemory = {\n ...memory,\n id,\n agentId: memory.agentId ?? this.agentId,\n unique: unique || memory.unique,\n createdAt: memory.createdAt ?? Date.now(),\n metadata: {\n ...(memory.metadata ?? {}),\n type: tableName as MemoryTypeAlias,\n } as MemoryMetadata,\n };\n await this.storage.set(COLLECTIONS.MEMORIES, id, stored);\n if (memory.embedding && memory.embedding.length > 0) {\n await this.vectorIndex.add(id, memory.embedding);\n }\n ids.push(id);\n }\n return ids;\n }\n\n async updateMemories(\n memories: Array<Partial<Memory> & { id: UUID; metadata?: MemoryMetadata }>\n ): Promise<void> {\n for (const memory of memories) {\n const existing = await this.storage.get<StoredMemory>(COLLECTIONS.MEMORIES, memory.id);\n if (!existing) continue;\n const updated: StoredMemory = {\n ...existing,\n ...memory,\n metadata: {\n ...(existing.metadata ?? {}),\n ...(memory.metadata ?? {}),\n } as MemoryMetadata,\n };\n await this.storage.set(COLLECTIONS.MEMORIES, memory.id, updated);\n if (memory.embedding && memory.embedding.length > 0) {\n await this.vectorIndex.add(memory.id, memory.embedding);\n }\n }\n }\n\n async upsertMemories(\n memories: Array<{ memory: Memory; tableName: string }>,\n _options?: { entityContext?: UUID }\n ): Promise<void> {\n for (const { memory, tableName } of memories) {\n if (!memory.id) {\n await this.createMemories([{ memory, tableName }]);\n continue;\n }\n const existing = await this.storage.get<StoredMemory>(COLLECTIONS.MEMORIES, memory.id);\n const stored: StoredMemory = {\n ...(existing ?? {}),\n ...memory,\n agentId: memory.agentId ?? existing?.agentId ?? this.agentId,\n createdAt: memory.createdAt ?? existing?.createdAt ?? Date.now(),\n metadata: {\n ...(existing?.metadata ?? {}),\n ...(memory.metadata ?? {}),\n type: tableName as MemoryTypeAlias,\n } as MemoryMetadata,\n };\n await this.storage.set(COLLECTIONS.MEMORIES, memory.id, stored);\n if (memory.embedding && memory.embedding.length > 0) {\n await this.vectorIndex.add(memory.id, memory.embedding);\n }\n }\n }\n\n async deleteMemories(memoryIds: UUID[]): Promise<void> {\n for (const id of memoryIds) {\n await this.storage.delete(COLLECTIONS.MEMORIES, id);\n await this.vectorIndex.remove(id);\n }\n }\n\n async deleteAllMemories(roomIds: UUID[], tableName: string): Promise<void> {\n if (roomIds.length === 0) return;\n const roomSet = new Set(roomIds);\n const memories = await this.storage.getWhere<StoredMemory>(\n COLLECTIONS.MEMORIES,\n (m) => roomSet.has(m.roomId as UUID) && (tableName ? m.metadata?.type === tableName : true)\n );\n const ids = memories.map((m) => m.id).filter((id): id is string => id !== undefined) as UUID[];\n await this.deleteMemories(ids);\n }\n\n async countMemories(params: {\n roomIds?: UUID[];\n unique?: boolean;\n tableName?: string;\n entityId?: UUID;\n agentId?: UUID;\n metadata?: Record<string, unknown>;\n }): Promise<number> {\n const roomSet = params.roomIds ? new Set(params.roomIds) : null;\n return this.storage.count<StoredMemory>(COLLECTIONS.MEMORIES, (m) => {\n if (roomSet && !roomSet.has(m.roomId as UUID)) return false;\n if (params.unique && !m.unique) return false;\n if (params.tableName && m.metadata?.type !== params.tableName) return false;\n if (params.entityId && m.entityId !== params.entityId) return false;\n if (params.agentId && m.agentId !== params.agentId) return false;\n if (params.metadata) {\n const md = (m.metadata ?? {}) as Record<string, unknown>;\n for (const [k, v] of Object.entries(params.metadata)) {\n if (md[k] !== v) return false;\n }\n }\n return true;\n });\n }\n\n async getMemoriesByWorldId(params: {\n worldIds?: UUID[];\n limit?: number;\n tableName?: string;\n }): Promise<Memory[]> {\n const worldSet = params.worldIds ? new Set(params.worldIds) : null;\n const memories = await this.storage.getWhere<StoredMemory>(\n COLLECTIONS.MEMORIES,\n (m) =>\n (!worldSet || (m.worldId ? worldSet.has(m.worldId as UUID) : false)) &&\n (params.tableName ? m.metadata?.type === params.tableName : true)\n );\n memories.sort((a, b) => (b.createdAt ?? 0) - (a.createdAt ?? 0));\n const sliced = params.limit ? memories.slice(0, params.limit) : memories;\n return sliced.map(toMemory);\n }\n\n // ── Log CRUD ──────────────────────────────────────────────────────────\n\n async getLogs(params: {\n entityId?: UUID;\n roomId?: UUID;\n type?: string;\n limit?: number;\n offset?: number;\n }): Promise<Log[]> {\n let logs = await this.storage.getWhere<Log>(COLLECTIONS.LOGS, (l) => {\n if (params.entityId && l.entityId !== params.entityId) return false;\n if (params.roomId && l.roomId !== params.roomId) return false;\n if (params.type && l.type !== params.type) return false;\n return true;\n });\n logs.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n const offset = params.offset ?? 0;\n if (offset > 0) logs = logs.slice(offset);\n if (params.limit !== undefined) logs = logs.slice(0, params.limit);\n return logs;\n }\n\n async createLogs(\n params: Array<{\n body: LogBody;\n entityId: UUID;\n roomId: UUID;\n type: string;\n }>\n ): Promise<void> {\n for (const entry of params) {\n const id = randomUUID() as UUID;\n const log: Log = {\n id,\n entityId: entry.entityId,\n roomId: entry.roomId,\n body: entry.body,\n type: entry.type,\n createdAt: new Date(),\n };\n await this.storage.set(COLLECTIONS.LOGS, id, log);\n }\n }\n\n async getLogsByIds(logIds: UUID[]): Promise<Log[]> {\n const logs: Log[] = [];\n for (const id of logIds) {\n const log = await this.storage.get<Log>(COLLECTIONS.LOGS, id);\n if (log) logs.push(log);\n }\n return logs;\n }\n\n async updateLogs(logs: Array<{ id: UUID; updates: Partial<Log> }>): Promise<void> {\n for (const { id, updates } of logs) {\n const existing = await this.storage.get<Log>(COLLECTIONS.LOGS, id);\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.LOGS, id, { ...existing, ...updates });\n }\n }\n\n async deleteLogs(logIds: UUID[]): Promise<void> {\n for (const id of logIds) {\n await this.storage.delete(COLLECTIONS.LOGS, id);\n }\n }\n\n // ── World CRUD ────────────────────────────────────────────────────────\n\n async getAllWorlds(): Promise<World[]> {\n return this.storage.getAll<World>(COLLECTIONS.WORLDS);\n }\n\n async getWorldsByIds(worldIds: UUID[]): Promise<World[]> {\n const worlds: World[] = [];\n for (const id of worldIds) {\n const w = await this.storage.get<World>(COLLECTIONS.WORLDS, id);\n if (w) worlds.push(w);\n }\n return worlds;\n }\n\n async createWorlds(worlds: World[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const world of worlds) {\n const id = (world.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.WORLDS, id, { ...world, id });\n ids.push(id);\n }\n return ids;\n }\n\n async deleteWorlds(worldIds: UUID[]): Promise<void> {\n for (const id of worldIds) {\n await this.storage.delete(COLLECTIONS.WORLDS, id);\n }\n }\n\n async updateWorlds(worlds: World[]): Promise<void> {\n for (const world of worlds) {\n if (!world.id) continue;\n const existing = await this.storage.get<World>(COLLECTIONS.WORLDS, world.id);\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.WORLDS, world.id, {\n ...existing,\n ...world,\n });\n }\n }\n\n async upsertWorlds(worlds: World[]): Promise<void> {\n for (const world of worlds) {\n const id = (world.id ?? randomUUID()) as UUID;\n const existing = await this.storage.get<World>(COLLECTIONS.WORLDS, id);\n await this.storage.set(COLLECTIONS.WORLDS, id, {\n ...(existing ?? {}),\n ...world,\n id,\n });\n }\n }\n\n // ── Room CRUD ─────────────────────────────────────────────────────────\n\n async getRoomsByIds(roomIds: UUID[]): Promise<Room[]> {\n const rooms: Room[] = [];\n for (const id of roomIds) {\n const room = await this.storage.get<Room>(COLLECTIONS.ROOMS, id);\n if (room) rooms.push(room);\n }\n return rooms;\n }\n\n async deleteRoomsByWorldIds(worldIds: UUID[]): Promise<void> {\n if (worldIds.length === 0) return;\n const worldSet = new Set(worldIds);\n const rooms = await this.storage.getWhere<Room>(COLLECTIONS.ROOMS, (r) =>\n r.worldId ? worldSet.has(r.worldId as UUID) : false\n );\n const roomIds = rooms.map((r) => r.id).filter((id): id is UUID => id !== undefined);\n await this.deleteRooms(roomIds);\n }\n\n async getRoomsForParticipants(entityIds: UUID[]): Promise<UUID[]> {\n if (entityIds.length === 0) return [];\n const entitySet = new Set(entityIds);\n const participants = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => entitySet.has(p.entityId as UUID)\n );\n return [...new Set(participants.map((p) => p.roomId as UUID))];\n }\n\n async getRoomsByWorlds(worldIds: UUID[], limit?: number, offset?: number): Promise<Room[]> {\n if (worldIds.length === 0) return [];\n const worldSet = new Set(worldIds);\n let rooms = await this.storage.getWhere<Room>(COLLECTIONS.ROOMS, (r) =>\n r.worldId ? worldSet.has(r.worldId as UUID) : false\n );\n const off = offset ?? 0;\n if (off > 0) rooms = rooms.slice(off);\n if (limit !== undefined) rooms = rooms.slice(0, limit);\n return rooms;\n }\n\n async createRooms(rooms: Room[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const room of rooms) {\n const id = (room.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.ROOMS, id, { ...room, id });\n ids.push(id);\n }\n return ids;\n }\n\n async upsertRooms(rooms: Room[]): Promise<void> {\n for (const room of rooms) {\n const id = (room.id ?? randomUUID()) as UUID;\n const existing = await this.storage.get<Room>(COLLECTIONS.ROOMS, id);\n await this.storage.set(COLLECTIONS.ROOMS, id, {\n ...(existing ?? {}),\n ...room,\n id,\n });\n }\n }\n\n async updateRooms(rooms: Room[]): Promise<void> {\n for (const room of rooms) {\n if (!room.id) continue;\n const existing = await this.storage.get<Room>(COLLECTIONS.ROOMS, room.id);\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.ROOMS, room.id, {\n ...existing,\n ...room,\n });\n }\n }\n\n async deleteRooms(roomIds: UUID[]): Promise<void> {\n if (roomIds.length === 0) return;\n const set = new Set(roomIds);\n for (const id of roomIds) {\n await this.storage.delete(COLLECTIONS.ROOMS, id);\n }\n // Cascade: drop participants and memories belonging to these rooms.\n await this.storage.deleteWhere<StoredParticipant>(COLLECTIONS.PARTICIPANTS, (p) =>\n set.has(p.roomId as UUID)\n );\n await this.storage.deleteWhere<StoredMemory>(COLLECTIONS.MEMORIES, (m) =>\n set.has(m.roomId as UUID)\n );\n }\n\n // ── Participant CRUD ──────────────────────────────────────────────────\n\n async createRoomParticipants(entityIds: UUID[], roomId: UUID): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const entityId of entityIds) {\n const existing = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.entityId === entityId && p.roomId === roomId\n );\n const existingParticipant = existing[0];\n if (existingParticipant) {\n ids.push(existingParticipant.id as UUID);\n continue;\n }\n const id = randomUUID() as UUID;\n const participant: StoredParticipant = { id, entityId, roomId };\n await this.storage.set(COLLECTIONS.PARTICIPANTS, id, participant);\n ids.push(id);\n }\n return ids;\n }\n\n async deleteParticipants(\n participants: Array<{ entityId: UUID; roomId: UUID }>\n ): Promise<boolean> {\n let removed = false;\n for (const { entityId, roomId } of participants) {\n const matches = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.entityId === entityId && p.roomId === roomId\n );\n for (const p of matches) {\n if (p.id) {\n await this.storage.delete(COLLECTIONS.PARTICIPANTS, p.id);\n removed = true;\n }\n }\n }\n return removed;\n }\n\n async updateParticipants(\n participants: Array<{\n entityId: UUID;\n roomId: UUID;\n updates: ParticipantUpdateFields;\n }>\n ): Promise<void> {\n for (const { entityId, roomId, updates } of participants) {\n const matches = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.entityId === entityId && p.roomId === roomId\n );\n for (const p of matches) {\n if (!p.id) continue;\n const next: StoredParticipant = {\n ...p,\n userState: updates.roomState ?? p.userState,\n metadata: { ...(p.metadata ?? {}), ...(updates.metadata ?? {}) },\n };\n await this.storage.set(COLLECTIONS.PARTICIPANTS, p.id, next);\n }\n }\n }\n\n async getParticipantsForEntities(entityIds: UUID[]): Promise<Participant[]> {\n if (entityIds.length === 0) return [];\n const set = new Set(entityIds);\n const stored = await this.storage.getWhere<StoredParticipant>(COLLECTIONS.PARTICIPANTS, (p) =>\n set.has(p.entityId as UUID)\n );\n const participants: Participant[] = [];\n for (const p of stored) {\n const entity = await this.storage.get<Entity>(COLLECTIONS.ENTITIES, p.entityId);\n if (entity) participants.push({ id: p.id as UUID, entity });\n }\n return participants;\n }\n\n async getParticipantsForRooms(roomIds: UUID[]): Promise<ParticipantsForRoomsResult> {\n const result: ParticipantsForRoomsResult = [];\n for (const roomId of roomIds) {\n const stored = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.roomId === roomId\n );\n result.push({\n roomId,\n entityIds: [...new Set(stored.map((p) => p.entityId as UUID))],\n });\n }\n return result;\n }\n\n async areRoomParticipants(pairs: Array<{ roomId: UUID; entityId: UUID }>): Promise<boolean[]> {\n const result: boolean[] = [];\n for (const { roomId, entityId } of pairs) {\n const matches = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.roomId === roomId && p.entityId === entityId\n );\n result.push(matches.length > 0);\n }\n return result;\n }\n\n async getParticipantUserStates(\n pairs: Array<{ roomId: UUID; entityId: UUID }>\n ): Promise<ParticipantUserState[]> {\n const result: ParticipantUserState[] = [];\n for (const { roomId, entityId } of pairs) {\n const matches = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.roomId === roomId && p.entityId === entityId\n );\n const state = matches[0]?.userState ?? null;\n result.push(state);\n }\n return result;\n }\n\n async updateParticipantUserStates(\n updates: Array<{\n roomId: UUID;\n entityId: UUID;\n state: ParticipantUserState;\n }>\n ): Promise<void> {\n for (const { roomId, entityId, state } of updates) {\n const matches = await this.storage.getWhere<StoredParticipant>(\n COLLECTIONS.PARTICIPANTS,\n (p) => p.roomId === roomId && p.entityId === entityId\n );\n for (const p of matches) {\n if (!p.id) continue;\n await this.storage.set(COLLECTIONS.PARTICIPANTS, p.id, {\n ...p,\n userState: state,\n });\n }\n }\n }\n\n // ── Relationship CRUD ─────────────────────────────────────────────────\n\n async getRelationshipsByPairs(\n pairs: Array<{ sourceEntityId: UUID; targetEntityId: UUID }>\n ): Promise<(Relationship | null)[]> {\n const result: (Relationship | null)[] = [];\n for (const pair of pairs) {\n const matches = await this.storage.getWhere<StoredRelationship>(\n COLLECTIONS.RELATIONSHIPS,\n (r) => r.sourceEntityId === pair.sourceEntityId && r.targetEntityId === pair.targetEntityId\n );\n const first = matches[0];\n result.push(first ? relationshipFromStored(first, this.agentId) : null);\n }\n return result;\n }\n\n async getRelationships(params: {\n entityIds?: UUID[];\n tags?: string[];\n limit?: number;\n offset?: number;\n }): Promise<Relationship[]> {\n const entitySet = params.entityIds ? new Set(params.entityIds) : null;\n let stored = await this.storage.getWhere<StoredRelationship>(COLLECTIONS.RELATIONSHIPS, (r) => {\n if (entitySet) {\n if (!entitySet.has(r.sourceEntityId as UUID) && !entitySet.has(r.targetEntityId as UUID)) {\n return false;\n }\n }\n if (params.tags && params.tags.length > 0) {\n const tags = r.tags ?? [];\n if (!params.tags.some((t) => tags.includes(t))) return false;\n }\n return true;\n });\n\n const offset = params.offset ?? 0;\n if (offset > 0) stored = stored.slice(offset);\n if (params.limit !== undefined) stored = stored.slice(0, params.limit);\n\n return stored.map((r) => relationshipFromStored(r, this.agentId));\n }\n\n async createRelationships(\n relationships: Array<{\n sourceEntityId: UUID;\n targetEntityId: UUID;\n tags?: string[];\n metadata?: Metadata;\n }>\n ): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const rel of relationships) {\n const id = randomUUID() as UUID;\n const stored: StoredRelationship = {\n id,\n sourceEntityId: rel.sourceEntityId,\n targetEntityId: rel.targetEntityId,\n agentId: this.agentId,\n tags: rel.tags ?? [],\n metadata: rel.metadata ?? {},\n createdAt: new Date().toISOString(),\n };\n await this.storage.set(COLLECTIONS.RELATIONSHIPS, id, stored);\n ids.push(id);\n }\n return ids;\n }\n\n async getRelationshipsByIds(relationshipIds: UUID[]): Promise<Relationship[]> {\n const relationships: Relationship[] = [];\n for (const id of relationshipIds) {\n const r = await this.storage.get<StoredRelationship>(COLLECTIONS.RELATIONSHIPS, id);\n if (r) relationships.push(relationshipFromStored(r, this.agentId));\n }\n return relationships;\n }\n\n async updateRelationships(relationships: Relationship[]): Promise<void> {\n for (const rel of relationships) {\n if (!rel.id) continue;\n const existing = await this.storage.get<StoredRelationship>(\n COLLECTIONS.RELATIONSHIPS,\n rel.id\n );\n if (!existing) continue;\n const next: StoredRelationship = {\n ...existing,\n sourceEntityId: rel.sourceEntityId ?? existing.sourceEntityId,\n targetEntityId: rel.targetEntityId ?? existing.targetEntityId,\n agentId: rel.agentId ?? existing.agentId,\n tags: rel.tags ?? existing.tags,\n metadata: { ...(existing.metadata ?? {}), ...(rel.metadata ?? {}) },\n };\n await this.storage.set(COLLECTIONS.RELATIONSHIPS, rel.id, next);\n }\n }\n\n async deleteRelationships(relationshipIds: UUID[]): Promise<void> {\n for (const id of relationshipIds) {\n await this.storage.delete(COLLECTIONS.RELATIONSHIPS, id);\n }\n }\n\n // ── Agent CRUD ────────────────────────────────────────────────────────\n\n async getAgents(): Promise<Partial<Agent>[]> {\n return this.storage.getAll<Agent>(COLLECTIONS.AGENTS);\n }\n\n async getAgentsByIds(agentIds: UUID[]): Promise<Agent[]> {\n const agents: Agent[] = [];\n for (const id of agentIds) {\n const agent = await this.storage.get<Agent>(COLLECTIONS.AGENTS, id);\n if (agent) agents.push(agent);\n }\n return agents;\n }\n\n async createAgents(agents: Partial<Agent>[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const agent of agents) {\n const id = (agent.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.AGENTS, id, { ...agent, id });\n ids.push(id);\n }\n return ids;\n }\n\n async updateAgents(updates: Array<{ agentId: UUID; agent: Partial<Agent> }>): Promise<boolean> {\n let updated = false;\n for (const { agentId, agent } of updates) {\n const existing = await this.storage.get<Agent>(COLLECTIONS.AGENTS, agentId);\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.AGENTS, agentId, {\n ...existing,\n ...agent,\n });\n updated = true;\n }\n return updated;\n }\n\n async upsertAgents(agents: Partial<Agent>[]): Promise<void> {\n for (const agent of agents) {\n const id = (agent.id ?? randomUUID()) as UUID;\n const existing = await this.storage.get<Agent>(COLLECTIONS.AGENTS, id);\n await this.storage.set(COLLECTIONS.AGENTS, id, {\n ...(existing ?? {}),\n ...agent,\n id,\n });\n }\n }\n\n async deleteAgents(agentIds: UUID[]): Promise<boolean> {\n let removed = false;\n for (const id of agentIds) {\n const ok = await this.storage.delete(COLLECTIONS.AGENTS, id);\n if (ok) removed = true;\n }\n return removed;\n }\n\n async countAgents(): Promise<number> {\n return this.storage.count(COLLECTIONS.AGENTS);\n }\n\n async cleanupAgents(): Promise<void> {\n // Nothing to clean up for ephemeral storage.\n }\n\n // ── Cache CRUD ────────────────────────────────────────────────────────\n\n async getCaches<T>(keys: string[]): Promise<Map<string, T>> {\n const out = new Map<string, T>();\n for (const key of keys) {\n const entry = await this.storage.get<StoredCacheEntry<T>>(COLLECTIONS.CACHE, key);\n if (!entry) continue;\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\n await this.storage.delete(COLLECTIONS.CACHE, key);\n continue;\n }\n out.set(key, entry.value);\n }\n return out;\n }\n\n async setCaches<T>(entries: Array<{ key: string; value: T }>): Promise<boolean> {\n for (const { key, value } of entries) {\n await this.storage.set(COLLECTIONS.CACHE, key, { value });\n }\n return true;\n }\n\n async deleteCaches(keys: string[]): Promise<boolean> {\n let removed = false;\n for (const key of keys) {\n const ok = await this.storage.delete(COLLECTIONS.CACHE, key);\n if (ok) removed = true;\n }\n return removed;\n }\n\n // ── Task CRUD ─────────────────────────────────────────────────────────\n\n async getTasks(params: {\n roomId?: UUID;\n tags?: string[];\n entityId?: UUID;\n agentIds: UUID[];\n limit?: number;\n offset?: number;\n }): Promise<Task[]> {\n const agentSet = new Set(params.agentIds);\n let tasks = await this.storage.getWhere<Task>(COLLECTIONS.TASKS, (t) => {\n const taskAgentId = (t as Task & { agentId?: UUID }).agentId;\n if (agentSet.size > 0 && taskAgentId !== undefined && !agentSet.has(taskAgentId)) {\n return false;\n }\n if (params.roomId && t.roomId !== params.roomId) return false;\n if (params.entityId && t.entityId !== params.entityId) return false;\n if (params.tags && params.tags.length > 0) {\n const tags = t.tags ?? [];\n if (!params.tags.some((tag) => tags.includes(tag))) return false;\n }\n return true;\n });\n const offset = params.offset ?? 0;\n if (offset > 0) tasks = tasks.slice(offset);\n if (params.limit !== undefined) tasks = tasks.slice(0, params.limit);\n return tasks;\n }\n\n async getTasksByName(name: string): Promise<Task[]> {\n return this.storage.getWhere<Task>(COLLECTIONS.TASKS, (t) => t.name === name);\n }\n\n async createTasks(tasks: Task[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const task of tasks) {\n const id = (task.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.TASKS, id, { ...task, id });\n ids.push(id);\n }\n return ids;\n }\n\n async getTasksByIds(taskIds: UUID[]): Promise<Task[]> {\n const tasks: Task[] = [];\n for (const id of taskIds) {\n const task = await this.storage.get<Task>(COLLECTIONS.TASKS, id);\n if (task) tasks.push(task);\n }\n return tasks;\n }\n\n async updateTasks(updates: Array<{ id: UUID; task: Partial<Task> }>): Promise<void> {\n for (const { id, task } of updates) {\n const existing = await this.storage.get<Task>(COLLECTIONS.TASKS, id);\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.TASKS, id, { ...existing, ...task });\n }\n }\n\n async deleteTasks(taskIds: UUID[]): Promise<void> {\n for (const id of taskIds) {\n await this.storage.delete(COLLECTIONS.TASKS, id);\n }\n }\n\n // ── Pairing CRUD ──────────────────────────────────────────────────────\n\n async getPairingRequests(\n queries: Array<{ channel: PairingChannel; agentId: UUID }>\n ): Promise<PairingRequestsResult> {\n const result: PairingRequestsResult = [];\n for (const { channel, agentId } of queries) {\n const requests = await this.storage.getWhere<PairingRequest>(\n COLLECTIONS.PAIRING_REQUESTS,\n (r) => r.channel === channel && r.agentId === agentId\n );\n result.push({ channel, agentId, requests });\n }\n return result;\n }\n\n async getPairingAllowlists(\n queries: Array<{ channel: PairingChannel; agentId: UUID }>\n ): Promise<PairingAllowlistsResult> {\n const result: PairingAllowlistsResult = [];\n for (const { channel, agentId } of queries) {\n const entries = await this.storage.getWhere<PairingAllowlistEntry>(\n COLLECTIONS.PAIRING_ALLOWLIST,\n (e) => e.channel === channel && e.agentId === agentId\n );\n result.push({ channel, agentId, entries });\n }\n return result;\n }\n\n async createPairingRequests(requests: PairingRequest[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const request of requests) {\n const id = (request.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.PAIRING_REQUESTS, id, {\n ...request,\n id,\n });\n ids.push(id);\n }\n return ids;\n }\n\n async updatePairingRequests(requests: PairingRequest[]): Promise<void> {\n for (const request of requests) {\n if (!request.id) continue;\n const existing = await this.storage.get<PairingRequest>(\n COLLECTIONS.PAIRING_REQUESTS,\n request.id\n );\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.PAIRING_REQUESTS, request.id, {\n ...existing,\n ...request,\n });\n }\n }\n\n async deletePairingRequests(ids: UUID[]): Promise<void> {\n for (const id of ids) {\n await this.storage.delete(COLLECTIONS.PAIRING_REQUESTS, id);\n }\n }\n\n async createPairingAllowlistEntries(entries: PairingAllowlistEntry[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const entry of entries) {\n const id = (entry.id ?? randomUUID()) as UUID;\n await this.storage.set(COLLECTIONS.PAIRING_ALLOWLIST, id, {\n ...entry,\n id,\n });\n ids.push(id);\n }\n return ids;\n }\n\n async updatePairingAllowlistEntries(entries: PairingAllowlistEntry[]): Promise<void> {\n for (const entry of entries) {\n if (!entry.id) continue;\n const existing = await this.storage.get<PairingAllowlistEntry>(\n COLLECTIONS.PAIRING_ALLOWLIST,\n entry.id\n );\n if (!existing) continue;\n await this.storage.set(COLLECTIONS.PAIRING_ALLOWLIST, entry.id, {\n ...existing,\n ...entry,\n });\n }\n }\n\n async deletePairingAllowlistEntries(ids: UUID[]): Promise<void> {\n for (const id of ids) {\n await this.storage.delete(COLLECTIONS.PAIRING_ALLOWLIST, id);\n }\n }\n}\n",
7
- "import type { IVectorStorage, VectorSearchResult } from \"./types\";\n\ninterface HNSWNode {\n id: string;\n vector: number[];\n level: number;\n neighbors: Map<number, Set<string>>;\n}\n\ninterface HNSWConfig {\n M: number;\n efConstruction: number;\n efSearch: number;\n mL: number;\n}\n\nfunction cosineDistance(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(`Vector dimension mismatch: ${a.length} vs ${b.length}`);\n }\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n const aValue = a[i] ?? 0;\n const bValue = b[i] ?? 0;\n dotProduct += aValue * bValue;\n normA += aValue * aValue;\n normB += bValue * bValue;\n }\n\n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n if (magnitude === 0) return 1;\n\n return 1 - dotProduct / magnitude;\n}\n\nexport class EphemeralHNSW implements IVectorStorage {\n private nodes: Map<string, HNSWNode> = new Map();\n private entryPoint: string | null = null;\n private maxLevel = 0;\n private dimension = 0;\n private config: HNSWConfig;\n\n constructor() {\n this.config = {\n M: 16,\n efConstruction: 200,\n efSearch: 50,\n mL: 1 / Math.log(16),\n };\n }\n\n async init(dimension: number): Promise<void> {\n this.dimension = dimension;\n }\n\n private getRandomLevel(): number {\n let level = 0;\n while (Math.random() < Math.exp(-level * this.config.mL) && level < 16) {\n level++;\n }\n return level;\n }\n\n async add(id: string, vector: number[]): Promise<void> {\n if (vector.length !== this.dimension) {\n throw new Error(\n `Vector dimension mismatch: expected ${this.dimension}, got ${vector.length}`\n );\n }\n\n const existing = this.nodes.get(id);\n if (existing) {\n existing.vector = vector;\n return;\n }\n\n const level = this.getRandomLevel();\n const newNode: HNSWNode = {\n id,\n vector,\n level,\n neighbors: new Map(),\n };\n\n for (let l = 0; l <= level; l++) {\n newNode.neighbors.set(l, new Set());\n }\n\n if (this.entryPoint === null) {\n this.entryPoint = id;\n this.maxLevel = level;\n this.nodes.set(id, newNode);\n return;\n }\n\n let currentNode = this.entryPoint;\n\n for (let l = this.maxLevel; l > level; l--) {\n currentNode = this.searchLayer(vector, currentNode, 1, l)[0]?.id ?? currentNode;\n }\n\n for (let l = Math.min(level, this.maxLevel); l >= 0; l--) {\n const neighbors = this.searchLayer(vector, currentNode, this.config.efConstruction, l);\n\n const M = this.config.M;\n const selectedNeighbors = neighbors.slice(0, M);\n\n for (const neighbor of selectedNeighbors) {\n const neighborSet = newNode.neighbors.get(l);\n if (neighborSet) {\n neighborSet.add(neighbor.id);\n }\n\n const neighborNode = this.nodes.get(neighbor.id);\n if (neighborNode) {\n let neighborSet = neighborNode.neighbors.get(l);\n if (!neighborSet) {\n neighborSet = new Set();\n neighborNode.neighbors.set(l, neighborSet);\n }\n neighborSet.add(id);\n\n if (neighborSet.size > M) {\n const toKeep = this.selectBestNeighbors(neighborNode.vector, neighborSet, M);\n neighborNode.neighbors.set(l, new Set(toKeep.map((n) => n.id)));\n }\n }\n }\n\n if (neighbors.length > 0) {\n const closestNeighbor = neighbors[0];\n if (closestNeighbor) {\n currentNode = closestNeighbor.id;\n }\n }\n }\n\n this.nodes.set(id, newNode);\n\n if (level > this.maxLevel) {\n this.maxLevel = level;\n this.entryPoint = id;\n }\n }\n\n private searchLayer(\n query: number[],\n entryId: string,\n ef: number,\n level: number\n ): Array<{ id: string; distance: number }> {\n const visited = new Set<string>([entryId]);\n const entryNode = this.nodes.get(entryId);\n if (!entryNode) return [];\n\n const entryDist = cosineDistance(query, entryNode.vector);\n\n const candidates: Array<{ id: string; distance: number }> = [\n { id: entryId, distance: entryDist },\n ];\n\n const results: Array<{ id: string; distance: number }> = [{ id: entryId, distance: entryDist }];\n\n while (candidates.length > 0) {\n candidates.sort((a, b) => a.distance - b.distance);\n const current = candidates.shift();\n if (!current) break;\n\n results.sort((a, b) => b.distance - a.distance);\n const furthestResult = results[0];\n if (!furthestResult) break;\n\n if (current.distance > furthestResult.distance) {\n break;\n }\n\n const currentNode = this.nodes.get(current.id);\n if (!currentNode) continue;\n\n const neighbors = currentNode.neighbors.get(level);\n if (!neighbors) continue;\n\n for (const neighborId of neighbors) {\n if (visited.has(neighborId)) continue;\n visited.add(neighborId);\n\n const neighborNode = this.nodes.get(neighborId);\n if (!neighborNode) continue;\n\n const dist = cosineDistance(query, neighborNode.vector);\n\n if (results.length < ef || dist < furthestResult.distance) {\n candidates.push({ id: neighborId, distance: dist });\n results.push({ id: neighborId, distance: dist });\n\n if (results.length > ef) {\n results.sort((a, b) => b.distance - a.distance);\n results.pop();\n }\n }\n }\n }\n\n results.sort((a, b) => a.distance - b.distance);\n return results;\n }\n\n private selectBestNeighbors(\n nodeVector: number[],\n neighborIds: Set<string>,\n M: number\n ): Array<{ id: string; distance: number }> {\n const neighbors: Array<{ id: string; distance: number }> = [];\n\n for (const id of neighborIds) {\n const node = this.nodes.get(id);\n if (node) {\n neighbors.push({\n id,\n distance: cosineDistance(nodeVector, node.vector),\n });\n }\n }\n\n neighbors.sort((a, b) => a.distance - b.distance);\n return neighbors.slice(0, M);\n }\n\n async remove(id: string): Promise<void> {\n const node = this.nodes.get(id);\n if (!node) return;\n\n for (const [level, neighbors] of node.neighbors) {\n for (const neighborId of neighbors) {\n const neighborNode = this.nodes.get(neighborId);\n if (neighborNode) {\n neighborNode.neighbors.get(level)?.delete(id);\n }\n }\n }\n\n this.nodes.delete(id);\n\n if (this.entryPoint === id) {\n if (this.nodes.size === 0) {\n this.entryPoint = null;\n this.maxLevel = 0;\n } else {\n let maxLevel = 0;\n let newEntry: string | null = null;\n for (const [nodeId, n] of this.nodes) {\n if (n.level >= maxLevel) {\n maxLevel = n.level;\n newEntry = nodeId;\n }\n }\n this.entryPoint = newEntry;\n this.maxLevel = maxLevel;\n }\n }\n }\n\n async search(query: number[], k: number, threshold = 0.5): Promise<VectorSearchResult[]> {\n if (this.entryPoint === null || this.nodes.size === 0) {\n return [];\n }\n\n if (query.length !== this.dimension) {\n throw new Error(`Query dimension mismatch: expected ${this.dimension}, got ${query.length}`);\n }\n\n let currentNode = this.entryPoint;\n\n for (let l = this.maxLevel; l > 0; l--) {\n const closest = this.searchLayer(query, currentNode, 1, l);\n const closestNode = closest[0];\n if (closestNode) {\n currentNode = closestNode.id;\n }\n }\n\n const results = this.searchLayer(query, currentNode, Math.max(k, this.config.efSearch), 0);\n\n return results\n .slice(0, k)\n .filter((r) => 1 - r.distance >= threshold)\n .map((r) => ({\n id: r.id,\n distance: r.distance,\n similarity: 1 - r.distance,\n }));\n }\n\n async clear(): Promise<void> {\n this.nodes.clear();\n this.entryPoint = null;\n this.maxLevel = 0;\n }\n\n size(): number {\n return this.nodes.size;\n }\n}\n",
8
- "export interface IStorage {\n init(): Promise<void>;\n close(): Promise<void>;\n isReady(): Promise<boolean>;\n get<T>(collection: string, id: string): Promise<T | null>;\n getAll<T>(collection: string): Promise<T[]>;\n getWhere<T>(collection: string, predicate: (item: T) => boolean): Promise<T[]>;\n set<T>(collection: string, id: string, data: T): Promise<void>;\n delete(collection: string, id: string): Promise<boolean>;\n deleteMany(collection: string, ids: string[]): Promise<void>;\n deleteWhere<T = Record<string, unknown>>(\n collection: string,\n predicate: (item: T) => boolean\n ): Promise<void>;\n count<T = Record<string, unknown>>(\n collection: string,\n predicate?: (item: T) => boolean\n ): Promise<number>;\n clear(): Promise<void>;\n}\n\nexport interface IVectorStorage {\n init(dimension: number): Promise<void>;\n add(id: string, vector: number[]): Promise<void>;\n remove(id: string): Promise<void>;\n search(query: number[], k: number, threshold?: number): Promise<VectorSearchResult[]>;\n clear(): Promise<void>;\n}\n\nexport interface VectorSearchResult {\n id: string;\n distance: number;\n similarity: number;\n}\n\nexport const COLLECTIONS = {\n AGENTS: \"agents\",\n ENTITIES: \"entities\",\n MEMORIES: \"memories\",\n ROOMS: \"rooms\",\n WORLDS: \"worlds\",\n COMPONENTS: \"components\",\n RELATIONSHIPS: \"relationships\",\n PARTICIPANTS: \"participants\",\n TASKS: \"tasks\",\n CACHE: \"cache\",\n LOGS: \"logs\",\n EMBEDDINGS: \"embeddings\",\n PAIRING_REQUESTS: \"pairing_requests\",\n PAIRING_ALLOWLIST: \"pairing_allowlist\",\n} as const;\n\nexport type CollectionName = (typeof COLLECTIONS)[keyof typeof COLLECTIONS];\n",
9
- "import type { IStorage } from \"./types\";\n\nexport class MemoryStorage implements IStorage {\n private collections: Map<string, Map<string, unknown>> = new Map();\n private ready = false;\n\n async init(): Promise<void> {\n this.ready = true;\n }\n\n async close(): Promise<void> {\n this.collections.clear();\n this.ready = false;\n }\n\n async isReady(): Promise<boolean> {\n return this.ready;\n }\n\n private getCollection(collection: string): Map<string, unknown> {\n let col = this.collections.get(collection);\n if (!col) {\n col = new Map();\n this.collections.set(collection, col);\n }\n return col;\n }\n\n async get<T>(collection: string, id: string): Promise<T | null> {\n const col = this.getCollection(collection);\n const item = col.get(id);\n return item !== undefined ? (item as T) : null;\n }\n\n async getAll<T>(collection: string): Promise<T[]> {\n const col = this.getCollection(collection);\n return Array.from(col.values()) as T[];\n }\n\n async getWhere<T>(collection: string, predicate: (item: T) => boolean): Promise<T[]> {\n const all = await this.getAll<T>(collection);\n return all.filter(predicate);\n }\n\n async set<T>(collection: string, id: string, data: T): Promise<void> {\n const col = this.getCollection(collection);\n col.set(id, data);\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n const col = this.getCollection(collection);\n return col.delete(id);\n }\n\n async deleteMany(collection: string, ids: string[]): Promise<void> {\n const col = this.getCollection(collection);\n for (const id of ids) {\n col.delete(id);\n }\n }\n\n async deleteWhere<T = Record<string, unknown>>(\n collection: string,\n predicate: (item: T) => boolean\n ): Promise<void> {\n const col = this.getCollection(collection);\n const toDelete: string[] = [];\n\n for (const [id, item] of col) {\n if (predicate(item as T)) {\n toDelete.push(id);\n }\n }\n\n for (const id of toDelete) {\n col.delete(id);\n }\n }\n\n async count<T = Record<string, unknown>>(\n collection: string,\n predicate?: (item: T) => boolean\n ): Promise<number> {\n const col = this.getCollection(collection);\n\n if (!predicate) {\n return col.size;\n }\n\n let count = 0;\n for (const item of col.values()) {\n if (predicate(item as T)) {\n count++;\n }\n }\n return count;\n }\n\n async clear(): Promise<void> {\n this.collections.clear();\n }\n}\n"
10
- ],
11
- "mappings": "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",
12
- "debugId": "417ABAD5882812F964756E2164756E21",
13
- "names": []
14
- }