Commit Graph
69 Commits
Author SHA1 Message Date
asepharyana 63ddc1e112 fix(leptos): compile errors in Phase 3 message components - WIP
Fixed:
- Icon imports: Replaced lucide-leptos icons with SVG/emoji alternatives
- AnyView lifetime: Fixed render_emojis to use owned strings
- Missing html import in message_feed.rs
- use_messages: Removed #[component] to make it a regular function
- MessageRecord fields: Removed is_reply, is_forward, is_crosspost checks
- String wrapping in view! macros: Wrapped strings in <span> elements
- Closure handling: Changed .into_forget() to .forget() for web_sys Closure
- URL borrowing in image_grid: Clone URLs before using in view!

Remaining issues (in progress):
- String references in class attributes need owned values
- Type inference for None.into_any()
- Closure capture issues with on_load_more
- Match arm type incompatibilities

19 errors remaining out of 31 initial errors - ~61% fixed
2026-07-03 20:32:15 +07:00
asepharyana 9322434daa feat(leptos): messages module skeleton + use_messages hook 2026-07-03 20:14:59 +07:00
asepharyana 1b970a4c51 fix(leptos): wire format corrections from whole-branch review 2026-07-03 18:43:25 +07:00
asepharyana bf36bf55fe feat(leptos): integrate auth with API + WS auth gating 2026-07-03 18:30:41 +07:00
asepharyana 2520faad47 feat(leptos): app shell with auth gate and tab routing 2026-07-03 18:22:28 +07:00
asepharyana 5389c82f31 feat(leptos): layout components -- Header, Sidebar, TabStrip, MobileTabBar 2026-07-03 18:16:08 +07:00
asepharyana aa20d1a633 feat(leptos): API client with all endpoint functions 2026-07-03 18:09:30 +07:00
asepharyana 20ef844682 feat(leptos): WebSocket singleton with event dispatch 2026-07-03 18:07:01 +07:00
asepharyana 5832ca7cd4 feat(leptos): UI primitives — Skeleton, StatusBadge, EmptyState, Modal 2026-07-03 17:59:38 +07:00
asepharyana b9e3a255bb feat(leptos): UI primitives — Input, Select, Tabs, ScrollArea, Toast 2026-07-03 17:47:21 +07:00
asepharyana 2b514142e6 feat(leptos): UI primitives — Button, Badge, Card 2026-07-03 17:41:07 +07:00
asepharyana 65804acaca feat(leptos): css design system with component classes and animations 2026-07-03 17:36:28 +07:00
asepharyana c4c43ce912 feat(leptos): frontend crate scaffold with empty app
- frontend/ crate compiles to WASM via trunk
- empty Leptos app mounted to body via wasm_bindgen(start)
- dependencies: leptos 0.7 CSR, leptos-use, lucide-leptos, gloo-net, web-sys
- workspace cargo check passes (first time the workspace compiles end-to-end)
- trunk build produces 65KB WASM + 25KB JS glue

Deviations from brief:
- lucide-leptos: 0.5 (brief) -> 3 (only version published)
- web-sys: removed invalid features ArrayBuffer/DataView (in js-sys/wasm-bindgen)
- src/main.rs -> src/lib.rs with #[wasm_bindgen(start)] to avoid bin/lib duplicate artifact
2026-07-03 17:09:44 +07:00
asepharyana f67bc5125b fix(leptos): correct shared-types timestamps to match JSON wire format 2026-07-03 07:24:28 +07:00
asepharyana 7b746350ca chore: ignore worktrees directory 2026-07-03 06:48:30 +07:00
asepharyana 7f6063909d docs: implementation plan for leptos rewrite phase 1 & 2 2026-07-03 06:38:39 +07:00
asepharyana 4fb59cda95 docs: leptos frontend rewrite design spec 2026-07-03 06:07:12 +07:00
asepharyana 0926f235cb fix(auth): only reset activeTab on mount, don't block tab switching
Previous code continuously forced activeTab to 'messages' when not
authenticated, making dashboard and voice tabs unclickable.
Now uses useEffect once on mount to reset localStorage carryover,
then lets tab switching work normally.
2026-07-02 07:45:02 +07:00
asepharyana 948e41cec6 fix(ui): chat bubble max-w-xs broken by tailwind spacing override (4px not 320px)
tailwind.config.js overrides spacing.xs to 4px, which also overrides
max-w-xs to max-width: 4px instead of the default 20rem (320px).
Changed to explicit max-w-[280px] to bypass the corrupted token.
2026-07-02 07:08:58 +07:00
asepharyana 77812f9452 fix(auth): force activeTab to messages if not authenticated — prevent localStorage carryover
When a user visited the Live tab in a previous session, localStorage
stored activeTab: 'live'. On page reload, even with the new auth guard,
the app would try to render the Live tab and show the auth overlay.
Now if not authenticated, activeTab is always forced to 'messages'.
2026-07-02 07:06:33 +07:00
asepharyana 58de0df24b fix(ui): chat bubble text wrapping — replace break-words with overflow-wrap:anywhere
Fixes MascotChatbot messages wrapping 1 character per line.
overflow-wrap:anywhere handles long unbroken strings better
than break-words which only breaks at word boundaries.
2026-07-02 06:53:27 +07:00
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
asepharyanaandworkflow 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