@amaster.ai/pi-memory-mem0 0.1.8 → 0.1.9
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 +86 -28
- package/dist/dedup.d.ts +1 -1
- package/dist/dedup.js +3 -3
- package/dist/dedup.js.map +1 -1
- package/dist/index.d.ts +17 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +181 -25
- package/dist/index.js.map +1 -1
- package/dist/prefetch.d.ts +19 -0
- package/dist/prefetch.d.ts.map +1 -0
- package/dist/prefetch.js +58 -0
- package/dist/prefetch.js.map +1 -0
- package/dist/privacy.d.ts +2 -1
- package/dist/privacy.d.ts.map +1 -1
- package/dist/privacy.js +3 -1
- package/dist/privacy.js.map +1 -1
- package/dist/provider.d.ts +13 -5
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +179 -42
- package/dist/provider.js.map +1 -1
- package/dist/tools.d.ts +26 -10
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +99 -89
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +17 -5
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -2,22 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Semantic memory extension powered by [Mem0](https://mem0.ai), with Platform, embedded, and self-hosted backends and three memory modes (hybrid, active, passive).
|
|
6
6
|
|
|
7
7
|
## How It Works
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
**Passive side**: after each conversation turn, the user + assistant messages are automatically sent to Mem0 for fact extraction and storage. When you send a prompt, a semantic search is prefetched in the background and relevant memories are recalled before the agent starts — **zero effort required**.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
**Active side**: the agent gets a `mem0_memory` tool (`search` / `add` / `get_all` / `delete`) so it can look up and manage memories on its own initiative — same idea as the official `@mem0/pi-agent-plugin`, but backed by this package's provider abstraction, so it works with Platform, embedded, **and** self-hosted Mem0.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Safety boundaries:
|
|
14
|
+
|
|
15
|
+
- **Recall channel**: recalled memories are injected as a custom message delivered on the user channel — never into the system prompt. Each entry is wrapped as `[UNTRUSTED MEMORY DATA]` (JSON-quoted), and entries matching prompt-injection patterns are replaced with `[BLOCKED UNTRUSTED MEMORY: ...]`.
|
|
16
|
+
- **Project namespacing**: memories are scoped to `userId:project:<cwd-hash>` by default, so one project's memories are not visible in another. Set `userIdScope: "exact"` when one identity must be shared across projects.
|
|
17
|
+
- **Credential redaction**: private keys, bearer tokens, and `api_key=…`-style values are redacted before anything is stored.
|
|
18
|
+
- **Platform mode disclosure**: in `platform` mode the captured turns leave your machine and are processed by Mem0 Cloud. Use `embedded` or `self-hosted` mode to keep memory traffic off third-party infrastructure.
|
|
19
|
+
|
|
20
|
+
## Modes
|
|
21
|
+
|
|
22
|
+
### Backend Modes
|
|
14
23
|
|
|
15
24
|
| Mode | Vector Store | Persistence | Dependencies | Use Case |
|
|
16
25
|
|------|-------------|-------------|--------------|----------|
|
|
17
26
|
| `platform` | Mem0 Cloud | Cloud-managed | `MEM0_API_KEY` | Quick start, multi-device sync |
|
|
18
|
-
| `
|
|
27
|
+
| `embedded` | Mem0 OSS vector store | Vector-store managed | LLM + Embedding API | Data privacy, no Mem0 Cloud |
|
|
28
|
+
| `self-hosted` | Mem0 OSS REST server | Server-managed | Server URL, optional API key | Shared infrastructure |
|
|
29
|
+
|
|
30
|
+
### Memory Modes
|
|
31
|
+
|
|
32
|
+
| `memoryMode` | Auto capture + recall | `mem0_memory` tool | Use Case |
|
|
33
|
+
|--------------|----------------------|--------------------|----------|
|
|
34
|
+
| `hybrid` (default) | ✅ | ✅ | Best recall: automatic context plus agent-driven lookup |
|
|
35
|
+
| `active` | ❌ | ✅ | No background traffic; the agent decides every read/write |
|
|
36
|
+
| `passive` | ✅ | ❌ | Zero tool surface; fully automatic memory |
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"pi-memory-mem0": {
|
|
41
|
+
"mode": "embedded",
|
|
42
|
+
"memoryMode": "hybrid"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
19
46
|
|
|
20
|
-
## Architecture (
|
|
47
|
+
## Architecture (Embedded Mode)
|
|
21
48
|
|
|
22
49
|
```
|
|
23
50
|
User ←→ Agent ←→ Mem0 OSS Memory
|
|
@@ -50,14 +77,14 @@ in user or agent settings.
|
|
|
50
77
|
}
|
|
51
78
|
```
|
|
52
79
|
|
|
53
|
-
###
|
|
80
|
+
### Embedded Mode (Recommended)
|
|
54
81
|
|
|
55
82
|
Reuses API keys and base URLs from pi's configured model providers — **no extra environment variables needed**.
|
|
56
83
|
|
|
57
84
|
```json
|
|
58
85
|
{
|
|
59
86
|
"pi-memory-mem0": {
|
|
60
|
-
"mode": "
|
|
87
|
+
"mode": "embedded",
|
|
61
88
|
"userId": "${USER}"
|
|
62
89
|
}
|
|
63
90
|
}
|
|
@@ -65,6 +92,24 @@ Reuses API keys and base URLs from pi's configured model providers — **no extr
|
|
|
65
92
|
|
|
66
93
|
Defaults to OpenAI `text-embedding-3-small` (embedding) + `gpt-4.1-nano` (extraction). API keys and base URLs are automatically resolved from pi's model registry.
|
|
67
94
|
|
|
95
|
+
Existing settings with `mode: "open-source"` continue to load as `embedded`, but `open-source` is not part of the supported configuration interface. New settings should use `embedded`.
|
|
96
|
+
|
|
97
|
+
### Self-Hosted Mode
|
|
98
|
+
|
|
99
|
+
Calls the OSS REST server directly. The server uses `/memories` and `/search`, not the Mem0 Platform `/v1` paths.
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"pi-memory-mem0": {
|
|
104
|
+
"mode": "self-hosted",
|
|
105
|
+
"baseUrl": "${MEM0_BASE_URL}",
|
|
106
|
+
"apiKey": "${MEM0_API_KEY}",
|
|
107
|
+
"userId": "${PAPERCLIP_COMPANY_ID}",
|
|
108
|
+
"userIdScope": "exact"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
68
113
|
### Custom Provider
|
|
69
114
|
|
|
70
115
|
When your model registry defines a custom provider with `api: "openai-completions"`, you can use it directly:
|
|
@@ -72,7 +117,7 @@ When your model registry defines a custom provider with `api: "openai-completion
|
|
|
72
117
|
```json
|
|
73
118
|
{
|
|
74
119
|
"pi-memory-mem0": {
|
|
75
|
-
"mode": "
|
|
120
|
+
"mode": "embedded",
|
|
76
121
|
"oss": {
|
|
77
122
|
"llm": {
|
|
78
123
|
"provider": "my-provider",
|
|
@@ -97,7 +142,7 @@ The extension automatically:
|
|
|
97
142
|
```json
|
|
98
143
|
{
|
|
99
144
|
"pi-memory-mem0": {
|
|
100
|
-
"mode": "
|
|
145
|
+
"mode": "embedded",
|
|
101
146
|
"userId": "${USER}",
|
|
102
147
|
"oss": {
|
|
103
148
|
"llm": {
|
|
@@ -121,7 +166,7 @@ For production workloads that need a dedicated vector database:
|
|
|
121
166
|
```json
|
|
122
167
|
{
|
|
123
168
|
"pi-memory-mem0": {
|
|
124
|
-
"mode": "
|
|
169
|
+
"mode": "embedded",
|
|
125
170
|
"oss": {
|
|
126
171
|
"vectorStore": {
|
|
127
172
|
"provider": "qdrant",
|
|
@@ -140,10 +185,13 @@ The configured vector store always owns persistence. To request an intentionally
|
|
|
140
185
|
|
|
141
186
|
| Field | Type | Default | Description |
|
|
142
187
|
|-------|------|---------|-------------|
|
|
143
|
-
| `mode` | `"platform"` \| `"
|
|
144
|
-
| `
|
|
145
|
-
| `
|
|
188
|
+
| `mode` | `"platform"` \| `"embedded"` \| `"self-hosted"` | `"platform"` | Operating mode |
|
|
189
|
+
| `memoryMode` | `"hybrid"` \| `"active"` \| `"passive"` | `"hybrid"` | Memory behavior: tool + automation, tool only, or automation only |
|
|
190
|
+
| `apiKey` | string | — | Platform or self-hosted API key. Supports `${MEM0_API_KEY}` |
|
|
191
|
+
| `baseUrl` | string | `https://api.mem0.ai` | Platform override; required for self-hosted mode |
|
|
192
|
+
| `requestTimeoutMs` | number | `30000` | Self-hosted request timeout |
|
|
146
193
|
| `userId` | string | `$USER` or `"default-user"` | Memory scoping identifier |
|
|
194
|
+
| `userIdScope` | `"project"` \| `"exact"` | `"project"` | Append the cwd hash or use `userId` verbatim |
|
|
147
195
|
| `topK` | number | `5` | Max recalled memories per turn |
|
|
148
196
|
| `useRegistryKeys` | boolean | `true` | Whether OSS mode resolves keys from pi registry |
|
|
149
197
|
| `oss.llm` | object | OpenAI gpt-4.1-nano | OSS extraction model |
|
|
@@ -158,9 +206,10 @@ The configured vector store always owns persistence. To request an intentionally
|
|
|
158
206
|
| Mode | Vector Data | History |
|
|
159
207
|
|------|-------------|---------|
|
|
160
208
|
| Platform | Mem0 Cloud | Cloud-managed |
|
|
161
|
-
|
|
|
162
|
-
|
|
|
163
|
-
|
|
|
209
|
+
| Embedded (default paths) | `<home>/memories/mem0-vectors.db` | `<home>/memories/mem0-history.db` |
|
|
210
|
+
| Embedded (`memory`, `dbPath: ":memory:"`) | Process-local SQLite; lost on restart | `<home>/memories/mem0-history.db` |
|
|
211
|
+
| Embedded (Qdrant) | Qdrant server | `<home>/memories/mem0-history.db` |
|
|
212
|
+
| Self-hosted | Remote server | Remote server |
|
|
164
213
|
|
|
165
214
|
The `home` directory is resolved via `resolveHome()` from `@amaster.ai/pi-shared/settings` (defaults to `~/.pi/agent`).
|
|
166
215
|
|
|
@@ -179,7 +228,7 @@ This happens transparently — just configure the provider name as it appears in
|
|
|
179
228
|
|
|
180
229
|
## Installation Notes
|
|
181
230
|
|
|
182
|
-
The default
|
|
231
|
+
The default Embedded configuration depends on `better-sqlite3` (native addon, transitive dependency of `mem0ai`) for both the vector store and history. This remains true for `dbPath: ":memory:"`: it changes where SQLite stores pages, not which vector-store implementation is used.
|
|
183
232
|
|
|
184
233
|
**For pi-agent users**: pi-agent's `package.json` includes `better-sqlite3` in `pnpm.onlyBuiltDependencies` — it compiles automatically during `pnpm install`. No extra steps needed.
|
|
185
234
|
|
|
@@ -197,11 +246,18 @@ If `better-sqlite3` fails to load (for example, because of a Node ABI mismatch),
|
|
|
197
246
|
|
|
198
247
|
## Tools
|
|
199
248
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
249
|
+
When `memoryMode` is `hybrid` or `active`, the agent gets one action-dispatched tool:
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
mem0_memory(action="search", query="...") # Semantic search over memories
|
|
253
|
+
mem0_memory(action="add", content="...") # Store a durable fact
|
|
254
|
+
mem0_memory(action="get_all") # List every stored memory
|
|
255
|
+
mem0_memory(action="delete", memory_id="...") # Remove a memory by id
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Stored content is credential-redacted first; results are returned with the same
|
|
259
|
+
`[UNTRUSTED MEMORY DATA]` wrapping as passive recall, including the memory ids
|
|
260
|
+
needed for `delete`.
|
|
205
261
|
|
|
206
262
|
## Commands
|
|
207
263
|
|
|
@@ -209,18 +265,20 @@ If `better-sqlite3` fails to load (for example, because of a Node ABI mismatch),
|
|
|
209
265
|
/mem0 status # Show current status
|
|
210
266
|
/mem0 search <query> # Semantic search
|
|
211
267
|
/mem0 profile # List all memories
|
|
268
|
+
/mem0 add <text> # Store a memory manually
|
|
269
|
+
/mem0 delete <id> # Remove a memory by id
|
|
212
270
|
```
|
|
213
271
|
|
|
214
272
|
## Relationship with pi-memory
|
|
215
273
|
|
|
216
274
|
`pi-memory-mem0` and `pi-memory` run **independently in parallel** as separate extensions:
|
|
217
275
|
|
|
218
|
-
- `pi-memory`:
|
|
219
|
-
- `pi-memory-mem0`:
|
|
276
|
+
- `pi-memory`: Curated memory — the agent explicitly manages memories via the `memory_add` / `memory_replace` / `memory_remove` / `memory_read` tools, local `.md` files, hard char limits
|
|
277
|
+
- `pi-memory-mem0`: Semantic memory — automatic extraction/storage and semantic recall (passive), plus the `mem0_memory` tool for agent-driven semantic lookup (active); no capacity limits
|
|
220
278
|
|
|
221
|
-
They do not interfere with each other. `pi-memory-mem0`
|
|
222
|
-
|
|
223
|
-
|
|
279
|
+
They do not interfere with each other, and their tool names do not collide. `pi-memory-mem0` injects recalled text as a
|
|
280
|
+
custom user-channel message (never the system prompt); `pi-memory` injects its own
|
|
281
|
+
context separately.
|
|
224
282
|
|
|
225
283
|
## Dedup API
|
|
226
284
|
|
package/dist/dedup.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Normalizes content, identifies exact duplicates (case-insensitive, whitespace-collapsed),
|
|
5
5
|
* deletes the older entries, and keeps only the most recently updated.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* All modes use the provider interface. In embedded mode the configured
|
|
8
8
|
* vector store is the source of truth and its IDs remain stable across restarts.
|
|
9
9
|
*/
|
|
10
10
|
import { type ProviderResolver } from './provider.js';
|
package/dist/dedup.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Normalizes content, identifies exact duplicates (case-insensitive, whitespace-collapsed),
|
|
5
5
|
* deletes the older entries, and keeps only the most recently updated.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* All modes use the provider interface. In embedded mode the configured
|
|
8
8
|
* vector store is the source of truth and its IDs remain stable across restarts.
|
|
9
9
|
*/
|
|
10
10
|
import { createMem0Provider } from './provider.js';
|
|
@@ -14,7 +14,7 @@ export async function dedupMemories(opts) {
|
|
|
14
14
|
config,
|
|
15
15
|
...(resolveProvider ? { resolveProvider } : {}),
|
|
16
16
|
});
|
|
17
|
-
const allMemories = await provider.getAll({ userId });
|
|
17
|
+
const allMemories = await provider.getAll({ userId, ...(signal ? { signal } : {}) });
|
|
18
18
|
if (allMemories.length === 0) {
|
|
19
19
|
return { total: 0, duplicatesRemoved: 0 };
|
|
20
20
|
}
|
|
@@ -24,7 +24,7 @@ export async function dedupMemories(opts) {
|
|
|
24
24
|
if (signal?.aborted)
|
|
25
25
|
break;
|
|
26
26
|
try {
|
|
27
|
-
await provider.delete(id);
|
|
27
|
+
await (signal ? provider.delete(id, { signal }) : provider.delete(id));
|
|
28
28
|
removed++;
|
|
29
29
|
}
|
|
30
30
|
catch {
|
package/dist/dedup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,kBAAkB,EAAyB,MAAM,eAAe,CAAC;AAe1E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAkB;IACpD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC;QACxC,MAAM;QACN,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* pi-memory-mem0 —
|
|
2
|
+
* pi-memory-mem0 — Semantic memory extension powered by Mem0.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Backend modes:
|
|
5
5
|
* - **platform**: Uses Mem0 Cloud API (needs MEM0_API_KEY)
|
|
6
|
-
* - **
|
|
6
|
+
* - **embedded**: Runs Mem0 OSS in-process
|
|
7
|
+
* - **self-hosted**: Calls a remote Mem0 OSS REST server
|
|
8
|
+
*
|
|
9
|
+
* Memory modes (config "memoryMode"):
|
|
10
|
+
* - **passive**: automatic capture + recall injection only
|
|
11
|
+
* - **active**: LLM-callable mem0_memory tool only
|
|
12
|
+
* - **hybrid** (default): both
|
|
13
|
+
*
|
|
14
|
+
* Passive side: after each conversation turn, user + assistant messages are
|
|
15
|
+
* sent to Mem0 for fact extraction and storage (credentials are redacted
|
|
16
|
+
* first). Recalled memories are injected as a custom message (delivered to
|
|
17
|
+
* the model on the user channel, never the system prompt) and wrapped as
|
|
18
|
+
* untrusted data. Active side: the mem0_memory tool lets the agent search,
|
|
19
|
+
* add, list, and delete memories on its own initiative, under the same
|
|
20
|
+
* redaction and untrusted-data boundaries.
|
|
7
21
|
*
|
|
8
22
|
* Configuration via settings.json key "pi-memory-mem0".
|
|
9
23
|
* Supports ${ENV_VAR:-fallback} in user and agent settings.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAkCpE,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoP5D"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* pi-memory-mem0 —
|
|
2
|
+
* pi-memory-mem0 — Semantic memory extension powered by Mem0.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Backend modes:
|
|
5
5
|
* - **platform**: Uses Mem0 Cloud API (needs MEM0_API_KEY)
|
|
6
|
-
* - **
|
|
6
|
+
* - **embedded**: Runs Mem0 OSS in-process
|
|
7
|
+
* - **self-hosted**: Calls a remote Mem0 OSS REST server
|
|
8
|
+
*
|
|
9
|
+
* Memory modes (config "memoryMode"):
|
|
10
|
+
* - **passive**: automatic capture + recall injection only
|
|
11
|
+
* - **active**: LLM-callable mem0_memory tool only
|
|
12
|
+
* - **hybrid** (default): both
|
|
13
|
+
*
|
|
14
|
+
* Passive side: after each conversation turn, user + assistant messages are
|
|
15
|
+
* sent to Mem0 for fact extraction and storage (credentials are redacted
|
|
16
|
+
* first). Recalled memories are injected as a custom message (delivered to
|
|
17
|
+
* the model on the user channel, never the system prompt) and wrapped as
|
|
18
|
+
* untrusted data. Active side: the mem0_memory tool lets the agent search,
|
|
19
|
+
* add, list, and delete memories on its own initiative, under the same
|
|
20
|
+
* redaction and untrusted-data boundaries.
|
|
7
21
|
*
|
|
8
22
|
* Configuration via settings.json key "pi-memory-mem0".
|
|
9
23
|
* Supports ${ENV_VAR:-fallback} in user and agent settings.
|
|
10
24
|
* Trusted project settings are loaded without environment interpolation.
|
|
11
25
|
*/
|
|
12
26
|
import { isProjectTrusted, loadPiSettings } from '@amaster.ai/pi-shared/settings';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
27
|
+
import { Prefetch } from './prefetch.js';
|
|
28
|
+
import { formatRecalledMemory, redactMemoryText, scopeMemoryUserId } from './privacy.js';
|
|
29
|
+
import { createMem0Provider, normalizeMem0Mode, normalizeMemoryMode, } from './provider.js';
|
|
30
|
+
import { createMem0MemoryTool } from './tools.js';
|
|
16
31
|
const SETTINGS_KEY = 'pi-memory-mem0';
|
|
17
32
|
const STATUS_KEY = 'mem0';
|
|
18
33
|
function loadConfig(cwd, projectTrusted = false) {
|
|
@@ -26,9 +41,11 @@ function loadConfig(cwd, projectTrusted = false) {
|
|
|
26
41
|
return {};
|
|
27
42
|
}
|
|
28
43
|
}
|
|
29
|
-
function resolveUserId(configUserId) {
|
|
44
|
+
function resolveUserId(configUserId, scope = 'project') {
|
|
30
45
|
if (configUserId?.trim())
|
|
31
46
|
return configUserId.trim();
|
|
47
|
+
if (scope === 'exact')
|
|
48
|
+
throw new Error('Mem0 exact userId resolved to an empty value.');
|
|
32
49
|
if (process.env.USER)
|
|
33
50
|
return process.env.USER;
|
|
34
51
|
if (process.env.USERNAME)
|
|
@@ -37,18 +54,33 @@ function resolveUserId(configUserId) {
|
|
|
37
54
|
}
|
|
38
55
|
export default function mem0Extension(pi) {
|
|
39
56
|
let provider;
|
|
57
|
+
let prefetch;
|
|
40
58
|
let userId = '';
|
|
59
|
+
let activeMode = '';
|
|
60
|
+
let activeMemoryMode = '';
|
|
61
|
+
let activeToolEnabled = false;
|
|
62
|
+
let lastUserText = '';
|
|
63
|
+
let pendingWrite = Promise.resolve();
|
|
64
|
+
let sessionEpoch = 0;
|
|
41
65
|
pi.on('session_start', async (_event, ctx) => {
|
|
66
|
+
// A newer session_start (or shutdown) can run while this handler is still
|
|
67
|
+
// awaiting provider init (embedded init takes seconds). The epoch check
|
|
68
|
+
// after the await keeps the superseded handler from clobbering the live
|
|
69
|
+
// session's provider, prefetch, and tool-enablement state.
|
|
70
|
+
const epoch = ++sessionEpoch;
|
|
42
71
|
provider = undefined;
|
|
72
|
+
prefetch = undefined;
|
|
73
|
+
activeToolEnabled = false;
|
|
43
74
|
const config = loadConfig(ctx.cwd, isProjectTrusted(ctx));
|
|
44
|
-
const mode = config.mode ?? 'platform';
|
|
45
|
-
// Platform mode requires apiKey; OSS mode requires an LLM provider (env key)
|
|
46
|
-
if (mode === 'platform' && !config.apiKey?.trim()) {
|
|
47
|
-
ctx.ui.setStatus(STATUS_KEY, 'mem0: disabled (no API key)');
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
75
|
try {
|
|
51
|
-
|
|
76
|
+
const mode = normalizeMem0Mode(config.mode);
|
|
77
|
+
const memoryMode = normalizeMemoryMode(config.memoryMode);
|
|
78
|
+
if (mode === 'platform' && !config.apiKey?.trim()) {
|
|
79
|
+
ctx.ui.setStatus(STATUS_KEY, 'mem0: disabled (no API key)');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const resolvedUserId = resolveUserId(config.userId, config.userIdScope);
|
|
83
|
+
const newProvider = await createMem0Provider({
|
|
52
84
|
config,
|
|
53
85
|
resolveProvider: async (providerName) => {
|
|
54
86
|
const registry = ctx.modelRegistry;
|
|
@@ -71,33 +103,111 @@ export default function mem0Extension(pi) {
|
|
|
71
103
|
return result;
|
|
72
104
|
},
|
|
73
105
|
});
|
|
106
|
+
if (epoch !== sessionEpoch)
|
|
107
|
+
return;
|
|
108
|
+
provider = newProvider;
|
|
109
|
+
userId = scopeMemoryUserId(resolvedUserId, ctx.cwd, config.userIdScope);
|
|
110
|
+
activeMode = mode;
|
|
111
|
+
activeMemoryMode = memoryMode;
|
|
112
|
+
if (memoryMode !== 'active') {
|
|
113
|
+
prefetch = new Prefetch(provider, userId, { topK: config.topK ?? 5 });
|
|
114
|
+
}
|
|
115
|
+
if (memoryMode !== 'passive') {
|
|
116
|
+
activeToolEnabled = true;
|
|
117
|
+
pi.registerTool(createMem0MemoryTool({
|
|
118
|
+
getProvider: () => provider,
|
|
119
|
+
getUserId: () => userId,
|
|
120
|
+
isEnabled: () => activeToolEnabled,
|
|
121
|
+
topK: config.topK ?? 5,
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
74
124
|
}
|
|
75
125
|
catch (err) {
|
|
126
|
+
if (epoch !== sessionEpoch)
|
|
127
|
+
return;
|
|
128
|
+
provider = undefined;
|
|
129
|
+
prefetch = undefined;
|
|
130
|
+
activeToolEnabled = false;
|
|
76
131
|
ctx.ui.setStatus(STATUS_KEY, 'mem0: init failed');
|
|
77
132
|
ctx.ui.notify(`Mem0 init failed: ${err instanceof Error ? err.message : String(err)}`, 'error');
|
|
78
133
|
return;
|
|
79
134
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
135
|
+
ctx.ui.setStatus(STATUS_KEY, `mem0: ${activeMode}/${activeMemoryMode}`);
|
|
136
|
+
});
|
|
137
|
+
pi.on('input', async (event) => {
|
|
138
|
+
if (!prefetch)
|
|
139
|
+
return;
|
|
140
|
+
const text = event.text ?? '';
|
|
141
|
+
if (text) {
|
|
142
|
+
prefetch.queue(redactMemoryText(text));
|
|
143
|
+
lastUserText = text;
|
|
84
144
|
}
|
|
85
145
|
});
|
|
146
|
+
pi.on('turn_end', async (event) => {
|
|
147
|
+
if (!provider || !prefetch || !lastUserText)
|
|
148
|
+
return;
|
|
149
|
+
const msg = event.message;
|
|
150
|
+
const text = extractText(msg);
|
|
151
|
+
if (!text || msg.role !== 'assistant')
|
|
152
|
+
return;
|
|
153
|
+
const userText = lastUserText;
|
|
154
|
+
lastUserText = '';
|
|
155
|
+
const activeProvider = provider;
|
|
156
|
+
const activeUserId = userId;
|
|
157
|
+
pendingWrite = pendingWrite
|
|
158
|
+
.catch(() => { })
|
|
159
|
+
.then(async () => {
|
|
160
|
+
const result = await activeProvider.add([
|
|
161
|
+
{ role: 'user', content: redactMemoryText(userText) },
|
|
162
|
+
{ role: 'assistant', content: redactMemoryText(text) },
|
|
163
|
+
], { userId: activeUserId });
|
|
164
|
+
// Extraction legitimately finds nothing in many turns, but a totally
|
|
165
|
+
// silent no-op makes a broken pipeline indistinguishable from a quiet
|
|
166
|
+
// one — gate a diagnostic behind DEBUG.
|
|
167
|
+
if (process.env.DEBUG?.includes('pi-memory-mem0') && !result?.results?.length) {
|
|
168
|
+
console.error('[pi-memory-mem0] turn capture stored no memories (extraction empty?)');
|
|
169
|
+
}
|
|
170
|
+
})
|
|
171
|
+
.catch((err) => {
|
|
172
|
+
console.error(`[pi-memory-mem0] failed to store turn: ${err instanceof Error ? err.message : String(err)}`);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
pi.on('before_agent_start', async () => {
|
|
176
|
+
if (!prefetch)
|
|
177
|
+
return;
|
|
178
|
+
const recalled = await prefetch.consume();
|
|
179
|
+
if (!recalled)
|
|
180
|
+
return;
|
|
181
|
+
return {
|
|
182
|
+
message: {
|
|
183
|
+
customType: 'mem0-recall',
|
|
184
|
+
content: recalled,
|
|
185
|
+
display: true,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
pi.on('session_shutdown', async () => {
|
|
190
|
+
sessionEpoch++;
|
|
191
|
+
await pendingWrite;
|
|
192
|
+
provider = undefined;
|
|
193
|
+
prefetch = undefined;
|
|
194
|
+
activeToolEnabled = false;
|
|
195
|
+
lastUserText = '';
|
|
196
|
+
pendingWrite = Promise.resolve();
|
|
197
|
+
});
|
|
86
198
|
pi.registerCommand('mem0', {
|
|
87
|
-
description: 'Mem0 memory commands. Subcommands: status, search <query>, profile
|
|
199
|
+
description: 'Mem0 memory commands. Subcommands: status, search <query>, profile, add <text>, delete <id>.',
|
|
88
200
|
handler: async (args, ctx) => {
|
|
89
201
|
if (!provider) {
|
|
90
202
|
ctx.ui.notify('Mem0 is not active.', 'warning');
|
|
91
203
|
return;
|
|
92
204
|
}
|
|
93
|
-
const config = loadConfig(ctx.cwd, isProjectTrusted(ctx));
|
|
94
|
-
const userId = scopeMemoryUserId(resolveUserId(config.userId), ctx.cwd);
|
|
95
205
|
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
96
206
|
const subcommand = parts[0]?.toLowerCase() ?? 'status';
|
|
97
207
|
const rest = parts.slice(1).join(' ').trim();
|
|
98
208
|
switch (subcommand) {
|
|
99
209
|
case 'status': {
|
|
100
|
-
ctx.ui.notify(`Mem0: active (mode: ${
|
|
210
|
+
ctx.ui.notify(`Mem0: active (mode: ${activeMode}/${activeMemoryMode})`, 'info');
|
|
101
211
|
break;
|
|
102
212
|
}
|
|
103
213
|
case 'search': {
|
|
@@ -105,7 +215,11 @@ export default function mem0Extension(pi) {
|
|
|
105
215
|
ctx.ui.notify('Usage: /mem0 search <query>', 'warning');
|
|
106
216
|
break;
|
|
107
217
|
}
|
|
108
|
-
const results = await provider.search(rest, {
|
|
218
|
+
const results = await provider.search(rest, {
|
|
219
|
+
userId,
|
|
220
|
+
topK: 10,
|
|
221
|
+
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
222
|
+
});
|
|
109
223
|
if (results.length === 0) {
|
|
110
224
|
ctx.ui.notify('No relevant memories found.', 'info');
|
|
111
225
|
}
|
|
@@ -116,7 +230,10 @@ export default function mem0Extension(pi) {
|
|
|
116
230
|
break;
|
|
117
231
|
}
|
|
118
232
|
case 'profile': {
|
|
119
|
-
const all = await provider.getAll({
|
|
233
|
+
const all = await provider.getAll({
|
|
234
|
+
userId,
|
|
235
|
+
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
236
|
+
});
|
|
120
237
|
if (all.length === 0) {
|
|
121
238
|
ctx.ui.notify('No memories stored yet.', 'info');
|
|
122
239
|
}
|
|
@@ -126,10 +243,49 @@ export default function mem0Extension(pi) {
|
|
|
126
243
|
}
|
|
127
244
|
break;
|
|
128
245
|
}
|
|
246
|
+
case 'add': {
|
|
247
|
+
if (!rest) {
|
|
248
|
+
ctx.ui.notify('Usage: /mem0 add <text>', 'warning');
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
const result = await provider.add([{ role: 'user', content: redactMemoryText(rest) }], {
|
|
252
|
+
userId,
|
|
253
|
+
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
254
|
+
});
|
|
255
|
+
const created = result?.results ?? [];
|
|
256
|
+
if (created.length === 0) {
|
|
257
|
+
ctx.ui.notify('No memory was extracted from the provided text.', 'info');
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const lines = created.map((m, i) => `${i + 1}. ${formatRecalledMemory(m.memory)}`);
|
|
261
|
+
ctx.ui.notify(`Mem0 saved ${created.length}:\n${lines.join('\n')}`, 'info');
|
|
262
|
+
}
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
case 'delete': {
|
|
266
|
+
if (!rest) {
|
|
267
|
+
ctx.ui.notify('Usage: /mem0 delete <memory-id>', 'warning');
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
await provider.delete(rest, ctx.signal ? { signal: ctx.signal } : {});
|
|
271
|
+
ctx.ui.notify(`Deleted memory ${rest}.`, 'info');
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
129
274
|
default:
|
|
130
|
-
ctx.ui.notify('Unknown subcommand. Available: status, search, profile.', 'warning');
|
|
275
|
+
ctx.ui.notify('Unknown subcommand. Available: status, search, profile, add, delete.', 'warning');
|
|
131
276
|
}
|
|
132
277
|
},
|
|
133
278
|
});
|
|
134
279
|
}
|
|
280
|
+
function extractText(msg) {
|
|
281
|
+
if (typeof msg.content === 'string')
|
|
282
|
+
return msg.content;
|
|
283
|
+
if (Array.isArray(msg.content)) {
|
|
284
|
+
return msg.content
|
|
285
|
+
.filter((c) => c.type === 'text' && c.text)
|
|
286
|
+
.map((c) => c.text)
|
|
287
|
+
.join('\n');
|
|
288
|
+
}
|
|
289
|
+
return '';
|
|
290
|
+
}
|
|
135
291
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAElF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EACL,kBAAkB,EAElB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACtC,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,SAAS,UAAU,CAAC,GAAW,EAAE,cAAc,GAAG,KAAK;IACrD,IAAI,CAAC;QACH,OAAO,cAAc,CAAsB,YAAY,EAAE;YACvD,GAAG;YACH,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,YAAqB,EAAE,QAA2B,SAAS;IAChF,IAAI,YAAY,EAAE,IAAI,EAAE;QAAE,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,KAAK,KAAK,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACxF,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAgB;IACpD,IAAI,QAAkC,CAAC;IACvC,IAAI,QAA8B,CAAC;IACnC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,YAAY,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACpD,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,0EAA0E;QAC1E,wEAAwE;QACxE,wEAAwE;QACxE,2DAA2D;QAC3D,MAAM,KAAK,GAAG,EAAE,YAAY,CAAC;QAC7B,QAAQ,GAAG,SAAS,CAAC;QACrB,QAAQ,GAAG,SAAS,CAAC;QACrB,iBAAiB,GAAG,KAAK,CAAC;QAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YACD,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACxE,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC;gBAC3C,MAAM;gBACN,eAAe,EAAE,KAAK,EAAE,YAAoB,EAAE,EAAE;oBAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,aAOpB,CAAC;oBACF,IAAI,CAAC,QAAQ,CAAC,oBAAoB;wBAAE,OAAO,SAAS,CAAC;oBAErD,IAAI,KAAqD,CAAC;oBAC1D,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;wBACpB,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC;oBACrE,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;oBACjE,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;wBAAE,OAAO,SAAS,CAAC;oBACxC,MAAM,MAAM,GAA2B,EAAE,CAAC;oBAC1C,IAAI,MAAM;wBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;oBACnC,IAAI,KAAK,EAAE,OAAO;wBAAE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;oBACnD,IAAI,KAAK,EAAE,GAAG;wBAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAa,CAAC;oBACjD,OAAO,MAAM,CAAC;gBAChB,CAAC;aACF,CAAC,CAAC;YACH,IAAI,KAAK,KAAK,YAAY;gBAAE,OAAO;YACnC,QAAQ,GAAG,WAAW,CAAC;YACvB,MAAM,GAAG,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACxE,UAAU,GAAG,IAAI,CAAC;YAClB,gBAAgB,GAAG,UAAU,CAAC;YAC9B,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC5B,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,iBAAiB,GAAG,IAAI,CAAC;gBACzB,EAAE,CAAC,YAAY,CACb,oBAAoB,CAAC;oBACnB,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;oBAC3B,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;oBACvB,SAAS,EAAE,GAAG,EAAE,CAAC,iBAAiB;oBAClC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;iBACvB,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,KAAK,YAAY;gBAAE,OAAO;YACnC,QAAQ,GAAG,SAAS,CAAC;YACrB,QAAQ,GAAG,SAAS,CAAC;YACrB,iBAAiB,GAAG,KAAK,CAAC;YAC1B,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;YAClD,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACvE,OAAO,CACR,CAAC;YACF,OAAO;QACT,CAAC;QAED,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,UAAU,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7B,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAChC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY;YAAE,OAAO;QAEpD,MAAM,GAAG,GAAG,KAAK,CAAC,OAA+C,CAAC;QAClE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QAE9C,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC9B,YAAY,GAAG,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,QAAQ,CAAC;QAChC,MAAM,YAAY,GAAG,MAAM,CAAC;QAC5B,YAAY,GAAG,YAAY;aACxB,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aACf,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CACrC;gBACE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBACrD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE;aACvD,EACD,EAAE,MAAM,EAAE,YAAY,EAAE,CACzB,CAAC;YACF,qEAAqE;YACrE,sEAAsE;YACtE,wCAAwC;YACxC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC9E,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CACX,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC7F,CAAC;QACJ,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,OAAO;YACL,OAAO,EAAE;gBACP,UAAU,EAAE,aAAa;gBACzB,OAAO,EAAE,QAAQ;gBACjB,OAAO,EAAE,IAAI;aACd;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QACnC,YAAY,EAAE,CAAC;QACf,MAAM,YAAY,CAAC;QACnB,QAAQ,GAAG,SAAS,CAAC;QACrB,QAAQ,GAAG,SAAS,CAAC;QACrB,iBAAiB,GAAG,KAAK,CAAC;QAC1B,YAAY,GAAG,EAAE,CAAC;QAClB,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE;QACzB,WAAW,EACT,8FAA8F;QAChG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,QAAQ,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAE7C,QAAQ,UAAU,EAAE,CAAC;gBACnB,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uBAAuB,UAAU,IAAI,gBAAgB,GAAG,EAAE,MAAM,CAAC,CAAC;oBAChF,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;wBACxD,MAAM;oBACR,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;wBAC1C,MAAM;wBACN,IAAI,EAAE,EAAE;wBACR,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9C,CAAC,CAAC;oBACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;oBACvD,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBACnF,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBACrE,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;wBAChC,MAAM;wBACN,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9C,CAAC,CAAC;oBACH,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACrB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;oBACnD,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC/E,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBAC/E,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;wBACpD,MAAM;oBACR,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;wBACrF,MAAM;wBACN,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC9C,CAAC,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;oBACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iDAAiD,EAAE,MAAM,CAAC,CAAC;oBAC3E,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBACnF,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,OAAO,CAAC,MAAM,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBAC9E,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAAC;wBAC5D,MAAM;oBACR,CAAC;oBACD,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;oBACjD,MAAM;gBACR,CAAC;gBACD;oBACE,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,sEAAsE,EACtE,SAAS,CACV,CAAC;YACN,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAA0B;IAC7C,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAQ,GAAG,CAAC,OAAkD;aAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two-phase semantic prefetch — kicks off a background search on input,
|
|
3
|
+
* consumes the result on before_agent_start with a timeout.
|
|
4
|
+
*/
|
|
5
|
+
import type { Mem0Provider } from './provider.js';
|
|
6
|
+
export declare class Prefetch {
|
|
7
|
+
private readonly provider;
|
|
8
|
+
private readonly userId;
|
|
9
|
+
private readonly topK;
|
|
10
|
+
private pending;
|
|
11
|
+
constructor(provider: Mem0Provider, userId: string, opts: {
|
|
12
|
+
topK: number;
|
|
13
|
+
});
|
|
14
|
+
/** Phase 1: kick off a background search (called on input with user text). */
|
|
15
|
+
queue(query: string): void;
|
|
16
|
+
/** Phase 2: consume the result with a timeout (called on before_agent_start). */
|
|
17
|
+
consume(timeoutMs?: number): Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=prefetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefetch.d.ts","sourceRoot":"","sources":["../src/prefetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQlD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAsC;gBAEzC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAM1E,8EAA8E;IAC9E,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B,iFAAiF;IAC3E,OAAO,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CA6BjD"}
|