briyah 1.0.9 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +112 -1
  2. package/data/common/config/markup +1 -0
  3. package/data/common/config/model_prices.json +5153 -3680
  4. package/data/common/config/story_models.json +10 -2
  5. package/data/common/config/story_models_full.json +2 -2
  6. package/data/common/prompts/compact_agent.prompt +16 -0
  7. package/data/common/prompts/narrator/perceive.prompt +30 -28
  8. package/data/common/prompts/story_moderator/moderate.prompt +12 -8
  9. package/{dist → dist-sdk}/server/src/ai/LLM/anthropic.service.js +22 -12
  10. package/{dist → dist-sdk}/server/src/ai/LLM/base-ai.service.d.ts +1 -0
  11. package/{dist → dist-sdk}/server/src/ai/LLM/base-ai.service.js +8 -0
  12. package/{dist → dist-sdk}/server/src/ai/LLM/deepseek.service.d.ts +1 -0
  13. package/{dist → dist-sdk}/server/src/ai/LLM/deepseek.service.js +3 -0
  14. package/{dist → dist-sdk}/server/src/ai/LLM/fal.service.d.ts +1 -0
  15. package/{dist → dist-sdk}/server/src/ai/LLM/fal.service.js +3 -0
  16. package/{dist → dist-sdk}/server/src/ai/LLM/grok.service.d.ts +1 -0
  17. package/{dist → dist-sdk}/server/src/ai/LLM/grok.service.js +3 -0
  18. package/{dist → dist-sdk}/server/src/ai/LLM/together.service.d.ts +1 -0
  19. package/{dist → dist-sdk}/server/src/ai/LLM/together.service.js +3 -0
  20. package/{dist → dist-sdk}/server/src/ai/agent.d.ts +7 -0
  21. package/{dist → dist-sdk}/server/src/ai/agent.js +32 -0
  22. package/dist-sdk/server/src/ai/model_prices.d.ts +3 -0
  23. package/{dist → dist-sdk}/server/src/ai/model_prices.js +19 -1
  24. package/{dist → dist-sdk}/server/src/ai/published-agents.service.js +1 -1
  25. package/{dist → dist-sdk}/server/src/app/stripe.controller.d.ts +3 -0
  26. package/{dist → dist-sdk}/server/src/app/stripe.controller.js +16 -6
  27. package/{dist → dist-sdk}/server/src/app/stripe.service.d.ts +6 -3
  28. package/{dist → dist-sdk}/server/src/app/stripe.service.js +23 -9
  29. package/{dist → dist-sdk}/server/src/app/transaction.service.d.ts +3 -3
  30. package/{dist → dist-sdk}/server/src/app/transaction.service.js +11 -11
  31. package/{dist → dist-sdk}/server/src/app.controller.d.ts +1 -0
  32. package/{dist → dist-sdk}/server/src/app.controller.js +49 -2
  33. package/{dist → dist-sdk}/server/src/app.service.d.ts +6 -2
  34. package/{dist → dist-sdk}/server/src/app.service.js +18 -2
  35. package/{dist → dist-sdk}/server/src/auth/users.service.js +1 -1
  36. package/{dist → dist-sdk}/server/src/config/configuration.service.js +1 -1
  37. package/{dist → dist-sdk}/server/src/room/published-rooms.service.js +1 -1
  38. package/{dist → dist-sdk}/server/src/room/room.js +1 -0
  39. package/{dist → dist-sdk}/server/src/sdk/briyah-config.js +2 -2
  40. package/{dist → dist-sdk}/server/src/sdk/briyah.js +2 -2
  41. package/{dist → dist-sdk}/server/src/sdk/index.d.ts +1 -1
  42. package/{dist → dist-sdk}/server/src/story/story-message.service.d.ts +4 -2
  43. package/{dist → dist-sdk}/server/src/story/story-message.service.js +29 -18
  44. package/{dist → dist-sdk}/server/src/story/story.service.d.ts +1 -1
  45. package/{dist → dist-sdk}/server/src/story/story.service.js +106 -95
  46. package/{dist → dist-sdk}/shared/types/app.types.d.ts +18 -11
  47. package/docs/assets/hierarchy.js +1 -1
  48. package/docs/assets/navigation.js +1 -1
  49. package/docs/assets/search.js +1 -1
  50. package/docs/classes/Agent.html +18 -13
  51. package/docs/classes/Briyah.html +12 -12
  52. package/docs/classes/BriyahConfigService.html +5 -5
  53. package/docs/classes/Room.html +23 -23
  54. package/docs/classes/RoomMessage.html +10 -10
  55. package/docs/enums/MessageAction.html +3 -3
  56. package/docs/hierarchy.html +1 -1
  57. package/docs/index.html +18 -4
  58. package/docs/interfaces/AgentInfo.html +2 -2
  59. package/docs/interfaces/AgentMessagesResponse.html +2 -2
  60. package/docs/interfaces/AppService.html +204 -162
  61. package/docs/interfaces/Artifact.html +3 -3
  62. package/docs/interfaces/ArtifactMetadata.html +2 -2
  63. package/docs/interfaces/AttachDocumentResponse.html +2 -2
  64. package/docs/interfaces/BriyahConfigOptions.html +6 -6
  65. package/docs/interfaces/ChapterInfo.html +2 -2
  66. package/docs/interfaces/Character.html +2 -2
  67. package/docs/interfaces/CreateAgentResponse.html +2 -2
  68. package/docs/interfaces/CreateRoomResponse.html +2 -2
  69. package/docs/interfaces/CreateStoryResponse.html +2 -2
  70. package/docs/interfaces/FileList.html +2 -2
  71. package/docs/interfaces/LoggingOptions.html +5 -5
  72. package/docs/interfaces/Message.html +2 -2
  73. package/docs/interfaces/ModelInfo.html +2 -2
  74. package/docs/interfaces/PreparedPromptResponse.html +2 -2
  75. package/docs/interfaces/ProcessTextResponse.html +2 -2
  76. package/docs/interfaces/PromptFile.html +2 -2
  77. package/docs/interfaces/PromptFileContent.html +2 -2
  78. package/docs/interfaces/PromptFilesResponse.html +2 -2
  79. package/docs/interfaces/PromptFolder.html +2 -2
  80. package/docs/interfaces/PromptFoldersResponse.html +2 -2
  81. package/docs/interfaces/RoomDetails.html +2 -2
  82. package/docs/interfaces/RoomInfo.html +2 -2
  83. package/docs/interfaces/RoomMessagesResponse.html +2 -2
  84. package/docs/interfaces/StoryErrorEvent.html +12 -0
  85. package/docs/interfaces/StoryIdea.html +2 -2
  86. package/docs/interfaces/StoryInfo.html +6 -2
  87. package/docs/interfaces/StoryIntroduceCharacterEvent.html +12 -0
  88. package/docs/interfaces/StoryProgressChapterEvent.html +11 -0
  89. package/docs/interfaces/StoryState.html +5 -5
  90. package/docs/interfaces/StoryStateEvent.html +10 -0
  91. package/docs/interfaces/Transaction.html +10 -0
  92. package/docs/interfaces/TransactionHistoryResponse.html +3 -0
  93. package/docs/modules.html +1 -1
  94. package/docs/types/PromptScope.html +1 -1
  95. package/package.json +8 -8
  96. package/dist/server/src/ai/model_prices.d.ts +0 -1
  97. package/docs/interfaces/StoryMessageUpdate.html +0 -6
  98. package/docs/interfaces/StorySuggestion.html +0 -9
  99. /package/data/common/prompts/character/{compact_story.json → compact_agent.json} +0 -0
  100. /package/data/common/prompts/character/{compact_story.prompt → compact_agent.prompt} +0 -0
  101. /package/data/common/prompts/narrator/{compact_story.json → compact_agent.json} +0 -0
  102. /package/data/common/prompts/narrator/{compact_story.prompt → compact_agent.prompt} +0 -0
  103. /package/{dist → dist-sdk}/server/src/ai/LLM/anthropic.module.d.ts +0 -0
  104. /package/{dist → dist-sdk}/server/src/ai/LLM/anthropic.module.js +0 -0
  105. /package/{dist → dist-sdk}/server/src/ai/LLM/anthropic.service.d.ts +0 -0
  106. /package/{dist → dist-sdk}/server/src/ai/LLM/deepseek.module.d.ts +0 -0
  107. /package/{dist → dist-sdk}/server/src/ai/LLM/deepseek.module.js +0 -0
  108. /package/{dist → dist-sdk}/server/src/ai/LLM/fal.module.d.ts +0 -0
  109. /package/{dist → dist-sdk}/server/src/ai/LLM/fal.module.js +0 -0
  110. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.module.d.ts +0 -0
  111. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.module.js +0 -0
  112. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.service.d.ts +0 -0
  113. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.service.js +0 -0
  114. /package/{dist → dist-sdk}/server/src/ai/LLM/grok.module.d.ts +0 -0
  115. /package/{dist → dist-sdk}/server/src/ai/LLM/grok.module.js +0 -0
  116. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.module.d.ts +0 -0
  117. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.module.js +0 -0
  118. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.service.d.ts +0 -0
  119. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.service.js +0 -0
  120. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.module.d.ts +0 -0
  121. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.module.js +0 -0
  122. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.service.d.ts +0 -0
  123. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.service.js +0 -0
  124. /package/{dist → dist-sdk}/server/src/ai/LLM/together.module.d.ts +0 -0
  125. /package/{dist → dist-sdk}/server/src/ai/LLM/together.module.js +0 -0
  126. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.module.d.ts +0 -0
  127. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.module.js +0 -0
  128. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.service.d.ts +0 -0
  129. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.service.js +0 -0
  130. /package/{dist → dist-sdk}/server/src/ai/agent-config.d.ts +0 -0
  131. /package/{dist → dist-sdk}/server/src/ai/agent-config.js +0 -0
  132. /package/{dist → dist-sdk}/server/src/ai/agent-factory.d.ts +0 -0
  133. /package/{dist → dist-sdk}/server/src/ai/agent-factory.js +0 -0
  134. /package/{dist → dist-sdk}/server/src/ai/agent-message.service.d.ts +0 -0
  135. /package/{dist → dist-sdk}/server/src/ai/agent-message.service.js +0 -0
  136. /package/{dist → dist-sdk}/server/src/ai/agent-store.module.d.ts +0 -0
  137. /package/{dist → dist-sdk}/server/src/ai/agent-store.module.js +0 -0
  138. /package/{dist → dist-sdk}/server/src/ai/agent-store.service.d.ts +0 -0
  139. /package/{dist → dist-sdk}/server/src/ai/agent-store.service.js +0 -0
  140. /package/{dist → dist-sdk}/server/src/ai/ai-factory.module.d.ts +0 -0
  141. /package/{dist → dist-sdk}/server/src/ai/ai-factory.module.js +0 -0
  142. /package/{dist → dist-sdk}/server/src/ai/ai-factory.service.d.ts +0 -0
  143. /package/{dist → dist-sdk}/server/src/ai/ai-factory.service.js +0 -0
  144. /package/{dist → dist-sdk}/server/src/ai/artifact.module.d.ts +0 -0
  145. /package/{dist → dist-sdk}/server/src/ai/artifact.module.js +0 -0
  146. /package/{dist → dist-sdk}/server/src/ai/artifact.service.d.ts +0 -0
  147. /package/{dist → dist-sdk}/server/src/ai/artifact.service.js +0 -0
  148. /package/{dist → dist-sdk}/server/src/ai/attached-file.module.d.ts +0 -0
  149. /package/{dist → dist-sdk}/server/src/ai/attached-file.module.js +0 -0
  150. /package/{dist → dist-sdk}/server/src/ai/attached-file.service.d.ts +0 -0
  151. /package/{dist → dist-sdk}/server/src/ai/attached-file.service.js +0 -0
  152. /package/{dist → dist-sdk}/server/src/ai/published-agents.service.d.ts +0 -0
  153. /package/{dist → dist-sdk}/server/src/app/balance-message.service.d.ts +0 -0
  154. /package/{dist → dist-sdk}/server/src/app/balance-message.service.js +0 -0
  155. /package/{dist → dist-sdk}/server/src/app/balance.module.d.ts +0 -0
  156. /package/{dist → dist-sdk}/server/src/app/balance.module.js +0 -0
  157. /package/{dist → dist-sdk}/server/src/app/balance.service.d.ts +0 -0
  158. /package/{dist → dist-sdk}/server/src/app/balance.service.js +0 -0
  159. /package/{dist → dist-sdk}/server/src/app/stripe.module.d.ts +0 -0
  160. /package/{dist → dist-sdk}/server/src/app/stripe.module.js +0 -0
  161. /package/{dist → dist-sdk}/server/src/app/user-service-factory.d.ts +0 -0
  162. /package/{dist → dist-sdk}/server/src/app/user-service-factory.js +0 -0
  163. /package/{dist → dist-sdk}/server/src/app/user-service-manager.d.ts +0 -0
  164. /package/{dist → dist-sdk}/server/src/app/user-service-manager.js +0 -0
  165. /package/{dist → dist-sdk}/server/src/app.module.d.ts +0 -0
  166. /package/{dist → dist-sdk}/server/src/app.module.js +0 -0
  167. /package/{dist → dist-sdk}/server/src/auth/agent-access.decorator.d.ts +0 -0
  168. /package/{dist → dist-sdk}/server/src/auth/agent-access.decorator.js +0 -0
  169. /package/{dist → dist-sdk}/server/src/auth/auth.controller.d.ts +0 -0
  170. /package/{dist → dist-sdk}/server/src/auth/auth.controller.js +0 -0
  171. /package/{dist → dist-sdk}/server/src/auth/auth.module.d.ts +0 -0
  172. /package/{dist → dist-sdk}/server/src/auth/auth.module.js +0 -0
  173. /package/{dist → dist-sdk}/server/src/auth/auth.service.d.ts +0 -0
  174. /package/{dist → dist-sdk}/server/src/auth/auth.service.js +0 -0
  175. /package/{dist → dist-sdk}/server/src/auth/dto/bot-login.dto.d.ts +0 -0
  176. /package/{dist → dist-sdk}/server/src/auth/dto/bot-login.dto.js +0 -0
  177. /package/{dist → dist-sdk}/server/src/auth/dto/password-reset.dto.d.ts +0 -0
  178. /package/{dist → dist-sdk}/server/src/auth/dto/password-reset.dto.js +0 -0
  179. /package/{dist → dist-sdk}/server/src/auth/dto/phone-login.dto.d.ts +0 -0
  180. /package/{dist → dist-sdk}/server/src/auth/dto/phone-login.dto.js +0 -0
  181. /package/{dist → dist-sdk}/server/src/auth/dto/phone-verification.dto.d.ts +0 -0
  182. /package/{dist → dist-sdk}/server/src/auth/dto/phone-verification.dto.js +0 -0
  183. /package/{dist → dist-sdk}/server/src/auth/jwt-auth.guard.d.ts +0 -0
  184. /package/{dist → dist-sdk}/server/src/auth/jwt-auth.guard.js +0 -0
  185. /package/{dist → dist-sdk}/server/src/auth/jwt.strategy.d.ts +0 -0
  186. /package/{dist → dist-sdk}/server/src/auth/jwt.strategy.js +0 -0
  187. /package/{dist → dist-sdk}/server/src/auth/phone-validation.service.d.ts +0 -0
  188. /package/{dist → dist-sdk}/server/src/auth/phone-validation.service.js +0 -0
  189. /package/{dist → dist-sdk}/server/src/auth/public.decorator.d.ts +0 -0
  190. /package/{dist → dist-sdk}/server/src/auth/public.decorator.js +0 -0
  191. /package/{dist → dist-sdk}/server/src/auth/rate-limit.service.d.ts +0 -0
  192. /package/{dist → dist-sdk}/server/src/auth/rate-limit.service.js +0 -0
  193. /package/{dist → dist-sdk}/server/src/auth/room-access.decorator.d.ts +0 -0
  194. /package/{dist → dist-sdk}/server/src/auth/room-access.decorator.js +0 -0
  195. /package/{dist → dist-sdk}/server/src/auth/scopes.decorator.d.ts +0 -0
  196. /package/{dist → dist-sdk}/server/src/auth/scopes.decorator.js +0 -0
  197. /package/{dist → dist-sdk}/server/src/auth/scopes.guard.d.ts +0 -0
  198. /package/{dist → dist-sdk}/server/src/auth/scopes.guard.js +0 -0
  199. /package/{dist → dist-sdk}/server/src/auth/session.guard.d.ts +0 -0
  200. /package/{dist → dist-sdk}/server/src/auth/session.guard.js +0 -0
  201. /package/{dist → dist-sdk}/server/src/auth/twilio.service.d.ts +0 -0
  202. /package/{dist → dist-sdk}/server/src/auth/twilio.service.js +0 -0
  203. /package/{dist → dist-sdk}/server/src/auth/users.service.d.ts +0 -0
  204. /package/{dist → dist-sdk}/server/src/common/errors.d.ts +0 -0
  205. /package/{dist → dist-sdk}/server/src/common/errors.js +0 -0
  206. /package/{dist → dist-sdk}/server/src/common/logger.d.ts +0 -0
  207. /package/{dist → dist-sdk}/server/src/common/logger.js +0 -0
  208. /package/{dist → dist-sdk}/server/src/config/configuration.module.d.ts +0 -0
  209. /package/{dist → dist-sdk}/server/src/config/configuration.module.js +0 -0
  210. /package/{dist → dist-sdk}/server/src/config/configuration.service.d.ts +0 -0
  211. /package/{dist → dist-sdk}/server/src/room/artifact-store.service.d.ts +0 -0
  212. /package/{dist → dist-sdk}/server/src/room/artifact-store.service.js +0 -0
  213. /package/{dist → dist-sdk}/server/src/room/artifact.d.ts +0 -0
  214. /package/{dist → dist-sdk}/server/src/room/artifact.js +0 -0
  215. /package/{dist → dist-sdk}/server/src/room/message.d.ts +0 -0
  216. /package/{dist → dist-sdk}/server/src/room/message.js +0 -0
  217. /package/{dist → dist-sdk}/server/src/room/published-rooms.service.d.ts +0 -0
  218. /package/{dist → dist-sdk}/server/src/room/room-config.d.ts +0 -0
  219. /package/{dist → dist-sdk}/server/src/room/room-config.js +0 -0
  220. /package/{dist → dist-sdk}/server/src/room/room-factory.d.ts +0 -0
  221. /package/{dist → dist-sdk}/server/src/room/room-factory.js +0 -0
  222. /package/{dist → dist-sdk}/server/src/room/room-message.module.d.ts +0 -0
  223. /package/{dist → dist-sdk}/server/src/room/room-message.module.js +0 -0
  224. /package/{dist → dist-sdk}/server/src/room/room-message.service.d.ts +0 -0
  225. /package/{dist → dist-sdk}/server/src/room/room-message.service.js +0 -0
  226. /package/{dist → dist-sdk}/server/src/room/room-store.module.d.ts +0 -0
  227. /package/{dist → dist-sdk}/server/src/room/room-store.module.js +0 -0
  228. /package/{dist → dist-sdk}/server/src/room/room-store.service.d.ts +0 -0
  229. /package/{dist → dist-sdk}/server/src/room/room-store.service.js +0 -0
  230. /package/{dist → dist-sdk}/server/src/room/room.d.ts +0 -0
  231. /package/{dist → dist-sdk}/server/src/sdk/briyah-config.d.ts +0 -0
  232. /package/{dist → dist-sdk}/server/src/sdk/briyah.d.ts +0 -0
  233. /package/{dist → dist-sdk}/server/src/sdk/index.js +0 -0
  234. /package/{dist → dist-sdk}/server/src/shared/shared.module.d.ts +0 -0
  235. /package/{dist → dist-sdk}/server/src/shared/shared.module.js +0 -0
  236. /package/{dist → dist-sdk}/server/src/story/story-progress.service.d.ts +0 -0
  237. /package/{dist → dist-sdk}/server/src/story/story-progress.service.js +0 -0
  238. /package/{dist → dist-sdk}/server/src/story/story-store.module.d.ts +0 -0
  239. /package/{dist → dist-sdk}/server/src/story/story-store.module.js +0 -0
  240. /package/{dist → dist-sdk}/server/src/story/story-store.service.d.ts +0 -0
  241. /package/{dist → dist-sdk}/server/src/story/story-store.service.js +0 -0
  242. /package/{dist → dist-sdk}/shared/types/app.types.js +0 -0
package/README.md CHANGED
@@ -94,7 +94,7 @@ interface BriyahConfigOptions {
94
94
 
95
95
  **Optional:**
96
96
  - `STARTING_BALANCE` - Starting balance for new users (e.g., "10.00")
97
- - `SERVER_DATA_PATH` - Global default data path (overridden by constructor `dataPath`)
97
+ - `BRIYAH_DATA_PATH` - Global default data path (overridden by constructor `dataPath`)
98
98
  - `USER_SERVICE_CACHE_TIMEOUT_MINUTES` - Cache timeout (overridden by constructor option)
99
99
 
100
100
  ### Logging
@@ -205,6 +205,8 @@ The AppService provides full access to Briyah functionality.
205
205
  const agent = appService.createAgent(provider, name, nickname, description, model);
206
206
  const agents = await appService.listAgents();
207
207
  await appService.deleteAgent(agentId);
208
+ await appService.reloadAgent(agentId); // Clear conversation history (keeps any prior summary)
209
+ await appService.compactAgentConversation(agentId); // Summarize history into a single message
208
210
 
209
211
  // Room Management
210
212
  const room = await appService.createRoom(name, goal, agentIds);
@@ -352,6 +354,115 @@ const messages = await appService.getRoomMessages(room.roomId);
352
354
  console.log(`Messages: ${messages.messages.length}`);
353
355
  ```
354
356
 
357
+ ### Example 6: Story Message Emitter
358
+
359
+ The story message emitter delivers real-time events during gameplay. Subscribe to it after creating the story but before the first player turn, so no events are missed.
360
+
361
+ ```typescript
362
+ import type {
363
+ StoryStateEvent,
364
+ StoryIntroduceCharacterEvent,
365
+ StoryProgressChapterEvent,
366
+ StoryErrorEvent,
367
+ } from 'briyah';
368
+
369
+ const app = briyah.getAppService('user-123');
370
+
371
+ const story = await app.createStory(
372
+ 'The Lost Kingdom',
373
+ 'A medieval fantasy where ancient ruins hold a terrible secret',
374
+ 'A disgraced knight seeking redemption'
375
+ );
376
+
377
+ const emitter = app.getStoryMessageEmitter(story.id);
378
+
379
+ // Fires after every turn with the full updated game state.
380
+ emitter.on('story-state', async (event: StoryStateEvent) => {
381
+ const { state } = event;
382
+ console.log('Latest message:', state.latestRoomMessage?.content);
383
+
384
+ // Detect the player's turn by comparing speaker names.
385
+ // Do NOT use state.humanPrompt for this — it is a UI display string,
386
+ // not a reliable turn indicator.
387
+ if (state.currentSpeaker === state.userAgentName) {
388
+ const input = await promptPlayer(state.humanPrompt);
389
+ await app.respondToStory(story.id, input);
390
+ }
391
+ });
392
+
393
+ // Fires when the narrator wants to introduce a new character.
394
+ // The host app should present this to the player before acting.
395
+ // Accept by calling introduceCharacterToStory, or decline with declineCharacter.
396
+ emitter.on('suggest-introduce-character', async (event: StoryIntroduceCharacterEvent) => {
397
+ const accept = await askPlayer(`Add ${event.characterName} to the story?`);
398
+ if (accept) {
399
+ await app.introduceCharacterToStory(story.id, event.characterName!, '', undefined, true);
400
+ } else {
401
+ await app.declineCharacter(story.id, event.characterName!);
402
+ }
403
+ });
404
+
405
+ // Fires when the narrator wants to advance to the next chapter.
406
+ // Call progressStory to accept. Ignoring the event stays in the current chapter —
407
+ // there is no explicit rejection call.
408
+ emitter.on('suggest-progress-chapter', async (_event: StoryProgressChapterEvent) => {
409
+ const accept = await askPlayer('The narrator suggests ending this chapter. Continue?');
410
+ if (accept) {
411
+ await app.progressStory(story.id);
412
+ }
413
+ });
414
+
415
+ // Fires on fatal errors during room processing.
416
+ // Named 'story-error' rather than 'error' to avoid Node.js throwing when no
417
+ // listener is attached.
418
+ emitter.on('story-error', (event: StoryErrorEvent) => {
419
+ if (event.errorType === 'InsufficientBalanceError') {
420
+ console.error('Out of credits:', event.message);
421
+ } else {
422
+ console.error(`Story error [${event.errorType}]:`, event.message);
423
+ }
424
+ });
425
+ ```
426
+
427
+ ### Example 7: Recording Payments and Managing Balance
428
+
429
+ Briyah does not process payments itself — your application handles the payment provider interaction. Once a payment is confirmed, use `AppService` to record the transaction, credit the user's balance, and restart any stories that stalled due to insufficient funds.
430
+
431
+ ```typescript
432
+ const app = briyah.getAppService(userId);
433
+
434
+ // --- When your payment provider initiates a charge ---
435
+ // Record it as pending so the transaction log stays consistent.
436
+ await app.recordTransaction(amount, paymentIntentId, 'pending');
437
+
438
+ // --- When your payment provider webhook confirms success ---
439
+ await app.updateTransactionStatus(paymentIntentId, 'succeeded');
440
+ await app.addBalance(amount);
441
+
442
+ // Resume any stories that paused mid-turn due to InsufficientBalanceError.
443
+ await app.resumePausedStories();
444
+
445
+ // --- When a payment fails or is cancelled ---
446
+ await app.updateTransactionStatus(paymentIntentId, 'failed');
447
+
448
+ // --- Querying balance and history ---
449
+ const balance = app.getBalance();
450
+
451
+ const { transactions, total } = await app.getTransactions(50, 0);
452
+
453
+ const tx = await app.getTransactionByPaymentId(paymentIntentId);
454
+ console.log(tx?.status); // 'pending' | 'succeeded' | 'failed' | 'cancelled'
455
+ ```
456
+
457
+ To push real-time balance updates to a connected client (e.g. via SSE), subscribe to the balance emitter before crediting the user:
458
+
459
+ ```typescript
460
+ const emitter = app.getBalanceMessageEmitter(userId);
461
+ emitter.on('update', (newBalance: number) => {
462
+ // Push newBalance to the client
463
+ });
464
+ ```
465
+
355
466
  ## Data Storage
356
467
 
357
468
  Briyah stores data in the following structure:
@@ -0,0 +1 @@
1
+ 1.6219859999999993