briyah 1.0.7 → 1.0.8
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.
- package/README.md +31 -21
- package/dist/server/src/ai/LLM/anthropic.service.js +16 -8
- package/dist/server/src/ai/LLM/base-ai.service.js +5 -4
- package/dist/server/src/ai/LLM/deepseek.service.js +8 -6
- package/dist/server/src/ai/LLM/fal.service.js +15 -14
- package/dist/server/src/ai/LLM/googleai.service.js +10 -8
- package/dist/server/src/ai/LLM/grok.service.js +9 -7
- package/dist/server/src/ai/LLM/mock.service.js +7 -6
- package/dist/server/src/ai/LLM/openai.service.js +15 -13
- package/dist/server/src/ai/LLM/together.service.js +10 -8
- package/dist/server/src/ai/LLM/vertexai.service.js +10 -9
- package/dist/server/src/ai/agent-store.service.js +12 -11
- package/dist/server/src/ai/artifact.service.js +7 -6
- package/dist/server/src/ai/attached-file.service.js +8 -7
- package/dist/server/src/ai/published-agents.service.js +5 -4
- package/dist/server/src/app/balance.service.js +7 -6
- package/dist/server/src/app/stripe.controller.js +12 -11
- package/dist/server/src/app/stripe.service.js +20 -19
- package/dist/server/src/app/transaction.service.js +6 -5
- package/dist/server/src/app/user-service-manager.js +6 -5
- package/dist/server/src/app.controller.js +95 -94
- package/dist/server/src/app.service.js +31 -30
- package/dist/server/src/auth/auth.controller.js +21 -20
- package/dist/server/src/auth/jwt-auth.guard.js +4 -3
- package/dist/server/src/auth/rate-limit.service.d.ts +0 -1
- package/dist/server/src/auth/rate-limit.service.js +6 -7
- package/dist/server/src/auth/twilio.service.js +4 -3
- package/dist/server/src/auth/users.service.js +5 -4
- package/dist/server/src/common/logger.d.ts +21 -0
- package/dist/server/src/common/logger.js +83 -0
- package/dist/server/src/room/artifact-store.service.d.ts +0 -1
- package/dist/server/src/room/artifact-store.service.js +16 -17
- package/dist/server/src/room/published-rooms.service.js +3 -2
- package/dist/server/src/room/room-store.service.js +17 -16
- package/dist/server/src/room/room.js +14 -13
- package/dist/server/src/sdk/briyah-config.d.ts +7 -0
- package/dist/server/src/sdk/briyah-config.js +1 -0
- package/dist/server/src/sdk/briyah.js +13 -4
- package/dist/server/src/sdk/index.d.ts +2 -1
- package/dist/server/src/story/story-progress.service.js +2 -1
- package/dist/server/src/story/story-store.service.js +28 -27
- package/dist/server/src/story/story.service.js +113 -112
- package/docs/.nojekyll +1 -0
- package/docs/assets/hierarchy.js +1 -0
- package/docs/assets/highlight.css +106 -0
- package/docs/assets/icons.js +18 -0
- package/docs/assets/icons.svg +1 -0
- package/docs/assets/main.js +60 -0
- package/docs/assets/navigation.js +1 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +1633 -0
- package/docs/classes/Agent.html +87 -0
- package/docs/classes/Briyah.html +64 -0
- package/docs/classes/BriyahConfigService.html +12 -0
- package/docs/classes/Room.html +119 -0
- package/docs/enums/MessageAction.html +13 -0
- package/docs/hierarchy.html +1 -0
- package/docs/index.html +136 -0
- package/docs/interfaces/AgentInfo.html +17 -0
- package/docs/interfaces/AgentMessagesResponse.html +5 -0
- package/docs/interfaces/AppService.html +680 -0
- package/docs/interfaces/ArtifactMetadata.html +8 -0
- package/docs/interfaces/AttachDocumentResponse.html +3 -0
- package/docs/interfaces/BriyahConfigOptions.html +16 -0
- package/docs/interfaces/ChapterInfo.html +3 -0
- package/docs/interfaces/Character.html +7 -0
- package/docs/interfaces/CreateAgentResponse.html +2 -0
- package/docs/interfaces/CreateRoomResponse.html +3 -0
- package/docs/interfaces/CreateStoryResponse.html +2 -0
- package/docs/interfaces/FileList.html +2 -0
- package/docs/interfaces/LoggingOptions.html +9 -0
- package/docs/interfaces/Message.html +6 -0
- package/docs/interfaces/ModelInfo.html +5 -0
- package/docs/interfaces/PreparedPromptResponse.html +3 -0
- package/docs/interfaces/ProcessTextResponse.html +7 -0
- package/docs/interfaces/PromptFile.html +3 -0
- package/docs/interfaces/PromptFileContent.html +3 -0
- package/docs/interfaces/PromptFilesResponse.html +2 -0
- package/docs/interfaces/PromptFolder.html +3 -0
- package/docs/interfaces/PromptFoldersResponse.html +2 -0
- package/docs/interfaces/RoomDetails.html +9 -0
- package/docs/interfaces/RoomInfo.html +5 -0
- package/docs/interfaces/RoomMessagesResponse.html +3 -0
- package/docs/interfaces/StoryIdea.html +5 -0
- package/docs/interfaces/StoryInfo.html +21 -0
- package/docs/interfaces/StoryState.html +9 -0
- package/docs/modules.html +1 -0
- package/docs/types/PromptScope.html +1 -0
- package/package.json +6 -3
- package/data/common/config/story_ideas.txt +0 -6
|
@@ -63,6 +63,7 @@ const archiver_1 = __importDefault(require("archiver"));
|
|
|
63
63
|
const yauzl = __importStar(require("yauzl"));
|
|
64
64
|
const message_1 = require("../room/message");
|
|
65
65
|
const errors_1 = require("../common/errors");
|
|
66
|
+
const logger_1 = require("../common/logger");
|
|
66
67
|
let StoryService = class StoryService {
|
|
67
68
|
storyStore;
|
|
68
69
|
agentStore;
|
|
@@ -108,19 +109,19 @@ let StoryService = class StoryService {
|
|
|
108
109
|
try {
|
|
109
110
|
let story = await this.ensureStoryLoaded(storyId);
|
|
110
111
|
if (!story) {
|
|
111
|
-
|
|
112
|
+
logger_1.logger.error(`Story ${storyId} not found for state update`);
|
|
112
113
|
return;
|
|
113
114
|
}
|
|
114
115
|
const room = await this.roomStore.getRoom(story.roomId);
|
|
115
116
|
if (!room) {
|
|
116
|
-
|
|
117
|
+
logger_1.logger.error(`Room ${story.roomId} not found for story ${storyId}`);
|
|
117
118
|
return;
|
|
118
119
|
}
|
|
119
120
|
await this.updateStoryCost(storyId);
|
|
120
121
|
story = await this.getStoryInfo(storyId);
|
|
121
122
|
const humanAgent = room.getAgents().find((agent) => agent.isControlledByHuman);
|
|
122
123
|
if (!humanAgent) {
|
|
123
|
-
|
|
124
|
+
logger_1.logger.error(`No human agent found for story ${storyId}`);
|
|
124
125
|
return;
|
|
125
126
|
}
|
|
126
127
|
const roomMessages = room.getLatestRoomMessages(0, true);
|
|
@@ -143,7 +144,7 @@ let StoryService = class StoryService {
|
|
|
143
144
|
});
|
|
144
145
|
}
|
|
145
146
|
catch (error) {
|
|
146
|
-
|
|
147
|
+
logger_1.logger.error(`Error emitting story state update for ${storyId}:`, error);
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
getHumanPrompt(room) {
|
|
@@ -165,7 +166,7 @@ let StoryService = class StoryService {
|
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
handleRoomError(storyId, error) {
|
|
168
|
-
|
|
169
|
+
logger_1.logger.log(`Room error for story ${storyId}: ${error.name} - ${error.message}`);
|
|
169
170
|
this.messageService.emitError(storyId, error);
|
|
170
171
|
}
|
|
171
172
|
getRandomWord() {
|
|
@@ -194,11 +195,11 @@ let StoryService = class StoryService {
|
|
|
194
195
|
model: modelConfig.model,
|
|
195
196
|
};
|
|
196
197
|
}
|
|
197
|
-
|
|
198
|
+
logger_1.logger.warn(`Story model "${storyModel}" not found in story_models.json`);
|
|
198
199
|
return null;
|
|
199
200
|
}
|
|
200
201
|
catch (error) {
|
|
201
|
-
|
|
202
|
+
logger_1.logger.error(`Error reading story_models.json:`, error);
|
|
202
203
|
return null;
|
|
203
204
|
}
|
|
204
205
|
}
|
|
@@ -218,7 +219,7 @@ let StoryService = class StoryService {
|
|
|
218
219
|
if (!story)
|
|
219
220
|
return null;
|
|
220
221
|
if (!story.roomId) {
|
|
221
|
-
|
|
222
|
+
logger_1.logger.error(`Story ${storyId} has no roomId. Deleting story from storage...`);
|
|
222
223
|
this.storyStore.removeStory(storyId);
|
|
223
224
|
return null;
|
|
224
225
|
}
|
|
@@ -279,7 +280,7 @@ let StoryService = class StoryService {
|
|
|
279
280
|
moderator.ownerRoomId = storyInfo.id;
|
|
280
281
|
moderator.markupRate = 0;
|
|
281
282
|
moderator.save();
|
|
282
|
-
|
|
283
|
+
logger_1.logger.log(`Created moderator agent: ${moderator.agentName}`);
|
|
283
284
|
const artist = this.createArtistAgent(storyInfo.id, storyAgentsDir, storyArtifactService, imageModelName);
|
|
284
285
|
let illustrator = null;
|
|
285
286
|
if (artist) {
|
|
@@ -288,7 +289,7 @@ let StoryService = class StoryService {
|
|
|
288
289
|
illustrator.promptCacheTTL = 60;
|
|
289
290
|
illustrator.ownerRoomId = storyInfo.id;
|
|
290
291
|
illustrator.save();
|
|
291
|
-
|
|
292
|
+
logger_1.logger.log(`Created illustrator agent: ${illustrator.agentName}`);
|
|
292
293
|
}
|
|
293
294
|
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);
|
|
294
295
|
narrator.reasoningEffort = 'low';
|
|
@@ -296,7 +297,7 @@ let StoryService = class StoryService {
|
|
|
296
297
|
narrator.promptCacheTTL = 60;
|
|
297
298
|
narrator.ownerRoomId = storyInfo.id;
|
|
298
299
|
narrator.save();
|
|
299
|
-
|
|
300
|
+
logger_1.logger.log(`Created narrator agent: ${narrator.agentName}`);
|
|
300
301
|
narrator.disableMarkup = true;
|
|
301
302
|
narrator.disableBalanceCheck = true;
|
|
302
303
|
narrator.save();
|
|
@@ -319,7 +320,7 @@ let StoryService = class StoryService {
|
|
|
319
320
|
if (isImport) {
|
|
320
321
|
importedStoryText = idea;
|
|
321
322
|
}
|
|
322
|
-
|
|
323
|
+
logger_1.logger.log(`Story framework extracted: ${otherCharactersInfo.length} other characters`);
|
|
323
324
|
const characters = [
|
|
324
325
|
{
|
|
325
326
|
name: userCharacterInfo.name,
|
|
@@ -349,13 +350,13 @@ let StoryService = class StoryService {
|
|
|
349
350
|
userAgent.isControlledByHuman = true;
|
|
350
351
|
userAgent.ownerRoomId = storyInfo.id;
|
|
351
352
|
userAgent.save();
|
|
352
|
-
|
|
353
|
+
logger_1.logger.log(`Created human-controlled character agent: ${userCharacterName}`);
|
|
353
354
|
userAgent.disableMarkup = true;
|
|
354
355
|
userAgent.disableBalanceCheck = true;
|
|
355
356
|
userAgent.save();
|
|
356
357
|
}
|
|
357
358
|
catch (error) {
|
|
358
|
-
|
|
359
|
+
logger_1.logger.error('Error creating user character:', error);
|
|
359
360
|
throw error;
|
|
360
361
|
}
|
|
361
362
|
const characterAgents = [];
|
|
@@ -367,17 +368,17 @@ let StoryService = class StoryService {
|
|
|
367
368
|
agent.promptCacheTTL = 60;
|
|
368
369
|
agent.ownerRoomId = storyInfo.id;
|
|
369
370
|
agent.save();
|
|
370
|
-
|
|
371
|
+
logger_1.logger.log(`Created character agent: ${charInfo.name}`);
|
|
371
372
|
agent.disableMarkup = true;
|
|
372
373
|
agent.disableBalanceCheck = true;
|
|
373
374
|
agent.save();
|
|
374
375
|
characterAgents.push(agent);
|
|
375
376
|
}
|
|
376
377
|
catch (error) {
|
|
377
|
-
|
|
378
|
+
logger_1.logger.error(`Error creating character ${charInfo.name}:`, error);
|
|
378
379
|
}
|
|
379
380
|
}
|
|
380
|
-
|
|
381
|
+
logger_1.logger.log(`Created ${characterAgents.length + (userAgent ? 1 : 0)} character agents`);
|
|
381
382
|
const room = this.roomFactory.createRoom(`Story: ${name}`, scenario, '', storyRoomsDir);
|
|
382
383
|
room.arrive(moderator);
|
|
383
384
|
room.arrive(narrator);
|
|
@@ -396,7 +397,7 @@ let StoryService = class StoryService {
|
|
|
396
397
|
]);
|
|
397
398
|
this.populateStoryHistory(room, openingScene);
|
|
398
399
|
const totalCharacters = (userAgent ? 1 : 0) + characterAgents.length;
|
|
399
|
-
|
|
400
|
+
logger_1.logger.log(`Created story room: ${roomId} with moderator, narrator, and ${totalCharacters} character agents`);
|
|
400
401
|
if (userAgent) {
|
|
401
402
|
room.setCurrentSpeaker(userAgent.agentNickname);
|
|
402
403
|
}
|
|
@@ -422,18 +423,18 @@ let StoryService = class StoryService {
|
|
|
422
423
|
room.ready();
|
|
423
424
|
setImmediate(() => {
|
|
424
425
|
this.createStoryAsync(storyInfo.id, name, importedStoryText, isImport).catch((error) => {
|
|
425
|
-
|
|
426
|
+
logger_1.logger.error('Error in async story creation:', error);
|
|
426
427
|
this.progressService.emitProgress(storyInfo.id, 'error', `Error: ${error.message}`);
|
|
427
428
|
this.progressService.cleanup(storyInfo.id);
|
|
428
429
|
this.deleteStory(storyInfo.id).catch((cleanupError) => {
|
|
429
|
-
|
|
430
|
+
logger_1.logger.error('Error cleaning up story after async failure:', cleanupError);
|
|
430
431
|
});
|
|
431
432
|
});
|
|
432
433
|
});
|
|
433
434
|
return storyInfo;
|
|
434
435
|
}
|
|
435
436
|
catch (error) {
|
|
436
|
-
|
|
437
|
+
logger_1.logger.error('Error creating story:', error);
|
|
437
438
|
this.progressService.emitProgress(storyInfo.id, 'error', `Error: ${error.message}`);
|
|
438
439
|
this.progressService.cleanup(storyInfo.id);
|
|
439
440
|
await this.deleteStory(storyInfo.id);
|
|
@@ -471,13 +472,13 @@ let StoryService = class StoryService {
|
|
|
471
472
|
room.publishArtifact('Plot Plan', narrator.agentNickname, cleanedPlotPlan, [
|
|
472
473
|
narrator.agentNickname,
|
|
473
474
|
]);
|
|
474
|
-
|
|
475
|
+
logger_1.logger.log(`Published plot plan artifact to narrator`);
|
|
475
476
|
this.progressService.emitProgress(storyInfo.id, 'profiles', 'Finished creating detailed plot plan.');
|
|
476
477
|
}
|
|
477
478
|
return { type: 'plot', success: !!response };
|
|
478
479
|
})
|
|
479
480
|
.catch((error) => {
|
|
480
|
-
|
|
481
|
+
logger_1.logger.error('Error generating/publishing plot plan:', error);
|
|
481
482
|
return { type: 'plot', success: false, error };
|
|
482
483
|
}),
|
|
483
484
|
]);
|
|
@@ -495,7 +496,7 @@ let StoryService = class StoryService {
|
|
|
495
496
|
.then((response) => {
|
|
496
497
|
if (response.character?.character_profile) {
|
|
497
498
|
room.publishArtifact(`Character Profile - ${userAgent.agentNickname}`, userAgent.agentNickname, response.character.character_profile, [narrator.agentNickname, userAgent.agentNickname]);
|
|
498
|
-
|
|
499
|
+
logger_1.logger.log(`Published character profile for ${userCharacter.name} (human-controlled)`);
|
|
499
500
|
this.progressService.emitProgress(storyInfo.id, 'profiles', `Finished creating character profile for ${userCharacter.name}`);
|
|
500
501
|
}
|
|
501
502
|
else {
|
|
@@ -504,7 +505,7 @@ let StoryService = class StoryService {
|
|
|
504
505
|
return { type: 'userCharacter', success: true };
|
|
505
506
|
})
|
|
506
507
|
.catch((error) => {
|
|
507
|
-
|
|
508
|
+
logger_1.logger.error(`Error generating/publishing user character profile:`, error);
|
|
508
509
|
return { type: 'userCharacter', success: false, error };
|
|
509
510
|
}));
|
|
510
511
|
}
|
|
@@ -531,7 +532,7 @@ let StoryService = class StoryService {
|
|
|
531
532
|
.then((response) => {
|
|
532
533
|
if (response.character?.character_profile) {
|
|
533
534
|
room.publishArtifact(`Character Profile - ${agent.agentNickname}`, agent.agentNickname, response.character.character_profile, [agent.agentNickname]);
|
|
534
|
-
|
|
535
|
+
logger_1.logger.log(`Published character profile for ${charInfo.name}`);
|
|
535
536
|
this.progressService.emitProgress(storyInfo.id, 'profiles', `Finished creating character profile for ${charInfo.name}`);
|
|
536
537
|
}
|
|
537
538
|
else {
|
|
@@ -540,7 +541,7 @@ let StoryService = class StoryService {
|
|
|
540
541
|
return { type: 'character', name: charInfo.name, success: true };
|
|
541
542
|
})
|
|
542
543
|
.catch((error) => {
|
|
543
|
-
|
|
544
|
+
logger_1.logger.error(`Error generating/publishing profile for ${charInfo.name}:`, error);
|
|
544
545
|
return {
|
|
545
546
|
type: 'character',
|
|
546
547
|
name: charInfo.name,
|
|
@@ -554,7 +555,7 @@ let StoryService = class StoryService {
|
|
|
554
555
|
const profileResults = [...phase1Results, ...phase2Results, openingSceneResult];
|
|
555
556
|
const failedProfiles = profileResults.filter((r) => !r.success);
|
|
556
557
|
if (failedProfiles.length > 0) {
|
|
557
|
-
|
|
558
|
+
logger_1.logger.warn(`${failedProfiles.length} profile(s) failed to generate`);
|
|
558
559
|
}
|
|
559
560
|
narrator.allowSearch = false;
|
|
560
561
|
narrator.save();
|
|
@@ -564,15 +565,15 @@ let StoryService = class StoryService {
|
|
|
564
565
|
agent.disableMarkup = false;
|
|
565
566
|
agent.disableBalanceCheck = false;
|
|
566
567
|
agent.save();
|
|
567
|
-
|
|
568
|
+
logger_1.logger.log(`Re-enabled markup and balance checks for ${agent.agentName}`);
|
|
568
569
|
}
|
|
569
570
|
}
|
|
570
|
-
|
|
571
|
+
logger_1.logger.log(`Generated and published ${profileResults.length} profiles in parallel (each agent created its own profile)`);
|
|
571
572
|
room.saveMetadata();
|
|
572
573
|
this.progressService.emitProgress(storyInfo.id, 'complete', 'Story plot creation complete');
|
|
573
574
|
}
|
|
574
575
|
catch (error) {
|
|
575
|
-
|
|
576
|
+
logger_1.logger.error('Error creating story:', error);
|
|
576
577
|
this.progressService.emitProgress(storyId, 'error', `Error: ${error.message}`);
|
|
577
578
|
}
|
|
578
579
|
finally {
|
|
@@ -584,13 +585,13 @@ let StoryService = class StoryService {
|
|
|
584
585
|
}
|
|
585
586
|
}
|
|
586
587
|
catch (finallyError) {
|
|
587
|
-
|
|
588
|
+
logger_1.logger.error('Error in finally block disabling flags:', finallyError);
|
|
588
589
|
}
|
|
589
590
|
}
|
|
590
591
|
}
|
|
591
592
|
generateCharacterPortraits(storyInfo, room) {
|
|
592
593
|
if (!storyInfo.artistAgentId) {
|
|
593
|
-
|
|
594
|
+
logger_1.logger.log('Skipping character portrait generation: no artist agent');
|
|
594
595
|
return [];
|
|
595
596
|
}
|
|
596
597
|
this.progressService.emitProgress(storyInfo.id, 'portraits', 'Generating character portraits...');
|
|
@@ -606,7 +607,7 @@ let StoryService = class StoryService {
|
|
|
606
607
|
});
|
|
607
608
|
}
|
|
608
609
|
catch (error) {
|
|
609
|
-
|
|
610
|
+
logger_1.logger.error(`Portrait error for ${characterAgent.agentNickname}:`, error);
|
|
610
611
|
}
|
|
611
612
|
});
|
|
612
613
|
}
|
|
@@ -701,7 +702,7 @@ let StoryService = class StoryService {
|
|
|
701
702
|
}
|
|
702
703
|
const storyCreationPath = path.join(importDir, 'story_creation.json');
|
|
703
704
|
if (!fs.existsSync(storyCreationPath)) {
|
|
704
|
-
|
|
705
|
+
logger_1.logger.warn('story_creation.json not found (non-fatal)');
|
|
705
706
|
}
|
|
706
707
|
return {
|
|
707
708
|
valid: errors.length === 0,
|
|
@@ -784,7 +785,7 @@ let StoryService = class StoryService {
|
|
|
784
785
|
throw new Error(`Story with ID ${metadata.id} already exists (name: '${metadata.name}')`);
|
|
785
786
|
}
|
|
786
787
|
fs.renameSync(importDir, finalStoryPath);
|
|
787
|
-
|
|
788
|
+
logger_1.logger.log(`Successfully imported story: ${metadata.name} (${metadata.id})`);
|
|
788
789
|
return metadata;
|
|
789
790
|
}
|
|
790
791
|
catch (error) {
|
|
@@ -809,7 +810,7 @@ let StoryService = class StoryService {
|
|
|
809
810
|
]);
|
|
810
811
|
}
|
|
811
812
|
catch (error) {
|
|
812
|
-
|
|
813
|
+
logger_1.logger.error('Error populating imported story history:', error);
|
|
813
814
|
throw error;
|
|
814
815
|
}
|
|
815
816
|
}
|
|
@@ -858,7 +859,7 @@ let StoryService = class StoryService {
|
|
|
858
859
|
}));
|
|
859
860
|
}
|
|
860
861
|
catch (error) {
|
|
861
|
-
|
|
862
|
+
logger_1.logger.error('Error listing characters:', error);
|
|
862
863
|
return [];
|
|
863
864
|
}
|
|
864
865
|
}
|
|
@@ -884,7 +885,7 @@ let StoryService = class StoryService {
|
|
|
884
885
|
return content;
|
|
885
886
|
}
|
|
886
887
|
catch (error) {
|
|
887
|
-
|
|
888
|
+
logger_1.logger.error('Error getting character:', error);
|
|
888
889
|
throw new Error(`Error getting character: ${error.message}`);
|
|
889
890
|
}
|
|
890
891
|
}
|
|
@@ -979,17 +980,17 @@ let StoryService = class StoryService {
|
|
|
979
980
|
try {
|
|
980
981
|
const artifactId = await this.generateCharacterPortrait(room, characterAgent, storyId);
|
|
981
982
|
if (artifactId) {
|
|
982
|
-
|
|
983
|
+
logger_1.logger.log(`Generated portrait for newly introduced character: ${characterName}`);
|
|
983
984
|
}
|
|
984
985
|
}
|
|
985
986
|
catch (error) {
|
|
986
|
-
|
|
987
|
+
logger_1.logger.error(`Error generating portrait for introduced character ${characterName}:`, error);
|
|
987
988
|
}
|
|
988
989
|
if (!fromNarratorSuggestion) {
|
|
989
990
|
room.addPendingMessage(new message_1.RoomMessage('system', app_types_1.MessageAction.MODERATE, `INTRODUCE ${characterName}`));
|
|
990
991
|
}
|
|
991
992
|
else {
|
|
992
|
-
|
|
993
|
+
logger_1.logger.log(`Skipping INTRODUCE message for ${characterName} (already introduced by narrator)`);
|
|
993
994
|
}
|
|
994
995
|
}
|
|
995
996
|
async declineCharacter(storyId, characterName) {
|
|
@@ -1003,7 +1004,7 @@ let StoryService = class StoryService {
|
|
|
1003
1004
|
if (!story.declinedCharacters.includes(characterName)) {
|
|
1004
1005
|
story.declinedCharacters.push(characterName);
|
|
1005
1006
|
this.storyStore.updateStoryMetadata(storyId, story);
|
|
1006
|
-
|
|
1007
|
+
logger_1.logger.log(`Recorded declined character: ${characterName} for story ${storyId}`);
|
|
1007
1008
|
}
|
|
1008
1009
|
}
|
|
1009
1010
|
async deleteCharacter(storyId, characterName) {
|
|
@@ -1033,7 +1034,7 @@ let StoryService = class StoryService {
|
|
|
1033
1034
|
this.agentStore.removeAgent(agent.id);
|
|
1034
1035
|
}
|
|
1035
1036
|
async deleteStory(storyId) {
|
|
1036
|
-
|
|
1037
|
+
logger_1.logger.log(`Deleting story ${storyId}...`);
|
|
1037
1038
|
const story = this.storyStore.getStory(storyId);
|
|
1038
1039
|
if (story?.roomId) {
|
|
1039
1040
|
try {
|
|
@@ -1045,39 +1046,39 @@ let StoryService = class StoryService {
|
|
|
1045
1046
|
await agent.deleteAgent();
|
|
1046
1047
|
}
|
|
1047
1048
|
catch (error) {
|
|
1048
|
-
|
|
1049
|
+
logger_1.logger.warn(`Error deleting agent ${agent.id}:`, error);
|
|
1049
1050
|
}
|
|
1050
1051
|
}));
|
|
1051
1052
|
room.deleteRoom();
|
|
1052
|
-
|
|
1053
|
+
logger_1.logger.log(`Deleted room ${story.roomId} for story ${storyId}`);
|
|
1053
1054
|
}
|
|
1054
1055
|
else {
|
|
1055
|
-
|
|
1056
|
+
logger_1.logger.warn(`Room ${story.roomId} not found for story ${storyId}`);
|
|
1056
1057
|
}
|
|
1057
1058
|
}
|
|
1058
1059
|
catch (error) {
|
|
1059
|
-
|
|
1060
|
+
logger_1.logger.warn(`Error cleaning up room for story ${storyId}:`, error);
|
|
1060
1061
|
}
|
|
1061
1062
|
}
|
|
1062
1063
|
else {
|
|
1063
|
-
|
|
1064
|
+
logger_1.logger.warn(`Story ${storyId} has no roomId, skipping room cleanup`);
|
|
1064
1065
|
}
|
|
1065
1066
|
if (story?.artistAgentId) {
|
|
1066
1067
|
try {
|
|
1067
1068
|
this.agentStore.removeAgent(story.artistAgentId);
|
|
1068
|
-
|
|
1069
|
+
logger_1.logger.log(`Deleted artist agent ${story.artistAgentId}`);
|
|
1069
1070
|
}
|
|
1070
1071
|
catch (error) {
|
|
1071
|
-
|
|
1072
|
+
logger_1.logger.warn(`Error deleting artist agent ${story.artistAgentId}:`, error);
|
|
1072
1073
|
}
|
|
1073
1074
|
}
|
|
1074
1075
|
if (story?.illustratorAgentId) {
|
|
1075
1076
|
try {
|
|
1076
1077
|
this.agentStore.removeAgent(story.illustratorAgentId);
|
|
1077
|
-
|
|
1078
|
+
logger_1.logger.log(`Deleted illustrator agent ${story.illustratorAgentId}`);
|
|
1078
1079
|
}
|
|
1079
1080
|
catch (error) {
|
|
1080
|
-
|
|
1081
|
+
logger_1.logger.warn(`Error deleting illustrator agent ${story.illustratorAgentId}:`, error);
|
|
1081
1082
|
}
|
|
1082
1083
|
}
|
|
1083
1084
|
try {
|
|
@@ -1085,16 +1086,16 @@ let StoryService = class StoryService {
|
|
|
1085
1086
|
this.cleanupMessageEmitter(storyId);
|
|
1086
1087
|
}
|
|
1087
1088
|
catch (error) {
|
|
1088
|
-
|
|
1089
|
+
logger_1.logger.warn(`Error cleaning up emitters for story ${storyId}:`, error);
|
|
1089
1090
|
}
|
|
1090
1091
|
try {
|
|
1091
1092
|
this.storyStore.removeStory(storyId);
|
|
1092
|
-
|
|
1093
|
+
logger_1.logger.log(`Deleted story ${storyId} from store`);
|
|
1093
1094
|
}
|
|
1094
1095
|
catch (error) {
|
|
1095
|
-
|
|
1096
|
+
logger_1.logger.warn(`Error removing story ${storyId} from store:`, error);
|
|
1096
1097
|
}
|
|
1097
|
-
|
|
1098
|
+
logger_1.logger.log(`Story ${storyId} deletion complete`);
|
|
1098
1099
|
}
|
|
1099
1100
|
disableStoryAgentFlags(agents, reason = 'operation') {
|
|
1100
1101
|
for (const agent of agents) {
|
|
@@ -1102,7 +1103,7 @@ let StoryService = class StoryService {
|
|
|
1102
1103
|
agent.disableMarkup = true;
|
|
1103
1104
|
agent.disableBalanceCheck = true;
|
|
1104
1105
|
agent.save();
|
|
1105
|
-
|
|
1106
|
+
logger_1.logger.log(`Disabled markup/balance checks for ${agent.agentName} (${reason})`);
|
|
1106
1107
|
}
|
|
1107
1108
|
}
|
|
1108
1109
|
}
|
|
@@ -1112,7 +1113,7 @@ let StoryService = class StoryService {
|
|
|
1112
1113
|
agent.disableMarkup = false;
|
|
1113
1114
|
agent.disableBalanceCheck = false;
|
|
1114
1115
|
agent.save();
|
|
1115
|
-
|
|
1116
|
+
logger_1.logger.log(`Re-enabled markup/balance checks for ${agent.agentName} (${reason})`);
|
|
1116
1117
|
}
|
|
1117
1118
|
}
|
|
1118
1119
|
}
|
|
@@ -1124,7 +1125,7 @@ let StoryService = class StoryService {
|
|
|
1124
1125
|
if (agents.length === 0) {
|
|
1125
1126
|
throw new Error('No agents in story room');
|
|
1126
1127
|
}
|
|
1127
|
-
|
|
1128
|
+
logger_1.logger.log(`Compacting ${agents.length} agents in parallel`);
|
|
1128
1129
|
const agentsToCompact = agents.filter(agent => agent !== room.getModeratorAgent());
|
|
1129
1130
|
this.disableStoryAgentFlags(agentsToCompact, 'compaction');
|
|
1130
1131
|
const compactionPromises = agents.map(async (agent) => {
|
|
@@ -1137,15 +1138,15 @@ let StoryService = class StoryService {
|
|
|
1137
1138
|
await this.compactAgentHistory(agent);
|
|
1138
1139
|
}
|
|
1139
1140
|
catch (error) {
|
|
1140
|
-
|
|
1141
|
+
logger_1.logger.error(`Error compacting ${agent.agentName}:`, error);
|
|
1141
1142
|
}
|
|
1142
1143
|
});
|
|
1143
1144
|
await Promise.all(compactionPromises);
|
|
1144
|
-
|
|
1145
|
+
logger_1.logger.log(`Finished compacting ${agents.length} agents in parallel`);
|
|
1145
1146
|
return { success: true };
|
|
1146
1147
|
}
|
|
1147
1148
|
catch (error) {
|
|
1148
|
-
|
|
1149
|
+
logger_1.logger.error('Error compacting story:', error);
|
|
1149
1150
|
return { success: false, message: error.message };
|
|
1150
1151
|
}
|
|
1151
1152
|
finally {
|
|
@@ -1184,7 +1185,7 @@ let StoryService = class StoryService {
|
|
|
1184
1185
|
this.progressService.emitProgress(storyId, 'ready', 'Chapter opening is ready! Continuing chapter progression in the background...');
|
|
1185
1186
|
setImmediate(() => {
|
|
1186
1187
|
this.progressStoryToNextChapterAsync(storyId).catch((error) => {
|
|
1187
|
-
|
|
1188
|
+
logger_1.logger.error('Error in async chapter progression:', error);
|
|
1188
1189
|
this.progressService.emitProgress(storyId, 'error', `Error: ${error.message}`);
|
|
1189
1190
|
});
|
|
1190
1191
|
});
|
|
@@ -1218,7 +1219,7 @@ let StoryService = class StoryService {
|
|
|
1218
1219
|
this.progressService.emitProgress(storyId, 'complete', 'Chapter progression complete!');
|
|
1219
1220
|
}
|
|
1220
1221
|
catch (error) {
|
|
1221
|
-
|
|
1222
|
+
logger_1.logger.error('Error in async chapter progression:', error);
|
|
1222
1223
|
throw error;
|
|
1223
1224
|
}
|
|
1224
1225
|
finally {
|
|
@@ -1281,7 +1282,7 @@ let StoryService = class StoryService {
|
|
|
1281
1282
|
const summary = summaryResponse?.summary || summaryResponse;
|
|
1282
1283
|
agent.addToConversationHistory(`[CONVERSATION HISTORY SUMMARY]\n\n${summary}`, true);
|
|
1283
1284
|
const newLength = agent.history.length;
|
|
1284
|
-
|
|
1285
|
+
logger_1.logger.log(`Compacted ${agent.agentName}: ${originalLength} messages`);
|
|
1285
1286
|
agent.save();
|
|
1286
1287
|
return {
|
|
1287
1288
|
success: true,
|
|
@@ -1293,7 +1294,7 @@ let StoryService = class StoryService {
|
|
|
1293
1294
|
}
|
|
1294
1295
|
catch (error) {
|
|
1295
1296
|
agent.history = originalHistory;
|
|
1296
|
-
|
|
1297
|
+
logger_1.logger.error(`Error compacting ${agent.agentName}:`, error);
|
|
1297
1298
|
throw error;
|
|
1298
1299
|
}
|
|
1299
1300
|
}
|
|
@@ -1319,12 +1320,12 @@ let StoryService = class StoryService {
|
|
|
1319
1320
|
room.publishArtifact('Plot Plan', narrator.agentNickname, cleanedPlotPlan, [
|
|
1320
1321
|
narrator.agentNickname,
|
|
1321
1322
|
]);
|
|
1322
|
-
|
|
1323
|
+
logger_1.logger.log(`Updated plot plan`);
|
|
1323
1324
|
return cleanedPlotPlan;
|
|
1324
1325
|
}
|
|
1325
1326
|
}
|
|
1326
1327
|
catch (error) {
|
|
1327
|
-
|
|
1328
|
+
logger_1.logger.error(`Error updating plot plan:`, error);
|
|
1328
1329
|
}
|
|
1329
1330
|
return '';
|
|
1330
1331
|
}
|
|
@@ -1356,18 +1357,18 @@ let StoryService = class StoryService {
|
|
|
1356
1357
|
room.publishArtifact(`Character Profile - ${character.agentNickname}`, character.agentNickname, progressCharacterResponse.character_profile, [character.agentNickname]);
|
|
1357
1358
|
}
|
|
1358
1359
|
catch (error) {
|
|
1359
|
-
|
|
1360
|
+
logger_1.logger.error(`Error updating character profile for ${character.agentNickname}:`, error);
|
|
1360
1361
|
}
|
|
1361
1362
|
});
|
|
1362
1363
|
await Promise.all(updatePromises);
|
|
1363
|
-
|
|
1364
|
+
logger_1.logger.log(`Updated ${characterAgents.length} character profiles in parallel`);
|
|
1364
1365
|
const portraitPromises = characterAgents.map(async (characterAgent) => {
|
|
1365
1366
|
try {
|
|
1366
1367
|
const pathParts = room.getStorageDir().split(path.sep);
|
|
1367
1368
|
const storiesIndex = pathParts.findIndex((p) => p === 'stories');
|
|
1368
1369
|
const storyId = storiesIndex >= 0 ? pathParts[storiesIndex + 1] : null;
|
|
1369
1370
|
if (!storyId) {
|
|
1370
|
-
|
|
1371
|
+
logger_1.logger.error('Could not extract story ID from room path');
|
|
1371
1372
|
return { character: characterAgent.agentNickname, success: false };
|
|
1372
1373
|
}
|
|
1373
1374
|
const storyArtifactService = this.getStoryArtifactService(storyId);
|
|
@@ -1376,7 +1377,7 @@ let StoryService = class StoryService {
|
|
|
1376
1377
|
const oldPortrait = oldArtifacts.find((a) => a.name === oldPortraitName);
|
|
1377
1378
|
if (oldPortrait) {
|
|
1378
1379
|
storyArtifactService.deleteArtifact(oldPortrait.artifactId);
|
|
1379
|
-
|
|
1380
|
+
logger_1.logger.log(`Deleted old portrait for ${characterAgent.agentName}`);
|
|
1380
1381
|
}
|
|
1381
1382
|
const artifactId = await this.generateCharacterPortrait(room, characterAgent, storyId);
|
|
1382
1383
|
return {
|
|
@@ -1386,12 +1387,12 @@ let StoryService = class StoryService {
|
|
|
1386
1387
|
};
|
|
1387
1388
|
}
|
|
1388
1389
|
catch (error) {
|
|
1389
|
-
|
|
1390
|
+
logger_1.logger.error(`Error regenerating portrait for ${characterAgent.agentName}:`, error);
|
|
1390
1391
|
return { character: characterAgent.agentNickname, success: false, error };
|
|
1391
1392
|
}
|
|
1392
1393
|
});
|
|
1393
1394
|
await Promise.all(portraitPromises);
|
|
1394
|
-
|
|
1395
|
+
logger_1.logger.log(`Regenerated portraits for ${characterAgents.length} characters`);
|
|
1395
1396
|
}
|
|
1396
1397
|
getImageModelConfig(modelName) {
|
|
1397
1398
|
try {
|
|
@@ -1402,31 +1403,31 @@ let StoryService = class StoryService {
|
|
|
1402
1403
|
const imageModels = JSON.parse(fs.readFileSync(imageModelsPath, 'utf8'));
|
|
1403
1404
|
const modelConfig = imageModels.find((m) => m.name === modelName);
|
|
1404
1405
|
if (!modelConfig) {
|
|
1405
|
-
|
|
1406
|
+
logger_1.logger.warn(`Image model not found: ${modelName}`);
|
|
1406
1407
|
return null;
|
|
1407
1408
|
}
|
|
1408
1409
|
if (!modelConfig.service || !modelConfig.model) {
|
|
1409
|
-
|
|
1410
|
+
logger_1.logger.log(`Images disabled: selected "${modelName}"`);
|
|
1410
1411
|
return null;
|
|
1411
1412
|
}
|
|
1412
1413
|
return { service: modelConfig.service, model: modelConfig.model };
|
|
1413
1414
|
}
|
|
1414
1415
|
catch (error) {
|
|
1415
|
-
|
|
1416
|
+
logger_1.logger.error('Error loading image model config:', error);
|
|
1416
1417
|
return null;
|
|
1417
1418
|
}
|
|
1418
1419
|
}
|
|
1419
1420
|
createArtistAgent(storyId, storyAgentsDir, storyArtifactService, imageModelName) {
|
|
1420
1421
|
const imageConfig = this.getImageModelConfig(imageModelName);
|
|
1421
1422
|
if (!imageConfig) {
|
|
1422
|
-
|
|
1423
|
+
logger_1.logger.log('Artist agent creation skipped: images disabled');
|
|
1423
1424
|
return null;
|
|
1424
1425
|
}
|
|
1425
1426
|
const artistAgent = this.agentFactory.createAgent(imageConfig.service, 'Artist', '', 'AI artist for generating character portraits and scene illustrations', 'default', imageConfig.model, storyAgentsDir, storyArtifactService);
|
|
1426
1427
|
artistAgent.maxHistoryMessages = 10;
|
|
1427
1428
|
artistAgent.promptCacheTTL = 0;
|
|
1428
1429
|
artistAgent.save();
|
|
1429
|
-
|
|
1430
|
+
logger_1.logger.log(`Created artist agent: ${artistAgent.agentName} (${imageConfig.service}/${imageConfig.model})`);
|
|
1430
1431
|
return artistAgent;
|
|
1431
1432
|
}
|
|
1432
1433
|
async generateCharacterPortrait(room, characterAgent, storyId) {
|
|
@@ -1438,12 +1439,12 @@ let StoryService = class StoryService {
|
|
|
1438
1439
|
const character = storyInfo.characters.find((c) => c.name === characterAgent.agentNickname);
|
|
1439
1440
|
let characterDescription = profileArtifact?.body || character?.description || '';
|
|
1440
1441
|
if (!characterDescription) {
|
|
1441
|
-
|
|
1442
|
+
logger_1.logger.warn(`No profile for ${characterAgent.agentNickname}, skipping portrait`);
|
|
1442
1443
|
return null;
|
|
1443
1444
|
}
|
|
1444
1445
|
const artistAgent = await this.agentStore.getAgent(storyInfo.artistAgentId);
|
|
1445
1446
|
if (!artistAgent) {
|
|
1446
|
-
|
|
1447
|
+
logger_1.logger.warn(`Artist agent not found: ${storyInfo.artistAgentId}`);
|
|
1447
1448
|
return null;
|
|
1448
1449
|
}
|
|
1449
1450
|
const visualDescription = await characterAgent.preparedPrompt('describe_character', {
|
|
@@ -1452,7 +1453,7 @@ let StoryService = class StoryService {
|
|
|
1452
1453
|
scenario: scenario,
|
|
1453
1454
|
}, false);
|
|
1454
1455
|
if (!visualDescription || typeof visualDescription !== 'string') {
|
|
1455
|
-
|
|
1456
|
+
logger_1.logger.warn(`Failed to generate visual description for ${characterAgent.agentNickname}`);
|
|
1456
1457
|
return null;
|
|
1457
1458
|
}
|
|
1458
1459
|
const imageResult = await artistAgent.generateImage(visualDescription, 1024, 1536, 'high');
|
|
@@ -1464,11 +1465,11 @@ let StoryService = class StoryService {
|
|
|
1464
1465
|
let storyArtifactService = this.getStoryArtifactService(storyId);
|
|
1465
1466
|
storyArtifactService.renameArtifact(artifactId, `Portrait - ${characterAgent.agentNickname}`);
|
|
1466
1467
|
storyArtifactService.updateArtifactDescription(artifactId, visualDescription);
|
|
1467
|
-
|
|
1468
|
+
logger_1.logger.log(`Generated portrait for ${characterAgent.agentNickname}: ${artifactId}`);
|
|
1468
1469
|
return artifactId;
|
|
1469
1470
|
}
|
|
1470
1471
|
catch (error) {
|
|
1471
|
-
|
|
1472
|
+
logger_1.logger.error(`Error generating portrait for ${characterAgent.agentNickname}:`, error);
|
|
1472
1473
|
return null;
|
|
1473
1474
|
}
|
|
1474
1475
|
}
|
|
@@ -1476,7 +1477,7 @@ let StoryService = class StoryService {
|
|
|
1476
1477
|
try {
|
|
1477
1478
|
const story = this.storyStore.getStory(storyId);
|
|
1478
1479
|
if (!story?.illustratorAgentId) {
|
|
1479
|
-
|
|
1480
|
+
logger_1.logger.log('No illustrator configured');
|
|
1480
1481
|
return;
|
|
1481
1482
|
}
|
|
1482
1483
|
const illustrator = await this.agentStore.getAgent(story.illustratorAgentId);
|
|
@@ -1486,7 +1487,7 @@ let StoryService = class StoryService {
|
|
|
1486
1487
|
const allMessages = room.getLatestRoomMessages(0, true);
|
|
1487
1488
|
const latestMessage = allMessages[allMessages.length - 1];
|
|
1488
1489
|
if (!latestMessage) {
|
|
1489
|
-
|
|
1490
|
+
logger_1.logger.warn('No messages in room');
|
|
1490
1491
|
return;
|
|
1491
1492
|
}
|
|
1492
1493
|
illustrator.addToConversationHistory(latestMessage.content, false);
|
|
@@ -1510,7 +1511,7 @@ let StoryService = class StoryService {
|
|
|
1510
1511
|
}, true, true);
|
|
1511
1512
|
illustrator.save();
|
|
1512
1513
|
if (!sceneAnalysis || !sceneAnalysis.createImage) {
|
|
1513
|
-
|
|
1514
|
+
logger_1.logger.log('Illustrator decided not to create an image for this situation');
|
|
1514
1515
|
return;
|
|
1515
1516
|
}
|
|
1516
1517
|
if (sceneAnalysis.isReference) {
|
|
@@ -1522,25 +1523,25 @@ let StoryService = class StoryService {
|
|
|
1522
1523
|
}
|
|
1523
1524
|
}
|
|
1524
1525
|
catch (error) {
|
|
1525
|
-
|
|
1526
|
+
logger_1.logger.error('Scene illustration error:', error);
|
|
1526
1527
|
}
|
|
1527
1528
|
}
|
|
1528
1529
|
async generateSceneReference(storyId, sceneName, sceneDescription) {
|
|
1529
1530
|
try {
|
|
1530
|
-
|
|
1531
|
+
logger_1.logger.log(`Generating scene reference: ${sceneName}`);
|
|
1531
1532
|
const storyInfo = this.storyStore.getStory(storyId);
|
|
1532
1533
|
if (!storyInfo || !storyInfo.artistAgentId) {
|
|
1533
|
-
|
|
1534
|
+
logger_1.logger.error(`Cannot generate scene reference: story ${storyId} has no artist agent`);
|
|
1534
1535
|
return;
|
|
1535
1536
|
}
|
|
1536
1537
|
const artistAgent = await this.agentStore.getAgent(storyInfo.artistAgentId);
|
|
1537
1538
|
if (!artistAgent) {
|
|
1538
|
-
|
|
1539
|
+
logger_1.logger.error(`Artist agent not found: ${storyInfo.artistAgentId}`);
|
|
1539
1540
|
return;
|
|
1540
1541
|
}
|
|
1541
1542
|
let storyArtifactService = this.getStoryArtifactService(storyId);
|
|
1542
1543
|
if (!storyArtifactService) {
|
|
1543
|
-
|
|
1544
|
+
logger_1.logger.error(`Story artifact service not found: ${storyId}`);
|
|
1544
1545
|
return;
|
|
1545
1546
|
}
|
|
1546
1547
|
const imageResult = await artistAgent.generateImage(sceneDescription, 1024, 1024, 'auto');
|
|
@@ -1551,20 +1552,20 @@ let StoryService = class StoryService {
|
|
|
1551
1552
|
const artifactId = imageResult.artifactId;
|
|
1552
1553
|
storyArtifactService.renameArtifact(artifactId, `Scene - ${sceneName}`);
|
|
1553
1554
|
storyArtifactService.updateArtifactDescription(artifactId, sceneDescription);
|
|
1554
|
-
|
|
1555
|
+
logger_1.logger.log(`Generated scene reference: ${sceneName} (${artifactId})`);
|
|
1555
1556
|
}
|
|
1556
1557
|
catch (error) {
|
|
1557
|
-
|
|
1558
|
+
logger_1.logger.error('Scene reference generation error:', error);
|
|
1558
1559
|
}
|
|
1559
1560
|
}
|
|
1560
1561
|
async generateStoryImage(storyId, turnNumber, imageCaption, sceneName, sceneDescription, characterNames) {
|
|
1561
1562
|
try {
|
|
1562
|
-
|
|
1563
|
+
logger_1.logger.log(`Generating story image for turn ${turnNumber}`);
|
|
1563
1564
|
const storyArtifactService = this.getStoryArtifactService(storyId);
|
|
1564
1565
|
const allArtifacts = storyArtifactService.listArtifacts();
|
|
1565
1566
|
const sceneArtifact = allArtifacts.find((a) => a.name === `Scene - ${sceneName}`);
|
|
1566
1567
|
if (!sceneArtifact) {
|
|
1567
|
-
|
|
1568
|
+
logger_1.logger.warn(`Scene not found: ${sceneName}`);
|
|
1568
1569
|
return;
|
|
1569
1570
|
}
|
|
1570
1571
|
const characterPortraitIds = [];
|
|
@@ -1574,18 +1575,18 @@ let StoryService = class StoryService {
|
|
|
1574
1575
|
characterPortraitIds.push(portrait.artifactId);
|
|
1575
1576
|
}
|
|
1576
1577
|
else {
|
|
1577
|
-
|
|
1578
|
+
logger_1.logger.warn(`Portrait not found: ${charName}`);
|
|
1578
1579
|
}
|
|
1579
1580
|
}
|
|
1580
1581
|
const referenceImageIds = [sceneArtifact.artifactId, ...characterPortraitIds];
|
|
1581
1582
|
const storyInfo = this.storyStore.getStory(storyId);
|
|
1582
1583
|
if (!storyInfo || !storyInfo.artistAgentId) {
|
|
1583
|
-
|
|
1584
|
+
logger_1.logger.error(`Cannot generate story image: story ${storyId} has no artist agent`);
|
|
1584
1585
|
return;
|
|
1585
1586
|
}
|
|
1586
1587
|
const artistAgent = await this.agentStore.getAgent(storyInfo.artistAgentId);
|
|
1587
1588
|
if (!artistAgent) {
|
|
1588
|
-
|
|
1589
|
+
logger_1.logger.error(`Artist agent not found: ${storyInfo.artistAgentId}`);
|
|
1589
1590
|
return;
|
|
1590
1591
|
}
|
|
1591
1592
|
let quality = 'high';
|
|
@@ -1598,21 +1599,21 @@ let StoryService = class StoryService {
|
|
|
1598
1599
|
const artifactId = imageResult.artifactId;
|
|
1599
1600
|
storyArtifactService.renameArtifact(artifactId, `Story image - ${turnNumber}`);
|
|
1600
1601
|
storyArtifactService.updateArtifactDescription(artifactId, imageCaption);
|
|
1601
|
-
|
|
1602
|
+
logger_1.logger.log(`Generated story image: ${imageCaption} (${artifactId})`);
|
|
1602
1603
|
try {
|
|
1603
1604
|
const room = await this.getStoryRoom(storyId);
|
|
1604
1605
|
const imgUrl = `/api/stories/${storyId}/artifacts/${artifactId}`;
|
|
1605
1606
|
const imageMarkdown = ``;
|
|
1606
1607
|
const imageMessage = new message_1.RoomMessage(imageCaption, app_types_1.MessageAction.SYSTEM, imageMarkdown);
|
|
1607
1608
|
room.addRoomMessage(imageMessage);
|
|
1608
|
-
|
|
1609
|
+
logger_1.logger.log(`Added story image message to room`);
|
|
1609
1610
|
}
|
|
1610
1611
|
catch (error) {
|
|
1611
|
-
|
|
1612
|
+
logger_1.logger.error('Error adding image message to room:', error);
|
|
1612
1613
|
}
|
|
1613
1614
|
}
|
|
1614
1615
|
catch (error) {
|
|
1615
|
-
|
|
1616
|
+
logger_1.logger.error('Story image generation error:', error);
|
|
1616
1617
|
}
|
|
1617
1618
|
}
|
|
1618
1619
|
async updateStorySituation(storyId, situation) {
|
|
@@ -1643,7 +1644,7 @@ let StoryService = class StoryService {
|
|
|
1643
1644
|
if (newCharacterName) {
|
|
1644
1645
|
const declinedCharacters = story?.declinedCharacters || [];
|
|
1645
1646
|
if (declinedCharacters.includes(newCharacterName)) {
|
|
1646
|
-
|
|
1647
|
+
logger_1.logger.log(`Character ${newCharacterName} was declined, skipping prompt`);
|
|
1647
1648
|
return;
|
|
1648
1649
|
}
|
|
1649
1650
|
this.messageService.emitUpdate(storyId, {
|
|
@@ -1659,9 +1660,9 @@ let StoryService = class StoryService {
|
|
|
1659
1660
|
}
|
|
1660
1661
|
story.situation = situation;
|
|
1661
1662
|
this.storyStore.updateStoryMetadata(storyId, story);
|
|
1662
|
-
|
|
1663
|
+
logger_1.logger.log(`Updated story ${storyId} situation: ${situation}`);
|
|
1663
1664
|
this.generateSceneIllustration(storyId, situation).catch((error) => {
|
|
1664
|
-
|
|
1665
|
+
logger_1.logger.error('Illustration generation error:', error);
|
|
1665
1666
|
});
|
|
1666
1667
|
}
|
|
1667
1668
|
async generateStoryMarkdown(storyId) {
|
|
@@ -1734,12 +1735,12 @@ let StoryService = class StoryService {
|
|
|
1734
1735
|
try {
|
|
1735
1736
|
const storyInfo = this.storyStore.getStory(storyId);
|
|
1736
1737
|
if (!storyInfo || !storyInfo.roomId) {
|
|
1737
|
-
|
|
1738
|
+
logger_1.logger.warn(`Cannot update story cost: story ${storyId} not found or has no room`);
|
|
1738
1739
|
return;
|
|
1739
1740
|
}
|
|
1740
1741
|
const room = await this.roomStore.getRoom(storyInfo.roomId);
|
|
1741
1742
|
if (!room) {
|
|
1742
|
-
|
|
1743
|
+
logger_1.logger.warn(`Cannot update story cost: room ${storyInfo.roomId} not found`);
|
|
1743
1744
|
return;
|
|
1744
1745
|
}
|
|
1745
1746
|
let totalCost = 0;
|
|
@@ -1759,7 +1760,7 @@ let StoryService = class StoryService {
|
|
|
1759
1760
|
totalOutputTokens += illustratorAgent.totalOutputTokens || 0;
|
|
1760
1761
|
}
|
|
1761
1762
|
else {
|
|
1762
|
-
|
|
1763
|
+
logger_1.logger.warn(`Illustrator agent not found: ${storyInfo.illustratorAgentId}`);
|
|
1763
1764
|
}
|
|
1764
1765
|
}
|
|
1765
1766
|
if (storyInfo.artistAgentId) {
|
|
@@ -1770,7 +1771,7 @@ let StoryService = class StoryService {
|
|
|
1770
1771
|
totalOutputTokens += artistAgent.totalOutputTokens || 0;
|
|
1771
1772
|
}
|
|
1772
1773
|
else {
|
|
1773
|
-
|
|
1774
|
+
logger_1.logger.warn(`Artist agent not found: ${storyInfo.artistAgentId}`);
|
|
1774
1775
|
}
|
|
1775
1776
|
}
|
|
1776
1777
|
storyInfo.totalCost = totalCost;
|
|
@@ -1779,7 +1780,7 @@ let StoryService = class StoryService {
|
|
|
1779
1780
|
this.storyStore.updateStoryMetadata(storyId, storyInfo);
|
|
1780
1781
|
}
|
|
1781
1782
|
catch (error) {
|
|
1782
|
-
|
|
1783
|
+
logger_1.logger.error(`Error updating story cost for ${storyId}:`, error);
|
|
1783
1784
|
}
|
|
1784
1785
|
}
|
|
1785
1786
|
};
|