@agentskit/memory 0.5.4 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -6
- package/dist/index.cjs +516 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +239 -2
- package/dist/index.d.ts +239 -2
- package/dist/index.js +507 -1
- package/dist/index.js.map +1 -1
- package/package.json +14 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/file-chat.ts","../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["serializeMessages","deserializeMessages","encodeMessages","decodeMessages"],"mappings":"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","file":"index.js","sourcesContent":["import type { ChatMemory, MemoryRecord } from '@agentskit/core'\nimport { deserializeMessages, serializeMessages } from '@agentskit/core'\n\n/**\n * ChatMemory backed by a JSON file on disk. Node-only.\n *\n * Implements the Memory contract (ADR 0003):\n * - load() returns a snapshot (CM1)\n * - save() is replace-all, not append (CM2)\n * - empty state returns [] (CM5)\n * - clear() is optional but provided here\n */\nexport function fileChatMemory(path: string): ChatMemory {\n return {\n async load() {\n try {\n const fs = await import('node:fs/promises')\n const raw = await fs.readFile(path, 'utf8')\n return deserializeMessages(JSON.parse(raw) as MemoryRecord)\n } catch {\n return []\n }\n },\n async save(messages) {\n const fs = await import('node:fs/promises')\n await fs.writeFile(path, JSON.stringify(serializeMessages(messages), null, 2), 'utf8')\n },\n async clear() {\n try {\n const fs = await import('node:fs/promises')\n await fs.unlink(path)\n } catch {\n // Ignore missing files.\n }\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n run(...args: unknown[]): void\n get(...args: unknown[]): Record<string, unknown> | undefined\n }\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = mod.default ?? mod\n return new (Database as new (p: string) => SqliteDb)(path)\n } catch {\n throw new Error('Install better-sqlite3 to use sqliteChatMemory: npm install better-sqlite3')\n }\n}\n\nexport function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory {\n const conversationId = config.conversationId ?? 'default'\n let dbPromise: Promise<SqliteDb> | null = null\n\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) {\n dbPromise = openDatabase(config.path).then(db => {\n db.prepare(`\n CREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL\n )\n `).run()\n return db\n })\n }\n return dbPromise\n }\n\n return {\n async load() {\n const db = await getDb()\n const row = db.prepare('SELECT messages FROM conversations WHERE id = ?').get(conversationId)\n return decodeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = encodeMessages(messages)\n db.prepare(`\n INSERT INTO conversations (id, messages) VALUES (?, ?)\n ON CONFLICT(id) DO UPDATE SET messages = ?\n `).run(conversationId, json, json)\n },\n async clear() {\n const db = await getDb()\n db.prepare('DELETE FROM conversations WHERE id = ?').run(conversationId)\n },\n }\n}\n","/**\n * Internal Redis client adapter interface.\n * Abstracts the underlying Redis library so it can be swapped\n * (e.g., from `redis` to `ioredis`) without changing consumers.\n */\nexport interface RedisClientAdapter {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n del(key: string | string[]): Promise<void>\n keys(pattern: string): Promise<string[]>\n disconnect(): Promise<void>\n call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>\n}\n\nexport interface RedisConnectionConfig {\n url: string\n client?: RedisClientAdapter\n}\n\nexport async function createRedisClientAdapter(url: string): Promise<RedisClientAdapter> {\n let redis: typeof import('redis')\n try {\n redis = await import('redis')\n } catch {\n throw new Error('Install redis to use Redis memory backends: npm install redis')\n }\n\n const client = redis.createClient({ url })\n await client.connect()\n\n return {\n async get(key) {\n return await client.get(key)\n },\n async set(key, value) {\n await client.set(key, value)\n },\n async del(key) {\n const keys = Array.isArray(key) ? key : [key]\n if (keys.length > 0) await client.del(keys)\n },\n async keys(pattern) {\n return await client.keys(pattern)\n },\n async disconnect() {\n await client.disconnect()\n },\n async call(command, ...args) {\n return await client.sendCommand([command, ...args.map(String)])\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisChatMemoryConfig extends RedisConnectionConfig {\n keyPrefix?: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\nexport function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory {\n const prefix = config.keyPrefix ?? 'agentskit:chat'\n const convId = config.conversationId ?? 'default'\n const key = `${prefix}:${convId}`\n let clientPromise: Promise<RedisClientAdapter> | null = null\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n return {\n async load() {\n const client = await getClient()\n const json = await client.get(key)\n return decodeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, encodeMessages(messages))\n },\n async clear() {\n const client = await getClient()\n await client.del(key)\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisVectorMemoryConfig extends RedisConnectionConfig {\n indexName?: string\n keyPrefix?: string\n dimensions?: number\n}\n\nfunction float32Buffer(vector: number[]): Buffer {\n const buffer = Buffer.alloc(vector.length * 4)\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4)\n }\n return buffer\n}\n\nexport function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory {\n const indexName = config.indexName ?? 'agentskit:vectors:idx'\n const prefix = config.keyPrefix ?? 'agentskit:vec'\n const dimensions = config.dimensions ?? 0\n let clientPromise: Promise<RedisClientAdapter> | null = null\n let indexCreated = false\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n const ensureIndex = async (client: RedisClientAdapter, dims: number) => {\n if (indexCreated) return\n try {\n await client.call(\n 'FT.CREATE', indexName,\n 'ON', 'HASH',\n 'PREFIX', '1', `${prefix}:`,\n 'SCHEMA',\n 'content', 'TEXT',\n 'metadata', 'TEXT',\n 'embedding', 'VECTOR', 'HNSW', '6',\n 'TYPE', 'FLOAT32',\n 'DIM', dims,\n 'DISTANCE_METRIC', 'COSINE',\n )\n } catch (err: unknown) {\n const msg = String(err)\n if (!msg.includes('Index already exists')) throw err\n }\n indexCreated = true\n }\n\n return {\n async store(docs: VectorDocument[]) {\n const client = await getClient()\n const dims = dimensions || docs[0]?.embedding.length || 0\n if (dims > 0) await ensureIndex(client, dims)\n\n for (const doc of docs) {\n const key = `${prefix}:${doc.id}`\n await client.call(\n 'HSET', key,\n 'content', doc.content,\n 'metadata', JSON.stringify(doc.metadata ?? {}),\n 'embedding', float32Buffer(doc.embedding),\n )\n }\n },\n async search(embedding, options) {\n const client = await getClient()\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n\n const result = await client.call(\n 'FT.SEARCH', indexName,\n `*=>[KNN ${topK} @embedding $vec AS score]`,\n 'PARAMS', '2', 'vec', float32Buffer(embedding),\n 'SORTBY', 'score',\n 'RETURN', '3', 'content', 'metadata', 'score',\n 'DIALECT', '2',\n ) as unknown[]\n\n if (!Array.isArray(result) || result.length < 2) return []\n\n const docs: RetrievedDocument[] = []\n // FT.SEARCH returns [total, key1, [field, val, ...], key2, [field, val, ...], ...]\n for (let i = 1; i < result.length; i += 2) {\n const key = String(result[i])\n const fields = result[i + 1] as string[]\n if (!Array.isArray(fields)) continue\n\n const fieldMap: Record<string, string> = {}\n for (let j = 0; j < fields.length; j += 2) {\n fieldMap[fields[j]] = fields[j + 1]\n }\n\n const score = 1 - parseFloat(fieldMap.score ?? '1') // COSINE distance → similarity\n if (score < threshold) continue\n\n docs.push({\n id: key.replace(`${prefix}:`, ''),\n content: fieldMap.content ?? '',\n score,\n metadata: fieldMap.metadata ? JSON.parse(fieldMap.metadata) : undefined,\n })\n }\n\n return docs\n },\n async delete(ids) {\n const client = await getClient()\n await client.del(ids.map(id => `${prefix}:${id}`))\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { VectorStore } from './vector-store'\n\nexport interface FileVectorMemoryConfig {\n path: string\n store?: VectorStore\n}\n\nfunction requireVectra(): { LocalIndex: new (path: string) => VectraIndex } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('vectra')\n } catch {\n throw new Error(\n 'Install vectra to use fileVectorMemory: npm install vectra'\n )\n }\n}\n\ninterface VectraIndex {\n isIndexCreated(): Promise<boolean>\n createIndex(): Promise<void>\n insertItem(item: { vector: number[]; metadata: Record<string, unknown> }): Promise<unknown>\n queryItems(vector: number[], topK: number): Promise<Array<{ score: number; item: { metadata: Record<string, unknown> } }>>\n listItems(): Promise<Array<{ id: string; metadata: Record<string, unknown> }>>;\n deleteItem(id: string): Promise<void>\n}\n\nfunction createVectraStore(dirPath: string): VectorStore {\n let index: VectraIndex | null = null\n\n const getIndex = async (): Promise<VectraIndex> => {\n if (index) return index\n const { LocalIndex } = requireVectra()\n index = new LocalIndex(dirPath)\n if (!(await index.isIndexCreated())) {\n await index.createIndex()\n }\n return index\n }\n\n return {\n async upsert(docs) {\n const idx = await getIndex()\n for (const doc of docs) {\n await idx.insertItem({\n vector: doc.vector,\n metadata: { _id: doc.id, ...doc.metadata },\n })\n }\n },\n async query(vector, topK) {\n const idx = await getIndex()\n const results = await idx.queryItems(vector, topK)\n return results.map(r => ({\n id: String(r.item.metadata._id ?? ''),\n score: r.score,\n metadata: r.item.metadata,\n }))\n },\n async delete(ids) {\n const idx = await getIndex()\n const items = await idx.listItems()\n for (const item of items) {\n if (ids.includes(String(item.metadata._id ?? item.id))) {\n await idx.deleteItem(item.id)\n }\n }\n },\n }\n}\n\nexport function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory {\n const store = config.store ?? createVectraStore(config.path)\n const contentCache = new Map<string, string>()\n\n return {\n async store(docs: VectorDocument[]) {\n for (const doc of docs) {\n contentCache.set(doc.id, doc.content)\n }\n await store.upsert(docs.map(doc => ({\n id: doc.id,\n vector: doc.embedding,\n metadata: { content: doc.content, ...doc.metadata },\n })))\n },\n async search(embedding, options) {\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n const results = await store.query(embedding, topK)\n\n return results\n .filter(r => r.score >= threshold)\n .map((r): RetrievedDocument => ({\n id: r.id,\n content: String(r.metadata.content ?? contentCache.get(r.id) ?? ''),\n score: r.score,\n metadata: r.metadata,\n }))\n },\n async delete(ids) {\n for (const id of ids) contentCache.delete(id)\n await store.delete(ids)\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/file-chat.ts","../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts","../src/personalization.ts","../src/graph.ts","../src/vector/pgvector.ts","../src/vector/pinecone.ts","../src/vector/qdrant.ts","../src/vector/chroma.ts","../src/vector/upstash.ts","../src/encrypted.ts","../src/hierarchical.ts"],"names":["serializeMessages","deserializeMessages","encodeMessages","decodeMessages","call"],"mappings":"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","file":"index.js","sourcesContent":["import type { ChatMemory, MemoryRecord } from '@agentskit/core'\nimport { deserializeMessages, serializeMessages } from '@agentskit/core'\n\n/**\n * ChatMemory backed by a JSON file on disk. Node-only.\n *\n * Implements the Memory contract (ADR 0003):\n * - load() returns a snapshot (CM1)\n * - save() is replace-all, not append (CM2)\n * - empty state returns [] (CM5)\n * - clear() is optional but provided here\n */\nexport function fileChatMemory(path: string): ChatMemory {\n return {\n async load() {\n try {\n const fs = await import('node:fs/promises')\n const raw = await fs.readFile(path, 'utf8')\n return deserializeMessages(JSON.parse(raw) as MemoryRecord)\n } catch {\n return []\n }\n },\n async save(messages) {\n const fs = await import('node:fs/promises')\n await fs.writeFile(path, JSON.stringify(serializeMessages(messages), null, 2), 'utf8')\n },\n async clear() {\n try {\n const fs = await import('node:fs/promises')\n await fs.unlink(path)\n } catch {\n // Ignore missing files.\n }\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n run(...args: unknown[]): void\n get(...args: unknown[]): Record<string, unknown> | undefined\n }\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = mod.default ?? mod\n return new (Database as new (p: string) => SqliteDb)(path)\n } catch {\n throw new Error('Install better-sqlite3 to use sqliteChatMemory: npm install better-sqlite3')\n }\n}\n\nexport function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory {\n const conversationId = config.conversationId ?? 'default'\n let dbPromise: Promise<SqliteDb> | null = null\n\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) {\n dbPromise = openDatabase(config.path).then(db => {\n db.prepare(`\n CREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL\n )\n `).run()\n return db\n })\n }\n return dbPromise\n }\n\n return {\n async load() {\n const db = await getDb()\n const row = db.prepare('SELECT messages FROM conversations WHERE id = ?').get(conversationId)\n return decodeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = encodeMessages(messages)\n db.prepare(`\n INSERT INTO conversations (id, messages) VALUES (?, ?)\n ON CONFLICT(id) DO UPDATE SET messages = ?\n `).run(conversationId, json, json)\n },\n async clear() {\n const db = await getDb()\n db.prepare('DELETE FROM conversations WHERE id = ?').run(conversationId)\n },\n }\n}\n","/**\n * Internal Redis client adapter interface.\n * Abstracts the underlying Redis library so it can be swapped\n * (e.g., from `redis` to `ioredis`) without changing consumers.\n */\nexport interface RedisClientAdapter {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n del(key: string | string[]): Promise<void>\n keys(pattern: string): Promise<string[]>\n disconnect(): Promise<void>\n call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>\n}\n\nexport interface RedisConnectionConfig {\n url: string\n client?: RedisClientAdapter\n}\n\nexport async function createRedisClientAdapter(url: string): Promise<RedisClientAdapter> {\n let redis: typeof import('redis')\n try {\n redis = await import('redis')\n } catch {\n throw new Error('Install redis to use Redis memory backends: npm install redis')\n }\n\n const client = redis.createClient({ url })\n await client.connect()\n\n return {\n async get(key) {\n return await client.get(key)\n },\n async set(key, value) {\n await client.set(key, value)\n },\n async del(key) {\n const keys = Array.isArray(key) ? key : [key]\n if (keys.length > 0) await client.del(keys)\n },\n async keys(pattern) {\n return await client.keys(pattern)\n },\n async disconnect() {\n await client.disconnect()\n },\n async call(command, ...args) {\n return await client.sendCommand([command, ...args.map(String)])\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisChatMemoryConfig extends RedisConnectionConfig {\n keyPrefix?: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\nexport function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory {\n const prefix = config.keyPrefix ?? 'agentskit:chat'\n const convId = config.conversationId ?? 'default'\n const key = `${prefix}:${convId}`\n let clientPromise: Promise<RedisClientAdapter> | null = null\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n return {\n async load() {\n const client = await getClient()\n const json = await client.get(key)\n return decodeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, encodeMessages(messages))\n },\n async clear() {\n const client = await getClient()\n await client.del(key)\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisVectorMemoryConfig extends RedisConnectionConfig {\n indexName?: string\n keyPrefix?: string\n dimensions?: number\n}\n\nfunction float32Buffer(vector: number[]): Buffer {\n const buffer = Buffer.alloc(vector.length * 4)\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4)\n }\n return buffer\n}\n\nexport function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory {\n const indexName = config.indexName ?? 'agentskit:vectors:idx'\n const prefix = config.keyPrefix ?? 'agentskit:vec'\n const dimensions = config.dimensions ?? 0\n let clientPromise: Promise<RedisClientAdapter> | null = null\n let indexCreated = false\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n const ensureIndex = async (client: RedisClientAdapter, dims: number) => {\n if (indexCreated) return\n try {\n await client.call(\n 'FT.CREATE', indexName,\n 'ON', 'HASH',\n 'PREFIX', '1', `${prefix}:`,\n 'SCHEMA',\n 'content', 'TEXT',\n 'metadata', 'TEXT',\n 'embedding', 'VECTOR', 'HNSW', '6',\n 'TYPE', 'FLOAT32',\n 'DIM', dims,\n 'DISTANCE_METRIC', 'COSINE',\n )\n } catch (err: unknown) {\n const msg = String(err)\n if (!msg.includes('Index already exists')) throw err\n }\n indexCreated = true\n }\n\n return {\n async store(docs: VectorDocument[]) {\n const client = await getClient()\n const dims = dimensions || docs[0]?.embedding.length || 0\n if (dims > 0) await ensureIndex(client, dims)\n\n for (const doc of docs) {\n const key = `${prefix}:${doc.id}`\n await client.call(\n 'HSET', key,\n 'content', doc.content,\n 'metadata', JSON.stringify(doc.metadata ?? {}),\n 'embedding', float32Buffer(doc.embedding),\n )\n }\n },\n async search(embedding, options) {\n const client = await getClient()\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n\n const result = await client.call(\n 'FT.SEARCH', indexName,\n `*=>[KNN ${topK} @embedding $vec AS score]`,\n 'PARAMS', '2', 'vec', float32Buffer(embedding),\n 'SORTBY', 'score',\n 'RETURN', '3', 'content', 'metadata', 'score',\n 'DIALECT', '2',\n ) as unknown[]\n\n if (!Array.isArray(result) || result.length < 2) return []\n\n const docs: RetrievedDocument[] = []\n // FT.SEARCH returns [total, key1, [field, val, ...], key2, [field, val, ...], ...]\n for (let i = 1; i < result.length; i += 2) {\n const key = String(result[i])\n const fields = result[i + 1] as string[]\n if (!Array.isArray(fields)) continue\n\n const fieldMap: Record<string, string> = {}\n for (let j = 0; j < fields.length; j += 2) {\n fieldMap[fields[j]] = fields[j + 1]\n }\n\n const score = 1 - parseFloat(fieldMap.score ?? '1') // COSINE distance → similarity\n if (score < threshold) continue\n\n docs.push({\n id: key.replace(`${prefix}:`, ''),\n content: fieldMap.content ?? '',\n score,\n metadata: fieldMap.metadata ? JSON.parse(fieldMap.metadata) : undefined,\n })\n }\n\n return docs\n },\n async delete(ids) {\n const client = await getClient()\n await client.del(ids.map(id => `${prefix}:${id}`))\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { VectorStore } from './vector-store'\n\nexport interface FileVectorMemoryConfig {\n path: string\n store?: VectorStore\n}\n\nfunction requireVectra(): { LocalIndex: new (path: string) => VectraIndex } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('vectra')\n } catch {\n throw new Error(\n 'Install vectra to use fileVectorMemory: npm install vectra'\n )\n }\n}\n\ninterface VectraIndex {\n isIndexCreated(): Promise<boolean>\n createIndex(): Promise<void>\n insertItem(item: { vector: number[]; metadata: Record<string, unknown> }): Promise<unknown>\n queryItems(vector: number[], topK: number): Promise<Array<{ score: number; item: { metadata: Record<string, unknown> } }>>\n listItems(): Promise<Array<{ id: string; metadata: Record<string, unknown> }>>;\n deleteItem(id: string): Promise<void>\n}\n\nfunction createVectraStore(dirPath: string): VectorStore {\n let index: VectraIndex | null = null\n\n const getIndex = async (): Promise<VectraIndex> => {\n if (index) return index\n const { LocalIndex } = requireVectra()\n index = new LocalIndex(dirPath)\n if (!(await index.isIndexCreated())) {\n await index.createIndex()\n }\n return index\n }\n\n return {\n async upsert(docs) {\n const idx = await getIndex()\n for (const doc of docs) {\n await idx.insertItem({\n vector: doc.vector,\n metadata: { _id: doc.id, ...doc.metadata },\n })\n }\n },\n async query(vector, topK) {\n const idx = await getIndex()\n const results = await idx.queryItems(vector, topK)\n return results.map(r => ({\n id: String(r.item.metadata._id ?? ''),\n score: r.score,\n metadata: r.item.metadata,\n }))\n },\n async delete(ids) {\n const idx = await getIndex()\n const items = await idx.listItems()\n for (const item of items) {\n if (ids.includes(String(item.metadata._id ?? item.id))) {\n await idx.deleteItem(item.id)\n }\n }\n },\n }\n}\n\nexport function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory {\n const store = config.store ?? createVectraStore(config.path)\n const contentCache = new Map<string, string>()\n\n return {\n async store(docs: VectorDocument[]) {\n for (const doc of docs) {\n contentCache.set(doc.id, doc.content)\n }\n await store.upsert(docs.map(doc => ({\n id: doc.id,\n vector: doc.embedding,\n metadata: { content: doc.content, ...doc.metadata },\n })))\n },\n async search(embedding, options) {\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n const results = await store.query(embedding, topK)\n\n return results\n .filter(r => r.score >= threshold)\n .map((r): RetrievedDocument => ({\n id: r.id,\n content: String(r.metadata.content ?? contentCache.get(r.id) ?? ''),\n score: r.score,\n metadata: r.metadata,\n }))\n },\n async delete(ids) {\n for (const id of ids) contentCache.delete(id)\n await store.delete(ids)\n },\n }\n}\n","/**\n * Personalization — a persisted profile per subject (user id,\n * account id, device). The agent reads it on every run to\n * condition responses; the runtime updates it when new facts\n * appear.\n */\n\nexport interface PersonalizationProfile {\n subjectId: string\n /** Human-editable notes, facts, preferences. */\n traits: Record<string, unknown>\n /** ISO timestamp of the latest update. */\n updatedAt: string\n}\n\nexport interface PersonalizationStore {\n get: (subjectId: string) => Promise<PersonalizationProfile | null>\n set: (profile: PersonalizationProfile) => Promise<void>\n merge: (subjectId: string, traits: Record<string, unknown>) => Promise<PersonalizationProfile>\n delete?: (subjectId: string) => Promise<void>\n}\n\n/**\n * In-memory personalization store — tests, single-process demos.\n * Bring your own for production (Postgres, Redis, DynamoDB).\n */\nexport function createInMemoryPersonalization(): PersonalizationStore {\n const profiles = new Map<string, PersonalizationProfile>()\n\n return {\n async get(subjectId) {\n const hit = profiles.get(subjectId)\n return hit ? { ...hit, traits: { ...hit.traits } } : null\n },\n async set(profile) {\n profiles.set(profile.subjectId, {\n ...profile,\n traits: { ...profile.traits },\n updatedAt: profile.updatedAt || new Date().toISOString(),\n })\n },\n async merge(subjectId, traits) {\n const existing = profiles.get(subjectId)\n const next: PersonalizationProfile = {\n subjectId,\n traits: { ...(existing?.traits ?? {}), ...traits },\n updatedAt: new Date().toISOString(),\n }\n profiles.set(subjectId, next)\n return { ...next, traits: { ...next.traits } }\n },\n async delete(subjectId) {\n profiles.delete(subjectId)\n },\n }\n}\n\n/**\n * Render a profile into a system-prompt fragment the runtime can\n * prepend. Kept intentionally short — full profile dumps bloat\n * context and leak unnecessary detail to the model.\n */\nexport function renderProfileContext(profile: PersonalizationProfile | null): string {\n if (!profile || Object.keys(profile.traits).length === 0) return ''\n const lines = Object.entries(profile.traits)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `- ${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`)\n if (lines.length === 0) return ''\n return `## User profile\\n${lines.join('\\n')}`\n}\n","/**\n * Non-linear memory: a typed knowledge graph. Use for facts the\n * agent should remember beyond a single conversation — entities,\n * relationships, derived beliefs. Designed to be backed by anything\n * from an in-memory Map (tests, demos) to Neo4j / Memgraph / Neptune.\n */\n\nexport interface GraphNode<TProps = Record<string, unknown>> {\n id: string\n /** Type / label — 'person', 'company', 'topic'. */\n kind: string\n properties?: TProps\n /** ISO timestamp when the node was first inserted. */\n createdAt?: string\n /** ISO timestamp of the latest update. */\n updatedAt?: string\n}\n\nexport interface GraphEdge<TProps = Record<string, unknown>> {\n id: string\n /** Verb / relation type — 'knows', 'works-at', 'cites'. */\n label: string\n from: string\n to: string\n /** Optional weight — confidence, recency, or frequency. */\n weight?: number\n properties?: TProps\n}\n\nexport interface GraphQuery {\n kind?: string\n label?: string\n from?: string\n to?: string\n}\n\nexport interface GraphMemory {\n upsertNode: <T>(node: GraphNode<T>) => Promise<GraphNode<T>>\n upsertEdge: <T>(edge: GraphEdge<T>) => Promise<GraphEdge<T>>\n getNode: <T>(id: string) => Promise<GraphNode<T> | null>\n findNodes: <T>(query?: GraphQuery) => Promise<GraphNode<T>[]>\n findEdges: <T>(query?: GraphQuery) => Promise<GraphEdge<T>[]>\n /** Breadth-first neighbors of `id` up to `depth`. Default 1. */\n neighbors: <T>(id: string, options?: { depth?: number; label?: string }) => Promise<GraphNode<T>[]>\n deleteNode: (id: string) => Promise<void>\n deleteEdge: (id: string) => Promise<void>\n clear?: () => Promise<void>\n}\n\n/**\n * In-memory graph — fine for tests, single-process demos, and as\n * reference for what a backing store needs to implement.\n */\nexport function createInMemoryGraph(): GraphMemory {\n const nodes = new Map<string, GraphNode<unknown>>()\n const edges = new Map<string, GraphEdge<unknown>>()\n\n const matchesNode = (node: GraphNode<unknown>, query?: GraphQuery): boolean => {\n if (!query) return true\n if (query.kind && node.kind !== query.kind) return false\n return true\n }\n const matchesEdge = (edge: GraphEdge<unknown>, query?: GraphQuery): boolean => {\n if (!query) return true\n if (query.label && edge.label !== query.label) return false\n if (query.from && edge.from !== query.from) return false\n if (query.to && edge.to !== query.to) return false\n return true\n }\n\n return {\n async upsertNode<T>(node: GraphNode<T>) {\n const now = new Date().toISOString()\n const existing = nodes.get(node.id)\n const merged = {\n ...(existing ?? {}),\n ...node,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n }\n nodes.set(node.id, merged as GraphNode<unknown>)\n return merged as GraphNode<T>\n },\n async upsertEdge(edge) {\n edges.set(edge.id, edge as GraphEdge<unknown>)\n return edge\n },\n async getNode<T>(id: string) {\n const hit = nodes.get(id)\n return hit ? ({ ...hit } as GraphNode<T>) : null\n },\n async findNodes<T>(query?: GraphQuery) {\n return Array.from(nodes.values())\n .filter(n => matchesNode(n, query))\n .map(n => ({ ...n }) as GraphNode<T>)\n },\n async findEdges<T>(query?: GraphQuery) {\n return Array.from(edges.values())\n .filter(e => matchesEdge(e, query))\n .map(e => ({ ...e }) as GraphEdge<T>)\n },\n async neighbors<T>(id: string, options: { depth?: number; label?: string } = {}) {\n const depth = Math.max(1, options.depth ?? 1)\n const visited = new Set<string>([id])\n let frontier = new Set<string>([id])\n for (let i = 0; i < depth; i++) {\n const next = new Set<string>()\n for (const edge of edges.values()) {\n if (options.label && edge.label !== options.label) continue\n if (frontier.has(edge.from) && !visited.has(edge.to)) next.add(edge.to)\n if (frontier.has(edge.to) && !visited.has(edge.from)) next.add(edge.from)\n }\n for (const n of next) visited.add(n)\n frontier = next\n if (next.size === 0) break\n }\n visited.delete(id)\n return Array.from(visited, nid => nodes.get(nid)).filter((n): n is GraphNode<unknown> => Boolean(n)).map(n => ({ ...n }) as GraphNode<T>)\n },\n async deleteNode(id) {\n nodes.delete(id)\n for (const [eid, edge] of edges) {\n if (edge.from === id || edge.to === id) edges.delete(eid)\n }\n },\n async deleteEdge(id) {\n edges.delete(id)\n },\n async clear() {\n nodes.clear()\n edges.clear()\n },\n }\n}\n","import type { RetrievedDocument, VectorDocument, VectorMemory } from '@agentskit/core'\n\n/**\n * pgvector-backed VectorMemory. We accept a minimal async SQL runner\n * so the caller picks the driver (`pg`, `postgres`, `@neondatabase/serverless`,\n * `@supabase/postgres-js`, ...). Expects a table with columns\n * `id text primary key`, `content text`, `embedding vector(N)`,\n * `metadata jsonb`.\n */\n\nexport interface PgVectorRunner {\n query: <T = Record<string, unknown>>(\n sql: string,\n params: unknown[],\n ) => Promise<{ rows: T[] }>\n}\n\nexport interface PgVectorConfig {\n runner: PgVectorRunner\n /** Table name. Default 'agentskit_vectors'. */\n table?: string\n /** Default topK for search. Default 10. */\n topK?: number\n}\n\nfunction formatVector(embedding: number[]): string {\n return `[${embedding.join(',')}]`\n}\n\nexport function pgvector(config: PgVectorConfig): VectorMemory {\n const table = config.table ?? 'agentskit_vectors'\n const defaultTopK = Math.max(1, config.topK ?? 10)\n\n return {\n async store(docs: VectorDocument[]) {\n if (docs.length === 0) return\n const values: unknown[] = []\n const placeholders = docs\n .map((doc, i) => {\n const base = i * 4\n values.push(doc.id, doc.content, formatVector(doc.embedding), JSON.stringify(doc.metadata ?? {}))\n return `($${base + 1}, $${base + 2}, $${base + 3}::vector, $${base + 4}::jsonb)`\n })\n .join(', ')\n await config.runner.query(\n `INSERT INTO ${table} (id, content, embedding, metadata) VALUES ${placeholders}\n ON CONFLICT (id) DO UPDATE SET content = EXCLUDED.content, embedding = EXCLUDED.embedding, metadata = EXCLUDED.metadata`,\n values,\n )\n },\n\n async search(embedding: number[], options = {}): Promise<RetrievedDocument[]> {\n const topK = options.topK ?? defaultTopK\n const threshold = options.threshold ?? 0\n const { rows } = await config.runner.query<{\n id: string\n content: string\n metadata: Record<string, unknown> | null\n distance: number\n }>(\n `SELECT id, content, metadata, (embedding <=> $1::vector) AS distance\n FROM ${table}\n ORDER BY embedding <=> $1::vector\n LIMIT $2`,\n [formatVector(embedding), topK],\n )\n return rows\n .map(r => ({\n id: r.id,\n content: r.content,\n metadata: r.metadata ?? undefined,\n score: 1 - r.distance,\n }))\n .filter(r => (r.score ?? 0) >= threshold)\n },\n\n async delete(ids: string[]) {\n if (ids.length === 0) return\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(',')\n await config.runner.query(`DELETE FROM ${table} WHERE id IN (${placeholders})`, ids)\n },\n }\n}\n","import type { RetrievedDocument, VectorDocument, VectorMemory } from '@agentskit/core'\n\nexport interface PineconeConfig {\n /** Full index URL, e.g. `https://<idx>-<project>.svc.<region>.pinecone.io`. */\n indexUrl: string\n apiKey: string\n /** Namespace. Default ''. */\n namespace?: string\n /** Default topK for search. Default 10. */\n topK?: number\n fetch?: typeof globalThis.fetch\n}\n\nasync function call<T>(config: PineconeConfig, path: string, body: unknown): Promise<T> {\n const fetchImpl = config.fetch ?? globalThis.fetch\n const response = await fetchImpl(`${config.indexUrl}${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'api-key': config.apiKey,\n },\n body: JSON.stringify(body),\n })\n const text = await response.text()\n if (!response.ok) throw new Error(`pinecone ${response.status}: ${text.slice(0, 200)}`)\n return (text.length > 0 ? JSON.parse(text) : {}) as T\n}\n\nexport function pinecone(config: PineconeConfig): VectorMemory {\n const defaultTopK = Math.max(1, config.topK ?? 10)\n const namespace = config.namespace ?? ''\n\n return {\n async store(docs: VectorDocument[]) {\n if (docs.length === 0) return\n await call(config, '/vectors/upsert', {\n namespace,\n vectors: docs.map(d => ({\n id: d.id,\n values: d.embedding,\n metadata: { content: d.content, ...(d.metadata ?? {}) },\n })),\n })\n },\n\n async search(embedding: number[], options = {}): Promise<RetrievedDocument[]> {\n const topK = options.topK ?? defaultTopK\n const threshold = options.threshold ?? 0\n const result = await call<{\n matches?: Array<{ id: string; score: number; metadata?: Record<string, unknown> }>\n }>(config, '/query', {\n namespace,\n topK,\n vector: embedding,\n includeMetadata: true,\n })\n return (result.matches ?? [])\n .filter(m => m.score >= threshold)\n .map(m => ({\n id: m.id,\n content: String((m.metadata ?? {}).content ?? ''),\n metadata: m.metadata,\n score: m.score,\n }))\n },\n\n async delete(ids: string[]) {\n if (ids.length === 0) return\n await call(config, '/vectors/delete', { namespace, ids })\n },\n }\n}\n","import type { RetrievedDocument, VectorDocument, VectorMemory } from '@agentskit/core'\n\nexport interface QdrantConfig {\n /** Base URL, e.g. `https://xxx.cluster-qdrant.io`. */\n url: string\n apiKey?: string\n collection: string\n topK?: number\n fetch?: typeof globalThis.fetch\n}\n\nasync function call<T>(\n config: QdrantConfig,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n const fetchImpl = config.fetch ?? globalThis.fetch\n const response = await fetchImpl(`${config.url}${path}`, {\n method,\n headers: {\n 'content-type': 'application/json',\n ...(config.apiKey ? { 'api-key': config.apiKey } : {}),\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n })\n const text = await response.text()\n if (!response.ok) throw new Error(`qdrant ${response.status}: ${text.slice(0, 200)}`)\n return (text.length > 0 ? JSON.parse(text) : {}) as T\n}\n\nexport function qdrant(config: QdrantConfig): VectorMemory {\n const defaultTopK = Math.max(1, config.topK ?? 10)\n\n return {\n async store(docs: VectorDocument[]) {\n if (docs.length === 0) return\n await call(config, 'PUT', `/collections/${config.collection}/points`, {\n points: docs.map(d => ({\n id: d.id,\n vector: d.embedding,\n payload: { content: d.content, ...(d.metadata ?? {}) },\n })),\n })\n },\n\n async search(embedding: number[], options = {}): Promise<RetrievedDocument[]> {\n const topK = options.topK ?? defaultTopK\n const threshold = options.threshold ?? 0\n const result = await call<{\n result?: Array<{\n id: string | number\n score: number\n payload?: Record<string, unknown>\n }>\n }>(config, 'POST', `/collections/${config.collection}/points/search`, {\n vector: embedding,\n limit: topK,\n with_payload: true,\n })\n return (result.result ?? [])\n .filter(m => m.score >= threshold)\n .map(m => ({\n id: String(m.id),\n content: String((m.payload ?? {}).content ?? ''),\n metadata: m.payload,\n score: m.score,\n }))\n },\n\n async delete(ids: string[]) {\n if (ids.length === 0) return\n await call(config, 'POST', `/collections/${config.collection}/points/delete`, {\n points: ids,\n })\n },\n }\n}\n","import type { RetrievedDocument, VectorDocument, VectorMemory } from '@agentskit/core'\n\nexport interface ChromaConfig {\n /** Base URL of a running Chroma HTTP server. */\n url: string\n collection: string\n topK?: number\n fetch?: typeof globalThis.fetch\n}\n\nasync function call<T>(\n config: ChromaConfig,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n const fetchImpl = config.fetch ?? globalThis.fetch\n const response = await fetchImpl(`${config.url}${path}`, {\n method,\n headers: { 'content-type': 'application/json' },\n body: body === undefined ? undefined : JSON.stringify(body),\n })\n const text = await response.text()\n if (!response.ok) throw new Error(`chroma ${response.status}: ${text.slice(0, 200)}`)\n return (text.length > 0 ? JSON.parse(text) : {}) as T\n}\n\nexport function chroma(config: ChromaConfig): VectorMemory {\n const defaultTopK = Math.max(1, config.topK ?? 10)\n\n return {\n async store(docs: VectorDocument[]) {\n if (docs.length === 0) return\n await call(config, 'POST', `/api/v1/collections/${config.collection}/upsert`, {\n ids: docs.map(d => d.id),\n embeddings: docs.map(d => d.embedding),\n documents: docs.map(d => d.content),\n metadatas: docs.map(d => d.metadata ?? {}),\n })\n },\n\n async search(embedding: number[], options = {}): Promise<RetrievedDocument[]> {\n const topK = options.topK ?? defaultTopK\n const threshold = options.threshold ?? 0\n const result = await call<{\n ids?: string[][]\n documents?: string[][]\n metadatas?: Array<Array<Record<string, unknown>>>\n distances?: number[][]\n }>(config, 'POST', `/api/v1/collections/${config.collection}/query`, {\n query_embeddings: [embedding],\n n_results: topK,\n })\n const ids = result.ids?.[0] ?? []\n const documents = result.documents?.[0] ?? []\n const metadatas = result.metadatas?.[0] ?? []\n const distances = result.distances?.[0] ?? []\n return ids\n .map((id, i) => ({\n id,\n content: documents[i] ?? '',\n metadata: metadatas[i],\n score: distances[i] !== undefined ? 1 - distances[i]! : 0,\n }))\n .filter(r => (r.score ?? 0) >= threshold)\n },\n\n async delete(ids: string[]) {\n if (ids.length === 0) return\n await call(config, 'POST', `/api/v1/collections/${config.collection}/delete`, { ids })\n },\n }\n}\n","import type { RetrievedDocument, VectorDocument, VectorMemory } from '@agentskit/core'\n\nexport interface UpstashVectorConfig {\n url: string\n token: string\n topK?: number\n fetch?: typeof globalThis.fetch\n}\n\nasync function call<T>(\n config: UpstashVectorConfig,\n path: string,\n body: unknown,\n): Promise<T> {\n const fetchImpl = config.fetch ?? globalThis.fetch\n const response = await fetchImpl(`${config.url}${path}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify(body),\n })\n const text = await response.text()\n if (!response.ok) throw new Error(`upstash-vector ${response.status}: ${text.slice(0, 200)}`)\n return (text.length > 0 ? JSON.parse(text) : {}) as T\n}\n\n/**\n * Upstash Vector — HTTP-only serverless vector DB. The REST surface\n * is tiny enough to implement directly without pulling the SDK.\n */\nexport function upstashVector(config: UpstashVectorConfig): VectorMemory {\n const defaultTopK = Math.max(1, config.topK ?? 10)\n\n return {\n async store(docs: VectorDocument[]) {\n if (docs.length === 0) return\n await call(\n config,\n '/upsert',\n docs.map(d => ({\n id: d.id,\n vector: d.embedding,\n metadata: { content: d.content, ...(d.metadata ?? {}) },\n })),\n )\n },\n\n async search(embedding: number[], options = {}): Promise<RetrievedDocument[]> {\n const topK = options.topK ?? defaultTopK\n const threshold = options.threshold ?? 0\n const result = await call<{\n result?: Array<{ id: string; score: number; metadata?: Record<string, unknown> }>\n }>(config, '/query', { vector: embedding, topK, includeMetadata: true })\n return (result.result ?? [])\n .filter(m => m.score >= threshold)\n .map(m => ({\n id: m.id,\n content: String((m.metadata ?? {}).content ?? ''),\n metadata: m.metadata,\n score: m.score,\n }))\n },\n\n async delete(ids: string[]) {\n if (ids.length === 0) return\n await call(config, '/delete', { ids })\n },\n }\n}\n","import type { ChatMemory, Message } from '@agentskit/core'\n\n/**\n * Client-side encrypted ChatMemory wrapper. Keys never leave the\n * caller — the backing store only ever sees an opaque\n * `{ iv, ct }` payload stashed in `metadata.ciphertext` and\n * `metadata.iv`; `content` becomes an empty string so rogue\n * middleware can't peek at it either.\n *\n * Uses Web Crypto (AES-GCM, 256-bit). Available on Node 20+ and all\n * modern browsers. BYO key material — typically generated per-user\n * during onboarding and stored only on their device.\n */\n\nexport interface EncryptedMemoryOptions {\n backing: ChatMemory\n /** 32-byte raw key (e.g. `crypto.getRandomValues(new Uint8Array(32))`). */\n key: Uint8Array | CryptoKey\n /** Override for tests. Defaults to `globalThis.crypto.subtle`. */\n subtle?: SubtleCrypto\n /** Random source. Defaults to `globalThis.crypto.getRandomValues`. */\n getRandomValues?: <T extends ArrayBufferView>(array: T) => T\n /** Optional AAD — content that binds ciphertext to context (user id, room). */\n aad?: Uint8Array\n}\n\nexport interface EncryptedEnvelope {\n ciphertext: string\n iv: string\n /** Plaintext-length marker so the agent sees a non-empty content hint. */\n length: number\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== 'undefined') return Buffer.from(bytes).toString('base64')\n let binary = ''\n for (const b of bytes) binary += String.fromCharCode(b)\n return btoa(binary)\n}\n\nfunction fromBase64(value: string): Uint8Array {\n if (typeof Buffer !== 'undefined') return new Uint8Array(Buffer.from(value, 'base64'))\n const binary = atob(value)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n return bytes\n}\n\nasync function resolveKey(\n subtle: SubtleCrypto,\n material: Uint8Array | CryptoKey,\n): Promise<CryptoKey> {\n if ('type' in material && material.type === 'secret') return material\n const raw = material as Uint8Array\n if (raw.byteLength !== 32) {\n throw new Error(`createEncryptedMemory: key must be 32 bytes (got ${raw.byteLength})`)\n }\n return subtle.importKey('raw', raw as BufferSource, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt'])\n}\n\nexport async function createEncryptedMemory(\n options: EncryptedMemoryOptions,\n): Promise<ChatMemory> {\n const subtle = options.subtle ?? globalThis.crypto?.subtle\n const random = options.getRandomValues ?? (<T extends ArrayBufferView>(v: T) => globalThis.crypto.getRandomValues(v as ArrayBufferView as ArrayBufferView & { buffer: ArrayBuffer }) as T)\n if (!subtle) throw new Error('createEncryptedMemory: SubtleCrypto not available')\n\n const key = await resolveKey(subtle, options.key)\n const aad = options.aad\n\n const encrypt = async (plain: string): Promise<EncryptedEnvelope> => {\n const iv = random(new Uint8Array(12))\n const data = new TextEncoder().encode(plain)\n const params: AesGcmParams = aad\n ? { name: 'AES-GCM', iv: iv as BufferSource, additionalData: aad as BufferSource }\n : { name: 'AES-GCM', iv: iv as BufferSource }\n const cipher = await subtle.encrypt(params, key, data as BufferSource)\n return {\n ciphertext: toBase64(new Uint8Array(cipher)),\n iv: toBase64(iv as Uint8Array),\n length: plain.length,\n }\n }\n\n const decrypt = async (envelope: EncryptedEnvelope): Promise<string> => {\n const iv = fromBase64(envelope.iv) as BufferSource\n const params: AesGcmParams = aad\n ? { name: 'AES-GCM', iv, additionalData: aad as BufferSource }\n : { name: 'AES-GCM', iv }\n const plain = await subtle.decrypt(params, key, fromBase64(envelope.ciphertext) as BufferSource)\n return new TextDecoder().decode(plain)\n }\n\n const encryptMessage = async (m: Message): Promise<Message> => {\n if (m.metadata?.agentskitEncrypted) return m\n const envelope = await encrypt(m.content ?? '')\n return {\n ...m,\n content: '',\n metadata: {\n ...(m.metadata ?? {}),\n agentskitEncrypted: true,\n ciphertext: envelope.ciphertext,\n iv: envelope.iv,\n length: envelope.length,\n },\n }\n }\n\n const decryptMessage = async (m: Message): Promise<Message> => {\n if (!m.metadata?.agentskitEncrypted) return m\n const envelope: EncryptedEnvelope = {\n ciphertext: String(m.metadata.ciphertext),\n iv: String(m.metadata.iv),\n length: Number(m.metadata.length ?? 0),\n }\n const content = await decrypt(envelope)\n const { agentskitEncrypted: _, ciphertext: __, iv: ___, length: ____, ...rest } = m.metadata\n return { ...m, content, metadata: Object.keys(rest).length > 0 ? rest : undefined }\n }\n\n return {\n async load() {\n const stored = await options.backing.load()\n return Promise.all(stored.map(decryptMessage))\n },\n async save(messages) {\n const encrypted = await Promise.all(messages.map(encryptMessage))\n await options.backing.save(encrypted)\n },\n async clear() {\n await options.backing.clear?.()\n },\n }\n}\n","import type { ChatMemory, Message } from '@agentskit/core'\n\nexport interface HierarchicalRecall {\n /**\n * Index a message for later retrieval. Called once per message as\n * it moves from working → recall (usually: embed + store in a\n * vector DB).\n */\n index: (message: Message) => void | Promise<void>\n /**\n * Given the hot working window, return up to `topK` messages from\n * the recall tier that are relevant to the current turn. The hub\n * splices results chronologically alongside the working window.\n */\n query: (input: { working: Message[]; topK: number }) => Message[] | Promise<Message[]>\n}\n\nexport interface HierarchicalMemoryOptions {\n /** Hot window — the messages always loaded in full. */\n working: ChatMemory\n /** Cold storage — every message ever seen is written here. */\n archival: ChatMemory\n /**\n * Mid-term recall layer (usually a vector store). Optional;\n * without it the hub behaves like virtualized memory with a hard\n * backing store.\n */\n recall?: HierarchicalRecall\n /**\n * Maximum messages to keep in `working`. Older messages spill\n * into recall + archival. Default 50.\n */\n workingLimit?: number\n /**\n * Max recalled messages to splice on each `load()`. Default 5.\n */\n recallTopK?: number\n}\n\nexport interface HierarchicalMemory extends ChatMemory {\n /** Full archival history. Always the source of truth. */\n archival: () => Promise<Message[]>\n /** Current working-window snapshot. */\n working: () => Promise<Message[]>\n}\n\nfunction mergeChronological(a: Message[], b: Message[]): Message[] {\n const out = [...a, ...b]\n out.sort((x, y) => x.createdAt.getTime() - y.createdAt.getTime())\n return out\n}\n\n/**\n * MemGPT-style tiered memory. Three tiers:\n * - working: always-loaded hot window (bounded by `workingLimit`).\n * - recall: mid-term searchable layer (usually a vector store).\n * - archival: cold store that always holds the full conversation.\n *\n * On every `save`, new messages are appended to archival, messages\n * that overflow the working window are indexed into recall, and the\n * working tier is trimmed to `workingLimit`.\n *\n * On every `load`, the hub returns working + up to `recallTopK`\n * messages surfaced by the recall tier, spliced chronologically.\n */\nexport function createHierarchicalMemory(\n options: HierarchicalMemoryOptions,\n): HierarchicalMemory {\n const workingLimit = Math.max(1, options.workingLimit ?? 50)\n const recallTopK = Math.max(0, options.recallTopK ?? 5)\n\n const loadAll = async (source: ChatMemory): Promise<Message[]> => [...(await source.load())]\n\n return {\n async load() {\n const hot = await loadAll(options.working)\n if (!options.recall || recallTopK === 0) return hot\n let recalled: Message[] = []\n try {\n recalled = [...(await options.recall.query({ working: hot, topK: recallTopK }))]\n } catch {\n recalled = []\n }\n const hotIds = new Set(hot.map(m => m.id))\n return mergeChronological(\n recalled.filter(m => !hotIds.has(m.id)),\n hot,\n )\n },\n\n async save(messages) {\n const knownArchival = await loadAll(options.archival)\n const archivalIds = new Set(knownArchival.map(m => m.id))\n const fresh = messages.filter(m => !archivalIds.has(m.id))\n\n // Archival: append everything, preserving full history.\n if (fresh.length > 0) {\n await options.archival.save(mergeChronological(knownArchival, fresh))\n }\n\n // Working: trim to the tail `workingLimit` of the caller's view.\n const tail = messages.slice(Math.max(0, messages.length - workingLimit))\n const overflow = messages.slice(0, Math.max(0, messages.length - workingLimit))\n await options.working.save(tail)\n\n if (options.recall) {\n const knownOverflow = overflow.filter(m => fresh.some(f => f.id === m.id))\n for (const m of knownOverflow) await options.recall.index(m)\n // Also index freshly saved messages that never hit working\n // (e.g. system/tool transcripts).\n const appended = fresh.filter(m => !tail.some(t => t.id === m.id))\n for (const m of appended) await options.recall.index(m)\n }\n },\n\n async clear() {\n await options.working.clear?.()\n await options.archival.clear?.()\n },\n\n async archival() {\n return loadAll(options.archival)\n },\n\n async working() {\n return loadAll(options.working)\n },\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentskit/memory",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Persistent and vector memory backends for AgentsKit.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentskit",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"access": "public"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@agentskit/core": "1.
|
|
43
|
+
"@agentskit/core": "1.6.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/better-sqlite3": "^7.6.12",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"better-sqlite3": "^12.9.0",
|
|
49
49
|
"redis": "^5.12.1",
|
|
50
50
|
"tsup": "^8.5.0",
|
|
51
|
-
"typescript": "^6.0.
|
|
51
|
+
"typescript": "^6.0.3",
|
|
52
52
|
"vectra": "^0.14.0",
|
|
53
53
|
"vitest": "^4.1.4"
|
|
54
54
|
},
|
|
@@ -56,6 +56,17 @@
|
|
|
56
56
|
"stability": "stable",
|
|
57
57
|
"stabilityNote": "File/SQLite/Redis backends — Memory contract v1."
|
|
58
58
|
},
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"homepage": "https://www.agentskit.io/docs/packages/memory",
|
|
61
|
+
"repository": {
|
|
62
|
+
"type": "git",
|
|
63
|
+
"url": "git+https://github.com/AgentsKit-io/agentskit.git",
|
|
64
|
+
"directory": "packages/memory"
|
|
65
|
+
},
|
|
66
|
+
"bugs": {
|
|
67
|
+
"url": "https://github.com/AgentsKit-io/agentskit/issues"
|
|
68
|
+
},
|
|
69
|
+
"author": "AgentsKit Contributors",
|
|
59
70
|
"scripts": {
|
|
60
71
|
"build": "tsup",
|
|
61
72
|
"test": "vitest run",
|