asepharyana
cedce85087
ci: fix lint errors for CI
...
Deploy to VPS / deploy (push) Successful in 1m47s
- Fix noImplicitAnyLet: add type to let match variable
- Fix noAssignInExpressions: use matchAll() + for-of instead of while
- Suppress useExhaustiveDependencies in mascot scroll effect
- Suppress useSemanticElements for message card click handler
2026-07-26 12:01:51 +07:00
asepharyana
5e01ec0806
feat: migrate Leptos frontend to Next.js 16 (React 19)
...
Deploy to VPS / deploy (push) Failing after 42s
Complete migration from services/frontend.old/ (Leptos 0.7 WASM + Rust)
to services/frontend/ (Next.js 16 static export + TypeScript + Tailwind v4).
Summary:
- Port all shared types (message, guild, voice, media, dashboard, recording, ui)
- Build fetch-based API client covering all 30+ backend endpoints
- WebSocket client with auto-reconnect (exponential backoff, 20 attempts)
- React context provider for WS with typed event subscription (22 event types)
- Login page with localStorage auth + auto-redirect
- Dashboard layout with sidebar, header (WS status + theme toggle)
- Messages: feed, search, images tab, review tab, channel filter, detail modal
- Live: voice connection, music player, recordings, mic transmit, active speakers
- Dashboard: stats, user list, channel list, detail views
- Mascot chatbot with history + clear
- uiStateApi persistence for selected tab
- Add static export config, update deploy scripts and CI
2026-07-26 11:27:21 +07:00
asepharyana
8166023f91
chore: remove React frontend, rename frontend-leptos to frontend
2026-07-03 23:11:00 +07:00
asepharyana
81a004d250
feat(frontend): IMPHNEN design deep integration — full 5-layer redesign
...
Layer 0 — Foundation:
- Dark mode palette (30+ CSS var pairs in [data-theme='dark'])
- CSS-first theme engine in styles.css (@theme + CSS vars)
- UseTheme hook with light/dark/system support + localStorage persistence
- Fixed animation keyframes (shimmer 1.5s canonical, glowPulse moved to CSS)
- Smooth theme switch transitions via .theme-transitioning class
Layer 1 — Shared UI Components:
- Badge: success/warning variants now use CSS vars (bg-success-soft text-success)
- Toast: rewritten with CSS vars, z-index fixed (40), repositioned top-right
- Skeleton: added variant prop (rounded/circular/rectangular)
- EmptyState: new component with icon + title + description + action
- Button: added tertiary variant + icon-sm size
- Card: added elevated/bordered variants
- Input: added soft variant
Layer 2 — Layout & Navigation:
- TabStrip: new horizontal tab navigation with spring underline indicator (z-30)
- Sidebar: expanded by default (w-64), brand assets always visible
- Header: simplified brand bar, removed redundant page titles, added ThemeToggle
- MobileTabBar: enhanced with spring dot indicator + glass bg + safe area
- DashboardLayout: integrated TabStrip between Header and content
- ParticleBackground: lazy render, skips on mobile/reduced-motion
Layer 3 — Feature Components:
- MessageCard: 30+ hardcoded hex replacements → semantic CSS vars
- MessagesPanel: stat badges use Badge component variants
- DashboardStats: StatCard with variant system (primary/success/warning/destructive)
- UserSummaryList/UserProfileDetail/ChannelProfileDetail: all hardcoded colors → CSS vars
- AudioVisualizer: reads --primary CSS var at paint time
- ActiveSpeakers/RecordingsSubPanel: hardcoded colors → CSS vars
Layer 4 — Polish:
- EmptyState integrated across messages/dashboard/live panels
- Theme toggle wired in Header + App root
- Hover state audit for consistency
- Entry animations verified (cardStagger/cardItem pattern in all panels)
Resolves DESIGN_TOKENS.md §13.x issues: hardcoded colors, shimmer mismatch,
glow-pulse fragmentation, z-index collisions, toast positioning.
2026-07-02 05:58:36 +07:00
asepharyana
7efaf00c93
Revert "feat: migrate frontend to Astro + expand AI moderation + backend admin/runtime config"
...
This reverts commit d59b59a7a7 .
2026-07-02 03:54:44 +07:00
asepharyana
bf86fcda8e
Revert "feat: migrate frontend to Astro SSG with design system"
...
This reverts commit 8ad888da28 .
2026-07-02 03:54:44 +07:00
asepharyana
8ad888da28
feat: migrate frontend to Astro SSG with design system
...
- Replace monolithic React SPA (App.tsx) with 7 Astro pages (+ routing)
- Implement full design system from design/ (OKLCH tokens, Tailwind 4 @theme)
- Add 12 Astro components (Button, Badge, Card, Sidebar, Header, states)
- Add 11 React islands (AuthGuard, MessageFeed, VoiceControls, AudioVisualizer, etc.)
- Add 3 Zustand stores (UI, voice, message state)
- Add CSS architecture: dark/light themes, glassmorphism, fluid typography, animations
- Add 404, login, settings, recordings pages
- Remove 40+ legacy React SPA files
- Add Particles background and MascotChat deferred islands
- Wire WebSocket bridge for real-time messages and voice events
Build: 7 pages in ~900ms
Typecheck: clean (0 errors)
Lint: clean (0 errors)
2026-07-02 01:18:45 +07:00
asepharyana
d59b59a7a7
feat: migrate frontend to Astro + expand AI moderation + backend admin/runtime config
...
Frontend:
- migrate from Vite to Astro (astro.config.mjs, pages/, layouts/)
- add admin panel, settings page, command palette, error boundary
- refactor App.tsx, MascotChatbot, Sidebar, Header, DashboardLayout
- update API client, WebSocket, auth, dashboard features
Backend:
- add admin module and config routes
- refactor middlewares, Redis connection, WebSocket server/bridge
- add runtime config loader
Discord Gateway:
- refactor AI moderation: circuit breaker, concurrency limiter, fallback processor
- add media analysis client, Seaxng search, user profile learner
- add new drizzle migration
Shared:
- extend database schema, add new config fields
2026-07-02 00:02:41 +07:00
MythEclipse
f502918b27
feat: multimodal video detection + reply/forward/crosspost + batch optimization
...
- Video frame extraction via ffmpeg (4 key frames per video → vision LLM)
- Video display in FE MessageCard with HTML5 <video> player
- Reply/forward/crosspost indicator in FE + pipeline in DG/BE
- Fix: missing sanitizeAiContent + escapeXml in media path (prompt injection)
- Optimize: text-only batch results saved to DB immediately, no longer wait for media analysis
- BE mapper/schema/repo: add reference fields (is_reply, is_forward, etc.)
2026-06-22 09:46:06 +07:00
MythEclipse
21b818a344
feat: add forwarding & reply detection with frontend indicators
...
- Enhanced messageMetadata to capture referenced message content
- Added reply indicator (↩️ Replying to @username + content snippet)
- Added forward badge (🔁 Forwarded) and crosspost badge (📢 Crossposted)
- Frontend auto-fetches referenced message content when metadata is empty
- Added getMessageById API helper
2026-06-21 18:22:27 +07:00
MythEclipse and Claude
752d144dc0
refactor(fe): overhaul — split types, type-safe WS, remove dead deps/code
...
- Remove unused deps: gsap, @tanstack/react-query, three, r3f, drei, autoprefixer
- Split types from shared/api/client.ts into entities/{guild,voice,media,ui,recording,dashboard}
- Type-safe WebSocket handlers using WsEventMap — 0 'as' casts in App.tsx
- Replace gsap with framer-motion in AuthOverlay
- Remove dead code: useMascotSummary, gsapCardHover, live/components/index barrel
- Fix bare console calls → use createLogger from @bete/shared/logger
- Clean up unused imports and variables (aiVariant, etc.)
Co-Authored-By: Claude <noreply@anthropic.com >
2026-06-16 22:44:28 +07:00
MythEclipse and Claude
9af2d7d4dd
refactor(fe): DRY components, hooks, a11y fixes, and WS/client improvements
...
- Extract StatusBadge, SummaryList, ProfileDetail shared components (~300 lines deduplicated)
- Extract usePaginatedList<T>, useItemDetail<T> generic hooks (~170 lines deduplicated)
- Fix a11y: Badge (role=status, dark variants), Button (aria-disabled, motion-safe), Input (aria-invalid, errorId), Select (error variant), Skeleton (aria-hidden), MobileTabBar (full tab ARIA), Toast (timer leak fix, role=alert, keyboard dismiss), Card (role=region)
- Fix API client: buildSearchParams helper, request timeout, password caching, named types
- Fix WS: typed 24 event payloads (was all unknown), exponential backoff reconnect, max 20 attempts, msg.data guard
- Fix bug: listDashboardChannels cursor pagination was silently dropped
- Remove duplicate shimmer keyframes from tailwind.config.js
- Fix WaveformPlayer non-null assertion
Co-Authored-By: Claude <noreply@anthropic.com >
2026-06-14 15:22:29 +07:00
MythEclipse
41e67423b8
chore(services): update components based on recent changes
...
Changes:
services/frontend/src/features/dashboard/components/ChannelProfileDetail.tsx | 258 +++++++++++-----------------------------------------------------------------
services/frontend/src/features/dashboard/components/ChannelSummaryList.tsx | 171 ++++++++-------------------------------------------
services/frontend/src/features/dashboard/components/DashboardStats.tsx | 8 ++-
services/frontend/src/features/dashboard/components/UserProfileDetail.tsx | 297 +++++++++++++---------------------------------------------------------------------------
services/frontend/src/features/dashboard/components/UserSummaryList.tsx | 204 +++++++++++-------------------------------------------------
services/frontend/src/features/dashboard/hooks/useDashboard.ts | 203 +++++++++++++++---------------------------------------------
services/frontend/src/features/messages/components/MessageCard.tsx | 10 +--
services/frontend/src/shared/api/client.ts | 87 +++++++++++++++++++-------
services/frontend/src/shared/hooks/useItemDetail.ts | 58 +++++++++++++++++
services/frontend/src/shared/hooks/usePaginatedList.ts | 105 +++++++++++++++++++++++++++++++
2026-06-14 15:16:18 +07:00
MythEclipse
f22201381f
a
2026-06-13 23:58:29 +07:00
MythEclipse
82c1658bab
chore(services): update components based on recent changes
...
Changes:
services/frontend/src/features/messages/index.tsx | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
2026-06-13 19:43:32 +07:00
MythEclipse
28baeda5ad
chore(services): update components based on recent changes
...
Changes:
packages/shared/src/config/index.ts | 7 +++
packages/shared/src/moderation-types.ts | 1 +
services/backend/src/modules/recordings/recordings.service.ts | 3 +-
services/discord-gateway/drizzle/migrations/0011_add_voice_transcription.sql | 1 +
services/discord-gateway/src/modules/voice-recording/recorder/segment.ts | 10 ++++
services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts | 15 ++++++
services/discord-gateway/src/modules/voice-recording/voiceTranscriber.ts | 51 ++++++++++++++++++
services/discord-gateway/src/shared/database/schema.ts | 1 +
services/discord-gateway/src/shared/database/voiceRecordingRepo.ts | 17 ++++++
services/frontend/src/features/live/components/RecordingsSubPanel.tsx | 108 +++++++++++++++++++-------------------
2026-06-13 17:08:54 +07:00
MythEclipse
1d06de5ce5
chore(services): update components based on recent changes
...
Changes:
services/frontend/src/features/live/components/RecordingsSubPanel.tsx | 45 ++------
services/frontend/src/features/live/components/WaveformPlayer.tsx | 253 +++++++++++++++++++++++++++++++++++++++++++++
services/frontend/src/features/live/components/index.ts | 1 +
3 files changed, 261 insertions(+), 38 deletions(-)
2026-06-13 16:56:17 +07:00
MythEclipse
5c8fa3d254
chore(services): update components based on recent changes
...
Changes:
services/frontend/src/App.tsx | 22 ++++++++++++++++++++++
services/frontend/src/features/live/components/VoiceConnectionCard.tsx | 5 ++++-
2 files changed, 26 insertions(+), 1 deletion(-)
2026-06-13 16:54:52 +07:00
MythEclipse
fce24278f0
chore(auto): task completed - unknown
2026-06-13 14:49:47 +07:00
MythEclipse
e6e34281ff
chore(auto): task completed - unknown
2026-06-13 14:24:09 +07:00
MythEclipse and Claude
14c0081f01
feat(discord-gateway): implement voice & push improvements
...
- Voice disconnect broadcast on stopRecording
- Multi-guild voice support (VoiceController Map<guildId>)
- Session finalization + auto-enqueue muxer job
- Recordings API: duration field, channelId/userId filters
- Transmitter Redis connection reuse (shared conn)
- FFmpeg stderr memory cap (4KB limit)
- 10 new Redis event channels + Redis bridge subscriptions
- New DB tables: message_reactions, message_edits
- Webhook notification module
- Gateway metrics / Prometheus endpoint
- Multi-guild message capture (MONITOR_GUILD_IDS array)
- Thread tracking, presence, channel topic, guild member events
- Edit history snapshot on message update
- Muxer audio post-processing worker
Co-Authored-By: Claude <noreply@anthropic.com >
2026-06-13 13:51:21 +07:00
MythEclipse
615c23f061
chore(auto): task completed - unknown
2026-06-13 12:24:32 +07:00
MythEclipse
dcede1d676
chore(auto): task completed - unknown
2026-06-13 12:11:37 +07:00
MythEclipse
1406ce3585
chore(auto): task completed - unknown
2026-06-13 11:46:15 +07:00
MythEclipse and Claude
30f8d7cce3
feat: replace corrections/tuner with dashboard module
...
Replace the corrections/adaptive-prompt-tuner feature with a new
dashboard module providing server stats and user profile overview.
Backend:
- Add dashboard module (routes, service, repository) with stats + user list + user detail endpoints
- Remove corrections module entirely
- Wire dashboard router in app.ts
Frontend:
- Add dashboard feature (DashboardStats, UserSummaryList, UserProfileDetail components + useDashboard hook)
- Remove tuner feature (CorrectionStats, CorrectionHistory, SubmitCorrection, useCorrections)
- Update API client from corrections → dashboard types/fns
- Rename tab 'tuner' → 'dashboard'
- Update MobileTabBar, Header, Sidebar links
Tests:
- Expand backend placeholder test with dashboard assertions
- Expand discord-gateway placeholder test with config/channel assertions
AI moderation:
- llmModerationClient: improve status/reply detection, expand safety categories, fix timer reset
- userProfileLearner: fix isReply refinement
- userProfileStore: add pending cache check
- messageMetadata: add crosspost type mapping
- migrate.ts: improve partial-index safety in schema push
Co-Authored-By: Claude <noreply@anthropic.com >
2026-06-13 11:24:42 +07:00
MythEclipse and Claude
5c00c9f60b
feat(ui): overhaul frontend with IMPHNEN visual identity
...
- Update CSS foundation: HSL→oklch color tokens, Poppins font, new utilities
- Replace Three.js sakura particles with CSS glow orbs
- Rebrand Header with IMPHNEN logo and gradient text
- Update all UI components (Button, Card, Badge, Input, Select, Tabs, Toast)
- Apply IMPHNEN design patterns (glass, gradient, grid) to layout
- Remove all hardcoded #7EC8E3/#FFB7C5/#FCA5A5 references
- Standardize rounded-xl across all components
- Replace emoji toasts with Lucide icons
Co-Authored-By: Claude <noreply@anthropic.com >
2026-06-12 23:00:52 +07:00
MythEclipse and Claude
7f3eb7b9ac
feat(ui): add Adaptive Prompt Tuner tab with correction submission UI
...
- Add pgCorrectedModerationsTable to shared schema
- Create backend corrections module (stats, list, create endpoints)
- Add TunerPanel with Stats, History, and Submit sub-tabs
- Add AuthOverlay gate for Tuner (admin-only, same as Live)
- Set messages as default tab
- Wire Tuner into sidebar, header, and mobile tab bar
Co-Authored-By: Claude <noreply@anthropic.com >
2026-06-12 21:28:05 +07:00
MythEclipse
2557a07916
feat(core): implement data retention, metrics, and enhanced media handling
...
This commit introduces several significant improvements across the backend and gateway services:
- **Data Retention**: Added an automated cleanup scheduler in `discord-gateway` to prune expired messages, attachments, and voice recordings based on configurable retention policies.
- **Observability**: Integrated `prom-client` in the `backend` service to expose Prometheus metrics via `/api/metrics` and added default Node.js runtime metrics.
- **Media Handling**: Enhanced `MediaHandler` in `discord-gateway` to support media URL resolution and improved playback status tracking.
- **API & Config**: Expanded the configuration endpoint to expose more system settings and reorganized `.env.example` for better readability.
- **Refactoring & Cleanup**:
- Removed unused `better-sqlite3` dependency.
- Refactored voice channel routing.
- Improved error handling and testing coverage with comprehensive unit tests for shared utilities and error classes.
- **Documentation**: Added `MEMORY.md` for project context.
2026-06-10 20:56:16 +07:00
MythEclipse and Claude Opus 4.8
07032ab521
refactor: atomic, DRY, and logging improvements across codebase
...
- Split llmModerationClient.ts (2170 lines) into 5 focused sub-modules
- Split aiAnalyzer.ts (1282 lines) into 4 modular pipelines
- Split messages.db.ts (826 lines) into 5 domain-specific modules
- Moved shared schema to @bete/shared, eliminated backend duplication
- Added createChildLogger to all voice-recording and AI moderation modules
- Extracted tryCommandThenFallback, normalizeMediaState, DEFAULT_VOICE_STATUS
- Created shared pagination.ts utility, eliminated 5+ cursor-pagination duplications
- Created shared messageMapper.ts for row mapping
- Standardized backend error handling with asyncHandler
- Added frontend createLogger utility and useAsyncAction hook
- Added structured logging to frontend hooks, socket, and API client
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-09 19:46:08 +07:00
MythEclipse
7108f6bb47
feat(system): implement graceful shutdown and expand websocket events
...
Improve system reliability and real-time capabilities by implementing a robust lifecycle management system and adding new broadcast events for attachments and voice recordings.
- Implement asynchronous graceful shutdown in backend to close HTTP, WebSocket, Redis, and database connections.
- Add new WebSocket broadcast events: `attachment_created`, `voice_recording_started`, `voice_recording_stopped`, `voice_recording_uploaded`, and `analysis_queue_status`.
- Refactor media status handling to use boolean `playing` state instead of string-based status.
- Centralize `PageResult` and `VoiceRecording` types to improve consistency between frontend and backend.
- Update frontend API client to include `listRecordings` and handle new WebSocket event types.
- Fix type mismatches in voice command handling and media status reporting.
2026-06-09 16:56:44 +07:00
MythEclipse and Claude Opus 4.8
3a7b005d95
fix: resolve architecture disconnects and codebase weaknesses
...
- Add TEXT_CHANNEL_ID and TEXT_GUILD_ID to config schema (fix silent channel monitoring)
- Remove dead files: message-capture/broadcaster.ts, voice-recording/index.ts
- Fix WebSocket voice_command payload to forward from frontend
- Implement moderation:action handler in commandHandler
- Fix useMascotChat to use canonical request() wrapper
- Fix useAudioPlayback userId hash collision (use string not parseInt)
- Add catch blocks to useMediaControl.skip/stop
- Add typed broadcast functions (messageAnalyzed, voicePcmData, voiceActiveUser)
- Apply Biome formatting and lint fixes
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-09 16:36:23 +07:00
MythEclipse and Claude Opus 4.8
4becf0d6f1
refactor: comprehensive codebase cleanup and architecture hardening
...
- Sprint 1 (Quick Wins): Remove dead analytics modules, fix 4 unresolved
imports, replace 3 console.warn with logger, remove mock-crc import
- Sprint 2 (Architecture): Create MascotChatRepository, AnalysisRepository,
3 Zod schemas (mascot-chat, analysis, voice), deduplicate error classes,
move 3 SQL queries from routes to repository
- Sprint 3 (Complexity): Replace 7 any types with proper interfaces,
extract 6 helpers from prepareMediaMessage (CC 85 -> ~15)
- Sprint 4 (Config): Remove 22 dead env vars from .env, add 30 missing
vars to .env.example, standardize naming
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-09 10:16:04 +07:00
MythEclipse
e00b23f9b8
fix(concurrency): eliminate all identified double-queue and race conditions
...
Implements full audit from double_queue_audit.md.
## Critical
fix(backend): reanalyze-batch — per-scope in-flight guard (messages.routes.ts)
Two concurrent admin sessions clicking 'Retry All Errors' simultaneously now
get a 409 REANALYZE_BATCH_IN_PROGRESS for the same guildId:channelId scope.
Prevents the recovery worker from being triggered twice for the same set of
error messages.
fix(discord-gateway): messageUpdate embed resolution skip (messageCapture.ts)
Discord fires messageUpdate when link previews resolve 1-2s after send
even though the message body is unchanged. Compare newContent vs
existingContent before resetting ai_status to pending and re-queueing LLM.
Eliminates a spurious duplicate analysis that could overwrite a valid result.
## High
fix(discord-gateway): scheduleAutoDelete idempotency (aiAnalyzer.ts)
Add autoDeleteInFlight Set. Both processBatch and processIndividualFallback
call scheduleAutoDelete; without the guard, a message that races through
both paths launches two concurrent attemptAutoDeleteFlaggedMessage calls,
producing a duplicate moderation-action log entry and a Discord 10008 error.
The Set is cleaned up in a .finally() block after each attempt completes.
## Medium
fix(frontend): revert optimistic pending state on HTTP failure (useMessages.ts)
Capture the prior MessageRecord inside the setMessages functional updater
(no extra useCallback deps needed). If reanalyzeMessage() throws, restore
the snapshot so the UI reflects the real DB state instead of lying.
fix(discord-gateway): exclude individual_analysis_exhausted from recovery queries
Both getConversationKeysWithIncompleteAnalysis and
getIncompleteMessagesByConversation now add a NOT LIKE guard for
individual_analysis_exhausted. Prevents an infinite recovery loop if a bug
ever writes both flags to the same row.
## Low
fix(discord-gateway): unified timer path in scheduleConversationAnalysis
Remove the separate cooldown-path that created a secondary timer calling
scheduleConversationAnalysis recursively. Replace with a single
clear-and-reset pattern where delayMs = max(cooldownRemainder+500, debounce).
Eliminates the edge case where both timers were live simultaneously.
## Misc
fix(backend): cast req.params.id to String() to satisfy Express typings
Pre-existing tsc error (string | string[]) exposed by our edit.
String() is correct; route params are always scalar strings at runtime.
2026-06-05 16:09:23 +07:00
MythEclipse
0a35e83a6c
refactor(analytics): replace hardcoded color tokens with theme-aware CSS variables
2026-06-04 14:17:45 +07:00
MythEclipse
3ecb7bd15c
chore: session auto-commit
2026-06-04 14:16:59 +07:00
MythEclipse
458f20d5c3
chore: session auto-commit
2026-06-04 14:16:26 +07:00
MythEclipse
ad61af54e8
refactor(analytics): replace TrendChart gradient bars with interactive SVG line chart featuring tooltips and grid lines
2026-06-04 14:15:56 +07:00
MythEclipse
ceb5fc95ba
refactor(analytics): replace gradient bars with interactive SVG donut and horizontal bar charts
2026-06-04 14:15:27 +07:00
MythEclipse
00001973d8
refactor(analytics): replace ActivityChart stacked bars with interactive SVG chart featuring tooltips and grid lines
2026-06-04 14:14:49 +07:00
MythEclipse
a24a5e7dfd
refactor(messages): remove text channel filter and channel-section grouping
2026-06-03 20:53:47 +07:00
MythEclipse
2a2003e638
fix(messages): hide fallback attachment text when media is already displayed visually
2026-06-03 20:42:57 +07:00
MythEclipse
b38f867894
refactor(messages): mark emptyText prop as unused
...
Rename emptyText to _emptyText to indicate it is currently unused in the
MessageFeed component, preventing linting warnings.
2026-06-03 20:38:01 +07:00
MythEclipse
198d5a6329
feat(messages): group message feed by channel and thread sections
2026-06-03 20:34:58 +07:00
MythEclipse
71801b7f77
feat(messages): show channel and thread location context in message cards
2026-06-03 20:34:06 +07:00
MythEclipse
79c2e31b17
feat(messages): add text channel filtering for message browser
2026-06-03 20:31:23 +07:00
MythEclipse
a39c7a91c2
refactor(api): replace URLSearchParams param with structured object in listMessages
2026-06-03 20:29:34 +07:00
MythEclipse
b5a218daa1
style(analytics): format JSX and object literals consistently
2026-06-03 18:27:41 +07:00
MythEclipse
b8979cbee1
feat(analytics): add AI distribution and attachment stats panels
2026-06-03 18:19:41 +07:00
MythEclipse
1669614735
feat(analytics): add warned status tracking to summary cards, trend chart, and violator table
2026-06-03 18:18:27 +07:00
MythEclipse
caa9ecca63
feat(analytics): add AI stats, attachment stats, and moderation actions queries to useAnalytics hook
2026-06-03 18:17:25 +07:00