@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.
Files changed (151) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +88 -0
  3. package/dist/banner.d.ts +7 -0
  4. package/dist/banner.d.ts.map +1 -0
  5. package/dist/banner.js +25 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/capabilities.d.ts +101 -0
  8. package/dist/capabilities.d.ts.map +1 -0
  9. package/dist/capabilities.js +240 -0
  10. package/dist/capabilities.js.map +1 -0
  11. package/dist/cmd-vel-twist.d.ts +9 -0
  12. package/dist/cmd-vel-twist.d.ts.map +1 -0
  13. package/dist/cmd-vel-twist.js +32 -0
  14. package/dist/cmd-vel-twist.js.map +1 -0
  15. package/dist/config.d.ts +1195 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +427 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/discovery.d.ts +113 -0
  20. package/dist/discovery.d.ts.map +1 -0
  21. package/dist/discovery.js +141 -0
  22. package/dist/discovery.js.map +1 -0
  23. package/dist/find-robots-for.d.ts +85 -0
  24. package/dist/find-robots-for.d.ts.map +1 -0
  25. package/dist/find-robots-for.js +120 -0
  26. package/dist/find-robots-for.js.map +1 -0
  27. package/dist/index.d.ts +32 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +20 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/memory/factory.d.ts +18 -0
  32. package/dist/memory/factory.d.ts.map +1 -0
  33. package/dist/memory/factory.js +51 -0
  34. package/dist/memory/factory.js.map +1 -0
  35. package/dist/memory/index.d.ts +3 -0
  36. package/dist/memory/index.d.ts.map +1 -0
  37. package/dist/memory/index.js +2 -0
  38. package/dist/memory/index.js.map +1 -0
  39. package/dist/memory/local/provider.d.ts +29 -0
  40. package/dist/memory/local/provider.d.ts.map +1 -0
  41. package/dist/memory/local/provider.js +202 -0
  42. package/dist/memory/local/provider.js.map +1 -0
  43. package/dist/memory/mem0/provider.d.ts +66 -0
  44. package/dist/memory/mem0/provider.d.ts.map +1 -0
  45. package/dist/memory/mem0/provider.js +310 -0
  46. package/dist/memory/mem0/provider.js.map +1 -0
  47. package/dist/memory/types.d.ts +91 -0
  48. package/dist/memory/types.d.ts.map +1 -0
  49. package/dist/memory/types.js +10 -0
  50. package/dist/memory/types.js.map +1 -0
  51. package/dist/mission-registry.d.ts +94 -0
  52. package/dist/mission-registry.d.ts.map +1 -0
  53. package/dist/mission-registry.js +123 -0
  54. package/dist/mission-registry.js.map +1 -0
  55. package/dist/mission-transcript-sink.d.ts +33 -0
  56. package/dist/mission-transcript-sink.d.ts.map +1 -0
  57. package/dist/mission-transcript-sink.js +76 -0
  58. package/dist/mission-transcript-sink.js.map +1 -0
  59. package/dist/mission.d.ts +281 -0
  60. package/dist/mission.d.ts.map +1 -0
  61. package/dist/mission.js +331 -0
  62. package/dist/mission.js.map +1 -0
  63. package/dist/planner/index.d.ts +84 -0
  64. package/dist/planner/index.d.ts.map +1 -0
  65. package/dist/planner/index.js +486 -0
  66. package/dist/planner/index.js.map +1 -0
  67. package/dist/robots.d.ts +133 -0
  68. package/dist/robots.d.ts.map +1 -0
  69. package/dist/robots.js +220 -0
  70. package/dist/robots.js.map +1 -0
  71. package/dist/topic-utils.d.ts +47 -0
  72. package/dist/topic-utils.d.ts.map +1 -0
  73. package/dist/topic-utils.js +136 -0
  74. package/dist/topic-utils.js.map +1 -0
  75. package/dist/transport/factory.d.ts +10 -0
  76. package/dist/transport/factory.d.ts.map +1 -0
  77. package/dist/transport/factory.js +40 -0
  78. package/dist/transport/factory.js.map +1 -0
  79. package/dist/transport/local/conversion.d.ts +30 -0
  80. package/dist/transport/local/conversion.d.ts.map +1 -0
  81. package/dist/transport/local/conversion.js +340 -0
  82. package/dist/transport/local/conversion.js.map +1 -0
  83. package/dist/transport/local/entities.d.ts +34 -0
  84. package/dist/transport/local/entities.d.ts.map +1 -0
  85. package/dist/transport/local/entities.js +108 -0
  86. package/dist/transport/local/entities.js.map +1 -0
  87. package/dist/transport/local/transport.d.ts +53 -0
  88. package/dist/transport/local/transport.d.ts.map +1 -0
  89. package/dist/transport/local/transport.js +344 -0
  90. package/dist/transport/local/transport.js.map +1 -0
  91. package/dist/transport/rosbridge/actions.d.ts +30 -0
  92. package/dist/transport/rosbridge/actions.d.ts.map +1 -0
  93. package/dist/transport/rosbridge/actions.js +61 -0
  94. package/dist/transport/rosbridge/actions.js.map +1 -0
  95. package/dist/transport/rosbridge/adapter.d.ts +29 -0
  96. package/dist/transport/rosbridge/adapter.d.ts.map +1 -0
  97. package/dist/transport/rosbridge/adapter.js +108 -0
  98. package/dist/transport/rosbridge/adapter.js.map +1 -0
  99. package/dist/transport/rosbridge/client.d.ts +55 -0
  100. package/dist/transport/rosbridge/client.d.ts.map +1 -0
  101. package/dist/transport/rosbridge/client.js +375 -0
  102. package/dist/transport/rosbridge/client.js.map +1 -0
  103. package/dist/transport/rosbridge/services.d.ts +14 -0
  104. package/dist/transport/rosbridge/services.d.ts.map +1 -0
  105. package/dist/transport/rosbridge/services.js +25 -0
  106. package/dist/transport/rosbridge/services.js.map +1 -0
  107. package/dist/transport/rosbridge/topics.d.ts +28 -0
  108. package/dist/transport/rosbridge/topics.d.ts.map +1 -0
  109. package/dist/transport/rosbridge/topics.js +59 -0
  110. package/dist/transport/rosbridge/topics.js.map +1 -0
  111. package/dist/transport/rosbridge/types.d.ts +87 -0
  112. package/dist/transport/rosbridge/types.d.ts.map +1 -0
  113. package/dist/transport/rosbridge/types.js +6 -0
  114. package/dist/transport/rosbridge/types.js.map +1 -0
  115. package/dist/transport/transport.d.ts +39 -0
  116. package/dist/transport/transport.d.ts.map +1 -0
  117. package/dist/transport/transport.js +2 -0
  118. package/dist/transport/transport.js.map +1 -0
  119. package/dist/transport/types.d.ts +100 -0
  120. package/dist/transport/types.d.ts.map +1 -0
  121. package/dist/transport/types.js +5 -0
  122. package/dist/transport/types.js.map +1 -0
  123. package/dist/transport/webrtc/signaling-client.d.ts +38 -0
  124. package/dist/transport/webrtc/signaling-client.d.ts.map +1 -0
  125. package/dist/transport/webrtc/signaling-client.js +161 -0
  126. package/dist/transport/webrtc/signaling-client.js.map +1 -0
  127. package/dist/transport/webrtc/signaling-types.d.ts +112 -0
  128. package/dist/transport/webrtc/signaling-types.d.ts.map +1 -0
  129. package/dist/transport/webrtc/signaling-types.js +8 -0
  130. package/dist/transport/webrtc/signaling-types.js.map +1 -0
  131. package/dist/transport/webrtc/transport.d.ts +67 -0
  132. package/dist/transport/webrtc/transport.d.ts.map +1 -0
  133. package/dist/transport/webrtc/transport.js +406 -0
  134. package/dist/transport/webrtc/transport.js.map +1 -0
  135. package/dist/transport/zenoh/adapter.d.ts +47 -0
  136. package/dist/transport/zenoh/adapter.d.ts.map +1 -0
  137. package/dist/transport/zenoh/adapter.js +296 -0
  138. package/dist/transport/zenoh/adapter.js.map +1 -0
  139. package/dist/transport/zenoh/cdr.d.ts +17 -0
  140. package/dist/transport/zenoh/cdr.d.ts.map +1 -0
  141. package/dist/transport/zenoh/cdr.js +170 -0
  142. package/dist/transport/zenoh/cdr.js.map +1 -0
  143. package/dist/transport/zenoh/keys.d.ts +21 -0
  144. package/dist/transport/zenoh/keys.d.ts.map +1 -0
  145. package/dist/transport/zenoh/keys.js +44 -0
  146. package/dist/transport/zenoh/keys.js.map +1 -0
  147. package/dist/transport-pool.d.ts +74 -0
  148. package/dist/transport-pool.d.ts.map +1 -0
  149. package/dist/transport-pool.js +135 -0
  150. package/dist/transport-pool.js.map +1 -0
  151. 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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"}