chore(web-deps): bump @types/node from 25.9.3 to 26.0.0 in /web#53
Open
dependabot[bot] wants to merge 238 commits into
Open
chore(web-deps): bump @types/node from 25.9.3 to 26.0.0 in /web#53dependabot[bot] wants to merge 238 commits into
dependabot[bot] wants to merge 238 commits into
Conversation
AI ops hardening + auto-update + admin moderation + GDPR delete
CI on master has been red since the web client + emoticongen work landed
because half of the files those features depend on were never staged.
Local builds passed only because the files lived on developer disks.
Brings into git:
- web/ infrastructure that npm needs at all:
package.json, package-lock.json, tsconfig*.json, index.html, vite/
eslint/vitest configs, .env.example, .gitignore, README, public/*,
src/main.tsx, src/index.css, src/assets/hero.png, plus the
e2ee.{ts,test.ts} + keyPins.ts + nexusTypes.ts modules that App.tsx
imports.
- native_client/internal/ui/emoticon_tokens.go — defines
EmoticonFileForShortcut which emoticons.go has been calling since the
emoticon refactor.
- native_client/cmd/emoticongen — the spritesheet→PNGs tool that
populates the emoticons assets directory.
- native_client/third_party/anet/{android_api_level,interface_android,
netlink_android,android_api_level_cgo}.go — the Android-only network
enumeration shim the existing interface.go !android build references.
- native_client/internal/sentinel/stun_parse_test.go — covers the STUN
parser already in tracked code.
- scripts/install-android-ndk.sh — release.yml already invokes this.
- nexus_server/public/phaze/assets/{Icon,default_avatar,phaze_logo,
ui_master_spritesheet}.png + emoticons/*.png — every brand and
emoticon image the server (and emoticongen output) reference.
- nexus_server/assets/* + docker-compose.yml — dev assets.
- docs/{DEPLOY_SELF_HOSTED,LINUX_DISTRIBUTION,MOBILE_BUILDS}.md and
local.mk.example — docs referenced by docs/index.html + Makefile.
Local: nexus 15/15, native 19/19, web 4/4 all green from a clean
checkout (rm -rf node_modules dist → npm ci → npm run build → tests).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ESLint's no-use-before-define rejected the previous layout: the WS message handler (installed in useLayoutEffect at line ~123) referenced setRegStep / setMode / setDeleteOpen, but those useState declarations sat ~250 lines lower in the function body. Functionally fine — the handler closure resolves them at runtime — but lexically before-declare. Moves the auth/registration/delete-account useState block up alongside the other view-state setters so the handler can close over them legally. No behaviour change. Local: npm run build / lint / test all green. CI should be too. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…w a real login page Until now, the web client only existed as a local dev app. phazechat.world had no login UI at all; users had to download a desktop/Android binary. This wires up: - fly.toml moved to repo root so the Docker build context includes web/. dockerfile path now "nexus_server/Dockerfile". Existing fly secrets unchanged; next `fly deploy` from repo root. - Multi-stage Dockerfile: adds a node:22-alpine stage that runs `npm ci && npm run build` over web/, copies the resulting dist into /app/web in the runtime image. Go stage paths adjusted for the new repo-root build context. - nexus_server/main.go: registers /web/ → static FileServer from $PHAZE_WEB_DIR (default "web", set to /app/web in the runtime image), with SPA fallback (any unknown sub-path serves index.html) and an immutable-cache header for /web/assets/*. Bare /web 302→/web/. Logs which directory it picked at boot. - web/vite.config.ts: sets `base: '/web/'` so absolute asset URLs in the built index.html resolve correctly under the SPA mount. Overridable via VITE_BASE for separate-host deploys (GitHub Pages, etc.). - landing.html: header nav gains a "Sign in" link + "Open Phaze Web" CTA; hero adds an "Open Phaze Web" button alongside the existing download. Smoke-tested locally (server bound to a temp port, no Docker): - GET /web/ → 200, serves built index.html - GET /web/favicon.svg → 200, image/svg+xml - GET /web/assets/index-*.js → 200, cache-control immutable - GET /web/assets/index-*.css → 200 - GET /web/some/spa/route → 200, SPA fallback to index.html - GET /web → 302 → /web/ Once `fly deploy` runs, phazechat.world/web is the React login form (with the registration flow + delete-account UI from earlier commits). Existing /, /download, /api/v1/*, /ws routes unchanged. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… glass-aesthetic web UI
This is the foundation for community chat: servers (called "Spaces" in
product copy) own a set of channels, members join via invite code,
channel messages broadcast to every online member of the server. Layered
underneath the existing 1:1 / convo flows — they coexist; users toggle
between "Chats" and "Spaces" in the header.
Server (nexus_server/main.go):
- New tables: servers, channels, server_members, channel_messages, with
indexes on (server_id, position), (channel_id, id), and (username).
- Channel-level chat history is server-side plaintext, NOT E2EE. Same
tradeoff Discord/Telegram/Slack make so search, moderation, and join
history work. Private-server E2EE channels are a future feature.
- NexusMessage gains: server_id, channel_id, server_name, channel_name,
topic, kind, role, visibility, invite_code, servers[], channels[],
messages[]. New typed payloads ServerSummary, ChannelInfo, ChannelMsg.
- WS message types:
server_create → creates a server + #general + #random, owner role
server_list → user's joined servers (with role per server)
server_join → join by invite code (validates code, idempotent)
server_leave → leave (owners refused; must delete or transfer)
server_info → channels + members for a server
channel_create → owner/admin only, name regex ^[a-z0-9][a-z0-9-_]{1,31}$
channel_msg → membership-gated, 1-8000 char body, broadcasts to
every online server member as channel_msg_in
channel_history → 50-message page, cursored via history_from
Plus server-push: channel_msg_in, server_channels_updated.
- All paths are membership-gated. Non-members can't post (covered in
TestSmoke_ServersAndChannels). Owner-only / admin-only paths checked.
Web client (web/):
- web/src/Spaces.tsx: new component. Three-pane layout (server rail /
channel list / chat stream). State: servers, channels-by-server,
messages-by-channel, active selection, composer drafts. Auto-loads
history on channel switch; auto-scrolls on new message. Modals for
create-space (name + visibility radio) and join-by-invite. Inline
add-channel for admins. Copy-invite-to-clipboard. Toast stack.
- web/src/spaces.css: Aero/glass aesthetic — backdrop-filter blur on
the rail, channel pane, chat stream; layered shadows + inset highlights;
cyan-to-deep-blue gradients on accents; spring-eased transitions; real
light + dark via prefers-color-scheme; responsive collapse <820px.
- web/src/App.tsx: top-level view toggle (Chats | Spaces). Lightweight
subscriber bus so child surfaces can observe inbound NexusMessages
without us hard-coding every new feature into the App reducer.
- web/src/nexusTypes.ts: typed ServerSummary, ChannelInfo, ChannelMsg.
Test: TestSmoke_ServersAndChannels covers create → list → invite-join →
list (other user) → channel message broadcast (both clients see it) →
history fetch → non-member rejection → leave → owner-can't-leave. 15
nexus tests pass.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…sn't baked into prod bundle
…h triage to Gemini
…d change_password WS handler
…s panel extraction
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…on management - Web push: VAPID keys, service worker, push_subscriptions table, send push on offline msg - Email invite: invite_email WS handler, email with join link, invite_codes table - GDPR export: /api/v1/export endpoint returns profile/friends/messages as JSON download - VAPID public key endpoint: /api/v1/vapid-key for frontend subscription - Session management: list_sessions + revoke_session_by_token WS handlers - Settings: Sessions tab (list + revoke), Privacy tab gains invite form, Danger tab gains export button - App: registers push subscription after login, auto-switches to register mode on ?invite= URL param Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Firebase project: phazechat-world, Android app ID: com.phazechat.app - FCM service account initialized from FCM_SERVICE_ACCOUNT_JSON env var - register_fcm_token WS handler: Android app sends token after login - sendFCMPush fires on every offline message (alongside existing VAPID web push) - fcm_token column added to users table via migration - google-services.json saved for Android build Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PhazeFCMService.java: onNewToken writes token to files/phaze_fcm_token, onMessageReceived shows high-priority notification when app is in background/killed - AndroidManifest.xml: POST_NOTIFICATIONS permission + service declaration - android/build.gradle: firebase-bom 33.7 + firebase-messaging + androidx.core - android/project.gradle: google-services plugin classpath - fcm_android.go (+stub): readFCMToken() reads token file on Android - native_client/main.go: calls register_fcm_token after successful auth Build with: make android (requires ANDROID_HOME + NDK) Package name: world.phazechat.app Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Force-add production APK to build context for Dockerfile COPY. Firebase project: phazechat-world Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Big landing-impact push across the whole stack: Web client - Linear/Arc-style minimalist redesign: Inter + JetBrains Mono, indigo→violet brand (#863bff), 10-14px corner radii, hairline separators, no gradients - Voice messages (MediaRecorder → /api/v1/upload → inline audio bubble) - Cross-device encrypted history (dm_messages table + dm_reactions) - Recovery PIN multi-device key backup (PBKDF2 + AES-GCM in WebCrypto) - Reactions, edits, deletes, @mentions, pins, in-chat search - ⌘K command palette, slash commands, smarter friend list, empty states - Sentry @sentry/react with WS-payload scrubbing - Mascot logo "Echo" — favicon.svg + PNG rasters at 16-1024 Nexus server - Encrypted history relay (msg/edit/delete/react persistence + dm_history) - /api/v1/upload (25MB, allowlisted, opaque random filenames) - /api/v1/admin/pending-verifications (SMTP rescue path) - TURN auto-fallback (openrelay.metered.ca) when self-hosted TURN unset - Sentry getsentry/sentry-go integration - /health enriched with turn/smtp/webpush/fcm/sentry/litestream flags Native client (Fyne) - Phaze7Theme rewritten with variant-aware light/dark Color() - Brand palette aligned to web tokens - Flat solid bubbles (CornerRadius=14), no gradients - Register dialog now actually shows email + mood fields (was a layout bug) - localhost fallbacks purged; sanitizer rewrites stale saved server on boot - Desktop OS notifications fire on every incoming DM - Sentry SDK wired Brand + copy - Slogan: "Stay in phase." (replaces Tazher-era line) - Public templates rewritten to claim only real features (no PSTN credit lies) - docs/index.html (GitHub Pages) realigned to new brand - .gitignore: whitelist native_client/assets/Icon.png so fyne-cross CI builds
- fyne-cross Docker images carry Go 1.24.6 but go.mod requires 1.25; GOTOOLCHAIN=auto lets the container fetch the right Go on demand - macOS GitHub runners don't ship Docker, so use `fyne package -os darwin` directly — the toolchain is native there anyway
The fyne-cross Docker images don't ship libvpx/libasound; pion/mediadevices needs vpx and beep needs alsa, so both Linux + macOS jobs were failing on "Package 'vpx' not found." New approach mirrors release.yml — install deps via apt on ubuntu-latest: - linux : native fyne package (libvpx-dev, libasound2-dev) - windows: mingw-w64 cross compile (gcc-mingw-w64-x86-64) - android: fyne-cross android (its image has the needed bits) - macos : native fyne package on macos-latest (brew install libvpx) - ios : dropped (Apple Dev Program required for signing)
Builds linux/amd64 + linux/arm64 multi-arch image from nexus_server/Dockerfile
and pushes to ghcr.io/jakes1345/skype7-reborn-nexus on every master push
and version tag. Self-hosters can now:
docker run -p 8080:8080 -v nexus_data:/data \
ghcr.io/jakes1345/skype7-reborn-nexus:latest
Pion's mediadevices/pkg/codec/vpx requires the vpx C headers at build time. When cross-compiling for Windows via mingw on a Linux runner the Linux libvpx-dev headers aren't visible to the Windows compiler, so the build fails with 'vpx/vpx_encoder.h: No such file'. Reuse the existing Android no-vpx stub by extending its build tag to cover Windows. Windows users lose VP8 send-side video encoding (same trade-off Android already has) but voice + text + receive-side video keep working. Linux + macOS desktop still get full VP8. Companion build-clients.yml rewrite already added libvpx/asound apt deps for the Linux native job — this just unblocks the Windows step.
- Switch email path to Brevo /v3/smtp/email when BREVO_API_KEY set; SMTP remains as fallback. /health now reports brevo_configured. - Resolve App.tsx lint errors blocking Phaze CI: indirect ingestDMHistory via ref to avoid TDZ; suppress setUnread-in-effect false positive. - Add g++-mingw-w64-x86-64 to Windows cross-build apt deps so pion/mediadevices C++ sources link. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Switch entrypoint + litestream.yml to read Fly Tigris env vars (BUCKET_NAME, AWS_ENDPOINT_URL_S3, AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY). LITESTREAM_* still honored for self-hosters. - /health reports litestream_configured when either var set. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…reen share Native client: - Sign-in window now swaps to registration view in-place instead of spawning a new OS window. Back button restores login form. - Embed Icon.png via go:embed so the app icon shows even when the binary runs outside the .vault-packaged distribution. Web client: - Render uploaded videos inline with <video controls>. - Add screen share button to active video call: getDisplayMedia, replaceTrack on the video sender, swap back to camera on Stop. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Server: - Track in-memory VoiceRooms map of channel_id → set of usernames. - Handle voice_join / voice_leave / voice_signal WS messages. - Relay signaling (offer/answer/ice) between peers in the same room. - Broadcast voice_peers to all participants on join/leave. - Evict users from all voice rooms on disconnect. Web: - New VoiceRoom component: mesh of peer connections (one per other user), microphone capture, mute toggle, join/leave UX. - Lexicographically-smaller username initiates the offer to avoid double signaling. Drops PCs cleanly when a peer leaves or component unmounts. - Spaces routes voice-kind channels to VoiceRoom instead of chat composer. - TURN config plumbed from App.tsx through Spaces for relay fallback. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
VoiceRoom now offers "Join voice" (audio-only) and "Join with video" buttons. Adds in-room camera toggle (when joined with video). Each peer tile renders the remote <video> element when a video track is live; otherwise falls back to the avatar circle. State-driven track tracking keeps the React refs lint clean. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Server: stream_start/stop/list/join/leave/signal protocol with in-memory map of broadcaster -> viewer set. Pushes live-list updates to all clients on start/stop. Evicts streams + viewer entries on client disconnect. - Web: new Live tab with "Go Live" composer, grid of current broadcasters, broadcaster stage with viewer count, and viewer stage with the broadcaster's remote video. Mesh — broadcaster maintains one PC per viewer. Scales to ~10-15 viewers before uplink saturates; swap in an SFU when that becomes a real limit. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… secret, keystore secret, linux path)
…ernc/beeep/systray
…id/desktop clients
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.3 to 26.0.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.0.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
Contributor
Author
LabelsThe following labels could not be found: Please fix the above issues or remove invalid values from |
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ❌ Deployment failed View logs |
skype7-reborn | 272fb9c | Jun 22 2026, 03:26 AM |
Contributor
Author
|
A newer version of @types/node exists, but since this PR has been edited by someone other than Dependabot I haven't updated it. You'll get a PR for the updated version as normal once this PR is merged. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps @types/node from 25.9.3 to 26.0.0.
Commits
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)