asepharyana
9c25e0887c
feat(frontend): add tactical HUD header and GSAP speaking-pulse loop to voice route
2026-08-25 23:23:19 +07:00
asepharyana
2aa12b9ec5
feat(frontend): revamp channels into signal-map roster with GSAP stagger
2026-08-25 23:17:39 +07:00
asepharyana
cab451f0e5
feat(frontend): revamp media frequency deck with GSAP animations and tactical visualizer
2026-08-25 23:05:05 +07:00
asepharyana
183a51003a
feat(frontend): revamp dashboard into tactical HUD and integrate GSAP reactive stages
2026-08-25 22:59:29 +07:00
asepharyana
2c30140ddd
feat(frontend): migrate animations to GSAP and update client socket types for Next 16.3
2026-08-25 22:47:25 +07:00
asepharyana
7e92de63d6
feat(frontend): migrate animations to GSAP and add useGSAP lifecycle hooks
2026-08-25 22:41:41 +07:00
dependabot[bot]
d64c5ba7b6
build(deps-dev): bump @types/three in /services/frontend
...
Bumps [@types/three](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/three ) from 0.180.0 to 0.185.4.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases )
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/three )
---
updated-dependencies:
- dependency-name: "@types/three"
dependency-version: 0.185.4
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
2026-08-25 14:25:57 +00:00
dependabot[bot]
8dbcc2b527
build(deps-dev): bump typescript in /services/frontend
...
Bumps [typescript](https://github.com/microsoft/TypeScript ) from 5.9.3 to 7.0.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases )
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.3...v7.0.2 )
---
updated-dependencies:
- dependency-name: typescript
dependency-version: 7.0.2
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com >
2026-08-25 11:32:04 +00:00
mytheclipsebotreview[bot]
53c4158511
Auto-merge PR #10
...
build(deps-dev): bump @types/node from 20.19.43 to 26.2.0 in /services/frontend
2026-08-25 11:29:43 +00:00
dependabot[bot]
173ae3c61c
build(deps-dev): bump @types/node in /services/frontend
...
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node ) from 20.19.43 to 26.2.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases )
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node )
---
updated-dependencies:
- dependency-name: "@types/node"
dependency-version: 26.2.0
dependency-type: direct:development
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com >
2026-08-25 11:23:30 +00:00
dependabot[bot]
2637bbc549
build(deps-dev): bump @biomejs/biome in /services/frontend
...
Bumps [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome ) from 2.2.0 to 2.5.10.
- [Release notes](https://github.com/biomejs/biome/releases )
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md )
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.5.10/packages/@biomejs/biome )
---
updated-dependencies:
- dependency-name: "@biomejs/biome"
dependency-version: 2.5.10
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
2026-08-25 11:23:19 +00:00
mytheclipsebotreview[bot]
f2ec642a0e
Auto-merge PR #12
...
build(deps-dev): bump puppeteer-core from 25.7.0 to 25.8.0 in /services/frontend
2026-08-25 11:21:41 +00:00
dependabot[bot]
9c48d50d25
build(deps-dev): bump puppeteer-core in /services/frontend
...
Bumps [puppeteer-core](https://github.com/puppeteer/puppeteer ) from 25.7.0 to 25.8.0.
- [Release notes](https://github.com/puppeteer/puppeteer/releases )
- [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md )
- [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-core-v25.7.0...puppeteer-core-v25.8.0 )
---
updated-dependencies:
- dependency-name: puppeteer-core
dependency-version: 25.8.0
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com >
2026-08-25 11:15:28 +00:00
dependabot[bot]
8bd3ec8e83
build(deps): bump the production group
...
Bumps the production group in /services/frontend with 7 updates:
| Package | From | To |
| --- | --- | --- |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react ) | `1.28.0` | `1.33.0` |
| [motion](https://github.com/motiondivision/motion ) | `12.43.0` | `13.1.1` |
| [next](https://github.com/vercel/next.js ) | `16.2.12` | `16.3.2` |
| [react](https://github.com/react/react/tree/HEAD/packages/react ) | `19.2.4` | `19.2.8` |
| [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom ) | `19.2.4` | `19.2.8` |
| [swr](https://github.com/vercel/swr ) | `2.4.2` | `2.5.1` |
| [three](https://github.com/mrdoob/three.js ) | `0.180.0` | `0.185.1` |
Updates `lucide-react` from 1.28.0 to 1.33.0
- [Release notes](https://github.com/lucide-icons/lucide/releases )
- [Commits](https://github.com/lucide-icons/lucide/commits/1.33.0/packages/lucide-react )
Updates `motion` from 12.43.0 to 13.1.1
- [Changelog](https://github.com/motiondivision/motion/blob/main/CHANGELOG.md )
- [Commits](https://github.com/motiondivision/motion/compare/v12.43.0...v13.1.1 )
Updates `next` from 16.2.12 to 16.3.2
- [Release notes](https://github.com/vercel/next.js/releases )
- [Commits](https://github.com/vercel/next.js/compare/v16.2.12...v16.3.2 )
Updates `react` from 19.2.4 to 19.2.8
- [Release notes](https://github.com/react/react/releases )
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md )
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react )
Updates `react-dom` from 19.2.4 to 19.2.8
- [Release notes](https://github.com/react/react/releases )
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md )
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react-dom )
Updates `swr` from 2.4.2 to 2.5.1
- [Release notes](https://github.com/vercel/swr/releases )
- [Commits](https://github.com/vercel/swr/compare/v2.4.2...v2.5.1 )
Updates `three` from 0.180.0 to 0.185.1
- [Release notes](https://github.com/mrdoob/three.js/releases )
- [Commits](https://github.com/mrdoob/three.js/commits )
---
updated-dependencies:
- dependency-name: lucide-react
dependency-version: 1.33.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production
- dependency-name: motion
dependency-version: 13.1.1
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: production
- dependency-name: next
dependency-version: 16.3.2
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production
- dependency-name: react
dependency-version: 19.2.8
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production
- dependency-name: react-dom
dependency-version: 19.2.8
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: production
- dependency-name: swr
dependency-version: 2.5.1
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production
- dependency-name: three
dependency-version: 0.185.1
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: production
...
Signed-off-by: dependabot[bot] <support@github.com >
2026-08-25 11:15:04 +00:00
asepharyana
31e303c187
feat(fe): optimize error handling, state consistency, and WS feedback
...
- Add global SWR config with exponential backoff retry (swr-config.ts)
- Add ErrorBoundary component for React crash recovery (error-boundary.tsx)
- Standardize ErrorState onRetry on all 6 dashboard views (dashboard, media,
messages, moderation, recordings, voice)
- Fix useAction: expose resetError + onError callback
- Refactor useSpeakers to SWR-backed state (was local useState) for
consistent cache/revalidate semantics with other hooks
- Remove polling in useReview (15s refreshInterval); replace with
useReviewWsSync subscribing to WS moderation_action events
- Extract hashUserId to lib/hash.ts (de-dup with ambient-canvas)
- WS context: add reconnect/error toast feedback via onStatusChange
- WS connection: expose reconnectAttemptCount getter
All typecheck + lint clean, Next 16 build passes.
2026-08-25 13:46:15 +07:00
asepharyana
440ec41da8
polish(frontend): perkuat bracket & marker segitiga game-menu (nudge anim)
2026-08-24 17:52:50 +07:00
asepharyana
1c8c0ca081
fix(frontend): normalisasi trailing slash pada isActivePath agar nav aktif terdeteksi
2026-08-24 17:44:42 +07:00
asepharyana
5f42c17caa
feat(frontend): tema monokrom + sidebar animasi game-menu + gate ringan mobile
2026-08-24 17:35:51 +07:00
asepharyana
eda5c752b7
revert(frontend): kembalikan shell usable — hapus total eksperimen constellation (three/d3-force dihapus)
2026-08-24 16:32:16 +07:00
asepharyana
25d5097edb
fix(frontend): definite-height overlay chain so absolute panels anchor to viewport
2026-08-24 16:15:55 +07:00
asepharyana
d3e3b4764a
fix(frontend): let empty overlay areas click through to the constellation sky
2026-08-24 16:02:57 +07:00
asepharyana
33a557c761
fix(frontend): soften constellation glow for light theme
2026-08-24 15:48:15 +07:00
asepharyana
32de2819df
feat(frontend): a11y constellation mirror — sr/keyboard-accessible node list
2026-08-24 15:47:19 +07:00
asepharyana
a21d252e9b
feat(frontend): eased camera fly-to on scene transitions (reduced-motion aware)
2026-08-24 15:46:08 +07:00
asepharyana
84a766db0c
feat(frontend): voice stage-orbit, media queue-spiral & recordings timeline-ring scenes
2026-08-24 15:44:10 +07:00
asepharyana
0581dc3485
feat(frontend): messages orbital-belt & moderation verdict-hub scenes
2026-08-24 15:35:51 +07:00
asepharyana
3d6c07bd91
feat(frontend): glossary satellite ring + analysis search console scenes
2026-08-24 15:29:21 +07:00
asepharyana
60ae1fb5c3
feat(frontend): dashboard & channels constellation scenes — publish bridge + floating overlays
2026-08-24 15:22:27 +07:00
asepharyana
1fafebb16d
refactor(frontend): remove classic dashboard chrome (topbar/navrail/mobilenav)
2026-08-24 15:07:40 +07:00
asepharyana
a9e09c38e9
feat(frontend): constellation stage + floating chrome replace classic shell
2026-08-24 15:04:31 +07:00
asepharyana
3d4236e8df
feat(frontend): constellation lib scaffold — graph/layout/camera pure modules (tested)
2026-08-24 14:46:38 +07:00
asepharyana
81ce5188ea
fix(frontend): pindah aria-label mic meter ke wrapper role=status
2026-08-22 12:55:52 +07:00
asepharyana
4e0c21d86c
feat(frontend): perbagus voice & audio playback UX
...
- Recordings: custom RecordingAudioPlayer (play/pause, buffering spinner,
click-to-seek, time label, eq bars, single-playback antar kartu) +
highlight kartu now-playing
- Media: thumbnail di disc hero + queue row, equalizer saat playing,
badge 'up next', label Paused vs Now playing
- MiniPlayer global di AppFrame (fixed bottom-right, hidden on /media)
menggantikan use-media-player.tsx dead provider (dihapus)
- Voice: mic level meter live (AnalyserNode RMS) + slider mic/listen volume
2026-08-22 12:53:18 +07:00
asepharyana
eee332412f
chore: hapus fitur materi (learning materials + RAG chat)
...
Hapus fitur materi seluruhnya dari GMW monorepo:
Backend:
- Hapus module materi/ (index.ts, materi.repository.ts, materi.schema.ts,
materi.service.ts, ragClient.ts)
- Hapus materiRouter dari orpc/router.ts (imports, const, appRouter entry)
- Hapus pgMateriDocumentsTable + types dari shared/database/schema.ts
Frontend:
- Hapus route pages app/(dashboard)/materi/ (page, [id], chat, new)
- Hapus lib/api/materi.ts (oRPC client wrappers)
- Hapus lib/types/materi.ts + export dari index.ts
- Hapus nav item "Materi" dari lib/navigation.ts + unused BookOpen import
Scripts:
- Hapus scripts/add-materi-documents.sql
- Tambah scripts/drop-materi-documents.sql (ops DB cleanup)
Verification:
- Backend: npx tsc --noEmit — clean (exit 0)
- Frontend: npx tsc --noEmit — clean (exit 0)
- Grep: zero materi code references remaining (hanya di drop-materi-documents.sql)
RAG dependencies (messages/embed.ts, messages/qdrant.ts) tetap karena juga
dipakai oleh messages.service.ts.
2026-08-20 22:50:11 +07:00
mytheclipsebotreview
7f4196124d
fix(ci): lint and a11y fixes unblocks GHA deploy
...
- materi/new/page.tsx: add htmlFor+id pairs for all 5 form labels (a11y)
- biome --write --unsafe: fix useTemplate, useLiteralKeys, import sort
across materi module files (backend + frontend)
- These pre-existing lint errors from 0aa893a blocked the deploy pipeline
2026-08-20 18:45:09 +07:00
mytheclipsebotreview
5658726ea5
fix(frontend): sort messages by created_at to fix WS race condition
...
Two independent WS handlers (useMessagesWsSync for message_created/
updated/analyzed, and useMessagesStream for message_snapshot) both
prepend live messages to the SWR list without enforcing order.
When frames arrive out-of-order (common with batched WS delivery),
the message feed gets scrambled.
Fix: add sortMessages() helper that sorts newest-first by created_at
(the list's stored order before .reverse() for display) and apply it
in every patchLists/mutate updater: message_created, message_updated,
message_analyzed, message_snapshot, and useLoadMore page appends.
Function declaration is hoisted so useLoadMore (defined above the
helper) can use it.
2026-08-20 18:16:43 +07:00
asepharyana
0aa893ab7d
feat: add Materi section + AI agent RAG to GMW business flow
...
Backend:
- New materi module: schema (materi_documents table), repository, service
- ragClient: semantic + keyword search over materi docs, plus Discord
archive via Qdrant, then LLM answer generation (RAG)
- Wire materiRouter into appRouter (list/detail/create/update/delete/chat)
Frontend:
- New types (MateriDocument, CreateMateriInput, RAG chat shapes)
- API client (SSR HTTP RPCLink + browser WS RPCLink)
- Routes: /materi list, /materi/[id] detail, /materi/new form,
/materi/chat RAG chat UI
- Sidebar nav item 'Materi'
Migration: scripts/add-materi-documents.sql (CREATE TABLE IF NOT EXISTS)
2026-08-20 15:57:04 +07:00
asepharyana
00e8d68ce5
feat(gmw): public features #7-14 — scam domains, top channels, hourly heatmap, category drill-down, coverage stats, channel culture glossary, term KB, edit history
...
ALSO fixes: dashboard.repository still JOINed dropped user_reputations table (listUsers/getUserDetail crash).
2026-08-18 20:45:12 +07:00
asepharyana
9b3134d767
feat(gmw): public features #2-#6 — live moderation feed, toxic topic trends, channel timeline, CSV export, activity heatmap
...
- Live Moderation Feed: gateway publishes discord:moderation:action (Redis) → backend WS emits moderation_action → public web shows realtime stream.
- Toxic Topic Trends: backend moderation.trends aggregates categories/severity/action_type (read-only) → SVG bar + donut.
- Channel Timeline: messages view gets Feed/Timeline toggle with date-grouped separators.
- CSV Export: client-side downloadCsv for moderation actions (no backend write scope).
- Activity Heatmap: backend messages.activity (per-hour volume by channel) → pure-SVG grid.
User reputation deliberately excluded — no such feature exists in the codebase.
All read-only / public-facing / fully automatic per project rules.
2026-08-18 17:43:02 +07:00
asepharyana
1ae19074ee
feat(gmw): moderation explainability + semantic message search
...
- Persist structured verdict (flags/severity/confidence/evidence) on
moderation_actions so the public web can show WHY a message was moderated.
- Add a persistent Qdrant archive collection (gmw_message_archive); embed
every captured message at capture time (fire-and-forget, best-effort).
- Public semantic search over the archive (backend oRPC + FE toggle on the
messages view). Both features are read-only/public and fully automatic.
Migration: 0015_add_moderation_explainability.sql
2026-08-18 15:11:01 +07:00
asepharyana
217ecc1aa1
feat(frontend): content micro-animations — stagger, button press, toast polish
...
- animate-stagger utility + staggerDelay() helper; lists now rise in sequence
(recordings grid, moderation rows, message list, media queue, dashboard tiles).
- Button gets a subtle active:scale-[0.97] press feedback.
- Toaster: toast-in slide-up, tone-accent border, rounded hover-close target.
- All motion is reduced-motion aware (killed under prefers-reduced-motion).
2026-08-18 11:01:00 +07:00
asepharyana
0cb0b82fb1
feat(messages): stream history one-message-per-WS-frame instead of 50-row batch
...
- backend: add streamMany generator (paginated, yields one record at a time)
+ messagesService.streamMessages + WS 'stream_messages' handler emitting
'message_snapshot' per message, 'message_snapshot_end' with nextCursor
- frontend: useMessagesStream hook accumulates snapshots into SWR list,
SSR getMessages seeds first paint, WsHook gains sendText
- add stream-many.test.ts locking the one-at-a-time + cursor contract
2026-08-18 10:21:08 +07:00
asepharyana
95f2903067
feat(frontend): micro-interactions — page-enter transition + MetricTile lift
...
- Add animate-fade-up utility (reduced-motion aware) and a PageTransition
wrapper; every dashboard view now rises + settles on mount/route change.
- MetricTile gains a subtle hover lift (-translate-y) + ring-focus glow.
- Theme toggle and command palette (⌘K) already existed and persist; no-op.
2026-08-18 09:50:52 +07:00
asepharyana
d78d7a0181
feat(frontend): skeleton loading states, empty-state glow, light-mode polish
...
- Add shared skeleton building blocks (SkeletonHero, SkeletonMetricRow,
SkeletonPanel, SkeletonRows) and wire them into every view's initial
loading branch, replacing bare spinners for a cohesive shimmering shell.
- Polish EmptyState with a glow-ring icon chip instead of a flat icon.
- Harden .light theme: color-scheme, tuned scrollbar + selection for pale
canvas. Dark/light theme toggle (next-themes) already persisted in TopBar.
2026-08-18 09:21:12 +07:00
asepharyana
ff8a9c50ae
feat(frontend): polish remaining views + centralize time/status helpers
...
- Add formatDuration + formatRelativeTime to lib/format.ts and aiTone to
lib/ai-status.ts; dedupe duplicated helpers in messages/analysis views.
- Recordings: upload-status badge (pending/processing/failed), channel chip,
relative time, hover lift, surface upload errors.
- Media: mode pill + duration on now-playing, volume meter, per-track duration
and queue total in header.
- Moderation: relative timestamps in action rows + executor hint.
- Analysis & Dashboard: rank bars for top reactors for scannable comparison.
2026-08-18 09:05:12 +07:00
asepharyana
6bd6ddcdca
feat(frontend): mobile bottom nav, chatbot overhaul, responsive polish
...
- MobileNav: safe-area-aware bottom tab bar (< md), mirrors desktop nav
- Chatbot: timestamps, per-message copy, retry-on-fail, auto-grow composer,
MarkdownLite (XSS-safe React nodes, no dangerouslySetInnerHTML)
- AppFrame: NavRail (md+) + MobileNav (< md) + bottom content padding
- Design system: SignalTone ambient (signal/amber/vermilion) driving WebGL
haze + topbar status pill; SectionHeader/MetricTile; globals.css tokens
- Views: dashboard hero + AmbientField, analysis/media responsive grids
2026-08-17 21:29:37 +07:00
asepharyana
e3dd6a3427
fix(messages): Discord-style order (oldest top, newest bottom)
...
Backend returns messages DESC (newest first); the view previously rendered
that directly, so the feed was inverted vs Discord (old at bottom, new at top)
while the load-older control sat at the top — contradictory.
- Reverse the display list so it reads oldest→newest top→bottom, like DC.
- Load-older (cursor to lower created_at) prepends at the top; scroll position
is preserved by offsetting scrollTop by the height added above.
- Open at the bottom (newest visible) on first load / scope change.
- New live messages append at the bottom and auto-scroll only when the user is
already near the bottom (nearBottomRef), so reading history isn't disrupted.
- Scroll container now tracked via ref; onScroll updates nearBottom + triggers
load-older when scrolled to the top.
tsc, biome, next build all clean.
2026-08-16 17:56:39 +07:00
asepharyana
0ace758c79
feat(frontend): safe-area insets + hardened reduced-motion
...
- Add viewport export with viewportFit: "cover" so iOS exposes
env(safe-area-inset-*) (required for the insets to take effect).
- NavRail / TopBar / main / Toaster now respect safe-area insets so content
clears the iPhone notch and home indicator in both portrait and landscape.
- prefers-reduced-motion: the media query already disabled declared animation
classes; harden it with a global transition/animation duration override and
kill the scan-line shimmer so motion-sensitive users get a fully static UI.
Verified tsc --noEmit + next build clean.
2026-08-16 16:55:34 +07:00
asepharyana
c89288191e
fix(frontend): responsive layout across all dashboard pages
...
- SectionHeader: action (filters/legends) now wraps below the title on narrow
screens instead of overflowing beside it (flex-wrap, gap-2 sm:gap-3).
- GuildChannelPicker: selects go full-width and stack on mobile (w-full
sm:w-44 / sm:w-52) instead of fixed widths that exceeded a 375px viewport.
- Messages search: w-full sm:w-64 so it doesn't crowd the picker on mobile.
- TopBar: tighter padding (px-4 sm:px-5), smaller title on mobile, connection
status uses compact (dot only) on mobile, ambient pill hidden < sm.
- Shell main + dashboard channel label: responsive padding / shrink-0 widths.
Verified tsc --noEmit + next build clean; targets breakpoints 375/768/1024/1440.
2026-08-16 16:36:34 +07:00
asepharyana
4655125541
feat(frontend): clearer load-older spinner + cap history pages (Messages)
...
- Show an explicit Loader2 spinner row ("Loading older…") while the next page
fetches, instead of a disabled button.
- Cap appended older pages at MAX_OLDER_PAGES=10 (500 messages) so a long
scroll-up never pulls the entire history; show a "capped" hint pointing to
search. Reset the counter when guild/channel changes.
2026-08-16 16:21:10 +07:00