@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,69 @@
1
+ import { z } from 'zod';
2
+ /** Clamp a number to [lo, hi]. */
3
+ const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
4
+ /**
5
+ * AppraisalVector Schema — Scherer CPM 9-dimensional emotion appraisal.
6
+ * LLM evaluates user input from persona's perspective.
7
+ *
8
+ * Each field accepts any number from LLM output, then clamps to the valid
9
+ * range via .transform(). This tolerates LLM outputs outside the intended
10
+ * range (e.g. -3.0) without failing Zod parsing.
11
+ */
12
+ export const AppraisalVectorSchema = z.object({
13
+ goal_relevance: z
14
+ .number()
15
+ .describe("How relevant is this message to the persona's goals, including relational goals (caring about the speaker)? -1: completely irrelevant, 0: slightly relevant, 1: central to goals. Casual greetings: 0~0.2")
16
+ .transform((v) => clamp(v, -1, 1)),
17
+ goal_congruence: z
18
+ .number()
19
+ .describe("Does this event help or hinder the persona's goals? -1: harmful/threatening, 0: neutral, 1: helpful. User's suffering → negative (through relational concern). Insults → negative.")
20
+ .transform((v) => clamp(v, -1, 1)),
21
+ expectedness: z
22
+ .number()
23
+ .describe('How predictable was this event? 0: shocking/impossible, 0.5: normal, 1: routine. First meeting: ~0.5. Use 0-1 range.')
24
+ .transform((v) => clamp(v, 0, 1)),
25
+ controllability: z
26
+ .number()
27
+ .describe('Can the persona influence or respond to this situation? 0: helpless, 0.5: can comfort/support, 1: can directly resolve. For other-events: rate how much the persona can help, not whether the situation was avoidable. Use 0-1 range.')
28
+ .transform((v) => clamp(v, 0, 1)),
29
+ agency: z
30
+ .number()
31
+ .describe('Who caused the situation being discussed? -1: fate/accident, 0: shared/ambiguous, 1: deliberate by speaker. For other-events (user sharing their experience): rate the cause of what happened to them.')
32
+ .transform((v) => clamp(v, -1, 1)),
33
+ norm_compatibility: z
34
+ .number()
35
+ .describe("Does the described situation align with the persona's values and social norms? -1: serious violation (cruelty/injustice/insult), 0: neutral, 1: kind/virtuous. Evaluate the situation content, not the act of sharing it.")
36
+ .transform((v) => clamp(v, -1, 1)),
37
+ internal_standards: z
38
+ .number()
39
+ .describe("Does this situation involve violating or upholding the persona's own standards/values? -1: serious self-standard violation (shame, guilt), 0: not self-relevant, 1: lived up to own ideals (pride). Rate from the persona's self-evaluation perspective.")
40
+ .transform((v) => clamp(v, -1, 1)),
41
+ adjustment_potential: z
42
+ .number()
43
+ .describe('Can the persona (or the person involved) cope with or adapt to this situation? 0: devastating/no way to cope, 0.5: moderate coping, 1: fully adaptable/accepted. For loss/grief: high (accepted). For active threat: low. Use 0-1 range.')
44
+ .transform((v) => clamp(v, 0, 1)),
45
+ urgency: z
46
+ .number()
47
+ .describe('How much time pressure or immediate action is needed? 0: settled/past event/no rush, 0.5: moderate, 1: immediate action required/acute emergency. For past losses: low. For active threats: high. Use 0-1 range.')
48
+ .transform((v) => clamp(v, 0, 1)),
49
+ });
50
+ /**
51
+ * Full LLM response schema — response text + appraisal vector.
52
+ */
53
+ export const LLMResponseSchema = z.object({
54
+ response: z.string().describe('Response message from persona to user'),
55
+ appraisal: AppraisalVectorSchema.describe("Scherer 9-dimensional emotion appraisal of user input from persona's perspective"),
56
+ });
57
+ /**
58
+ * Tool-use aware LLM response schema.
59
+ * The LLM can either produce a normal response or request a memory search.
60
+ * When search_memory is set, the SDK executes the search and re-invokes the LLM.
61
+ */
62
+ export const LLMResponseWithToolsSchema = z.object({
63
+ response: z.string().describe('Response message from persona to user. Set to empty string "" if you need to search memory first.'),
64
+ appraisal: AppraisalVectorSchema.describe("Scherer 9-dimensional emotion appraisal of user input from persona's perspective"),
65
+ search_memory: z
66
+ .string()
67
+ .optional()
68
+ .describe('If you need to recall a specific memory before responding, set this to your search query. Leave empty/omit when you can respond without searching.'),
69
+ });
@@ -0,0 +1,24 @@
1
+ export interface LLMPrompt {
2
+ system: string;
3
+ context?: string;
4
+ instruction?: string;
5
+ history?: ChatMessage[];
6
+ }
7
+ export interface ChatMessage {
8
+ role: 'user' | 'assistant' | 'system';
9
+ content: string;
10
+ }
11
+ export interface LLMResponse {
12
+ text: string;
13
+ response?: string;
14
+ appraisal?: AppraisalVector;
15
+ }
16
+ export interface AppraisalVector {
17
+ goal_relevance: number;
18
+ goal_congruence: number;
19
+ expectedness: number;
20
+ controllability: number;
21
+ agency: number;
22
+ norm_compatibility: number;
23
+ }
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/llm/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { LLMAdapter, GenerateTextOptions, GenerateObjectOptions } from '../adapter';
2
+ import type { VercelAIConfig } from './config';
3
+ /**
4
+ * Vercel AI SDK adapter for molroo.
5
+ * Supports OpenAI, Anthropic, Vertex AI, and OpenRouter providers.
6
+ */
7
+ export declare class VercelAIAdapter implements LLMAdapter {
8
+ private config;
9
+ 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
+ generateText(options: GenerateTextOptions): Promise<{
18
+ text: string;
19
+ }>;
20
+ generateObject<T>(options: GenerateObjectOptions<T>): Promise<{
21
+ object: T;
22
+ }>;
23
+ private getDefaultModel;
24
+ }
25
+ /**
26
+ * Factory function to create a VercelAIAdapter instance.
27
+ */
28
+ export declare function createVercelAIAdapter(config: VercelAIConfig): VercelAIAdapter;
29
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,196 @@
1
+ import { generateText as generateTextAI, generateObject, jsonSchema } from 'ai';
2
+ /**
3
+ * Sanitize a plain JSON Schema for OpenAI strict structured output.
4
+ * - Adds `additionalProperties: false` to all object types
5
+ * - Strips unsupported keywords (minimum, maximum, default, pattern, etc.)
6
+ */
7
+ const ALLOWED_KEYS = new Set([
8
+ 'type', 'description', 'enum', 'const', 'anyOf', 'oneOf',
9
+ 'properties', 'required', 'additionalProperties',
10
+ 'items',
11
+ ]);
12
+ function strictifySchema(schema) {
13
+ if (!schema || typeof schema !== 'object')
14
+ return schema;
15
+ const result = {};
16
+ for (const key of Object.keys(schema)) {
17
+ if (ALLOWED_KEYS.has(key)) {
18
+ result[key] = schema[key];
19
+ }
20
+ }
21
+ if (result.type === 'object') {
22
+ result.additionalProperties = false;
23
+ if (result.properties) {
24
+ result.properties = Object.fromEntries(Object.entries(result.properties).map(([k, v]) => [k, strictifySchema(v)]));
25
+ }
26
+ }
27
+ if (result.items) {
28
+ result.items = strictifySchema(result.items);
29
+ }
30
+ if (result.anyOf) {
31
+ result.anyOf = result.anyOf.map(strictifySchema);
32
+ }
33
+ if (result.oneOf) {
34
+ result.oneOf = result.oneOf.map(strictifySchema);
35
+ }
36
+ return result;
37
+ }
38
+ /** Check if a value is a Zod schema (has _def property). */
39
+ function isZodSchema(schema) {
40
+ return schema && typeof schema === 'object' && '_def' in schema;
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
+ /**
93
+ * Vercel AI SDK adapter for molroo.
94
+ * Supports OpenAI, Anthropic, Vertex AI, and OpenRouter providers.
95
+ */
96
+ export class VercelAIAdapter {
97
+ 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);
146
+ }
147
+ async generateText(options) {
148
+ const modelName = this.config.model || this.getDefaultModel();
149
+ const model = await this.getModel(modelName);
150
+ const result = await generateTextAI({
151
+ model,
152
+ system: options.system,
153
+ messages: options.messages,
154
+ ...(options.temperature !== undefined && { temperature: options.temperature }),
155
+ ...(options.maxTokens !== undefined && { maxTokens: options.maxTokens }),
156
+ });
157
+ return { text: result.text };
158
+ }
159
+ async generateObject(options) {
160
+ const modelName = this.config.model || this.getDefaultModel();
161
+ const model = await this.getModel(modelName);
162
+ // Zod schemas can be passed directly to AI SDK.
163
+ // Plain JSON schemas need strictification for OpenAI compatibility.
164
+ const resolvedSchema = isZodSchema(options.schema)
165
+ ? options.schema
166
+ : 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
+ const result = await generateObject({
172
+ model,
173
+ schema: resolvedSchema,
174
+ system: options.system,
175
+ messages: options.messages,
176
+ ...(isProxied && { mode: 'tool' }),
177
+ ...(options.temperature !== undefined && { temperature: options.temperature }),
178
+ });
179
+ return { object: result.object };
180
+ }
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
+ }
191
+ /**
192
+ * Factory function to create a VercelAIAdapter instance.
193
+ */
194
+ export function createVercelAIAdapter(config) {
195
+ return new VercelAIAdapter(config);
196
+ }
@@ -0,0 +1,9 @@
1
+ export interface VercelAIConfig {
2
+ provider: 'openai' | 'anthropic' | 'vertex' | 'openrouter';
3
+ apiKey: string;
4
+ model?: string;
5
+ baseUrl?: string;
6
+ projectId?: string;
7
+ location?: string;
8
+ }
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ export { VercelAIAdapter } from './adapter';
2
+ export type { VercelAIConfig } from './config';
3
+ import { VercelAIAdapter } from './adapter';
4
+ import type { VercelAIConfig } from './config';
5
+ /**
6
+ * Create a Vercel AI SDK adapter from config.
7
+ */
8
+ export declare function createVercelAIAdapter(config: VercelAIConfig): VercelAIAdapter;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/llm/vercel-ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAE7E"}
@@ -0,0 +1,8 @@
1
+ export { VercelAIAdapter } from './adapter';
2
+ import { VercelAIAdapter } from './adapter';
3
+ /**
4
+ * Create a Vercel AI SDK adapter from config.
5
+ */
6
+ export function createVercelAIAdapter(config) {
7
+ return new VercelAIAdapter(config);
8
+ }
@@ -0,0 +1,3 @@
1
+ export { CloudflareVectorizeMemory } from './vectorize';
2
+ export type { CloudflareVectorizeMemoryOptions, VectorizeIndex } from './vectorize';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/memory/cloudflare/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,gCAAgC,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { CloudflareVectorizeMemory } from './vectorize';
@@ -0,0 +1,62 @@
1
+ import type { EmbeddingAdapter } from '../types';
2
+ import type { SemanticMemory, SearchOptions, SearchResult } from '../semantic';
3
+ /**
4
+ * Minimal Cloudflare Vectorize binding types.
5
+ * Avoids requiring @cloudflare/workers-types at compile time.
6
+ */
7
+ export interface VectorizeIndex {
8
+ upsert(vectors: VectorizeVector[]): Promise<{
9
+ count: number;
10
+ }>;
11
+ query(vector: number[], options: {
12
+ topK: number;
13
+ returnMetadata?: 'all' | 'indexed' | 'none';
14
+ filter?: Record<string, unknown>;
15
+ }): Promise<{
16
+ matches: VectorizeMatch[];
17
+ }>;
18
+ deleteByIds(ids: string[]): Promise<{
19
+ count: number;
20
+ }>;
21
+ }
22
+ export interface VectorizeVector {
23
+ id: string;
24
+ values: number[];
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ export interface VectorizeMatch {
28
+ id: string;
29
+ score: number;
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ export interface CloudflareVectorizeMemoryOptions {
33
+ /** Cloudflare Vectorize index binding. */
34
+ index: VectorizeIndex;
35
+ /** Embedding provider (embed function + dimension). */
36
+ embedding: EmbeddingAdapter;
37
+ }
38
+ /**
39
+ * Cloudflare Vectorize-backed SemanticMemory.
40
+ *
41
+ * Stores original text in Vectorize metadata (10KB limit per vector,
42
+ * more than enough for chat messages).
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const memory = new CloudflareVectorizeMemory({
47
+ * index: env.VECTORIZE_INDEX,
48
+ * embedding: cloudflareAIEmbedding({ ai: env.AI }),
49
+ * });
50
+ * await memory.store('The user likes coffee', { userId: '123' });
51
+ * const results = await memory.search('beverage preferences');
52
+ * ```
53
+ */
54
+ export declare class CloudflareVectorizeMemory implements SemanticMemory {
55
+ private index;
56
+ private embedding;
57
+ constructor(options: CloudflareVectorizeMemoryOptions);
58
+ store(text: string, metadata?: Record<string, unknown>): Promise<string>;
59
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
60
+ delete(ids: string[]): Promise<void>;
61
+ }
62
+ //# sourceMappingURL=vectorize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectorize.d.ts","sourceRoot":"","sources":["../../../../src/memory/cloudflare/vectorize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,KAAK,CACH,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;QAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GACA,OAAO,CAAC;QAAE,OAAO,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;IAC1C,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,gCAAgC;IAC/C,0CAA0C;IAC1C,KAAK,EAAE,cAAc,CAAC;IACtB,uDAAuD;IACvD,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAC9D,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,SAAS,CAAmB;gBAExB,OAAO,EAAE,gCAAgC;IAK/C,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,MAAM,CAAC;IAOZ,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC;IAqBpB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3C"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Cloudflare Vectorize-backed SemanticMemory.
3
+ *
4
+ * Stores original text in Vectorize metadata (10KB limit per vector,
5
+ * more than enough for chat messages).
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * const memory = new CloudflareVectorizeMemory({
10
+ * index: env.VECTORIZE_INDEX,
11
+ * embedding: cloudflareAIEmbedding({ ai: env.AI }),
12
+ * });
13
+ * await memory.store('The user likes coffee', { userId: '123' });
14
+ * const results = await memory.search('beverage preferences');
15
+ * ```
16
+ */
17
+ export class CloudflareVectorizeMemory {
18
+ constructor(options) {
19
+ this.index = options.index;
20
+ this.embedding = options.embedding;
21
+ }
22
+ async store(text, metadata = {}) {
23
+ const id = crypto.randomUUID();
24
+ const values = await this.embedding.embed(text);
25
+ await this.index.upsert([{ id, values, metadata: { text, ...metadata } }]);
26
+ return id;
27
+ }
28
+ async search(query, options = {}) {
29
+ const topK = options.topK ?? 5;
30
+ const threshold = options.scoreThreshold ?? 0;
31
+ const vector = await this.embedding.embed(query);
32
+ const { matches } = await this.index.query(vector, {
33
+ topK,
34
+ returnMetadata: 'all',
35
+ filter: options.filter,
36
+ });
37
+ return matches
38
+ .filter((m) => m.score >= threshold)
39
+ .map((m) => ({
40
+ id: m.id,
41
+ text: m.metadata?.text ?? '',
42
+ score: m.score,
43
+ metadata: m.metadata ?? {},
44
+ }));
45
+ }
46
+ async delete(ids) {
47
+ if (ids.length > 0) {
48
+ await this.index.deleteByIds(ids);
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,16 @@
1
+ import type { EmbeddingAdapter } from './types';
2
+ import type { SemanticMemory, SearchOptions, SearchResult } from './semantic';
3
+ /**
4
+ * In-memory SemanticMemory for local development and testing.
5
+ * Stores embeddings in a Map and performs brute-force cosine similarity search.
6
+ */
7
+ export declare class InMemorySemanticMemory implements SemanticMemory {
8
+ private embedding;
9
+ private entries;
10
+ private counter;
11
+ constructor(embedding: EmbeddingAdapter);
12
+ store(text: string, metadata?: Record<string, unknown>): Promise<string>;
13
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
14
+ delete(ids: string[]): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=in-memory-semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-semantic.d.ts","sourceRoot":"","sources":["../../../src/memory/in-memory-semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsB9E;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAI/C,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAAK;gBAEA,SAAS,EAAE,gBAAgB;IAEzC,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACrC,OAAO,CAAC,MAAM,CAAC;IAOZ,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC;IAsBpB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3C"}
@@ -0,0 +1,53 @@
1
+ function cosineSimilarity(a, b) {
2
+ let dot = 0;
3
+ let normA = 0;
4
+ let normB = 0;
5
+ for (let i = 0; i < a.length; i++) {
6
+ dot += a[i] * b[i];
7
+ normA += a[i] * a[i];
8
+ normB += b[i] * b[i];
9
+ }
10
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
11
+ return denom === 0 ? 0 : dot / denom;
12
+ }
13
+ /**
14
+ * In-memory SemanticMemory for local development and testing.
15
+ * Stores embeddings in a Map and performs brute-force cosine similarity search.
16
+ */
17
+ export class InMemorySemanticMemory {
18
+ constructor(embedding) {
19
+ this.embedding = embedding;
20
+ this.entries = new Map();
21
+ this.counter = 0;
22
+ }
23
+ async store(text, metadata = {}) {
24
+ const id = `mem_${++this.counter}`;
25
+ const vector = await this.embedding.embed(text);
26
+ this.entries.set(id, { id, text, embedding: vector, metadata });
27
+ return id;
28
+ }
29
+ async search(query, options = {}) {
30
+ const topK = options.topK ?? 5;
31
+ const threshold = options.scoreThreshold ?? 0;
32
+ const queryVec = await this.embedding.embed(query);
33
+ const scored = [];
34
+ for (const entry of this.entries.values()) {
35
+ const score = cosineSimilarity(queryVec, entry.embedding);
36
+ if (score >= threshold) {
37
+ scored.push({
38
+ id: entry.id,
39
+ text: entry.text,
40
+ score,
41
+ metadata: entry.metadata,
42
+ });
43
+ }
44
+ }
45
+ scored.sort((a, b) => b.score - a.score);
46
+ return scored.slice(0, topK);
47
+ }
48
+ async delete(ids) {
49
+ for (const id of ids) {
50
+ this.entries.delete(id);
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,46 @@
1
+ import type { Episode } from '../types';
2
+ import type { EpisodeAdapter, EpisodeQuery, MemoryAdapter, RecallQuery, Reflection } from './types';
3
+ /**
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)
12
+ */
13
+ export declare class InMemoryEpisodeAdapter implements EpisodeAdapter, MemoryAdapter {
14
+ private episodes;
15
+ private reflections;
16
+ 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[]>;
23
+ 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. */
40
+ clear(): void;
41
+ }
42
+ /** @deprecated Use InMemoryEpisodeAdapter */
43
+ export declare const InMemoryEpisodeStore: typeof InMemoryEpisodeAdapter;
44
+ /** @deprecated Use InMemoryEpisodeAdapter */
45
+ export type InMemoryEpisodeStore = InMemoryEpisodeAdapter;
46
+ //# sourceMappingURL=in-memory.d.ts.map
@@ -0,0 +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"}