briyah 1.0.7 → 1.0.9
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 +4 -1
- package/dist/server/src/sdk/index.js +3 -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 +114 -113
- package/dist/shared/types/app.types.d.ts +1 -2
- 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/classes/RoomMessage.html +41 -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 +741 -0
- package/docs/interfaces/Artifact.html +6 -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/StoryMessageUpdate.html +6 -0
- package/docs/interfaces/StoryState.html +15 -0
- package/docs/interfaces/StorySuggestion.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
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
938
|
+
logger_1.logger.log(`Restored ${restoredAgentIds.length} agents from chapter 1 backup`);
|
|
938
939
|
}
|
|
939
940
|
else {
|
|
940
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1071
|
+
logger_1.logger.error(`Error resuming story ${story.id}:`, error);
|
|
1071
1072
|
}
|
|
1072
1073
|
}
|
|
1073
1074
|
if (resumedCount > 0) {
|
|
1074
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
+
logger_1.logger.log(`[AUTH] Auto-registered Discord user: ${userId}`);
|
|
140
141
|
}
|
|
141
142
|
await this.authService.loginWithPhone(user, 'agents', res);
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
132
|
+
logger_1.logger.log('[AUTH] Invalid JWT token:', error.message);
|
|
132
133
|
return false;
|
|
133
134
|
}
|
|
134
135
|
}
|
|
@@ -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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
68
|
+
logger_1.logger.log(`[TEST MODE] Accepting test code for: ${to}`);
|
|
68
69
|
return { status: 'approved', valid: true };
|
|
69
70
|
}
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
+
logger_1.logger.log(`Deleted user directory: ${userDir}`);
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
128
|
catch (error) {
|
|
128
|
-
|
|
129
|
+
logger_1.logger.error(`Error deleting user directory for ${userId}:`, error);
|
|
129
130
|
}
|
|
130
|
-
|
|
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();
|