Commit Graph

382 Commits

Author SHA1 Message Date
Jeff Emmett 483c61966c Merge branch 'dev' 2026-03-02 20:24:17 -08:00
Jeff Emmett 7d8f64d17c fix: make pencil tool temporary, return to selector on ESC
Drawing tools (pencil, rect, circle, line) now auto-clear after one
stroke, returning to the default selector tool. ESC clears any active
whiteboard tool. Switching to another toolbar tool also clears the
active whiteboard tool.

This fixes the resize issue — when a whiteboard tool was stuck active,
canvasContent had pointer-events:none which blocked all shape
interactions including resize handles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:24:09 -08:00
Jeff Emmett 7c8bbc17c8 Merge branch 'dev' 2026-03-02 20:23:37 -08:00
Jeff Emmett cb828fc605 fix: add retry logic to EncryptID database init for Docker networking delays
Docker container networking can take a moment to stabilize even after
depends_on health checks pass. This adds 5 retries with exponential
backoff (2s, 4s, 6s, 8s, 10s) to survive transient CONNECT_TIMEOUT errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:23:26 -08:00
Jeff Emmett 96b0a48436 Merge branch 'dev' 2026-03-02 20:07:37 -08:00
Jeff Emmett 6d1661a4f3 feat: template seeding system for new spaces
Every non-demo space gets generic "Getting Started" content (~25 shapes)
covering all rApp modules so users see what each module can do immediately.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 20:03:45 -08:00
Jeff Emmett 67820e7db5 Merge branch 'dev' 2026-03-02 19:57:39 -08:00
Jeff Emmett 4e9284fa5a feat: feed view — mobile-friendly infinite scroll for canvas
Add a toggle that switches the 2D spatial canvas into a vertical
scrollable feed layout. Shapes flow as a flex-column list, sortable
by position, creation time, type, or alphabetically. Pan/zoom/drag
gestures are suppressed in feed mode while shape editing stays active.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:57:24 -08:00
Jeff Emmett 928d03f372 Merge branch 'dev' 2026-03-02 19:39:50 -08:00
Jeff Emmett dfa09a39f6 feat: email invite endpoint, canvas share panel, backlog task-77 done
- Add POST /:slug/invite email endpoint (nodemailer via Mailcow SMTP)
- Add share badge + panel UI to canvas whiteboard
- Mark task-77 (encrypted VPS backup) as Done with updated references

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:39:43 -08:00
Jeff Emmett 8659d3a6ec Merge branch 'dev' 2026-03-02 19:36:27 -08:00
Jeff Emmett 1ff4c5ace7 refactor: consolidate EncryptID into main docker-compose.yml
Merge encryptid + encryptid-db services from separate docker-compose.encryptid.yml
into the main compose file. Update Dockerfile.encryptid to use additional_contexts
for encryptid-sdk (matching main Dockerfile pattern) instead of fragile context: ..

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:36:17 -08:00
Jeff Emmett 13293799b6 Merge branch 'dev' 2026-03-02 19:28:26 -08:00
Jeff Emmett 94c5346eda fix: account completion indicators, email verify token type, SW cache
- Add /api/account/status endpoint returning email, multi-device,
  social recovery completion state
- Show red/green status dots on Account modal section headers for
  incomplete vs complete steps (email, device, recovery, data storage)
- Highlight Data Storage section with red warning when using local-only
  storage so users know they're responsible for their own data
- Fix email verification 500 error: change token type from
  'email_verification' to 'email_verify' to match DB check constraint
- Fix service worker: skip non-http(s) schemes to prevent
  chrome-extension:// cache put errors

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:28:13 -08:00
Jeff Emmett 63d8cb63fa Merge branch 'dev' 2026-03-02 19:25:49 -08:00
Jeff Emmett 606c60c511 fix: remove auto-redirect from demo space when logged in
Logged-in users visiting demo.rspace.online were auto-redirected to
their personal subdomain. Remove this redirect so the demo stays
accessible regardless of auth state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:25:41 -08:00
Jeff Emmett 0c56569a00 Merge branch 'dev' 2026-03-02 19:21:05 -08:00
Jeff Emmett 48769281c6 feat: animated edges, rich node modals, hover effects for rFunds Diagram
Port standalone rfunds-online UX polish to rSpace integration:
- Animated flowing edges with glow paths and CSS-animated dashes
- Wider Sankey-proportional stroke widths (12/10/8px)
- Rich outcome modal with phase accordion, task checkboxes, funding progress
- Rich source modal with type picker grid and type-specific config
- Node hover tooltips showing key stats + connected edge highlighting
- Sufficiency glow pulse on funnel status text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:20:55 -08:00
Jeff Emmett 2b5ef14946 Merge branch 'dev' 2026-03-02 19:01:07 -08:00
Jeff Emmett 7ffabe9b0a fix: use source 'card' and require funnelId for Flow Service deposit
Flow Service expects source to be wallet|card|bank, not 'transak'.
funnelId falls back to FUNNEL_ID env var when not in partnerOrderId.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:55:59 -08:00
Jeff Emmett bedc5652dc Merge branch 'dev' 2026-03-02 18:25:20 -08:00
Jeff Emmett 0ef5aad3ad chore: add backlog tasks 79-81
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:25:12 -08:00
Jeff Emmett 0fb8bb782e Merge branch 'dev' 2026-03-02 18:20:42 -08:00
Jeff Emmett 1af7df41bb feat: Tiptap rich text editor for rNotes — toolbar, slash commands, sync
Replace bare contenteditable divs with a full Tiptap editor (vanilla JS,
no React) inside the <folk-notes-app> web component. Adds formatting
toolbar (bold/italic/underline/strike/code, heading dropdown, lists,
blockquote, code block, link/image insert, undo/redo), slash command
menu (/ at start of empty block), syntax-highlighted code blocks via
lowlight, and task list checkboxes.

Zone-based rendering keeps the editor DOM persistent across re-renders.
Content stored as Tiptap JSON in the existing Automerge content field
with a new contentFormat discriminator. Legacy HTML notes auto-migrate
on first edit. Remote sync updates applied without cursor disruption.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:20:33 -08:00
Jeff Emmett a70d5fc1a2 fix: use c.req.json() for Transak webhook body parsing
Hono consumes the request body upstream, so c.req.raw.clone().text()
returns empty. Use c.req.json() directly and re-serialize for HMAC.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:10:04 -08:00
Jeff Emmett 4bca76cf45 fix: handle body read in Transak webhook — clone request for HMAC + JSON
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:08:24 -08:00
Jeff Emmett 34c96b5a45 feat: Transak credit card → USDC fiat on-ramp for rFunds TBFF
Add Transak widget integration so users can fund flows with a credit card.
Server receives webhook on order completion and deposits USDC into the flow
via the existing Flow Service API. Includes HMAC signature verification
when TRANSAK_WEBHOOK_SECRET is configured.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 18:04:53 -08:00
Jeff Emmett 7f3747bf74 Merge branch 'dev' 2026-03-02 17:09:17 -08:00
Jeff Emmett 46c2a0b035 feat: layered local-first data architecture — encrypted backup, relay persistence, at-rest encryption
Implement the 4-layer data model (device → encrypted backup → shared sync → federated):

- Extract shared encryption-utils from community-store (deriveSpaceKey, AES-256-GCM, rSEN format)
- Encrypt module docs at rest when space has meta.encrypted === true
- Fix relay mode persistence: relay-backup/relay-restore wire protocol + .automerge.enc blob storage
- Add backup store + REST API (PUT/GET/DELETE /api/backup/:space/:docId) with JWT auth
- Add client BackupSyncManager with delta-only push, full restore, auto-backup
- Wire backup stubs in encryptid-bridge to BackupSyncManager
- Add rspace-backups Docker volume
- Create docs/DATA-ARCHITECTURE.md design doc with threat model and data flow diagrams

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:09:07 -08:00
Jeff Emmett c906efc3e6 Merge branch 'dev' 2026-03-02 16:46:07 -08:00
Jeff Emmett 5ee59f86d6 feat: people online panel — live peer presence on canvas
- community-sync: re-announce on reconnect, handle peer-list/joined/left/ping events
- presence: export peerIdToColor helper
- server: track peer announcements, broadcast join/leave, relay ping-user
- canvas: people online badge + expandable panel with avatar dots and ping button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:45:57 -08:00
Jeff Emmett 5241b37922 Merge branch 'dev' 2026-03-02 16:38:27 -08:00
Jeff Emmett 4dd212ef7d fix: add shared/local-first to EncryptID Docker build context
login-button.ts imports encryptid-bridge from shared/local-first/
which was missing from the Dockerfile.encryptid COPY steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:38:18 -08:00
Jeff Emmett ac2eebb966 Merge branch 'dev' 2026-03-02 16:34:56 -08:00
Jeff Emmett 88118cd157 fix: use server-initiated WebAuthn flow for guardian acceptance and login
The guardian page and auth.rspace.online login page were using the
client-side authenticatePasskey()/registerPasskey() SDK functions which
generate their own challenge and return AuthenticationResult — but then
tried to send result.challenge and result.credential (both undefined)
to the server. This caused postgres to throw "UNDEFINED_VALUE" resulting
in a 500 "Internal Server Error" that the client couldn't parse as JSON.

Fix: use the proper server-initiated flow matching rstack-identity.ts:
1. POST /api/auth/start (or /register/start) to get server challenge
2. navigator.credentials.get/create with that challenge
3. POST /api/auth/complete (or /register/complete) with challenge + credential

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:34:43 -08:00
Jeff Emmett dc6c6a4042 Merge branch 'dev' 2026-03-02 16:25:37 -08:00
Jeff Emmett 9443178d1c feat: Phase 5 — remove PostgreSQL from rForum, rSpace now fully PG-free
Migrate rForum provisioning metadata from shared PG pool to Automerge.
rForum was the last module using PostgreSQL; shared/db/pool.ts is now archived.

- Create modules/rforum/schemas.ts (ForumDoc, ForumInstance, ProvisionLog)
- Rewrite mod.ts: replace sql with Automerge getDoc/changeDoc, add onInit
- Rewrite provisioner.ts: pass SyncServer, logStep/updateInstance via changeDoc
- Fix dashboard snake_case → camelCase field references
- Archive schema.sql and shared/db/pool.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:25:26 -08:00
Jeff Emmett 1cbced27f8 docs: add rSpace ecosystem ontology
Documents the three-layer architecture (rStack foundation, rSpace platform,
rApps modules) covering identity, local-first data, micropayments, wallet
abstraction, spatial canvas, module system, and token/value architecture.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:22:13 -08:00
Jeff Emmett bb97580386 Merge branch 'dev' 2026-03-02 16:08:59 -08:00
Jeff Emmett 9ffd5de10a chore: add backlog task files (task-77, task-78)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:05:24 -08:00
Jeff Emmett 125d3a3c40 Merge branch 'dev' 2026-03-02 15:48:13 -08:00
Jeff Emmett 8900eb32b9 feat: Phase 4 — remove PostgreSQL from 11 modules, switch to Automerge
Replace all sql.unsafe() calls with Automerge document operations
across rfunds, rbooks, rsplat, rnotes, rwork, rvote, rcal, rfiles,
rcart, rtrips, and rinbox. Only rforum retains PG (Discourse provisioning).

Each module now uses _syncServer.getDoc/changeDoc/setDoc for all CRUD,
with ensureDoc() helpers for lazy document creation. Schema SQL files
archived to .sql.archived. Adds Automerge round-trip test suite (35 tests).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 15:48:01 -08:00
Jeff Emmett d1b5e6e122 Merge branch 'dev' 2026-03-02 15:22:26 -08:00
Jeff Emmett 88d618c1af feat: replace My Account submenu with consolidated popup modal
Consolidates email, device, recovery, postal address, data storage,
and dark mode settings into a single scrollable modal with collapsible
section cards — matching the existing My Spaces modal pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 15:22:13 -08:00
Jeff Emmett f7143a3ed7 Merge branch 'dev' 2026-03-02 15:18:42 -08:00
Jeff Emmett 25174b87e6 fix: bump rCal JS cache version to v=4
Bust Cloudflare CDN cache after unified layout deploy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 15:18:29 -08:00
Jeff Emmett 41244f943b Merge branch 'dev' 2026-03-02 15:07:42 -08:00
Jeff Emmett 2ce0b4730c feat: rCal unified layout — no tabs, auto-map, lunar overlay, scroll zoom
Remove the 3-tab system (Temporal/Spatial/Lunar) in favor of a unified view:
- Calendar always primary with floating/docked/minimizable map panel
- Lunar phases as compact overlay bar below nav (click to expand synodic detail)
- Scroll/trackpad zoom controls temporal granularity with 120ms debounce
- 'm' key cycles map panel: floating → docked → minimized → floating
- Mobile: floating map full-width, docked stacks vertically
- cal-demo.ts cleaned up (dead tab-switching code removed)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 15:07:31 -08:00
Jeff Emmett dadd2f85c0 Merge branch 'dev' 2026-03-02 14:50:26 -08:00
Jeff Emmett 22db2f439f feat: client-side encryption wiring + space scoping UI (Phase 5+6)
Phase 5 — EncryptID → DocCrypto bridge:
- Add EncryptedDocBridge connecting WebAuthn PRF to document encryption
- Add per-doc relay mode to SyncServer (encrypted spaces bypass participant mode)
- Wire encryption toggle to syncServer.setRelayOnly() on PATCH /:slug/encryption
- Restore relay mode for encrypted spaces on server startup
- Initialize DocBridge from PRF on login, clear on sign-out (both login-button + identity)
- Use bridge helpers for encrypted backup toggle in My Account

Phase 6 — Space scoping UI:
- Add "Modules" tab to Edit Space modal (enable/disable modules, scope toggles, encryption)
- Auto-filter app switcher by space's enabledModules via renderShell()
- Show "G" badge on global-scoped modules in app switcher
- Show lock icon in header for encrypted spaces
- Add getSpaceShellMeta() helper for auto-populating shell options

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 14:50:16 -08:00