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.
Files changed (90) hide show
  1. package/README.md +31 -21
  2. package/dist/server/src/ai/LLM/anthropic.service.js +16 -8
  3. package/dist/server/src/ai/LLM/base-ai.service.js +5 -4
  4. package/dist/server/src/ai/LLM/deepseek.service.js +8 -6
  5. package/dist/server/src/ai/LLM/fal.service.js +15 -14
  6. package/dist/server/src/ai/LLM/googleai.service.js +10 -8
  7. package/dist/server/src/ai/LLM/grok.service.js +9 -7
  8. package/dist/server/src/ai/LLM/mock.service.js +7 -6
  9. package/dist/server/src/ai/LLM/openai.service.js +15 -13
  10. package/dist/server/src/ai/LLM/together.service.js +10 -8
  11. package/dist/server/src/ai/LLM/vertexai.service.js +10 -9
  12. package/dist/server/src/ai/agent-store.service.js +12 -11
  13. package/dist/server/src/ai/artifact.service.js +7 -6
  14. package/dist/server/src/ai/attached-file.service.js +8 -7
  15. package/dist/server/src/ai/published-agents.service.js +5 -4
  16. package/dist/server/src/app/balance.service.js +7 -6
  17. package/dist/server/src/app/stripe.controller.js +12 -11
  18. package/dist/server/src/app/stripe.service.js +20 -19
  19. package/dist/server/src/app/transaction.service.js +6 -5
  20. package/dist/server/src/app/user-service-manager.js +6 -5
  21. package/dist/server/src/app.controller.js +95 -94
  22. package/dist/server/src/app.service.js +31 -30
  23. package/dist/server/src/auth/auth.controller.js +21 -20
  24. package/dist/server/src/auth/jwt-auth.guard.js +4 -3
  25. package/dist/server/src/auth/rate-limit.service.d.ts +0 -1
  26. package/dist/server/src/auth/rate-limit.service.js +6 -7
  27. package/dist/server/src/auth/twilio.service.js +4 -3
  28. package/dist/server/src/auth/users.service.js +5 -4
  29. package/dist/server/src/common/logger.d.ts +21 -0
  30. package/dist/server/src/common/logger.js +83 -0
  31. package/dist/server/src/room/artifact-store.service.d.ts +0 -1
  32. package/dist/server/src/room/artifact-store.service.js +16 -17
  33. package/dist/server/src/room/published-rooms.service.js +3 -2
  34. package/dist/server/src/room/room-store.service.js +17 -16
  35. package/dist/server/src/room/room.js +14 -13
  36. package/dist/server/src/sdk/briyah-config.d.ts +7 -0
  37. package/dist/server/src/sdk/briyah-config.js +1 -0
  38. package/dist/server/src/sdk/briyah.js +13 -4
  39. package/dist/server/src/sdk/index.d.ts +2 -1
  40. package/dist/server/src/story/story-progress.service.js +2 -1
  41. package/dist/server/src/story/story-store.service.js +28 -27
  42. package/dist/server/src/story/story.service.js +113 -112
  43. package/docs/.nojekyll +1 -0
  44. package/docs/assets/hierarchy.js +1 -0
  45. package/docs/assets/highlight.css +106 -0
  46. package/docs/assets/icons.js +18 -0
  47. package/docs/assets/icons.svg +1 -0
  48. package/docs/assets/main.js +60 -0
  49. package/docs/assets/navigation.js +1 -0
  50. package/docs/assets/search.js +1 -0
  51. package/docs/assets/style.css +1633 -0
  52. package/docs/classes/Agent.html +87 -0
  53. package/docs/classes/Briyah.html +64 -0
  54. package/docs/classes/BriyahConfigService.html +12 -0
  55. package/docs/classes/Room.html +119 -0
  56. package/docs/enums/MessageAction.html +13 -0
  57. package/docs/hierarchy.html +1 -0
  58. package/docs/index.html +136 -0
  59. package/docs/interfaces/AgentInfo.html +17 -0
  60. package/docs/interfaces/AgentMessagesResponse.html +5 -0
  61. package/docs/interfaces/AppService.html +680 -0
  62. package/docs/interfaces/ArtifactMetadata.html +8 -0
  63. package/docs/interfaces/AttachDocumentResponse.html +3 -0
  64. package/docs/interfaces/BriyahConfigOptions.html +16 -0
  65. package/docs/interfaces/ChapterInfo.html +3 -0
  66. package/docs/interfaces/Character.html +7 -0
  67. package/docs/interfaces/CreateAgentResponse.html +2 -0
  68. package/docs/interfaces/CreateRoomResponse.html +3 -0
  69. package/docs/interfaces/CreateStoryResponse.html +2 -0
  70. package/docs/interfaces/FileList.html +2 -0
  71. package/docs/interfaces/LoggingOptions.html +9 -0
  72. package/docs/interfaces/Message.html +6 -0
  73. package/docs/interfaces/ModelInfo.html +5 -0
  74. package/docs/interfaces/PreparedPromptResponse.html +3 -0
  75. package/docs/interfaces/ProcessTextResponse.html +7 -0
  76. package/docs/interfaces/PromptFile.html +3 -0
  77. package/docs/interfaces/PromptFileContent.html +3 -0
  78. package/docs/interfaces/PromptFilesResponse.html +2 -0
  79. package/docs/interfaces/PromptFolder.html +3 -0
  80. package/docs/interfaces/PromptFoldersResponse.html +2 -0
  81. package/docs/interfaces/RoomDetails.html +9 -0
  82. package/docs/interfaces/RoomInfo.html +5 -0
  83. package/docs/interfaces/RoomMessagesResponse.html +3 -0
  84. package/docs/interfaces/StoryIdea.html +5 -0
  85. package/docs/interfaces/StoryInfo.html +21 -0
  86. package/docs/interfaces/StoryState.html +9 -0
  87. package/docs/modules.html +1 -0
  88. package/docs/types/PromptScope.html +1 -0
  89. package/package.json +6 -3
  90. package/data/common/config/story_ideas.txt +0 -6
@@ -40,6 +40,7 @@ const path = __importStar(require("path"));
40
40
  const app_types_1 = require("../../shared/types/app.types");
41
41
  const pdf_lib_1 = require("pdf-lib");
42
42
  const message_1 = require("./room/message");
43
+ const logger_1 = require("./common/logger");
43
44
  class AppService {
44
45
  aiFactoryService;
45
46
  agentStore;
@@ -96,7 +97,7 @@ class AppService {
96
97
  return JSON.parse(fs.readFileSync(imageModelsPath, 'utf8'));
97
98
  }
98
99
  catch (error) {
99
- console.error(`Image models file could not be read from ${imageModelsPath}: `, error);
100
+ logger_1.logger.error(`Image models file could not be read from ${imageModelsPath}: `, error);
100
101
  return [];
101
102
  }
102
103
  }
@@ -106,7 +107,7 @@ class AppService {
106
107
  return JSON.parse(fs.readFileSync(storyModelsPath, 'utf8'));
107
108
  }
108
109
  catch (error) {
109
- console.error(`Story models file could not be read from ${storyModelsPath}: `, error);
110
+ logger_1.logger.error(`Story models file could not be read from ${storyModelsPath}: `, error);
110
111
  return [];
111
112
  }
112
113
  }
@@ -114,7 +115,7 @@ class AppService {
114
115
  const storyIdeasPath = path.join(this.configService.getDataDir(), 'common', 'story_ideas');
115
116
  try {
116
117
  if (!fs.existsSync(storyIdeasPath)) {
117
- console.warn(`Story ideas directory does not exist: ${storyIdeasPath}`);
118
+ logger_1.logger.warn(`Story ideas directory does not exist: ${storyIdeasPath}`);
118
119
  return [];
119
120
  }
120
121
  return fs.readdirSync(storyIdeasPath)
@@ -122,7 +123,7 @@ class AppService {
122
123
  .map(file => file.replace('.json', ''));
123
124
  }
124
125
  catch (error) {
125
- console.error('Error reading story genres:', error);
126
+ logger_1.logger.error('Error reading story genres:', error);
126
127
  return [];
127
128
  }
128
129
  }
@@ -143,7 +144,7 @@ class AppService {
143
144
  if (error instanceof errors_1.NotFoundError) {
144
145
  throw error;
145
146
  }
146
- console.error(`Error reading story ideas for genre ${genreName}:`, error);
147
+ logger_1.logger.error(`Error reading story ideas for genre ${genreName}:`, error);
147
148
  throw new errors_1.OperationFailedError('Failed to read story ideas');
148
149
  }
149
150
  }
@@ -331,7 +332,7 @@ class AppService {
331
332
  };
332
333
  }
333
334
  catch (error) {
334
- console.error('Error getting agent details:', error);
335
+ logger_1.logger.error('Error getting agent details:', error);
335
336
  return null;
336
337
  }
337
338
  }
@@ -370,7 +371,7 @@ class AppService {
370
371
  newAgents.push(agent);
371
372
  }
372
373
  else {
373
- console.warn(`Agent ${agentId} not found when editing room ${roomName}`);
374
+ logger_1.logger.warn(`Agent ${agentId} not found when editing room ${roomName}`);
374
375
  }
375
376
  }
376
377
  room.setAgents(newAgents);
@@ -638,7 +639,7 @@ class AppService {
638
639
  }
639
640
  }
640
641
  catch (err) {
641
- console.error(`Failed to delete artifact ${artifact.name}:`, err);
642
+ logger_1.logger.error(`Failed to delete artifact ${artifact.name}:`, err);
642
643
  }
643
644
  }
644
645
  }
@@ -909,7 +910,7 @@ class AppService {
909
910
  }
910
911
  }
911
912
  if (warnings.length > 0) {
912
- console.warn(`Room "${roomName}" reset with warnings:`, warnings);
913
+ logger_1.logger.warn(`Room "${roomName}" reset with warnings:`, warnings);
913
914
  }
914
915
  }
915
916
  async resetStory(storyId) {
@@ -932,12 +933,12 @@ class AppService {
932
933
  const chapters = this.storyStore.listChapters(storyId);
933
934
  const warnings = [];
934
935
  if (chapters.length > 0) {
935
- console.log(`Restoring agents from chapter 1 backup for story ${storyId}`);
936
+ logger_1.logger.log(`Restoring agents from chapter 1 backup for story ${storyId}`);
936
937
  const restoredAgentIds = await this.storyStore.restoreAgentsFromChapter(storyId, 1, this.agentStore);
937
- console.log(`Restored ${restoredAgentIds.length} agents from chapter 1 backup`);
938
+ logger_1.logger.log(`Restored ${restoredAgentIds.length} agents from chapter 1 backup`);
938
939
  }
939
940
  else {
940
- console.warn(`No chapter 1 backup found for story ${storyId}, clearing agent histories`);
941
+ logger_1.logger.warn(`No chapter 1 backup found for story ${storyId}, clearing agent histories`);
941
942
  for (const agent of room.getAgents()) {
942
943
  try {
943
944
  this.reloadAgent(agent.id);
@@ -955,7 +956,7 @@ class AppService {
955
956
  this.storyStore.updateStoryMetadata(storyId, story);
956
957
  }
957
958
  if (warnings.length > 0) {
958
- console.warn(`Story "${storyName}" reset with warnings:`, warnings);
959
+ logger_1.logger.warn(`Story "${storyName}" reset with warnings:`, warnings);
959
960
  }
960
961
  }
961
962
  async createStory(name, idea, userCharacterDesc, otherCharactersDesc, storyModel, isImport, imageModelName) {
@@ -981,12 +982,12 @@ class AppService {
981
982
  }
982
983
  }
983
984
  catch (error) {
984
- console.warn(`Could not set up SSE callback for agent ${agentId}:`, error.message);
985
+ logger_1.logger.warn(`Could not set up SSE callback for agent ${agentId}:`, error.message);
985
986
  }
986
987
  }
987
988
  setupAgentStateCallback(agent) {
988
989
  if (!agent.id) {
989
- console.warn('Cannot set up SSE callback for agent without ID');
990
+ logger_1.logger.warn('Cannot set up SSE callback for agent without ID');
990
991
  return;
991
992
  }
992
993
  agent.setOnStateChange(() => {
@@ -1016,13 +1017,13 @@ class AppService {
1016
1017
  }
1017
1018
  }
1018
1019
  catch (error) {
1019
- console.warn(`Could not set up SSE callback for room ${roomId}:`, error.message);
1020
+ logger_1.logger.warn(`Could not set up SSE callback for room ${roomId}:`, error.message);
1020
1021
  }
1021
1022
  }
1022
1023
  setupRoomStateCallback(room) {
1023
1024
  const roomId = room.getId();
1024
1025
  if (!roomId) {
1025
- console.warn('Cannot set up SSE callback for room without ID');
1026
+ logger_1.logger.warn('Cannot set up SSE callback for room without ID');
1026
1027
  return;
1027
1028
  }
1028
1029
  room.setOnStateChange(() => {
@@ -1059,7 +1060,7 @@ class AppService {
1059
1060
  continue;
1060
1061
  const isPaused = !room.isProcessingInProgress() && room['pendingMessages']?.length > 0;
1061
1062
  if (isPaused) {
1062
- console.log(`Resuming paused story: ${story.name} (${story.id})`);
1063
+ logger_1.logger.log(`Resuming paused story: ${story.name} (${story.id})`);
1063
1064
  const resumeMessage = new message_1.RoomMessage('System', app_types_1.MessageAction.SYSTEM, 'Balance added. Conversation resumed.', [], null, null);
1064
1065
  room.addRoomMessage(resumeMessage);
1065
1066
  room['processPendingMessages']();
@@ -1067,11 +1068,11 @@ class AppService {
1067
1068
  }
1068
1069
  }
1069
1070
  catch (error) {
1070
- console.error(`Error resuming story ${story.id}:`, error);
1071
+ logger_1.logger.error(`Error resuming story ${story.id}:`, error);
1071
1072
  }
1072
1073
  }
1073
1074
  if (resumedCount > 0) {
1074
- console.log(`Resumed ${resumedCount} paused story/stories`);
1075
+ logger_1.logger.log(`Resumed ${resumedCount} paused story/stories`);
1075
1076
  }
1076
1077
  return resumedCount;
1077
1078
  }
@@ -1173,7 +1174,7 @@ class AppService {
1173
1174
  const placeholderContent = 'Converting PDF. This text will be replaced when the conversion is finished.';
1174
1175
  const artifactId = this.artifactService.storeArtifact(name, placeholderContent);
1175
1176
  this.convertPdfInBackground(artifactId, name, pdfBuffer).catch((error) => {
1176
- console.error(`Background PDF conversion failed for ${artifactId}:`, error);
1177
+ logger_1.logger.error(`Background PDF conversion failed for ${artifactId}:`, error);
1177
1178
  const errorContent = `# Conversion Failed\n\nThe PDF conversion failed with the following error:\n\n${error.message}\n\nPlease try uploading the file again.`;
1178
1179
  this.artifactService.updateArtifact(artifactId, errorContent);
1179
1180
  });
@@ -1204,11 +1205,11 @@ class AppService {
1204
1205
  }
1205
1206
  async convertLargePdfInBackground(artifactId, name, pdfDoc) {
1206
1207
  const pageCount = pdfDoc.getPageCount();
1207
- console.log(`Converting large PDF with ${pageCount} pages concurrently for artifact ${artifactId}`);
1208
+ logger_1.logger.log(`Converting large PDF with ${pageCount} pages concurrently for artifact ${artifactId}`);
1208
1209
  try {
1209
1210
  const conversionPromises = Array.from({ length: pageCount }, (_, pageIndex) => {
1210
1211
  const pageNum = pageIndex + 1;
1211
- console.log(`Starting conversion for page ${pageNum}/${pageCount} for artifact ${artifactId}`);
1212
+ logger_1.logger.log(`Starting conversion for page ${pageNum}/${pageCount} for artifact ${artifactId}`);
1212
1213
  return this.convertSinglePagePDF(pdfDoc, pageIndex)
1213
1214
  .then((pageResponse) => ({
1214
1215
  pageNum,
@@ -1217,7 +1218,7 @@ class AppService {
1217
1218
  content: `**[Page ${pageNum}]** \n${pageResponse.markdownContent} \n`,
1218
1219
  }))
1219
1220
  .catch((pageError) => {
1220
- console.error(`Error converting page ${pageNum}:`, pageError);
1221
+ logger_1.logger.error(`Error converting page ${pageNum}:`, pageError);
1221
1222
  return {
1222
1223
  pageNum,
1223
1224
  success: false,
@@ -1226,7 +1227,7 @@ class AppService {
1226
1227
  };
1227
1228
  });
1228
1229
  });
1229
- console.log(`Waiting for ${pageCount} concurrent page conversions...`);
1230
+ logger_1.logger.log(`Waiting for ${pageCount} concurrent page conversions...`);
1230
1231
  const results = await Promise.all(conversionPromises);
1231
1232
  const pageMarkdowns = results.map((result) => result.content);
1232
1233
  const totalCost = results.map((result) => result.cost).reduce((acc, v) => acc + v, 0);
@@ -1237,19 +1238,19 @@ class AppService {
1237
1238
  this.artifactService.updateArtifact(artifactId, markdownContent);
1238
1239
  const successCount = results.filter((r) => r.success).length;
1239
1240
  const failureCount = pageCount - successCount;
1240
- console.log(`Large PDF conversion complete: ${artifactId}. ` +
1241
+ logger_1.logger.log(`Large PDF conversion complete: ${artifactId}. ` +
1241
1242
  `Pages: ${pageCount} (${successCount} succeeded, ${failureCount} failed), ` +
1242
1243
  `Output: ${markdownContent.length} chars (total cost: ${totalCost})`);
1243
1244
  }
1244
1245
  catch (error) {
1245
- console.error(`Error in large PDF conversion for ${artifactId}:`, error);
1246
+ logger_1.logger.error(`Error in large PDF conversion for ${artifactId}:`, error);
1246
1247
  const errorContent = `# Conversion Failed\n\nThe PDF conversion failed with the following error:\n\n${error.message}\n\nPlease try uploading the file again.`;
1247
1248
  this.artifactService.updateArtifact(artifactId, errorContent);
1248
1249
  throw error;
1249
1250
  }
1250
1251
  }
1251
1252
  async convertPdfInBackground(artifactId, name, pdfBuffer) {
1252
- console.log(`Starting background PDF conversion for artifact ${artifactId}`);
1253
+ logger_1.logger.log(`Starting background PDF conversion for artifact ${artifactId}`);
1253
1254
  let agent = null;
1254
1255
  if (!process.env.DOC_CONVERSION_AI_SERVICE)
1255
1256
  throw new Error('DOC_CONVERSION_AI_SERVICE environment variable not set');
@@ -1272,7 +1273,7 @@ class AppService {
1272
1273
  throw new Error('PDF conversion produced empty content');
1273
1274
  }
1274
1275
  this.artifactService.updateArtifact(artifactId, markdownContent);
1275
- console.log(`PDF conversion complete: ${artifactId}. ` +
1276
+ logger_1.logger.log(`PDF conversion complete: ${artifactId}. ` +
1276
1277
  `Input: ${pdfBuffer.length} bytes, Output: ${markdownContent.length} chars, ` +
1277
1278
  `Cost: $${agent.totalCost.toFixed(4)}`);
1278
1279
  }
@@ -1281,7 +1282,7 @@ class AppService {
1281
1282
  await agent?.finishAgent();
1282
1283
  }
1283
1284
  catch (cleanupError) {
1284
- console.error('Agent cleanup error:', cleanupError);
1285
+ logger_1.logger.error('Agent cleanup error:', cleanupError);
1285
1286
  }
1286
1287
  }
1287
1288
  }
@@ -23,6 +23,7 @@ const twilio_service_1 = require("./twilio.service");
23
23
  const phone_validation_service_1 = require("./phone-validation.service");
24
24
  const rate_limit_service_1 = require("./rate-limit.service");
25
25
  const users_service_1 = require("./users.service");
26
+ const logger_1 = require("../common/logger");
26
27
  let AuthController = class AuthController {
27
28
  authService;
28
29
  publishedAgentsService;
@@ -69,7 +70,7 @@ let AuthController = class AuthController {
69
70
  };
70
71
  }
71
72
  catch (error) {
72
- console.error('Error sending verification code:', error);
73
+ logger_1.logger.error('Error sending verification code:', error);
73
74
  throw new common_1.BadRequestException('Failed to send verification code. Please try again.');
74
75
  }
75
76
  }
@@ -99,11 +100,11 @@ let AuthController = class AuthController {
99
100
  if (!user) {
100
101
  throw new common_1.BadRequestException('Failed to create user account');
101
102
  }
102
- console.log(`[AUTH] Auto-registered new user: ${userId}`);
103
+ logger_1.logger.log(`[AUTH] Auto-registered new user: ${userId}`);
103
104
  }
104
105
  this.rateLimitService.clearAttempts(normalizedPhone);
105
106
  await this.authService.loginWithPhone(user, dto.mode, res);
106
- console.log(`[AUTH] Phone login successful for user: ${user.userId} with mode: ${dto.mode}`);
107
+ logger_1.logger.log(`[AUTH] Phone login successful for user: ${user.userId} with mode: ${dto.mode}`);
107
108
  return res.json({
108
109
  success: true,
109
110
  userId: user.userId,
@@ -112,7 +113,7 @@ let AuthController = class AuthController {
112
113
  });
113
114
  }
114
115
  catch (error) {
115
- console.error('Error verifying OTP:', error);
116
+ logger_1.logger.error('Error verifying OTP:', error);
116
117
  if (error instanceof common_1.UnauthorizedException) {
117
118
  throw error;
118
119
  }
@@ -121,14 +122,14 @@ let AuthController = class AuthController {
121
122
  }
122
123
  async botLogin(dto, res) {
123
124
  if (!dto.botApiKey || dto.botApiKey !== process.env.BOT_API_KEY) {
124
- console.log(`[AUTH] Bot login attempt failed: Invalid bot API key`);
125
+ logger_1.logger.log(`[AUTH] Bot login attempt failed: Invalid bot API key`);
125
126
  throw new common_1.UnauthorizedException('Invalid bot API key');
126
127
  }
127
128
  if (!dto.discordUserId) {
128
- console.log(`[AUTH] Bot login attempt failed: Missing Discord user ID`);
129
+ logger_1.logger.log(`[AUTH] Bot login attempt failed: Missing Discord user ID`);
129
130
  throw new common_1.BadRequestException('Discord user ID is required');
130
131
  }
131
- console.log(`[AUTH] Bot login attempt for Discord user: ${dto.discordUserId}`);
132
+ logger_1.logger.log(`[AUTH] Bot login attempt for Discord user: ${dto.discordUserId}`);
132
133
  let user = this.usersService.findUser(dto.discordUserId);
133
134
  if (!user) {
134
135
  const userId = this.authService.register(dto.discordUserId);
@@ -136,10 +137,10 @@ let AuthController = class AuthController {
136
137
  if (!user) {
137
138
  throw new common_1.BadRequestException('Failed to create user account');
138
139
  }
139
- console.log(`[AUTH] Auto-registered Discord user: ${userId}`);
140
+ logger_1.logger.log(`[AUTH] Auto-registered Discord user: ${userId}`);
140
141
  }
141
142
  await this.authService.loginWithPhone(user, 'agents', res);
142
- console.log(`[AUTH] Bot login successful for Discord user: ${dto.discordUserId} (userId: ${user.userId})`);
143
+ logger_1.logger.log(`[AUTH] Bot login successful for Discord user: ${dto.discordUserId} (userId: ${user.userId})`);
143
144
  const token = res.getHeader('Set-Cookie');
144
145
  let accessToken = '';
145
146
  if (token) {
@@ -157,44 +158,44 @@ let AuthController = class AuthController {
157
158
  }
158
159
  async agentLogin(loginDto, res) {
159
160
  if (!loginDto.agentId) {
160
- console.log(`[AUTH] Agent login attempt failed: Missing agent ID`);
161
+ logger_1.logger.log(`[AUTH] Agent login attempt failed: Missing agent ID`);
161
162
  throw new common_1.BadRequestException('Agent ID is required');
162
163
  }
163
- console.log(`[AUTH] Agent login attempt for agent: ${loginDto.agentId}`);
164
+ logger_1.logger.log(`[AUTH] Agent login attempt for agent: ${loginDto.agentId}`);
164
165
  const userId = this.publishedAgentsService.getUserId(loginDto.agentId);
165
166
  if (!userId) {
166
- console.log(`[AUTH] Agent login failed for agent: ${loginDto.agentId} - Agent not found or not published`);
167
+ logger_1.logger.log(`[AUTH] Agent login failed for agent: ${loginDto.agentId} - Agent not found or not published`);
167
168
  throw new common_1.NotFoundException('Agent not found or not published');
168
169
  }
169
170
  const appService = this.userServiceManager.getAppService(userId);
170
171
  const agentDetails = await appService.getAgentDetails(loginDto.agentId);
171
172
  if (!agentDetails || !agentDetails.isPublished) {
172
- console.log(`[AUTH] Agent login failed for agent: ${loginDto.agentId} - Agent is not published`);
173
+ logger_1.logger.log(`[AUTH] Agent login failed for agent: ${loginDto.agentId} - Agent is not published`);
173
174
  throw new common_1.UnauthorizedException('Agent is not published');
174
175
  }
175
176
  await this.authService.loginAgent(loginDto.agentId, userId, res);
176
- console.log(`[AUTH] Agent login successful for agent: ${loginDto.agentId} (owner: ${userId})`);
177
+ logger_1.logger.log(`[AUTH] Agent login successful for agent: ${loginDto.agentId} (owner: ${userId})`);
177
178
  return res.json({ success: true, agentId: loginDto.agentId });
178
179
  }
179
180
  async roomLogin(loginDto, res) {
180
181
  if (!loginDto.roomId) {
181
- console.log(`[AUTH] Room login attempt failed: Missing room ID`);
182
+ logger_1.logger.log(`[AUTH] Room login attempt failed: Missing room ID`);
182
183
  throw new common_1.BadRequestException('Room ID is required');
183
184
  }
184
- console.log(`[AUTH] Room login attempt for room: ${loginDto.roomId}`);
185
+ logger_1.logger.log(`[AUTH] Room login attempt for room: ${loginDto.roomId}`);
185
186
  const userId = this.publishedRoomsService.getUserId(loginDto.roomId);
186
187
  if (!userId) {
187
- console.log(`[AUTH] Room login failed for room: ${loginDto.roomId} - Room not found or not published`);
188
+ logger_1.logger.log(`[AUTH] Room login failed for room: ${loginDto.roomId} - Room not found or not published`);
188
189
  throw new common_1.NotFoundException('Room not found or not published');
189
190
  }
190
191
  const appService = this.userServiceManager.getAppService(userId);
191
192
  const roomDetails = await appService.getRoomDetails(loginDto.roomId);
192
193
  if (!roomDetails) {
193
- console.log(`[AUTH] Room login failed for room: ${loginDto.roomId} - Room is not published`);
194
+ logger_1.logger.log(`[AUTH] Room login failed for room: ${loginDto.roomId} - Room is not published`);
194
195
  throw new common_1.UnauthorizedException('Room is not published');
195
196
  }
196
197
  await this.authService.loginRoom(loginDto.roomId, userId, res);
197
- console.log(`[AUTH] Room login successful for room: ${loginDto.roomId} (owner: ${userId})`);
198
+ logger_1.logger.log(`[AUTH] Room login successful for room: ${loginDto.roomId} (owner: ${userId})`);
198
199
  return res.json({ success: true, roomId: loginDto.roomId });
199
200
  }
200
201
  async logout(req, res) {
@@ -216,7 +217,7 @@ let AuthController = class AuthController {
216
217
  sameSite: 'lax',
217
218
  });
218
219
  if (userId) {
219
- console.log(`[AUTH] Logout for ${type}: ${userId}`);
220
+ logger_1.logger.log(`[AUTH] Logout for ${type}: ${userId}`);
220
221
  }
221
222
  return res.json({ success: true });
222
223
  }
@@ -16,6 +16,7 @@ const public_decorator_1 = require("./public.decorator");
16
16
  const jwt_1 = require("@nestjs/jwt");
17
17
  const published_agents_service_1 = require("../ai/published-agents.service");
18
18
  const published_rooms_service_1 = require("../room/published-rooms.service");
19
+ const logger_1 = require("../common/logger");
19
20
  let JwtAuthGuard = class JwtAuthGuard {
20
21
  reflector;
21
22
  jwtService;
@@ -40,7 +41,7 @@ let JwtAuthGuard = class JwtAuthGuard {
40
41
  if (agentIdHeader) {
41
42
  const userId = this.publishedAgentsService.getUserId(agentIdHeader);
42
43
  if (!userId) {
43
- console.log(`[AUTH] Invalid or unpublished agent ID in header: ${agentIdHeader}`);
44
+ logger_1.logger.log(`[AUTH] Invalid or unpublished agent ID in header: ${agentIdHeader}`);
44
45
  return false;
45
46
  }
46
47
  request.user = {
@@ -57,7 +58,7 @@ let JwtAuthGuard = class JwtAuthGuard {
57
58
  if (roomIdHeader) {
58
59
  const userId = this.publishedRoomsService.getUserId(roomIdHeader);
59
60
  if (!userId) {
60
- console.log(`[AUTH] Invalid or unpublished room ID in header: ${roomIdHeader}`);
61
+ logger_1.logger.log(`[AUTH] Invalid or unpublished room ID in header: ${roomIdHeader}`);
61
62
  return false;
62
63
  }
63
64
  request.user = {
@@ -128,7 +129,7 @@ let JwtAuthGuard = class JwtAuthGuard {
128
129
  return true;
129
130
  }
130
131
  catch (error) {
131
- console.log('[AUTH] Invalid JWT token:', error.message);
132
+ logger_1.logger.log('[AUTH] Invalid JWT token:', error.message);
132
133
  return false;
133
134
  }
134
135
  }
@@ -1,5 +1,4 @@
1
1
  export declare class RateLimitService {
2
- private readonly logger;
3
2
  private readonly attemptMap;
4
3
  private readonly MAX_ATTEMPTS;
5
4
  private readonly WINDOW_MINUTES;
@@ -8,12 +8,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
- var RateLimitService_1;
12
11
  Object.defineProperty(exports, "__esModule", { value: true });
13
12
  exports.RateLimitService = void 0;
14
13
  const common_1 = require("@nestjs/common");
15
- let RateLimitService = RateLimitService_1 = class RateLimitService {
16
- logger = new common_1.Logger(RateLimitService_1.name);
14
+ const logger_1 = require("../common/logger");
15
+ let RateLimitService = class RateLimitService {
17
16
  attemptMap = new Map();
18
17
  MAX_ATTEMPTS = 3;
19
18
  WINDOW_MINUTES = 15;
@@ -52,11 +51,11 @@ let RateLimitService = RateLimitService_1 = class RateLimitService {
52
51
  else {
53
52
  entry.count++;
54
53
  }
55
- this.logger.debug(`Rate limit recorded for ${phone}: ${this.attemptMap.get(phone)?.count}/${this.MAX_ATTEMPTS}`);
54
+ logger_1.logger.log(`Rate limit recorded for ${phone}: ${this.attemptMap.get(phone)?.count}/${this.MAX_ATTEMPTS}`);
56
55
  }
57
56
  clearAttempts(phone) {
58
57
  this.attemptMap.delete(phone);
59
- this.logger.debug(`Rate limit cleared for ${phone}`);
58
+ logger_1.logger.log(`Rate limit cleared for ${phone}`);
60
59
  }
61
60
  cleanup() {
62
61
  const now = new Date();
@@ -68,7 +67,7 @@ let RateLimitService = RateLimitService_1 = class RateLimitService {
68
67
  }
69
68
  }
70
69
  if (cleaned > 0) {
71
- this.logger.debug(`Cleaned up ${cleaned} expired rate limit entries`);
70
+ logger_1.logger.log(`Cleaned up ${cleaned} expired rate limit entries`);
72
71
  }
73
72
  }
74
73
  onModuleDestroy() {
@@ -78,7 +77,7 @@ let RateLimitService = RateLimitService_1 = class RateLimitService {
78
77
  }
79
78
  };
80
79
  exports.RateLimitService = RateLimitService;
81
- exports.RateLimitService = RateLimitService = RateLimitService_1 = __decorate([
80
+ exports.RateLimitService = RateLimitService = __decorate([
82
81
  (0, common_1.Injectable)(),
83
82
  __metadata("design:paramtypes", [])
84
83
  ], RateLimitService);
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.TwilioService = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
14
  const config_1 = require("@nestjs/config");
15
+ const logger_1 = require("../common/logger");
15
16
  let TwilioService = class TwilioService {
16
17
  configService;
17
18
  TWILIO_ACCOUNT_SID;
@@ -32,7 +33,7 @@ let TwilioService = class TwilioService {
32
33
  }
33
34
  async sendVerification(to, channel = 'sms') {
34
35
  if (this.isTestMode() && this.isTestPhoneNumber(to)) {
35
- console.log(`[TEST MODE] Skipping OTP send for test number: ${to}`);
36
+ logger_1.logger.log(`[TEST MODE] Skipping OTP send for test number: ${to}`);
36
37
  return { status: 'pending', to: `+1${to}` };
37
38
  }
38
39
  const dialPrefix = '+1';
@@ -64,10 +65,10 @@ let TwilioService = class TwilioService {
64
65
  async checkVerification(to, code) {
65
66
  if (this.isTestMode() && this.isTestPhoneNumber(to)) {
66
67
  if (code.length === 6 && /^\d{6}$/.test(code)) {
67
- console.log(`[TEST MODE] Accepting test code for: ${to}`);
68
+ logger_1.logger.log(`[TEST MODE] Accepting test code for: ${to}`);
68
69
  return { status: 'approved', valid: true };
69
70
  }
70
- console.log(`[TEST MODE] Rejecting invalid test code format for: ${to}`);
71
+ logger_1.logger.log(`[TEST MODE] Rejecting invalid test code format for: ${to}`);
71
72
  return { status: 'pending', valid: false };
72
73
  }
73
74
  const dialPrefix = '+1';
@@ -47,6 +47,7 @@ const common_1 = require("@nestjs/common");
47
47
  const fs = __importStar(require("fs"));
48
48
  const path = __importStar(require("path"));
49
49
  const uuid_1 = require("uuid");
50
+ const logger_1 = require("../common/logger");
50
51
  let UsersService = class UsersService {
51
52
  usersFilePath;
52
53
  dataDir;
@@ -64,7 +65,7 @@ let UsersService = class UsersService {
64
65
  if (!fs.existsSync(this.usersFilePath)) {
65
66
  fs.writeFileSync(this.usersFilePath, JSON.stringify({}), 'utf-8');
66
67
  }
67
- console.log('UsersService initialized with phone/OTP authentication');
68
+ logger_1.logger.log('UsersService initialized with phone/OTP authentication');
68
69
  }
69
70
  loadUsers() {
70
71
  try {
@@ -121,13 +122,13 @@ let UsersService = class UsersService {
121
122
  const userDir = path.resolve(this.dataDir, 'user', userId);
122
123
  if (fs.existsSync(userDir)) {
123
124
  fs.rmSync(userDir, { recursive: true, force: true });
124
- console.log(`Deleted user directory: ${userDir}`);
125
+ logger_1.logger.log(`Deleted user directory: ${userDir}`);
125
126
  }
126
127
  }
127
128
  catch (error) {
128
- console.error(`Error deleting user directory for ${userId}:`, error);
129
+ logger_1.logger.error(`Error deleting user directory for ${userId}:`, error);
129
130
  }
130
- console.log(`User ${userId} deleted successfully`);
131
+ logger_1.logger.log(`User ${userId} deleted successfully`);
131
132
  }
132
133
  findUserByPhone(phoneNumber) {
133
134
  const users = this.loadUsers();
@@ -0,0 +1,21 @@
1
+ export type LogLevel = 'debug' | 'log' | 'warn' | 'error';
2
+ declare class BriyahLogger {
3
+ private stream;
4
+ private useConsole;
5
+ private minLevel;
6
+ private readonly priority;
7
+ configure(options: {
8
+ logFile?: string;
9
+ console?: boolean;
10
+ enabled?: boolean;
11
+ level?: LogLevel;
12
+ }): void;
13
+ debug(message: string, ...args: any[]): void;
14
+ log(message: string, ...args: any[]): void;
15
+ warn(message: string, ...args: any[]): void;
16
+ error(message: string, ...args: any[]): void;
17
+ close(): void;
18
+ private write;
19
+ }
20
+ export declare const logger: BriyahLogger;
21
+ export {};
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.logger = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ class BriyahLogger {
40
+ stream = null;
41
+ useConsole = false;
42
+ minLevel = 'log';
43
+ priority = { debug: 0, log: 1, warn: 2, error: 3 };
44
+ configure(options) {
45
+ if (options.enabled === false)
46
+ return;
47
+ if (!options.logFile && !options.console)
48
+ return;
49
+ this.minLevel = options.level ?? 'log';
50
+ if (options.logFile) {
51
+ fs.mkdirSync(path.dirname(options.logFile), { recursive: true });
52
+ this.stream = fs.createWriteStream(options.logFile, { flags: 'a' });
53
+ }
54
+ if (options.console) {
55
+ this.useConsole = true;
56
+ }
57
+ }
58
+ debug(message, ...args) { this.write('debug', message, args); }
59
+ log(message, ...args) { this.write('log', message, args); }
60
+ warn(message, ...args) { this.write('warn', message, args); }
61
+ error(message, ...args) { this.write('error', message, args); }
62
+ close() { this.stream?.end(); this.stream = null; this.useConsole = false; }
63
+ write(level, message, args) {
64
+ if (this.priority[level] < this.priority[this.minLevel])
65
+ return;
66
+ if (this.stream) {
67
+ const label = level === 'debug' ? 'DBG ' : level === 'log' ? 'LOG ' : level === 'warn' ? 'WARN' : 'ERR ';
68
+ const extra = args.length
69
+ ? ' ' + args.map(a => (typeof a === 'object' ? JSON.stringify(a) : String(a))).join(' ')
70
+ : '';
71
+ this.stream.write(`[${new Date().toISOString()}] [${label}] ${message}${extra}\n`);
72
+ }
73
+ if (this.useConsole) {
74
+ if (level === 'error')
75
+ console.error(message, ...args);
76
+ else if (level === 'warn')
77
+ console.warn(message, ...args);
78
+ else
79
+ console.log(message, ...args);
80
+ }
81
+ }
82
+ }
83
+ exports.logger = new BriyahLogger();
@@ -1,6 +1,5 @@
1
1
  import { Artifact } from './artifact';
2
2
  export declare class ArtifactStoreService {
3
- private readonly logger;
4
3
  private readonly ARTIFACT_EXTENSION;
5
4
  private readonly MAX_FILENAME_LENGTH;
6
5
  private readonly UNSAFE_CHARS_REGEX;