asepharyana
ffea9bb0ba
fix(backend): only require auth for voice/media routes, rest public
...
Messages, analysis, mascot-chat, recordings, ui-state, and guilds
endpoints are now accessible without authentication.
Only voice (connect/disconnect/transmit) and media (queue/skip/stop/volume)
remain behind the admin password guard.
2026-07-02 06:51:57 +07:00
asepharyana
0ae1ef1987
fix(auth): only guard Live tab, messages & dashboard are public
...
Auth overlay only shows when accessing Voice & Media without
authentication. Messages panel and Dashboard panel remain fully
accessible without login.
2026-07-02 06:40:39 +07:00
asepharyana
112b865a5b
fix(infra): bypass Cloudflare Rocket Loader — breaks ES module scripts
...
Cloudflare Rocket Loader transforms <script type="module"> into
type="<hash>-module", which the browser cannot parse as ES module.
The React app never mounts — blank page on every route.
Fix: Vite plugin adds data-cfasync="false" attribute to the module
script tag, telling Rocket Loader to skip transformation.
Also: remove dist/ from the commit (build artifacts excluded).
2026-07-02 06:30:26 +07:00
asepharyana
d53ec74d64
fix(build): resolve Tailwind 4 @apply breaking changes
...
- Replace @apply im-btn in im-btn-primary/secondary/ghost
with inline Tailwind utilities + CSS properties
- Replace @apply im-status-dot in status dot variants
with inline properties
- Tailwind 4 cannot @apply component-level classes from within
@layer components — only standard utility classes are valid
2026-07-02 06:17:58 +07:00
asepharyana and workflow agents
ade5d6a7c3
fix: backend and discord-gateway improvements
...
- Update shared database schema
- Add shared utils
- Refactor backend middleware, auth routes, and dashboard repository
- Improve media analysis client with better error handling
- Fix searxng search URL construction
- Update URL fetcher for robustness
Co-authored-by: workflow agents
2026-07-02 06:02:07 +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
7cfc7ccf07
docs: add implementation plan for frontend redesign
...
21-task plan covering 5 layers:
- Foundation (theme engine, dark mode, animations)
- Components (Badge, Toast, Skeleton, EmptyState, variants)
- Layout (TabStrip, Sidebar, Header, Mobile, DashboardLayout)
- Features (Messages, Dashboard, Live panel cleanup)
- Polish (empty states, theme toggle, animation audit)
2026-07-02 05:42:40 +07:00
asepharyana
970a1cb7f7
docs: bete frontend redesign spec — IMPHNEN deep integration
...
Full 5-layer design document covering:
- Layer 0: Theme tokens & dark mode palette (light + dark CSS vars)
- Layer 1: Shared UI components (Badge, Toast, Skeleton fixes + new primitives)
- Layer 2: Layout & navigation (sidebar expanded, brand bar, tab strip, mobile)
- Layer 3: Feature components (MessageCard, Dashboard, Live panel refinements)
- Layer 4: Polish & micro-interactions (animations, empty states, theme toggle, mascot)
Resolves known issues in DESIGN_TOKENS.md §13 (hardcoded hex colors, z-index,
shimmer mismatch). Adds dark mode support across all components.
2026-07-02 05:40:04 +07:00
asepharyana
bf9d018f7a
fix: skip AI analysis for channel 1508059937031589949
2026-07-02 04:28:33 +07:00
asepharyana
c5a9371e71
fix(infra): nginx upstream DNS staleness — 502 after backend restart
...
- Replace upstream blocks with variable-based proxy_pass + Docker DNS
resolver (127.0.0.11) so nginx resolves hostnames dynamically on
each request instead of caching at startup only.
- Add explicit 'docker compose restart proxy' in CI deploy step
(belt-and-suspenders: also forces nginx restart after deploy).
- Remove no-op sed commands from CI (docker-compose.yml already uses
GitLab registry, no ghcr.io replacements needed).
Root cause: docker compose up -d only recreates containers whose image
changed. When backend container is recreated (new Docker IP), nginx
still caches the old IP → 502 Bad Gateway on /api/*
2026-07-02 04:22:16 +07:00
asepharyana
fa82593a38
fix: switch to node:22-slim, install deps from npm, remove vendor
2026-07-02 04:07:18 +07:00
asepharyana
1495211a61
chore: remove vendor directory
2026-07-02 04:03:32 +07:00
asepharyana
950bc03708
chore: update docker-compose to GitLab registry, remove .gitmodules
2026-07-02 04:03:21 +07:00
asepharyana
edc1a2d1fc
chore: restore .gitlab-ci.yml after revert
2026-07-02 03:57:13 +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
9636087e99
Revert "docs: add Astro migration design spec"
...
This reverts commit e8b1827638 .
2026-07-02 03:54:44 +07:00
asepharyana
6ecff523c7
Revert "docs: add Astro migration implementation plan"
...
This reverts commit 5e40b1ad8c .
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
880c68fbab
Revert "ci: migrate from GitHub Actions to GitLab CI/CD"
...
This reverts commit c64dd7c2ee .
2026-07-02 03:54:44 +07:00
asepharyana
26d33dd76b
Revert "ci: simplify GitLab CI — SSH → git pull → docker compose up -d --build"
...
This reverts commit a62c23f1e8 .
2026-07-02 03:54:44 +07:00
asepharyana
3b64a5892f
Revert "ci: switch to debian:stable-slim for SSH compatibility"
...
This reverts commit 0da9839b3a .
2026-07-02 03:54:44 +07:00
asepharyana
10839141d9
Revert "ci: add Docker build + GitLab Container Registry push before deploy"
...
This reverts commit 90b317731b .
2026-07-02 03:54:44 +07:00
asepharyana
9e315a9574
Revert "ci: remove docker tag — shared runners don't have it"
...
This reverts commit 13bba60e3a .
2026-07-02 03:54:44 +07:00
asepharyana
d37cecdb38
Revert "fix(Dockerfile): use node:22-slim for backend (glibc), add linux-headers + nodedir for gateway"
...
This reverts commit 9e8f4377af .
2026-07-02 03:54:44 +07:00
asepharyana
81f541c080
Revert "fix(Dockerfile): switch discord-gateway to node:22-slim for opus compatibility"
...
This reverts commit 51d3e47fe3 .
2026-07-02 03:54:44 +07:00
asepharyana
c408a8d1f7
Revert "fix(Dockerfile): install Rust via rustup for node-crc compatibility"
...
This reverts commit 0200c77fc2 .
2026-07-02 03:54:44 +07:00
asepharyana
ba399e6621
Revert "ci: add GIT_SUBMODULE_STRATEGY for vendor dependencies"
...
This reverts commit 7b106fe562 .
2026-07-02 03:54:44 +07:00
asepharyana
586627319f
Revert "refactor: vendor content as regular files (remove git submodules) so CI builds don't need GitHub auth"
...
This reverts commit 134674d7dd .
2026-07-02 03:54:44 +07:00
asepharyana
24c738dd19
Revert "fix: split LiveShell into Astro layout + individual islands"
...
This reverts commit 6e1757410a .
2026-07-02 03:54:44 +07:00
asepharyana
91e14abbda
Revert "fix: update nginx for Astro SSG — /_astro/ cache, remove SPA fallback"
...
This reverts commit 918e45f9da .
2026-07-02 03:54:44 +07:00
asepharyana
5a10bec67a
Revert "fix: replace Astro.redirect with direct live content at /"
...
This reverts commit 34ac4be6c2 .
2026-07-02 03:54:44 +07:00
asepharyana
34ac4be6c2
fix: replace Astro.redirect with direct live content at /
2026-07-02 03:47:23 +07:00
asepharyana
918e45f9da
fix: update nginx for Astro SSG — /_astro/ cache, remove SPA fallback
2026-07-02 03:42:56 +07:00
asepharyana
6e1757410a
fix: split LiveShell into Astro layout + individual islands
...
- Rewrite live.astro to use Astro Sidebar/Header/Card components
- VoiceControls becomes self-contained (fetches guilds/channels internally)
- Remove LiveShell.tsx (no longer needed)
- Each React island uses appropriate client:load/idle directive
2026-07-02 03:13:54 +07:00
asepharyana
134674d7dd
refactor: vendor content as regular files (remove git submodules) so CI builds don't need GitHub auth
2026-07-02 02:38:04 +07:00
asepharyana
7b106fe562
ci: add GIT_SUBMODULE_STRATEGY for vendor dependencies
2026-07-02 02:33:54 +07:00
asepharyana
0200c77fc2
fix(Dockerfile): install Rust via rustup for node-crc compatibility
2026-07-02 02:29:36 +07:00
asepharyana
51d3e47fe3
fix(Dockerfile): switch discord-gateway to node:22-slim for opus compatibility
2026-07-02 02:26:34 +07:00
asepharyana
9e8f4377af
fix(Dockerfile): use node:22-slim for backend (glibc), add linux-headers + nodedir for gateway
2026-07-02 02:22:09 +07:00
asepharyana
13bba60e3a
ci: remove docker tag — shared runners don't have it
2026-07-02 02:17:54 +07:00
asepharyana
90b317731b
ci: add Docker build + GitLab Container Registry push before deploy
2026-07-02 02:11:46 +07:00
asepharyana
0da9839b3a
ci: switch to debian:stable-slim for SSH compatibility
2026-07-02 01:55:21 +07:00
asepharyana
a62c23f1e8
ci: simplify GitLab CI — SSH → git pull → docker compose up -d --build
...
Remove Docker-in-Docker, registry push/pull, SCP complexity.
Pipeline now just SSHs into VPS and rebuilds from source.
Secrets configured:
VPS_HOST, VPS_USERNAME, VPS_SSH_KEY (file type)
2026-07-02 01:46:52 +07:00
asepharyana
c64dd7c2ee
ci: migrate from GitHub Actions to GitLab CI/CD
...
- Create .gitlab-ci.yml with Docker build + GitLab registry push + VPS deploy
- 4 build jobs (frontend, backend, discord-gateway, proxy) in parallel
- Uses Docker-in-Docker with BuildKit for cached multi-stage builds
- Deploy stage uses SCP for .env + docker-compose, then SSH for orchestration
- Images pushed to registry.gitlab.com/mytheclipse-group/gmw/
GitLab CI/CD secrets configured:
- VPS_HOST: 45.127.35.244
- VPS_USERNAME: root
- VPS_SSH_KEY: (file type - SSH private key)
- ENV_FILE: (env_var type - full .env content)
Remove old .github/workflows/deploy-docker.yml (GitHub Actions)
2026-07-02 01:46:18 +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
5e40b1ad8c
docs: add Astro migration implementation plan
2026-07-02 00:41:17 +07:00
asepharyana
e8b1827638
docs: add Astro migration design spec
2026-07-02 00:36:30 +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
d5c22a3959
fix(discord-gateway): handle forwarded message content via messageSnapshots
...
Two-layer fix for forwarded messages showing as empty/clean:
Layer 1 (messageMetadata.ts): getReferencedMessageContent() now falls
back to message.messageSnapshots Collection when channel.messages.cache
lookup fails. Discord stores forward content in message_snapshots API
field, not in message.content.
Layer 2 (moderationBuilders.ts): buildReferenceXml() now parses msg.
metadata JSON to extract reference.content when DB getMessageById()
fails (cross-server forwards not in local DB).
Previously: forward messages captured with empty parentContent →
LLM saw no reference text → '99% confidence, pesan kosong'.
Now: forward content flows through capture → metadata → analysis.
2026-06-23 23:27:23 +07:00
MythEclipse
ed4a506ca7
refactor: split llmModerationClient.ts + add tests + metrics
...
## Split llmModerationClient.ts (2103 → 3 files)
- **moderationBuilders.ts** (67 lines) — shared: escapeXml, getAnalysisContent, buildReferenceXml
- **mediaAnalysisClient.ts** (656 lines) — vision analysis with multi-layer LRU/DB/phash caching, image/video download, ffmpeg frame extraction, prepareMediaMessage
- **moderationOrchestrator.ts** (998 lines) — callModerationLLM, runTextOnlyBatch, runMediaBatch, runModerationAnalysis, runSimpleTextFallback
- **llmModerationClient.ts** (30 lines) — re-export bridge (backward compat)
No import changes needed — aiAnalysisWorker.ts still imports from llmModerationClient.js.
## Unit tests (backend)
- vitest.config.ts + e2e.test.ts with 9 tests against production:
- health, metrics, dashboard/stats, recordings, config, auth, guilds, negative (404/400)
## Monitoring metrics
- moderationMetrics.ts in backend health module:
- LLM call count/duration/tokens
- Cache hit/miss per layer
- Media analysis count/download duration
- Batch size distribution, errors, SearXNG, auto-delete
2026-06-22 20:38:34 +07:00