Commit Graph

1241 Commits

Author SHA1 Message Date
Jeff Emmett cc22d82423 Merge branch 'dev' 2026-03-23 15:08:20 -07:00
Jeff Emmett 3cfec226a4 fix(rflows): proportional node sizing + remove organic visualization
Nodes now scale with dollar values (sources by flowRate, funnels by
maxCapacity, outcomes by fundingTarget). Removed unused organic/
mycorrhizal render mode including renderer, CSS, and all toggle logic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 15:08:08 -07:00
Jeff Emmett 5c9ef2300b Merge branch 'dev' 2026-03-23 14:37:32 -07:00
Jeff Emmett a9ff1cf94b feat(encryptid): complete social recovery end-to-end flow
Add /recover/social page for users to finalize account recovery after
guardian approvals, fix status filter so approved requests remain
findable, return requestId from initiation API with tracking link on
login page, and add actionUrl to recovery notifications.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 14:32:38 -07:00
Jeff Emmett cb92a7f6d8 feat(rtrips): AI trip planner — canvas tools + "Plan with AI" button
Register 5 trip-specific tools (destination, itinerary, booking, budget,
packing list) in canvas-tools.ts so Gemini can create trip shapes.
Add public toolsEnabled/systemPrompt properties to folk-prompt with
persistence. Add #trip-planner hash handler to canvas.html that auto-
creates a pre-configured AI prompt. Add "Plan with AI" gradient button
to rTrips list and detail views.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 14:32:28 -07:00
Jeff Emmett cdfba02b03 fix(rcart): exempt payment endpoints from private space access gate
Payment creation, QR codes, and pay pages should be accessible to any
authenticated user regardless of space visibility, since the payment
goes to the creator's wallet. The route handlers enforce their own auth.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 14:30:55 -07:00
Jeff Emmett 63b9305787 Merge branch 'dev' 2026-03-23 14:23:55 -07:00
Jeff Emmett 67f1927eb5 fix(rflows): exempt public on-ramp endpoints from space auth middleware
Space visibility defaults to "private", blocking unauthenticated API calls.
The on-ramp and webhook endpoints are designed for unauthenticated users,
so they need to bypass the space-level auth check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 14:23:44 -07:00
Jeff Emmett 1bdf47a613 Merge branch 'dev' 2026-03-23 14:02:40 -07:00
Jeff Emmett f5de97c60c feat(ux): move comment button to header bar with unresolved badge
Move the "Leave Comment" button from the bottom canvas toolbar to the
top header bar as <rstack-comment-bell>, positioned left of the
notification bell. Shows a red badge with unresolved comment pin count.
Wires canvas via comment-pin-activate/comment-pins-changed custom events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 14:02:27 -07:00
Jeff Emmett 4139b829a1 Merge branch 'dev' 2026-03-23 13:48:19 -07:00
Jeff Emmett 38053eee34 fix(notes): prevent deletion while editing, fix layout, add semantic zoom
- Fix Delete/Backspace deleting the note shape when editing text inside
  it. The canvas keydown handler now uses composedPath() to detect
  inputs inside Shadow DOM (textarea, title input). Also fixes Space
  key and Ctrl+Z being intercepted by canvas while typing.
- Stop all keydown propagation from the editor/title inputs to prevent
  arrow keys from moving the shape while editing.
- Fix layout: replace calc(100%-36px) with proper flex layout. Header,
  toolbar, footer are flex-shrink:0; editor fills remaining space.
  Fixes headers being cut off and weird sizing.
- Add semantic zoom: icon-only (<0.3x), summary (0.3-0.7x), full
  editor (>0.7x). Reads --canvas-scale CSS custom property set by
  updateCanvasTransform().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:48:08 -07:00
Jeff Emmett e3486f7161 Merge branch 'dev' 2026-03-23 13:39:14 -07:00
Jeff Emmett 83fa874147 fix(ux): show offline only on actual disconnection, add resync tooltip
- Badge now reflects real connection state: "N online", "Reconnecting…", or "Offline"
- Removed manual online/offline toggle (was confusing — showed both states)
- Panel Solo/Share toggle remains for cursor visibility preference
- Hover tooltip on badge when offline: "changes saved locally, will resync"
- Panel shows offline/reconnecting notice banner when disconnected
- Removed unused #people-conn-status element and CSS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:39:08 -07:00
Jeff Emmett 023a9e7fbd fix(notifications): use full URL pathname for proxy path
c.req.path in Hono returns the full path, not the relative path
within the sub-router, causing the /api/notifications prefix to
be doubled.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:36:51 -07:00
Jeff Emmett cb784b8102 fix(notifications): proxy to encryptid instead of direct DB access
The rspace container cannot resolve encryptid-db hostname, causing
/api/notifications/count to 524 timeout on every 30s poll. Rewrites
notification-routes.ts as an HTTP proxy to encryptid (which has DB
access), adds notification API endpoints to encryptid server, and
wraps BroadcastChannel.postMessage in try/catch to prevent uncaught
errors during navigation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:30:58 -07:00
Jeff Emmett 20b3af9074 Merge branch 'dev' 2026-03-23 13:29:54 -07:00
Jeff Emmett b91233092b fix(ux): move people-online badge into sub-tab header bar
- Move people badge + panel from fixed position to inline in .rstack-tab-row
- Badge sits right of the layer toggle icon with a subtle separator
- Panel drops down from badge position instead of floating fixed
- Online/Offline toggle replaces Solo/Multi labels for clarity
- Badge shows "Offline" with gray dot when in offline mode
- Mobile: hide text label, show dots only
- Tab bar gets flex:1 + min-width:0 to share row space

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:29:45 -07:00
Jeff Emmett 9533a71b42 Merge branch 'dev' 2026-03-23 13:21:14 -07:00
Jeff Emmett d458a00550 fix(ux): instant bulk-delete dialog + post-login space routing
Bulk delete dialog: switch from click to pointerdown for instant
touch response, raise z-index above all overlays, add hover/active
feedback and keyboard support.

Post-login routing: reload page when logging in on a non-demo space
so access gates clear and CRDT sync reconnects with auth. Silently
provisions personal space in background.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:21:03 -07:00
Jeff Emmett 5660a880fd Merge branch 'dev' 2026-03-23 12:11:11 -07:00
Jeff Emmett 0c04d6bee1 fix(rmeets): use Jitsi External API by default, clean up toolbar buttons
Switch default room view to External API (cleaner toolbar, no stray
close buttons). Slim toolbar to essentials, disable participant pane
overlay. Fall back to iframe embed with ?iframe=1.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 12:11:00 -07:00
Jeff Emmett 1930d7dab0 feat(identity): local persona switcher for client-side multi-account
Store known personas in localStorage, auto-register on login. Dropdown
shows other personas with one-click switch (triggers passkey re-auth),
add/remove persona buttons, and cross-tab sync.

Also fix pre-existing TS errors: non-null assert on filtered functionCall,
add optional VerifyOptions param to authenticateWSUpgrade type declaration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 12:10:55 -07:00
Jeff Emmett 2060d41995 Merge branch 'dev' 2026-03-23 12:04:42 -07:00
Jeff Emmett 73cc1d1cc4 feat(spaces): add Create Space modal with member invites and invite links
Adds an intermediate modal when creating a space: name/slug editing with
availability check, description, visibility radio cards, discoverable
toggle, member search with @username lookup and email invites, and a
shareable invite link generated post-creation.

Server: adds discoverable field to CommunityMeta, extends PATCH /:slug,
adds POST /:slug/invites for generic invite token creation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 12:04:27 -07:00
Jeff Emmett 7f75552da2 Merge branch 'dev' 2026-03-23 10:48:37 -07:00
Jeff Emmett 460c68ddbf fix(rcal): only show dots/labels for events starting on that day
Multi-day events on intermediate days are shown via span bars,
not duplicated as dots/labels in each day cell.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 10:48:30 -07:00
Jeff Emmett 1f34c89d4c Merge branch 'dev' 2026-03-22 20:41:09 -07:00
Jeff Emmett 7234a8db38 feat(rspace): add rich landing page for the canvas module
Replace the generic "🎨 rSpace — Real-time collaborative canvas" fallback
with a full landing page following the rl-* CSS system used by other rApps.

Sections: hero, principles (local-first/interoperable/AI-native/multiplayer),
canvas features, 16-shape library grid, AI capabilities, how it works steps,
ecosystem integrations, open source stack, data protection, and final CTA.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 20:41:00 -07:00
Jeff Emmett 72b1913061 Merge branch 'dev' 2026-03-22 20:13:25 -07:00
Jeff Emmett 34a7a4e37e fix(canvas): mobile toolbar to right, persistent lock badge, reminder auth
- Move mobile toolbar to right side to avoid zoom bar overlap
- Toolbar panel opens leftward, bottom toolbar offsets flipped
- Add [locked] attribute reflection on folk-shape for external CSS
- Persistent 🔒 badge on locked shapes visible when unselected
- Add Authorization header to calendar reminder POST request

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 20:13:15 -07:00
Jeff Emmett 90e16d1016 Merge branch 'dev' 2026-03-22 19:29:05 -07:00
Jeff Emmett e2c6275308 fix(canvas): comment pin tool state management + shape detection bug
- Fix elementFromPoint using canvas-relative coords instead of viewport
  coords for shape detection during pin placement
- Use shape data from Automerge doc for offset calculation (more reliable)
- Add exitCommentMode() to deactivate pin placement when switching tools
- Integrate comment mode into syncBottomToolbar active state
- Escape key closes popover and exits comment mode
- Mutual exclusion between comment/draw/connect/pending tool modes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 19:28:51 -07:00
Jeff Emmett 7c845270ce Merge branch 'dev' 2026-03-22 19:14:05 -07:00
Jeff Emmett 48d11f5ec9 feat(canvas): simplify comment pins — optional notes + link rNotes
Pins no longer require a message. Added "Link existing rNote" picker
to attach space notes to pins. Linked notes show as clickable links
in the popover with unlink option.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 19:13:58 -07:00
Jeff Emmett db00636be2 Merge branch 'dev' 2026-03-22 18:47:46 -07:00
Jeff Emmett 07e3c7348c feat(canvas): add Figma-style comment pin system
Overlay markers at canvas or shape-relative coords with threaded
comments, @mention notifications, and rSchedule reminder integration.
Toolbar "Leave Comment" button (/) next to Note tool.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 18:47:03 -07:00
Jeff Emmett c8ff74d2f1 Merge branch 'dev' 2026-03-22 18:35:33 -07:00
Jeff Emmett 2e3007b1df fix(flipbook): ensure 2-page spread display in StPageFlip
Add flex-shrink:0 to flipbook containers to prevent flex layout from
squishing them below pageW*2, which would trigger StPageFlip's
portrait (single-page) mode. Update rpubs page counter to show
spread page range (Pages X–Y of N) for middle pages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 18:35:25 -07:00
Jeff Emmett f0b663d9e6 Merge branch 'dev' 2026-03-22 18:28:03 -07:00
Jeff Emmett 9ac8cb6256 fix(flipbook): replicate StPageFlip CSS inside shadow DOM
StPageFlip injects its CSS (.stf__parent, .stf__block, .stf__item, etc.)
into document.head, which doesn't penetrate shadow DOM boundaries.
Pages rendered but were unstyled — collapsed/invisible. Replicate the
required rules inside each component's shadow root styles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 18:27:56 -07:00
Jeff Emmett b4fa61d99a Merge branch 'dev' 2026-03-22 18:21:58 -07:00
Jeff Emmett df8d5f79ce fix(rmeets): align MI route handlers with actual API response shapes
- Search: use POST /search with JSON body (was GET with query params)
- Summary: add summary_text field lookup (API's actual field name)
- Speakers: add speaking_time + speaker_label fallbacks
- Transcript: add speaker_label fallback for segment speaker name
- Action items: add task field lookup (API returns {task, assignee})
- Recordings: detect transcript availability from segment_count
- Add CSS for processing status badges (transcribing, diarizing, etc)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 18:21:55 -07:00
Jeff Emmett e4e967fcfb Merge branch 'dev' 2026-03-22 18:15:23 -07:00
Jeff Emmett cebad27b38 fix(auth): pass JWT secret to all SDK verify calls + add auth header to rpubs generate
evaluateSpaceAccess and authenticateWSUpgrade were calling the SDK
without the secret option, forcing remote verification. Also adds
auth header to rpubs editor generate fetch (was getting 401 on
private spaces).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 18:15:17 -07:00
Jeff Emmett dc3bff9f70 Merge branch 'dev' 2026-03-22 18:04:29 -07:00
Jeff Emmett cc1f09b565 feat(rmeets): integrate Meeting Intelligence API for recordings, transcripts, and search
Connect the deployed meeting-intelligence stack to the rmeets module:
- Add MI API proxy helper with 8s timeout and graceful fallback
- Add recordings list page with meeting cards showing status/transcript/summary badges
- Add recording detail page with overview/transcript/summary/speakers tabs
- Add full-text transcript search with highlighted results
- Add client-side MI API proxy route to avoid CORS issues
- Add Recordings and Search nav links to the hub page
- Update landing page: remove "Coming Soon" from transcription + rename section
- Update module export: replace recordings outputPath with custom route, add onboardingActions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 18:00:51 -07:00
Jeff Emmett abf88e0ceb Merge branch 'dev' 2026-03-22 16:42:17 -07:00
Jeff Emmett 999502464f feat(prompt): add canvas tool use via Gemini function calling
folk-prompt can now spawn shapes on the canvas when Tools mode is
enabled. Gemini calls functions (create_map, create_note, create_embed,
create_image, create_bookmark, create_image_gen) and the client
executes them via window.__canvasApi. Multi-turn loop on server (max 5
rounds) with synthetic success responses. Extensible via registerCanvasTool().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 16:42:08 -07:00
Jeff Emmett 7618433498 refactor(auth): replace @encryptid/sdk imports with local auth module
Consolidates token verification into server/auth.ts, removing the
external SDK dependency. All modules now import from the local module.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 16:41:59 -07:00