@agenticros/core 0.5.0
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 +192 -0
- package/README.md +88 -0
- package/dist/banner.d.ts +7 -0
- package/dist/banner.d.ts.map +1 -0
- package/dist/banner.js +25 -0
- package/dist/banner.js.map +1 -0
- package/dist/capabilities.d.ts +101 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +240 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cmd-vel-twist.d.ts +9 -0
- package/dist/cmd-vel-twist.d.ts.map +1 -0
- package/dist/cmd-vel-twist.js +32 -0
- package/dist/cmd-vel-twist.js.map +1 -0
- package/dist/config.d.ts +1195 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +427 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +113 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +141 -0
- package/dist/discovery.js.map +1 -0
- package/dist/find-robots-for.d.ts +85 -0
- package/dist/find-robots-for.d.ts.map +1 -0
- package/dist/find-robots-for.js +120 -0
- package/dist/find-robots-for.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/factory.d.ts +18 -0
- package/dist/memory/factory.d.ts.map +1 -0
- package/dist/memory/factory.js +51 -0
- package/dist/memory/factory.js.map +1 -0
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/local/provider.d.ts +29 -0
- package/dist/memory/local/provider.d.ts.map +1 -0
- package/dist/memory/local/provider.js +202 -0
- package/dist/memory/local/provider.js.map +1 -0
- package/dist/memory/mem0/provider.d.ts +66 -0
- package/dist/memory/mem0/provider.d.ts.map +1 -0
- package/dist/memory/mem0/provider.js +310 -0
- package/dist/memory/mem0/provider.js.map +1 -0
- package/dist/memory/types.d.ts +91 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +10 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/mission-registry.d.ts +94 -0
- package/dist/mission-registry.d.ts.map +1 -0
- package/dist/mission-registry.js +123 -0
- package/dist/mission-registry.js.map +1 -0
- package/dist/mission-transcript-sink.d.ts +33 -0
- package/dist/mission-transcript-sink.d.ts.map +1 -0
- package/dist/mission-transcript-sink.js +76 -0
- package/dist/mission-transcript-sink.js.map +1 -0
- package/dist/mission.d.ts +281 -0
- package/dist/mission.d.ts.map +1 -0
- package/dist/mission.js +331 -0
- package/dist/mission.js.map +1 -0
- package/dist/planner/index.d.ts +84 -0
- package/dist/planner/index.d.ts.map +1 -0
- package/dist/planner/index.js +486 -0
- package/dist/planner/index.js.map +1 -0
- package/dist/robots.d.ts +133 -0
- package/dist/robots.d.ts.map +1 -0
- package/dist/robots.js +220 -0
- package/dist/robots.js.map +1 -0
- package/dist/topic-utils.d.ts +47 -0
- package/dist/topic-utils.d.ts.map +1 -0
- package/dist/topic-utils.js +136 -0
- package/dist/topic-utils.js.map +1 -0
- package/dist/transport/factory.d.ts +10 -0
- package/dist/transport/factory.d.ts.map +1 -0
- package/dist/transport/factory.js +40 -0
- package/dist/transport/factory.js.map +1 -0
- package/dist/transport/local/conversion.d.ts +30 -0
- package/dist/transport/local/conversion.d.ts.map +1 -0
- package/dist/transport/local/conversion.js +340 -0
- package/dist/transport/local/conversion.js.map +1 -0
- package/dist/transport/local/entities.d.ts +34 -0
- package/dist/transport/local/entities.d.ts.map +1 -0
- package/dist/transport/local/entities.js +108 -0
- package/dist/transport/local/entities.js.map +1 -0
- package/dist/transport/local/transport.d.ts +53 -0
- package/dist/transport/local/transport.d.ts.map +1 -0
- package/dist/transport/local/transport.js +344 -0
- package/dist/transport/local/transport.js.map +1 -0
- package/dist/transport/rosbridge/actions.d.ts +30 -0
- package/dist/transport/rosbridge/actions.d.ts.map +1 -0
- package/dist/transport/rosbridge/actions.js +61 -0
- package/dist/transport/rosbridge/actions.js.map +1 -0
- package/dist/transport/rosbridge/adapter.d.ts +29 -0
- package/dist/transport/rosbridge/adapter.d.ts.map +1 -0
- package/dist/transport/rosbridge/adapter.js +108 -0
- package/dist/transport/rosbridge/adapter.js.map +1 -0
- package/dist/transport/rosbridge/client.d.ts +55 -0
- package/dist/transport/rosbridge/client.d.ts.map +1 -0
- package/dist/transport/rosbridge/client.js +375 -0
- package/dist/transport/rosbridge/client.js.map +1 -0
- package/dist/transport/rosbridge/services.d.ts +14 -0
- package/dist/transport/rosbridge/services.d.ts.map +1 -0
- package/dist/transport/rosbridge/services.js +25 -0
- package/dist/transport/rosbridge/services.js.map +1 -0
- package/dist/transport/rosbridge/topics.d.ts +28 -0
- package/dist/transport/rosbridge/topics.d.ts.map +1 -0
- package/dist/transport/rosbridge/topics.js +59 -0
- package/dist/transport/rosbridge/topics.js.map +1 -0
- package/dist/transport/rosbridge/types.d.ts +87 -0
- package/dist/transport/rosbridge/types.d.ts.map +1 -0
- package/dist/transport/rosbridge/types.js +6 -0
- package/dist/transport/rosbridge/types.js.map +1 -0
- package/dist/transport/transport.d.ts +39 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +2 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/transport/types.d.ts +100 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +5 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/webrtc/signaling-client.d.ts +38 -0
- package/dist/transport/webrtc/signaling-client.d.ts.map +1 -0
- package/dist/transport/webrtc/signaling-client.js +161 -0
- package/dist/transport/webrtc/signaling-client.js.map +1 -0
- package/dist/transport/webrtc/signaling-types.d.ts +112 -0
- package/dist/transport/webrtc/signaling-types.d.ts.map +1 -0
- package/dist/transport/webrtc/signaling-types.js +8 -0
- package/dist/transport/webrtc/signaling-types.js.map +1 -0
- package/dist/transport/webrtc/transport.d.ts +67 -0
- package/dist/transport/webrtc/transport.d.ts.map +1 -0
- package/dist/transport/webrtc/transport.js +406 -0
- package/dist/transport/webrtc/transport.js.map +1 -0
- package/dist/transport/zenoh/adapter.d.ts +47 -0
- package/dist/transport/zenoh/adapter.d.ts.map +1 -0
- package/dist/transport/zenoh/adapter.js +296 -0
- package/dist/transport/zenoh/adapter.js.map +1 -0
- package/dist/transport/zenoh/cdr.d.ts +17 -0
- package/dist/transport/zenoh/cdr.d.ts.map +1 -0
- package/dist/transport/zenoh/cdr.js +170 -0
- package/dist/transport/zenoh/cdr.js.map +1 -0
- package/dist/transport/zenoh/keys.d.ts +21 -0
- package/dist/transport/zenoh/keys.d.ts.map +1 -0
- package/dist/transport/zenoh/keys.js +44 -0
- package/dist/transport/zenoh/keys.js.map +1 -0
- package/dist/transport-pool.d.ts +74 -0
- package/dist/transport-pool.d.ts.map +1 -0
- package/dist/transport-pool.js +135 -0
- package/dist/transport-pool.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
/**
|
|
6
|
+
* Tiny JSON-on-disk memory backend. No new deps.
|
|
7
|
+
*
|
|
8
|
+
* Recall ranks by token-overlap score (tf-style) with a small recency bonus
|
|
9
|
+
* so two equally-relevant memories are returned newest-first. This is
|
|
10
|
+
* intentionally dumb — users who want true semantic search opt into mem0.
|
|
11
|
+
*/
|
|
12
|
+
export class LocalMemoryProvider {
|
|
13
|
+
backend = "local";
|
|
14
|
+
storePath;
|
|
15
|
+
records = null;
|
|
16
|
+
writeChain = Promise.resolve();
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.storePath = expandHome(config.storePath);
|
|
19
|
+
}
|
|
20
|
+
async remember(input) {
|
|
21
|
+
const namespace = requireNamespace(input.namespace);
|
|
22
|
+
const record = {
|
|
23
|
+
id: randomUUID(),
|
|
24
|
+
content: input.content,
|
|
25
|
+
namespace,
|
|
26
|
+
tags: input.tags && input.tags.length > 0 ? [...input.tags] : undefined,
|
|
27
|
+
path: input.path,
|
|
28
|
+
createdAt: Date.now(),
|
|
29
|
+
};
|
|
30
|
+
const records = await this.load();
|
|
31
|
+
records.push(record);
|
|
32
|
+
await this.persist();
|
|
33
|
+
return cloneRecord(record);
|
|
34
|
+
}
|
|
35
|
+
async recall(input) {
|
|
36
|
+
const namespace = requireNamespace(input.namespace);
|
|
37
|
+
const limit = input.limit ?? 10;
|
|
38
|
+
const records = await this.load();
|
|
39
|
+
const queryTokens = tokenize(input.query);
|
|
40
|
+
if (queryTokens.length === 0)
|
|
41
|
+
return [];
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
const scored = records
|
|
44
|
+
.filter((r) => r.namespace === namespace)
|
|
45
|
+
.map((r) => {
|
|
46
|
+
const recordTokens = tokenize(r.content);
|
|
47
|
+
const overlap = overlapScore(queryTokens, recordTokens);
|
|
48
|
+
const ageMs = Math.max(0, now - r.createdAt);
|
|
49
|
+
const recencyBonus = Math.exp(-ageMs / (1000 * 60 * 60 * 24 * 14)); // 14-day half-life
|
|
50
|
+
const score = overlap === 0 ? 0 : overlap + recencyBonus * 0.05;
|
|
51
|
+
return { record: r, score };
|
|
52
|
+
})
|
|
53
|
+
.filter((s) => s.score > 0)
|
|
54
|
+
.sort((a, b) => b.score - a.score)
|
|
55
|
+
.slice(0, limit);
|
|
56
|
+
return scored.map((s) => ({ ...cloneRecord(s.record), score: s.score }));
|
|
57
|
+
}
|
|
58
|
+
async forget(input) {
|
|
59
|
+
const records = await this.load();
|
|
60
|
+
const before = records.length;
|
|
61
|
+
let next;
|
|
62
|
+
if (input.id !== undefined) {
|
|
63
|
+
next = records.filter((r) => r.id !== input.id);
|
|
64
|
+
}
|
|
65
|
+
else if (input.query !== undefined) {
|
|
66
|
+
const namespace = requireNamespace(input.namespace);
|
|
67
|
+
const tokens = tokenize(input.query);
|
|
68
|
+
next = records.filter((r) => {
|
|
69
|
+
if (r.namespace !== namespace)
|
|
70
|
+
return true;
|
|
71
|
+
const overlap = overlapScore(tokens, tokenize(r.content));
|
|
72
|
+
return overlap === 0;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else if (input.namespace !== undefined) {
|
|
76
|
+
next = records.filter((r) => r.namespace !== input.namespace);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
throw new Error("forget() requires one of { id }, { query, namespace }, or { namespace }");
|
|
80
|
+
}
|
|
81
|
+
if (next.length === before)
|
|
82
|
+
return { removed: 0 };
|
|
83
|
+
this.records = next;
|
|
84
|
+
await this.persist();
|
|
85
|
+
return { removed: before - next.length };
|
|
86
|
+
}
|
|
87
|
+
async status(namespace) {
|
|
88
|
+
const records = await this.load();
|
|
89
|
+
const inNs = records.filter((r) => r.namespace === namespace);
|
|
90
|
+
const lastWriteAt = inNs.length === 0
|
|
91
|
+
? null
|
|
92
|
+
: inNs.reduce((acc, r) => (r.createdAt > acc ? r.createdAt : acc), 0);
|
|
93
|
+
return {
|
|
94
|
+
enabled: true,
|
|
95
|
+
backend: "local",
|
|
96
|
+
namespace,
|
|
97
|
+
recordCount: inNs.length,
|
|
98
|
+
lastWriteAt,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async recent(namespace, limit = 5) {
|
|
102
|
+
const records = await this.load();
|
|
103
|
+
return records
|
|
104
|
+
.filter((r) => r.namespace === namespace)
|
|
105
|
+
.slice()
|
|
106
|
+
.sort((a, b) => b.createdAt - a.createdAt)
|
|
107
|
+
.slice(0, Math.max(0, limit))
|
|
108
|
+
.map(cloneRecord);
|
|
109
|
+
}
|
|
110
|
+
async load() {
|
|
111
|
+
if (this.records !== null)
|
|
112
|
+
return this.records;
|
|
113
|
+
try {
|
|
114
|
+
const raw = await fs.readFile(this.storePath, "utf8");
|
|
115
|
+
const parsed = JSON.parse(raw);
|
|
116
|
+
if (parsed &&
|
|
117
|
+
typeof parsed === "object" &&
|
|
118
|
+
parsed.version === 1 &&
|
|
119
|
+
Array.isArray(parsed.records)) {
|
|
120
|
+
this.records = parsed.records.map(normalizeRecord);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.records = [];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
if (err?.code === "ENOENT") {
|
|
128
|
+
this.records = [];
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
throw err;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return this.records;
|
|
135
|
+
}
|
|
136
|
+
async persist() {
|
|
137
|
+
if (this.records === null)
|
|
138
|
+
return;
|
|
139
|
+
const snapshot = { version: 1, records: this.records };
|
|
140
|
+
const text = JSON.stringify(snapshot, null, 2);
|
|
141
|
+
// Serialize writes so concurrent remember/forget calls don't race.
|
|
142
|
+
this.writeChain = this.writeChain.then(async () => {
|
|
143
|
+
await fs.mkdir(path.dirname(this.storePath), { recursive: true });
|
|
144
|
+
const tmp = `${this.storePath}.tmp`;
|
|
145
|
+
await fs.writeFile(tmp, text, "utf8");
|
|
146
|
+
await fs.rename(tmp, this.storePath);
|
|
147
|
+
});
|
|
148
|
+
await this.writeChain;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function expandHome(p) {
|
|
152
|
+
if (p.startsWith("~/"))
|
|
153
|
+
return path.join(homedir(), p.slice(2));
|
|
154
|
+
if (p === "~")
|
|
155
|
+
return homedir();
|
|
156
|
+
return p;
|
|
157
|
+
}
|
|
158
|
+
function requireNamespace(ns) {
|
|
159
|
+
if (!ns || ns.trim().length === 0) {
|
|
160
|
+
throw new Error("memory: namespace is required (config.memory.namespace or robot.namespace must be set)");
|
|
161
|
+
}
|
|
162
|
+
return ns;
|
|
163
|
+
}
|
|
164
|
+
function tokenize(s) {
|
|
165
|
+
return s
|
|
166
|
+
.toLowerCase()
|
|
167
|
+
.replace(/[^a-z0-9_\s]/g, " ")
|
|
168
|
+
.split(/\s+/)
|
|
169
|
+
.filter((t) => t.length >= 2);
|
|
170
|
+
}
|
|
171
|
+
function overlapScore(query, doc) {
|
|
172
|
+
if (query.length === 0 || doc.length === 0)
|
|
173
|
+
return 0;
|
|
174
|
+
const docSet = new Set(doc);
|
|
175
|
+
let hits = 0;
|
|
176
|
+
for (const t of query)
|
|
177
|
+
if (docSet.has(t))
|
|
178
|
+
hits += 1;
|
|
179
|
+
return hits / Math.sqrt(query.length * doc.length);
|
|
180
|
+
}
|
|
181
|
+
function cloneRecord(r) {
|
|
182
|
+
return {
|
|
183
|
+
id: r.id,
|
|
184
|
+
content: r.content,
|
|
185
|
+
namespace: r.namespace,
|
|
186
|
+
tags: r.tags ? [...r.tags] : undefined,
|
|
187
|
+
path: r.path,
|
|
188
|
+
createdAt: r.createdAt,
|
|
189
|
+
score: r.score,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function normalizeRecord(r) {
|
|
193
|
+
return {
|
|
194
|
+
id: String(r.id ?? randomUUID()),
|
|
195
|
+
content: String(r.content ?? ""),
|
|
196
|
+
namespace: String(r.namespace ?? ""),
|
|
197
|
+
tags: Array.isArray(r.tags) ? r.tags.map(String) : undefined,
|
|
198
|
+
path: typeof r.path === "string" ? r.path : undefined,
|
|
199
|
+
createdAt: typeof r.createdAt === "number" ? r.createdAt : Date.now(),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/memory/local/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { ForgetInput, MemoryProvider, MemoryRecord, MemoryStatus, RecallInput, RememberInput } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration shape for a single mem0 sub-component (embedder / vectorStore / llm).
|
|
4
|
+
* Passed through verbatim to `new Memory({ ... })`.
|
|
5
|
+
*/
|
|
6
|
+
export interface Mem0ComponentConfig {
|
|
7
|
+
provider: string;
|
|
8
|
+
config: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface Mem0BackendConfig {
|
|
11
|
+
/** When true, mem0 runs its LLM-driven fact extraction on `add`. Default false (raw store). */
|
|
12
|
+
inferOnWrite: boolean;
|
|
13
|
+
/** SQLite history db path (passed to mem0 as `historyDbPath`). */
|
|
14
|
+
historyDbPath: string;
|
|
15
|
+
embedder?: Mem0ComponentConfig;
|
|
16
|
+
vectorStore?: Mem0ComponentConfig;
|
|
17
|
+
llm?: Mem0ComponentConfig;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Thin adapter over `mem0ai/oss`'s Memory class.
|
|
21
|
+
*
|
|
22
|
+
* The actual `mem0ai` module is loaded once via the factory's dynamic import
|
|
23
|
+
* and passed into the constructor here. That keeps the optional peer dep out
|
|
24
|
+
* of the load path for users on `backend: "local"`.
|
|
25
|
+
*/
|
|
26
|
+
export declare class Mem0MemoryProvider implements MemoryProvider {
|
|
27
|
+
readonly backend: "mem0";
|
|
28
|
+
private readonly memory;
|
|
29
|
+
private readonly inferOnWrite;
|
|
30
|
+
private readonly embedderInfo;
|
|
31
|
+
constructor(args: {
|
|
32
|
+
memory: any;
|
|
33
|
+
inferOnWrite: boolean;
|
|
34
|
+
embedder?: Mem0ComponentConfig;
|
|
35
|
+
});
|
|
36
|
+
remember(input: RememberInput): Promise<MemoryRecord>;
|
|
37
|
+
recall(input: RecallInput): Promise<MemoryRecord[]>;
|
|
38
|
+
forget(input: ForgetInput): Promise<{
|
|
39
|
+
removed: number;
|
|
40
|
+
}>;
|
|
41
|
+
status(namespace: string): Promise<MemoryStatus>;
|
|
42
|
+
recent(namespace: string, limit?: number): Promise<MemoryRecord[]>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build a Mem0MemoryProvider. Loads `mem0ai/oss` dynamically so users on the
|
|
46
|
+
* `local` backend never pay for it. Applies smart-defaults for the embedder
|
|
47
|
+
* when the user has not configured one explicitly.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createMem0Provider(args: {
|
|
50
|
+
config: Mem0BackendConfig;
|
|
51
|
+
}): Promise<Mem0MemoryProvider>;
|
|
52
|
+
/**
|
|
53
|
+
* Embedder auto-detection used when `config.memory.mem0.embedder` is not set.
|
|
54
|
+
*
|
|
55
|
+
* Order (matches plan):
|
|
56
|
+
* 1. Ollama if http://localhost:11434/api/tags responds within 200 ms.
|
|
57
|
+
* 2. OpenAI if OPENAI_API_KEY is set.
|
|
58
|
+
* 3. Throw a clear error pointing the user at docs/memory.md.
|
|
59
|
+
*/
|
|
60
|
+
export declare function detectEmbedder(opts?: {
|
|
61
|
+
ollamaUrl?: string;
|
|
62
|
+
fetchImpl?: typeof fetch;
|
|
63
|
+
timeoutMs?: number;
|
|
64
|
+
hasOpenAIKey?: boolean;
|
|
65
|
+
}): Promise<Mem0ComponentConfig>;
|
|
66
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/memory/mem0/provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACd,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,+FAA+F;IAC/F,YAAY,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmD;gBAGpE,IAAI,EAAE;QAChB,MAAM,EAAE,GAAG,CAAC;QACZ,YAAY,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;KAChC;IAcK,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwBrD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAanD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA0CxD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BhD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAepE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,MAAM,EAAE,iBAAiB,CAAC;CAC3B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkC9B;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmC/B"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Thin adapter over `mem0ai/oss`'s Memory class.
|
|
5
|
+
*
|
|
6
|
+
* The actual `mem0ai` module is loaded once via the factory's dynamic import
|
|
7
|
+
* and passed into the constructor here. That keeps the optional peer dep out
|
|
8
|
+
* of the load path for users on `backend: "local"`.
|
|
9
|
+
*/
|
|
10
|
+
export class Mem0MemoryProvider {
|
|
11
|
+
backend = "mem0";
|
|
12
|
+
memory;
|
|
13
|
+
inferOnWrite;
|
|
14
|
+
embedderInfo;
|
|
15
|
+
// mem0's search returns score + metadata.createdAt; we'll mirror those into MemoryRecord.
|
|
16
|
+
constructor(args) {
|
|
17
|
+
this.memory = args.memory;
|
|
18
|
+
this.inferOnWrite = args.inferOnWrite;
|
|
19
|
+
this.embedderInfo = args.embedder
|
|
20
|
+
? {
|
|
21
|
+
provider: args.embedder.provider,
|
|
22
|
+
model: typeof args.embedder.config?.model === "string"
|
|
23
|
+
? args.embedder.config.model
|
|
24
|
+
: undefined,
|
|
25
|
+
}
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
28
|
+
async remember(input) {
|
|
29
|
+
const namespace = requireNamespace(input.namespace);
|
|
30
|
+
const metadata = {};
|
|
31
|
+
if (input.tags && input.tags.length > 0)
|
|
32
|
+
metadata.tags = input.tags;
|
|
33
|
+
if (input.path)
|
|
34
|
+
metadata.path = input.path;
|
|
35
|
+
metadata.createdAt = Date.now();
|
|
36
|
+
const result = await this.memory.add(input.content, {
|
|
37
|
+
userId: namespace,
|
|
38
|
+
metadata,
|
|
39
|
+
infer: this.inferOnWrite,
|
|
40
|
+
});
|
|
41
|
+
const persistedId = extractFirstId(result);
|
|
42
|
+
return {
|
|
43
|
+
id: persistedId ?? `mem0:${metadata.createdAt}`,
|
|
44
|
+
content: input.content,
|
|
45
|
+
namespace,
|
|
46
|
+
tags: input.tags,
|
|
47
|
+
path: input.path,
|
|
48
|
+
createdAt: metadata.createdAt,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async recall(input) {
|
|
52
|
+
const namespace = requireNamespace(input.namespace);
|
|
53
|
+
const limit = input.limit ?? 10;
|
|
54
|
+
// mem0ai v3+ rejects top-level `userId` in search() — the user identifier
|
|
55
|
+
// must go through `filters.user_id` (snake_case).
|
|
56
|
+
const search = await this.memory.search(input.query, {
|
|
57
|
+
filters: { user_id: namespace },
|
|
58
|
+
limit,
|
|
59
|
+
});
|
|
60
|
+
const hits = normalizeHits(search);
|
|
61
|
+
return hits.map((h) => toRecord(h, namespace));
|
|
62
|
+
}
|
|
63
|
+
async forget(input) {
|
|
64
|
+
if (input.id !== undefined) {
|
|
65
|
+
await this.memory.delete(input.id);
|
|
66
|
+
return { removed: 1 };
|
|
67
|
+
}
|
|
68
|
+
const namespace = requireNamespace(input.namespace);
|
|
69
|
+
if (input.query !== undefined) {
|
|
70
|
+
const hits = normalizeHits(await this.memory.search(input.query, {
|
|
71
|
+
filters: { user_id: namespace },
|
|
72
|
+
limit: 100,
|
|
73
|
+
}));
|
|
74
|
+
let removed = 0;
|
|
75
|
+
for (const h of hits) {
|
|
76
|
+
if (h.id) {
|
|
77
|
+
await this.memory.delete(h.id);
|
|
78
|
+
removed += 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { removed };
|
|
82
|
+
}
|
|
83
|
+
// We deliberately don't call `memory.deleteAll(...)` here: mem0's deleteAll
|
|
84
|
+
// signature has shifted across major versions (v2 wanted `{ userId }`, v3
|
|
85
|
+
// requires its own filter dialect and rejects some calls outright). The
|
|
86
|
+
// enumerate-and-delete fallback is slightly slower but works on every
|
|
87
|
+
// version and returns an accurate count.
|
|
88
|
+
const all = normalizeHits(typeof this.memory.getAll === "function"
|
|
89
|
+
? await this.memory.getAll({ filters: { user_id: namespace }, limit: 1000 })
|
|
90
|
+
: []);
|
|
91
|
+
let removed = 0;
|
|
92
|
+
for (const h of all) {
|
|
93
|
+
if (h.id) {
|
|
94
|
+
await this.memory.delete(h.id);
|
|
95
|
+
removed += 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { removed };
|
|
99
|
+
}
|
|
100
|
+
async status(namespace) {
|
|
101
|
+
let records = [];
|
|
102
|
+
if (typeof this.memory.getAll === "function") {
|
|
103
|
+
try {
|
|
104
|
+
records = normalizeHits(await this.memory.getAll({ filters: { user_id: namespace }, limit: 1000 }));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
records = [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const lastWriteAt = records.length === 0
|
|
111
|
+
? null
|
|
112
|
+
: records.reduce((acc, r) => {
|
|
113
|
+
const ts = readCreatedAt(r);
|
|
114
|
+
return ts > acc ? ts : acc;
|
|
115
|
+
}, 0) || null;
|
|
116
|
+
return {
|
|
117
|
+
enabled: true,
|
|
118
|
+
backend: "mem0",
|
|
119
|
+
namespace,
|
|
120
|
+
recordCount: records.length,
|
|
121
|
+
lastWriteAt,
|
|
122
|
+
embedder: this.embedderInfo,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async recent(namespace, limit = 5) {
|
|
126
|
+
if (typeof this.memory.getAll !== "function")
|
|
127
|
+
return [];
|
|
128
|
+
let raw;
|
|
129
|
+
try {
|
|
130
|
+
raw = await this.memory.getAll({ filters: { user_id: namespace }, limit: 1000 });
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
const hits = normalizeHits(raw);
|
|
136
|
+
return hits
|
|
137
|
+
.slice()
|
|
138
|
+
.sort((a, b) => readCreatedAt(b) - readCreatedAt(a))
|
|
139
|
+
.slice(0, Math.max(0, limit))
|
|
140
|
+
.map((h) => toRecord(h, namespace));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Build a Mem0MemoryProvider. Loads `mem0ai/oss` dynamically so users on the
|
|
145
|
+
* `local` backend never pay for it. Applies smart-defaults for the embedder
|
|
146
|
+
* when the user has not configured one explicitly.
|
|
147
|
+
*/
|
|
148
|
+
export async function createMem0Provider(args) {
|
|
149
|
+
const { config } = args;
|
|
150
|
+
let MemoryCtor;
|
|
151
|
+
try {
|
|
152
|
+
// mem0ai is an optional peer dependency — resolved at runtime, never
|
|
153
|
+
// installed unless the user opts into backend: "mem0".
|
|
154
|
+
// @ts-ignore: optional peer dep not declared in this package's deps
|
|
155
|
+
const mod = await import("mem0ai/oss");
|
|
156
|
+
MemoryCtor = mod.Memory ?? mod.default?.Memory;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
throw new Error('memory: backend "mem0" requires the "mem0ai" package. Install with: pnpm add mem0ai');
|
|
160
|
+
}
|
|
161
|
+
if (!MemoryCtor) {
|
|
162
|
+
throw new Error('memory: failed to find Memory class in "mem0ai/oss" (incompatible version?)');
|
|
163
|
+
}
|
|
164
|
+
const embedder = config.embedder ?? (await detectEmbedder());
|
|
165
|
+
const memoryConfig = {
|
|
166
|
+
historyDbPath: expandHome(config.historyDbPath),
|
|
167
|
+
};
|
|
168
|
+
if (embedder)
|
|
169
|
+
memoryConfig.embedder = embedder;
|
|
170
|
+
if (config.vectorStore)
|
|
171
|
+
memoryConfig.vectorStore = config.vectorStore;
|
|
172
|
+
if (config.llm)
|
|
173
|
+
memoryConfig.llm = config.llm;
|
|
174
|
+
const memory = new MemoryCtor(memoryConfig);
|
|
175
|
+
return new Mem0MemoryProvider({
|
|
176
|
+
memory,
|
|
177
|
+
inferOnWrite: config.inferOnWrite,
|
|
178
|
+
embedder: embedder ?? undefined,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Embedder auto-detection used when `config.memory.mem0.embedder` is not set.
|
|
183
|
+
*
|
|
184
|
+
* Order (matches plan):
|
|
185
|
+
* 1. Ollama if http://localhost:11434/api/tags responds within 200 ms.
|
|
186
|
+
* 2. OpenAI if OPENAI_API_KEY is set.
|
|
187
|
+
* 3. Throw a clear error pointing the user at docs/memory.md.
|
|
188
|
+
*/
|
|
189
|
+
export async function detectEmbedder(opts) {
|
|
190
|
+
const url = opts?.ollamaUrl ?? "http://localhost:11434/api/tags";
|
|
191
|
+
const f = opts?.fetchImpl ?? globalThis.fetch;
|
|
192
|
+
const timeout = opts?.timeoutMs ?? 200;
|
|
193
|
+
const hasOpenAIKey = opts?.hasOpenAIKey ?? Boolean(process.env.OPENAI_API_KEY);
|
|
194
|
+
if (typeof f === "function") {
|
|
195
|
+
try {
|
|
196
|
+
const ctrl = new AbortController();
|
|
197
|
+
const timer = setTimeout(() => ctrl.abort(), timeout);
|
|
198
|
+
const res = await f(url, { signal: ctrl.signal });
|
|
199
|
+
clearTimeout(timer);
|
|
200
|
+
if (res && res.ok) {
|
|
201
|
+
return {
|
|
202
|
+
provider: "ollama",
|
|
203
|
+
config: { model: "nomic-embed-text" },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// fall through to OpenAI / error
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (hasOpenAIKey) {
|
|
212
|
+
return {
|
|
213
|
+
provider: "openai",
|
|
214
|
+
config: { model: "text-embedding-3-small" },
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
throw new Error('memory: backend "mem0" needs an embedder. Either run Ollama locally ' +
|
|
218
|
+
"(http://localhost:11434), set OPENAI_API_KEY, or configure " +
|
|
219
|
+
"config.memory.mem0.embedder. See docs/memory.md.");
|
|
220
|
+
}
|
|
221
|
+
function expandHome(p) {
|
|
222
|
+
if (p.startsWith("~/"))
|
|
223
|
+
return path.join(homedir(), p.slice(2));
|
|
224
|
+
if (p === "~")
|
|
225
|
+
return homedir();
|
|
226
|
+
return p;
|
|
227
|
+
}
|
|
228
|
+
function requireNamespace(ns) {
|
|
229
|
+
if (!ns || ns.trim().length === 0) {
|
|
230
|
+
throw new Error("memory: namespace is required (config.memory.namespace or robot.namespace must be set)");
|
|
231
|
+
}
|
|
232
|
+
return ns;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* mem0's `add` returns either an array of results, a `{ results: [...] }`
|
|
236
|
+
* wrapper, or a single object depending on version. Extract the first id.
|
|
237
|
+
*/
|
|
238
|
+
function extractFirstId(result) {
|
|
239
|
+
if (!result)
|
|
240
|
+
return null;
|
|
241
|
+
if (Array.isArray(result)) {
|
|
242
|
+
return result[0]?.id ?? null;
|
|
243
|
+
}
|
|
244
|
+
if (Array.isArray(result.results)) {
|
|
245
|
+
return result.results[0]?.id ?? null;
|
|
246
|
+
}
|
|
247
|
+
if (typeof result.id === "string")
|
|
248
|
+
return result.id;
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
function normalizeHits(raw) {
|
|
252
|
+
if (!raw)
|
|
253
|
+
return [];
|
|
254
|
+
const arr = Array.isArray(raw)
|
|
255
|
+
? raw
|
|
256
|
+
: Array.isArray(raw.results)
|
|
257
|
+
? raw.results
|
|
258
|
+
: Array.isArray(raw.data)
|
|
259
|
+
? raw.data
|
|
260
|
+
: [];
|
|
261
|
+
return arr.map((h) => ({
|
|
262
|
+
id: typeof h?.id === "string" ? h.id : null,
|
|
263
|
+
content: typeof h?.memory === "string"
|
|
264
|
+
? h.memory
|
|
265
|
+
: typeof h?.content === "string"
|
|
266
|
+
? h.content
|
|
267
|
+
: typeof h?.text === "string"
|
|
268
|
+
? h.text
|
|
269
|
+
: "",
|
|
270
|
+
score: typeof h?.score === "number" ? h.score : undefined,
|
|
271
|
+
metadata: h?.metadata && typeof h.metadata === "object" ? h.metadata : undefined,
|
|
272
|
+
rawCreatedAt: h?.created_at ?? h?.createdAt,
|
|
273
|
+
}));
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Read a millisecond timestamp from a hit, trying (in order):
|
|
277
|
+
* 1. metadata.createdAt (what we set ourselves on `add`),
|
|
278
|
+
* 2. top-level `created_at` (mem0 v3 returns ISO string),
|
|
279
|
+
* 3. top-level `createdAt` (older mem0).
|
|
280
|
+
*/
|
|
281
|
+
function readCreatedAt(h) {
|
|
282
|
+
const meta = h.metadata?.createdAt;
|
|
283
|
+
if (typeof meta === "number")
|
|
284
|
+
return meta;
|
|
285
|
+
const raw = h.rawCreatedAt;
|
|
286
|
+
if (typeof raw === "number")
|
|
287
|
+
return raw;
|
|
288
|
+
if (typeof raw === "string") {
|
|
289
|
+
const parsed = Date.parse(raw);
|
|
290
|
+
if (!Number.isNaN(parsed))
|
|
291
|
+
return parsed;
|
|
292
|
+
}
|
|
293
|
+
return 0;
|
|
294
|
+
}
|
|
295
|
+
function toRecord(h, namespace) {
|
|
296
|
+
const tags = Array.isArray(h.metadata?.tags)
|
|
297
|
+
? h.metadata.tags.map(String)
|
|
298
|
+
: undefined;
|
|
299
|
+
const pathHint = typeof h.metadata?.path === "string" ? h.metadata.path : undefined;
|
|
300
|
+
return {
|
|
301
|
+
id: h.id ?? `mem0:${Date.now()}`,
|
|
302
|
+
content: h.content,
|
|
303
|
+
namespace,
|
|
304
|
+
tags,
|
|
305
|
+
path: pathHint,
|
|
306
|
+
createdAt: readCreatedAt(h) || Date.now(),
|
|
307
|
+
score: h.score,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/memory/mem0/provider.ts"],"names":[],"mappings":"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"}
|