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
@@ -40,7 +40,7 @@ let StripeService = class StripeService {
40
40
  this.minPaymentAmount = parseFloat(process.env.MIN_PAYMENT_AMOUNT || '5.00');
41
41
  this.maxPaymentAmount = parseFloat(process.env.MAX_PAYMENT_AMOUNT || '500.00');
42
42
  }
43
- async createPaymentIntent(userId, amount, transactionService) {
43
+ async createPaymentIntent(userId, amount, appService) {
44
44
  if (!amount || amount <= 0) {
45
45
  throw new common_1.BadRequestException('Amount must be greater than 0');
46
46
  }
@@ -62,7 +62,7 @@ let StripeService = class StripeService {
62
62
  enabled: true,
63
63
  },
64
64
  });
65
- await transactionService.recordTransaction(amount, paymentIntent.id, 'pending');
65
+ await appService.recordTransaction(amount, paymentIntent.id, 'pending');
66
66
  return {
67
67
  clientSecret: paymentIntent.client_secret,
68
68
  publishableKey: this.publishableKey,
@@ -73,7 +73,7 @@ let StripeService = class StripeService {
73
73
  throw new common_1.InternalServerErrorException('Failed to create payment intent');
74
74
  }
75
75
  }
76
- async createCheckoutSession(userId, amount, transactionService) {
76
+ async createCheckoutSession(userId, amount, appService) {
77
77
  if (!amount || amount <= 0) {
78
78
  throw new common_1.BadRequestException('Amount must be greater than 0');
79
79
  }
@@ -113,7 +113,7 @@ let StripeService = class StripeService {
113
113
  },
114
114
  });
115
115
  if (session.payment_intent) {
116
- await transactionService.recordTransaction(amount, session.payment_intent, 'pending');
116
+ await appService.recordTransaction(amount, session.payment_intent, 'pending');
117
117
  }
118
118
  return {
119
119
  url: session.url,
@@ -124,6 +124,22 @@ let StripeService = class StripeService {
124
124
  throw new common_1.InternalServerErrorException('Failed to create checkout session');
125
125
  }
126
126
  }
127
+ async getCheckoutSessionUser(sessionId) {
128
+ try {
129
+ const session = await this.stripe.checkout.sessions.retrieve(sessionId);
130
+ const userId = session.metadata?.userId;
131
+ if (!userId) {
132
+ throw new common_1.BadRequestException('Session has no userId in metadata');
133
+ }
134
+ return { userId, paymentStatus: session.payment_status };
135
+ }
136
+ catch (error) {
137
+ if (error instanceof common_1.BadRequestException)
138
+ throw error;
139
+ logger_1.logger.error('Error retrieving checkout session:', error);
140
+ throw new common_1.BadRequestException('Invalid or expired session ID');
141
+ }
142
+ }
127
143
  getStripeConfig() {
128
144
  return {
129
145
  publishableKey: this.publishableKey,
@@ -148,8 +164,7 @@ let StripeService = class StripeService {
148
164
  }
149
165
  const amount = paymentIntent.amount / 100;
150
166
  logger_1.logger.log(`[Stripe Webhook] Amount: $${amount.toFixed(2)}`);
151
- const transactionService = appService.getTransactionService();
152
- const existingTransaction = await transactionService.getTransactionByPaymentIntent(paymentIntent.id);
167
+ const existingTransaction = await appService.getTransactionByPaymentId(paymentIntent.id);
153
168
  logger_1.logger.log(`[Stripe Webhook] Existing transaction:`, existingTransaction);
154
169
  if (existingTransaction?.status === 'succeeded') {
155
170
  logger_1.logger.log(`Transaction ${paymentIntent.id} already processed, skipping`);
@@ -162,7 +177,7 @@ let StripeService = class StripeService {
162
177
  const balanceAfter = await appService.getBalance();
163
178
  logger_1.logger.log(`[Stripe Webhook] Balance after: $${balanceAfter.toFixed(2)}`);
164
179
  logger_1.logger.log(`[Stripe Webhook] Updating transaction status to 'succeeded'`);
165
- await transactionService.updateTransactionStatus(paymentIntent.id, 'succeeded');
180
+ await appService.updateTransactionStatus(paymentIntent.id, 'succeeded');
166
181
  logger_1.logger.log(`[Stripe Webhook] Checking for paused stories to resume...`);
167
182
  const resumedCount = await appService.resumePausedStories();
168
183
  if (resumedCount > 0) {
@@ -182,8 +197,7 @@ let StripeService = class StripeService {
182
197
  logger_1.logger.error('Payment Intent missing userId in metadata:', paymentIntent.id);
183
198
  return;
184
199
  }
185
- const transactionService = appService.getTransactionService();
186
- await transactionService.updateTransactionStatus(paymentIntent.id, 'failed');
200
+ await appService.updateTransactionStatus(paymentIntent.id, 'failed');
187
201
  logger_1.logger.log(`Payment failed for user ${userId}: ${paymentIntent.id}`);
188
202
  }
189
203
  catch (error) {
@@ -5,9 +5,9 @@ export declare class TransactionService {
5
5
  private configService;
6
6
  private transactionsDir;
7
7
  constructor(userId: string, configService: ConfigurationService);
8
- recordTransaction(amount: number, stripePaymentIntentId: string, status?: 'pending' | 'succeeded' | 'failed' | 'cancelled'): Promise<Transaction>;
9
- updateTransactionStatus(paymentIntentId: string, status: 'pending' | 'succeeded' | 'failed' | 'cancelled'): Promise<void>;
10
- getTransactionByPaymentIntent(paymentIntentId: string): Promise<Transaction | null>;
8
+ recordTransaction(amount: number, paymentId: string, status?: 'pending' | 'succeeded' | 'failed' | 'cancelled'): Promise<Transaction>;
9
+ updateTransactionStatus(paymentId: string, status: 'pending' | 'succeeded' | 'failed' | 'cancelled'): Promise<void>;
10
+ getTransactionByPaymentId(paymentId: string): Promise<Transaction | null>;
11
11
  getTransactions(limit?: number, offset?: number): Promise<{
12
12
  transactions: Transaction[];
13
13
  total: number;
@@ -51,19 +51,19 @@ class TransactionService {
51
51
  fs.mkdirSync(this.transactionsDir, { recursive: true });
52
52
  }
53
53
  }
54
- async recordTransaction(amount, stripePaymentIntentId, status = 'pending') {
54
+ async recordTransaction(amount, paymentId, status = 'pending') {
55
55
  const timestamp = Date.now();
56
56
  const transaction = {
57
57
  id: (0, zod_1.uuidv4)().toString(),
58
58
  userId: this.userId,
59
59
  amount,
60
60
  currency: 'usd',
61
- stripePaymentIntentId,
61
+ paymentId,
62
62
  status,
63
63
  createdAt: timestamp,
64
64
  updatedAt: timestamp,
65
65
  };
66
- const filename = `${timestamp}-${stripePaymentIntentId}.json`;
66
+ const filename = `${timestamp}-${paymentId}.json`;
67
67
  const filePath = path.join(this.transactionsDir, filename);
68
68
  try {
69
69
  fs.writeFileSync(filePath, JSON.stringify(transaction, null, 2), 'utf-8');
@@ -74,31 +74,31 @@ class TransactionService {
74
74
  throw error;
75
75
  }
76
76
  }
77
- async updateTransactionStatus(paymentIntentId, status) {
77
+ async updateTransactionStatus(paymentId, status) {
78
78
  try {
79
- const transaction = await this.getTransactionByPaymentIntent(paymentIntentId);
79
+ const transaction = await this.getTransactionByPaymentId(paymentId);
80
80
  if (!transaction) {
81
- logger_1.logger.error(`Transaction not found for payment intent ${paymentIntentId}`);
81
+ logger_1.logger.error(`Transaction not found for payment ID ${paymentId}`);
82
82
  return;
83
83
  }
84
84
  transaction.status = status;
85
85
  transaction.updatedAt = Date.now();
86
86
  const files = fs.readdirSync(this.transactionsDir);
87
- const matchingFile = files.find((file) => file.includes(paymentIntentId));
87
+ const matchingFile = files.find((file) => file.includes(paymentId));
88
88
  if (matchingFile) {
89
89
  const filePath = path.join(this.transactionsDir, matchingFile);
90
90
  fs.writeFileSync(filePath, JSON.stringify(transaction, null, 2), 'utf-8');
91
91
  }
92
92
  }
93
93
  catch (error) {
94
- logger_1.logger.error(`Error updating transaction status for ${paymentIntentId}:`, error);
94
+ logger_1.logger.error(`Error updating transaction status for ${paymentId}:`, error);
95
95
  throw error;
96
96
  }
97
97
  }
98
- async getTransactionByPaymentIntent(paymentIntentId) {
98
+ async getTransactionByPaymentId(paymentId) {
99
99
  try {
100
100
  const files = fs.readdirSync(this.transactionsDir);
101
- const matchingFile = files.find((file) => file.includes(paymentIntentId));
101
+ const matchingFile = files.find((file) => file.includes(paymentId));
102
102
  if (!matchingFile) {
103
103
  return null;
104
104
  }
@@ -107,7 +107,7 @@ class TransactionService {
107
107
  return JSON.parse(content);
108
108
  }
109
109
  catch (error) {
110
- logger_1.logger.error(`Error getting transaction for payment intent ${paymentIntentId}:`, error);
110
+ logger_1.logger.error(`Error getting transaction for payment ID ${paymentId}:`, error);
111
111
  return null;
112
112
  }
113
113
  }
@@ -110,6 +110,7 @@ export declare class AppController {
110
110
  updateAgent(req: ExpressRequest, agentId: string, updateData: UpdateAgentRequest): Promise<void>;
111
111
  deleteAttachedFile(req: ExpressRequest, agentId: string, documentId: string): Promise<void>;
112
112
  reloadAgent(req: ExpressRequest, agentId: string): Promise<void>;
113
+ compactAgentConversation(req: ExpressRequest, agentId: string): Promise<void>;
113
114
  resetRoom(req: ExpressRequest, roomId: string): Promise<void>;
114
115
  publishRoom(req: ExpressRequest, templateId: string, body: {
115
116
  publishedName?: string;
@@ -827,6 +827,34 @@ let AppController = class AppController {
827
827
  throw new common_1.HttpException('Failed to reload agent', common_1.HttpStatus.INTERNAL_SERVER_ERROR);
828
828
  }
829
829
  }
830
+ async compactAgentConversation(req, agentId) {
831
+ if (!agentId) {
832
+ throw new common_1.BadRequestException('Agent ID is required');
833
+ }
834
+ try {
835
+ const appService = this.getAppService(req, agentId);
836
+ if (req.user.type === 'agent-access') {
837
+ const agentDetails = await appService.getAgentDetails(agentId);
838
+ if (!agentDetails || !agentDetails.isPublished) {
839
+ throw new common_1.ForbiddenException('Agent is not published');
840
+ }
841
+ }
842
+ await appService.compactAgentConversation(agentId);
843
+ }
844
+ catch (error) {
845
+ logger_1.logger.error(`[${req.user?.sub}] Error compacting agent ${agentId}:`, error);
846
+ if (error instanceof errors_1.NotFoundError) {
847
+ throw new common_1.NotFoundException(error.message);
848
+ }
849
+ if (error instanceof errors_1.OperationFailedError) {
850
+ throw new common_1.HttpException(error.message, common_1.HttpStatus.INTERNAL_SERVER_ERROR);
851
+ }
852
+ if (error instanceof common_1.ForbiddenException) {
853
+ throw error;
854
+ }
855
+ throw new common_1.HttpException('Failed to compact agent conversation', common_1.HttpStatus.INTERNAL_SERVER_ERROR);
856
+ }
857
+ }
830
858
  async resetRoom(req, roomId) {
831
859
  if (!roomId) {
832
860
  throw new common_1.BadRequestException('Room ID is required');
@@ -1412,13 +1440,22 @@ let AppController = class AppController {
1412
1440
  subscriber.next({
1413
1441
  data: { type: 'connected', storyId },
1414
1442
  });
1443
+ if (storyInfo.pendingSuggestion) {
1444
+ subscriber.next({ data: storyInfo.pendingSuggestion });
1445
+ }
1415
1446
  const updateHandler = (data) => {
1416
1447
  subscriber.next({ data });
1417
1448
  };
1418
- emitter.on('update', updateHandler);
1449
+ emitter.on('story-state', updateHandler);
1450
+ emitter.on('suggest-introduce-character', updateHandler);
1451
+ emitter.on('suggest-progress-chapter', updateHandler);
1452
+ emitter.on('story-error', updateHandler);
1419
1453
  return () => {
1420
1454
  logger_1.logger.log(`[SSE] Cleanup for story ${storyId}`);
1421
- emitter.off('update', updateHandler);
1455
+ emitter.off('story-state', updateHandler);
1456
+ emitter.off('suggest-introduce-character', updateHandler);
1457
+ emitter.off('suggest-progress-chapter', updateHandler);
1458
+ emitter.off('story-error', updateHandler);
1422
1459
  };
1423
1460
  });
1424
1461
  }
@@ -2070,6 +2107,16 @@ __decorate([
2070
2107
  __metadata("design:paramtypes", [Object, String]),
2071
2108
  __metadata("design:returntype", Promise)
2072
2109
  ], AppController.prototype, "reloadAgent", null);
2110
+ __decorate([
2111
+ (0, agent_access_decorator_1.AgentAccess)(),
2112
+ (0, common_1.Post)('agents/:agentId/compact'),
2113
+ (0, common_1.HttpCode)(common_1.HttpStatus.NO_CONTENT),
2114
+ __param(0, (0, common_1.Request)()),
2115
+ __param(1, (0, common_1.Param)('agentId')),
2116
+ __metadata("design:type", Function),
2117
+ __metadata("design:paramtypes", [Object, String]),
2118
+ __metadata("design:returntype", Promise)
2119
+ ], AppController.prototype, "compactAgentConversation", null);
2073
2120
  __decorate([
2074
2121
  (0, common_1.Post)('rooms/:roomId/reset'),
2075
2122
  (0, common_1.HttpCode)(common_1.HttpStatus.NO_CONTENT),
@@ -21,7 +21,7 @@ import { TransactionService } from './app/transaction.service';
21
21
  import { AgentFactory } from './ai/agent-factory';
22
22
  import { RoomFactory } from './room/room-factory';
23
23
  import { EventEmitter } from 'events';
24
- import { AgentInfo, RoomInfo, RoomDetails, CreateRoomResponse, FileList, PromptFileContent, PromptFoldersResponse, PromptFilesResponse, PromptScope, ProcessTextResponse, PreparedPromptResponse, AttachDocumentResponse, AgentMessagesResponse, RoomMessagesResponse, StoryInfo, StoryState, Character } from '../../shared/types/app.types';
24
+ import { AgentInfo, RoomInfo, RoomDetails, CreateRoomResponse, FileList, PromptFileContent, PromptFoldersResponse, PromptFilesResponse, PromptScope, ProcessTextResponse, PreparedPromptResponse, AttachDocumentResponse, AgentMessagesResponse, RoomMessagesResponse, StoryInfo, StoryState, Character, Transaction, TransactionHistoryResponse } from '../../shared/types/app.types';
25
25
  import { RoomMessage } from './room/message';
26
26
  export declare class AppService {
27
27
  private readonly aiFactoryService;
@@ -111,6 +111,7 @@ export declare class AppService {
111
111
  deleteAttachedFile(agentId: string, fileName: string): Promise<void>;
112
112
  deleteAttachedFileById(documentId: string): Promise<void>;
113
113
  reloadAgent(agentId: string): Promise<void>;
114
+ compactAgentConversation(agentId: string): Promise<void>;
114
115
  resetRoom(roomId: string): Promise<void>;
115
116
  resetStory(storyId: string): Promise<void>;
116
117
  createStory(name: string, idea: string, userCharacterDesc: string, otherCharactersDesc: string, storyModel?: string, isImport?: boolean, imageModelName?: string): Promise<StoryInfo>;
@@ -166,7 +167,10 @@ export declare class AppService {
166
167
  savePlotPlan(storyId: string, content: string): Promise<void>;
167
168
  getBalance(): number;
168
169
  addBalance(amount: number): void;
169
- getTransactionService(): TransactionService;
170
+ recordTransaction(amount: number, paymentId: string, status?: 'pending' | 'succeeded' | 'failed' | 'cancelled'): Promise<Transaction>;
171
+ updateTransactionStatus(paymentId: string, status: 'pending' | 'succeeded' | 'failed' | 'cancelled'): Promise<void>;
172
+ getTransactionByPaymentId(paymentId: string): Promise<Transaction | null>;
173
+ getTransactions(limit?: number, offset?: number): Promise<TransactionHistoryResponse>;
170
174
  listUserArtifacts(): ArtifactMetadata[];
171
175
  getUserArtifact(artifactId: string): string | Buffer | null;
172
176
  createUserArtifact(name: string, content: string): string;
@@ -890,6 +890,13 @@ class AppService {
890
890
  }
891
891
  agent.save();
892
892
  }
893
+ async compactAgentConversation(agentId) {
894
+ const agent = await this.agentStore.getAgent(agentId);
895
+ if (!agent) {
896
+ throw new errors_1.NotFoundError('Agent not found');
897
+ }
898
+ await agent.compact();
899
+ }
893
900
  async resetRoom(roomId) {
894
901
  const room = await this.roomStore.getRoom(roomId);
895
902
  if (!room) {
@@ -1155,8 +1162,17 @@ class AppService {
1155
1162
  addBalance(amount) {
1156
1163
  return this.balanceService.addBalance(amount);
1157
1164
  }
1158
- getTransactionService() {
1159
- return this.transactionService;
1165
+ async recordTransaction(amount, paymentId, status = 'pending') {
1166
+ return this.transactionService.recordTransaction(amount, paymentId, status);
1167
+ }
1168
+ async updateTransactionStatus(paymentId, status) {
1169
+ return this.transactionService.updateTransactionStatus(paymentId, status);
1170
+ }
1171
+ async getTransactionByPaymentId(paymentId) {
1172
+ return this.transactionService.getTransactionByPaymentId(paymentId);
1173
+ }
1174
+ async getTransactions(limit = 50, offset = 0) {
1175
+ return this.transactionService.getTransactions(limit, offset);
1160
1176
  }
1161
1177
  listUserArtifacts() {
1162
1178
  return this.artifactService.listArtifacts();
@@ -52,7 +52,7 @@ let UsersService = class UsersService {
52
52
  usersFilePath;
53
53
  dataDir;
54
54
  constructor() {
55
- this.dataDir = process.env.SERVER_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
55
+ this.dataDir = process.env.BRIYAH_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
56
56
  const commonDir = path.resolve(this.dataDir, 'common');
57
57
  const usersDir = path.resolve(commonDir, 'users');
58
58
  this.usersFilePath = path.resolve(usersDir, 'users.json');
@@ -49,7 +49,7 @@ class ConfigurationService {
49
49
  userId;
50
50
  constructor(userId, baseDataPath) {
51
51
  this.userId = userId;
52
- const dataPath = baseDataPath || process.env.SERVER_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
52
+ const dataPath = baseDataPath || process.env.BRIYAH_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
53
53
  this.dataDir = path.resolve(dataPath);
54
54
  if (!fs.existsSync(this.dataDir)) {
55
55
  fs.mkdirSync(this.dataDir, { recursive: true });
@@ -51,7 +51,7 @@ let PublishedRoomsService = class PublishedRoomsService {
51
51
  mapping;
52
52
  filePath;
53
53
  constructor() {
54
- const dataPath = process.env.SERVER_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
54
+ const dataPath = process.env.BRIYAH_DATA_PATH || path.resolve(process.cwd(), 'briyah-data');
55
55
  this.filePath = path.join(dataPath, 'common', 'published-rooms.json');
56
56
  this.mapping = new Map();
57
57
  this.load();
@@ -272,6 +272,7 @@ class Room {
272
272
  let response = await agent.instructedPrompt(prompt, 'perceive', variables, false, true, maxOutputChars);
273
273
  answer = this.parseAgentResponse(agent, response);
274
274
  agent.addToConversationHistory(response, true);
275
+ agent.save();
275
276
  }
276
277
  catch (e) {
277
278
  if (e instanceof errors_1.InsufficientBalanceError) {
@@ -9,8 +9,8 @@ class BriyahConfigService {
9
9
  ...(options?.envOverrides || {}),
10
10
  };
11
11
  if (options?.dataPath) {
12
- this.env.SERVER_DATA_PATH = options.dataPath;
13
- process.env.SERVER_DATA_PATH = options.dataPath;
12
+ this.env.BRIYAH_DATA_PATH = options.dataPath;
13
+ process.env.BRIYAH_DATA_PATH = options.dataPath;
14
14
  }
15
15
  if (options?.userServiceCacheTimeoutMinutes !== undefined) {
16
16
  this.env.USER_SERVICE_CACHE_TIMEOUT_MINUTES = String(options.userServiceCacheTimeoutMinutes);
@@ -72,7 +72,7 @@ class Briyah {
72
72
  initialized = false;
73
73
  constructor(options) {
74
74
  this.configService = new briyah_config_1.BriyahConfigService(options);
75
- const dataPath = this.configService.get('SERVER_DATA_PATH') || path.resolve(process.cwd(), 'briyah-data');
75
+ const dataPath = this.configService.get('BRIYAH_DATA_PATH') || path.resolve(process.cwd(), 'briyah-data');
76
76
  logger_1.logger.configure({
77
77
  enabled: options?.logging?.enabled !== false,
78
78
  console: options?.logging?.console !== false,
@@ -131,7 +131,7 @@ class Briyah {
131
131
  this.initialized = true;
132
132
  }
133
133
  seedCommonData() {
134
- const dataPath = this.configService.get('SERVER_DATA_PATH') || path.resolve(process.cwd(), 'briyah-data');
134
+ const dataPath = this.configService.get('BRIYAH_DATA_PATH') || path.resolve(process.cwd(), 'briyah-data');
135
135
  const userCommonDir = path.resolve(dataPath, 'common');
136
136
  const packageCommonDir = path.resolve(__dirname, '../../../../data/common');
137
137
  if (!fs.existsSync(packageCommonDir)) {
@@ -1,7 +1,7 @@
1
1
  export { Briyah } from './briyah';
2
2
  export { BriyahConfigService, BriyahConfigOptions } from './briyah-config';
3
3
  export type { AppService } from '../app.service';
4
- export type { AgentInfo, CreateAgentResponse, RoomInfo, RoomDetails, CreateRoomResponse, StoryInfo, CreateStoryResponse, ProcessTextResponse, FileList, PromptFileContent, AttachDocumentResponse, AgentMessagesResponse, RoomMessagesResponse, StoryState, Message, MessageAction, ModelInfo, ArtifactMetadata, PreparedPromptResponse, PromptScope, PromptFolder, PromptFoldersResponse, PromptFile, PromptFilesResponse, StoryIdea, StorySuggestion, StoryMessageUpdate, Character, ChapterInfo, } from '../../../shared/types/app.types';
4
+ export type { AgentInfo, CreateAgentResponse, RoomInfo, RoomDetails, CreateRoomResponse, StoryInfo, CreateStoryResponse, ProcessTextResponse, FileList, PromptFileContent, AttachDocumentResponse, AgentMessagesResponse, RoomMessagesResponse, StoryState, Message, MessageAction, ModelInfo, ArtifactMetadata, PreparedPromptResponse, PromptScope, PromptFolder, PromptFoldersResponse, PromptFile, PromptFilesResponse, StoryIdea, Transaction, TransactionHistoryResponse, StoryStateEvent, StoryIntroduceCharacterEvent, StoryProgressChapterEvent, StoryErrorEvent, Character, ChapterInfo, } from '../../../shared/types/app.types';
5
5
  export type { LoggingOptions } from './briyah-config';
6
6
  export { Agent } from '../ai/agent';
7
7
  export { Room } from '../room/room';
@@ -1,10 +1,12 @@
1
1
  import { EventEmitter } from 'events';
2
- import { StoryMessageUpdate } from '../../../shared/types/app.types';
2
+ import { StoryState } from '../../../shared/types/app.types';
3
3
  export declare class StoryMessageService {
4
4
  private messageEmitters;
5
5
  getOrCreateEmitter(storyId: string): EventEmitter;
6
6
  getEmitter(storyId: string): EventEmitter | undefined;
7
- emitUpdate(storyId: string, update: StoryMessageUpdate): void;
7
+ emitStoryState(storyId: string, state: StoryState): void;
8
+ emitIntroduceCharacter(storyId: string, characterName?: string): void;
9
+ emitProgressChapter(storyId: string): void;
8
10
  emitError(storyId: string, error: Error): void;
9
11
  cleanup(storyId: string): void;
10
12
  }
@@ -22,26 +22,37 @@ let StoryMessageService = class StoryMessageService {
22
22
  getEmitter(storyId) {
23
23
  return this.messageEmitters.get(storyId);
24
24
  }
25
- emitUpdate(storyId, update) {
26
- const emitter = this.messageEmitters.get(storyId);
27
- if (emitter) {
28
- const updateWithTimestamp = {
29
- timestamp: Date.now(),
30
- ...update
31
- };
32
- emitter.emit('update', updateWithTimestamp);
33
- }
25
+ emitStoryState(storyId, state) {
26
+ const emitter = this.getOrCreateEmitter(storyId);
27
+ const payload = { type: 'story-state', state, timestamp: Date.now() };
28
+ emitter.emit('story-state', payload);
29
+ }
30
+ emitIntroduceCharacter(storyId, characterName) {
31
+ const emitter = this.getOrCreateEmitter(storyId);
32
+ const payload = {
33
+ type: 'suggest-introduce-character',
34
+ characterName,
35
+ timestamp: Date.now(),
36
+ };
37
+ emitter.emit('suggest-introduce-character', payload);
38
+ }
39
+ emitProgressChapter(storyId) {
40
+ const emitter = this.getOrCreateEmitter(storyId);
41
+ const payload = {
42
+ type: 'suggest-progress-chapter',
43
+ timestamp: Date.now(),
44
+ };
45
+ emitter.emit('suggest-progress-chapter', payload);
34
46
  }
35
47
  emitError(storyId, error) {
36
- const emitter = this.messageEmitters.get(storyId);
37
- if (emitter) {
38
- emitter.emit('update', {
39
- timestamp: Date.now(),
40
- type: 'error',
41
- errorType: error.name,
42
- message: error.message,
43
- });
44
- }
48
+ const emitter = this.getOrCreateEmitter(storyId);
49
+ const payload = {
50
+ type: 'story-error',
51
+ errorType: error.name,
52
+ message: error.message,
53
+ timestamp: Date.now(),
54
+ };
55
+ emitter.emit('story-error', payload);
45
56
  }
46
57
  cleanup(storyId) {
47
58
  const emitter = this.messageEmitters.get(storyId);
@@ -20,6 +20,7 @@ export declare class StoryService {
20
20
  private readonly agentFactory;
21
21
  private readonly roomFactory;
22
22
  private readonly storyArtifactServices;
23
+ private readonly chaptersInProgress;
23
24
  constructor(storyStore: StoryStoreService, agentStore: AgentStoreService, roomStore: RoomStoreService, progressService: StoryProgressService, messageService: StoryMessageService, configService: ConfigurationService, agentFactory: AgentFactory, roomFactory: RoomFactory);
24
25
  getProgressEmitter(storyId: string): import("node:events")<any>;
25
26
  getMessageEmitter(storyId: string): import("node:events")<any>;
@@ -72,7 +73,6 @@ export declare class StoryService {
72
73
  private progressStoryToNextChapterAsync;
73
74
  private generateOpeningScene;
74
75
  private compactAgentHistories;
75
- private compactAgentHistory;
76
76
  private extractMarkdownContent;
77
77
  private updatePlotPlan;
78
78
  private updateCharacterProfiles;