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