From 6293d588bc32320dd8753721a957fcd338c046a8 Mon Sep 17 00:00:00 2001 From: asepharyana Date: Sat, 1 Aug 2026 22:09:02 +0700 Subject: [PATCH] =?UTF-8?q?chore(lint):=20biome=20cleanup=20across=20servi?= =?UTF-8?q?ces=20=E2=80=94=20format,=20sort=20imports,=20drop=20unused?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - discord-gateway: 74 lint errors -> 0 (format, import sorting, unused imports/vars, dead breath var) - backend: format + sort imports (11 warnings left: noExplicitAny) - frontend: remove unused imports, drop dead breathing var, fix useExhaustiveDependencies (scroll keyed on messages), a11y biome-ignore for drag surface + stopPropagation container (mouse-only gestures) - remaining warnings are false positives: index keys on static lists, in static export (next/image unsupported), noExplicitAny tsc --noEmit clean on all 3 services; vitest green (60+36). --- services/backend/src/http/app.ts | 4 +- .../modules/analysis/analysis.repository.ts | 4 +- .../src/modules/analysis/analysis.routes.ts | 2 +- .../src/modules/chatbot/chatbot.controller.ts | 2 +- .../src/modules/chatbot/chatbot.repository.ts | 4 +- .../src/modules/chatbot/chatbot.routes.ts | 6 +- .../modules/dashboard/dashboard.repository.ts | 6 +- .../src/modules/dashboard/dashboard.routes.ts | 2 +- .../src/modules/health/health.repository.ts | 2 +- .../backend/src/modules/media/media.routes.ts | 2 +- .../src/modules/media/media.service.ts | 8 +-- .../modules/messages/messages.controller.ts | 2 +- .../modules/messages/messages.repository.ts | 6 +- .../src/modules/messages/messages.routes.ts | 2 +- .../modules/recordings/recordings.routes.ts | 2 +- .../modules/recordings/recordings.service.ts | 4 +- .../src/modules/ui-state/ui-state.routes.ts | 2 +- .../src/modules/ui-state/ui-state.service.ts | 2 +- .../src/modules/voice/voice.controller.ts | 2 +- .../backend/src/modules/voice/voice.routes.ts | 2 +- .../src/modules/voice/voice.service.ts | 12 ++-- services/backend/src/shared/config/index.ts | 2 - services/backend/src/shared/database/init.ts | 2 +- .../backend/src/shared/database/schema.ts | 3 +- .../backend/src/shared/middlewares/index.ts | 4 +- services/backend/src/shared/redis/index.ts | 4 +- services/backend/src/ws/redis-bridge.ts | 7 +- services/backend/src/ws/server.ts | 4 +- services/discord-gateway/src/app/bootstrap.ts | 4 +- services/discord-gateway/src/app/retention.ts | 2 +- services/discord-gateway/src/app/shutdown.ts | 2 +- .../modules/ai-moderation/autoDeleteLogger.ts | 2 +- .../ai-moderation/autoDeleteManager.ts | 2 +- .../modules/ai-moderation/autoDeleteNotify.ts | 2 +- .../ai-moderation/channelCultureStore.ts | 2 +- .../ai-moderation/conversationContext.ts | 2 +- .../ai-moderation/conversationState.ts | 2 +- .../modules/ai-moderation/cultureLearner.ts | 2 +- .../modules/ai-moderation/discordTokens.ts | 11 ++- .../src/modules/ai-moderation/index.ts | 11 ++- .../individualFallbackProcessor.ts | 6 +- .../ai-moderation/moderationBuilders.ts | 2 +- .../ai-moderation/moderationResponseParser.ts | 2 +- .../ai-moderation/moderationSchemas.ts | 2 +- .../modules/ai-moderation/moderationState.ts | 2 +- .../modules/ai-moderation/searxngSearch.ts | 2 +- .../ai-moderation/userProfileLearner.ts | 2 +- .../modules/ai-moderation/userProfileStore.ts | 2 +- .../modules/attachment-upload/imageResizer.ts | 2 +- .../channel-topic/channelTopicCapture.ts | 2 +- .../modules/command-handler/commandHandler.ts | 10 +-- .../modules/command-handler/guild.handler.ts | 2 +- .../modules/command-handler/media.handler.ts | 2 +- .../command-handler/moderation.handler.ts | 2 +- .../modules/command-handler/voice.handler.ts | 4 +- .../event-broadcaster/eventBroadcaster.ts | 7 +- .../guild-member-events/memberEvents.ts | 2 +- .../modules/message-capture/attachmentsDb.ts | 2 +- .../modules/message-capture/messageCapture.ts | 2 +- .../modules/message-capture/messageStore.ts | 6 +- .../message-capture/messagesAnalysis.ts | 2 +- .../message-capture/messagesCleanup.ts | 2 +- .../modules/message-capture/messagesCrud.ts | 2 +- .../src/modules/message-capture/messagesDb.ts | 2 +- .../message-capture/messagesPagination.ts | 4 +- .../modules/message-capture/messagesSearch.ts | 2 +- .../message-capture/moderationActionsDb.ts | 4 +- .../modules/message-capture/retentionDb.ts | 5 +- .../src/modules/message-capture/reviewsDb.ts | 8 ++- .../src/modules/message-capture/types.ts | 2 +- .../reaction-tracking/reactionCapture.ts | 2 +- .../modules/thread-tracking/threadCapture.ts | 2 +- .../modules/user-presence/presenceCapture.ts | 2 +- .../modules/voice-pcm-ws/voicePcmWsClient.ts | 2 +- .../modules/voice-recording/mediaSource.ts | 6 +- .../src/modules/voice-recording/muxer.ts | 2 +- .../src/modules/voice-recording/player.ts | 2 +- .../src/modules/voice-recording/recorder.ts | 4 +- .../voice-recording/recorder/decoder.ts | 2 +- .../voice-recording/recorder/metadata.ts | 2 +- .../voice-recording/recorder/segment.ts | 2 +- .../recorder/speakingHandler.ts | 2 +- .../voice-recording/recorder/streamSetup.ts | 2 +- .../voice-recording/recorder/uploader.ts | 2 +- .../voice-recording/screenShareController.ts | 14 ++-- .../modules/voice-recording/transmitter.ts | 4 +- .../voice-recording/voiceController.ts | 4 +- .../voice-recording/voiceTranscriber.ts | 2 +- .../src/shared/database/init.ts | 2 +- .../src/shared/database/migrate.ts | 2 +- .../src/shared/database/schema.ts | 3 +- .../src/shared/database/schema/messages.ts | 10 +-- .../src/shared/database/schema/meta.ts | 3 +- .../src/shared/database/voiceRecordingRepo.ts | 2 +- .../src/components/analysis/search-panel.tsx | 1 - .../src/components/chatbot/chat-panel.tsx | 29 ++++++-- .../src/components/chatbot/chatbot-canvas.tsx | 14 ++-- .../components/chatbot/chatbot-container.tsx | 30 +++++--- .../components/chatbot/chatbot-context.tsx | 1 - .../frontend/src/components/chatbot/index.ts | 6 +- .../frontend/src/components/glass/card.tsx | 13 ++-- .../frontend/src/components/glass/panel.tsx | 2 +- .../src/components/layout/mobile-nav.tsx | 4 +- .../src/components/layout/top-nav.tsx | 4 +- .../src/components/media/mini-player.tsx | 11 +-- .../components/messages/ai-analysis-panel.tsx | 57 +++++++++++---- .../components/messages/ai-status-badge.tsx | 6 +- .../components/messages/attachments-grid.tsx | 5 +- .../messages/message-detail-view.tsx | 23 ++++-- .../components/messages/message-detail.tsx | 23 ++++-- .../src/components/messages/message-list.tsx | 2 +- .../components/messages/search-overlay.tsx | 1 - .../components/recordings/recording-card.tsx | 15 ++-- .../recordings/recording-player.tsx | 14 ++-- .../src/components/shared/error-boundary.tsx | 41 +++++++---- .../src/components/voice/connection-card.tsx | 25 +++++-- .../src/components/voice/listen-control.tsx | 6 +- .../src/components/voice/mic-control.tsx | 16 +++-- .../src/components/voice/speaker-waveform.tsx | 10 ++- services/frontend/src/hooks/use-media.ts | 5 +- services/frontend/src/hooks/use-messages.ts | 7 +- services/frontend/src/lib/audio/pcm-player.ts | 7 +- .../src/lib/hooks/use-media-player.tsx | 72 ++++++++++++------- 123 files changed, 466 insertions(+), 308 deletions(-) diff --git a/services/backend/src/http/app.ts b/services/backend/src/http/app.ts index 3f5a562..5f3f804 100644 --- a/services/backend/src/http/app.ts +++ b/services/backend/src/http/app.ts @@ -1,4 +1,3 @@ -import { createChildLogger } from "@/shared/logger/index"; import express, { type Express, type NextFunction, @@ -6,11 +5,12 @@ import express, { type Response, } from "express"; import helmet from "helmet"; +import { createChildLogger } from "@/shared/logger/index"; import { createAnalysisRouter } from "../modules/analysis/index.js"; +import { createChatbotRouter } from "../modules/chatbot/index.js"; import { createConfigRouter } from "../modules/config/index.js"; import { createDashboardRouter } from "../modules/dashboard/index.js"; import { createHealthRouter } from "../modules/health/index.js"; -import { createChatbotRouter } from "../modules/chatbot/index.js"; import { createMediaRouter } from "../modules/media/index.js"; import { createMessagesRouter } from "../modules/messages/index.js"; import { createRecordingsRouter } from "../modules/recordings/index.js"; diff --git a/services/backend/src/modules/analysis/analysis.repository.ts b/services/backend/src/modules/analysis/analysis.repository.ts index 432245e..eed1de0 100644 --- a/services/backend/src/modules/analysis/analysis.repository.ts +++ b/services/backend/src/modules/analysis/analysis.repository.ts @@ -1,7 +1,7 @@ -import { pgMessagesTable } from "../../shared/index.js"; -import { createChildLogger } from "../../shared/logger/index.js"; import { and, desc, eq, ilike, type SQL } from "drizzle-orm"; import { getDatabase } from "../../shared/database/index.js"; +import { pgMessagesTable } from "../../shared/index.js"; +import { createChildLogger } from "../../shared/logger/index.js"; import { type MappedMessage, mapMessageRow, diff --git a/services/backend/src/modules/analysis/analysis.routes.ts b/services/backend/src/modules/analysis/analysis.routes.ts index 3b4556f..3092248 100644 --- a/services/backend/src/modules/analysis/analysis.routes.ts +++ b/services/backend/src/modules/analysis/analysis.routes.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response, Router } from "express"; import express from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler } from "../../shared/middlewares/index.js"; import { analysisService } from "./analysis.service.js"; diff --git a/services/backend/src/modules/chatbot/chatbot.controller.ts b/services/backend/src/modules/chatbot/chatbot.controller.ts index 6c3cf17..29dd358 100644 --- a/services/backend/src/modules/chatbot/chatbot.controller.ts +++ b/services/backend/src/modules/chatbot/chatbot.controller.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response } from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler } from "../../shared/middlewares/index.js"; import { chatbotService } from "./chatbot.service.js"; diff --git a/services/backend/src/modules/chatbot/chatbot.repository.ts b/services/backend/src/modules/chatbot/chatbot.repository.ts index c5b9c2a..cd8f851 100644 --- a/services/backend/src/modules/chatbot/chatbot.repository.ts +++ b/services/backend/src/modules/chatbot/chatbot.repository.ts @@ -1,7 +1,7 @@ -import { pgChatbotMessagesTable, pgMessagesTable } from "../../shared/index.js"; -import { createChildLogger } from "../../shared/logger/index.js"; import { and, desc, eq, type SQL, sql } from "drizzle-orm"; import { getDatabase } from "../../shared/database/index.js"; +import { pgChatbotMessagesTable, pgMessagesTable } from "../../shared/index.js"; +import { createChildLogger } from "../../shared/logger/index.js"; const logger = createChildLogger("chatbot.repository"); diff --git a/services/backend/src/modules/chatbot/chatbot.routes.ts b/services/backend/src/modules/chatbot/chatbot.routes.ts index 2735d02..78790e4 100644 --- a/services/backend/src/modules/chatbot/chatbot.routes.ts +++ b/services/backend/src/modules/chatbot/chatbot.routes.ts @@ -10,11 +10,7 @@ import { chatRequestSchema } from "./chatbot.schema.js"; export function createChatbotRouter(): Router { const router = express.Router(); - router.post( - "/chat", - validateBody(chatRequestSchema), - handleChatbotChat, - ); + router.post("/chat", validateBody(chatRequestSchema), handleChatbotChat); router.get("/chat/history", getChatbotHistory); router.delete("/chat/history", clearChatbotHistory); diff --git a/services/backend/src/modules/dashboard/dashboard.repository.ts b/services/backend/src/modules/dashboard/dashboard.repository.ts index 49945be..d0404e0 100644 --- a/services/backend/src/modules/dashboard/dashboard.repository.ts +++ b/services/backend/src/modules/dashboard/dashboard.repository.ts @@ -1,3 +1,6 @@ +import type { SQL } from "drizzle-orm"; +import { sql } from "drizzle-orm"; +import { getDatabase } from "../../shared/database/index.js"; import { pgChannelCulturesTable, pgMessagesTable, @@ -5,9 +8,6 @@ import { pgUserReputationsTable, pgVoiceRecordingsTable, } from "../../shared/index.js"; -import type { SQL } from "drizzle-orm"; -import { sql } from "drizzle-orm"; -import { getDatabase } from "../../shared/database/index.js"; import type { ListUsersQuery } from "./dashboard.service.js"; export class DashboardRepository { diff --git a/services/backend/src/modules/dashboard/dashboard.routes.ts b/services/backend/src/modules/dashboard/dashboard.routes.ts index a519e75..085b5fe 100644 --- a/services/backend/src/modules/dashboard/dashboard.routes.ts +++ b/services/backend/src/modules/dashboard/dashboard.routes.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response, Router } from "express"; import express from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler } from "../../shared/middlewares/index.js"; import { dashboardService } from "./dashboard.service.js"; diff --git a/services/backend/src/modules/health/health.repository.ts b/services/backend/src/modules/health/health.repository.ts index 7f2819f..b46b9cf 100644 --- a/services/backend/src/modules/health/health.repository.ts +++ b/services/backend/src/modules/health/health.repository.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { sql } from "drizzle-orm"; +import { createChildLogger } from "@/shared/logger/index"; import { getDatabase } from "../../shared/database/index.js"; const logger = createChildLogger("health.repository"); diff --git a/services/backend/src/modules/media/media.routes.ts b/services/backend/src/modules/media/media.routes.ts index 0a68458..747d2a0 100644 --- a/services/backend/src/modules/media/media.routes.ts +++ b/services/backend/src/modules/media/media.routes.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response, Router } from "express"; import express from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler, validateBody } from "../../shared/middlewares/index.js"; import { mediaQueueSchema, mediaVolumeSchema } from "./media.schema.js"; import { getStatus, queue, setVolume, skip, stop } from "./media.service.js"; diff --git a/services/backend/src/modules/media/media.service.ts b/services/backend/src/modules/media/media.service.ts index 034c228..34d3722 100644 --- a/services/backend/src/modules/media/media.service.ts +++ b/services/backend/src/modules/media/media.service.ts @@ -1,3 +1,7 @@ +import { + createChildLogger, + tryCommandThenFallback, +} from "../../shared/commandHelper.js"; import { COMMAND_MEDIA_QUEUE, COMMAND_MEDIA_SKIP, @@ -5,10 +9,6 @@ import { COMMAND_MEDIA_VOLUME, MEDIA_STATUS_KEY, } from "../../shared/index.js"; -import { - createChildLogger, - tryCommandThenFallback, -} from "../../shared/commandHelper.js"; import { publishCommand, readRedisStatus } from "../../shared/redis/index.js"; const logger = createChildLogger("media.service"); diff --git a/services/backend/src/modules/messages/messages.controller.ts b/services/backend/src/modules/messages/messages.controller.ts index 9638555..e83eb62 100644 --- a/services/backend/src/modules/messages/messages.controller.ts +++ b/services/backend/src/modules/messages/messages.controller.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response } from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler } from "../../shared/middlewares/index.js"; import { messageQuerySchema } from "./messages.schema.js"; import { messagesService } from "./messages.service.js"; diff --git a/services/backend/src/modules/messages/messages.repository.ts b/services/backend/src/modules/messages/messages.repository.ts index dcc42e5..7648264 100644 --- a/services/backend/src/modules/messages/messages.repository.ts +++ b/services/backend/src/modules/messages/messages.repository.ts @@ -1,6 +1,3 @@ -import type { PageResult } from "../../shared/index.js"; -import { pgAttachmentsTable, pgMessagesTable } from "../../shared/index.js"; -import { createChildLogger } from "../../shared/logger/index.js"; import { and, desc, @@ -16,6 +13,9 @@ import { } from "drizzle-orm"; import { config } from "../../shared/config/index.js"; import { getDatabase } from "../../shared/database/index.js"; +import type { PageResult } from "../../shared/index.js"; +import { pgAttachmentsTable, pgMessagesTable } from "../../shared/index.js"; +import { createChildLogger } from "../../shared/logger/index.js"; import { mapMessageRow } from "../../shared/utils/messageMapper.js"; import type { MessageCreate, diff --git a/services/backend/src/modules/messages/messages.routes.ts b/services/backend/src/modules/messages/messages.routes.ts index a14926f..d7d3168 100644 --- a/services/backend/src/modules/messages/messages.routes.ts +++ b/services/backend/src/modules/messages/messages.routes.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response, Router } from "express"; import express from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler, validateBody } from "../../shared/middlewares/index.js"; import { handleGetAttachmentsByChannel, diff --git a/services/backend/src/modules/recordings/recordings.routes.ts b/services/backend/src/modules/recordings/recordings.routes.ts index 32c636a..41a2add 100644 --- a/services/backend/src/modules/recordings/recordings.routes.ts +++ b/services/backend/src/modules/recordings/recordings.routes.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response, Router } from "express"; import express from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler } from "../../shared/middlewares/index.js"; import { recordingsService } from "./recordings.service.js"; diff --git a/services/backend/src/modules/recordings/recordings.service.ts b/services/backend/src/modules/recordings/recordings.service.ts index 4bb818f..e540768 100644 --- a/services/backend/src/modules/recordings/recordings.service.ts +++ b/services/backend/src/modules/recordings/recordings.service.ts @@ -1,7 +1,7 @@ -import { pgVoiceRecordingsTable } from "../../shared/index.js"; -import { createChildLogger } from "../../shared/logger/index.js"; import { and, desc, eq, lt, type SQL } from "drizzle-orm"; import { getDatabase } from "../../shared/database/index.js"; +import { pgVoiceRecordingsTable } from "../../shared/index.js"; +import { createChildLogger } from "../../shared/logger/index.js"; const logger = createChildLogger("recordings.service"); diff --git a/services/backend/src/modules/ui-state/ui-state.routes.ts b/services/backend/src/modules/ui-state/ui-state.routes.ts index d25bb66..1b67152 100644 --- a/services/backend/src/modules/ui-state/ui-state.routes.ts +++ b/services/backend/src/modules/ui-state/ui-state.routes.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response, Router } from "express"; import express from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler } from "../../shared/middlewares/index.js"; import { uiStateService } from "./ui-state.service.js"; diff --git a/services/backend/src/modules/ui-state/ui-state.service.ts b/services/backend/src/modules/ui-state/ui-state.service.ts index 8632923..44aee78 100644 --- a/services/backend/src/modules/ui-state/ui-state.service.ts +++ b/services/backend/src/modules/ui-state/ui-state.service.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { sql } from "drizzle-orm"; +import { createChildLogger } from "@/shared/logger/index"; import { getDatabase } from "../../shared/database/index.js"; const logger = createChildLogger("ui-state.service"); diff --git a/services/backend/src/modules/voice/voice.controller.ts b/services/backend/src/modules/voice/voice.controller.ts index a827a9d..b76ff07 100644 --- a/services/backend/src/modules/voice/voice.controller.ts +++ b/services/backend/src/modules/voice/voice.controller.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response } from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler } from "../../shared/middlewares/index.js"; import { publishCommandNoReply } from "../../shared/redis/index.js"; import type { ConnectVoiceInput, VoiceCommandInput } from "./voice.schema.js"; diff --git a/services/backend/src/modules/voice/voice.routes.ts b/services/backend/src/modules/voice/voice.routes.ts index 1ed9412..74d9ed8 100644 --- a/services/backend/src/modules/voice/voice.routes.ts +++ b/services/backend/src/modules/voice/voice.routes.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Request, Response, Router } from "express"; import express from "express"; +import { createChildLogger } from "@/shared/logger/index"; import { asyncHandler, validateBody } from "../../shared/middlewares/index.js"; import { handleConnectVoice, diff --git a/services/backend/src/modules/voice/voice.service.ts b/services/backend/src/modules/voice/voice.service.ts index 0dec772..d9795fe 100644 --- a/services/backend/src/modules/voice/voice.service.ts +++ b/services/backend/src/modules/voice/voice.service.ts @@ -1,3 +1,9 @@ +import { eq } from "drizzle-orm"; +import { + createChildLogger, + tryCommandThenFallback, +} from "../../shared/commandHelper.js"; +import { getDatabase } from "../../shared/database/index.js"; import { COMMAND_GUILDS_LIST, COMMAND_GUILDS_TEXT_CHANNELS, @@ -8,12 +14,6 @@ import { pgMessagesTable, VOICE_STATUS_KEY, } from "../../shared/index.js"; -import { eq } from "drizzle-orm"; -import { - createChildLogger, - tryCommandThenFallback, -} from "../../shared/commandHelper.js"; -import { getDatabase } from "../../shared/database/index.js"; import { publishCommand, readRedisStatus } from "../../shared/redis/index.js"; const logger = createChildLogger("voice.service"); diff --git a/services/backend/src/shared/config/index.ts b/services/backend/src/shared/config/index.ts index e1e6f02..2739a24 100644 --- a/services/backend/src/shared/config/index.ts +++ b/services/backend/src/shared/config/index.ts @@ -160,8 +160,6 @@ export const configSchema = z .default(30000) .describe("Timeout for individual LLM moderation calls"), - - // ── AI Analysis Timing ────────────────────────────────────────────── AI_ANALYSIS_DEBOUNCE_MS: z.coerce.number().positive().default(500), AI_ANALYSIS_RECOVERY_INTERVAL_MS: z.coerce diff --git a/services/backend/src/shared/database/init.ts b/services/backend/src/shared/database/init.ts index ca91bbb..98e5e2c 100644 --- a/services/backend/src/shared/database/init.ts +++ b/services/backend/src/shared/database/init.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "../logger/index.js"; import { drizzle } from "drizzle-orm/node-postgres"; import type { Pool, PoolClient } from "pg"; +import { createChildLogger } from "../logger/index.js"; import { closePool, createPoolFromConfig } from "./pool.js"; const logger = createChildLogger("database.init"); diff --git a/services/backend/src/shared/database/schema.ts b/services/backend/src/shared/database/schema.ts index 5a7bc2f..bca1b57 100644 --- a/services/backend/src/shared/database/schema.ts +++ b/services/backend/src/shared/database/schema.ts @@ -592,5 +592,4 @@ export type DbRetentionPolicyInsert = // Chatbot Messages export type ChatbotMessage = typeof chatbotMessagesTable.$inferSelect; -export type ChatbotMessageInsert = - typeof chatbotMessagesTable.$inferInsert; +export type ChatbotMessageInsert = typeof chatbotMessagesTable.$inferInsert; diff --git a/services/backend/src/shared/middlewares/index.ts b/services/backend/src/shared/middlewares/index.ts index d2eafae..5958f42 100644 --- a/services/backend/src/shared/middlewares/index.ts +++ b/services/backend/src/shared/middlewares/index.ts @@ -1,7 +1,7 @@ -import { AppError, ValidationError } from "@/shared/errors/index"; -import { createChildLogger } from "@/shared/logger/index"; import type { NextFunction, Request, Response } from "express"; import type { ZodSchema } from "zod"; +import { AppError, ValidationError } from "@/shared/errors/index"; +import { createChildLogger } from "@/shared/logger/index"; const logger = createChildLogger("middleware"); diff --git a/services/backend/src/shared/redis/index.ts b/services/backend/src/shared/redis/index.ts index 3866f07..0445a7e 100644 --- a/services/backend/src/shared/redis/index.ts +++ b/services/backend/src/shared/redis/index.ts @@ -1,4 +1,6 @@ import { randomUUID } from "node:crypto"; +import Redis from "ioredis"; +import { config } from "../config/index.js"; import { BACKEND_COMMAND, BACKEND_COMMAND_REPLY_PREFIX, @@ -6,8 +8,6 @@ import { type CommandReply, } from "../index.js"; import { createChildLogger } from "../logger/index.js"; -import Redis from "ioredis"; -import { config } from "../config/index.js"; const logger = createChildLogger("redis.command-channel"); diff --git a/services/backend/src/ws/redis-bridge.ts b/services/backend/src/ws/redis-bridge.ts index 260f567..b21e63c 100644 --- a/services/backend/src/ws/redis-bridge.ts +++ b/services/backend/src/ws/redis-bridge.ts @@ -1,7 +1,10 @@ -import { DISCORD_CHANNEL_TO_WS_EVENT, DISCORD_VOICE_PCM } from "../shared/index.js"; -import { createChildLogger } from "../shared/logger/index.js"; import Redis from "ioredis"; import { config } from "../shared/config/index.js"; +import { + DISCORD_CHANNEL_TO_WS_EVENT, + DISCORD_VOICE_PCM, +} from "../shared/index.js"; +import { createChildLogger } from "../shared/logger/index.js"; import { broadcastBinary, broadcastEvent } from "./broadcast.js"; const logger = createChildLogger("ws.redis-bridge"); diff --git a/services/backend/src/ws/server.ts b/services/backend/src/ws/server.ts index 873ec06..eb96649 100644 --- a/services/backend/src/ws/server.ts +++ b/services/backend/src/ws/server.ts @@ -1,8 +1,8 @@ import type { Server } from "node:http"; -import { BACKEND_COMMAND, BACKEND_VOICE_TRANSMIT } from "../shared/index.js"; -import { createChildLogger } from "../shared/logger/index.js"; import { WebSocket, WebSocketServer } from "ws"; import { config } from "../shared/config/index.js"; +import { BACKEND_COMMAND, BACKEND_VOICE_TRANSMIT } from "../shared/index.js"; +import { createChildLogger } from "../shared/logger/index.js"; import { setBroadcastFunctions } from "./broadcast.js"; const logger = createChildLogger("ws.server"); diff --git a/services/discord-gateway/src/app/bootstrap.ts b/services/discord-gateway/src/app/bootstrap.ts index 065c15b..75970bc 100644 --- a/services/discord-gateway/src/app/bootstrap.ts +++ b/services/discord-gateway/src/app/bootstrap.ts @@ -1,8 +1,8 @@ -import { ConfigError, DatabaseError } from "@/shared/errors/index"; -import { createChildLogger } from "@/shared/logger/index"; import { Client } from "discord.js-selfbot-v13"; import { inArray, lt } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { ConfigError, DatabaseError } from "@/shared/errors/index"; +import { createChildLogger } from "@/shared/logger/index"; import { startPendingAIAnalysisWorker } from "../modules/ai-moderation/aiAnalyzer.js"; import { registerChannelTopicCapture } from "../modules/channel-topic/index.js"; import { CommandHandler } from "../modules/command-handler/commandHandler.js"; diff --git a/services/discord-gateway/src/app/retention.ts b/services/discord-gateway/src/app/retention.ts index 96f8cc1..52bb96d 100644 --- a/services/discord-gateway/src/app/retention.ts +++ b/services/discord-gateway/src/app/retention.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import { inArray, lt } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../shared/config/config.js"; import { getDatabase } from "../shared/database/drizzle.js"; import type * as schema from "../shared/database/schema.js"; diff --git a/services/discord-gateway/src/app/shutdown.ts b/services/discord-gateway/src/app/shutdown.ts index ea5e0ec..e8f808f 100644 --- a/services/discord-gateway/src/app/shutdown.ts +++ b/services/discord-gateway/src/app/shutdown.ts @@ -1,5 +1,5 @@ -import type { createChildLogger } from "@/shared/logger/index"; import type { Client } from "discord.js-selfbot-v13"; +import type { createChildLogger } from "@/shared/logger/index"; import type { CommandHandler } from "../modules/command-handler/commandHandler.js"; import type { EventBroadcaster } from "../modules/event-broadcaster/index.js"; import type { stopMetricsServer } from "../modules/gateway-metrics/index.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/autoDeleteLogger.ts b/services/discord-gateway/src/modules/ai-moderation/autoDeleteLogger.ts index 149fa26..d619e2a 100644 --- a/services/discord-gateway/src/modules/ai-moderation/autoDeleteLogger.ts +++ b/services/discord-gateway/src/modules/ai-moderation/autoDeleteLogger.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Guild } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts b/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts index 26354ad..a4abfbe 100644 --- a/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts +++ b/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client, PermissionString } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import { messageStore } from "../message-capture/messageStore.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/autoDeleteNotify.ts b/services/discord-gateway/src/modules/ai-moderation/autoDeleteNotify.ts index b6ee13e..6713287 100644 --- a/services/discord-gateway/src/modules/ai-moderation/autoDeleteNotify.ts +++ b/services/discord-gateway/src/modules/ai-moderation/autoDeleteNotify.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/channelCultureStore.ts b/services/discord-gateway/src/modules/ai-moderation/channelCultureStore.ts index b8a226d..fb39f03 100644 --- a/services/discord-gateway/src/modules/ai-moderation/channelCultureStore.ts +++ b/services/discord-gateway/src/modules/ai-moderation/channelCultureStore.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { eq } from "drizzle-orm"; +import { createChildLogger } from "@/shared/logger/index"; import { getDatabase } from "../../shared/database/drizzle.js"; import { type ChannelCulture, diff --git a/services/discord-gateway/src/modules/ai-moderation/conversationContext.ts b/services/discord-gateway/src/modules/ai-moderation/conversationContext.ts index 3a13724..aebd9a1 100644 --- a/services/discord-gateway/src/modules/ai-moderation/conversationContext.ts +++ b/services/discord-gateway/src/modules/ai-moderation/conversationContext.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { encoding_for_model as encodingForModel } from "tiktoken"; +import { createChildLogger } from "@/shared/logger/index"; import { formatMediaEvidenceForPrompt, renderDiscordMentions, diff --git a/services/discord-gateway/src/modules/ai-moderation/conversationState.ts b/services/discord-gateway/src/modules/ai-moderation/conversationState.ts index 8680b7b..47bdf76 100644 --- a/services/discord-gateway/src/modules/ai-moderation/conversationState.ts +++ b/services/discord-gateway/src/modules/ai-moderation/conversationState.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { LRUCache } from "lru-cache"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import { LAST_ERROR } from "./moderationState.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts index 49b2c2a..caf1cd8 100644 --- a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts +++ b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { and, desc, eq, sql } from "drizzle-orm"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import { getDatabase } from "../../shared/database/drizzle.js"; import { messagesTable } from "../../shared/database/schema.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/discordTokens.ts b/services/discord-gateway/src/modules/ai-moderation/discordTokens.ts index d7e73fe..c3afa63 100644 --- a/services/discord-gateway/src/modules/ai-moderation/discordTokens.ts +++ b/services/discord-gateway/src/modules/ai-moderation/discordTokens.ts @@ -27,7 +27,16 @@ export function sanitizeDiscordTokens(content: string): string { if (!content.includes("<")) return content; return content.replace( DISCORD_TOKEN_RE, - (_full, emojiName, _emojiId, _userId, _roleId, _channelId, _time, _style) => { + ( + _full, + emojiName, + _emojiId, + _userId, + _roleId, + _channelId, + _time, + _style, + ) => { if (emojiName) return `[emoji:${emojiName}]`; // Capture groups tell us which alternative matched by position: // 3=user, 4=role, 5=channel, 6=time diff --git a/services/discord-gateway/src/modules/ai-moderation/index.ts b/services/discord-gateway/src/modules/ai-moderation/index.ts index 996610d..35e6286 100644 --- a/services/discord-gateway/src/modules/ai-moderation/index.ts +++ b/services/discord-gateway/src/modules/ai-moderation/index.ts @@ -1,12 +1,11 @@ -export { startPendingAIAnalysisWorker } from "./aiAnalyzer.js"; -export { runModerationAnalysis } from "./moderationOrchestrator.js"; -export { buildSystemPrompt } from "./moderationPrompt.js"; -export { sanitizeDiscordTokens } from "./discordTokens.js"; - // ── Single-pass LLM pipeline exports ───────────────────────────────────── export type { AnalysisInput, AnalysisResult, - WorkerConfig, MessageBatch, + WorkerConfig, } from "./ai-analysis-worker.js"; +export { startPendingAIAnalysisWorker } from "./aiAnalyzer.js"; +export { sanitizeDiscordTokens } from "./discordTokens.js"; +export { runModerationAnalysis } from "./moderationOrchestrator.js"; +export { buildSystemPrompt } from "./moderationPrompt.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/individualFallbackProcessor.ts b/services/discord-gateway/src/modules/ai-moderation/individualFallbackProcessor.ts index 064c54b..97c0e6c 100644 --- a/services/discord-gateway/src/modules/ai-moderation/individualFallbackProcessor.ts +++ b/services/discord-gateway/src/modules/ai-moderation/individualFallbackProcessor.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { LRUCache } from "lru-cache"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import { messageStore } from "../message-capture/messageStore.js"; import type { @@ -99,9 +99,7 @@ async function processIndividualFallback( // retryable error — the recovery worker picks it up later. Producing a // regex/wordlist verdict here would reintroduce false positives. if (!analysisResult) { - throw new Error( - `LLM analysis failed for message ${messageId}`, - ); + throw new Error(`LLM analysis failed for message ${messageId}`); } // Main thread: DB writes + broadcast diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationBuilders.ts b/services/discord-gateway/src/modules/ai-moderation/moderationBuilders.ts index 1982481..a45872f 100644 --- a/services/discord-gateway/src/modules/ai-moderation/moderationBuilders.ts +++ b/services/discord-gateway/src/modules/ai-moderation/moderationBuilders.ts @@ -5,9 +5,9 @@ * Used by both mediaAnalysisClient.ts and moderationOrchestrator.ts. */ +import { renderDiscordMentions } from "../message-capture/messageMetadata.js"; import { messageStore } from "../message-capture/messageStore.js"; import type { MessageRecord } from "../message-capture/types.js"; -import { renderDiscordMentions } from "../message-capture/messageMetadata.js"; import { sanitizeDiscordTokens } from "./discordTokens.js"; /** Simple XML-escaping for content text. */ diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationResponseParser.ts b/services/discord-gateway/src/modules/ai-moderation/moderationResponseParser.ts index f71b041..87366e4 100644 --- a/services/discord-gateway/src/modules/ai-moderation/moderationResponseParser.ts +++ b/services/discord-gateway/src/modules/ai-moderation/moderationResponseParser.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { z } from "zod"; +import { createChildLogger } from "@/shared/logger/index"; import type { AnalysisResult } from "../message-capture/types.js"; import type { RecommendedActionSchema, diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationSchemas.ts b/services/discord-gateway/src/modules/ai-moderation/moderationSchemas.ts index c4ac4fd..5a7cbbc 100644 --- a/services/discord-gateway/src/modules/ai-moderation/moderationSchemas.ts +++ b/services/discord-gateway/src/modules/ai-moderation/moderationSchemas.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { z } from "zod"; +import { createChildLogger } from "@/shared/logger/index"; const log = createChildLogger("moderationSchemas"); diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationState.ts b/services/discord-gateway/src/modules/ai-moderation/moderationState.ts index 129cbc4..a2db848 100644 --- a/services/discord-gateway/src/modules/ai-moderation/moderationState.ts +++ b/services/discord-gateway/src/modules/ai-moderation/moderationState.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client } from "discord.js-selfbot-v13"; import { LRUCache } from "lru-cache"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import type { EventBroadcaster } from "../event-broadcaster/index.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/searxngSearch.ts b/services/discord-gateway/src/modules/ai-moderation/searxngSearch.ts index 71c261d..a7f8ee9 100644 --- a/services/discord-gateway/src/modules/ai-moderation/searxngSearch.ts +++ b/services/discord-gateway/src/modules/ai-moderation/searxngSearch.ts @@ -1,6 +1,6 @@ +import Redis from "ioredis"; import { createChildLogger } from "@/shared/logger/index"; import { createAbortControllerWithTimeout } from "@/shared/utils/index"; -import Redis from "ioredis"; const log = createChildLogger("searxng-search"); diff --git a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts index ac8d8aa..110ddf9 100644 --- a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts +++ b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { and, desc, eq, sql } from "drizzle-orm"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import { getDatabase } from "../../shared/database/drizzle.js"; import { messagesTable } from "../../shared/database/schema.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/userProfileStore.ts b/services/discord-gateway/src/modules/ai-moderation/userProfileStore.ts index 77582df..ede3f41 100644 --- a/services/discord-gateway/src/modules/ai-moderation/userProfileStore.ts +++ b/services/discord-gateway/src/modules/ai-moderation/userProfileStore.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { eq } from "drizzle-orm"; +import { createChildLogger } from "@/shared/logger/index"; import { getDatabase } from "../../shared/database/drizzle.js"; import { type UserProfile, diff --git a/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts b/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts index c015ec8..be2308e 100644 --- a/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts +++ b/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import sharp from "sharp"; +import { createChildLogger } from "@/shared/logger/index"; const log = createChildLogger("imageResizer"); diff --git a/services/discord-gateway/src/modules/channel-topic/channelTopicCapture.ts b/services/discord-gateway/src/modules/channel-topic/channelTopicCapture.ts index f6daad6..25008b1 100644 --- a/services/discord-gateway/src/modules/channel-topic/channelTopicCapture.ts +++ b/services/discord-gateway/src/modules/channel-topic/channelTopicCapture.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client, TextChannel } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js"; diff --git a/services/discord-gateway/src/modules/command-handler/commandHandler.ts b/services/discord-gateway/src/modules/command-handler/commandHandler.ts index 3ca8bed..cd94f12 100644 --- a/services/discord-gateway/src/modules/command-handler/commandHandler.ts +++ b/services/discord-gateway/src/modules/command-handler/commandHandler.ts @@ -1,3 +1,6 @@ +import type { Client } from "discord.js-selfbot-v13"; +import Redis from "ioredis"; +import { config } from "../../shared/config/config.js"; import { BACKEND_COMMAND, type CommandMessage, @@ -6,9 +9,6 @@ import { VOICE_STATUS_KEY, } from "../../shared/index.js"; import { createChildLogger } from "../../shared/logger/index.js"; -import type { Client } from "discord.js-selfbot-v13"; -import Redis from "ioredis"; -import { config } from "../../shared/config/config.js"; import type { VoiceController } from "../voice-recording/voiceController.js"; import { GuildHandler } from "./guild.handler.js"; import { @@ -82,7 +82,9 @@ export class CommandHandler { // Create domain-specific handlers with their dependencies this.voiceHandler = new VoiceHandler(client, voiceController); - this.mediaHandler = new MediaHandler(client, () => voiceController.getStatus()); + this.mediaHandler = new MediaHandler(client, () => + voiceController.getStatus(), + ); this.guildHandler = new GuildHandler(client); this.moderationHandler = new ModerationHandler(client); diff --git a/services/discord-gateway/src/modules/command-handler/guild.handler.ts b/services/discord-gateway/src/modules/command-handler/guild.handler.ts index 740282b..1adaf68 100644 --- a/services/discord-gateway/src/modules/command-handler/guild.handler.ts +++ b/services/discord-gateway/src/modules/command-handler/guild.handler.ts @@ -1,6 +1,6 @@ +import type { Client } from "discord.js-selfbot-v13"; import type { CommandMessage, CommandReply } from "../../shared/index.js"; import { createChildLogger } from "../../shared/logger/index.js"; -import type { Client } from "discord.js-selfbot-v13"; // --------------------------------------------------------------------------- // GuildHandler diff --git a/services/discord-gateway/src/modules/command-handler/media.handler.ts b/services/discord-gateway/src/modules/command-handler/media.handler.ts index aae6388..b62efea 100644 --- a/services/discord-gateway/src/modules/command-handler/media.handler.ts +++ b/services/discord-gateway/src/modules/command-handler/media.handler.ts @@ -1,8 +1,8 @@ import { randomUUID } from "node:crypto"; +import { StreamType } from "@discordjs/voice"; import type { Client } from "discord.js-selfbot-v13"; import type { CommandMessage, CommandReply } from "../../shared/index.js"; import { createChildLogger } from "../../shared/logger/index.js"; -import { StreamType } from "@discordjs/voice"; import { extractMediaInfo, resolveMediaUrl, diff --git a/services/discord-gateway/src/modules/command-handler/moderation.handler.ts b/services/discord-gateway/src/modules/command-handler/moderation.handler.ts index f41a881..42f9f7b 100644 --- a/services/discord-gateway/src/modules/command-handler/moderation.handler.ts +++ b/services/discord-gateway/src/modules/command-handler/moderation.handler.ts @@ -1,6 +1,6 @@ +import type { Client } from "discord.js-selfbot-v13"; import type { CommandMessage, CommandReply } from "../../shared/index.js"; import { createChildLogger } from "../../shared/logger/index.js"; -import type { Client } from "discord.js-selfbot-v13"; import { messageStore } from "../message-capture/messageStore.js"; // --------------------------------------------------------------------------- diff --git a/services/discord-gateway/src/modules/command-handler/voice.handler.ts b/services/discord-gateway/src/modules/command-handler/voice.handler.ts index e6d7c24..7ccdc16 100644 --- a/services/discord-gateway/src/modules/command-handler/voice.handler.ts +++ b/services/discord-gateway/src/modules/command-handler/voice.handler.ts @@ -1,7 +1,7 @@ -import type { CommandMessage, CommandReply } from "../../shared/index.js"; -import { createChildLogger } from "../../shared/logger/index.js"; import type { Client } from "discord.js-selfbot-v13"; import { config } from "../../shared/config/config.js"; +import type { CommandMessage, CommandReply } from "../../shared/index.js"; +import { createChildLogger } from "../../shared/logger/index.js"; import { discordPlayer } from "../voice-recording/player.js"; import { voiceTransmitter } from "../voice-recording/transmitter.js"; import type { VoiceController } from "../voice-recording/voiceController.js"; diff --git a/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts b/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts index 27ac261..31ce12d 100644 --- a/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts +++ b/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts @@ -1,6 +1,9 @@ -import type { AttachmentRecord, MessageRecord } from "../../shared/index.js"; -import { type CustomLogger, createChildLogger } from "../../shared/logger/index.js"; import Redis from "ioredis"; +import type { AttachmentRecord, MessageRecord } from "../../shared/index.js"; +import { + type CustomLogger, + createChildLogger, +} from "../../shared/logger/index.js"; import { type DiscordGatewayEvent, EventChannels } from "./eventTypes.js"; export class RedisEventPublisher { diff --git a/services/discord-gateway/src/modules/guild-member-events/memberEvents.ts b/services/discord-gateway/src/modules/guild-member-events/memberEvents.ts index acbba56..c06f812 100644 --- a/services/discord-gateway/src/modules/guild-member-events/memberEvents.ts +++ b/services/discord-gateway/src/modules/guild-member-events/memberEvents.ts @@ -1,9 +1,9 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client, GuildMember, PartialGuildMember, } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js"; diff --git a/services/discord-gateway/src/modules/message-capture/attachmentsDb.ts b/services/discord-gateway/src/modules/message-capture/attachmentsDb.ts index 3d76ff7..9ced3ca 100644 --- a/services/discord-gateway/src/modules/message-capture/attachmentsDb.ts +++ b/services/discord-gateway/src/modules/message-capture/attachmentsDb.ts @@ -1,6 +1,6 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import { and, desc, eq, inArray, type SQL } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import type * as schema from "../../shared/database/schema.js"; import { attachmentsTable } from "../../shared/database/schema.js"; import type { AttachmentRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/message-capture/messageCapture.ts b/services/discord-gateway/src/modules/message-capture/messageCapture.ts index 3ba6fd0..c45b4c8 100644 --- a/services/discord-gateway/src/modules/message-capture/messageCapture.ts +++ b/services/discord-gateway/src/modules/message-capture/messageCapture.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client, Message } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import { queueMessageAnalysis } from "../ai-moderation/aiAnalyzer.js"; import { processAttachmentUpload } from "../attachment-upload/attachmentUploader.js"; diff --git a/services/discord-gateway/src/modules/message-capture/messageStore.ts b/services/discord-gateway/src/modules/message-capture/messageStore.ts index 0d61a12..dc8f2a4 100644 --- a/services/discord-gateway/src/modules/message-capture/messageStore.ts +++ b/services/discord-gateway/src/modules/message-capture/messageStore.ts @@ -1,5 +1,5 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import { getDatabase } from "../../shared/database/drizzle.js"; import type * as schema from "../../shared/database/schema.js"; import type { @@ -327,7 +327,9 @@ export const messageStore: MessageStore = new Proxy( { get(_, prop: string | symbol) { const store = resolveStore(); - const value = (store as unknown as Record)[prop]; + const value = (store as unknown as Record)[ + prop + ]; return typeof value === "function" ? value.bind(store) : value; }, }, diff --git a/services/discord-gateway/src/modules/message-capture/messagesAnalysis.ts b/services/discord-gateway/src/modules/message-capture/messagesAnalysis.ts index 178485f..f761a67 100644 --- a/services/discord-gateway/src/modules/message-capture/messagesAnalysis.ts +++ b/services/discord-gateway/src/modules/message-capture/messagesAnalysis.ts @@ -1,6 +1,6 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import { and, asc, desc, eq, inArray, isNull, or, sql } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import type * as schema from "../../shared/database/schema.js"; import { messagesTable } from "../../shared/database/schema.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/message-capture/messagesCleanup.ts b/services/discord-gateway/src/modules/message-capture/messagesCleanup.ts index a13108d..2ae095d 100644 --- a/services/discord-gateway/src/modules/message-capture/messagesCleanup.ts +++ b/services/discord-gateway/src/modules/message-capture/messagesCleanup.ts @@ -1,6 +1,6 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import { and, eq, isNull, sql } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import type * as schema from "../../shared/database/schema.js"; import { messagesTable } from "../../shared/database/schema.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/message-capture/messagesCrud.ts b/services/discord-gateway/src/modules/message-capture/messagesCrud.ts index 405df85..e4c0a12 100644 --- a/services/discord-gateway/src/modules/message-capture/messagesCrud.ts +++ b/services/discord-gateway/src/modules/message-capture/messagesCrud.ts @@ -1,6 +1,6 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import { and, desc, eq, or, type SQL } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import type * as schema from "../../shared/database/schema.js"; import { messageEditsTable, diff --git a/services/discord-gateway/src/modules/message-capture/messagesDb.ts b/services/discord-gateway/src/modules/message-capture/messagesDb.ts index 16a1734..82b01e2 100644 --- a/services/discord-gateway/src/modules/message-capture/messagesDb.ts +++ b/services/discord-gateway/src/modules/message-capture/messagesDb.ts @@ -1,5 +1,5 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import type * as schema from "../../shared/database/schema.js"; import type { MessageQuery, diff --git a/services/discord-gateway/src/modules/message-capture/messagesPagination.ts b/services/discord-gateway/src/modules/message-capture/messagesPagination.ts index 1e5fe48..7baa0fa 100644 --- a/services/discord-gateway/src/modules/message-capture/messagesPagination.ts +++ b/services/discord-gateway/src/modules/message-capture/messagesPagination.ts @@ -1,9 +1,9 @@ -import { buildCursorCondition, pageResult } from "../../shared/index.js"; -import { createChildLogger, type Logger } from "../../shared/logger/index.js"; import { and, desc, eq, inArray, type SQL, sql } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import type * as schema from "../../shared/database/schema.js"; import { messagesTable } from "../../shared/database/schema.js"; +import { buildCursorCondition, pageResult } from "../../shared/index.js"; +import { createChildLogger, type Logger } from "../../shared/logger/index.js"; import type { MessageQuery, MessageRecord, diff --git a/services/discord-gateway/src/modules/message-capture/messagesSearch.ts b/services/discord-gateway/src/modules/message-capture/messagesSearch.ts index 96af0f3..eca709e 100644 --- a/services/discord-gateway/src/modules/message-capture/messagesSearch.ts +++ b/services/discord-gateway/src/modules/message-capture/messagesSearch.ts @@ -1,6 +1,6 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import { and, desc, eq, isNull, or, type SQL, sql } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import type * as schema from "../../shared/database/schema.js"; import { messagesTable } from "../../shared/database/schema.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/message-capture/moderationActionsDb.ts b/services/discord-gateway/src/modules/message-capture/moderationActionsDb.ts index 61ff70e..a23343c 100644 --- a/services/discord-gateway/src/modules/message-capture/moderationActionsDb.ts +++ b/services/discord-gateway/src/modules/message-capture/moderationActionsDb.ts @@ -1,9 +1,9 @@ -import { buildCursorCondition, pageResult } from "../../shared/index.js"; -import { createChildLogger, type Logger } from "../../shared/logger/index.js"; import { and, desc, eq, inArray, type SQL, sql } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import type * as schema from "../../shared/database/schema.js"; import { moderationActionsTable } from "../../shared/database/schema.js"; +import { buildCursorCondition, pageResult } from "../../shared/index.js"; +import { createChildLogger, type Logger } from "../../shared/logger/index.js"; import type { ModerationAction, PageResult } from "../message-capture/types.js"; // ─── ModerationActionsDb Class ────────────────────────────────────────────── diff --git a/services/discord-gateway/src/modules/message-capture/retentionDb.ts b/services/discord-gateway/src/modules/message-capture/retentionDb.ts index ba12f4f..69ba9d8 100644 --- a/services/discord-gateway/src/modules/message-capture/retentionDb.ts +++ b/services/discord-gateway/src/modules/message-capture/retentionDb.ts @@ -1,6 +1,6 @@ -import { createChildLogger, type Logger } from "@/shared/logger/index"; import { and, eq, isNull, or } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger, type Logger } from "@/shared/logger/index"; import type * as schema from "../../shared/database/schema.js"; import { retentionPoliciesTable } from "../../shared/database/schema.js"; import type { RetentionPolicy } from "../message-capture/types.js"; @@ -45,8 +45,7 @@ export class RetentionDb { ), ); - if (channelRows.length > 0) - return channelRows[0] as RetentionPolicy; + if (channelRows.length > 0) return channelRows[0] as RetentionPolicy; } // Fall back to the guild default (channel_id IS NULL) diff --git a/services/discord-gateway/src/modules/message-capture/reviewsDb.ts b/services/discord-gateway/src/modules/message-capture/reviewsDb.ts index e13c8ef..5b09bf7 100644 --- a/services/discord-gateway/src/modules/message-capture/reviewsDb.ts +++ b/services/discord-gateway/src/modules/message-capture/reviewsDb.ts @@ -1,9 +1,9 @@ -import { buildCursorCondition, pageResult } from "../../shared/index.js"; -import { createChildLogger, type Logger } from "../../shared/logger/index.js"; import { and, desc, eq, inArray, type SQL, sql } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import type * as schema from "../../shared/database/schema.js"; import { messageReviewsTable } from "../../shared/database/schema.js"; +import { buildCursorCondition, pageResult } from "../../shared/index.js"; +import { createChildLogger, type Logger } from "../../shared/logger/index.js"; import type { MessageReview, PageResult } from "../message-capture/types.js"; // ─── ReviewsDb Class ──────────────────────────────────────────────────────── @@ -94,7 +94,9 @@ export class ReviewsDb { conditions.push( inArray( messageReviewsTable.status, - query.status as Array<"pending" | "approved" | "rejected" | "escalated">, + query.status as Array< + "pending" | "approved" | "rejected" | "escalated" + >, ), ); } diff --git a/services/discord-gateway/src/modules/message-capture/types.ts b/services/discord-gateway/src/modules/message-capture/types.ts index d63a74a..c055716 100644 --- a/services/discord-gateway/src/modules/message-capture/types.ts +++ b/services/discord-gateway/src/modules/message-capture/types.ts @@ -1,4 +1,5 @@ import type fs from "node:fs"; +import type prism from "prism-media"; import type { AnalysisQueueStatus, AttachmentRecord, @@ -6,7 +7,6 @@ import type { UserMetadata, VoiceRecordingUploadData, } from "../../shared/index.js"; -import type prism from "prism-media"; // Re-export all shared types for backward compatibility export type { diff --git a/services/discord-gateway/src/modules/reaction-tracking/reactionCapture.ts b/services/discord-gateway/src/modules/reaction-tracking/reactionCapture.ts index 90c8711..f74eaa3 100644 --- a/services/discord-gateway/src/modules/reaction-tracking/reactionCapture.ts +++ b/services/discord-gateway/src/modules/reaction-tracking/reactionCapture.ts @@ -1,4 +1,3 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client, MessageReaction, @@ -6,6 +5,7 @@ import type { PartialUser, User, } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import { getDatabase } from "../../shared/database/drizzle.js"; import { reactionsTable } from "../../shared/database/schema.js"; diff --git a/services/discord-gateway/src/modules/thread-tracking/threadCapture.ts b/services/discord-gateway/src/modules/thread-tracking/threadCapture.ts index 0c60a8e..1ce78a3 100644 --- a/services/discord-gateway/src/modules/thread-tracking/threadCapture.ts +++ b/services/discord-gateway/src/modules/thread-tracking/threadCapture.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client, ThreadChannel } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js"; diff --git a/services/discord-gateway/src/modules/user-presence/presenceCapture.ts b/services/discord-gateway/src/modules/user-presence/presenceCapture.ts index 10b218b..74caee1 100644 --- a/services/discord-gateway/src/modules/user-presence/presenceCapture.ts +++ b/services/discord-gateway/src/modules/user-presence/presenceCapture.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { Client, Presence } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js"; diff --git a/services/discord-gateway/src/modules/voice-pcm-ws/voicePcmWsClient.ts b/services/discord-gateway/src/modules/voice-pcm-ws/voicePcmWsClient.ts index 1d8bbda..5a025e9 100644 --- a/services/discord-gateway/src/modules/voice-pcm-ws/voicePcmWsClient.ts +++ b/services/discord-gateway/src/modules/voice-pcm-ws/voicePcmWsClient.ts @@ -7,8 +7,8 @@ * The backend forwards these unchanged to frontend clients. */ -import { createChildLogger } from "@/shared/logger/index"; import WebSocket from "ws"; +import { createChildLogger } from "@/shared/logger/index"; const logger = createChildLogger("voice-pcm-ws"); diff --git a/services/discord-gateway/src/modules/voice-recording/mediaSource.ts b/services/discord-gateway/src/modules/voice-recording/mediaSource.ts index 7e03003..2b31e9d 100644 --- a/services/discord-gateway/src/modules/voice-recording/mediaSource.ts +++ b/services/discord-gateway/src/modules/voice-recording/mediaSource.ts @@ -1,7 +1,7 @@ import { type ChildProcess, spawn } from "node:child_process"; import { PassThrough, type Readable } from "node:stream"; -import { createChildLogger } from "@/shared/logger/index"; import { StreamType } from "@discordjs/voice"; +import { createChildLogger } from "@/shared/logger/index"; const logger = createChildLogger("media-source"); @@ -348,7 +348,9 @@ export function getDirectVideoUrl(url: string): Promise { if (code !== 0) { const detail = stderrBuf.trim() ? `: ${stderrBuf.trim()}` : ""; reject( - new Error(`yt-dlp direct URL resolution exited with code ${code}${detail}`), + new Error( + `yt-dlp direct URL resolution exited with code ${code}${detail}`, + ), ); return; } diff --git a/services/discord-gateway/src/modules/voice-recording/muxer.ts b/services/discord-gateway/src/modules/voice-recording/muxer.ts index 39983f2..0b4f479 100644 --- a/services/discord-gateway/src/modules/voice-recording/muxer.ts +++ b/services/discord-gateway/src/modules/voice-recording/muxer.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import { eq } from "drizzle-orm"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; +import { createChildLogger } from "@/shared/logger/index"; import { getDatabase } from "../../shared/database/drizzle.js"; import type * as schema from "../../shared/database/schema.js"; import { muxerJobsTable } from "../../shared/database/schema.js"; diff --git a/services/discord-gateway/src/modules/voice-recording/player.ts b/services/discord-gateway/src/modules/voice-recording/player.ts index a559571..d30df59 100644 --- a/services/discord-gateway/src/modules/voice-recording/player.ts +++ b/services/discord-gateway/src/modules/voice-recording/player.ts @@ -1,5 +1,4 @@ import type { Readable } from "node:stream"; -import { createChildLogger } from "@/shared/logger/index"; import { type AudioPlayer, AudioPlayerStatus, @@ -9,6 +8,7 @@ import { StreamType, type VoiceConnection, } from "@discordjs/voice"; +import { createChildLogger } from "@/shared/logger/index"; import type { DiscordPlayerOwner, DiscordPlayOptions } from "./mediaTypes.js"; const logger = createChildLogger("player"); diff --git a/services/discord-gateway/src/modules/voice-recording/recorder.ts b/services/discord-gateway/src/modules/voice-recording/recorder.ts index ce5a2d3..03920c9 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder.ts @@ -1,6 +1,4 @@ import { promises as fsPromises } from "node:fs"; -import { createChildLogger } from "@/shared/logger/index"; -import { retryWithBackoff } from "@/shared/utils/index"; import { type DiscordGatewayAdapterCreator, entersState, @@ -10,6 +8,8 @@ import { VoiceConnectionStatus, } from "@discordjs/voice"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; +import { retryWithBackoff } from "@/shared/utils/index"; import { config } from "../../shared/config/config.js"; import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js"; import type { VoicePcmWsClient } from "../voice-pcm-ws/index.js"; diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/decoder.ts b/services/discord-gateway/src/modules/voice-recording/recorder/decoder.ts index 38c10f9..e811120 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/decoder.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/decoder.ts @@ -1,6 +1,6 @@ import { createRequire } from "node:module"; -import { createChildLogger } from "@/shared/logger/index"; import * as prism from "prism-media"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../../shared/config/config.js"; const require = createRequire(import.meta.url); diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/metadata.ts b/services/discord-gateway/src/modules/voice-recording/recorder/metadata.ts index 07f9fdf..408a5e9 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/metadata.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/metadata.ts @@ -1,6 +1,6 @@ import path from "node:path"; -import { createChildLogger } from "@/shared/logger/index"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../../shared/config/config.js"; import type { SegmentMetadata, diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/segment.ts b/services/discord-gateway/src/modules/voice-recording/recorder/segment.ts index e14bbc6..77e72cf 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/segment.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/segment.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; -import { createChildLogger } from "@/shared/logger/index"; import * as prism from "prism-media"; +import { createChildLogger } from "@/shared/logger/index"; import type { SegmentState } from "../../message-capture/types.js"; const logger = createChildLogger("voice-segment"); diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts b/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts index 5634cc3..36feba2 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/speakingHandler.ts @@ -1,8 +1,8 @@ import { promises as fsPromises } from "node:fs"; import path from "node:path"; -import { createChildLogger } from "@/shared/logger/index"; import type { VoiceConnection } from "@discordjs/voice"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; +import { createChildLogger } from "@/shared/logger/index"; import type { EventBroadcaster } from "../../event-broadcaster/eventBroadcaster.js"; import { collectUserMetadata } from "./metadata.js"; import { finalizeSegment } from "./segmentFinalizer.js"; diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/streamSetup.ts b/services/discord-gateway/src/modules/voice-recording/recorder/streamSetup.ts index be8b016..b8056fa 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/streamSetup.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/streamSetup.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "@/shared/logger/index"; import type { VoiceConnection } from "@discordjs/voice"; import { EndBehaviorType } from "@discordjs/voice"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../../shared/config/config.js"; import { PacketFilter } from "../packetFilter.js"; import { OpusDecoder } from "./decoder.js"; diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts b/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts index 6b05b20..2269c8c 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts @@ -1,6 +1,6 @@ +import { execFile } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; -import { execFile } from "node:child_process"; import { promisify } from "node:util"; import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../../shared/config/config.js"; diff --git a/services/discord-gateway/src/modules/voice-recording/screenShareController.ts b/services/discord-gateway/src/modules/voice-recording/screenShareController.ts index bf83d54..e97d20d 100644 --- a/services/discord-gateway/src/modules/voice-recording/screenShareController.ts +++ b/services/discord-gateway/src/modules/voice-recording/screenShareController.ts @@ -1,14 +1,14 @@ import { Encoders, - prepareStream, playStream, + prepareStream, Streamer, Utils, } from "@dank074/discord-video-stream"; import type { Client } from "discord.js-selfbot-v13"; import { createChildLogger } from "@/shared/logger/index"; -import type { ScreenSharePlayback } from "./mediaTypes.js"; import { getDirectVideoUrl } from "./mediaSource.js"; +import type { ScreenSharePlayback } from "./mediaTypes.js"; import { discordPlayer } from "./player.js"; const logger = createChildLogger("screen-share"); @@ -46,11 +46,7 @@ export class ScreenShareController { async start(source: string): Promise { const status = this.getVoiceStatus(); - if ( - !status.connected || - !status.activeGuildId || - !status.activeChannelId - ) { + if (!status.connected || !status.activeGuildId || !status.activeChannelId) { throw new Error("Connect to a voice channel before sharing screen"); } @@ -81,15 +77,13 @@ export class ScreenShareController { }).finally(() => { this.active = null; }); - - const controller = this; this.active = { done, stop: () => { if (stopped) return; stopped = true; command.kill("SIGTERM"); - controller.active = null; + this.active = null; }, }; diff --git a/services/discord-gateway/src/modules/voice-recording/transmitter.ts b/services/discord-gateway/src/modules/voice-recording/transmitter.ts index 5800f4f..39c937f 100644 --- a/services/discord-gateway/src/modules/voice-recording/transmitter.ts +++ b/services/discord-gateway/src/modules/voice-recording/transmitter.ts @@ -1,9 +1,9 @@ import { spawn } from "node:child_process"; import { PassThrough } from "node:stream"; -import { BACKEND_VOICE_TRANSMIT } from "../../shared/index.js"; -import { createChildLogger } from "../../shared/logger/index.js"; import { StreamType } from "@discordjs/voice"; import type Redis from "ioredis"; +import { BACKEND_VOICE_TRANSMIT } from "../../shared/index.js"; +import { createChildLogger } from "../../shared/logger/index.js"; import { discordPlayer } from "./player.js"; const logger = createChildLogger("transmitter"); diff --git a/services/discord-gateway/src/modules/voice-recording/voiceController.ts b/services/discord-gateway/src/modules/voice-recording/voiceController.ts index e3e5d7b..c876749 100644 --- a/services/discord-gateway/src/modules/voice-recording/voiceController.ts +++ b/services/discord-gateway/src/modules/voice-recording/voiceController.ts @@ -1,7 +1,7 @@ -import { AppError } from "@/shared/errors/index"; -import { createChildLogger } from "@/shared/logger/index"; import type { VoiceConnection } from "@discordjs/voice"; import type { Client, Guild, VoiceChannel } from "discord.js-selfbot-v13"; +import { AppError } from "@/shared/errors/index"; +import { createChildLogger } from "@/shared/logger/index"; import { discordPlayer } from "./player.js"; import { startRecording, stopRecording } from "./recorder.js"; diff --git a/services/discord-gateway/src/modules/voice-recording/voiceTranscriber.ts b/services/discord-gateway/src/modules/voice-recording/voiceTranscriber.ts index f6d1371..42ba7e6 100644 --- a/services/discord-gateway/src/modules/voice-recording/voiceTranscriber.ts +++ b/services/discord-gateway/src/modules/voice-recording/voiceTranscriber.ts @@ -1,8 +1,8 @@ // ─── Voice Transcription — AI-powered speech-to-text for voice recordings ──── import { createReadStream } from "node:fs"; -import { createChildLogger } from "@/shared/logger/index"; import OpenAI from "openai"; +import { createChildLogger } from "@/shared/logger/index"; import { config } from "../../shared/config/config.js"; const logger = createChildLogger("voice-transcriber"); diff --git a/services/discord-gateway/src/shared/database/init.ts b/services/discord-gateway/src/shared/database/init.ts index ca91bbb..98e5e2c 100644 --- a/services/discord-gateway/src/shared/database/init.ts +++ b/services/discord-gateway/src/shared/database/init.ts @@ -1,6 +1,6 @@ -import { createChildLogger } from "../logger/index.js"; import { drizzle } from "drizzle-orm/node-postgres"; import type { Pool, PoolClient } from "pg"; +import { createChildLogger } from "../logger/index.js"; import { closePool, createPoolFromConfig } from "./pool.js"; const logger = createChildLogger("database.init"); diff --git a/services/discord-gateway/src/shared/database/migrate.ts b/services/discord-gateway/src/shared/database/migrate.ts index 9974d27..10b006c 100644 --- a/services/discord-gateway/src/shared/database/migrate.ts +++ b/services/discord-gateway/src/shared/database/migrate.ts @@ -1,10 +1,10 @@ import "dotenv/config"; import { readFile } from "node:fs/promises"; import { join } from "node:path"; -import { createChildLogger } from "@/shared/logger/index"; import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres"; import { migrate as migratePostgres } from "drizzle-orm/node-postgres/migrator"; import type { PoolClient } from "pg"; +import { createChildLogger } from "@/shared/logger/index"; import { closeDatabase, initializeDatabase, diff --git a/services/discord-gateway/src/shared/database/schema.ts b/services/discord-gateway/src/shared/database/schema.ts index 44ab909..477034a 100644 --- a/services/discord-gateway/src/shared/database/schema.ts +++ b/services/discord-gateway/src/shared/database/schema.ts @@ -595,8 +595,7 @@ export type DbRetentionPolicyInsert = // Chatbot Messages export type ChatbotMessage = typeof chatbotMessagesTable.$inferSelect; -export type ChatbotMessageInsert = - typeof chatbotMessagesTable.$inferInsert; +export type ChatbotMessageInsert = typeof chatbotMessagesTable.$inferInsert; // ============================================================================= // Moderation Actions (gateway-local) diff --git a/services/discord-gateway/src/shared/database/schema/messages.ts b/services/discord-gateway/src/shared/database/schema/messages.ts index 3974d6f..b4b6415 100644 --- a/services/discord-gateway/src/shared/database/schema/messages.ts +++ b/services/discord-gateway/src/shared/database/schema/messages.ts @@ -1,8 +1,3 @@ -import { - pgAttachmentsTable, - pgMessageReviewsTable, - pgMessagesTable, -} from "../../../shared/index.js"; import { bigint as pgBigint, boolean as pgBoolean, @@ -11,6 +6,11 @@ import { text as pgText, uuid as pgUuid, } from "drizzle-orm/pg-core"; +import { + pgAttachmentsTable, + pgMessageReviewsTable, + pgMessagesTable, +} from "../../../shared/index.js"; // Re-export shared message/attachment/review tables export { pgAttachmentsTable, pgMessageReviewsTable, pgMessagesTable }; diff --git a/services/discord-gateway/src/shared/database/schema/meta.ts b/services/discord-gateway/src/shared/database/schema/meta.ts index bc0931f..d45ecad 100644 --- a/services/discord-gateway/src/shared/database/schema/meta.ts +++ b/services/discord-gateway/src/shared/database/schema/meta.ts @@ -25,5 +25,4 @@ export type UIStateInsert = typeof uiStateTable.$inferInsert; export type RetentionPolicy = typeof retentionPoliciesTable.$inferSelect; export type RetentionPolicyInsert = typeof retentionPoliciesTable.$inferInsert; export type ChatbotMessage = typeof chatbotMessagesTable.$inferSelect; -export type ChatbotMessageInsert = - typeof chatbotMessagesTable.$inferInsert; +export type ChatbotMessageInsert = typeof chatbotMessagesTable.$inferInsert; diff --git a/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts b/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts index 6bf8c2c..ba431f7 100644 --- a/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts +++ b/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts @@ -1,5 +1,5 @@ -import { createChildLogger } from "@/shared/logger/index"; import { desc, eq } from "drizzle-orm"; +import { createChildLogger } from "@/shared/logger/index"; import { getDatabase } from "./drizzle.js"; import { type VoiceRecording, diff --git a/services/frontend/src/components/analysis/search-panel.tsx b/services/frontend/src/components/analysis/search-panel.tsx index dc54a38..2323c8d 100644 --- a/services/frontend/src/components/analysis/search-panel.tsx +++ b/services/frontend/src/components/analysis/search-panel.tsx @@ -12,7 +12,6 @@ import { Input } from "@/components/ui/input"; import { Progress } from "@/components/ui/progress"; import { useMessageSearch, useReanalyze } from "@/hooks"; import { renderMessageContent, safeParseJsonArray } from "@/lib/format"; -import type { MessageRecord } from "@/lib/types"; import { cn } from "@/lib/utils"; export function SearchPanel() { diff --git a/services/frontend/src/components/chatbot/chat-panel.tsx b/services/frontend/src/components/chatbot/chat-panel.tsx index b3c419a..cb9adea 100644 --- a/services/frontend/src/components/chatbot/chat-panel.tsx +++ b/services/frontend/src/components/chatbot/chat-panel.tsx @@ -1,7 +1,7 @@ "use client"; -import { useRef, useEffect } from "react"; import { Send } from "lucide-react"; +import { useEffect, useRef } from "react"; import { useChatbot } from "./chatbot-context"; interface ChatPanelProps { @@ -15,11 +15,12 @@ export function ChatPanel({ inputRef: externalInputRef }: ChatPanelProps) { const inputRef = externalInputRef ?? internalInputRef; // Auto-scroll to bottom on new messages + // biome-ignore lint/correctness/useExhaustiveDependencies: re-run on message arrival; scroll is a visual effect keyed on new content useEffect(() => { if (listRef.current) { listRef.current.scrollTop = listRef.current.scrollHeight; } - }, [messages, isTyping]); + }, [messages]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -35,7 +36,9 @@ export function ChatPanel({ inputRef: externalInputRef }: ChatPanelProps) {
{messages.length === 0 && (
-

Ask chatbot anything

+

+ Ask chatbot anything +

)} {messages.slice(-8).map((msg, i) => ( @@ -58,9 +61,18 @@ export function ChatPanel({ inputRef: externalInputRef }: ChatPanelProps) {
- - - + + +
@@ -68,7 +80,10 @@ export function ChatPanel({ inputRef: externalInputRef }: ChatPanelProps) {
{/* Input bar */} -
+ (null); - const handleMouseDown = useCallback((e: React.MouseEvent) => { - setDragging(true); - setDragStart({ x: e.clientX - position.x, y: e.clientY - position.y }); - }, [position]); + const handleMouseDown = useCallback( + (e: React.MouseEvent) => { + setDragging(true); + setDragStart({ x: e.clientX - position.x, y: e.clientY - position.y }); + }, + [position], + ); - const handleMouseMove = useCallback((e: React.MouseEvent) => { - if (!dragging) return; - setPosition({ x: e.clientX - dragStart.x, y: e.clientY - dragStart.y }); - }, [dragging, dragStart]); + const handleMouseMove = useCallback( + (e: React.MouseEvent) => { + if (!dragging) return; + setPosition({ x: e.clientX - dragStart.x, y: e.clientY - dragStart.y }); + }, + [dragging, dragStart], + ); const handleMouseUp = useCallback(() => setDragging(false), []); @@ -35,6 +41,7 @@ export function ChatbotContainer() { }, [chatOpen]); return ( + // biome-ignore lint/a11y/noStaticElementInteractions: drag container — mouse-move gesture surface, not keyboard-interactive content
{/* Drag handle + controls */} + {/* biome-ignore lint/a11y/noStaticElementInteractions: drag handle — mouse-only gesture, keyboard users use the buttons in this header */}
{ const variantStyles: Record = { base: "glass rounded-[var(--radius-card)]", - elevated: - "glass-elevated rounded-[var(--radius-card)]", + elevated: "glass-elevated rounded-[var(--radius-card)]", interactive: "glass rounded-[var(--radius-card)] transition-all duration-150 hover:scale-[1.01] hover:border-[var(--color-border-glow)] cursor-pointer", - danger: - "glass rounded-[var(--radius-card)] border-red-500/30", + danger: "glass rounded-[var(--radius-card)] border-red-500/30", }; export function GlassCard({ @@ -26,10 +24,7 @@ export function GlassCard({ ...props }: GlassCardProps) { return ( -
+
{children}
); diff --git a/services/frontend/src/components/glass/panel.tsx b/services/frontend/src/components/glass/panel.tsx index f7323c2..e0801f4 100644 --- a/services/frontend/src/components/glass/panel.tsx +++ b/services/frontend/src/components/glass/panel.tsx @@ -1,7 +1,7 @@ "use client"; -import { cn } from "@/lib/utils"; import type { ComponentPropsWithoutRef } from "react"; +import { cn } from "@/lib/utils"; interface GlassPanelProps extends ComponentPropsWithoutRef<"div"> { dense?: boolean; diff --git a/services/frontend/src/components/layout/mobile-nav.tsx b/services/frontend/src/components/layout/mobile-nav.tsx index e234b12..9a7890d 100644 --- a/services/frontend/src/components/layout/mobile-nav.tsx +++ b/services/frontend/src/components/layout/mobile-nav.tsx @@ -26,7 +26,9 @@ export function MobileNav() { )} > - {label} + + {label} + {active && ( )} diff --git a/services/frontend/src/components/layout/top-nav.tsx b/services/frontend/src/components/layout/top-nav.tsx index 5776ca8..3ce8528 100644 --- a/services/frontend/src/components/layout/top-nav.tsx +++ b/services/frontend/src/components/layout/top-nav.tsx @@ -1,9 +1,9 @@ "use client"; -import { usePathname, useRouter } from "next/navigation"; import { Moon, Sun } from "lucide-react"; +import { usePathname, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; -import { navItems, isActivePath } from "@/lib/navigation"; +import { isActivePath, navItems } from "@/lib/navigation"; export function TopNav() { const pathname = usePathname(); diff --git a/services/frontend/src/components/media/mini-player.tsx b/services/frontend/src/components/media/mini-player.tsx index 0e2a737..2a7b45b 100644 --- a/services/frontend/src/components/media/mini-player.tsx +++ b/services/frontend/src/components/media/mini-player.tsx @@ -1,6 +1,6 @@ "use client"; -import { Disc3, Music, Play, SkipForward, Square, Volume2 } from "lucide-react"; +import { Disc3, Music, SkipForward, Square, Volume2 } from "lucide-react"; import { useMediaPlayer } from "@/lib/hooks/use-media-player"; export function MiniPlayer() { @@ -16,7 +16,10 @@ export function MiniPlayer() {
{playing ? ( - + ) : ( )} @@ -27,9 +30,7 @@ export function MiniPlayer() {

{queue.length > 0 && (

- {queue.length > 1 - ? `${queue.length} in queue` - : "1 in queue"} + {queue.length > 1 ? `${queue.length} in queue` : "1 in queue"}

)}
diff --git a/services/frontend/src/components/messages/ai-analysis-panel.tsx b/services/frontend/src/components/messages/ai-analysis-panel.tsx index 5300eb1..de8e3ee 100644 --- a/services/frontend/src/components/messages/ai-analysis-panel.tsx +++ b/services/frontend/src/components/messages/ai-analysis-panel.tsx @@ -35,25 +35,37 @@ export function AiAnalysisPanel({ if (!status || status === "pending") { return ( - AI analysis pending + + AI analysis pending + ); } - const flagsArray = typeof flags === "string" ? (flags ? JSON.parse(flags) : []) : (flags || []); - const categoriesArray = typeof categories === "string" ? (categories ? JSON.parse(categories) : []) : (categories || []); + const flagsArray = + typeof flags === "string" ? (flags ? JSON.parse(flags) : []) : flags || []; + const categoriesArray = + typeof categories === "string" + ? categories + ? JSON.parse(categories) + : [] + : categories || []; return (
- AI Analysis - + + AI Analysis + + {status}
@@ -61,7 +73,14 @@ export function AiAnalysisPanel({ {severity && (
Severity: - {severity} + + {severity} +
)} @@ -82,7 +101,12 @@ export function AiAnalysisPanel({ {flagsArray.length > 0 && (
{flagsArray.map((f: string) => ( - {f} + + {f} + ))}
)} @@ -90,7 +114,12 @@ export function AiAnalysisPanel({ {categoriesArray.length > 0 && (
{categoriesArray.map((c: string) => ( - {c} + + {c} + ))}
)} diff --git a/services/frontend/src/components/messages/ai-status-badge.tsx b/services/frontend/src/components/messages/ai-status-badge.tsx index 1646471..d732bc6 100644 --- a/services/frontend/src/components/messages/ai-status-badge.tsx +++ b/services/frontend/src/components/messages/ai-status-badge.tsx @@ -3,11 +3,13 @@ import { cn } from "@/lib/utils"; const STATUS_STYLES: Record = { - clean: "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/20", + clean: + "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/20", flagged: "bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/20", warn: "bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20", pending: "bg-muted text-muted-foreground border-border", - processing: "bg-sky-500/10 text-sky-600 dark:text-sky-400 border-sky-500/20 animate-pulse", + processing: + "bg-sky-500/10 text-sky-600 dark:text-sky-400 border-sky-500/20 animate-pulse", error: "bg-destructive/10 text-destructive border-destructive/20", }; diff --git a/services/frontend/src/components/messages/attachments-grid.tsx b/services/frontend/src/components/messages/attachments-grid.tsx index e2e1b53..3167537 100644 --- a/services/frontend/src/components/messages/attachments-grid.tsx +++ b/services/frontend/src/components/messages/attachments-grid.tsx @@ -12,7 +12,10 @@ export function AttachmentsGrid({ attachments }: AttachmentsGridProps) { return (
{attachments.map((att) => ( -
+
{att.type?.startsWith("image/") ? ( void; } -export function MessageDetailView({ message, attachments, onBack }: MessageDetailViewProps) { +export function MessageDetailView({ + message, + attachments, + onBack, +}: MessageDetailViewProps) { return ( {onBack && ( - )} @@ -25,7 +33,9 @@ export function MessageDetailView({ message, attachments, onBack }: MessageDetai {/* Message header */}
- {message.username} + + {message.username} + {message.thread_id && } {getMessageChannelLabel(message)} @@ -34,7 +44,8 @@ export function MessageDetailView({ message, attachments, onBack }: MessageDetai {/* Content */}
- {renderMessageContent(message.content, message.metadata) || "(no text content)"} + {renderMessageContent(message.content, message.metadata) || + "(no text content)"}
{/* Attachments */} diff --git a/services/frontend/src/components/messages/message-detail.tsx b/services/frontend/src/components/messages/message-detail.tsx index 2f1a93a..3c727e8 100644 --- a/services/frontend/src/components/messages/message-detail.tsx +++ b/services/frontend/src/components/messages/message-detail.tsx @@ -2,10 +2,10 @@ import { ArrowLeft, MessageSquare, MessagesSquare } from "lucide-react"; import { GlassCard } from "@/components/glass/card"; -import { AttachmentsGrid } from "./attachments-grid"; -import { AiAnalysisPanel } from "./ai-analysis-panel"; import { getMessageChannelLabel, renderMessageContent } from "@/lib/format"; import type { AttachmentRecord, MessageRecord } from "@/lib/types"; +import { AiAnalysisPanel } from "./ai-analysis-panel"; +import { AttachmentsGrid } from "./attachments-grid"; interface MessageDetailProps { message: MessageRecord; @@ -13,11 +13,19 @@ interface MessageDetailProps { onBack?: () => void; } -export function MessageDetail({ message, attachments, onBack }: MessageDetailProps) { +export function MessageDetail({ + message, + attachments, + onBack, +}: MessageDetailProps) { return ( {onBack && ( - )} @@ -25,7 +33,9 @@ export function MessageDetail({ message, attachments, onBack }: MessageDetailPro {/* Message header */}
- {message.username} + + {message.username} + {message.thread_id && } {getMessageChannelLabel(message)} @@ -34,7 +44,8 @@ export function MessageDetail({ message, attachments, onBack }: MessageDetailPro {/* Content */}
- {renderMessageContent(message.content, message.metadata) || "(no text content)"} + {renderMessageContent(message.content, message.metadata) || + "(no text content)"}
{/* Attachments */} diff --git a/services/frontend/src/components/messages/message-list.tsx b/services/frontend/src/components/messages/message-list.tsx index a7161cb..0a6cb47 100644 --- a/services/frontend/src/components/messages/message-list.tsx +++ b/services/frontend/src/components/messages/message-list.tsx @@ -1,9 +1,9 @@ "use client"; import { Loader2 } from "lucide-react"; -import { MessageCard } from "./message-card"; import { Button } from "@/components/ui/button"; import type { MessageRecord } from "@/lib/types"; +import { MessageCard } from "./message-card"; interface MessageListProps { messages: MessageRecord[]; diff --git a/services/frontend/src/components/messages/search-overlay.tsx b/services/frontend/src/components/messages/search-overlay.tsx index d801b42..9d17210 100644 --- a/services/frontend/src/components/messages/search-overlay.tsx +++ b/services/frontend/src/components/messages/search-overlay.tsx @@ -4,7 +4,6 @@ import { Search, X } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { useMessageSearch } from "@/hooks"; import { getMessageChannelLabel, renderMessageContent } from "@/lib/format"; -import type { MessageRecord } from "@/lib/types"; interface SearchOverlayProps { open: boolean; diff --git a/services/frontend/src/components/recordings/recording-card.tsx b/services/frontend/src/components/recordings/recording-card.tsx index 212e7d0..b5acd28 100644 --- a/services/frontend/src/components/recordings/recording-card.tsx +++ b/services/frontend/src/components/recordings/recording-card.tsx @@ -1,7 +1,7 @@ "use client"; -import { useState } from "react"; import { Download, Loader2, Pause, Play } from "lucide-react"; +import { useState } from "react"; import { GlassCard } from "@/components/glass/card"; import type { VoiceRecording } from "@/lib/types"; @@ -94,11 +94,7 @@ export function RecordingCard({
{active && ( - {loading - ? "Loading" - : playing - ? "Now Playing" - : "Paused"} + {loading ? "Loading" : playing ? "Now Playing" : "Paused"} )}
@@ -131,7 +127,12 @@ export function RecordingCard({
-
e.stopPropagation()}> + {/* biome-ignore lint/a11y/noStaticElementInteractions: stopPropagation container — prevents card play toggle when clicking action buttons */} + {/* biome-ignore lint/a11y/useKeyWithClickEvents: no keyboard interaction — container only swallows clicks destined for the action buttons */} +
e.stopPropagation()} + > {recording.download_url && (
diff --git a/services/frontend/src/components/shared/error-boundary.tsx b/services/frontend/src/components/shared/error-boundary.tsx index 3720914..c5825ca 100644 --- a/services/frontend/src/components/shared/error-boundary.tsx +++ b/services/frontend/src/components/shared/error-boundary.tsx @@ -1,11 +1,17 @@ "use client"; +import { AlertCircle, RefreshCw } from "lucide-react"; import { Component, type ReactNode } from "react"; import { GlassCard } from "@/components/glass/card"; -import { AlertCircle, RefreshCw } from "lucide-react"; -interface Props { children: ReactNode; fallback?: ReactNode; } -interface State { hasError: boolean; error?: Error; } +interface Props { + children: ReactNode; + fallback?: ReactNode; +} +interface State { + hasError: boolean; + error?: Error; +} export class ErrorBoundary extends Component { state: State = { hasError: false }; @@ -16,18 +22,25 @@ export class ErrorBoundary extends Component { render() { if (this.state.hasError) { - return this.props.fallback || ( - - -

{this.state.error?.message || "Something went wrong"}

- -
+ +

+ {this.state.error?.message || "Something went wrong"} +

+ + + ) ); } return this.props.children; diff --git a/services/frontend/src/components/voice/connection-card.tsx b/services/frontend/src/components/voice/connection-card.tsx index 51cf2f8..0d663e5 100644 --- a/services/frontend/src/components/voice/connection-card.tsx +++ b/services/frontend/src/components/voice/connection-card.tsx @@ -42,11 +42,18 @@ export function VoiceConnectionCard({ return (
- +
- Voice Connection + + Voice Connection + {activeChannelName && ( - {activeChannelName} + + {activeChannelName} + )}
@@ -68,7 +79,11 @@ export function VoiceConnectionCard({ Disconnect ) : ( - )} diff --git a/services/frontend/src/components/voice/listen-control.tsx b/services/frontend/src/components/voice/listen-control.tsx index 50d90d7..01940bf 100644 --- a/services/frontend/src/components/voice/listen-control.tsx +++ b/services/frontend/src/components/voice/listen-control.tsx @@ -1,11 +1,11 @@ "use client"; +import { HeadphoneOff, Headphones } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { GlassCard } from "@/components/glass/card"; import { Button } from "@/components/ui/button"; import { hashUserId } from "@/hooks"; import type { ActiveSpeaker } from "@/lib/types"; -import { Headphones, HeadphoneOff } from "lucide-react"; interface ListenControlProps { connected: boolean; @@ -103,7 +103,9 @@ export function ListenControl({ {active ? "Listening" : "Listen"}
- Vol + + Vol + - {active ? : } + {active ? ( + + ) : ( + + )} {active ? "Live" : "Muted"}
- Vol + + Vol + onVolumeChange(Number(e.target.value))} className="flex-1 h-1 appearance-none bg-glass-border rounded-full accent-primary [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:size-3 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-primary [&::-webkit-slider-thumb]:shadow-[0_0_8px] [&::-webkit-slider-thumb]:shadow-primary/60" /> - {volume}% + + {volume}% +
diff --git a/services/frontend/src/components/voice/speaker-waveform.tsx b/services/frontend/src/components/voice/speaker-waveform.tsx index cfee868..b9af4e9 100644 --- a/services/frontend/src/components/voice/speaker-waveform.tsx +++ b/services/frontend/src/components/voice/speaker-waveform.tsx @@ -46,7 +46,9 @@ export function SpeakerWaveform({ speakers }: SpeakerWaveformProps) { if (speakers.length === 0) { return ( - No speakers detected + + No speakers detected + ); } @@ -57,7 +59,11 @@ export function SpeakerWaveform({ speakers }: SpeakerWaveformProps) { {speakers.map((s) => (
{s.username} diff --git a/services/frontend/src/hooks/use-media.ts b/services/frontend/src/hooks/use-media.ts index 2013ee1..eb81c75 100644 --- a/services/frontend/src/hooks/use-media.ts +++ b/services/frontend/src/hooks/use-media.ts @@ -24,9 +24,8 @@ function useMediaAction(fn: (args: TArgs) => Promise) { } export function useMediaQueue() { - return useMediaAction( - (input: { url: string; mode?: "music" | "screen" }) => - mediaApi.queue(input.url, input.mode ?? "music"), + return useMediaAction((input: { url: string; mode?: "music" | "screen" }) => + mediaApi.queue(input.url, input.mode ?? "music"), ); } diff --git a/services/frontend/src/hooks/use-messages.ts b/services/frontend/src/hooks/use-messages.ts index e532403..e4565a4 100644 --- a/services/frontend/src/hooks/use-messages.ts +++ b/services/frontend/src/hooks/use-messages.ts @@ -138,7 +138,12 @@ export function useMessageDetail(id: string | null) { if (!cid) return []; // messageId filter: attachment list must show only this message's // images, not the latest images from everyone in the channel. - const res = await messagesApi.getAttachments(cid, 10, undefined, id ?? ""); + const res = await messagesApi.getAttachments( + cid, + 10, + undefined, + id ?? "", + ); return res.data; }, ); diff --git a/services/frontend/src/lib/audio/pcm-player.ts b/services/frontend/src/lib/audio/pcm-player.ts index 3f786ba..865fd68 100644 --- a/services/frontend/src/lib/audio/pcm-player.ts +++ b/services/frontend/src/lib/audio/pcm-player.ts @@ -66,7 +66,12 @@ export class PcmPlayer { if (!this.started || samples.length === 0) return; let ring = this.rings.get(userIdHash); if (!ring) { - ring = { data: new Float32Array(RING_LEN), write: 0, readPos: 0, lastActive: Date.now() }; + ring = { + data: new Float32Array(RING_LEN), + write: 0, + readPos: 0, + lastActive: Date.now(), + }; this.rings.set(userIdHash, ring); } ring.lastActive = Date.now(); diff --git a/services/frontend/src/lib/hooks/use-media-player.tsx b/services/frontend/src/lib/hooks/use-media-player.tsx index d89c83b..c076bb8 100644 --- a/services/frontend/src/lib/hooks/use-media-player.tsx +++ b/services/frontend/src/lib/hooks/use-media-player.tsx @@ -9,9 +9,9 @@ import { useRef, useState, } from "react"; -import { useWebSocket } from "@/lib/ws/context"; import { mediaApi } from "@/lib/api"; -import type { MediaState, MediaItem } from "@/lib/types"; +import type { MediaItem, MediaState } from "@/lib/types"; +import { useWebSocket } from "@/lib/ws/context"; interface MediaPlayerContextValue { /** Current play state */ @@ -52,11 +52,14 @@ export function MediaPlayerProvider({ children }: { children: ReactNode }) { useEffect(() => { if (fetched.current) return; fetched.current = true; - mediaApi.getStatus().then((data) => { - if (data) setState(data as MediaState); - }).catch(() => { - // API not yet available - }); + mediaApi + .getStatus() + .then((data) => { + if (data) setState(data as MediaState); + }) + .catch(() => { + // API not yet available + }); }, []); // Subscribe to live media_state events via WS @@ -69,37 +72,52 @@ export function MediaPlayerProvider({ children }: { children: ReactNode }) { const skip = useCallback(() => { setPending(true); - mediaApi.skip().then((data) => { - if (data) setState(data as MediaState); - }).catch(() => { - // ignore - }).finally(() => setPending(false)); + mediaApi + .skip() + .then((data) => { + if (data) setState(data as MediaState); + }) + .catch(() => { + // ignore + }) + .finally(() => setPending(false)); }, []); const stop = useCallback(() => { setPending(true); - mediaApi.stop().then((data) => { - if (data) setState(data as MediaState); - }).catch(() => { - // ignore - }).finally(() => setPending(false)); + mediaApi + .stop() + .then((data) => { + if (data) setState(data as MediaState); + }) + .catch(() => { + // ignore + }) + .finally(() => setPending(false)); }, []); const setVolume = useCallback((vol: number) => { - mediaApi.volume(vol).then((data) => { - if (data) setState(data as MediaState); - }).catch(() => { - // ignore - }); + mediaApi + .volume(vol) + .then((data) => { + if (data) setState(data as MediaState); + }) + .catch(() => { + // ignore + }); }, []); const queueUrl = useCallback((url: string) => { setPending(true); - mediaApi.queue(url, "music").then((data) => { - if (data) setState(data as MediaState); - }).catch(() => { - // ignore - }).finally(() => setPending(false)); + mediaApi + .queue(url, "music") + .then((data) => { + if (data) setState(data as MediaState); + }) + .catch(() => { + // ignore + }) + .finally(() => setPending(false)); }, []); return (