@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,274 @@
1
+ // INFO: @F001 Domain class wrapping village API — see plan step 3
2
+ import { unwrap } from './client';
3
+ import { WorldPersona } from './world-persona';
4
+ // ---------------------------------------------------------------------------
5
+ // Internal helpers (not exported)
6
+ // ---------------------------------------------------------------------------
7
+ function toApiAppraisal(v) {
8
+ return {
9
+ goal_relevance: v.goalRelevance,
10
+ goal_congruence: v.goalCongruence,
11
+ expectedness: v.expectedness,
12
+ controllability: v.controllability,
13
+ agency: v.agency,
14
+ norm_compatibility: v.normCompatibility,
15
+ internal_standards: v.internalStandards,
16
+ adjustment_potential: v.adjustmentPotential,
17
+ urgency: v.urgency,
18
+ };
19
+ }
20
+ function fromApiAppraisal(raw) {
21
+ return {
22
+ goalRelevance: raw.goal_relevance,
23
+ goalCongruence: raw.goal_congruence,
24
+ expectedness: raw.expectedness,
25
+ controllability: raw.controllability,
26
+ agency: raw.agency,
27
+ normCompatibility: raw.norm_compatibility,
28
+ internalStandards: raw.internal_standards,
29
+ adjustmentPotential: raw.adjustment_potential,
30
+ urgency: raw.urgency,
31
+ };
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ // Village class
35
+ // ---------------------------------------------------------------------------
36
+ /**
37
+ * Represents a village and exposes domain methods for personas, actions,
38
+ * relationships, interactions, and events.
39
+ *
40
+ * Instances are obtained via {@link World.createVillage} or {@link World.getVillage}.
41
+ */
42
+ export class Village {
43
+ /** @internal — use World.createVillage / World.getVillage instead. */
44
+ constructor(client, data) {
45
+ this._client = client;
46
+ this._data = { ...data };
47
+ }
48
+ // -- Getters --------------------------------------------------------------
49
+ get id() {
50
+ return this._data.id;
51
+ }
52
+ get name() {
53
+ return this._data.name;
54
+ }
55
+ get description() {
56
+ return this._data.description;
57
+ }
58
+ get accessPolicy() {
59
+ return this._data.accessPolicy;
60
+ }
61
+ get responseRule() {
62
+ return this._data.responseRule;
63
+ }
64
+ /** Returns a readonly snapshot of the village data. */
65
+ get data() {
66
+ return this._data;
67
+ }
68
+ // -- Village CRUD ---------------------------------------------------------
69
+ /**
70
+ * Update village properties. Applies an optimistic local update on success.
71
+ */
72
+ async update(options) {
73
+ await this._client.PATCH('/villages/{id}', {
74
+ params: { path: { id: this.id } },
75
+ body: {
76
+ name: options.name,
77
+ description: options.description,
78
+ access_policy: options.accessPolicy,
79
+ response_rule: options.responseRule,
80
+ },
81
+ });
82
+ // Optimistic local update
83
+ if (options.name !== undefined)
84
+ this._data.name = options.name;
85
+ if (options.description !== undefined)
86
+ this._data.description = options.description;
87
+ if (options.accessPolicy !== undefined)
88
+ this._data.accessPolicy = options.accessPolicy;
89
+ if (options.responseRule !== undefined)
90
+ this._data.responseRule = options.responseRule;
91
+ }
92
+ /** Soft-delete this village. */
93
+ async delete() {
94
+ await this._client.DELETE('/villages/{id}', {
95
+ params: { path: { id: this.id } },
96
+ });
97
+ }
98
+ async addPersona(input) {
99
+ let body;
100
+ // MolrooPersona instance — reference mode
101
+ if (typeof input.id === 'string' && typeof input.chat === 'function') {
102
+ const persona = input;
103
+ body = { persona_id: persona.id };
104
+ }
105
+ else {
106
+ const opts = input;
107
+ if ('personaId' in opts) {
108
+ // Reference mode via options
109
+ body = {
110
+ persona_id: opts.personaId,
111
+ persona_config_id: opts.configId,
112
+ display_name: opts.displayName,
113
+ };
114
+ }
115
+ else {
116
+ // Inline mode
117
+ body = {
118
+ persona_config_id: opts.configId,
119
+ display_name: opts.displayName,
120
+ config: opts.config,
121
+ };
122
+ }
123
+ }
124
+ const { data } = await this._client.POST('/villages/{id}/personas', {
125
+ params: { path: { id: this.id } },
126
+ body: body,
127
+ });
128
+ const raw = unwrap(data);
129
+ return {
130
+ id: raw.id,
131
+ personaConfigId: raw.persona_config_id,
132
+ createdAt: raw.created_at,
133
+ };
134
+ }
135
+ /** List all personas in this village. */
136
+ async listPersonas() {
137
+ const { data } = await this._client.GET('/villages/{id}/personas', {
138
+ params: { path: { id: this.id } },
139
+ });
140
+ const raw = unwrap(data);
141
+ return raw.personas ?? [];
142
+ }
143
+ /** Get a single persona by ID. */
144
+ async getPersona(personaId) {
145
+ const { data } = await this._client.GET('/villages/{id}/personas/{pid}', {
146
+ params: { path: { id: this.id, pid: personaId } },
147
+ });
148
+ return unwrap(data);
149
+ }
150
+ /** Remove a persona from this village. */
151
+ async removePersona(personaId) {
152
+ await this._client.DELETE('/villages/{id}/personas/{pid}', {
153
+ params: { path: { id: this.id, pid: personaId } },
154
+ });
155
+ }
156
+ // -- Persona handle -------------------------------------------------------
157
+ /**
158
+ * Get a persona handle for LLM-powered interactions.
159
+ *
160
+ * The returned {@link WorldPersona} provides Persona-SDK-like DX
161
+ * (getState, getPromptContext, react) backed by the World API.
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * const mina = village.persona('mina', { llm: adapter });
166
+ * const r = await mina.react('flirt', {
167
+ * actor: 'yongjun',
168
+ * prompt: '거실에서 용준이 민아에게 윙크했다.',
169
+ * });
170
+ * ```
171
+ */
172
+ persona(personaId, options) {
173
+ return new WorldPersona(this._client, this.id, personaId, options);
174
+ }
175
+ // -- Actions --------------------------------------------------------------
176
+ /** Create a custom action in this village. */
177
+ async createAction(options) {
178
+ const { data } = await this._client.POST('/villages/{id}/actions', {
179
+ params: { path: { id: this.id } },
180
+ body: {
181
+ name: options.name,
182
+ description: options.description,
183
+ appraisal_vector: toApiAppraisal(options.appraisalVector),
184
+ },
185
+ });
186
+ const raw = unwrap(data);
187
+ return { id: raw.id, name: raw.name };
188
+ }
189
+ /** List all actions (defaults + custom) in this village. */
190
+ async listActions() {
191
+ const { data } = await this._client.GET('/villages/{id}/actions', {
192
+ params: { path: { id: this.id } },
193
+ });
194
+ const raw = unwrap(data);
195
+ return (raw.actions ?? []).map((a) => ({
196
+ name: a.name,
197
+ description: a.description,
198
+ appraisalVector: fromApiAppraisal(a.appraisal_vector),
199
+ isDefault: a.is_default,
200
+ }));
201
+ }
202
+ /** Delete a custom action from this village. */
203
+ async deleteAction(actionId) {
204
+ await this._client.DELETE('/villages/{id}/actions/{aid}', {
205
+ params: { path: { id: this.id, aid: actionId } },
206
+ });
207
+ }
208
+ // -- Relationships --------------------------------------------------------
209
+ /** Set (upsert) a relationship in this village. */
210
+ async setRelationship(options) {
211
+ await this._client.PUT('/villages/{id}/relationships', {
212
+ params: { path: { id: this.id } },
213
+ body: {
214
+ source_type: options.source.type,
215
+ source_id: options.source.id,
216
+ target_type: options.target.type,
217
+ target_id: options.target.id,
218
+ relationship_type: options.relationshipType,
219
+ description: options.description,
220
+ strength: options.strength,
221
+ trust: options.trust,
222
+ },
223
+ });
224
+ }
225
+ /** List all relationships in this village. */
226
+ async listRelationships() {
227
+ const { data } = await this._client.GET('/villages/{id}/relationships', {
228
+ params: { path: { id: this.id } },
229
+ });
230
+ const raw = unwrap(data);
231
+ return raw.relationships ?? [];
232
+ }
233
+ /** Delete a relationship by ID. */
234
+ async deleteRelationship(relationshipId) {
235
+ await this._client.DELETE('/villages/{id}/relationships/{rid}', {
236
+ params: { path: { id: this.id, rid: relationshipId } },
237
+ });
238
+ }
239
+ // -- Interaction ----------------------------------------------------------
240
+ /** Execute an interaction in this village. */
241
+ async interact(options) {
242
+ const { data } = await this._client.POST('/villages/{id}/interact', {
243
+ params: { path: { id: this.id } },
244
+ body: {
245
+ target_persona_id: options.target,
246
+ action_name: options.action,
247
+ action_label: options.actionLabel,
248
+ stimulus_description: options.stimulusDescription,
249
+ appraisal_vector: options.appraisal ? toApiAppraisal(options.appraisal) : undefined,
250
+ actor_id: options.actor,
251
+ actor_type: options.actorType,
252
+ },
253
+ });
254
+ return unwrap(data);
255
+ }
256
+ // -- Events ---------------------------------------------------------------
257
+ /** Retrieve the event log for this village. */
258
+ async getEvents(options) {
259
+ const { data } = await this._client.GET('/villages/{id}/events', {
260
+ params: {
261
+ path: { id: this.id },
262
+ query: {
263
+ limit: options?.limit?.toString(),
264
+ cursor: options?.cursor,
265
+ },
266
+ },
267
+ });
268
+ const raw = unwrap(data);
269
+ return {
270
+ events: raw.events ?? [],
271
+ nextCursor: raw.nextCursor ?? null,
272
+ };
273
+ }
274
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * WorldPersona — a persona handle within a village.
3
+ *
4
+ * "누가 말하는가? 페르소나가 말한다."
5
+ *
6
+ * World SDK는 LLM을 모른다. 다만 LLM을 아는 페르소나를 꺼내줄 수 있다.
7
+ * WorldPersona는 Persona SDK와 동일한 DX(getState, getPromptContext, react)를
8
+ * 제공하되, 내부적으로 World API 엔드포인트를 사용한다.
9
+ */
10
+ import { type ApiClient } from './client';
11
+ import type { AppraisalVector } from './types';
12
+ import type { LLMAdapter } from '../llm/adapter';
13
+ export type LLMMessage = {
14
+ role: 'user' | 'assistant' | 'system';
15
+ content: string;
16
+ };
17
+ /**
18
+ * @deprecated Use LLMAdapter instead
19
+ */
20
+ export type WorldLLM = LLMAdapter;
21
+ export interface PersonaEmotion {
22
+ vad: {
23
+ V: number;
24
+ A: number;
25
+ D: number;
26
+ };
27
+ discrete?: {
28
+ primary: string;
29
+ secondary?: string;
30
+ intensity: number;
31
+ };
32
+ delta?: {
33
+ V: number;
34
+ A: number;
35
+ D: number;
36
+ };
37
+ }
38
+ export interface PersonaState {
39
+ emotion: PersonaEmotion;
40
+ mood?: {
41
+ vad: {
42
+ V: number;
43
+ A: number;
44
+ D: number;
45
+ };
46
+ };
47
+ somatic?: string[];
48
+ }
49
+ export interface PromptContext {
50
+ systemPrompt: string;
51
+ promptContext: Record<string, string>;
52
+ }
53
+ export interface PersonaDetail {
54
+ id: string;
55
+ personaConfigId: string;
56
+ displayName: string;
57
+ config: {
58
+ personality?: Record<string, number>;
59
+ identity?: {
60
+ name?: string;
61
+ role?: string;
62
+ speakingStyle?: string;
63
+ description?: string;
64
+ extensions?: Record<string, string>;
65
+ [key: string]: unknown;
66
+ };
67
+ goals?: unknown[];
68
+ [key: string]: unknown;
69
+ };
70
+ state: PersonaState | null;
71
+ }
72
+ export interface ReactOptions {
73
+ /** Who is performing the action (e.g. 'yongjun'). */
74
+ actor?: string;
75
+ actorType?: 'user' | 'persona';
76
+ /** User message to send to the LLM after the system prompt. */
77
+ prompt: string;
78
+ /** Prior conversation turns for context. */
79
+ history?: LLMMessage[];
80
+ /** Zod schema for structured output. Omit for plain text. */
81
+ schema?: unknown;
82
+ temperature?: number;
83
+ }
84
+ export interface ReactResult<T = string> {
85
+ /** Updated emotion state after interaction. */
86
+ emotion: PersonaEmotion;
87
+ mood?: {
88
+ vad: {
89
+ V: number;
90
+ A: number;
91
+ D: number;
92
+ };
93
+ };
94
+ somatic?: string[];
95
+ /** LLM-generated narrative — typed T if schema provided, string otherwise. */
96
+ narrative: T;
97
+ }
98
+ export interface WorldPersonaOptions {
99
+ llm?: LLMAdapter;
100
+ }
101
+ export declare class WorldPersona {
102
+ private readonly _client;
103
+ private readonly _villageId;
104
+ private readonly _personaId;
105
+ private readonly _llm?;
106
+ /** Cached persona detail (config + state). Invalidated on interact(). */
107
+ private _detailCache;
108
+ /** @internal — use Village.persona() instead. */
109
+ constructor(client: ApiClient, villageId: string, personaId: string, options?: WorldPersonaOptions);
110
+ get id(): string;
111
+ /** Fetch full persona detail (config + state). Cached per-instance. */
112
+ getDetail(): Promise<PersonaDetail>;
113
+ /** Get current emotion/mood/somatic state. */
114
+ getState(): Promise<PersonaState>;
115
+ /** Get speaking style from persona config (identity.speakingStyle). */
116
+ getSpeakingStyle(): Promise<string | undefined>;
117
+ /** Get LLM system prompt assembled from all persona subsystems + world context. */
118
+ getPromptContext(sourceEntity?: string): Promise<PromptContext>;
119
+ /**
120
+ * Send a predefined action to this persona's emotion engine.
121
+ * Invalidates cached state.
122
+ */
123
+ interact(action: string, options?: {
124
+ actor?: string;
125
+ actorType?: 'user' | 'persona';
126
+ appraisal?: AppraisalVector;
127
+ stimulusDescription?: string;
128
+ }): Promise<{
129
+ emotion: PersonaEmotion;
130
+ mood?: {
131
+ vad: {
132
+ V: number;
133
+ A: number;
134
+ D: number;
135
+ };
136
+ };
137
+ somatic?: string[];
138
+ }>;
139
+ /**
140
+ * Advance persona simulation time by the specified number of seconds.
141
+ * Triggers idle decay (emotion → baseline), body budget recovery,
142
+ * SDT need regression, and TMT timeline advancement.
143
+ *
144
+ * @param seconds - Number of seconds to advance (must be ≥ 1).
145
+ * @returns Any pending internal events generated by threshold checks.
146
+ */
147
+ tick(seconds: number): Promise<{
148
+ pendingEvents?: unknown[];
149
+ }>;
150
+ /**
151
+ * Combined flow: interact (emotion) → getPromptContext → LLM → narrative.
152
+ *
153
+ * This is the World equivalent of Persona SDK's `chat()`.
154
+ * The persona speaks — the world just provides context.
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * const mina = village.persona('mina', { llm: adapter });
159
+ *
160
+ * // Plain text reaction
161
+ * const r1 = await mina.react('flirt', {
162
+ * actor: 'yongjun',
163
+ * prompt: '거실에서 용준이 민아에게 윙크했다.',
164
+ * });
165
+ * console.log(r1.narrative); // string
166
+ *
167
+ * // Structured reaction
168
+ * const r2 = await mina.react('flirt', {
169
+ * actor: 'yongjun',
170
+ * prompt: '거실에서 용준이 민아에게 윙크했다.',
171
+ * schema: z.object({
172
+ * action: z.string(),
173
+ * dialogue: z.string(),
174
+ * innerThought: z.string(),
175
+ * }),
176
+ * });
177
+ * console.log(r2.narrative.dialogue); // typed
178
+ * ```
179
+ */
180
+ react<T = string>(action: string, options: ReactOptions): Promise<ReactResult<T>>;
181
+ }
182
+ //# sourceMappingURL=world-persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-persona.d.ts","sourceRoot":"","sources":["../../../src/world/world-persona.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * WorldPersona — a persona handle within a village.
3
+ *
4
+ * "누가 말하는가? 페르소나가 말한다."
5
+ *
6
+ * World SDK는 LLM을 모른다. 다만 LLM을 아는 페르소나를 꺼내줄 수 있다.
7
+ * WorldPersona는 Persona SDK와 동일한 DX(getState, getPromptContext, react)를
8
+ * 제공하되, 내부적으로 World API 엔드포인트를 사용한다.
9
+ */
10
+ import { unwrap } from './client';
11
+ // ---------------------------------------------------------------------------
12
+ // Internal helpers
13
+ // ---------------------------------------------------------------------------
14
+ function toApiAppraisal(v) {
15
+ return {
16
+ goal_relevance: v.goalRelevance,
17
+ goal_congruence: v.goalCongruence,
18
+ expectedness: v.expectedness,
19
+ controllability: v.controllability,
20
+ agency: v.agency,
21
+ norm_compatibility: v.normCompatibility,
22
+ internal_standards: v.internalStandards,
23
+ adjustment_potential: v.adjustmentPotential,
24
+ urgency: v.urgency,
25
+ };
26
+ }
27
+ export class WorldPersona {
28
+ /** @internal — use Village.persona() instead. */
29
+ constructor(client, villageId, personaId, options) {
30
+ /** Cached persona detail (config + state). Invalidated on interact(). */
31
+ this._detailCache = null;
32
+ this._client = client;
33
+ this._villageId = villageId;
34
+ this._personaId = personaId;
35
+ this._llm = options?.llm;
36
+ }
37
+ get id() {
38
+ return this._personaId;
39
+ }
40
+ // -- State queries --------------------------------------------------------
41
+ /** Fetch full persona detail (config + state). Cached per-instance. */
42
+ async getDetail() {
43
+ if (this._detailCache)
44
+ return this._detailCache;
45
+ const { data } = await this._client.GET('/villages/{id}/personas/{pid}', {
46
+ params: { path: { id: this._villageId, pid: this._personaId } },
47
+ });
48
+ const raw = unwrap(data);
49
+ const config = typeof raw.config === 'string' ? JSON.parse(raw.config) : raw.config;
50
+ this._detailCache = {
51
+ id: raw.id,
52
+ personaConfigId: raw.persona_config_id,
53
+ displayName: raw.display_name,
54
+ config,
55
+ state: raw.state,
56
+ };
57
+ return this._detailCache;
58
+ }
59
+ /** Get current emotion/mood/somatic state. */
60
+ async getState() {
61
+ const detail = await this.getDetail();
62
+ return detail.state ?? { emotion: { vad: { V: 0, A: 0.5, D: 0 } } };
63
+ }
64
+ /** Get speaking style from persona config (identity.speakingStyle). */
65
+ async getSpeakingStyle() {
66
+ const detail = await this.getDetail();
67
+ return detail.config?.identity?.speakingStyle;
68
+ }
69
+ /** Get LLM system prompt assembled from all persona subsystems + world context. */
70
+ async getPromptContext(sourceEntity) {
71
+ const { data } = await this._client.POST('/villages/{id}/personas/{pid}/prompt-context', {
72
+ params: { path: { id: this._villageId, pid: this._personaId } },
73
+ body: sourceEntity ? { sourceEntity } : {},
74
+ });
75
+ return unwrap(data);
76
+ }
77
+ // -- Interaction ----------------------------------------------------------
78
+ /**
79
+ * Send a predefined action to this persona's emotion engine.
80
+ * Invalidates cached state.
81
+ */
82
+ async interact(action, options) {
83
+ this._detailCache = null; // invalidate
84
+ const { data } = await this._client.POST('/villages/{id}/interact', {
85
+ params: { path: { id: this._villageId } },
86
+ body: {
87
+ target_persona_id: this._personaId,
88
+ action_name: action || undefined,
89
+ action_label: action || undefined,
90
+ stimulus_description: options?.stimulusDescription,
91
+ appraisal_vector: options?.appraisal ? toApiAppraisal(options.appraisal) : undefined,
92
+ actor_id: options?.actor,
93
+ actor_type: options?.actorType,
94
+ },
95
+ });
96
+ const raw = unwrap(data);
97
+ return raw;
98
+ }
99
+ // -- Tick -----------------------------------------------------------------
100
+ /**
101
+ * Advance persona simulation time by the specified number of seconds.
102
+ * Triggers idle decay (emotion → baseline), body budget recovery,
103
+ * SDT need regression, and TMT timeline advancement.
104
+ *
105
+ * @param seconds - Number of seconds to advance (must be ≥ 1).
106
+ * @returns Any pending internal events generated by threshold checks.
107
+ */
108
+ async tick(seconds) {
109
+ this._detailCache = null; // invalidate — state changes after tick
110
+ const { data } = await this._client.POST('/villages/{id}/personas/{pid}/tick', {
111
+ params: { path: { id: this._villageId, pid: this._personaId } },
112
+ body: { seconds },
113
+ });
114
+ return unwrap(data);
115
+ }
116
+ // -- LLM-powered reaction -------------------------------------------------
117
+ /**
118
+ * Combined flow: interact (emotion) → getPromptContext → LLM → narrative.
119
+ *
120
+ * This is the World equivalent of Persona SDK's `chat()`.
121
+ * The persona speaks — the world just provides context.
122
+ *
123
+ * @example
124
+ * ```typescript
125
+ * const mina = village.persona('mina', { llm: adapter });
126
+ *
127
+ * // Plain text reaction
128
+ * const r1 = await mina.react('flirt', {
129
+ * actor: 'yongjun',
130
+ * prompt: '거실에서 용준이 민아에게 윙크했다.',
131
+ * });
132
+ * console.log(r1.narrative); // string
133
+ *
134
+ * // Structured reaction
135
+ * const r2 = await mina.react('flirt', {
136
+ * actor: 'yongjun',
137
+ * prompt: '거실에서 용준이 민아에게 윙크했다.',
138
+ * schema: z.object({
139
+ * action: z.string(),
140
+ * dialogue: z.string(),
141
+ * innerThought: z.string(),
142
+ * }),
143
+ * });
144
+ * console.log(r2.narrative.dialogue); // typed
145
+ * ```
146
+ */
147
+ async react(action, options) {
148
+ if (!this._llm) {
149
+ throw new Error('WorldPersona.react() requires an LLM adapter. Pass { llm } to village.persona().');
150
+ }
151
+ // 1. Interact — emotion engine processes the action
152
+ const interactResult = await this.interact(action, {
153
+ actor: options.actor,
154
+ actorType: options.actorType,
155
+ });
156
+ // 2. Get prompt context — now reflects updated emotion
157
+ const ctx = await this.getPromptContext(options.actor);
158
+ // 3. LLM generates narrative
159
+ const messages = [
160
+ ...(options.history ?? []),
161
+ { role: 'user', content: options.prompt },
162
+ ];
163
+ let narrative;
164
+ if (options.schema) {
165
+ const result = await this._llm.generateObject({
166
+ system: ctx.systemPrompt,
167
+ messages,
168
+ schema: options.schema,
169
+ temperature: options.temperature,
170
+ });
171
+ narrative = result.object;
172
+ }
173
+ else {
174
+ const result = await this._llm.generateText({
175
+ system: ctx.systemPrompt,
176
+ messages,
177
+ temperature: options.temperature,
178
+ });
179
+ narrative = result.text;
180
+ }
181
+ return {
182
+ emotion: interactResult.emotion,
183
+ mood: interactResult.mood,
184
+ somatic: interactResult.somatic,
185
+ narrative,
186
+ };
187
+ }
188
+ }
@@ -0,0 +1,41 @@
1
+ import { type ApiClient } from './client';
2
+ import { Village } from './village';
3
+ import type { VillageData, CreateVillageOptions, PaginationOptions } from './types';
4
+ export interface WorldOptions {
5
+ apiKey: string;
6
+ baseUrl?: string;
7
+ }
8
+ /**
9
+ * Entry point for the World SDK.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { World } from '@molroo-io/sdk';
14
+ *
15
+ * const world = new World({ apiKey: 'mk_live_...' });
16
+ * const village = await world.createVillage({ name: 'My Village' });
17
+ * const result = await village.interact({ target: 'sera', action: 'greet' });
18
+ * ```
19
+ */
20
+ export declare class World {
21
+ /** @internal — exposed for advanced use only. */
22
+ readonly _client: ApiClient;
23
+ constructor(options: WorldOptions);
24
+ /**
25
+ * Create a new village and return a {@link Village} instance.
26
+ */
27
+ createVillage(options: CreateVillageOptions): Promise<Village>;
28
+ /**
29
+ * Fetch an existing village by ID and return a {@link Village} instance.
30
+ */
31
+ getVillage(id: string): Promise<Village>;
32
+ /**
33
+ * List villages. Returns raw data objects (not Village instances) for
34
+ * efficiency when only metadata is needed.
35
+ */
36
+ listVillages(options?: PaginationOptions): Promise<{
37
+ villages: VillageData[];
38
+ nextCursor: string | null;
39
+ }>;
40
+ }
41
+ //# sourceMappingURL=world.d.ts.map