@agentskit/memory 0.4.0 → 0.4.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emerson Braun
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,63 +1,55 @@
1
1
  # @agentskit/memory
2
2
 
3
- Persistent and vector memory backends for [AgentsKit](https://github.com/EmersonBraun/agentskit).
3
+ Persist conversations and add vector search to your agents — swap backends without changing agent code.
4
4
 
5
- ## Install
5
+ ## Why
6
6
 
7
- ```bash
8
- npm install @agentskit/memory
9
- ```
7
+ - **Conversations that survive restarts** — SQLite for local development, Redis for production; your agent remembers context across sessions with zero code changes
8
+ - **RAG-ready vector search** — store and retrieve embeddings with `fileVectorMemory` (pure JS, no native deps) or Redis vector search for scale
9
+ - **Plug any backend** — the `VectorStore` interface is 3 methods; bring LanceDB, Pinecone, or any custom store in minutes
10
10
 
11
- Then install the backend(s) you need:
11
+ ## Install
12
12
 
13
13
  ```bash
14
- npm install better-sqlite3 # for sqliteChatMemory
15
- npm install vectra # for fileVectorMemory (default, pure JS)
16
- npm install redis # for redisChatMemory / redisVectorMemory
14
+ npm install @agentskit/memory better-sqlite3
15
+ # For production: npm install redis
16
+ # For vectors: npm install vectra
17
17
  ```
18
18
 
19
- ## Backends
20
-
21
- | Factory | Contract | Underlying lib | Native? |
22
- |---------|----------|---------------|---------|
23
- | `sqliteChatMemory({ path })` | ChatMemory | better-sqlite3 | Yes |
24
- | `redisChatMemory({ url })` | ChatMemory | redis | No |
25
- | `redisVectorMemory({ url })` | VectorMemory | redis + RediSearch | No |
26
- | `fileVectorMemory({ path })` | VectorMemory | vectra | No (pure JS) |
27
-
28
19
  ## Quick example
29
20
 
30
21
  ```ts
22
+ import { createRuntime } from '@agentskit/runtime'
23
+ import { anthropic } from '@agentskit/adapters'
31
24
  import { sqliteChatMemory, fileVectorMemory } from '@agentskit/memory'
32
25
 
33
- // Chat persistence
34
- const chatMemory = sqliteChatMemory({ path: './chat.db' })
35
-
36
- // Vector search
37
- const vectorMemory = fileVectorMemory({ path: './vectors' })
38
- await vectorMemory.store([{
39
- id: 'doc-1',
40
- content: 'AgentsKit is awesome',
41
- embedding: [0.1, 0.2, 0.3, ...],
42
- }])
43
- const results = await vectorMemory.search([0.1, 0.2, 0.3, ...], { topK: 5 })
26
+ const runtime = createRuntime({
27
+ adapter: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY, model: 'claude-sonnet-4-6' }),
28
+ memory: sqliteChatMemory({ path: './chat.db' }),
29
+ })
30
+
31
+ // Agent now remembers previous conversations across process restarts
32
+ const result = await runtime.run('What did we discuss yesterday?')
33
+ console.log(result.content)
44
34
  ```
45
35
 
46
- ## Custom vector store
36
+ ## With RAG
47
37
 
48
- Bring your own vector backend (LanceDB, usearch, Pinecone, etc.):
38
+ Use a **vector** backend with [`@agentskit/rag`](https://www.npmjs.com/package/@agentskit/rag) `createRAG({ embed, store })` — `fileVectorMemory` and `redisVectorMemory` implement `VectorMemory` for chunk storage and search.
49
39
 
50
- ```ts
51
- import type { VectorStore } from '@agentskit/memory'
40
+ ## Next steps
52
41
 
53
- const myStore: VectorStore = {
54
- async upsert(docs) { /* your logic */ },
55
- async query(vector, topK) { /* your logic */ },
56
- async delete(ids) { /* your logic */ },
57
- }
42
+ - Swap `sqliteChatMemory` for **Redis** or **in-memory** variants from the same package for different deployment targets
43
+ - Pair **embedders** from [`@agentskit/adapters`](https://www.npmjs.com/package/@agentskit/adapters) with RAG see [`@agentskit/rag`](https://www.npmjs.com/package/@agentskit/rag)
58
44
 
59
- const memory = fileVectorMemory({ path: './vectors', store: myStore })
60
- ```
45
+ ## Ecosystem
46
+
47
+ | Package | Role |
48
+ |---------|------|
49
+ | [@agentskit/core](https://www.npmjs.com/package/@agentskit/core) | `Memory`, `VectorMemory` types |
50
+ | [@agentskit/rag](https://www.npmjs.com/package/@agentskit/rag) | Chunking + retrieval on top of vector memory |
51
+ | [@agentskit/runtime](https://www.npmjs.com/package/@agentskit/runtime) | `memory` / `retriever` options |
52
+ | [@agentskit/adapters](https://www.npmjs.com/package/@agentskit/adapters) | Embeddings for RAG |
61
53
 
62
54
  ## Docs
63
55
 
@@ -0,0 +1,8 @@
1
+ import type { VectorMemory } from '@agentskit/core';
2
+ import type { VectorStore } from './vector-store';
3
+ export interface FileVectorMemoryConfig {
4
+ path: string;
5
+ store?: VectorStore;
6
+ }
7
+ export declare function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory;
8
+ //# sourceMappingURL=file-vector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-vector.d.ts","sourceRoot":"","sources":["../src/file-vector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqC,MAAM,iBAAiB,CAAA;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAkED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,YAAY,CAkC7E"}
package/dist/index.cjs CHANGED
@@ -1,32 +1,20 @@
1
1
  'use strict';
2
2
 
3
+ var core = require('@agentskit/core');
4
+
3
5
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
6
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
7
  }) : x)(function(x) {
6
8
  if (typeof require !== "undefined") return require.apply(this, arguments);
7
9
  throw Error('Dynamic require of "' + x + '" is not supported');
8
10
  });
9
-
10
- // src/sqlite.ts
11
- function serializeMessages(messages) {
12
- const record = {
13
- version: 1,
14
- messages: messages.map((m) => ({
15
- ...m,
16
- createdAt: m.createdAt.toISOString()
17
- }))
18
- };
19
- return JSON.stringify(record);
11
+ function encodeMessages(messages) {
12
+ return JSON.stringify(core.serializeMessages(messages));
20
13
  }
21
- function deserializeMessages(json) {
14
+ function decodeMessages(json) {
22
15
  if (!json) return [];
23
16
  try {
24
- const record = JSON.parse(json);
25
- if (!record?.messages) return [];
26
- return record.messages.map((m) => ({
27
- ...m,
28
- createdAt: new Date(m.createdAt)
29
- }));
17
+ return core.deserializeMessages(JSON.parse(json));
30
18
  } catch {
31
19
  return [];
32
20
  }
@@ -61,11 +49,11 @@ function sqliteChatMemory(config) {
61
49
  async load() {
62
50
  const db = await getDb();
63
51
  const row = db.prepare("SELECT messages FROM conversations WHERE id = ?").get(conversationId);
64
- return deserializeMessages(row?.messages);
52
+ return decodeMessages(row?.messages);
65
53
  },
66
54
  async save(messages) {
67
55
  const db = await getDb();
68
- const json = serializeMessages(messages);
56
+ const json = encodeMessages(messages);
69
57
  db.prepare(`
70
58
  INSERT INTO conversations (id, messages) VALUES (?, ?)
71
59
  ON CONFLICT(id) DO UPDATE SET messages = ?
@@ -112,25 +100,13 @@ async function createRedisClientAdapter(url) {
112
100
  }
113
101
 
114
102
  // src/redis-chat.ts
115
- function serializeMessages2(messages) {
116
- const record = {
117
- version: 1,
118
- messages: messages.map((m) => ({
119
- ...m,
120
- createdAt: m.createdAt.toISOString()
121
- }))
122
- };
123
- return JSON.stringify(record);
103
+ function encodeMessages2(messages) {
104
+ return JSON.stringify(core.serializeMessages(messages));
124
105
  }
125
- function deserializeMessages2(json) {
106
+ function decodeMessages2(json) {
126
107
  if (!json) return [];
127
108
  try {
128
- const record = JSON.parse(json);
129
- if (!record?.messages) return [];
130
- return record.messages.map((m) => ({
131
- ...m,
132
- createdAt: new Date(m.createdAt)
133
- }));
109
+ return core.deserializeMessages(JSON.parse(json));
134
110
  } catch {
135
111
  return [];
136
112
  }
@@ -149,11 +125,11 @@ function redisChatMemory(config) {
149
125
  async load() {
150
126
  const client = await getClient();
151
127
  const json = await client.get(key);
152
- return deserializeMessages2(json);
128
+ return decodeMessages2(json);
153
129
  },
154
130
  async save(messages) {
155
131
  const client = await getClient();
156
- await client.set(key, serializeMessages2(messages));
132
+ await client.set(key, encodeMessages2(messages));
157
133
  },
158
134
  async clear() {
159
135
  const client = await getClient();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["serializeMessages","deserializeMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\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 deserializeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = serializeMessages(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 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 serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\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 deserializeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, serializeMessages(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/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["serializeMessages","deserializeMessages","encodeMessages","decodeMessages"],"mappings":";;;;;;;;;;AAQA,SAAS,eAAe,QAAA,EAA6B;AACnD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAUA,sBAAA,CAAkB,QAAQ,CAAC,CAAA;AACnD;AAEA,SAAS,eAAe,IAAA,EAAqC;AAC3D,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,IAAI;AACF,IAAA,OAAOC,wBAAA,CAAoB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAiB,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AASA,eAAe,aAAa,IAAA,EAAiC;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,OAAO,gBAAgB,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,IAAI,OAAA,IAAW,GAAA;AAChC,IAAA,OAAO,IAAK,SAAyC,IAAI,CAAA;AAAA,EAC3D,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAAA,EAC9F;AACF;AAEO,SAAS,iBAAiB,MAAA,EAA4C;AAC3E,EAAA,MAAM,cAAA,GAAiB,OAAO,cAAA,IAAkB,SAAA;AAChD,EAAA,IAAI,SAAA,GAAsC,IAAA;AAE1C,EAAA,MAAM,QAAQ,MAAyB;AACrC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,CAAE,KAAK,CAAA,EAAA,KAAM;AAC/C,QAAA,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAKV,EAAE,GAAA,EAAI;AACP,QAAA,OAAO,EAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,GAAO;AACX,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,MAAM,EAAA,CAAG,OAAA,CAAQ,iDAAiD,CAAA,CAAE,IAAI,cAAc,CAAA;AAC5F,MAAA,OAAO,cAAA,CAAe,KAAK,QAA8B,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA,MAAM,KAAK,QAAA,EAAU;AACnB,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,IAAA,GAAO,eAAe,QAAQ,CAAA;AACpC,MAAA,EAAA,CAAG,OAAA,CAAQ;AAAA;AAAA;AAAA,MAAA,CAGV,CAAA,CAAE,GAAA,CAAI,cAAA,EAAgB,IAAA,EAAM,IAAI,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,MAAM,KAAA,GAAQ;AACZ,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,EAAA,CAAG,OAAA,CAAQ,wCAAwC,CAAA,CAAE,GAAA,CAAI,cAAc,CAAA;AAAA,IACzE;AAAA,GACF;AACF;;;ACzDA,eAAsB,yBAAyB,GAAA,EAA0C;AACvF,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,MAAM,OAAO,OAAO,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,CAAa,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,OAAO,OAAA,EAAQ;AAErB,EAAA,OAAO;AAAA,IACL,MAAM,IAAI,GAAA,EAAK;AACb,MAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,MAAM,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO;AACpB,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,MAAM,IAAI,GAAA,EAAK;AACb,MAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,CAAC,GAAG,CAAA;AAC5C,MAAA,IAAI,KAAK,MAAA,GAAS,CAAA,EAAG,MAAM,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,MAAM,KAAK,OAAA,EAAS;AAClB,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,MAAM,UAAA,GAAa;AACjB,MAAA,MAAM,OAAO,UAAA,EAAW;AAAA,IAC1B,CAAA;AAAA,IACA,MAAM,IAAA,CAAK,OAAA,EAAA,GAAY,IAAA,EAAM;AAC3B,MAAA,OAAO,MAAM,MAAA,CAAO,WAAA,CAAY,CAAC,OAAA,EAAS,GAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAC,CAAA;AAAA,IAChE;AAAA,GACF;AACF;;;ACzCA,SAASC,gBAAe,QAAA,EAA6B;AACnD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAUF,sBAAAA,CAAkB,QAAQ,CAAC,CAAA;AACnD;AAEA,SAASG,gBAAe,IAAA,EAAgC;AACtD,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,IAAI;AACF,IAAA,OAAOF,wBAAAA,CAAoB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAiB,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,gBAAgB,MAAA,EAA2C;AACzE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAa,gBAAA;AACnC,EAAA,MAAM,MAAA,GAAS,OAAO,cAAA,IAAkB,SAAA;AACxC,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC/B,EAAA,IAAI,aAAA,GAAoD,IAAA;AAExD,EAAA,MAAM,YAAY,MAAmC;AACnD,IAAA,IAAI,OAAO,MAAA,EAAQ,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,aAAA,EAAe,aAAA,GAAgB,wBAAA,CAAyB,OAAO,GAAG,CAAA;AACvE,IAAA,OAAO,aAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,GAAO;AACX,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AACjC,MAAA,OAAOE,gBAAe,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,MAAM,KAAK,QAAA,EAAU;AACnB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,GAAA,EAAKD,eAAAA,CAAe,QAAQ,CAAC,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,MAAM,KAAA,GAAQ;AACZ,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA,IACtB;AAAA,GACF;AACF;;;ACxCA,SAAS,cAAc,MAAA,EAA0B;AAC/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAA,CAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,kBAAkB,MAAA,EAA+C;AAC/E,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,uBAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,IAAa,eAAA;AACnC,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACxC,EAAA,IAAI,aAAA,GAAoD,IAAA;AACxD,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,YAAY,MAAmC;AACnD,IAAA,IAAI,OAAO,MAAA,EAAQ,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,aAAA,EAAe,aAAA,GAAgB,wBAAA,CAAyB,OAAO,GAAG,CAAA;AACvE,IAAA,OAAO,aAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,EAA4B,IAAA,KAAiB;AACtE,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,IAAA;AAAA,QACX,WAAA;AAAA,QAAa,SAAA;AAAA,QACb,IAAA;AAAA,QAAM,MAAA;AAAA,QACN,QAAA;AAAA,QAAU,GAAA;AAAA,QAAK,GAAG,MAAM,CAAA,CAAA,CAAA;AAAA,QACxB,QAAA;AAAA,QACA,SAAA;AAAA,QAAW,MAAA;AAAA,QACX,UAAA;AAAA,QAAY,MAAA;AAAA,QACZ,WAAA;AAAA,QAAa,QAAA;AAAA,QAAU,MAAA;AAAA,QAAQ,GAAA;AAAA,QAC/B,MAAA;AAAA,QAAQ,SAAA;AAAA,QACR,KAAA;AAAA,QAAO,IAAA;AAAA,QACP,iBAAA;AAAA,QAAmB;AAAA,OACrB;AAAA,IACF,SAAS,GAAA,EAAc;AACrB,MAAA,MAAM,GAAA,GAAM,OAAO,GAAG,CAAA;AACtB,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,sBAAsB,GAAG,MAAM,GAAA;AAAA,IACnD;AACA,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,MAAM,IAAA,EAAwB;AAClC,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,OAAO,UAAA,IAAc,IAAA,CAAK,CAAC,CAAA,EAAG,UAAU,MAAA,IAAU,CAAA;AACxD,MAAA,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,WAAA,CAAY,QAAQ,IAAI,CAAA;AAE5C,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAC/B,QAAA,MAAM,MAAA,CAAO,IAAA;AAAA,UACX,MAAA;AAAA,UAAQ,GAAA;AAAA,UACR,SAAA;AAAA,UAAW,GAAA,CAAI,OAAA;AAAA,UACf,UAAA;AAAA,UAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,IAAY,EAAE,CAAA;AAAA,UAC7C,WAAA;AAAA,UAAa,aAAA,CAAc,IAAI,SAAS;AAAA,SAC1C;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,SAAA,EAAW,OAAA,EAAS;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,CAAA;AAC9B,MAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,CAAA;AAExC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA;AAAA,QAC1B,WAAA;AAAA,QAAa,SAAA;AAAA,QACb,WAAW,IAAI,CAAA,0BAAA,CAAA;AAAA,QACf,QAAA;AAAA,QAAU,GAAA;AAAA,QAAK,KAAA;AAAA,QAAO,cAAc,SAAS,CAAA;AAAA,QAC7C,QAAA;AAAA,QAAU,OAAA;AAAA,QACV,QAAA;AAAA,QAAU,GAAA;AAAA,QAAK,SAAA;AAAA,QAAW,UAAA;AAAA,QAAY,OAAA;AAAA,QACtC,SAAA;AAAA,QAAW;AAAA,OACb;AAEA,MAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAM,KAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAEzD,MAAA,MAAM,OAA4B,EAAC;AAEnC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AACzC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAC5B,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC3B,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAE5B,QAAA,MAAM,WAAmC,EAAC;AAC1C,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,EAAG;AACzC,UAAA,QAAA,CAAS,OAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,QACpC;AAEA,QAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,UAAA,CAAW,QAAA,CAAS,SAAS,GAAG,CAAA;AAClD,QAAA,IAAI,QAAQ,SAAA,EAAW;AAEvB,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAI,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,MAAM,KAAK,EAAE,CAAA;AAAA,UAChC,OAAA,EAAS,SAAS,OAAA,IAAW,EAAA;AAAA,UAC7B,KAAA;AAAA,UACA,UAAU,QAAA,CAAS,QAAA,GAAW,KAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,GAAI;AAAA,SAC/D,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAM,OAAO,GAAA,EAAK;AAChB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAA,EAAA,KAAM,GAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAC,CAAA;AAAA,IACnD;AAAA,GACF;AACF;;;AC3GA,SAAS,aAAA,GAAmE;AAC1E,EAAA,IAAI;AAEF,IAAA,OAAO,UAAQ,QAAQ,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAWA,SAAS,kBAAkB,OAAA,EAA8B;AACvD,EAAA,IAAI,KAAA,GAA4B,IAAA;AAEhC,EAAA,MAAM,WAAW,YAAkC;AACjD,IAAA,IAAI,OAAO,OAAO,KAAA;AAClB,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,aAAA,EAAc;AACrC,IAAA,KAAA,GAAQ,IAAI,WAAW,OAAO,CAAA;AAC9B,IAAA,IAAI,CAAE,MAAM,KAAA,CAAM,cAAA,EAAe,EAAI;AACnC,MAAA,MAAM,MAAM,WAAA,EAAY;AAAA,IAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,EAAS;AAC3B,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,IAAI,UAAA,CAAW;AAAA,UACnB,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,UAAU,EAAE,GAAA,EAAK,IAAI,EAAA,EAAI,GAAG,IAAI,QAAA;AAAS,SAC1C,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,MAAM,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM;AACxB,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,EAAS;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,UAAA,CAAW,QAAQ,IAAI,CAAA;AACjD,MAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,MAAM;AAAA,QACvB,IAAI,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,QACpC,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAA,EAAU,EAAE,IAAA,CAAK;AAAA,OACnB,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IACA,MAAM,OAAO,GAAA,EAAK;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,EAAS;AAC3B,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,SAAA,EAAU;AAClC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,SAAS,GAAA,IAAO,IAAA,CAAK,EAAE,CAAC,CAAA,EAAG;AACtD,UAAA,MAAM,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AAEO,SAAS,iBAAiB,MAAA,EAA8C;AAC7E,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAC3D,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAE7C,EAAA,OAAO;AAAA,IACL,MAAM,MAAM,IAAA,EAAwB;AAClC,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,OAAO,CAAA;AAAA,MACtC;AACA,MAAA,MAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QAClC,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,QAAQ,GAAA,CAAI,SAAA;AAAA,QACZ,UAAU,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,GAAG,IAAI,QAAA;AAAS,QAClD,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,SAAA,EAAW,OAAA,EAAS;AAC/B,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,CAAA;AAC9B,MAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,CAAA;AACxC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,KAAA,CAAM,WAAW,IAAI,CAAA;AAEjD,MAAA,OAAO,OAAA,CACJ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA,CAChC,GAAA,CAAI,CAAC,CAAA,MAA0B;AAAA,QAC9B,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,OAAA,IAAW,aAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,EAAE,CAAA;AAAA,QAClE,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,UAAU,CAAA,CAAE;AAAA,OACd,CAAE,CAAA;AAAA,IACN,CAAA;AAAA,IACA,MAAM,OAAO,GAAA,EAAK;AAChB,MAAA,KAAA,MAAW,EAAA,IAAM,GAAA,EAAK,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA;AAC5C,MAAA,MAAM,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,IACxB;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["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"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACzF,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -1,30 +1,18 @@
1
+ import { serializeMessages, deserializeMessages } from '@agentskit/core';
2
+
1
3
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
4
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
5
  }) : x)(function(x) {
4
6
  if (typeof require !== "undefined") return require.apply(this, arguments);
5
7
  throw Error('Dynamic require of "' + x + '" is not supported');
6
8
  });
7
-
8
- // src/sqlite.ts
9
- function serializeMessages(messages) {
10
- const record = {
11
- version: 1,
12
- messages: messages.map((m) => ({
13
- ...m,
14
- createdAt: m.createdAt.toISOString()
15
- }))
16
- };
17
- return JSON.stringify(record);
9
+ function encodeMessages(messages) {
10
+ return JSON.stringify(serializeMessages(messages));
18
11
  }
19
- function deserializeMessages(json) {
12
+ function decodeMessages(json) {
20
13
  if (!json) return [];
21
14
  try {
22
- const record = JSON.parse(json);
23
- if (!record?.messages) return [];
24
- return record.messages.map((m) => ({
25
- ...m,
26
- createdAt: new Date(m.createdAt)
27
- }));
15
+ return deserializeMessages(JSON.parse(json));
28
16
  } catch {
29
17
  return [];
30
18
  }
@@ -59,11 +47,11 @@ function sqliteChatMemory(config) {
59
47
  async load() {
60
48
  const db = await getDb();
61
49
  const row = db.prepare("SELECT messages FROM conversations WHERE id = ?").get(conversationId);
62
- return deserializeMessages(row?.messages);
50
+ return decodeMessages(row?.messages);
63
51
  },
64
52
  async save(messages) {
65
53
  const db = await getDb();
66
- const json = serializeMessages(messages);
54
+ const json = encodeMessages(messages);
67
55
  db.prepare(`
68
56
  INSERT INTO conversations (id, messages) VALUES (?, ?)
69
57
  ON CONFLICT(id) DO UPDATE SET messages = ?
@@ -110,25 +98,13 @@ async function createRedisClientAdapter(url) {
110
98
  }
111
99
 
112
100
  // src/redis-chat.ts
113
- function serializeMessages2(messages) {
114
- const record = {
115
- version: 1,
116
- messages: messages.map((m) => ({
117
- ...m,
118
- createdAt: m.createdAt.toISOString()
119
- }))
120
- };
121
- return JSON.stringify(record);
101
+ function encodeMessages2(messages) {
102
+ return JSON.stringify(serializeMessages(messages));
122
103
  }
123
- function deserializeMessages2(json) {
104
+ function decodeMessages2(json) {
124
105
  if (!json) return [];
125
106
  try {
126
- const record = JSON.parse(json);
127
- if (!record?.messages) return [];
128
- return record.messages.map((m) => ({
129
- ...m,
130
- createdAt: new Date(m.createdAt)
131
- }));
107
+ return deserializeMessages(JSON.parse(json));
132
108
  } catch {
133
109
  return [];
134
110
  }
@@ -147,11 +123,11 @@ function redisChatMemory(config) {
147
123
  async load() {
148
124
  const client = await getClient();
149
125
  const json = await client.get(key);
150
- return deserializeMessages2(json);
126
+ return decodeMessages2(json);
151
127
  },
152
128
  async save(messages) {
153
129
  const client = await getClient();
154
- await client.set(key, serializeMessages2(messages));
130
+ await client.set(key, encodeMessages2(messages));
155
131
  },
156
132
  async clear() {
157
133
  const client = await getClient();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["serializeMessages","deserializeMessages"],"mappings":"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","file":"index.js","sourcesContent":["import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\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 deserializeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = serializeMessages(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 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 serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\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 deserializeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, serializeMessages(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/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["encodeMessages","serializeMessages","decodeMessages","deserializeMessages"],"mappings":"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","file":"index.js","sourcesContent":["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"]}
@@ -0,0 +1,8 @@
1
+ import type { ChatMemory } from '@agentskit/core';
2
+ import type { RedisConnectionConfig } from './redis-client';
3
+ export interface RedisChatMemoryConfig extends RedisConnectionConfig {
4
+ keyPrefix?: string;
5
+ conversationId?: string;
6
+ }
7
+ export declare function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory;
8
+ //# sourceMappingURL=redis-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-chat.d.ts","sourceRoot":"","sources":["../src/redis-chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAA;AACxE,OAAO,KAAK,EAAsB,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAG/E,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA2BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,UAAU,CA2BzE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Internal Redis client adapter interface.
3
+ * Abstracts the underlying Redis library so it can be swapped
4
+ * (e.g., from `redis` to `ioredis`) without changing consumers.
5
+ */
6
+ export interface RedisClientAdapter {
7
+ get(key: string): Promise<string | null>;
8
+ set(key: string, value: string): Promise<void>;
9
+ del(key: string | string[]): Promise<void>;
10
+ keys(pattern: string): Promise<string[]>;
11
+ disconnect(): Promise<void>;
12
+ call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>;
13
+ }
14
+ export interface RedisConnectionConfig {
15
+ url: string;
16
+ client?: RedisClientAdapter;
17
+ }
18
+ export declare function createRedisClientAdapter(url: string): Promise<RedisClientAdapter>;
19
+ //# sourceMappingURL=redis-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-client.d.ts","sourceRoot":"","sources":["../src/redis-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC/E;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAC5B;AAED,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgCvF"}
@@ -0,0 +1,9 @@
1
+ import type { VectorMemory } from '@agentskit/core';
2
+ import type { RedisConnectionConfig } from './redis-client';
3
+ export interface RedisVectorMemoryConfig extends RedisConnectionConfig {
4
+ indexName?: string;
5
+ keyPrefix?: string;
6
+ dimensions?: number;
7
+ }
8
+ export declare function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory;
9
+ //# sourceMappingURL=redis-vector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-vector.d.ts","sourceRoot":"","sources":["../src/redis-vector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqC,MAAM,iBAAiB,CAAA;AACtF,OAAO,KAAK,EAAsB,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAG/E,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAUD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,YAAY,CAiG/E"}
@@ -0,0 +1,7 @@
1
+ import type { ChatMemory } from '@agentskit/core';
2
+ export interface SqliteChatMemoryConfig {
3
+ path: string;
4
+ conversationId?: string;
5
+ }
6
+ export declare function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory;
7
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAA;AAExE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA4CD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,UAAU,CAsC3E"}
@@ -0,0 +1,16 @@
1
+ export interface VectorStoreDocument {
2
+ id: string;
3
+ vector: number[];
4
+ metadata: Record<string, unknown>;
5
+ }
6
+ export interface VectorStoreResult {
7
+ id: string;
8
+ score: number;
9
+ metadata: Record<string, unknown>;
10
+ }
11
+ export interface VectorStore {
12
+ upsert(docs: VectorStoreDocument[]): Promise<void>;
13
+ query(vector: number[], topK: number): Promise<VectorStoreResult[]>;
14
+ delete(ids: string[]): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC"}
package/package.json CHANGED
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "name": "@agentskit/memory",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Persistent and vector memory backends for AgentsKit.",
5
+ "keywords": [
6
+ "agentskit",
7
+ "ai",
8
+ "agents",
9
+ "llm",
10
+ "chat",
11
+ "typescript",
12
+ "memory",
13
+ "vector",
14
+ "embeddings"
15
+ ],
5
16
  "type": "module",
6
17
  "main": "./dist/index.cjs",
7
18
  "module": "./dist/index.js",
@@ -19,23 +30,23 @@
19
30
  "publishConfig": {
20
31
  "access": "public"
21
32
  },
22
- "scripts": {
23
- "build": "tsup",
24
- "test": "vitest run",
25
- "lint": "tsc --noEmit",
26
- "dev": "tsup --watch"
27
- },
28
33
  "dependencies": {
29
- "@agentskit/core": "workspace:*"
34
+ "@agentskit/core": "0.4.2"
30
35
  },
31
36
  "devDependencies": {
32
37
  "@types/better-sqlite3": "^7.6.12",
33
- "@types/node": "^24.0.0",
34
- "better-sqlite3": "^11.9.1",
38
+ "@types/node": "^25.5.2",
39
+ "better-sqlite3": "^12.8.0",
35
40
  "redis": "^5.11.0",
36
41
  "tsup": "^8.5.0",
37
- "typescript": "^5.9.2",
38
- "vectra": "^0.9.0",
42
+ "typescript": "^6.0.2",
43
+ "vectra": "^0.14.0",
39
44
  "vitest": "^4.1.2"
45
+ },
46
+ "scripts": {
47
+ "build": "tsup",
48
+ "test": "vitest run",
49
+ "lint": "tsc --noEmit",
50
+ "dev": "tsup --watch"
40
51
  }
41
- }
52
+ }