briyah 1.1.0 → 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 (239) hide show
  1. package/README.md +3 -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 +13 -0
  27. package/{dist → dist-sdk}/server/src/app/stripe.service.d.ts +4 -0
  28. package/{dist → dist-sdk}/server/src/app/stripe.service.js +16 -0
  29. package/{dist → dist-sdk}/server/src/app.controller.d.ts +1 -0
  30. package/{dist → dist-sdk}/server/src/app.controller.js +41 -0
  31. package/{dist → dist-sdk}/server/src/app.service.d.ts +1 -0
  32. package/{dist → dist-sdk}/server/src/app.service.js +7 -0
  33. package/{dist → dist-sdk}/server/src/auth/users.service.js +1 -1
  34. package/{dist → dist-sdk}/server/src/config/configuration.service.js +1 -1
  35. package/{dist → dist-sdk}/server/src/room/published-rooms.service.js +1 -1
  36. package/{dist → dist-sdk}/server/src/room/room.js +1 -0
  37. package/{dist → dist-sdk}/server/src/sdk/briyah-config.js +2 -2
  38. package/{dist → dist-sdk}/server/src/sdk/briyah.js +2 -2
  39. package/{dist → dist-sdk}/server/src/story/story-message.service.js +24 -32
  40. package/{dist → dist-sdk}/server/src/story/story.service.d.ts +1 -1
  41. package/{dist → dist-sdk}/server/src/story/story.service.js +103 -76
  42. package/{dist → dist-sdk}/shared/types/app.types.d.ts +1 -0
  43. package/docs/assets/hierarchy.js +1 -1
  44. package/docs/assets/search.js +1 -1
  45. package/docs/classes/Agent.html +18 -13
  46. package/docs/classes/Briyah.html +12 -12
  47. package/docs/classes/BriyahConfigService.html +5 -5
  48. package/docs/classes/Room.html +23 -23
  49. package/docs/classes/RoomMessage.html +10 -10
  50. package/docs/enums/MessageAction.html +3 -3
  51. package/docs/hierarchy.html +1 -1
  52. package/docs/index.html +4 -4
  53. package/docs/interfaces/AgentInfo.html +2 -2
  54. package/docs/interfaces/AgentMessagesResponse.html +2 -2
  55. package/docs/interfaces/AppService.html +148 -143
  56. package/docs/interfaces/Artifact.html +3 -3
  57. package/docs/interfaces/ArtifactMetadata.html +2 -2
  58. package/docs/interfaces/AttachDocumentResponse.html +2 -2
  59. package/docs/interfaces/BriyahConfigOptions.html +6 -6
  60. package/docs/interfaces/ChapterInfo.html +2 -2
  61. package/docs/interfaces/Character.html +2 -2
  62. package/docs/interfaces/CreateAgentResponse.html +2 -2
  63. package/docs/interfaces/CreateRoomResponse.html +2 -2
  64. package/docs/interfaces/CreateStoryResponse.html +2 -2
  65. package/docs/interfaces/FileList.html +2 -2
  66. package/docs/interfaces/LoggingOptions.html +5 -5
  67. package/docs/interfaces/Message.html +2 -2
  68. package/docs/interfaces/ModelInfo.html +2 -2
  69. package/docs/interfaces/PreparedPromptResponse.html +2 -2
  70. package/docs/interfaces/ProcessTextResponse.html +2 -2
  71. package/docs/interfaces/PromptFile.html +2 -2
  72. package/docs/interfaces/PromptFileContent.html +2 -2
  73. package/docs/interfaces/PromptFilesResponse.html +2 -2
  74. package/docs/interfaces/PromptFolder.html +2 -2
  75. package/docs/interfaces/PromptFoldersResponse.html +2 -2
  76. package/docs/interfaces/RoomDetails.html +2 -2
  77. package/docs/interfaces/RoomInfo.html +2 -2
  78. package/docs/interfaces/RoomMessagesResponse.html +2 -2
  79. package/docs/interfaces/StoryErrorEvent.html +3 -3
  80. package/docs/interfaces/StoryIdea.html +2 -2
  81. package/docs/interfaces/StoryInfo.html +6 -2
  82. package/docs/interfaces/StoryIntroduceCharacterEvent.html +3 -3
  83. package/docs/interfaces/StoryProgressChapterEvent.html +3 -3
  84. package/docs/interfaces/StoryState.html +5 -5
  85. package/docs/interfaces/StoryStateEvent.html +3 -3
  86. package/docs/interfaces/Transaction.html +2 -2
  87. package/docs/interfaces/TransactionHistoryResponse.html +2 -2
  88. package/docs/modules.html +1 -1
  89. package/docs/types/PromptScope.html +1 -1
  90. package/package.json +8 -8
  91. package/dist/server/src/ai/model_prices.d.ts +0 -1
  92. /package/data/common/prompts/character/{compact_story.json → compact_agent.json} +0 -0
  93. /package/data/common/prompts/character/{compact_story.prompt → compact_agent.prompt} +0 -0
  94. /package/data/common/prompts/narrator/{compact_story.json → compact_agent.json} +0 -0
  95. /package/data/common/prompts/narrator/{compact_story.prompt → compact_agent.prompt} +0 -0
  96. /package/{dist → dist-sdk}/server/src/ai/LLM/anthropic.module.d.ts +0 -0
  97. /package/{dist → dist-sdk}/server/src/ai/LLM/anthropic.module.js +0 -0
  98. /package/{dist → dist-sdk}/server/src/ai/LLM/anthropic.service.d.ts +0 -0
  99. /package/{dist → dist-sdk}/server/src/ai/LLM/deepseek.module.d.ts +0 -0
  100. /package/{dist → dist-sdk}/server/src/ai/LLM/deepseek.module.js +0 -0
  101. /package/{dist → dist-sdk}/server/src/ai/LLM/fal.module.d.ts +0 -0
  102. /package/{dist → dist-sdk}/server/src/ai/LLM/fal.module.js +0 -0
  103. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.module.d.ts +0 -0
  104. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.module.js +0 -0
  105. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.service.d.ts +0 -0
  106. /package/{dist → dist-sdk}/server/src/ai/LLM/googleai.service.js +0 -0
  107. /package/{dist → dist-sdk}/server/src/ai/LLM/grok.module.d.ts +0 -0
  108. /package/{dist → dist-sdk}/server/src/ai/LLM/grok.module.js +0 -0
  109. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.module.d.ts +0 -0
  110. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.module.js +0 -0
  111. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.service.d.ts +0 -0
  112. /package/{dist → dist-sdk}/server/src/ai/LLM/mock.service.js +0 -0
  113. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.module.d.ts +0 -0
  114. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.module.js +0 -0
  115. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.service.d.ts +0 -0
  116. /package/{dist → dist-sdk}/server/src/ai/LLM/openai.service.js +0 -0
  117. /package/{dist → dist-sdk}/server/src/ai/LLM/together.module.d.ts +0 -0
  118. /package/{dist → dist-sdk}/server/src/ai/LLM/together.module.js +0 -0
  119. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.module.d.ts +0 -0
  120. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.module.js +0 -0
  121. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.service.d.ts +0 -0
  122. /package/{dist → dist-sdk}/server/src/ai/LLM/vertexai.service.js +0 -0
  123. /package/{dist → dist-sdk}/server/src/ai/agent-config.d.ts +0 -0
  124. /package/{dist → dist-sdk}/server/src/ai/agent-config.js +0 -0
  125. /package/{dist → dist-sdk}/server/src/ai/agent-factory.d.ts +0 -0
  126. /package/{dist → dist-sdk}/server/src/ai/agent-factory.js +0 -0
  127. /package/{dist → dist-sdk}/server/src/ai/agent-message.service.d.ts +0 -0
  128. /package/{dist → dist-sdk}/server/src/ai/agent-message.service.js +0 -0
  129. /package/{dist → dist-sdk}/server/src/ai/agent-store.module.d.ts +0 -0
  130. /package/{dist → dist-sdk}/server/src/ai/agent-store.module.js +0 -0
  131. /package/{dist → dist-sdk}/server/src/ai/agent-store.service.d.ts +0 -0
  132. /package/{dist → dist-sdk}/server/src/ai/agent-store.service.js +0 -0
  133. /package/{dist → dist-sdk}/server/src/ai/ai-factory.module.d.ts +0 -0
  134. /package/{dist → dist-sdk}/server/src/ai/ai-factory.module.js +0 -0
  135. /package/{dist → dist-sdk}/server/src/ai/ai-factory.service.d.ts +0 -0
  136. /package/{dist → dist-sdk}/server/src/ai/ai-factory.service.js +0 -0
  137. /package/{dist → dist-sdk}/server/src/ai/artifact.module.d.ts +0 -0
  138. /package/{dist → dist-sdk}/server/src/ai/artifact.module.js +0 -0
  139. /package/{dist → dist-sdk}/server/src/ai/artifact.service.d.ts +0 -0
  140. /package/{dist → dist-sdk}/server/src/ai/artifact.service.js +0 -0
  141. /package/{dist → dist-sdk}/server/src/ai/attached-file.module.d.ts +0 -0
  142. /package/{dist → dist-sdk}/server/src/ai/attached-file.module.js +0 -0
  143. /package/{dist → dist-sdk}/server/src/ai/attached-file.service.d.ts +0 -0
  144. /package/{dist → dist-sdk}/server/src/ai/attached-file.service.js +0 -0
  145. /package/{dist → dist-sdk}/server/src/ai/published-agents.service.d.ts +0 -0
  146. /package/{dist → dist-sdk}/server/src/app/balance-message.service.d.ts +0 -0
  147. /package/{dist → dist-sdk}/server/src/app/balance-message.service.js +0 -0
  148. /package/{dist → dist-sdk}/server/src/app/balance.module.d.ts +0 -0
  149. /package/{dist → dist-sdk}/server/src/app/balance.module.js +0 -0
  150. /package/{dist → dist-sdk}/server/src/app/balance.service.d.ts +0 -0
  151. /package/{dist → dist-sdk}/server/src/app/balance.service.js +0 -0
  152. /package/{dist → dist-sdk}/server/src/app/stripe.module.d.ts +0 -0
  153. /package/{dist → dist-sdk}/server/src/app/stripe.module.js +0 -0
  154. /package/{dist → dist-sdk}/server/src/app/transaction.service.d.ts +0 -0
  155. /package/{dist → dist-sdk}/server/src/app/transaction.service.js +0 -0
  156. /package/{dist → dist-sdk}/server/src/app/user-service-factory.d.ts +0 -0
  157. /package/{dist → dist-sdk}/server/src/app/user-service-factory.js +0 -0
  158. /package/{dist → dist-sdk}/server/src/app/user-service-manager.d.ts +0 -0
  159. /package/{dist → dist-sdk}/server/src/app/user-service-manager.js +0 -0
  160. /package/{dist → dist-sdk}/server/src/app.module.d.ts +0 -0
  161. /package/{dist → dist-sdk}/server/src/app.module.js +0 -0
  162. /package/{dist → dist-sdk}/server/src/auth/agent-access.decorator.d.ts +0 -0
  163. /package/{dist → dist-sdk}/server/src/auth/agent-access.decorator.js +0 -0
  164. /package/{dist → dist-sdk}/server/src/auth/auth.controller.d.ts +0 -0
  165. /package/{dist → dist-sdk}/server/src/auth/auth.controller.js +0 -0
  166. /package/{dist → dist-sdk}/server/src/auth/auth.module.d.ts +0 -0
  167. /package/{dist → dist-sdk}/server/src/auth/auth.module.js +0 -0
  168. /package/{dist → dist-sdk}/server/src/auth/auth.service.d.ts +0 -0
  169. /package/{dist → dist-sdk}/server/src/auth/auth.service.js +0 -0
  170. /package/{dist → dist-sdk}/server/src/auth/dto/bot-login.dto.d.ts +0 -0
  171. /package/{dist → dist-sdk}/server/src/auth/dto/bot-login.dto.js +0 -0
  172. /package/{dist → dist-sdk}/server/src/auth/dto/password-reset.dto.d.ts +0 -0
  173. /package/{dist → dist-sdk}/server/src/auth/dto/password-reset.dto.js +0 -0
  174. /package/{dist → dist-sdk}/server/src/auth/dto/phone-login.dto.d.ts +0 -0
  175. /package/{dist → dist-sdk}/server/src/auth/dto/phone-login.dto.js +0 -0
  176. /package/{dist → dist-sdk}/server/src/auth/dto/phone-verification.dto.d.ts +0 -0
  177. /package/{dist → dist-sdk}/server/src/auth/dto/phone-verification.dto.js +0 -0
  178. /package/{dist → dist-sdk}/server/src/auth/jwt-auth.guard.d.ts +0 -0
  179. /package/{dist → dist-sdk}/server/src/auth/jwt-auth.guard.js +0 -0
  180. /package/{dist → dist-sdk}/server/src/auth/jwt.strategy.d.ts +0 -0
  181. /package/{dist → dist-sdk}/server/src/auth/jwt.strategy.js +0 -0
  182. /package/{dist → dist-sdk}/server/src/auth/phone-validation.service.d.ts +0 -0
  183. /package/{dist → dist-sdk}/server/src/auth/phone-validation.service.js +0 -0
  184. /package/{dist → dist-sdk}/server/src/auth/public.decorator.d.ts +0 -0
  185. /package/{dist → dist-sdk}/server/src/auth/public.decorator.js +0 -0
  186. /package/{dist → dist-sdk}/server/src/auth/rate-limit.service.d.ts +0 -0
  187. /package/{dist → dist-sdk}/server/src/auth/rate-limit.service.js +0 -0
  188. /package/{dist → dist-sdk}/server/src/auth/room-access.decorator.d.ts +0 -0
  189. /package/{dist → dist-sdk}/server/src/auth/room-access.decorator.js +0 -0
  190. /package/{dist → dist-sdk}/server/src/auth/scopes.decorator.d.ts +0 -0
  191. /package/{dist → dist-sdk}/server/src/auth/scopes.decorator.js +0 -0
  192. /package/{dist → dist-sdk}/server/src/auth/scopes.guard.d.ts +0 -0
  193. /package/{dist → dist-sdk}/server/src/auth/scopes.guard.js +0 -0
  194. /package/{dist → dist-sdk}/server/src/auth/session.guard.d.ts +0 -0
  195. /package/{dist → dist-sdk}/server/src/auth/session.guard.js +0 -0
  196. /package/{dist → dist-sdk}/server/src/auth/twilio.service.d.ts +0 -0
  197. /package/{dist → dist-sdk}/server/src/auth/twilio.service.js +0 -0
  198. /package/{dist → dist-sdk}/server/src/auth/users.service.d.ts +0 -0
  199. /package/{dist → dist-sdk}/server/src/common/errors.d.ts +0 -0
  200. /package/{dist → dist-sdk}/server/src/common/errors.js +0 -0
  201. /package/{dist → dist-sdk}/server/src/common/logger.d.ts +0 -0
  202. /package/{dist → dist-sdk}/server/src/common/logger.js +0 -0
  203. /package/{dist → dist-sdk}/server/src/config/configuration.module.d.ts +0 -0
  204. /package/{dist → dist-sdk}/server/src/config/configuration.module.js +0 -0
  205. /package/{dist → dist-sdk}/server/src/config/configuration.service.d.ts +0 -0
  206. /package/{dist → dist-sdk}/server/src/room/artifact-store.service.d.ts +0 -0
  207. /package/{dist → dist-sdk}/server/src/room/artifact-store.service.js +0 -0
  208. /package/{dist → dist-sdk}/server/src/room/artifact.d.ts +0 -0
  209. /package/{dist → dist-sdk}/server/src/room/artifact.js +0 -0
  210. /package/{dist → dist-sdk}/server/src/room/message.d.ts +0 -0
  211. /package/{dist → dist-sdk}/server/src/room/message.js +0 -0
  212. /package/{dist → dist-sdk}/server/src/room/published-rooms.service.d.ts +0 -0
  213. /package/{dist → dist-sdk}/server/src/room/room-config.d.ts +0 -0
  214. /package/{dist → dist-sdk}/server/src/room/room-config.js +0 -0
  215. /package/{dist → dist-sdk}/server/src/room/room-factory.d.ts +0 -0
  216. /package/{dist → dist-sdk}/server/src/room/room-factory.js +0 -0
  217. /package/{dist → dist-sdk}/server/src/room/room-message.module.d.ts +0 -0
  218. /package/{dist → dist-sdk}/server/src/room/room-message.module.js +0 -0
  219. /package/{dist → dist-sdk}/server/src/room/room-message.service.d.ts +0 -0
  220. /package/{dist → dist-sdk}/server/src/room/room-message.service.js +0 -0
  221. /package/{dist → dist-sdk}/server/src/room/room-store.module.d.ts +0 -0
  222. /package/{dist → dist-sdk}/server/src/room/room-store.module.js +0 -0
  223. /package/{dist → dist-sdk}/server/src/room/room-store.service.d.ts +0 -0
  224. /package/{dist → dist-sdk}/server/src/room/room-store.service.js +0 -0
  225. /package/{dist → dist-sdk}/server/src/room/room.d.ts +0 -0
  226. /package/{dist → dist-sdk}/server/src/sdk/briyah-config.d.ts +0 -0
  227. /package/{dist → dist-sdk}/server/src/sdk/briyah.d.ts +0 -0
  228. /package/{dist → dist-sdk}/server/src/sdk/index.d.ts +0 -0
  229. /package/{dist → dist-sdk}/server/src/sdk/index.js +0 -0
  230. /package/{dist → dist-sdk}/server/src/shared/shared.module.d.ts +0 -0
  231. /package/{dist → dist-sdk}/server/src/shared/shared.module.js +0 -0
  232. /package/{dist → dist-sdk}/server/src/story/story-message.service.d.ts +0 -0
  233. /package/{dist → dist-sdk}/server/src/story/story-progress.service.d.ts +0 -0
  234. /package/{dist → dist-sdk}/server/src/story/story-progress.service.js +0 -0
  235. /package/{dist → dist-sdk}/server/src/story/story-store.module.d.ts +0 -0
  236. /package/{dist → dist-sdk}/server/src/story/story-store.module.js +0 -0
  237. /package/{dist → dist-sdk}/server/src/story/story-store.service.d.ts +0 -0
  238. /package/{dist → dist-sdk}/server/src/story/story-store.service.js +0 -0
  239. /package/{dist → dist-sdk}/shared/types/app.types.js +0 -0
@@ -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,6 +1440,9 @@ 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
  };
@@ -2076,6 +2107,16 @@ __decorate([
2076
2107
  __metadata("design:paramtypes", [Object, String]),
2077
2108
  __metadata("design:returntype", Promise)
2078
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);
2079
2120
  __decorate([
2080
2121
  (0, common_1.Post)('rooms/:roomId/reset'),
2081
2122
  (0, common_1.HttpCode)(common_1.HttpStatus.NO_CONTENT),
@@ -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>;
@@ -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) {
@@ -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)) {
@@ -23,44 +23,36 @@ let StoryMessageService = class StoryMessageService {
23
23
  return this.messageEmitters.get(storyId);
24
24
  }
25
25
  emitStoryState(storyId, state) {
26
- const emitter = this.messageEmitters.get(storyId);
27
- if (emitter) {
28
- const payload = { type: 'story-state', state, timestamp: Date.now() };
29
- emitter.emit('story-state', payload);
30
- }
26
+ const emitter = this.getOrCreateEmitter(storyId);
27
+ const payload = { type: 'story-state', state, timestamp: Date.now() };
28
+ emitter.emit('story-state', payload);
31
29
  }
32
30
  emitIntroduceCharacter(storyId, characterName) {
33
- const emitter = this.messageEmitters.get(storyId);
34
- if (emitter) {
35
- const payload = {
36
- type: 'suggest-introduce-character',
37
- characterName,
38
- timestamp: Date.now(),
39
- };
40
- emitter.emit('suggest-introduce-character', payload);
41
- }
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);
42
38
  }
43
39
  emitProgressChapter(storyId) {
44
- const emitter = this.messageEmitters.get(storyId);
45
- if (emitter) {
46
- const payload = {
47
- type: 'suggest-progress-chapter',
48
- timestamp: Date.now(),
49
- };
50
- emitter.emit('suggest-progress-chapter', payload);
51
- }
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);
52
46
  }
53
47
  emitError(storyId, error) {
54
- const emitter = this.messageEmitters.get(storyId);
55
- if (emitter) {
56
- const payload = {
57
- type: 'story-error',
58
- errorType: error.name,
59
- message: error.message,
60
- timestamp: Date.now(),
61
- };
62
- emitter.emit('story-error', payload);
63
- }
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);
64
56
  }
65
57
  cleanup(storyId) {
66
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;
@@ -74,6 +74,7 @@ let StoryService = class StoryService {
74
74
  agentFactory;
75
75
  roomFactory;
76
76
  storyArtifactServices = new Map();
77
+ chaptersInProgress = new Set();
77
78
  constructor(storyStore, agentStore, roomStore, progressService, messageService, configService, agentFactory, roomFactory) {
78
79
  this.storyStore = storyStore;
79
80
  this.agentStore = agentStore;
@@ -254,6 +255,7 @@ let StoryService = class StoryService {
254
255
  }
255
256
  const storyInfo = this.storyStore.createStory(name);
256
257
  storyInfo.turnNumber = 0;
258
+ let storyTitle = name;
257
259
  try {
258
260
  this.progressService.createProgressEmitter(storyInfo.id);
259
261
  this.progressService.emitProgress(storyInfo.id, 'start', 'Starting story creation...');
@@ -270,7 +272,7 @@ let StoryService = class StoryService {
270
272
  }
271
273
  if (!aiServiceName || !aiModelName)
272
274
  throw new Error(`Failed to find model config for "${storyModel}"`);
273
- let moderator = this.agentFactory.createAgent(process.env.MODERATOR_AI_SERVICE || aiServiceName, 'Moderator', '', 'Story moderator responsible for message routing and conversation flow', 'story_moderator', process.env.MODERATOR_AI_MODEL || aiModelName, storyAgentsDir, storyArtifactService);
275
+ let moderator = this.agentFactory.createAgent(process.env.MODERATOR_AI_SERVICE || aiServiceName, `${storyTitle} - Moderator`, 'Moderator', 'Story moderator responsible for message routing and conversation flow', 'story_moderator', process.env.MODERATOR_AI_MODEL || aiModelName, storyAgentsDir, storyArtifactService);
274
276
  moderator.maxHistoryMessages = 16;
275
277
  moderator.reasoningEffort = 'low';
276
278
  moderator.promptCacheTTL = 60;
@@ -281,14 +283,14 @@ let StoryService = class StoryService {
281
283
  const artist = this.createArtistAgent(storyInfo.id, storyAgentsDir, storyArtifactService, imageModelName);
282
284
  let illustrator = null;
283
285
  if (artist) {
284
- illustrator = this.agentFactory.createAgent(process.env.MODERATOR_AI_SERVICE || aiServiceName, 'Illustrator', '', 'Visual artist for generating scene illustrations', 'illustrator', process.env.MODERATOR_AI_MODEL || aiModelName, storyAgentsDir, storyArtifactService);
286
+ illustrator = this.agentFactory.createAgent(process.env.MODERATOR_AI_SERVICE || aiServiceName, `${storyTitle} - Illustrator`, 'Illustrator', 'Visual artist for generating scene illustrations', 'illustrator', process.env.MODERATOR_AI_MODEL || aiModelName, storyAgentsDir, storyArtifactService);
285
287
  illustrator.maxHistoryMessages = 10;
286
288
  illustrator.promptCacheTTL = 60;
287
289
  illustrator.ownerRoomId = storyInfo.id;
288
290
  illustrator.save();
289
291
  logger_1.logger.log(`Created illustrator agent: ${illustrator.agentName}`);
290
292
  }
291
- let narrator = this.agentFactory.createAgent(aiServiceName, 'Narrator', '', 'Story narrator. Should receive all messages where a character wants to perform an action or PASS or INTRODUCE a new character. Responds to all dialog with characters not listed in Available Agents.', 'narrator', aiModelName, storyAgentsDir, storyArtifactService);
293
+ let narrator = this.agentFactory.createAgent(aiServiceName, `${storyTitle} - Narrator`, 'Narrator', 'Story narrator. Should receive all messages where a character wants to perform an action or PASS or INTRODUCE a new character. Responds to all dialog with characters not listed in Available Agents.', 'narrator', aiModelName, storyAgentsDir, storyArtifactService);
292
294
  narrator.reasoningEffort = 'low';
293
295
  narrator.allowSearch = true;
294
296
  narrator.promptCacheTTL = 60;
@@ -974,6 +976,21 @@ let StoryService = class StoryService {
974
976
  const introducedCharPlotPlanArtifact = introducedCharArtifacts.find((a) => a.name === 'Plot Plan');
975
977
  const introducedCharPlotPlan = introducedCharPlotPlanArtifact?.body || '';
976
978
  await this.updateCharacterProfiles(room, [characterAgent], introducedCharPlotPlan);
979
+ if (!story.characters) {
980
+ story.characters = [];
981
+ }
982
+ if (!story.characters.some((c) => c.name === characterName)) {
983
+ story.characters.push({
984
+ name: characterName,
985
+ description: characterAgent.description,
986
+ isControlledByHuman: false,
987
+ });
988
+ }
989
+ if (story.pendingSuggestion?.type === 'suggest-introduce-character' &&
990
+ story.pendingSuggestion.characterName === characterName) {
991
+ story.pendingSuggestion = undefined;
992
+ }
993
+ this.storyStore.updateStoryMetadata(storyId, story);
977
994
  try {
978
995
  const artifactId = await this.generateCharacterPortrait(room, characterAgent, storyId);
979
996
  if (artifactId) {
@@ -1000,9 +1017,13 @@ let StoryService = class StoryService {
1000
1017
  }
1001
1018
  if (!story.declinedCharacters.includes(characterName)) {
1002
1019
  story.declinedCharacters.push(characterName);
1003
- this.storyStore.updateStoryMetadata(storyId, story);
1004
1020
  logger_1.logger.log(`Recorded declined character: ${characterName} for story ${storyId}`);
1005
1021
  }
1022
+ if (story.pendingSuggestion?.type === 'suggest-introduce-character' &&
1023
+ story.pendingSuggestion.characterName === characterName) {
1024
+ story.pendingSuggestion = undefined;
1025
+ }
1026
+ this.storyStore.updateStoryMetadata(storyId, story);
1006
1027
  }
1007
1028
  async deleteCharacter(storyId, characterName) {
1008
1029
  let room;
@@ -1029,6 +1050,17 @@ let StoryService = class StoryService {
1029
1050
  room.setAgents(filteredAgents);
1030
1051
  room.saveMetadata();
1031
1052
  this.agentStore.removeAgent(agent.id);
1053
+ const story = this.storyStore.getStory(storyId);
1054
+ if (story?.characters) {
1055
+ const filtered = story.characters.filter((c) => {
1056
+ const firstWord = c.name.trim().split(/\s+/)[0];
1057
+ return c.name !== characterName && firstWord !== characterName;
1058
+ });
1059
+ if (filtered.length !== story.characters.length) {
1060
+ story.characters = filtered;
1061
+ this.storyStore.updateStoryMetadata(storyId, story);
1062
+ }
1063
+ }
1032
1064
  }
1033
1065
  async deleteStory(storyId) {
1034
1066
  logger_1.logger.log(`Deleting story ${storyId}...`);
@@ -1132,7 +1164,7 @@ let StoryService = class StoryService {
1132
1164
  return;
1133
1165
  }
1134
1166
  try {
1135
- await this.compactAgentHistory(agent);
1167
+ await agent.compact();
1136
1168
  }
1137
1169
  catch (error) {
1138
1170
  logger_1.logger.error(`Error compacting ${agent.agentName}:`, error);
@@ -1157,36 +1189,54 @@ let StoryService = class StoryService {
1157
1189
  if (!story) {
1158
1190
  throw new Error('Story not found');
1159
1191
  }
1160
- const existingEmitter = this.progressService.getProgressEmitter(storyId);
1161
- if (!existingEmitter) {
1162
- this.progressService.createProgressEmitter(storyId);
1192
+ if (this.chaptersInProgress.has(storyId)) {
1193
+ throw new errors_1.OperationFailedError('Chapter progression is already in progress for this story');
1163
1194
  }
1164
- const room = await this.getStoryRoom(storyId);
1165
- room.setCurrentSpeaker('system');
1166
- this.progressService.emitProgress(storyId, 'opening-scene', 'Generating opening scene of chapter...');
1167
- const agents = room.getAgents();
1168
- const narrator = agents.find((agent) => agent.promptFolder === 'narrator');
1169
- const { openingScene, chapterTitle } = await this.generateOpeningScene(room, narrator);
1170
- this.progressService.emitProgress(storyId, 'chapter-backup', `Saving previous chapter: "${chapterTitle}"...`);
1171
- const chapterIndex = this.storyStore.getNextChapterIndex(storyId);
1172
- const backupSuccess = this.storyStore.createChapterBackup(storyId, chapterIndex, chapterTitle);
1173
- if (!backupSuccess) {
1174
- throw new Error('Failed to backup chapter');
1175
- }
1176
- room.clearRoomMessages();
1177
- this.populateStoryHistory(room, openingScene);
1178
- const humanAgent = room.getAgents().find((a) => a.isControlledByHuman);
1179
- if (humanAgent) {
1180
- room.setCurrentSpeaker(humanAgent.agentNickname);
1181
- }
1182
- this.progressService.emitProgress(storyId, 'ready', 'Chapter opening is ready! Continuing chapter progression in the background...');
1183
- setImmediate(() => {
1184
- this.progressStoryToNextChapterAsync(storyId).catch((error) => {
1185
- logger_1.logger.error('Error in async chapter progression:', error);
1186
- this.progressService.emitProgress(storyId, 'error', `Error: ${error.message}`);
1195
+ this.chaptersInProgress.add(storyId);
1196
+ try {
1197
+ if (story.pendingSuggestion?.type === 'suggest-progress-chapter') {
1198
+ story.pendingSuggestion = undefined;
1199
+ this.storyStore.updateStoryMetadata(storyId, story);
1200
+ }
1201
+ const existingEmitter = this.progressService.getProgressEmitter(storyId);
1202
+ if (!existingEmitter) {
1203
+ this.progressService.createProgressEmitter(storyId);
1204
+ }
1205
+ const room = await this.getStoryRoom(storyId);
1206
+ room.setCurrentSpeaker('system');
1207
+ this.progressService.emitProgress(storyId, 'opening-scene', 'Generating opening scene of chapter...');
1208
+ const agents = room.getAgents();
1209
+ const narrator = agents.find((agent) => agent.promptFolder === 'narrator');
1210
+ const { openingScene, chapterTitle } = await this.generateOpeningScene(room, narrator);
1211
+ this.progressService.emitProgress(storyId, 'chapter-backup', `Saving previous chapter: "${chapterTitle}"...`);
1212
+ const chapterIndex = this.storyStore.getNextChapterIndex(storyId);
1213
+ const backupSuccess = this.storyStore.createChapterBackup(storyId, chapterIndex, chapterTitle);
1214
+ if (!backupSuccess) {
1215
+ throw new Error('Failed to backup chapter');
1216
+ }
1217
+ room.clearRoomMessages();
1218
+ this.populateStoryHistory(room, openingScene);
1219
+ const humanAgent = room.getAgents().find((a) => a.isControlledByHuman);
1220
+ if (humanAgent) {
1221
+ room.setCurrentSpeaker(humanAgent.agentNickname);
1222
+ }
1223
+ this.progressService.emitProgress(storyId, 'ready', 'Chapter opening is ready! Continuing chapter progression in the background...');
1224
+ setImmediate(() => {
1225
+ this.progressStoryToNextChapterAsync(storyId)
1226
+ .catch((error) => {
1227
+ logger_1.logger.error('Error in async chapter progression:', error);
1228
+ this.progressService.emitProgress(storyId, 'error', `Error: ${error.message}`);
1229
+ })
1230
+ .finally(() => {
1231
+ this.chaptersInProgress.delete(storyId);
1232
+ });
1187
1233
  });
1188
- });
1189
- return { chapterIndex };
1234
+ return { chapterIndex };
1235
+ }
1236
+ catch (err) {
1237
+ this.chaptersInProgress.delete(storyId);
1238
+ throw err;
1239
+ }
1190
1240
  }
1191
1241
  async progressStoryToNextChapterAsync(storyId) {
1192
1242
  let room = null;
@@ -1251,50 +1301,16 @@ let StoryService = class StoryService {
1251
1301
  await Promise.all(agents.map(async (agent) => {
1252
1302
  let numMessageChars = agent.history?.map((m) => m.content?.length).reduce((a, b) => a + b, 0);
1253
1303
  if (numMessageChars > threshold) {
1254
- await this.compactAgentHistory(agent);
1255
- }
1256
- else {
1257
- return Promise.resolve();
1304
+ try {
1305
+ await agent.compact();
1306
+ }
1307
+ catch (error) {
1308
+ logger_1.logger.error(`Error compacting ${agent.agentName}:`, error);
1309
+ throw error;
1310
+ }
1258
1311
  }
1259
1312
  }));
1260
1313
  }
1261
- async compactAgentHistory(agent) {
1262
- const originalHistory = [...agent.history];
1263
- const originalLength = originalHistory.length;
1264
- if (originalHistory.length == 0) {
1265
- return {
1266
- success: true,
1267
- originalLength: originalLength,
1268
- newLength: originalLength,
1269
- message: 'No conversation history to compact',
1270
- };
1271
- }
1272
- const formattedHistory = agent.getFormattedMessages(0);
1273
- try {
1274
- agent.history = [];
1275
- const summaryResponse = await agent.preparedPrompt('compact_story', {
1276
- agentName: agent.agentNickname,
1277
- formattedHistory: formattedHistory,
1278
- }, false);
1279
- const summary = summaryResponse?.summary || summaryResponse;
1280
- agent.addToConversationHistory(`[CONVERSATION HISTORY SUMMARY]\n\n${summary}`, true);
1281
- const newLength = agent.history.length;
1282
- logger_1.logger.log(`Compacted ${agent.agentName}: ${originalLength} messages`);
1283
- agent.save();
1284
- return {
1285
- success: true,
1286
- originalLength: originalLength,
1287
- newLength: newLength,
1288
- message: `${originalLength} messages -> ${newLength} messages`,
1289
- summary: summary,
1290
- };
1291
- }
1292
- catch (error) {
1293
- agent.history = originalHistory;
1294
- logger_1.logger.error(`Error compacting ${agent.agentName}:`, error);
1295
- throw error;
1296
- }
1297
- }
1298
1314
  extractMarkdownContent(response) {
1299
1315
  const fenceMatch = response.match(/```(?:markdown)?\s*\n([\s\S]*?)```/);
1300
1316
  if (fenceMatch) {
@@ -1415,12 +1431,13 @@ let StoryService = class StoryService {
1415
1431
  }
1416
1432
  }
1417
1433
  createArtistAgent(storyId, storyAgentsDir, storyArtifactService, imageModelName) {
1434
+ const storyInfo = this.storyStore.getStory(storyId);
1418
1435
  const imageConfig = this.getImageModelConfig(imageModelName);
1419
1436
  if (!imageConfig) {
1420
1437
  logger_1.logger.log('Artist agent creation skipped: images disabled');
1421
1438
  return null;
1422
1439
  }
1423
- const artistAgent = this.agentFactory.createAgent(imageConfig.service, 'Artist', '', 'AI artist for generating character portraits and scene illustrations', 'default', imageConfig.model, storyAgentsDir, storyArtifactService);
1440
+ const artistAgent = this.agentFactory.createAgent(imageConfig.service, `${storyInfo.name} - Artist`, 'Artist', 'AI artist for generating character portraits and scene illustrations', 'default', imageConfig.model, storyAgentsDir, storyArtifactService);
1424
1441
  artistAgent.maxHistoryMessages = 10;
1425
1442
  artistAgent.promptCacheTTL = 0;
1426
1443
  artistAgent.save();
@@ -1622,8 +1639,12 @@ let StoryService = class StoryService {
1622
1639
  if (progressChapter) {
1623
1640
  if (story) {
1624
1641
  story.declinedCharacters = [];
1625
- this.storyStore.updateStoryMetadata(storyId, story);
1626
1642
  }
1643
+ story.pendingSuggestion = {
1644
+ type: 'suggest-progress-chapter',
1645
+ timestamp: Date.now(),
1646
+ };
1647
+ this.storyStore.updateStoryMetadata(storyId, story);
1627
1648
  this.messageService.emitProgressChapter(storyId);
1628
1649
  return;
1629
1650
  }
@@ -1638,6 +1659,12 @@ let StoryService = class StoryService {
1638
1659
  logger_1.logger.log(`Character ${newCharacterName} was declined, skipping prompt`);
1639
1660
  return;
1640
1661
  }
1662
+ story.pendingSuggestion = {
1663
+ type: 'suggest-introduce-character',
1664
+ characterName: newCharacterName,
1665
+ timestamp: Date.now(),
1666
+ };
1667
+ this.storyStore.updateStoryMetadata(storyId, story);
1641
1668
  this.messageService.emitIntroduceCharacter(storyId, newCharacterName);
1642
1669
  }
1643
1670
  return;
@@ -220,6 +220,7 @@ export interface StoryInfo {
220
220
  totalOutputTokens: number;
221
221
  turnNumber: number;
222
222
  declinedCharacters?: string[];
223
+ pendingSuggestion?: StoryIntroduceCharacterEvent | StoryProgressChapterEvent;
223
224
  }
224
225
  export interface CreateStoryResponse {
225
226
  storyId: string;
@@ -1 +1 @@
1
- window.hierarchyData = "eJx1jc0KwjAQhN9lzqklLRbdd/DitfQQ2tUG0wSy8VTy7hL/KIKngZ1v51sRQ0gC6jvdDgqRL47HZIMX0IpOtyW8WRiEE4uYK0PhZv0Eavadwj06EKxPHC9mZKnf1G5Oi4PC6IwICEmmqrxVX7SUs3VTZA/qtdbHISuU3DjPISy/Xt0cPt7nOku9wf6KX4ec8wP/YVA+"
1
+ window.hierarchyData = "eJx1jc0KwjAQhN9lzqkliq3sO3jxWnoI7dYG0wSy8VTy7hL/KIKngZ1v51sRQ0gC6hrd9gqRJ8dDssELaEWj2xLeLAzCmUXMlaFws34E7Y+Nwj06EKxPHCczsNRvajenxUFhcEYEhCRjVd6qL1rK2boxsgd1Wh90nxVKbpyXEJZfr96fPt7nOku9wf6KX4ec8wMBuFA6"