2 Commits
Author SHA1 Message Date
asepharyana 6293d588bc chore(lint): biome cleanup across services — format, sort imports, drop unused
- 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,
  <img> in static export (next/image unsupported), noExplicitAny

tsc --noEmit clean on all 3 services; vitest green (60+36).
2026-08-01 22:09:02 +07:00
asepharyana 2357421841 fix(test): repair placeholder tests referencing deleted @bete/shared package
packages/shared dihapus (5802d02), modul pindah ke src/shared/. Update
import placeholder.test.ts (gateway + backend) ke path lokal + aktifkan
tests/ di backend vitest config dengan alias @. Sebelumnya vitest run
gateway selalu gagal; sekarang 60+36 tests pass.
2026-08-01 22:08:54 +07:00
126 changed files with 483 additions and 319 deletions
+2 -2
View File
@@ -1,4 +1,3 @@
import { createChildLogger } from "@/shared/logger/index";
import express, { import express, {
type Express, type Express,
type NextFunction, type NextFunction,
@@ -6,11 +5,12 @@ import express, {
type Response, type Response,
} from "express"; } from "express";
import helmet from "helmet"; import helmet from "helmet";
import { createChildLogger } from "@/shared/logger/index";
import { createAnalysisRouter } from "../modules/analysis/index.js"; import { createAnalysisRouter } from "../modules/analysis/index.js";
import { createChatbotRouter } from "../modules/chatbot/index.js";
import { createConfigRouter } from "../modules/config/index.js"; import { createConfigRouter } from "../modules/config/index.js";
import { createDashboardRouter } from "../modules/dashboard/index.js"; import { createDashboardRouter } from "../modules/dashboard/index.js";
import { createHealthRouter } from "../modules/health/index.js"; import { createHealthRouter } from "../modules/health/index.js";
import { createChatbotRouter } from "../modules/chatbot/index.js";
import { createMediaRouter } from "../modules/media/index.js"; import { createMediaRouter } from "../modules/media/index.js";
import { createMessagesRouter } from "../modules/messages/index.js"; import { createMessagesRouter } from "../modules/messages/index.js";
import { createRecordingsRouter } from "../modules/recordings/index.js"; import { createRecordingsRouter } from "../modules/recordings/index.js";
@@ -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 { and, desc, eq, ilike, type SQL } from "drizzle-orm";
import { getDatabase } from "../../shared/database/index.js"; import { getDatabase } from "../../shared/database/index.js";
import { pgMessagesTable } from "../../shared/index.js";
import { createChildLogger } from "../../shared/logger/index.js";
import { import {
type MappedMessage, type MappedMessage,
mapMessageRow, mapMessageRow,
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response, Router } from "express"; import type { Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler } from "../../shared/middlewares/index.js"; import { asyncHandler } from "../../shared/middlewares/index.js";
import { analysisService } from "./analysis.service.js"; import { analysisService } from "./analysis.service.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response } from "express"; import type { Request, Response } from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler } from "../../shared/middlewares/index.js"; import { asyncHandler } from "../../shared/middlewares/index.js";
import { chatbotService } from "./chatbot.service.js"; import { chatbotService } from "./chatbot.service.js";
@@ -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 { and, desc, eq, type SQL, sql } from "drizzle-orm";
import { getDatabase } from "../../shared/database/index.js"; 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"); const logger = createChildLogger("chatbot.repository");
@@ -10,11 +10,7 @@ import { chatRequestSchema } from "./chatbot.schema.js";
export function createChatbotRouter(): Router { export function createChatbotRouter(): Router {
const router = express.Router(); const router = express.Router();
router.post( router.post("/chat", validateBody(chatRequestSchema), handleChatbotChat);
"/chat",
validateBody(chatRequestSchema),
handleChatbotChat,
);
router.get("/chat/history", getChatbotHistory); router.get("/chat/history", getChatbotHistory);
router.delete("/chat/history", clearChatbotHistory); router.delete("/chat/history", clearChatbotHistory);
@@ -1,3 +1,6 @@
import type { SQL } from "drizzle-orm";
import { sql } from "drizzle-orm";
import { getDatabase } from "../../shared/database/index.js";
import { import {
pgChannelCulturesTable, pgChannelCulturesTable,
pgMessagesTable, pgMessagesTable,
@@ -5,9 +8,6 @@ import {
pgUserReputationsTable, pgUserReputationsTable,
pgVoiceRecordingsTable, pgVoiceRecordingsTable,
} from "../../shared/index.js"; } 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"; import type { ListUsersQuery } from "./dashboard.service.js";
export class DashboardRepository { export class DashboardRepository {
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response, Router } from "express"; import type { Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler } from "../../shared/middlewares/index.js"; import { asyncHandler } from "../../shared/middlewares/index.js";
import { dashboardService } from "./dashboard.service.js"; import { dashboardService } from "./dashboard.service.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { sql } from "drizzle-orm"; import { sql } from "drizzle-orm";
import { createChildLogger } from "@/shared/logger/index";
import { getDatabase } from "../../shared/database/index.js"; import { getDatabase } from "../../shared/database/index.js";
const logger = createChildLogger("health.repository"); const logger = createChildLogger("health.repository");
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response, Router } from "express"; import type { Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler, validateBody } from "../../shared/middlewares/index.js"; import { asyncHandler, validateBody } from "../../shared/middlewares/index.js";
import { mediaQueueSchema, mediaVolumeSchema } from "./media.schema.js"; import { mediaQueueSchema, mediaVolumeSchema } from "./media.schema.js";
import { getStatus, queue, setVolume, skip, stop } from "./media.service.js"; import { getStatus, queue, setVolume, skip, stop } from "./media.service.js";
@@ -1,3 +1,7 @@
import {
createChildLogger,
tryCommandThenFallback,
} from "../../shared/commandHelper.js";
import { import {
COMMAND_MEDIA_QUEUE, COMMAND_MEDIA_QUEUE,
COMMAND_MEDIA_SKIP, COMMAND_MEDIA_SKIP,
@@ -5,10 +9,6 @@ import {
COMMAND_MEDIA_VOLUME, COMMAND_MEDIA_VOLUME,
MEDIA_STATUS_KEY, MEDIA_STATUS_KEY,
} from "../../shared/index.js"; } from "../../shared/index.js";
import {
createChildLogger,
tryCommandThenFallback,
} from "../../shared/commandHelper.js";
import { publishCommand, readRedisStatus } from "../../shared/redis/index.js"; import { publishCommand, readRedisStatus } from "../../shared/redis/index.js";
const logger = createChildLogger("media.service"); const logger = createChildLogger("media.service");
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response } from "express"; import type { Request, Response } from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler } from "../../shared/middlewares/index.js"; import { asyncHandler } from "../../shared/middlewares/index.js";
import { messageQuerySchema } from "./messages.schema.js"; import { messageQuerySchema } from "./messages.schema.js";
import { messagesService } from "./messages.service.js"; import { messagesService } from "./messages.service.js";
@@ -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 { import {
and, and,
desc, desc,
@@ -16,6 +13,9 @@ import {
} from "drizzle-orm"; } from "drizzle-orm";
import { config } from "../../shared/config/index.js"; import { config } from "../../shared/config/index.js";
import { getDatabase } from "../../shared/database/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 { mapMessageRow } from "../../shared/utils/messageMapper.js";
import type { import type {
MessageCreate, MessageCreate,
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response, Router } from "express"; import type { Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler, validateBody } from "../../shared/middlewares/index.js"; import { asyncHandler, validateBody } from "../../shared/middlewares/index.js";
import { import {
handleGetAttachmentsByChannel, handleGetAttachmentsByChannel,
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response, Router } from "express"; import type { Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler } from "../../shared/middlewares/index.js"; import { asyncHandler } from "../../shared/middlewares/index.js";
import { recordingsService } from "./recordings.service.js"; import { recordingsService } from "./recordings.service.js";
@@ -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 { and, desc, eq, lt, type SQL } from "drizzle-orm";
import { getDatabase } from "../../shared/database/index.js"; 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"); const logger = createChildLogger("recordings.service");
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response, Router } from "express"; import type { Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler } from "../../shared/middlewares/index.js"; import { asyncHandler } from "../../shared/middlewares/index.js";
import { uiStateService } from "./ui-state.service.js"; import { uiStateService } from "./ui-state.service.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { sql } from "drizzle-orm"; import { sql } from "drizzle-orm";
import { createChildLogger } from "@/shared/logger/index";
import { getDatabase } from "../../shared/database/index.js"; import { getDatabase } from "../../shared/database/index.js";
const logger = createChildLogger("ui-state.service"); const logger = createChildLogger("ui-state.service");
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response } from "express"; import type { Request, Response } from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler } from "../../shared/middlewares/index.js"; import { asyncHandler } from "../../shared/middlewares/index.js";
import { publishCommandNoReply } from "../../shared/redis/index.js"; import { publishCommandNoReply } from "../../shared/redis/index.js";
import type { ConnectVoiceInput, VoiceCommandInput } from "./voice.schema.js"; import type { ConnectVoiceInput, VoiceCommandInput } from "./voice.schema.js";
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Request, Response, Router } from "express"; import type { Request, Response, Router } from "express";
import express from "express"; import express from "express";
import { createChildLogger } from "@/shared/logger/index";
import { asyncHandler, validateBody } from "../../shared/middlewares/index.js"; import { asyncHandler, validateBody } from "../../shared/middlewares/index.js";
import { import {
handleConnectVoice, handleConnectVoice,
@@ -1,3 +1,9 @@
import { eq } from "drizzle-orm";
import {
createChildLogger,
tryCommandThenFallback,
} from "../../shared/commandHelper.js";
import { getDatabase } from "../../shared/database/index.js";
import { import {
COMMAND_GUILDS_LIST, COMMAND_GUILDS_LIST,
COMMAND_GUILDS_TEXT_CHANNELS, COMMAND_GUILDS_TEXT_CHANNELS,
@@ -8,12 +14,6 @@ import {
pgMessagesTable, pgMessagesTable,
VOICE_STATUS_KEY, VOICE_STATUS_KEY,
} from "../../shared/index.js"; } 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"; import { publishCommand, readRedisStatus } from "../../shared/redis/index.js";
const logger = createChildLogger("voice.service"); const logger = createChildLogger("voice.service");
@@ -160,8 +160,6 @@ export const configSchema = z
.default(30000) .default(30000)
.describe("Timeout for individual LLM moderation calls"), .describe("Timeout for individual LLM moderation calls"),
// ── AI Analysis Timing ────────────────────────────────────────────── // ── AI Analysis Timing ──────────────────────────────────────────────
AI_ANALYSIS_DEBOUNCE_MS: z.coerce.number().positive().default(500), AI_ANALYSIS_DEBOUNCE_MS: z.coerce.number().positive().default(500),
AI_ANALYSIS_RECOVERY_INTERVAL_MS: z.coerce AI_ANALYSIS_RECOVERY_INTERVAL_MS: z.coerce
+1 -1
View File
@@ -1,6 +1,6 @@
import { createChildLogger } from "../logger/index.js";
import { drizzle } from "drizzle-orm/node-postgres"; import { drizzle } from "drizzle-orm/node-postgres";
import type { Pool, PoolClient } from "pg"; import type { Pool, PoolClient } from "pg";
import { createChildLogger } from "../logger/index.js";
import { closePool, createPoolFromConfig } from "./pool.js"; import { closePool, createPoolFromConfig } from "./pool.js";
const logger = createChildLogger("database.init"); const logger = createChildLogger("database.init");
@@ -592,5 +592,4 @@ export type DbRetentionPolicyInsert =
// Chatbot Messages // Chatbot Messages
export type ChatbotMessage = typeof chatbotMessagesTable.$inferSelect; export type ChatbotMessage = typeof chatbotMessagesTable.$inferSelect;
export type ChatbotMessageInsert = export type ChatbotMessageInsert = typeof chatbotMessagesTable.$inferInsert;
typeof chatbotMessagesTable.$inferInsert;
@@ -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 { NextFunction, Request, Response } from "express";
import type { ZodSchema } from "zod"; import type { ZodSchema } from "zod";
import { AppError, ValidationError } from "@/shared/errors/index";
import { createChildLogger } from "@/shared/logger/index";
const logger = createChildLogger("middleware"); const logger = createChildLogger("middleware");
+2 -2
View File
@@ -1,4 +1,6 @@
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import Redis from "ioredis";
import { config } from "../config/index.js";
import { import {
BACKEND_COMMAND, BACKEND_COMMAND,
BACKEND_COMMAND_REPLY_PREFIX, BACKEND_COMMAND_REPLY_PREFIX,
@@ -6,8 +8,6 @@ import {
type CommandReply, type CommandReply,
} from "../index.js"; } from "../index.js";
import { createChildLogger } from "../logger/index.js"; import { createChildLogger } from "../logger/index.js";
import Redis from "ioredis";
import { config } from "../config/index.js";
const logger = createChildLogger("redis.command-channel"); const logger = createChildLogger("redis.command-channel");
+5 -2
View File
@@ -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 Redis from "ioredis";
import { config } from "../shared/config/index.js"; 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"; import { broadcastBinary, broadcastEvent } from "./broadcast.js";
const logger = createChildLogger("ws.redis-bridge"); const logger = createChildLogger("ws.redis-bridge");
+2 -2
View File
@@ -1,8 +1,8 @@
import type { Server } from "node:http"; 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 { WebSocket, WebSocketServer } from "ws";
import { config } from "../shared/config/index.js"; 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"; import { setBroadcastFunctions } from "./broadcast.js";
const logger = createChildLogger("ws.server"); const logger = createChildLogger("ws.server");
+6 -6
View File
@@ -1,4 +1,6 @@
// ─── Shared Error Classes ──────────────────────────────────────────────────── // ─── Shared Error Classes ────────────────────────────────────────────────────
import { afterEach, describe, expect, it, vi } from "vitest";
import { import {
AppError, AppError,
ConfigError, ConfigError,
@@ -6,7 +8,9 @@ import {
NotFoundError, NotFoundError,
UnauthorizedError, UnauthorizedError,
ValidationError, ValidationError,
} from "@bete/shared/errors"; } from "../src/shared/errors/index.js";
// ─── Backend middleware ──────────────────────────────────────────────────────
import { asyncHandler, requireParam } from "../src/shared/middlewares/index.js";
// ─── Shared utilities ───────────────────────────────────────────────────────── // ─── Shared utilities ─────────────────────────────────────────────────────────
import { import {
decodeCursor, decodeCursor,
@@ -14,11 +18,7 @@ import {
encodeCursor, encodeCursor,
pageResult, pageResult,
retryWithBackoff, retryWithBackoff,
} from "@bete/shared/utils"; } from "../src/shared/utils/index.js";
import { afterEach, describe, expect, it, vi } from "vitest";
// ─── Backend middleware ──────────────────────────────────────────────────────
import { asyncHandler, requireParam } from "../src/shared/middlewares/index.js";
// ═══════════════════════════════════════════════════════════════════════════════ // ═══════════════════════════════════════════════════════════════════════════════
// 1. AppError / Error Hierarchy Tests // 1. AppError / Error Hierarchy Tests
+7 -1
View File
@@ -1,10 +1,16 @@
import { fileURLToPath } from "node:url";
import { defineConfig } from "vitest/config"; import { defineConfig } from "vitest/config";
export default defineConfig({ export default defineConfig({
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
},
test: { test: {
globals: true, globals: true,
environment: "node", environment: "node",
include: ["src/**/*.test.ts"], include: ["src/**/*.test.ts", "tests/**/*.test.ts"],
testTimeout: 15000, testTimeout: 15000,
}, },
}); });
@@ -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 { Client } from "discord.js-selfbot-v13";
import { inArray, lt } from "drizzle-orm"; import { inArray, lt } from "drizzle-orm";
import type { NodePgDatabase } from "drizzle-orm/node-postgres"; 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 { startPendingAIAnalysisWorker } from "../modules/ai-moderation/aiAnalyzer.js";
import { registerChannelTopicCapture } from "../modules/channel-topic/index.js"; import { registerChannelTopicCapture } from "../modules/channel-topic/index.js";
import { CommandHandler } from "../modules/command-handler/commandHandler.js"; import { CommandHandler } from "../modules/command-handler/commandHandler.js";
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import { inArray, lt } from "drizzle-orm"; import { inArray, lt } from "drizzle-orm";
import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import type { NodePgDatabase } from "drizzle-orm/node-postgres";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../shared/config/config.js"; import { config } from "../shared/config/config.js";
import { getDatabase } from "../shared/database/drizzle.js"; import { getDatabase } from "../shared/database/drizzle.js";
import type * as schema from "../shared/database/schema.js"; import type * as schema from "../shared/database/schema.js";
+1 -1
View File
@@ -1,5 +1,5 @@
import type { createChildLogger } from "@/shared/logger/index";
import type { Client } from "discord.js-selfbot-v13"; 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 { CommandHandler } from "../modules/command-handler/commandHandler.js";
import type { EventBroadcaster } from "../modules/event-broadcaster/index.js"; import type { EventBroadcaster } from "../modules/event-broadcaster/index.js";
import type { stopMetricsServer } from "../modules/gateway-metrics/index.js"; import type { stopMetricsServer } from "../modules/gateway-metrics/index.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Guild } from "discord.js-selfbot-v13"; import type { Guild } from "discord.js-selfbot-v13";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import type { MessageRecord } from "../message-capture/types.js"; import type { MessageRecord } from "../message-capture/types.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Client, PermissionString } from "discord.js-selfbot-v13"; import type { Client, PermissionString } from "discord.js-selfbot-v13";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import { messageStore } from "../message-capture/messageStore.js"; import { messageStore } from "../message-capture/messageStore.js";
import type { MessageRecord } from "../message-capture/types.js"; import type { MessageRecord } from "../message-capture/types.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Client } from "discord.js-selfbot-v13"; import type { Client } from "discord.js-selfbot-v13";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import type { MessageRecord } from "../message-capture/types.js"; import type { MessageRecord } from "../message-capture/types.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { createChildLogger } from "@/shared/logger/index";
import { getDatabase } from "../../shared/database/drizzle.js"; import { getDatabase } from "../../shared/database/drizzle.js";
import { import {
type ChannelCulture, type ChannelCulture,
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { encoding_for_model as encodingForModel } from "tiktoken"; import { encoding_for_model as encodingForModel } from "tiktoken";
import { createChildLogger } from "@/shared/logger/index";
import { import {
formatMediaEvidenceForPrompt, formatMediaEvidenceForPrompt,
renderDiscordMentions, renderDiscordMentions,
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { LRUCache } from "lru-cache"; import { LRUCache } from "lru-cache";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import { LAST_ERROR } from "./moderationState.js"; import { LAST_ERROR } from "./moderationState.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { and, desc, eq, sql } from "drizzle-orm"; import { and, desc, eq, sql } from "drizzle-orm";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import { getDatabase } from "../../shared/database/drizzle.js"; import { getDatabase } from "../../shared/database/drizzle.js";
import { messagesTable } from "../../shared/database/schema.js"; import { messagesTable } from "../../shared/database/schema.js";
@@ -27,7 +27,16 @@ export function sanitizeDiscordTokens(content: string): string {
if (!content.includes("<")) return content; if (!content.includes("<")) return content;
return content.replace( return content.replace(
DISCORD_TOKEN_RE, DISCORD_TOKEN_RE,
(_full, emojiName, _emojiId, _userId, _roleId, _channelId, _time, _style) => { (
_full,
emojiName,
_emojiId,
_userId,
_roleId,
_channelId,
_time,
_style,
) => {
if (emojiName) return `[emoji:${emojiName}]`; if (emojiName) return `[emoji:${emojiName}]`;
// Capture groups tell us which alternative matched by position: // Capture groups tell us which alternative matched by position:
// 3=user, 4=role, 5=channel, 6=time // 3=user, 4=role, 5=channel, 6=time
@@ -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 ───────────────────────────────────── // ── Single-pass LLM pipeline exports ─────────────────────────────────────
export type { export type {
AnalysisInput, AnalysisInput,
AnalysisResult, AnalysisResult,
WorkerConfig,
MessageBatch, MessageBatch,
WorkerConfig,
} from "./ai-analysis-worker.js"; } 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";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { LRUCache } from "lru-cache"; import { LRUCache } from "lru-cache";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import { messageStore } from "../message-capture/messageStore.js"; import { messageStore } from "../message-capture/messageStore.js";
import type { import type {
@@ -99,9 +99,7 @@ async function processIndividualFallback(
// retryable error — the recovery worker picks it up later. Producing a // retryable error — the recovery worker picks it up later. Producing a
// regex/wordlist verdict here would reintroduce false positives. // regex/wordlist verdict here would reintroduce false positives.
if (!analysisResult) { if (!analysisResult) {
throw new Error( throw new Error(`LLM analysis failed for message ${messageId}`);
`LLM analysis failed for message ${messageId}`,
);
} }
// Main thread: DB writes + broadcast // Main thread: DB writes + broadcast
@@ -5,9 +5,9 @@
* Used by both mediaAnalysisClient.ts and moderationOrchestrator.ts. * Used by both mediaAnalysisClient.ts and moderationOrchestrator.ts.
*/ */
import { renderDiscordMentions } from "../message-capture/messageMetadata.js";
import { messageStore } from "../message-capture/messageStore.js"; import { messageStore } from "../message-capture/messageStore.js";
import type { MessageRecord } from "../message-capture/types.js"; import type { MessageRecord } from "../message-capture/types.js";
import { renderDiscordMentions } from "../message-capture/messageMetadata.js";
import { sanitizeDiscordTokens } from "./discordTokens.js"; import { sanitizeDiscordTokens } from "./discordTokens.js";
/** Simple XML-escaping for content text. */ /** Simple XML-escaping for content text. */
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import type { z } from "zod"; import type { z } from "zod";
import { createChildLogger } from "@/shared/logger/index";
import type { AnalysisResult } from "../message-capture/types.js"; import type { AnalysisResult } from "../message-capture/types.js";
import type { import type {
RecommendedActionSchema, RecommendedActionSchema,
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { z } from "zod"; import { z } from "zod";
import { createChildLogger } from "@/shared/logger/index";
const log = createChildLogger("moderationSchemas"); const log = createChildLogger("moderationSchemas");
@@ -1,6 +1,6 @@
import { createChildLogger } from "@/shared/logger/index";
import type { Client } from "discord.js-selfbot-v13"; import type { Client } from "discord.js-selfbot-v13";
import { LRUCache } from "lru-cache"; import { LRUCache } from "lru-cache";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import type { EventBroadcaster } from "../event-broadcaster/index.js"; import type { EventBroadcaster } from "../event-broadcaster/index.js";
import type { MessageRecord } from "../message-capture/types.js"; import type { MessageRecord } from "../message-capture/types.js";
@@ -1,6 +1,6 @@
import Redis from "ioredis";
import { createChildLogger } from "@/shared/logger/index"; import { createChildLogger } from "@/shared/logger/index";
import { createAbortControllerWithTimeout } from "@/shared/utils/index"; import { createAbortControllerWithTimeout } from "@/shared/utils/index";
import Redis from "ioredis";
const log = createChildLogger("searxng-search"); const log = createChildLogger("searxng-search");
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { and, desc, eq, sql } from "drizzle-orm"; import { and, desc, eq, sql } from "drizzle-orm";
import { createChildLogger } from "@/shared/logger/index";
import { config } from "../../shared/config/config.js"; import { config } from "../../shared/config/config.js";
import { getDatabase } from "../../shared/database/drizzle.js"; import { getDatabase } from "../../shared/database/drizzle.js";
import { messagesTable } from "../../shared/database/schema.js"; import { messagesTable } from "../../shared/database/schema.js";
@@ -1,5 +1,5 @@
import { createChildLogger } from "@/shared/logger/index";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { createChildLogger } from "@/shared/logger/index";
import { getDatabase } from "../../shared/database/drizzle.js"; import { getDatabase } from "../../shared/database/drizzle.js";
import { import {
type UserProfile, type UserProfile,

Some files were not shown because too many files have changed in this diff Show More