Commit Graph

1990 Commits

Author SHA1 Message Date
Jeff Emmett f26661840f Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m19s Details
2026-04-16 17:00:50 -04:00
Jeff Emmett 68648608a9 test(rsocials): Playwright smoke suite + planner reliability fixes
Adds e2e/tests/rsocials-campaign-flow.spec.ts — 13 tests covering the
unified campaign flow UX: dashboard → planner navigation, brief canvas
node (+ preview banner), markdown import modal, wizard handoff, and
API shape. 36 passed / 3 AI-skipped across chromium/firefox/mobile.

Bug fixes uncovered by the suite:
- markDownstreamStale only redraws when a node actually flips stale,
  so typing in an input node no longer destroys the open inline-edit
  overlay.
- executeSave wraps the local-first write in try/catch and nulls the
  client on failure, so a half-initialised client (WS down, IDB
  unavailable) falls through to localStorage instead of throwing
  "Document not open".
- init-failure path also nulls the client so the first save after a
  failed subscribe doesn't hit a doc that was never opened.

Test infra:
- server/security.ts + server/index.ts honour DISABLE_RATE_LIMIT=1
  (and NODE_ENV=test) to bypass HTTP rate limiter and anon WS-per-IP
  cap so the suite can run under 8 parallel workers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 16:59:59 -04:00
Jeff Emmett eea5d9f4e3 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m24s Details
2026-04-16 16:58:03 -04:00
Jeff Emmett 317e7a5579 fix(deploy): track registry image + default rpast links to https
- docker-compose.yml: rspace service now uses
  localhost:3000/jeffemmett/rspace-online:${IMAGE_TAG:-latest} so
  CI's `docker pull ... && docker compose up -d --no-build` actually
  picks up the new image without a manual retag step.
- modules/rpast/mod.ts: base URL defaults to https for any non-loopback
  host, honoring x-forwarded-proto only when set to http|https. Fixes
  "Open in <rApp>" links previously emitted as http:// on CF/Traefik.
2026-04-16 16:58:01 -04:00
Jeff Emmett 2ca93caa7e Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m49s Details
2026-04-16 16:36:56 -04:00
Jeff Emmett 595188b9d8 chore(sw): bump cache version to v10 to purge stale rpast 404 shells
Users on an older SW built before rpast existed saw a cached
/rpast shell with an outdated module list (rmail/rfunds/rwork/...).
Bumping the cache version forces activation-time cleanup to drop
the old entries on next visit.
2026-04-16 16:36:54 -04:00
Jeff Emmett 98d6d22e55 ui(space-settings): Invite label + breathing room under username search
- Rename 'Add' to 'Invite' in the By-Username add-member row to match
  the By-Email path and reflect that it goes through an invite flow.
- Add 10px top margin to .add-member-row so the role dropdown and
  button don't visually collide with the search input/selected-user
  area above.
2026-04-16 16:36:52 -04:00
Jeff Emmett 8367b06df6 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m31s Details
2026-04-16 16:34:08 -04:00
Jeff Emmett 351565c934 fix(space-settings): refresh invitations tab after sending invite
Email-invite path previously only showed 'Invite sent' without
refreshing the list. Username-invite path reloaded members but not
invitations. Both now call #loadInvitations after a successful POST.
2026-04-16 16:34:05 -04:00
Jeff Emmett 99b423a76d Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m28s Details
2026-04-16 16:29:34 -04:00
Jeff Emmett f388812927 fix(spaces): show username instead of truncated DID in members list
GET /api/spaces/:slug/members now enriches entries missing displayName
by looking up the username from EncryptID (/api/internal/user-email).
Old member records (particularly owners created before displayName was
passed to setMember) were showing as 'jAV6y4tg8UbKJEkN0npv...' in the
space settings Members tab.
2026-04-16 16:29:32 -04:00
Jeff Emmett 06c095eb19 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m12s Details
2026-04-16 16:21:35 -04:00
Jeff Emmett 14ffee4101 fix(rpast): serve interactive viewer at space root
Adds `GET /` to rpast routes. Without it, /rpast on a space subdomain
404'd because the sub-app had no root handler. Now matches the rNotes
pattern: bare domain → marketing landing, in-space URL → app shell with
<rpast-viewer>.
2026-04-16 16:21:19 -04:00
Jeff Emmett a2acf963f7 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m35s Details
2026-04-16 16:13:40 -04:00
Jeff Emmett d950e1a656 chore(backlog): add DAO power-indices follow-up tasks (144-150)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 16:13:29 -04:00
Jeff Emmett 5e5fcd7681 feat(rsocials): campaign planner polish
Expanded folk-campaign-planner with richer live state, styled dashboard
refresh, and schema + mod updates to match the new planner flow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 16:13:20 -04:00
Jeff Emmett 3a69234819 feat(rpast): chronicle-of-self timeline + markwhen projection
- New rpast module renders a cross-rApp personal timeline
- shared/markwhen/ projection layer hydrates from syncServer docs
- rCal gets a Timeline applet wiring into the same markwhen view
- rstack-markwhen-view component for embedding elsewhere
- Smoke-test fixtures under output/ and scripts/smoke-rpast.ts
- Adds @markwhen/{parser,timeline,calendar,mw} deps

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 16:13:11 -04:00
Jeff Emmett 48a5bf7d8a Merge branch 'dev'
CI/CD / deploy (push) Has been cancelled Details
2026-04-16 16:11:31 -04:00
Jeff Emmett 3d11acd48b chore(sw): bump cache version to v9 to purge stale HTML fragments
Stale cached HTML fragments referenced old asset hashes (e.g. 404 on
canvas-PlYnCtxh.js while server has canvas-R4rXE5Sc.js) after frequent
rebuilds. Bumping CACHE_VERSION and the SW registration query string
forces the new SW to install and purge all old versioned caches on
activate.
2026-04-16 16:11:29 -04:00
Jeff Emmett e3f322e7ff fix(rmeets): use subdomain-aware URLs everywhere
All internal rMeets links were hardcoded to /{space}/rmeets, so clicking
Quick Meet on https://demo.rspace.online/rmeets landed on
https://demo.rspace.online/demo/rmeets/<id> — a banned path-with-subdomain
URL. Added rmeetsBase(c) that returns /rmeets on {space}.rspace.online and
/{space}/rmeets elsewhere; swept all five `base` sites plus the inline
meeting page's meetsBase.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 15:55:27 -04:00
Jeff Emmett c1bd6d770f Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m26s Details
2026-04-16 15:51:34 -04:00
Jeff Emmett dd608f831c tweak(mi-voice): quiet feminine — Emma, volume 0.25, neutral pitch
User preference: quiet + feminine. Swap Andrew (male) for Emma
(calmer, softer female than Aria). Drop volume 0.3 -> 0.25, reset
pitch to natural (deeper shift made it sound male). Rate stays slow.
2026-04-16 15:51:31 -04:00
Jeff Emmett 07b4714f48 fix(rpubs): canonical subdomain URLs for published pages
Published hosted_url, pdf_url, epub_url, and all links in the reader
page now use {space}.rspace.online/rpubs/... (subdomain form) instead
of path-scoped rspace.online/{space}/rpubs/... — matching the site
convention that space slugs always appear as subdomains.

The server already rewrites subdomain → path-scope internally for
routing, so Hono route mounts stay the same.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 15:51:28 -04:00
Jeff Emmett dd885487a0 Merge branch 'dev'
CI/CD / deploy (push) Has been cancelled Details
2026-04-16 15:48:51 -04:00
Jeff Emmett d55b9f74c0 tweak(mi-voice): brief but well-formed, not telegraphic
Prior voice-mode prompt leaned too far into caveman/telegraphic speech
('drop articles'). User wants brevity with proper grammar — short
complete sentences, not neanderthal fragments.
2026-04-16 15:48:48 -04:00
Jeff Emmett 7cbf96de8b feat(rmeets): live captions + MI internal-key auth
- Add Web Speech API captions overlay in the default Jitsi meeting view,
  broadcasting final/interim transcripts over Jitsi's data channel so each
  participant sees everyone's speech in real time.
- Toggle via the MI FAB dropdown; degrades gracefully where SR is unsupported.
- miApiFetch + /api/mi-proxy now forward X-MI-Internal-Key so the Meeting
  Intelligence recordings/search/meetings lists resolve from the backend
  without per-user tokens.
- docker-compose exposes MEETING_INTELLIGENCE_API_URL, MI_INTERNAL_KEY,
  JITSI_URL to the rspace container.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 15:46:30 -04:00
Jeff Emmett 78c403da60 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m37s Details
2026-04-16 15:44:16 -04:00
Jeff Emmett 39fbd99897 feat(mi-voice): quieter+smoother voice, caveman terseness in voice mode
- Default voice en-US-AvaMultilingualNeural -> en-US-AndrewMultilingualNeural
  (smoother, less feminine timbre).
- Volume 0.55 -> 0.3, rate -8% -> -10%, pitch -2Hz -> -6Hz.
- Browser fallback matches: pitch 0.85, volume 0.3.
- Client passes voiceMode flag to /api/mi/ask; server appends a VOICE
  MODE section to the system prompt demanding ≤1-2 short sentences,
  no lists/markdown/emoji/preamble — because listening to long replies
  is tedious.
2026-04-16 15:44:11 -04:00
Jeff Emmett d53b8ee3bf Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m42s Details
2026-04-16 15:30:20 -04:00
Jeff Emmett 71782b1cf1 fix(mi-voice): await AudioContext.resume before source.start
Suspended contexts silently queued audio that never played. Await resume,
split connect() chain to avoid undefined-return on older browsers, and
re-check state after source setup in case first resume lost the gesture.
2026-04-16 15:30:16 -04:00
Jeff Emmett 858711e783 feat(rpubs): EPUB export + Publish-to-Space hosted URLs
- epub-gen.ts: reflowable (markdown → styled xhtml) and fixed-layout
  (Typst per-page PNGs wrapped as pre-paginated EPUB3). No new deps.
- typst-compile.ts: compileDocumentToPages() rasterizes Typst directly
  to PNG via the CLI (no poppler/mupdf needed).
- Persistent publications store at /data/rpubs-publications/{space}/{slug}
  with public reader page, PDF + EPUB downloads at /{space}/rpubs/publications/{slug}.
- Preview/Press step now has quick EPUB download buttons next to PDF.
- Publish panel: "Publish to {space}" is now the primary action, showing
  hosted URL + copy-link after publishing. EPUB variants remain in downloads.
- Dockerfile: new PUBS_DIR volume for persistence.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 15:23:49 -04:00
Jeff Emmett 415c80a5fb Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m3s Details
2026-04-16 15:19:06 -04:00
Jeff Emmett 1f084fa674 fix(mi-voice): big-endian header parse, apply gain, softer voice defaults
- Parse WS frame header length as big-endian (server uses struct.pack('>I')).
  Previous little-endian read always failed, silently forcing the browser
  Web Speech fallback.
- Apply header volume via GainNode so quieter actually plays quieter.
- Default voice en-US-AriaNeural -> en-US-AvaMultilingualNeural, with
  rate -8% / pitch -2Hz / volume 0.55 for a calmer, less grating output.
  Browser fallback gets matching rate/pitch/volume.
2026-04-16 15:18:40 -04:00
Jeff Emmett db7e49ee92 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m8s Details
2026-04-16 15:01:39 -04:00
Jeff Emmett 9daeb60895 fix(collab): dedup cursors by username + same-page-only visibility
- Deduplicate cursor rendering using #uniquePeers() (was showing
  multiple cursors per user from different tabs/sessions)
- Strict same-page filtering: cursors only visible when peers share
  the same effectiveViewId (viewId ?? moduleId)
- Users on different rApps no longer see each other's cursors
- Applied same fixes to focus rings and panel "different view" badge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 15:00:11 -04:00
Jeff Emmett 2b75651655 Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m6s Details
2026-04-16 14:56:12 -04:00
Jeff Emmett c885773844 fix(shell): move tab bar up 2px more, reduce left padding for full-width span
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 14:56:05 -04:00
Jeff Emmett 9b9170c90b Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m9s Details
2026-04-16 12:47:14 -04:00
Jeff Emmett c5a58e1908 feat(rfeeds): add landing page and standalone domain (rfeeds.online)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 12:47:05 -04:00
Jeff Emmett 31a0b93310 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m27s Details
2026-04-16 12:44:33 -04:00
Jeff Emmett 1bc2a0af8c fix(encryptid): add missing welcome-email.ts to Docker build
Dockerfile.encryptid was missing COPY for server/welcome-email.ts,
causing container crash on startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 12:44:25 -04:00
Jeff Emmett 052be5159e Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m31s Details
2026-04-16 12:39:23 -04:00
Jeff Emmett 97c1b02c58 feat(rnetwork): power indices for DAO governance analysis
Banzhaf & Shapley-Shubik power index computation via DP, integrated
into trust engine 5-min cycle. Power tab in rNetwork 3D graph viewer
with animated bar chart, Gini/HHI gauges, and Banzhaf-scaled node
sizes. On-demand computation when DB empty. Left-drag now rotates.

New files:
- src/encryptid/power-indices.ts (pure math: Banzhaf DP, SS DP, Gini, HHI)
- modules/rnetwork/components/folk-power-indices.ts (standalone component)

API: GET /api/power-indices, GET /api/power-indices/:did,
     POST /api/power-indices/simulate

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 12:39:01 -04:00
Jeff Emmett 67b5d8e7f0 Merge branch 'dev'
CI/CD / deploy (push) Failing after 1m56s Details
2026-04-16 12:19:33 -04:00
Jeff Emmett b0049ba8f4 fix(shell): close header-tabbar gap, minimize all 3 header bars together
- Move tab row up 1px (top: 55px) to overlap header border, eliminating gap
- Minimize toggle now hides header + tab row + subnav (was leaving subnav visible)
- Floating restore button (top-right, semi-transparent) when headers minimized
- Smooth transition on subnav hide/show

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 12:19:26 -04:00
Jeff Emmett 24543b678d Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m4s Details
2026-04-16 11:04:25 -04:00
Jeff Emmett a2f74faa3e feat(rtime): split-screen layout — commitment form left, pool viz right
Restructured rTime from pool+weaving side-by-side to commitment entry
form (left 50%) and pool orb visualization (right 50%). Inline form
replaces modal for pledging time. Commitments list shows below form.
Weaving SVG moved to separate toggled view via "Weave" button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 11:04:14 -04:00
Jeff Emmett 8592abd467 feat(rmeets): chat popup notifications + right-side chat panel
- Enable chat notifications (brief popup for all participants)
- Move chat panel to right side via CHAT_PANEL_POSITION
- Applied to both clean room mode and folk-jitsi-room shell mode

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 09:36:29 -04:00
Jeff Emmett 12cc724291 fix(rmeets): add recording button + post-meeting transcript link
- Add "recording" to Jitsi toolbarButtons in both clean room mode
  and folk-jitsi-room shell mode so users can trigger Jibri recording
- Add "View Transcript & Summary" link on meeting-ended screen
- Jibri network connectivity fixed on Netcup (was on wrong Docker
  network, couldn't reach Prosody XMPP)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 09:09:30 -04:00
Jeff Emmett 694f47e363 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m4s Details
2026-04-16 08:47:42 -04:00