@molroo-io/sdk 0.6.2 → 0.7.1

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 (252) hide show
  1. package/README.md +100 -194
  2. package/dist/cjs/api-client.d.ts +2 -12
  3. package/dist/cjs/api-client.d.ts.map +1 -1
  4. package/dist/cjs/api-client.js +4 -42
  5. package/dist/cjs/errors.d.ts +1 -16
  6. package/dist/cjs/errors.d.ts.map +1 -1
  7. package/dist/cjs/errors.js +2 -18
  8. package/dist/cjs/events/types.d.ts +14 -21
  9. package/dist/cjs/events/types.d.ts.map +1 -1
  10. package/dist/cjs/events/types.js +0 -11
  11. package/dist/cjs/index.d.ts +26 -48
  12. package/dist/cjs/index.d.ts.map +1 -1
  13. package/dist/cjs/index.js +29 -52
  14. package/dist/cjs/llm/resolve.d.ts +4 -22
  15. package/dist/cjs/llm/resolve.d.ts.map +1 -1
  16. package/dist/cjs/llm/resolve.js +19 -7
  17. package/dist/cjs/llm/vercel-ai/adapter.d.ts +4 -10
  18. package/dist/cjs/llm/vercel-ai/adapter.d.ts.map +1 -1
  19. package/dist/cjs/llm/vercel-ai/adapter.js +6 -152
  20. package/dist/cjs/llm/vercel-ai/config.d.ts +8 -5
  21. package/dist/cjs/llm/vercel-ai/config.d.ts.map +1 -1
  22. package/dist/cjs/memory/in-memory.d.ts +14 -37
  23. package/dist/cjs/memory/in-memory.d.ts.map +1 -1
  24. package/dist/cjs/memory/in-memory.js +22 -85
  25. package/dist/cjs/memory/recall.d.ts +10 -21
  26. package/dist/cjs/memory/recall.d.ts.map +1 -1
  27. package/dist/cjs/memory/recall.js +12 -91
  28. package/dist/cjs/memory/types.d.ts +46 -186
  29. package/dist/cjs/memory/types.d.ts.map +1 -1
  30. package/dist/cjs/memory/types.js +0 -10
  31. package/dist/cjs/persona/chat-orchestrator.d.ts +46 -0
  32. package/dist/cjs/persona/chat-orchestrator.d.ts.map +1 -0
  33. package/dist/cjs/persona/chat-orchestrator.js +240 -0
  34. package/dist/cjs/persona/event-emitter.d.ts +7 -0
  35. package/dist/cjs/persona/event-emitter.d.ts.map +1 -0
  36. package/dist/cjs/persona/event-emitter.js +53 -0
  37. package/dist/cjs/persona/memory-pipeline.d.ts +26 -0
  38. package/dist/cjs/persona/memory-pipeline.d.ts.map +1 -0
  39. package/dist/cjs/persona/memory-pipeline.js +69 -0
  40. package/dist/cjs/persona.d.ts +56 -187
  41. package/dist/cjs/persona.d.ts.map +1 -1
  42. package/dist/cjs/persona.js +62 -638
  43. package/dist/cjs/shared/appraisal.d.ts +26 -0
  44. package/dist/cjs/shared/appraisal.d.ts.map +1 -0
  45. package/dist/cjs/shared/appraisal.js +45 -0
  46. package/dist/cjs/shared/client-factory.d.ts +23 -0
  47. package/dist/cjs/shared/client-factory.d.ts.map +1 -0
  48. package/dist/cjs/shared/client-factory.js +48 -0
  49. package/dist/cjs/shared/errors.d.ts +21 -0
  50. package/dist/cjs/shared/errors.d.ts.map +1 -0
  51. package/dist/cjs/shared/errors.js +29 -0
  52. package/dist/cjs/world/client.d.ts +2 -9
  53. package/dist/cjs/world/client.d.ts.map +1 -1
  54. package/dist/cjs/world/client.js +7 -34
  55. package/dist/cjs/world/errors.d.ts +1 -8
  56. package/dist/cjs/world/errors.d.ts.map +1 -1
  57. package/dist/cjs/world/errors.js +2 -12
  58. package/dist/cjs/world/index.d.ts +2 -2
  59. package/dist/cjs/world/index.d.ts.map +1 -1
  60. package/dist/cjs/world/types.d.ts +32 -5
  61. package/dist/cjs/world/types.d.ts.map +1 -1
  62. package/dist/cjs/world/world-domain.d.ts.map +1 -1
  63. package/dist/cjs/world/world-domain.js +4 -32
  64. package/dist/cjs/world/world-persona.d.ts +17 -12
  65. package/dist/cjs/world/world-persona.d.ts.map +1 -1
  66. package/dist/cjs/world/world-persona.js +6 -18
  67. package/dist/cjs/world/world.d.ts +28 -5
  68. package/dist/cjs/world/world.d.ts.map +1 -1
  69. package/dist/cjs/world/world.js +13 -11
  70. package/dist/esm/api-client.d.ts +2 -12
  71. package/dist/esm/api-client.d.ts.map +1 -1
  72. package/dist/esm/api-client.js +3 -38
  73. package/dist/esm/errors.d.ts +1 -16
  74. package/dist/esm/errors.d.ts.map +1 -1
  75. package/dist/esm/errors.js +1 -17
  76. package/dist/esm/events/types.d.ts +14 -21
  77. package/dist/esm/events/types.d.ts.map +1 -1
  78. package/dist/esm/events/types.js +0 -11
  79. package/dist/esm/index.d.ts +26 -48
  80. package/dist/esm/index.d.ts.map +1 -1
  81. package/dist/esm/index.js +25 -38
  82. package/dist/esm/llm/resolve.d.ts +4 -22
  83. package/dist/esm/llm/resolve.d.ts.map +1 -1
  84. package/dist/esm/llm/resolve.js +20 -8
  85. package/dist/esm/llm/vercel-ai/adapter.d.ts +4 -10
  86. package/dist/esm/llm/vercel-ai/adapter.d.ts.map +1 -1
  87. package/dist/esm/llm/vercel-ai/adapter.js +6 -119
  88. package/dist/esm/llm/vercel-ai/config.d.ts +8 -5
  89. package/dist/esm/llm/vercel-ai/config.d.ts.map +1 -1
  90. package/dist/esm/memory/in-memory.d.ts +14 -37
  91. package/dist/esm/memory/in-memory.d.ts.map +1 -1
  92. package/dist/esm/memory/in-memory.js +20 -83
  93. package/dist/esm/memory/recall.d.ts +10 -21
  94. package/dist/esm/memory/recall.d.ts.map +1 -1
  95. package/dist/esm/memory/recall.js +12 -91
  96. package/dist/esm/memory/types.d.ts +46 -186
  97. package/dist/esm/memory/types.d.ts.map +1 -1
  98. package/dist/esm/memory/types.js +1 -9
  99. package/dist/esm/persona/chat-orchestrator.d.ts +46 -0
  100. package/dist/esm/persona/chat-orchestrator.d.ts.map +1 -0
  101. package/dist/esm/persona/chat-orchestrator.js +204 -0
  102. package/dist/esm/persona/event-emitter.d.ts +7 -0
  103. package/dist/esm/persona/event-emitter.d.ts.map +1 -0
  104. package/dist/esm/persona/event-emitter.js +50 -0
  105. package/dist/esm/persona/memory-pipeline.d.ts +26 -0
  106. package/dist/esm/persona/memory-pipeline.d.ts.map +1 -0
  107. package/dist/esm/persona/memory-pipeline.js +65 -0
  108. package/dist/esm/persona.d.ts +56 -187
  109. package/dist/esm/persona.d.ts.map +1 -1
  110. package/dist/esm/persona.js +62 -638
  111. package/dist/esm/shared/appraisal.d.ts +26 -0
  112. package/dist/esm/shared/appraisal.d.ts.map +1 -0
  113. package/dist/esm/shared/appraisal.js +40 -0
  114. package/dist/esm/shared/client-factory.d.ts +23 -0
  115. package/dist/esm/shared/client-factory.d.ts.map +1 -0
  116. package/dist/esm/shared/client-factory.js +41 -0
  117. package/dist/esm/shared/errors.d.ts +21 -0
  118. package/dist/esm/shared/errors.d.ts.map +1 -0
  119. package/dist/esm/shared/errors.js +24 -0
  120. package/dist/esm/world/client.d.ts +2 -9
  121. package/dist/esm/world/client.d.ts.map +1 -1
  122. package/dist/esm/world/client.js +6 -30
  123. package/dist/esm/world/errors.d.ts +1 -8
  124. package/dist/esm/world/errors.d.ts.map +1 -1
  125. package/dist/esm/world/errors.js +1 -11
  126. package/dist/esm/world/index.d.ts +2 -2
  127. package/dist/esm/world/index.d.ts.map +1 -1
  128. package/dist/esm/world/types.d.ts +32 -5
  129. package/dist/esm/world/types.d.ts.map +1 -1
  130. package/dist/esm/world/world-domain.d.ts.map +1 -1
  131. package/dist/esm/world/world-domain.js +4 -32
  132. package/dist/esm/world/world-persona.d.ts +17 -12
  133. package/dist/esm/world/world-persona.d.ts.map +1 -1
  134. package/dist/esm/world/world-persona.js +6 -18
  135. package/dist/esm/world/world.d.ts +28 -5
  136. package/dist/esm/world/world.d.ts.map +1 -1
  137. package/dist/esm/world/world.js +13 -11
  138. package/package.json +4 -101
  139. package/dist/cjs/embedding/cloudflare.d.ts +0 -15
  140. package/dist/cjs/embedding/cloudflare.d.ts.map +0 -1
  141. package/dist/cjs/embedding/cloudflare.js +0 -16
  142. package/dist/cjs/embedding/cohere.d.ts +0 -8
  143. package/dist/cjs/embedding/cohere.d.ts.map +0 -1
  144. package/dist/cjs/embedding/cohere.js +0 -31
  145. package/dist/cjs/embedding/index.d.ts +0 -9
  146. package/dist/cjs/embedding/index.d.ts.map +0 -1
  147. package/dist/cjs/embedding/index.js +0 -11
  148. package/dist/cjs/embedding/local.d.ts +0 -6
  149. package/dist/cjs/embedding/local.d.ts.map +0 -1
  150. package/dist/cjs/embedding/local.js +0 -28
  151. package/dist/cjs/embedding/openai.d.ts +0 -9
  152. package/dist/cjs/embedding/openai.d.ts.map +0 -1
  153. package/dist/cjs/embedding/openai.js +0 -26
  154. package/dist/cjs/events/console.d.ts +0 -25
  155. package/dist/cjs/events/console.d.ts.map +0 -1
  156. package/dist/cjs/events/console.js +0 -41
  157. package/dist/cjs/events/webhook.d.ts +0 -30
  158. package/dist/cjs/events/webhook.d.ts.map +0 -1
  159. package/dist/cjs/events/webhook.js +0 -79
  160. package/dist/cjs/memory/cloudflare/index.d.ts +0 -3
  161. package/dist/cjs/memory/cloudflare/index.d.ts.map +0 -1
  162. package/dist/cjs/memory/cloudflare/index.js +0 -5
  163. package/dist/cjs/memory/cloudflare/vectorize.d.ts +0 -62
  164. package/dist/cjs/memory/cloudflare/vectorize.d.ts.map +0 -1
  165. package/dist/cjs/memory/cloudflare/vectorize.js +0 -55
  166. package/dist/cjs/memory/in-memory-semantic.d.ts +0 -16
  167. package/dist/cjs/memory/in-memory-semantic.d.ts.map +0 -1
  168. package/dist/cjs/memory/in-memory-semantic.js +0 -57
  169. package/dist/cjs/memory/pinecone/index.d.ts +0 -7
  170. package/dist/cjs/memory/pinecone/index.d.ts.map +0 -1
  171. package/dist/cjs/memory/pinecone/index.js +0 -8
  172. package/dist/cjs/memory/pinecone/memory-adapter.d.ts +0 -62
  173. package/dist/cjs/memory/pinecone/memory-adapter.d.ts.map +0 -1
  174. package/dist/cjs/memory/pinecone/memory-adapter.js +0 -220
  175. package/dist/cjs/memory/pinecone/semantic.d.ts +0 -44
  176. package/dist/cjs/memory/pinecone/semantic.d.ts.map +0 -1
  177. package/dist/cjs/memory/pinecone/semantic.js +0 -90
  178. package/dist/cjs/memory/sqlite/index.d.ts +0 -3
  179. package/dist/cjs/memory/sqlite/index.d.ts.map +0 -1
  180. package/dist/cjs/memory/sqlite/index.js +0 -5
  181. package/dist/cjs/memory/sqlite/memory-adapter.d.ts +0 -58
  182. package/dist/cjs/memory/sqlite/memory-adapter.d.ts.map +0 -1
  183. package/dist/cjs/memory/sqlite/memory-adapter.js +0 -336
  184. package/dist/cjs/memory/sqlite/schema.d.ts +0 -4
  185. package/dist/cjs/memory/sqlite/schema.d.ts.map +0 -1
  186. package/dist/cjs/memory/sqlite/schema.js +0 -91
  187. package/dist/cjs/memory/supabase/index.d.ts +0 -7
  188. package/dist/cjs/memory/supabase/index.d.ts.map +0 -1
  189. package/dist/cjs/memory/supabase/index.js +0 -8
  190. package/dist/cjs/memory/supabase/memory-adapter.d.ts +0 -67
  191. package/dist/cjs/memory/supabase/memory-adapter.d.ts.map +0 -1
  192. package/dist/cjs/memory/supabase/memory-adapter.js +0 -335
  193. package/dist/cjs/memory/supabase/semantic.d.ts +0 -44
  194. package/dist/cjs/memory/supabase/semantic.d.ts.map +0 -1
  195. package/dist/cjs/memory/supabase/semantic.js +0 -72
  196. package/dist/esm/embedding/cloudflare.d.ts +0 -15
  197. package/dist/esm/embedding/cloudflare.d.ts.map +0 -1
  198. package/dist/esm/embedding/cloudflare.js +0 -13
  199. package/dist/esm/embedding/cohere.d.ts +0 -8
  200. package/dist/esm/embedding/cohere.d.ts.map +0 -1
  201. package/dist/esm/embedding/cohere.js +0 -28
  202. package/dist/esm/embedding/index.d.ts +0 -9
  203. package/dist/esm/embedding/index.d.ts.map +0 -1
  204. package/dist/esm/embedding/index.js +0 -4
  205. package/dist/esm/embedding/local.d.ts +0 -6
  206. package/dist/esm/embedding/local.d.ts.map +0 -1
  207. package/dist/esm/embedding/local.js +0 -25
  208. package/dist/esm/embedding/openai.d.ts +0 -9
  209. package/dist/esm/embedding/openai.d.ts.map +0 -1
  210. package/dist/esm/embedding/openai.js +0 -23
  211. package/dist/esm/events/console.d.ts +0 -25
  212. package/dist/esm/events/console.d.ts.map +0 -1
  213. package/dist/esm/events/console.js +0 -37
  214. package/dist/esm/events/webhook.d.ts +0 -30
  215. package/dist/esm/events/webhook.d.ts.map +0 -1
  216. package/dist/esm/events/webhook.js +0 -75
  217. package/dist/esm/memory/cloudflare/index.d.ts +0 -3
  218. package/dist/esm/memory/cloudflare/index.d.ts.map +0 -1
  219. package/dist/esm/memory/cloudflare/index.js +0 -1
  220. package/dist/esm/memory/cloudflare/vectorize.d.ts +0 -62
  221. package/dist/esm/memory/cloudflare/vectorize.d.ts.map +0 -1
  222. package/dist/esm/memory/cloudflare/vectorize.js +0 -51
  223. package/dist/esm/memory/in-memory-semantic.d.ts +0 -16
  224. package/dist/esm/memory/in-memory-semantic.d.ts.map +0 -1
  225. package/dist/esm/memory/in-memory-semantic.js +0 -53
  226. package/dist/esm/memory/pinecone/index.d.ts +0 -7
  227. package/dist/esm/memory/pinecone/index.d.ts.map +0 -1
  228. package/dist/esm/memory/pinecone/index.js +0 -3
  229. package/dist/esm/memory/pinecone/memory-adapter.d.ts +0 -62
  230. package/dist/esm/memory/pinecone/memory-adapter.d.ts.map +0 -1
  231. package/dist/esm/memory/pinecone/memory-adapter.js +0 -216
  232. package/dist/esm/memory/pinecone/semantic.d.ts +0 -44
  233. package/dist/esm/memory/pinecone/semantic.d.ts.map +0 -1
  234. package/dist/esm/memory/pinecone/semantic.js +0 -86
  235. package/dist/esm/memory/sqlite/index.d.ts +0 -3
  236. package/dist/esm/memory/sqlite/index.d.ts.map +0 -1
  237. package/dist/esm/memory/sqlite/index.js +0 -1
  238. package/dist/esm/memory/sqlite/memory-adapter.d.ts +0 -58
  239. package/dist/esm/memory/sqlite/memory-adapter.d.ts.map +0 -1
  240. package/dist/esm/memory/sqlite/memory-adapter.js +0 -296
  241. package/dist/esm/memory/sqlite/schema.d.ts +0 -4
  242. package/dist/esm/memory/sqlite/schema.d.ts.map +0 -1
  243. package/dist/esm/memory/sqlite/schema.js +0 -86
  244. package/dist/esm/memory/supabase/index.d.ts +0 -7
  245. package/dist/esm/memory/supabase/index.d.ts.map +0 -1
  246. package/dist/esm/memory/supabase/index.js +0 -3
  247. package/dist/esm/memory/supabase/memory-adapter.d.ts +0 -67
  248. package/dist/esm/memory/supabase/memory-adapter.d.ts.map +0 -1
  249. package/dist/esm/memory/supabase/memory-adapter.js +0 -331
  250. package/dist/esm/memory/supabase/semantic.d.ts +0 -44
  251. package/dist/esm/memory/supabase/semantic.d.ts.map +0 -1
  252. package/dist/esm/memory/supabase/semantic.js +0 -68
@@ -2,28 +2,22 @@ import type { LLMAdapter, GenerateTextOptions, GenerateObjectOptions } from '../
2
2
  import type { VercelAIConfig } from './config';
3
3
  /**
4
4
  * Vercel AI SDK adapter for molroo.
5
- * Supports OpenAI, Anthropic, Vertex AI, and OpenRouter providers.
5
+ * Wraps a pre-configured Vercel AI SDK provider instance.
6
6
  */
7
7
  export declare class VercelAIAdapter implements LLMAdapter {
8
- private config;
8
+ private provider;
9
+ private model?;
9
10
  constructor(config: VercelAIConfig);
10
- private getProvider;
11
- /**
12
- * Create a language model instance.
13
- * For OpenAI-compatible APIs with custom baseUrl, uses .chat() to force
14
- * Chat Completions API instead of the default Responses API.
15
- */
16
- private getModel;
17
11
  generateText(options: GenerateTextOptions): Promise<{
18
12
  text: string;
19
13
  }>;
20
14
  generateObject<T>(options: GenerateObjectOptions<T>): Promise<{
21
15
  object: T;
22
16
  }>;
23
- private getDefaultModel;
24
17
  }
25
18
  /**
26
19
  * Factory function to create a VercelAIAdapter instance.
20
+ * @deprecated Create adapter directly: `new VercelAIAdapter({ provider })`
27
21
  */
28
22
  export declare function createVercelAIAdapter(config: VercelAIConfig): VercelAIAdapter;
29
23
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAgG/C;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;YAIpB,WAAW;IAoCzB;;;;OAIG;YACW,QAAQ;IAQhB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAerE,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;IA2BlF,OAAO,CAAC,eAAe;CASxB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAE7E"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAiD/C;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,KAAK,CAAC,CAAS;gBAEX,MAAM,EAAE,cAAc;IAK5B,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAYrE,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;CAiBnF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAE7E"}
@@ -39,116 +39,18 @@ function strictifySchema(schema) {
39
39
  function isZodSchema(schema) {
40
40
  return schema && typeof schema === 'object' && '_def' in schema;
41
41
  }
42
- /**
43
- * Recursively strip `$schema` keys from any object.
44
- * AI SDK's Zod->JSON Schema converter adds `$schema` which some
45
- * OpenAI-compatible APIs (e.g. Kimi/Moonshot) reject.
46
- */
47
- function stripDollarSchema(obj) {
48
- if (!obj || typeof obj !== 'object')
49
- return obj;
50
- if (Array.isArray(obj))
51
- return obj.map(stripDollarSchema);
52
- const result = {};
53
- for (const [k, v] of Object.entries(obj)) {
54
- if (k === '$schema')
55
- continue;
56
- result[k] = stripDollarSchema(v);
57
- }
58
- return result;
59
- }
60
- /**
61
- * Create a fetch wrapper that strips `$schema` from JSON request bodies.
62
- * Used for OpenAI-compatible APIs that reject non-standard schema keywords.
63
- */
64
- function createSchemaStrippingFetch() {
65
- return async (input, init) => {
66
- if (init?.body && typeof init.body === 'string') {
67
- try {
68
- const parsed = JSON.parse(init.body);
69
- if (parsed.response_format?.json_schema?.schema) {
70
- parsed.response_format.json_schema.schema =
71
- stripDollarSchema(parsed.response_format.json_schema.schema);
72
- init = { ...init, body: JSON.stringify(parsed) };
73
- }
74
- }
75
- catch {
76
- // Not JSON, pass through
77
- }
78
- }
79
- const response = await globalThis.fetch(input, init);
80
- // Debug: log error responses from provider
81
- if (!response.ok && process.env.DEBUG_LLM) {
82
- const cloned = response.clone();
83
- try {
84
- const body = await cloned.text();
85
- console.error(`[adapter-llm] ${response.status} ${response.statusText}: ${body.slice(0, 500)}`);
86
- }
87
- catch { /* ignore */ }
88
- }
89
- return response;
90
- };
91
- }
92
42
  /**
93
43
  * Vercel AI SDK adapter for molroo.
94
- * Supports OpenAI, Anthropic, Vertex AI, and OpenRouter providers.
44
+ * Wraps a pre-configured Vercel AI SDK provider instance.
95
45
  */
96
46
  export class VercelAIAdapter {
97
47
  constructor(config) {
98
- this.config = config;
99
- }
100
- async getProvider() {
101
- switch (this.config.provider) {
102
- case 'openai': {
103
- const { createOpenAI } = await import('@ai-sdk/openai');
104
- return createOpenAI({
105
- apiKey: this.config.apiKey,
106
- ...(this.config.baseUrl ? {
107
- baseURL: this.config.baseUrl,
108
- fetch: createSchemaStrippingFetch(),
109
- } : {}),
110
- });
111
- }
112
- case 'anthropic': {
113
- const { createAnthropic } = await import('@ai-sdk/anthropic');
114
- return createAnthropic({ apiKey: this.config.apiKey });
115
- }
116
- case 'openrouter': {
117
- const { createOpenAI } = await import('@ai-sdk/openai');
118
- return createOpenAI({
119
- apiKey: this.config.apiKey,
120
- baseURL: 'https://openrouter.ai/api/v1',
121
- fetch: createSchemaStrippingFetch(),
122
- });
123
- }
124
- case 'vertex': {
125
- const { createVertex } = await import('@ai-sdk/google-vertex');
126
- return createVertex({
127
- project: this.config.projectId,
128
- location: this.config.location || 'us-central1'
129
- });
130
- }
131
- default:
132
- throw new Error(`Unknown provider: ${this.config.provider}`);
133
- }
134
- }
135
- /**
136
- * Create a language model instance.
137
- * For OpenAI-compatible APIs with custom baseUrl, uses .chat() to force
138
- * Chat Completions API instead of the default Responses API.
139
- */
140
- async getModel(modelName) {
141
- const provider = await this.getProvider();
142
- if (this.config.provider === 'openrouter' || (this.config.provider === 'openai' && this.config.baseUrl)) {
143
- return provider.chat(modelName);
144
- }
145
- return provider(modelName);
48
+ this.provider = config.provider;
49
+ this.model = config.model;
146
50
  }
147
51
  async generateText(options) {
148
- const modelName = this.config.model || this.getDefaultModel();
149
- const model = await this.getModel(modelName);
150
52
  const result = await generateTextAI({
151
- model,
53
+ model: this.provider,
152
54
  system: options.system,
153
55
  messages: options.messages,
154
56
  ...(options.temperature !== undefined && { temperature: options.temperature }),
@@ -157,39 +59,24 @@ export class VercelAIAdapter {
157
59
  return { text: result.text };
158
60
  }
159
61
  async generateObject(options) {
160
- const modelName = this.config.model || this.getDefaultModel();
161
- const model = await this.getModel(modelName);
162
62
  // Zod schemas can be passed directly to AI SDK.
163
63
  // Plain JSON schemas need strictification for OpenAI compatibility.
164
64
  const resolvedSchema = isZodSchema(options.schema)
165
65
  ? options.schema
166
66
  : jsonSchema(strictifySchema(options.schema));
167
- // OpenRouter and custom baseUrl providers often don't support strict
168
- // json_schema mode. Use tool calling mode which is more widely supported.
169
- const isProxied = this.config.provider === 'openrouter' ||
170
- (this.config.provider === 'openai' && !!this.config.baseUrl);
171
67
  const result = await generateObject({
172
- model,
68
+ model: this.provider,
173
69
  schema: resolvedSchema,
174
70
  system: options.system,
175
71
  messages: options.messages,
176
- ...(isProxied && { mode: 'tool' }),
177
72
  ...(options.temperature !== undefined && { temperature: options.temperature }),
178
73
  });
179
74
  return { object: result.object };
180
75
  }
181
- getDefaultModel() {
182
- switch (this.config.provider) {
183
- case 'openai': return 'gpt-4o';
184
- case 'anthropic': return 'claude-sonnet-4-5-20250929';
185
- case 'openrouter': return 'anthropic/claude-sonnet-4-5';
186
- case 'vertex': return 'gemini-2.0-flash';
187
- default: return 'gpt-4o';
188
- }
189
- }
190
76
  }
191
77
  /**
192
78
  * Factory function to create a VercelAIAdapter instance.
79
+ * @deprecated Create adapter directly: `new VercelAIAdapter({ provider })`
193
80
  */
194
81
  export function createVercelAIAdapter(config) {
195
82
  return new VercelAIAdapter(config);
@@ -1,9 +1,12 @@
1
+ import type { LanguageModel } from 'ai';
2
+ /**
3
+ * Configuration for VercelAIAdapter.
4
+ * Accepts a pre-configured Vercel AI SDK provider instance.
5
+ */
1
6
  export interface VercelAIConfig {
2
- provider: 'openai' | 'anthropic' | 'vertex' | 'openrouter';
3
- apiKey: string;
7
+ /** Pre-configured Vercel AI SDK provider instance (e.g., from createOpenAI()) */
8
+ provider: LanguageModel;
9
+ /** Default model name. If not provided, uses provider's default */
4
10
  model?: string;
5
- baseUrl?: string;
6
- projectId?: string;
7
- location?: string;
8
11
  }
9
12
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,QAAQ,EAAE,aAAa,CAAC;IACxB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1,46 +1,23 @@
1
- import type { Episode } from '../types';
2
- import type { EpisodeAdapter, EpisodeQuery, MemoryAdapter, RecallQuery, Reflection } from './types';
3
1
  /**
4
- * In-memory implementation of both EpisodeAdapter and MemoryAdapter.
5
- *
6
- * Useful for demos, testing, and prototyping. Data is lost on process exit
7
- * unless explicitly serialized via `toJSON()` / `fromJSON()`.
8
- *
9
- * Can be used as:
10
- * - `memory: { episodes: new InMemoryEpisodeAdapter() }` (split config)
11
- * - `memory: new InMemoryEpisodeAdapter()` (single adapter)
2
+ * In-memory adapter for testing purposes.
3
+ * Not recommended for production use (data is lost on restart).
12
4
  */
13
- export declare class InMemoryEpisodeAdapter implements EpisodeAdapter, MemoryAdapter {
5
+ import type { Episode, Reflection } from './types';
6
+ import type { MemoryAdapter, RecallQuery } from './types';
7
+ /**
8
+ * Simple in-memory adapter for testing.
9
+ * Stores episodes in memory only.
10
+ */
11
+ export declare class InMemoryAdapter implements MemoryAdapter {
14
12
  private episodes;
15
13
  private reflections;
16
14
  saveEpisode(episode: Episode): Promise<void>;
17
- /**
18
- * Recall episodes by query.
19
- * Accepts both `EpisodeQuery` (with `contextContains`) and `RecallQuery` (with `context`).
20
- */
21
- recall(query: EpisodeQuery | RecallQuery): Promise<Episode[]>;
22
- getByIds(ids: string[]): Promise<Episode[]>;
15
+ recall(query: RecallQuery): Promise<Episode[]>;
23
16
  saveReflection(reflection: Reflection): Promise<void>;
24
- getReflections(sourceEntity?: string, limit?: number): Promise<Reflection[]>;
25
- /** Export all data for persistence (save slots, etc.). */
26
- toJSON(): {
27
- episodes: Episode[];
28
- reflections: Reflection[];
29
- };
30
- /** Restore data from a previous export. */
31
- fromJSON(data: {
32
- episodes?: Episode[];
33
- reflections?: Reflection[];
34
- }): void;
35
- /** Number of stored episodes. */
36
- get episodeCount(): number;
37
- /** Number of stored reflections. */
38
- get reflectionCount(): number;
39
- /** Clear all data. */
17
+ getReflections(sourceEntity?: string): Promise<Reflection[]>;
18
+ /** Clear all stored data (for testing). */
40
19
  clear(): void;
41
20
  }
42
- /** @deprecated Use InMemoryEpisodeAdapter */
43
- export declare const InMemoryEpisodeStore: typeof InMemoryEpisodeAdapter;
44
- /** @deprecated Use InMemoryEpisodeAdapter */
45
- export type InMemoryEpisodeStore = InMemoryEpisodeAdapter;
21
+ /** @deprecated Use InMemoryAdapter */
22
+ export declare const InMemoryEpisodeAdapter: typeof InMemoryAdapter;
46
23
  //# sourceMappingURL=in-memory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpG;;;;;;;;;GASG;AACH,qBAAa,sBAAuB,YAAW,cAAc,EAAE,aAAa;IAC1E,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAAoB;IAEjC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA0C7D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAK3C,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAelF,0DAA0D;IAC1D,MAAM,IAAI;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,WAAW,EAAE,UAAU,EAAE,CAAA;KAAE;IAO5D,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;KAAE,GAAG,IAAI;IAK1E,iCAAiC;IACjC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,oCAAoC;IACpC,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,sBAAsB;IACtB,KAAK,IAAI,IAAI;CAId;AAED,6CAA6C;AAC7C,eAAO,MAAM,oBAAoB,+BAAyB,CAAC;AAC3D,6CAA6C;AAC7C,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,CAAC"}
1
+ {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/in-memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1D;;;GAGG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAAoB;IAEjC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAwB9C,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOlE,2CAA2C;IAC3C,KAAK,IAAI,IAAI;CAId;AAED,sCAAsC;AACtC,eAAO,MAAM,sBAAsB,wBAAkB,CAAC"}
@@ -1,111 +1,48 @@
1
1
  /**
2
- * In-memory implementation of both EpisodeAdapter and MemoryAdapter.
3
- *
4
- * Useful for demos, testing, and prototyping. Data is lost on process exit
5
- * unless explicitly serialized via `toJSON()` / `fromJSON()`.
6
- *
7
- * Can be used as:
8
- * - `memory: { episodes: new InMemoryEpisodeAdapter() }` (split config)
9
- * - `memory: new InMemoryEpisodeAdapter()` (single adapter)
2
+ * Simple in-memory adapter for testing.
3
+ * Stores episodes in memory only.
10
4
  */
11
- export class InMemoryEpisodeAdapter {
5
+ export class InMemoryAdapter {
12
6
  constructor() {
13
7
  this.episodes = [];
14
8
  this.reflections = [];
15
9
  }
16
10
  async saveEpisode(episode) {
17
- const idx = this.episodes.findIndex(e => e.id === episode.id);
18
- if (idx >= 0) {
19
- this.episodes[idx] = episode;
20
- }
21
- else {
22
- this.episodes.push(episode);
23
- }
11
+ this.episodes.push(episode);
24
12
  }
25
- /**
26
- * Recall episodes by query.
27
- * Accepts both `EpisodeQuery` (with `contextContains`) and `RecallQuery` (with `context`).
28
- */
29
13
  async recall(query) {
30
14
  let results = [...this.episodes];
31
15
  if (query.sourceEntity) {
32
- results = results.filter(e => e.sourceEntity === query.sourceEntity);
16
+ results = results.filter(ep => ep.sourceEntity === query.sourceEntity);
33
17
  }
34
- // Support both EpisodeQuery.contextContains and RecallQuery.context
35
- const contextSearch = ('contextContains' in query ? query.contextContains : undefined)
36
- ?? ('context' in query ? query.context : undefined);
37
- if (contextSearch) {
38
- const lower = contextSearch.toLowerCase();
39
- results = results.filter(e => e.context?.toLowerCase().includes(lower));
40
- }
41
- if (query.type !== undefined) {
18
+ if (query.type) {
42
19
  const types = Array.isArray(query.type) ? query.type : [query.type];
43
- results = results.filter(e => e.type !== undefined && types.includes(e.type));
20
+ results = results.filter(ep => ep.type && types.includes(ep.type));
44
21
  }
45
22
  if (query.minImportance !== undefined) {
46
- results = results.filter(e => e.importance >= query.minImportance);
47
- }
48
- if (query.timeRange) {
49
- const [from, to] = query.timeRange;
50
- results = results.filter(e => e.timestamp >= from && e.timestamp <= to);
23
+ results = results.filter(ep => ep.importance >= query.minImportance);
51
24
  }
52
- if ('valenceRange' in query && query.valenceRange) {
53
- const [min, max] = query.valenceRange;
54
- results = results.filter(e => e.emotionSnapshot.V >= min && e.emotionSnapshot.V <= max);
55
- }
56
- // Sort by timestamp descending (most recent first)
25
+ // Sort by timestamp desc
57
26
  results.sort((a, b) => b.timestamp - a.timestamp);
58
- const limit = query.limit ?? 10;
59
- return results.slice(0, limit);
60
- }
61
- async getByIds(ids) {
62
- const idSet = new Set(ids);
63
- return this.episodes.filter(e => idSet.has(e.id));
27
+ if (query.limit) {
28
+ results = results.slice(0, query.limit);
29
+ }
30
+ return results;
64
31
  }
65
32
  async saveReflection(reflection) {
66
- const idx = this.reflections.findIndex(r => r.id === reflection.id);
67
- if (idx >= 0) {
68
- this.reflections[idx] = reflection;
69
- }
70
- else {
71
- this.reflections.push(reflection);
72
- }
33
+ this.reflections.push(reflection);
73
34
  }
74
- async getReflections(sourceEntity, limit) {
75
- let results = [...this.reflections];
35
+ async getReflections(sourceEntity) {
76
36
  if (sourceEntity) {
77
- results = results.filter(r => r.sourceEntity === sourceEntity);
37
+ return this.reflections.filter(r => r.sourceEntity === sourceEntity);
78
38
  }
79
- // Sort by timestamp descending
80
- results.sort((a, b) => b.timestamp - a.timestamp);
81
- return results.slice(0, limit ?? 10);
82
- }
83
- // ── Serialization helpers ──
84
- /** Export all data for persistence (save slots, etc.). */
85
- toJSON() {
86
- return {
87
- episodes: [...this.episodes],
88
- reflections: [...this.reflections],
89
- };
90
- }
91
- /** Restore data from a previous export. */
92
- fromJSON(data) {
93
- this.episodes = data.episodes ? [...data.episodes] : [];
94
- this.reflections = data.reflections ? [...data.reflections] : [];
95
- }
96
- /** Number of stored episodes. */
97
- get episodeCount() {
98
- return this.episodes.length;
99
- }
100
- /** Number of stored reflections. */
101
- get reflectionCount() {
102
- return this.reflections.length;
39
+ return [...this.reflections];
103
40
  }
104
- /** Clear all data. */
41
+ /** Clear all stored data (for testing). */
105
42
  clear() {
106
43
  this.episodes = [];
107
44
  this.reflections = [];
108
45
  }
109
46
  }
110
- /** @deprecated Use InMemoryEpisodeAdapter */
111
- export const InMemoryEpisodeStore = InMemoryEpisodeAdapter;
47
+ /** @deprecated Use InMemoryAdapter */
48
+ export const InMemoryEpisodeAdapter = InMemoryAdapter;
@@ -1,20 +1,18 @@
1
1
  /**
2
2
  * Shared memory recall and prompt-building utilities.
3
3
  *
4
- * Used by MolrooPersona to recall episodic/semantic memories and
5
- * format them for LLM system prompts. Supports both:
6
- * - Single MemoryAdapter (new, preferred)
7
- * - Split EpisodeAdapter + SemanticAdapter + EmbeddingAdapter (backward compat)
4
+ * Used by Molroo to recall episodic/semantic memories and
5
+ * format them for LLM system prompts.
8
6
  */
9
7
  import type { Episode } from '../types';
10
- import type { EpisodeAdapter, SemanticAdapter, EmbeddingAdapter, MemoryAdapter, Reflection } from './types';
8
+ import type { MemoryAdapter, Reflection } from './types';
11
9
  /**
12
10
  * Strip leading `[...]` metadata tags from text before embedding.
13
11
  * These tags (channel info, scene hints, timestamps) add noise to
14
12
  * semantic similarity and should not influence vector search.
15
13
  */
16
14
  export declare function stripMetaTags(text: string): string;
17
- /** Recall tuning parameters. */
15
+ /** Recall configuration. */
18
16
  export interface RecallConfig {
19
17
  episodicLimit?: number;
20
18
  semanticLimit?: number;
@@ -30,25 +28,16 @@ export interface RecallResult {
30
28
  reflections: Reflection[];
31
29
  }
32
30
  /**
33
- * Recall episodic + semantic + reflection memories in parallel.
34
- *
35
- * Supports two paths:
36
- * 1. Single MemoryAdapter (`memoryAdapter` param) — adapter handles everything
37
- * 2. Split stores (`episodeStore` + `semanticStore` + `embeddingProvider`) — legacy
31
+ * Recall episodic + semantic + reflection memories from a MemoryAdapter.
38
32
  *
39
33
  * @param message - Current user message (used for semantic embedding).
40
- * @param opts - Stores, provider, config, and entity filter.
34
+ * @param adapter - MemoryAdapter instance.
35
+ * @param config - Recall configuration.
36
+ * @param sourceEntity - Filter episodes by source entity.
37
+ * @param reflectionEntity - Filter reflections by entity.
41
38
  * @returns Recalled memories grouped by type.
42
39
  */
43
- export declare function recallMemories(message: string, opts: {
44
- memoryAdapter?: MemoryAdapter | null;
45
- episodeStore: EpisodeAdapter | null;
46
- semanticStore: SemanticAdapter | null;
47
- embeddingProvider: EmbeddingAdapter | null;
48
- config?: RecallConfig;
49
- sourceEntity?: string;
50
- reflectionEntity?: string;
51
- }): Promise<RecallResult>;
40
+ export declare function recallMemories(message: string, adapter: MemoryAdapter, config?: RecallConfig, sourceEntity?: string, reflectionEntity?: string): Promise<RecallResult>;
52
41
  /**
53
42
  * Format recalled memories into a text block for LLM system prompt injection.
54
43
  * Groups episodic memories by type: conversations vs events.
@@ -1 +1 @@
1
- {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,UAAU,EAEX,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAgFD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IACJ,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,iBAAiB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,OAAO,CAAC,YAAY,CAAC,CA2FvB;AAcD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAC5B,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAC5B,WAAW,CAAC,EAAE,UAAU,EAAE,GACzB,MAAM,CAwCR"}
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAgB,MAAM,SAAS,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,4BAA4B;AAC5B,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,MAAM,GAAE,YAAiB,EACzB,YAAY,CAAC,EAAE,MAAM,EACrB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAkEvB;AAcD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAC5B,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAC5B,WAAW,CAAC,EAAE,UAAU,EAAE,GACzB,MAAM,CAwCR"}
@@ -1,10 +1,8 @@
1
1
  /**
2
2
  * Shared memory recall and prompt-building utilities.
3
3
  *
4
- * Used by MolrooPersona to recall episodic/semantic memories and
5
- * format them for LLM system prompts. Supports both:
6
- * - Single MemoryAdapter (new, preferred)
7
- * - Split EpisodeAdapter + SemanticAdapter + EmbeddingAdapter (backward compat)
4
+ * Used by Molroo to recall episodic/semantic memories and
5
+ * format them for LLM system prompts.
8
6
  */
9
7
  /**
10
8
  * Strip leading `[...]` metadata tags from text before embedding.
@@ -15,10 +13,16 @@ export function stripMetaTags(text) {
15
13
  return text.replace(/^\s*(\[.*?\]\s*)+/s, '').trim();
16
14
  }
17
15
  /**
18
- * Recall from a single MemoryAdapter. The adapter handles all storage
19
- * and vector search internally.
16
+ * Recall episodic + semantic + reflection memories from a MemoryAdapter.
17
+ *
18
+ * @param message - Current user message (used for semantic embedding).
19
+ * @param adapter - MemoryAdapter instance.
20
+ * @param config - Recall configuration.
21
+ * @param sourceEntity - Filter episodes by source entity.
22
+ * @param reflectionEntity - Filter reflections by entity.
23
+ * @returns Recalled memories grouped by type.
20
24
  */
21
- async function recallFromAdapter(message, adapter, config, sourceEntity, reflectionEntity) {
25
+ export async function recallMemories(message, adapter, config = {}, sourceEntity, reflectionEntity) {
22
26
  const episodicLimit = config.episodicLimit ?? 5;
23
27
  const semanticLimit = config.semanticLimit ?? 3;
24
28
  const reflectionLimit = config.reflectionLimit ?? 3;
@@ -48,7 +52,7 @@ async function recallFromAdapter(message, adapter, config, sourceEntity, reflect
48
52
  ? adapter
49
53
  .semanticRecall(stripMetaTags(message), {
50
54
  topK: semanticLimit,
51
- filter: { minImportance },
55
+ minImportance,
52
56
  })
53
57
  .catch(() => [])
54
58
  : Promise.resolve([]);
@@ -78,89 +82,6 @@ async function recallFromAdapter(message, adapter, config, sourceEntity, reflect
78
82
  episodic.splice(episodicLimit);
79
83
  return { episodic, semantic, reflections };
80
84
  }
81
- /**
82
- * Recall episodic + semantic + reflection memories in parallel.
83
- *
84
- * Supports two paths:
85
- * 1. Single MemoryAdapter (`memoryAdapter` param) — adapter handles everything
86
- * 2. Split stores (`episodeStore` + `semanticStore` + `embeddingProvider`) — legacy
87
- *
88
- * @param message - Current user message (used for semantic embedding).
89
- * @param opts - Stores, provider, config, and entity filter.
90
- * @returns Recalled memories grouped by type.
91
- */
92
- export async function recallMemories(message, opts) {
93
- const config = opts.config ?? {};
94
- // Path 1: Single MemoryAdapter
95
- if (opts.memoryAdapter) {
96
- return recallFromAdapter(message, opts.memoryAdapter, config, opts.sourceEntity, opts.reflectionEntity);
97
- }
98
- // Path 2: Split stores (backward compat)
99
- const { episodeStore, semanticStore, embeddingProvider } = opts;
100
- const episodicLimit = config.episodicLimit ?? 5;
101
- const semanticLimit = config.semanticLimit ?? 3;
102
- const reflectionLimit = config.reflectionLimit ?? 3;
103
- const minImportance = config.minImportance ?? 0;
104
- // Episodic recall — conversations (filtered by sourceEntity)
105
- const conversationP = episodeStore
106
- ? episodeStore
107
- .recall({
108
- sourceEntity: opts.sourceEntity,
109
- limit: episodicLimit,
110
- minImportance,
111
- ...(config.types ? { type: config.types } : {}),
112
- })
113
- .catch(() => [])
114
- : Promise.resolve([]);
115
- // Episodic recall — non-chat events (no sourceEntity filter).
116
- // Events like attacks/gifts come from various entities and must be
117
- // recalled regardless of who the persona is currently talking to.
118
- const hasTypeFilter = config.types && config.types.length > 0;
119
- const eventP = (episodeStore && !hasTypeFilter)
120
- ? episodeStore
121
- .recall({
122
- // No sourceEntity — recall events from all sources
123
- limit: episodicLimit,
124
- minImportance,
125
- })
126
- .then((all) => all.filter((ep) => ep.type && ep.type !== 'chat_message'))
127
- .catch(() => [])
128
- : Promise.resolve([]);
129
- // Semantic recall (vector)
130
- const semanticP = semanticStore && embeddingProvider && episodeStore?.getByIds
131
- ? embeddingProvider
132
- .embed(stripMetaTags(message))
133
- .then((embedding) => semanticStore.search({ embedding, topK: semanticLimit, filter: { minImportance } }))
134
- .then((results) => results.length > 0
135
- ? episodeStore.getByIds(results.map((r) => r.id))
136
- : [])
137
- .catch(() => [])
138
- : Promise.resolve([]);
139
- // Reflection recall (RDB)
140
- const reflectionP = episodeStore
141
- ? episodeStore
142
- .getReflections(opts.reflectionEntity, reflectionLimit)
143
- .catch(() => [])
144
- : Promise.resolve([]);
145
- const [conversations, events, semantic, reflections] = await Promise.all([
146
- conversationP,
147
- eventP,
148
- semanticP,
149
- reflectionP,
150
- ]);
151
- // Merge conversations + events, deduplicate, and re-sort by recency
152
- const seenIds = new Set();
153
- const episodic = [];
154
- for (const ep of [...conversations, ...events]) {
155
- if (!seenIds.has(ep.id)) {
156
- seenIds.add(ep.id);
157
- episodic.push(ep);
158
- }
159
- }
160
- episodic.sort((a, b) => b.timestamp - a.timestamp);
161
- episodic.splice(episodicLimit);
162
- return { episodic, semantic, reflections };
163
- }
164
85
  /** Format a single episode into a display line. */
165
86
  function formatEpisodeLine(ep) {
166
87
  const v = ep.emotionSnapshot;