@molroo-io/sdk 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +251 -0
  3. package/dist/cjs/api-client.d.ts +23 -0
  4. package/dist/cjs/api-client.d.ts.map +1 -0
  5. package/dist/cjs/api-client.js +55 -0
  6. package/dist/cjs/defaults/index.d.ts +8 -0
  7. package/dist/cjs/defaults/index.d.ts.map +1 -0
  8. package/dist/cjs/defaults/index.js +30 -0
  9. package/dist/cjs/defaults/persona.json +17 -0
  10. package/dist/cjs/embedding/cloudflare.d.ts +15 -0
  11. package/dist/cjs/embedding/cloudflare.d.ts.map +1 -0
  12. package/dist/cjs/embedding/cloudflare.js +16 -0
  13. package/dist/cjs/embedding/cohere.d.ts +8 -0
  14. package/dist/cjs/embedding/cohere.d.ts.map +1 -0
  15. package/dist/cjs/embedding/cohere.js +31 -0
  16. package/dist/cjs/embedding/index.d.ts +9 -0
  17. package/dist/cjs/embedding/index.d.ts.map +1 -0
  18. package/dist/cjs/embedding/index.js +11 -0
  19. package/dist/cjs/embedding/local.d.ts +6 -0
  20. package/dist/cjs/embedding/local.d.ts.map +1 -0
  21. package/dist/cjs/embedding/local.js +28 -0
  22. package/dist/cjs/embedding/openai.d.ts +9 -0
  23. package/dist/cjs/embedding/openai.d.ts.map +1 -0
  24. package/dist/cjs/embedding/openai.js +26 -0
  25. package/dist/cjs/errors.d.ts +17 -0
  26. package/dist/cjs/errors.d.ts.map +1 -0
  27. package/dist/cjs/errors.js +21 -0
  28. package/dist/cjs/events/console.d.ts +25 -0
  29. package/dist/cjs/events/console.d.ts.map +1 -0
  30. package/dist/cjs/events/console.js +41 -0
  31. package/dist/cjs/events/types.d.ts +28 -0
  32. package/dist/cjs/events/types.d.ts.map +1 -0
  33. package/dist/cjs/events/types.js +13 -0
  34. package/dist/cjs/events/webhook.d.ts +30 -0
  35. package/dist/cjs/events/webhook.d.ts.map +1 -0
  36. package/dist/cjs/events/webhook.js +79 -0
  37. package/dist/cjs/generate/persona.d.ts +16 -0
  38. package/dist/cjs/generate/persona.d.ts.map +1 -0
  39. package/dist/cjs/generate/persona.js +42 -0
  40. package/dist/cjs/generate/prompt.d.ts +7 -0
  41. package/dist/cjs/generate/prompt.d.ts.map +1 -0
  42. package/dist/cjs/generate/prompt.js +41 -0
  43. package/dist/cjs/generate/schema.d.ts +32 -0
  44. package/dist/cjs/generate/schema.d.ts.map +1 -0
  45. package/dist/cjs/generate/schema.js +54 -0
  46. package/dist/cjs/generated/index.d.ts +2 -0
  47. package/dist/cjs/generated/index.d.ts.map +1 -0
  48. package/dist/cjs/generated/index.js +2 -0
  49. package/dist/cjs/index.d.ts +66 -0
  50. package/dist/cjs/index.d.ts.map +1 -0
  51. package/dist/cjs/index.js +69 -0
  52. package/dist/cjs/llm/adapter.d.ts +61 -0
  53. package/dist/cjs/llm/adapter.d.ts.map +1 -0
  54. package/dist/cjs/llm/adapter.js +2 -0
  55. package/dist/cjs/llm/resolve.d.ts +28 -0
  56. package/dist/cjs/llm/resolve.d.ts.map +1 -0
  57. package/dist/cjs/llm/resolve.js +20 -0
  58. package/dist/cjs/llm/schema.d.ts +60 -0
  59. package/dist/cjs/llm/schema.d.ts.map +1 -0
  60. package/dist/cjs/llm/schema.js +72 -0
  61. package/dist/cjs/llm/types.d.ts +24 -0
  62. package/dist/cjs/llm/types.d.ts.map +1 -0
  63. package/dist/cjs/llm/types.js +2 -0
  64. package/dist/cjs/llm/vercel-ai/adapter.d.ts +29 -0
  65. package/dist/cjs/llm/vercel-ai/adapter.d.ts.map +1 -0
  66. package/dist/cjs/llm/vercel-ai/adapter.js +234 -0
  67. package/dist/cjs/llm/vercel-ai/config.d.ts +9 -0
  68. package/dist/cjs/llm/vercel-ai/config.d.ts.map +1 -0
  69. package/dist/cjs/llm/vercel-ai/config.js +2 -0
  70. package/dist/cjs/llm/vercel-ai/index.d.ts +9 -0
  71. package/dist/cjs/llm/vercel-ai/index.d.ts.map +1 -0
  72. package/dist/cjs/llm/vercel-ai/index.js +13 -0
  73. package/dist/cjs/memory/cloudflare/index.d.ts +3 -0
  74. package/dist/cjs/memory/cloudflare/index.d.ts.map +1 -0
  75. package/dist/cjs/memory/cloudflare/index.js +5 -0
  76. package/dist/cjs/memory/cloudflare/vectorize.d.ts +62 -0
  77. package/dist/cjs/memory/cloudflare/vectorize.d.ts.map +1 -0
  78. package/dist/cjs/memory/cloudflare/vectorize.js +55 -0
  79. package/dist/cjs/memory/in-memory-semantic.d.ts +16 -0
  80. package/dist/cjs/memory/in-memory-semantic.d.ts.map +1 -0
  81. package/dist/cjs/memory/in-memory-semantic.js +57 -0
  82. package/dist/cjs/memory/in-memory.d.ts +46 -0
  83. package/dist/cjs/memory/in-memory.d.ts.map +1 -0
  84. package/dist/cjs/memory/in-memory.js +115 -0
  85. package/dist/cjs/memory/pinecone/index.d.ts +7 -0
  86. package/dist/cjs/memory/pinecone/index.d.ts.map +1 -0
  87. package/dist/cjs/memory/pinecone/index.js +8 -0
  88. package/dist/cjs/memory/pinecone/memory-adapter.d.ts +62 -0
  89. package/dist/cjs/memory/pinecone/memory-adapter.d.ts.map +1 -0
  90. package/dist/cjs/memory/pinecone/memory-adapter.js +220 -0
  91. package/dist/cjs/memory/pinecone/semantic.d.ts +44 -0
  92. package/dist/cjs/memory/pinecone/semantic.d.ts.map +1 -0
  93. package/dist/cjs/memory/pinecone/semantic.js +90 -0
  94. package/dist/cjs/memory/recall.d.ts +58 -0
  95. package/dist/cjs/memory/recall.d.ts.map +1 -0
  96. package/dist/cjs/memory/recall.js +220 -0
  97. package/dist/cjs/memory/semantic.d.ts +24 -0
  98. package/dist/cjs/memory/semantic.d.ts.map +1 -0
  99. package/dist/cjs/memory/semantic.js +2 -0
  100. package/dist/cjs/memory/sqlite/index.d.ts +3 -0
  101. package/dist/cjs/memory/sqlite/index.d.ts.map +1 -0
  102. package/dist/cjs/memory/sqlite/index.js +5 -0
  103. package/dist/cjs/memory/sqlite/memory-adapter.d.ts +58 -0
  104. package/dist/cjs/memory/sqlite/memory-adapter.d.ts.map +1 -0
  105. package/dist/cjs/memory/sqlite/memory-adapter.js +336 -0
  106. package/dist/cjs/memory/sqlite/schema.d.ts +4 -0
  107. package/dist/cjs/memory/sqlite/schema.d.ts.map +1 -0
  108. package/dist/cjs/memory/sqlite/schema.js +91 -0
  109. package/dist/cjs/memory/supabase/index.d.ts +7 -0
  110. package/dist/cjs/memory/supabase/index.d.ts.map +1 -0
  111. package/dist/cjs/memory/supabase/index.js +8 -0
  112. package/dist/cjs/memory/supabase/memory-adapter.d.ts +67 -0
  113. package/dist/cjs/memory/supabase/memory-adapter.d.ts.map +1 -0
  114. package/dist/cjs/memory/supabase/memory-adapter.js +335 -0
  115. package/dist/cjs/memory/supabase/semantic.d.ts +44 -0
  116. package/dist/cjs/memory/supabase/semantic.d.ts.map +1 -0
  117. package/dist/cjs/memory/supabase/semantic.js +72 -0
  118. package/dist/cjs/memory/types.d.ts +231 -0
  119. package/dist/cjs/memory/types.d.ts.map +1 -0
  120. package/dist/cjs/memory/types.js +12 -0
  121. package/dist/cjs/persona.d.ts +326 -0
  122. package/dist/cjs/persona.d.ts.map +1 -0
  123. package/dist/cjs/persona.js +824 -0
  124. package/dist/cjs/types.d.ts +263 -0
  125. package/dist/cjs/types.d.ts.map +1 -0
  126. package/dist/cjs/types.js +15 -0
  127. package/dist/cjs/world/client.d.ts +36 -0
  128. package/dist/cjs/world/client.d.ts.map +1 -0
  129. package/dist/cjs/world/client.js +59 -0
  130. package/dist/cjs/world/errors.d.ts +9 -0
  131. package/dist/cjs/world/errors.d.ts.map +1 -0
  132. package/dist/cjs/world/errors.js +15 -0
  133. package/dist/cjs/world/index.d.ts +10 -0
  134. package/dist/cjs/world/index.d.ts.map +1 -0
  135. package/dist/cjs/world/index.js +16 -0
  136. package/dist/cjs/world/types.d.ts +101 -0
  137. package/dist/cjs/world/types.d.ts.map +1 -0
  138. package/dist/cjs/world/types.js +8 -0
  139. package/dist/cjs/world/village.d.ts +75 -0
  140. package/dist/cjs/world/village.d.ts.map +1 -0
  141. package/dist/cjs/world/village.js +278 -0
  142. package/dist/cjs/world/world-persona.d.ts +182 -0
  143. package/dist/cjs/world/world-persona.d.ts.map +1 -0
  144. package/dist/cjs/world/world-persona.js +192 -0
  145. package/dist/cjs/world/world.d.ts +41 -0
  146. package/dist/cjs/world/world.d.ts.map +1 -0
  147. package/dist/cjs/world/world.js +91 -0
  148. package/dist/esm/api-client.d.ts +23 -0
  149. package/dist/esm/api-client.d.ts.map +1 -0
  150. package/dist/esm/api-client.js +48 -0
  151. package/dist/esm/defaults/index.d.ts +8 -0
  152. package/dist/esm/defaults/index.d.ts.map +1 -0
  153. package/dist/esm/defaults/index.js +23 -0
  154. package/dist/esm/defaults/persona.json +17 -0
  155. package/dist/esm/embedding/cloudflare.d.ts +15 -0
  156. package/dist/esm/embedding/cloudflare.d.ts.map +1 -0
  157. package/dist/esm/embedding/cloudflare.js +13 -0
  158. package/dist/esm/embedding/cohere.d.ts +8 -0
  159. package/dist/esm/embedding/cohere.d.ts.map +1 -0
  160. package/dist/esm/embedding/cohere.js +28 -0
  161. package/dist/esm/embedding/index.d.ts +9 -0
  162. package/dist/esm/embedding/index.d.ts.map +1 -0
  163. package/dist/esm/embedding/index.js +4 -0
  164. package/dist/esm/embedding/local.d.ts +6 -0
  165. package/dist/esm/embedding/local.d.ts.map +1 -0
  166. package/dist/esm/embedding/local.js +25 -0
  167. package/dist/esm/embedding/openai.d.ts +9 -0
  168. package/dist/esm/embedding/openai.d.ts.map +1 -0
  169. package/dist/esm/embedding/openai.js +23 -0
  170. package/dist/esm/errors.d.ts +17 -0
  171. package/dist/esm/errors.d.ts.map +1 -0
  172. package/dist/esm/errors.js +17 -0
  173. package/dist/esm/events/console.d.ts +25 -0
  174. package/dist/esm/events/console.d.ts.map +1 -0
  175. package/dist/esm/events/console.js +37 -0
  176. package/dist/esm/events/types.d.ts +28 -0
  177. package/dist/esm/events/types.d.ts.map +1 -0
  178. package/dist/esm/events/types.js +12 -0
  179. package/dist/esm/events/webhook.d.ts +30 -0
  180. package/dist/esm/events/webhook.d.ts.map +1 -0
  181. package/dist/esm/events/webhook.js +75 -0
  182. package/dist/esm/generate/persona.d.ts +16 -0
  183. package/dist/esm/generate/persona.d.ts.map +1 -0
  184. package/dist/esm/generate/persona.js +39 -0
  185. package/dist/esm/generate/prompt.d.ts +7 -0
  186. package/dist/esm/generate/prompt.d.ts.map +1 -0
  187. package/dist/esm/generate/prompt.js +38 -0
  188. package/dist/esm/generate/schema.d.ts +32 -0
  189. package/dist/esm/generate/schema.d.ts.map +1 -0
  190. package/dist/esm/generate/schema.js +51 -0
  191. package/dist/esm/generated/index.d.ts +2 -0
  192. package/dist/esm/generated/index.d.ts.map +1 -0
  193. package/dist/esm/generated/index.js +1 -0
  194. package/dist/esm/index.d.ts +66 -0
  195. package/dist/esm/index.d.ts.map +1 -0
  196. package/dist/esm/index.js +49 -0
  197. package/dist/esm/llm/adapter.d.ts +61 -0
  198. package/dist/esm/llm/adapter.d.ts.map +1 -0
  199. package/dist/esm/llm/adapter.js +1 -0
  200. package/dist/esm/llm/resolve.d.ts +28 -0
  201. package/dist/esm/llm/resolve.d.ts.map +1 -0
  202. package/dist/esm/llm/resolve.js +17 -0
  203. package/dist/esm/llm/schema.d.ts +60 -0
  204. package/dist/esm/llm/schema.d.ts.map +1 -0
  205. package/dist/esm/llm/schema.js +69 -0
  206. package/dist/esm/llm/types.d.ts +24 -0
  207. package/dist/esm/llm/types.d.ts.map +1 -0
  208. package/dist/esm/llm/types.js +1 -0
  209. package/dist/esm/llm/vercel-ai/adapter.d.ts +29 -0
  210. package/dist/esm/llm/vercel-ai/adapter.d.ts.map +1 -0
  211. package/dist/esm/llm/vercel-ai/adapter.js +196 -0
  212. package/dist/esm/llm/vercel-ai/config.d.ts +9 -0
  213. package/dist/esm/llm/vercel-ai/config.d.ts.map +1 -0
  214. package/dist/esm/llm/vercel-ai/config.js +1 -0
  215. package/dist/esm/llm/vercel-ai/index.d.ts +9 -0
  216. package/dist/esm/llm/vercel-ai/index.d.ts.map +1 -0
  217. package/dist/esm/llm/vercel-ai/index.js +8 -0
  218. package/dist/esm/memory/cloudflare/index.d.ts +3 -0
  219. package/dist/esm/memory/cloudflare/index.d.ts.map +1 -0
  220. package/dist/esm/memory/cloudflare/index.js +1 -0
  221. package/dist/esm/memory/cloudflare/vectorize.d.ts +62 -0
  222. package/dist/esm/memory/cloudflare/vectorize.d.ts.map +1 -0
  223. package/dist/esm/memory/cloudflare/vectorize.js +51 -0
  224. package/dist/esm/memory/in-memory-semantic.d.ts +16 -0
  225. package/dist/esm/memory/in-memory-semantic.d.ts.map +1 -0
  226. package/dist/esm/memory/in-memory-semantic.js +53 -0
  227. package/dist/esm/memory/in-memory.d.ts +46 -0
  228. package/dist/esm/memory/in-memory.d.ts.map +1 -0
  229. package/dist/esm/memory/in-memory.js +111 -0
  230. package/dist/esm/memory/pinecone/index.d.ts +7 -0
  231. package/dist/esm/memory/pinecone/index.d.ts.map +1 -0
  232. package/dist/esm/memory/pinecone/index.js +3 -0
  233. package/dist/esm/memory/pinecone/memory-adapter.d.ts +62 -0
  234. package/dist/esm/memory/pinecone/memory-adapter.d.ts.map +1 -0
  235. package/dist/esm/memory/pinecone/memory-adapter.js +216 -0
  236. package/dist/esm/memory/pinecone/semantic.d.ts +44 -0
  237. package/dist/esm/memory/pinecone/semantic.d.ts.map +1 -0
  238. package/dist/esm/memory/pinecone/semantic.js +86 -0
  239. package/dist/esm/memory/recall.d.ts +58 -0
  240. package/dist/esm/memory/recall.d.ts.map +1 -0
  241. package/dist/esm/memory/recall.js +215 -0
  242. package/dist/esm/memory/semantic.d.ts +24 -0
  243. package/dist/esm/memory/semantic.d.ts.map +1 -0
  244. package/dist/esm/memory/semantic.js +1 -0
  245. package/dist/esm/memory/sqlite/index.d.ts +3 -0
  246. package/dist/esm/memory/sqlite/index.d.ts.map +1 -0
  247. package/dist/esm/memory/sqlite/index.js +1 -0
  248. package/dist/esm/memory/sqlite/memory-adapter.d.ts +58 -0
  249. package/dist/esm/memory/sqlite/memory-adapter.d.ts.map +1 -0
  250. package/dist/esm/memory/sqlite/memory-adapter.js +296 -0
  251. package/dist/esm/memory/sqlite/schema.d.ts +4 -0
  252. package/dist/esm/memory/sqlite/schema.d.ts.map +1 -0
  253. package/dist/esm/memory/sqlite/schema.js +86 -0
  254. package/dist/esm/memory/supabase/index.d.ts +7 -0
  255. package/dist/esm/memory/supabase/index.d.ts.map +1 -0
  256. package/dist/esm/memory/supabase/index.js +3 -0
  257. package/dist/esm/memory/supabase/memory-adapter.d.ts +67 -0
  258. package/dist/esm/memory/supabase/memory-adapter.d.ts.map +1 -0
  259. package/dist/esm/memory/supabase/memory-adapter.js +331 -0
  260. package/dist/esm/memory/supabase/semantic.d.ts +44 -0
  261. package/dist/esm/memory/supabase/semantic.d.ts.map +1 -0
  262. package/dist/esm/memory/supabase/semantic.js +68 -0
  263. package/dist/esm/memory/types.d.ts +231 -0
  264. package/dist/esm/memory/types.d.ts.map +1 -0
  265. package/dist/esm/memory/types.js +9 -0
  266. package/dist/esm/persona.d.ts +326 -0
  267. package/dist/esm/persona.d.ts.map +1 -0
  268. package/dist/esm/persona.js +787 -0
  269. package/dist/esm/types.d.ts +263 -0
  270. package/dist/esm/types.d.ts.map +1 -0
  271. package/dist/esm/types.js +11 -0
  272. package/dist/esm/world/client.d.ts +36 -0
  273. package/dist/esm/world/client.d.ts.map +1 -0
  274. package/dist/esm/world/client.js +52 -0
  275. package/dist/esm/world/errors.d.ts +9 -0
  276. package/dist/esm/world/errors.d.ts.map +1 -0
  277. package/dist/esm/world/errors.js +11 -0
  278. package/dist/esm/world/index.d.ts +10 -0
  279. package/dist/esm/world/index.d.ts.map +1 -0
  280. package/dist/esm/world/index.js +8 -0
  281. package/dist/esm/world/types.d.ts +101 -0
  282. package/dist/esm/world/types.d.ts.map +1 -0
  283. package/dist/esm/world/types.js +7 -0
  284. package/dist/esm/world/village.d.ts +75 -0
  285. package/dist/esm/world/village.d.ts.map +1 -0
  286. package/dist/esm/world/village.js +274 -0
  287. package/dist/esm/world/world-persona.d.ts +182 -0
  288. package/dist/esm/world/world-persona.d.ts.map +1 -0
  289. package/dist/esm/world/world-persona.js +188 -0
  290. package/dist/esm/world/world.d.ts +41 -0
  291. package/dist/esm/world/world.d.ts.map +1 -0
  292. package/dist/esm/world/world.js +87 -0
  293. package/package.json +207 -0
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SupabaseMemoryAdapter = void 0;
4
+ const supabase_js_1 = require("@supabase/supabase-js");
5
+ /**
6
+ * Supabase-backed MemoryAdapter with optional pgvector semantic search.
7
+ *
8
+ * Combines episode/reflection RDB storage with optional pgvector embeddings
9
+ * into a single unified MemoryAdapter interface.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // RDB only (no vector search)
14
+ * const adapter = new SupabaseMemoryAdapter({
15
+ * supabaseUrl: process.env.SUPABASE_URL!,
16
+ * supabaseKey: process.env.SUPABASE_KEY!,
17
+ * personaId: 'world-123',
18
+ * });
19
+ *
20
+ * // With vector search
21
+ * const adapter = new SupabaseMemoryAdapter({
22
+ * supabaseUrl: process.env.SUPABASE_URL!,
23
+ * supabaseKey: process.env.SUPABASE_KEY!,
24
+ * personaId: 'world-123',
25
+ * vector: {
26
+ * embedding: openaiEmbedding({ apiKey: '...' }),
27
+ * matchThreshold: 0.75,
28
+ * },
29
+ * });
30
+ * ```
31
+ */
32
+ class SupabaseMemoryAdapter {
33
+ constructor(options) {
34
+ this.client = (0, supabase_js_1.createClient)(options.supabaseUrl, options.supabaseKey);
35
+ this.personaId = options.personaId;
36
+ this.rlsStrategy = options.rlsStrategy ?? 'application';
37
+ this.vectorEnabled = !!options.vector;
38
+ this.embedding = options.vector?.embedding;
39
+ this.matchThreshold = options.vector?.matchThreshold ?? 0.7;
40
+ }
41
+ async setPersonaContext() {
42
+ if (this.rlsStrategy === 'application') {
43
+ await this.client
44
+ .rpc('set_config', {
45
+ setting: 'app.current_persona_id',
46
+ value: this.personaId,
47
+ })
48
+ .throwOnError();
49
+ }
50
+ }
51
+ // ── Required methods ──
52
+ async saveEpisode(episode) {
53
+ await this.setPersonaContext();
54
+ const { error } = await this.client.from('episodes').upsert({
55
+ id: episode.id,
56
+ persona_id: this.personaId,
57
+ source_entity: episode.sourceEntity ?? null,
58
+ context: episode.context ?? null,
59
+ timestamp: episode.timestamp,
60
+ importance: episode.importance,
61
+ intensity: episode.intensity,
62
+ vad_v: episode.emotionSnapshot.V,
63
+ vad_a: episode.emotionSnapshot.A,
64
+ vad_d: episode.emotionSnapshot.D,
65
+ appraisal: episode.appraisal,
66
+ });
67
+ if (error)
68
+ throw new Error(`saveEpisode failed: ${error.message}`);
69
+ // Auto-index embedding when vector is enabled
70
+ if (this.vectorEnabled && this.embedding) {
71
+ try {
72
+ const text = episode.context ?? episode.sourceEntity ?? '';
73
+ if (text) {
74
+ const embedding = await this.embedding.embed(text);
75
+ await this.indexEmbedding(episode.id, embedding, {
76
+ type: 'episode',
77
+ sourceEntity: episode.sourceEntity,
78
+ timestamp: episode.timestamp,
79
+ importance: episode.importance,
80
+ });
81
+ }
82
+ }
83
+ catch {
84
+ // Best-effort: vector indexing failure doesn't block episode save.
85
+ }
86
+ }
87
+ }
88
+ async recall(query) {
89
+ await this.setPersonaContext();
90
+ const limit = query.limit ?? 10;
91
+ let q = this.client
92
+ .from('episodes')
93
+ .select('*')
94
+ .eq('persona_id', this.personaId);
95
+ if (query.sourceEntity)
96
+ q = q.eq('source_entity', query.sourceEntity);
97
+ if (query.context)
98
+ q = q.ilike('context', `%${query.context}%`);
99
+ if (query.minImportance !== undefined)
100
+ q = q.gte('importance', query.minImportance);
101
+ if (query.valenceRange) {
102
+ q = q
103
+ .gte('vad_v', query.valenceRange[0])
104
+ .lte('vad_v', query.valenceRange[1]);
105
+ }
106
+ if (query.timeRange) {
107
+ q = q
108
+ .gte('timestamp', query.timeRange[0])
109
+ .lte('timestamp', query.timeRange[1]);
110
+ }
111
+ const { data, error } = await q
112
+ .order('timestamp', { ascending: false })
113
+ .limit(limit);
114
+ if (error)
115
+ throw new Error(`recall failed: ${error.message}`);
116
+ return (data ?? []).map(rowToEpisode);
117
+ }
118
+ async saveReflection(reflection) {
119
+ await this.setPersonaContext();
120
+ const { error } = await this.client.from('reflections').upsert({
121
+ id: reflection.id,
122
+ persona_id: this.personaId,
123
+ source_entity: reflection.sourceEntity ?? null,
124
+ content: reflection.content,
125
+ trigger: reflection.trigger,
126
+ timestamp: reflection.timestamp,
127
+ vad_v: reflection.emotionSnapshot.V,
128
+ vad_a: reflection.emotionSnapshot.A,
129
+ vad_d: reflection.emotionSnapshot.D,
130
+ });
131
+ if (error)
132
+ throw new Error(`saveReflection failed: ${error.message}`);
133
+ }
134
+ async getReflections(sourceEntity) {
135
+ await this.setPersonaContext();
136
+ const maxRows = 100;
137
+ let q = this.client
138
+ .from('reflections')
139
+ .select('*')
140
+ .eq('persona_id', this.personaId)
141
+ .order('timestamp', { ascending: false });
142
+ if (sourceEntity)
143
+ q = q.eq('source_entity', sourceEntity);
144
+ const { data, error } = await q.limit(maxRows);
145
+ if (error)
146
+ throw new Error(`getReflections failed: ${error.message}`);
147
+ return (data ?? []).map(rowToReflection);
148
+ }
149
+ // ── Optional methods ──
150
+ async semanticRecall(query, options) {
151
+ if (!this.vectorEnabled || !this.embedding) {
152
+ // Fallback to text-based recall
153
+ return this.recall({ context: query, limit: options?.topK ?? 10 });
154
+ }
155
+ await this.setPersonaContext();
156
+ const embedding = await this.embedding.embed(query);
157
+ const topK = options?.topK ?? 5;
158
+ const { data, error } = await this.client.rpc('match_embeddings', {
159
+ query_embedding: embedding,
160
+ match_threshold: this.matchThreshold,
161
+ match_count: topK,
162
+ filter_persona_id: this.personaId,
163
+ filter_type: 'episode',
164
+ filter_source_entity: options?.filter?.sourceEntity ?? null,
165
+ filter_min_importance: options?.filter?.minImportance ?? null,
166
+ });
167
+ if (error)
168
+ throw new Error(`semanticRecall failed: ${error.message}`);
169
+ const matchedIds = (data ?? []).map((row) => row.id);
170
+ if (matchedIds.length === 0)
171
+ return [];
172
+ // Fetch full episodes for matched IDs
173
+ return this.getByIds(matchedIds);
174
+ }
175
+ async getByIds(ids) {
176
+ if (ids.length === 0)
177
+ return [];
178
+ await this.setPersonaContext();
179
+ const { data, error } = await this.client
180
+ .from('episodes')
181
+ .select('*')
182
+ .eq('persona_id', this.personaId)
183
+ .in('id', ids);
184
+ if (error)
185
+ throw new Error(`getByIds failed: ${error.message}`);
186
+ return (data ?? []).map(rowToEpisode);
187
+ }
188
+ async countEpisodes(query) {
189
+ await this.setPersonaContext();
190
+ let q = this.client
191
+ .from('episodes')
192
+ .select('*', { count: 'exact', head: true })
193
+ .eq('persona_id', this.personaId);
194
+ if (query.sourceEntity)
195
+ q = q.eq('source_entity', query.sourceEntity);
196
+ if (query.context)
197
+ q = q.ilike('context', `%${query.context}%`);
198
+ if (query.timeRange) {
199
+ q = q
200
+ .gte('timestamp', query.timeRange[0])
201
+ .lte('timestamp', query.timeRange[1]);
202
+ }
203
+ const { count, error } = await q;
204
+ if (error)
205
+ throw new Error(`countEpisodes failed: ${error.message}`);
206
+ return count ?? 0;
207
+ }
208
+ async updateEpisode(id, patch) {
209
+ await this.setPersonaContext();
210
+ const updates = {};
211
+ if (patch.importance !== undefined)
212
+ updates.importance = patch.importance;
213
+ if (patch.intensity !== undefined)
214
+ updates.intensity = patch.intensity;
215
+ if (patch.emotionSnapshot !== undefined) {
216
+ updates.vad_v = patch.emotionSnapshot.V;
217
+ updates.vad_a = patch.emotionSnapshot.A;
218
+ updates.vad_d = patch.emotionSnapshot.D;
219
+ }
220
+ if (Object.keys(updates).length === 0)
221
+ return;
222
+ const { error } = await this.client
223
+ .from('episodes')
224
+ .update(updates)
225
+ .eq('id', id)
226
+ .eq('persona_id', this.personaId);
227
+ if (error)
228
+ throw new Error(`updateEpisode failed: ${error.message}`);
229
+ }
230
+ async deleteEpisode(id) {
231
+ await this.setPersonaContext();
232
+ const { error } = await this.client
233
+ .from('episodes')
234
+ .delete()
235
+ .eq('id', id)
236
+ .eq('persona_id', this.personaId);
237
+ if (error)
238
+ throw new Error(`deleteEpisode failed: ${error.message}`);
239
+ // Best-effort: clean up embedding
240
+ if (this.vectorEnabled) {
241
+ try {
242
+ await this.client
243
+ .from('memory_embeddings')
244
+ .delete()
245
+ .eq('id', id)
246
+ .eq('persona_id', this.personaId);
247
+ }
248
+ catch {
249
+ // Non-fatal: vector cleanup failure is acceptable.
250
+ }
251
+ }
252
+ }
253
+ async expireEpisodes(before, minImportance) {
254
+ await this.setPersonaContext();
255
+ const threshold = minImportance ?? 0;
256
+ // Count first, then delete (Supabase delete doesn't return count reliably)
257
+ const { count, error: countErr } = await this.client
258
+ .from('episodes')
259
+ .select('*', { count: 'exact', head: true })
260
+ .eq('persona_id', this.personaId)
261
+ .lt('timestamp', before)
262
+ .lt('importance', threshold);
263
+ if (countErr)
264
+ throw new Error(`expireEpisodes count failed: ${countErr.message}`);
265
+ const expired = count ?? 0;
266
+ if (expired === 0)
267
+ return 0;
268
+ const { error } = await this.client
269
+ .from('episodes')
270
+ .delete()
271
+ .eq('persona_id', this.personaId)
272
+ .lt('timestamp', before)
273
+ .lt('importance', threshold);
274
+ if (error)
275
+ throw new Error(`expireEpisodes failed: ${error.message}`);
276
+ // Best-effort: clean up orphaned embeddings
277
+ if (this.vectorEnabled) {
278
+ try {
279
+ await this.client.rpc('cleanup_orphaned_embeddings', {
280
+ filter_persona_id: this.personaId,
281
+ });
282
+ }
283
+ catch {
284
+ // Non-fatal: orphan cleanup failure is acceptable.
285
+ }
286
+ }
287
+ return expired;
288
+ }
289
+ // ── Utility ──
290
+ async indexEmbedding(id, embedding, metadata) {
291
+ const { error } = await this.client.from('memory_embeddings').upsert({
292
+ id,
293
+ persona_id: this.personaId,
294
+ type: metadata.type,
295
+ source_entity: metadata.sourceEntity ?? null,
296
+ timestamp: metadata.timestamp,
297
+ importance: metadata.importance ?? 0,
298
+ embedding,
299
+ });
300
+ if (error)
301
+ throw new Error(`indexEmbedding failed: ${error.message}`);
302
+ }
303
+ }
304
+ exports.SupabaseMemoryAdapter = SupabaseMemoryAdapter;
305
+ // ── Row mappers ──
306
+ function rowToEpisode(row) {
307
+ return {
308
+ id: row.id,
309
+ timestamp: row.timestamp,
310
+ sourceEntity: row.source_entity || undefined,
311
+ context: row.context || undefined,
312
+ appraisal: row.appraisal,
313
+ emotionSnapshot: {
314
+ V: row.vad_v,
315
+ A: row.vad_a,
316
+ D: row.vad_d,
317
+ },
318
+ intensity: row.intensity,
319
+ importance: row.importance,
320
+ };
321
+ }
322
+ function rowToReflection(row) {
323
+ return {
324
+ id: row.id,
325
+ timestamp: row.timestamp,
326
+ sourceEntity: row.source_entity || undefined,
327
+ content: row.content,
328
+ trigger: row.trigger,
329
+ emotionSnapshot: {
330
+ V: row.vad_v,
331
+ A: row.vad_a,
332
+ D: row.vad_d,
333
+ },
334
+ };
335
+ }
@@ -0,0 +1,44 @@
1
+ import type { EmbeddingAdapter } from '../types';
2
+ import type { SemanticMemory, SearchOptions, SearchResult } from '../semantic';
3
+ export interface SupabaseSemanticMemoryOptions {
4
+ /** Supabase project URL. */
5
+ supabaseUrl: string;
6
+ /** Supabase anon or service-role key. */
7
+ supabaseKey: string;
8
+ /** Embedding provider (embed function + dimension). */
9
+ embedding: EmbeddingAdapter;
10
+ /** Match threshold for pgvector similarity. Default: 0.7. */
11
+ matchThreshold?: number;
12
+ /** Table name for embeddings. Default: 'memory_embeddings'. */
13
+ tableName?: string;
14
+ /** RPC function name for similarity search. Default: 'match_semantic_memory'. */
15
+ matchFunction?: string;
16
+ }
17
+ /**
18
+ * Supabase pgvector-backed SemanticMemory.
19
+ *
20
+ * Requires a table with columns: id (text PK), text (text), embedding (vector),
21
+ * metadata (jsonb), and an RPC function for similarity search.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const memory = new SupabaseSemanticMemory({
26
+ * supabaseUrl: process.env.SUPABASE_URL!,
27
+ * supabaseKey: process.env.SUPABASE_KEY!,
28
+ * embedding: openaiEmbedding({ apiKey: '...' }),
29
+ * });
30
+ * await memory.store('user likes coffee', { userId: '123' });
31
+ * ```
32
+ */
33
+ export declare class SupabaseSemanticMemory implements SemanticMemory {
34
+ private client;
35
+ private embedding;
36
+ private matchThreshold;
37
+ private tableName;
38
+ private matchFunction;
39
+ constructor(options: SupabaseSemanticMemoryOptions);
40
+ store(text: string, metadata?: Record<string, unknown>): Promise<string>;
41
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
42
+ delete(ids: string[]): Promise<void>;
43
+ }
44
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../../src/memory/supabase/semantic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,WAAW,6BAA6B;IAC5C,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,SAAS,EAAE,gBAAgB,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,EAAE,6BAA6B;IAQ5C,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,MAAM,CAAC;IAcZ,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC;IAwBpB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ3C"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SupabaseSemanticMemory = void 0;
4
+ const supabase_js_1 = require("@supabase/supabase-js");
5
+ /**
6
+ * Supabase pgvector-backed SemanticMemory.
7
+ *
8
+ * Requires a table with columns: id (text PK), text (text), embedding (vector),
9
+ * metadata (jsonb), and an RPC function for similarity search.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const memory = new SupabaseSemanticMemory({
14
+ * supabaseUrl: process.env.SUPABASE_URL!,
15
+ * supabaseKey: process.env.SUPABASE_KEY!,
16
+ * embedding: openaiEmbedding({ apiKey: '...' }),
17
+ * });
18
+ * await memory.store('user likes coffee', { userId: '123' });
19
+ * ```
20
+ */
21
+ class SupabaseSemanticMemory {
22
+ constructor(options) {
23
+ this.client = (0, supabase_js_1.createClient)(options.supabaseUrl, options.supabaseKey);
24
+ this.embedding = options.embedding;
25
+ this.matchThreshold = options.matchThreshold ?? 0.7;
26
+ this.tableName = options.tableName ?? 'memory_embeddings';
27
+ this.matchFunction = options.matchFunction ?? 'match_semantic_memory';
28
+ }
29
+ async store(text, metadata = {}) {
30
+ const id = crypto.randomUUID();
31
+ const vector = await this.embedding.embed(text);
32
+ const { error } = await this.client.from(this.tableName).upsert({
33
+ id,
34
+ text,
35
+ embedding: vector,
36
+ metadata,
37
+ });
38
+ if (error)
39
+ throw new Error(`store failed: ${error.message}`);
40
+ return id;
41
+ }
42
+ async search(query, options = {}) {
43
+ const topK = options.topK ?? 5;
44
+ const threshold = options.scoreThreshold ?? this.matchThreshold;
45
+ const vector = await this.embedding.embed(query);
46
+ const { data, error } = await this.client.rpc(this.matchFunction, {
47
+ query_embedding: vector,
48
+ match_threshold: threshold,
49
+ match_count: topK,
50
+ filter_metadata: options.filter ?? null,
51
+ });
52
+ if (error)
53
+ throw new Error(`search failed: ${error.message}`);
54
+ return (data ?? []).map((row) => ({
55
+ id: row.id,
56
+ text: row.text,
57
+ score: row.similarity,
58
+ metadata: row.metadata ?? {},
59
+ }));
60
+ }
61
+ async delete(ids) {
62
+ if (ids.length === 0)
63
+ return;
64
+ const { error } = await this.client
65
+ .from(this.tableName)
66
+ .delete()
67
+ .in('id', ids);
68
+ if (error)
69
+ throw new Error(`delete failed: ${error.message}`);
70
+ }
71
+ }
72
+ exports.SupabaseSemanticMemory = SupabaseSemanticMemory;
@@ -0,0 +1,231 @@
1
+ import type { Episode, VAD } from '../types';
2
+ export type { Episode, VAD };
3
+ /**
4
+ * Single-interface memory adapter for the SDK.
5
+ *
6
+ * Duck-type compatible with `@molroo-io/persona`'s `MemoryAdapter`.
7
+ * Implementations (SqliteMemoryAdapter, SupabaseMemoryAdapter, etc.) provide
8
+ * a single object that handles episode storage, recall, and optionally
9
+ * semantic/vector search internally.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { MolrooPersona } from '@molroo-io/sdk';
14
+ *
15
+ * const persona = await MolrooPersona.create({
16
+ * baseUrl: 'https://api.molroo.io',
17
+ * apiKey: 'key',
18
+ * llm,
19
+ * memory: myMemoryAdapter,
20
+ * });
21
+ * ```
22
+ */
23
+ export interface MemoryAdapter {
24
+ /** Save an episode returned by the API's AgentResponse. */
25
+ saveEpisode(episode: Episode): Promise<void>;
26
+ /**
27
+ * Recall relevant episodes by structured query.
28
+ * Accepts both SDK `RecallQuery` and `EpisodeQuery` shapes.
29
+ */
30
+ recall(query: RecallQuery): Promise<Episode[]>;
31
+ /** Save a reflection generated by LLM. Optional — omit for episode-only storage. */
32
+ saveReflection?(reflection: Reflection): Promise<void>;
33
+ /** Retrieve reflections for a source entity. Optional. */
34
+ getReflections?(sourceEntity?: string): Promise<Reflection[]>;
35
+ /**
36
+ * Vector/semantic similarity search. Optional.
37
+ * When provided, the adapter handles embedding internally — no separate
38
+ * EmbeddingAdapter needed.
39
+ */
40
+ semanticRecall?(query: string, options?: SemanticRecallOptions): Promise<Episode[]>;
41
+ /** Retrieve episodes by IDs. Optional — used for hydrating search results. */
42
+ getByIds?(ids: string[]): Promise<Episode[]>;
43
+ }
44
+ /**
45
+ * Query for recalling episodes from a MemoryAdapter.
46
+ *
47
+ * Compatible with both persona engine's `RecallQuery` (`context` field)
48
+ * and the SDK's `EpisodeQuery` (`contextContains` field).
49
+ */
50
+ export interface RecallQuery {
51
+ /** Filter by source entity name. */
52
+ sourceEntity?: string;
53
+ /** Search keyword or vector query text (persona engine compatibility). */
54
+ context?: string;
55
+ /** Max episodes to return. Default: implementation-specific. */
56
+ limit?: number;
57
+ /** Minimum importance score to include. */
58
+ minImportance?: number;
59
+ /** Epoch ms range [from, to]. */
60
+ timeRange?: [number, number];
61
+ /** Filter by episode type. Single string or array (OR match). */
62
+ type?: string | string[];
63
+ /** Valence range [min, max]. */
64
+ valenceRange?: [number, number];
65
+ }
66
+ /** Options for semantic/vector recall. */
67
+ export interface SemanticRecallOptions {
68
+ /** Number of results to return. Default: 5. */
69
+ topK?: number;
70
+ /** Minimum similarity score to include. */
71
+ minScore?: number;
72
+ /** Additional structured filters. */
73
+ filter?: Partial<RecallQuery>;
74
+ }
75
+ /** Recall limit configuration, extracted for reuse. */
76
+ export interface RecallLimits {
77
+ /** Max episodic memories per recall. Default: 5. */
78
+ episodicLimit?: number;
79
+ /** Max semantic results per recall. Default: 3. */
80
+ semanticLimit?: number;
81
+ /** Max reflections per recall. Default: 3. */
82
+ reflectionLimit?: number;
83
+ /** Minimum importance threshold. Default: 0. */
84
+ minImportance?: number;
85
+ }
86
+ /**
87
+ * Type guard: returns true if the memory config is a `MemoryConfig` (split adapters),
88
+ * false if it's a `MemoryAdapter` (single adapter).
89
+ *
90
+ * Discriminates by checking for `saveEpisode` — present on MemoryAdapter, absent on MemoryConfig.
91
+ */
92
+ export declare function isMemoryConfig(m: MemoryAdapter | MemoryConfig): m is MemoryConfig;
93
+ /**
94
+ * EpisodeAdapter — RDB-backed structured episode storage.
95
+ *
96
+ * Required adapter for the split `MemoryConfig` approach. Handles saving and
97
+ * recalling episodic memories (conversation episodes + reflections).
98
+ *
99
+ * Implementations: InMemoryEpisodeAdapter (built-in), or consumer-provided
100
+ * (SQLite, PostgreSQL, Supabase, etc.).
101
+ */
102
+ export interface EpisodeAdapter {
103
+ /** Save an episode returned by the API's AgentResponse. */
104
+ saveEpisode(episode: Episode): Promise<void>;
105
+ /** Recall relevant episodes by structured query (time-ordered). */
106
+ recall(query: EpisodeQuery): Promise<Episode[]>;
107
+ /** Retrieve episodes by IDs — used for hydrating SemanticStore results. */
108
+ getByIds?(ids: string[]): Promise<Episode[]>;
109
+ /** Save a reflection generated by LLM. */
110
+ saveReflection(reflection: Reflection): Promise<void>;
111
+ /** Retrieve reflections for a source entity. */
112
+ getReflections(sourceEntity?: string, limit?: number): Promise<Reflection[]>;
113
+ }
114
+ /** Structured query for episodic recall (RDB-style filtering). */
115
+ export interface EpisodeQuery {
116
+ /** Filter by source entity name. */
117
+ sourceEntity?: string;
118
+ /** LIKE search on episode context (not semantic). */
119
+ contextContains?: string;
120
+ /** Filter by episode type. Single string or array (OR match). */
121
+ type?: string | string[];
122
+ /** Max episodes to return. Default: 10. */
123
+ limit?: number;
124
+ /** Minimum importance score to include. */
125
+ minImportance?: number;
126
+ /** Epoch ms range [from, to]. */
127
+ timeRange?: [number, number];
128
+ /** Valence range [min, max]. */
129
+ valenceRange?: [number, number];
130
+ }
131
+ /**
132
+ * SemanticAdapter — Vector DB-backed semantic search.
133
+ *
134
+ * Optional adapter for similarity-based memory recall.
135
+ * Requires an EmbeddingAdapter to be configured alongside.
136
+ *
137
+ * Implementations: consumer-provided (Pinecone, pgvector, ChromaDB, etc.).
138
+ */
139
+ export interface SemanticAdapter {
140
+ /** Index a semantic entry (episode or reflection embedding). */
141
+ index(entry: SemanticEntry): Promise<void>;
142
+ /** Search for semantically similar entries. */
143
+ search(query: SemanticQuery): Promise<SemanticResult[]>;
144
+ }
145
+ /** Entry to index in the vector store. */
146
+ export interface SemanticEntry {
147
+ id: string;
148
+ embedding: number[];
149
+ metadata: {
150
+ type: 'episode' | 'reflection';
151
+ sourceEntity?: string;
152
+ timestamp: number;
153
+ importance?: number;
154
+ /** Episode type tag (e.g. 'chat_message', 'attack', 'gift'). */
155
+ episodeType?: string;
156
+ };
157
+ }
158
+ /** Query for semantic similarity search. */
159
+ export interface SemanticQuery {
160
+ embedding: number[];
161
+ /** Number of results to return. Default: 5. */
162
+ topK?: number;
163
+ filter?: {
164
+ type?: 'episode' | 'reflection';
165
+ sourceEntity?: string;
166
+ minImportance?: number;
167
+ /** Filter by episode type tag. */
168
+ episodeType?: string;
169
+ };
170
+ }
171
+ /** Result from semantic similarity search. */
172
+ export interface SemanticResult {
173
+ id: string;
174
+ score: number;
175
+ metadata: SemanticEntry['metadata'];
176
+ }
177
+ /**
178
+ * EmbeddingAdapter — generates vector embeddings from text.
179
+ *
180
+ * Required when using SemanticAdapter. Consumer provides their own
181
+ * embedding model (OpenAI, Cohere, local, etc.).
182
+ */
183
+ export interface EmbeddingAdapter {
184
+ /** Generate an embedding vector from text. */
185
+ embed(text: string): Promise<number[]>;
186
+ /** Dimensionality of the embedding vectors. */
187
+ readonly dimension: number;
188
+ }
189
+ /**
190
+ * MemoryConfig — split-adapter configuration for the SDK memory system.
191
+ *
192
+ * At minimum, provide an `episodes` adapter. Optionally add `semantic`
193
+ * + `embedding` for similarity-based recall.
194
+ *
195
+ * For simpler setup, pass a single `MemoryAdapter` instead of `MemoryConfig`.
196
+ */
197
+ export interface MemoryConfig {
198
+ /** Required: structured episode storage (RDB-backed). */
199
+ episodes: EpisodeAdapter;
200
+ /** Optional: vector similarity search. Requires `embedding` to be set. */
201
+ semantic?: SemanticAdapter;
202
+ /** Optional: embedding adapter. Required when `semantic` is set. */
203
+ embedding?: EmbeddingAdapter;
204
+ /** Optional: recall tuning parameters. */
205
+ recall?: RecallLimits;
206
+ }
207
+ export interface Reflection {
208
+ id: string;
209
+ timestamp: number;
210
+ sourceEntity?: string;
211
+ content: string;
212
+ trigger: string;
213
+ emotionSnapshot: VAD;
214
+ }
215
+ /** @deprecated Use EpisodeAdapter */
216
+ export type EpisodeStore = EpisodeAdapter;
217
+ /** @deprecated Use SemanticAdapter */
218
+ export type SemanticStore = SemanticAdapter;
219
+ /** @deprecated Use EmbeddingAdapter */
220
+ export type EmbeddingProvider = EmbeddingAdapter;
221
+ export interface EpisodePatch {
222
+ importance?: number;
223
+ intensity?: number;
224
+ emotionSnapshot?: VAD;
225
+ }
226
+ export interface CountQuery {
227
+ sourceEntity?: string;
228
+ context?: string;
229
+ timeRange?: [number, number];
230
+ }
231
+ //# sourceMappingURL=types.d.ts.map