Commit Graph

1480 Commits

Author SHA1 Message Date
Jeff Emmett 55771eb26e chore: switch Transak to production environment
Staging doesn't support USDC on Base network (test tokens only).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:18:54 -07:00
Jeff Emmett d865da32a7 fix(rsocials): campaign wizard timeout + faster content generation
- Add 120s AbortController timeout to apiFetch so wizard can't hang
  forever on slow networks (shows "Request timed out" instead of stuck)
- Switch content generation from gemini-2.5-pro to gemini-2.5-flash
  to avoid Cloudflare/Traefik proxy timeouts (pro model took 30-60s+)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 22:48:57 -07:00
Jeff Emmett df202df06c fix: bare-domain module URLs now show landing pages instead of demo hub
rspace.online/{moduleId} was rewriting to /demo/{moduleId}, serving the
internal nav hub. Now calls renderModuleLanding() with the module's rich
landing page when available, falling back to demo rewrite otherwise.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 22:24:25 -07:00
Jeff Emmett 2d39fcac1d refactor(tabs): consolidate [+] button with app-switcher sidebar
The tab bar [+] button now opens the same sidebar as the header's
rApp dropdown instead of its own duplicate menu. Reduces UI clutter
and gives one consistent place to browse/add rApps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 04:48:10 +00:00
Jeff Emmett 71452a6b31 Merge branch 'dev' 2026-03-30 20:46:14 -07:00
Jeff Emmett 231f5c6e59 chore(rinbox): bump folk-inbox-client.js cache version to v=3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:46:04 -07:00
Jeff Emmett 781af0e163 Merge branch 'dev' 2026-03-30 20:41:45 -07:00
Jeff Emmett 58e319b8c8 feat(rinbox): add markdown rendering + TipTap collaborative editing
- Extract markdown-tiptap.ts and yjs-ws-provider.ts to shared/ for reuse
- Thread bodies render as formatted markdown via marked
- Replace compose textarea with TipTap rich-text editor + Yjs collab
- Add formatting toolbar (bold, italic, lists, code, links, etc.)
- Add TipTap comment editor with tiptap-json storage format
- Server accepts content_format on comment API
- Full ProseMirror + collab cursor CSS scoped to shadow DOM
- Editors cleaned up on navigation and disconnect

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:40:49 -07:00
Jeff Emmett d294d5e164 Merge branch 'dev' 2026-03-30 20:19:59 -07:00
Jeff Emmett 15f5c58214 fix(rnotes): sidebar drag-drop reorder now works
- Add sort_order to Note interface and map from Automerge sortOrder
- Add sortNotes() method (pinned first, sort_order asc, updated_at fallback)
- Add CSS indicators (box-shadow) for drag-above/drag-below
- Add dragend cleanup for opacity + stale indicator classes
- Apply sortNotes in renderFromDoc, loadNotebookREST, fetchNotebookNotes
- Bump folk-notes-app.js cache to v=13

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:19:46 -07:00
Jeff Emmett 28bfa37199 fix: collab overlay stuck on 'Connecting' — init race + timeout
- Runtime now sets isInitialized after IndexedDB (before WS connect)
  so the overlay can detect it within ~500ms instead of waiting 30s+
- Overlay no longer gives up polling after 15s (slows to 2s instead)
- Overlay subscribes to runtime onConnect/onDisconnect for live updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:16:01 -07:00
Jeff Emmett 6a0ad06c11 fix: sync collab overlay connection state with runtime WS status
The overlay was blindly setting 'connected' on runtime ready without
checking actual WebSocket state, and never subscribed to connect/disconnect
events — causing stale "Reconnecting…" badges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 19:48:57 -07:00
Jeff Emmett f9457a0e11 perf(shell): add fragment mode for fast rApp tab switching
When switching rApps from the dropdown, TabCache now requests
?fragment=1 which returns a lightweight JSON payload (~200 bytes)
instead of re-rendering the full 2000-line shell HTML template.
This eliminates server-side shell rendering and client-side
DOMParser overhead. Also prefetches fragments on hover.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 02:28:09 +00:00
Jeff Emmett 63684224b3 Merge branch 'dev' 2026-03-29 12:45:42 -07:00
Jeff Emmett 12499d62b5 chore(rnotes): bump folk-notes-app.js cache version to v=12
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 12:45:39 -07:00
Jeff Emmett 7d71d202f9 Merge branch 'dev' 2026-03-29 12:43:51 -07:00
Jeff Emmett 9266a6155f feat(rnotes): debounce suggestion panel + drag-drop notes between notebooks
Batch consecutive keystrokes into single suggestions via session tracker,
debounce panel sync (400ms) to prevent letter-by-letter flicker, and add
HTML5 drag-and-drop to move notes between notebooks in the sidebar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 12:43:40 -07:00
Jeff Emmett 5852b91f4c feat(mi): make MI aware of all 48 canvas shape types
- Expand MI system prompt "Available shape types" from 20 → 48 shapes,
  organized by category (Core, AI, Creative, Social, Decisions, Travel,
  Tokens, Geo, Video)
- Expand Shape Mapping Rules from 12 → 30 triage rules covering all
  shape types with prop hints
- Expand KNOWN_TRIAGE_SHAPES from 15 → 48 so Gemini triage no longer
  silently downgrades unknown shapes to folk-markdown
- Add 22 missing TOOL_HINTS to mi-tool-schema.ts (travel, tokens, CAD,
  creative, geo, meta shapes) for keyword-based chip suggestions
- Add all 48 shapes to SHAPE_ICONS in mi-triage-panel.ts (was 13)
- Register folk-image-studio and folk-transaction-builder in canvas.html
  (were ghost shapes — imported but never defined/registered)
- Add SHAPE_DEFAULTS for folk-social-thread/campaign/newsletter,
  folk-design-agent, folk-image-studio

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:45:11 -07:00
Jeff Emmett ac517bc56d Merge branch 'dev' 2026-03-28 16:43:30 -07:00
Jeff Emmett abc855f34e fix(rnotes): position sidebar collapse button at right edge, vertically centered
Move < button from inside search header to absolute-positioned on the
sidebar border at vertical midpoint. Matches the > reopen tab style.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:43:21 -07:00
Jeff Emmett 514ee46534 Merge branch 'dev' 2026-03-28 16:34:15 -07:00
Jeff Emmett e8d88cd10e fix(rnotes): resolve anonymous identity in comments, suggestions, and cursors
Session was stored as { claims: { username, sub } } but getSessionInfo()
read sess.username (top-level) instead of sess.claims.username — always
falling back to "Anonymous". Fixed in all 3 locations: folk-notes-app,
comment-panel, collab-presence.

Also fixed awareness race: Yjs provider broadcast initial awareness before
user field was set, creating a ghost "anonymous" peer. Now identity is set
on awareness before provider connects, and the duplicate set is removed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:34:08 -07:00
Jeff Emmett 42ff49bbf3 Merge branch 'dev' 2026-03-28 16:28:50 -07:00
Jeff Emmett 99fa59c8df feat(rnotes): suggestions in sidebar panel with per-item accept/reject
- Suggestions now appear as cards in the right-hand comment sidebar
  with author, type (Added/Deleted), text preview, and Accept/Reject
- Clicking a suggestion card scrolls the editor to the marked text
- Removed "Accept All" and "Reject All" from the review bar — too blunt
- Review bar now directs users to the sidebar for granular review
- Sidebar auto-opens when suggestions exist
- Inline popover accept/reject still works for quick actions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:28:42 -07:00
Jeff Emmett 4ccd23640a Merge branch 'dev' 2026-03-28 16:28:10 -07:00
Jeff Emmett 0ec5edd1ee feat(rnotes): collapsible document sidebar with < / > toggle
Add collapse button (<) in sidebar header top-right and reopen tab (>)
on left edge when collapsed. CSS grid transition for smooth animation.
Hidden on mobile where slide navigation handles sidebar state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:28:01 -07:00
Jeff Emmett 9084de7adb feat(rsocials): wire social shapes into all cross-rApp systems
- Add GET /api/threads, /api/threads/:id, /api/campaigns, /api/campaigns/:id
  REST endpoints so other rApps can fetch rsocials data
- Register folk-social-thread/campaign/newsletter in MI triage panel,
  tool schema, system prompt, and KNOWN_TRIAGE_SHAPES
- Add rsocials MODULE_PORTS (threads-out, campaigns-out, post-published,
  campaign-data) and WIDGET_API to folk-rapp for embed/widget mode
- Add rsocials to folk-feed FEED_ENDPOINTS (threads, campaigns, newsletter)
  and normalize response arrays (threads, campaigns, drafts)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:25:26 -07:00
Jeff Emmett 288dea2396 Merge branch 'dev' 2026-03-28 16:08:26 -07:00
Jeff Emmett 63a3f9b6c3 fix(rcart): add missing getTransakEnv import
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:08:23 -07:00
Jeff Emmett 46e3c74809 Merge branch 'dev' 2026-03-28 16:02:08 -07:00
Jeff Emmett 9edb6cccde fix(rcart): Transak staging payment — popup instead of blocked iframe
Transak staging sets X-Frame-Options: sameorigin, blocking iframe embedding.
Server now uses x-forwarded-host header for correct referrerDomain behind
Traefik, and returns env (STAGING/PRODUCTION) in transak-session response.
Client opens a popup window for staging instead of iframe.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:01:57 -07:00
Jeff Emmett 0e52a14c37 Merge branch 'dev' 2026-03-26 09:00:03 -07:00
Jeff Emmett bbbe14246c feat(rinbox): space agent mailbox system — per-space MI email identity
Each space gets {space}-agent@rspace.online as a real Mailcow mailbox
(auto-provisioned with generated password). Inbound emails are IMAP-polled
and processed by MI (Gemini Flash) for auto-reply. All outbound emails
(approvals, notifications) set reply-to to the agent address so replies
route back through MI.

- mailcow.ts: createMailbox/deleteMailbox/mailboxExists API
- schema.sql + db.ts: agent_mailboxes table for per-space IMAP creds
- space-alias-service.ts: provisionAgentMailbox/deprovisionAgentMailbox
- server.ts: internal routes for agent mailbox CRUD + member-emails
- rinbox/mod.ts: initAgentMailbox, per-space IMAP sync, processAgentMI
- rinbox/agent-notify.ts: sendSpaceNotification (BCC members)
- rcal/rtasks/rvote: notification hooks on create

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 08:59:52 -07:00
Jeff Emmett dccda2d358 Merge branch 'dev' 2026-03-25 20:56:31 -07:00
Jeff Emmett e31c905d7c feat(rnotes): add tiptap-markdown for inline markdown shortcuts + paste
Type **bold**, _italic_, ~~strike~~, `code`, etc. and they auto-convert
to rich text. Pasting markdown also converts to formatted content.
Added to all 4 editor instances (Yjs, legacy, bookmark, image, audio).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:56:22 -07:00
Jeff Emmett 1dabe0ad72 Merge branch 'dev' 2026-03-25 20:26:39 -07:00
Jeff Emmett 219a5f434b fix(rnotes): mobile collab UX — bottom-sheet comments, toolbar reorder
- Comment sidebar → full-width bottom sheet at ≤768px (was ≤480px)
- Toolbar: collab tools (comment, suggest) reordered first on mobile
  via CSS order so they're visible without scrolling
- Suggestion review bar wraps at mobile widths
- Toolbar scroll + larger touch targets promoted to ≤768px breakpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:26:30 -07:00
Jeff Emmett 05e5df2ab5 Merge branch 'dev' 2026-03-25 20:22:00 -07:00
Jeff Emmett 8f9d507440 fix(rinbox): clean up sub-tab header — mailboxes + approvals only, info icon, space mailbox primary
Remove Personal, Agents, Tour from nav header. Move Guide/About behind
info icon (ⓘ). Space mailbox ({space}@rspace.online) shown first with
highlighted card spanning full width. Add demo threads for space mailbox.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:21:50 -07:00
Jeff Emmett 4f96b25d52 Merge branch 'dev' 2026-03-25 20:16:15 -07:00
Jeff Emmett 696ab3cfd9 feat(mi): load context suggestions on component init for bar placeholder rotation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:16:05 -07:00
Jeff Emmett f28e80c323 Merge branch 'dev' 2026-03-25 20:15:59 -07:00
Jeff Emmett 25abb0266b feat(rsocials): newsletter drafts tab + remove Listmonk setup wall
Drafts tab shown by default with Automerge-backed CRUD. Listmonk tabs
conditionally appear when configured. Info banner for unconfigured state.
Draft editor with HTML preview, status dropdown, subscriber management.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:15:46 -07:00
Jeff Emmett d7c33c7e86 Merge branch 'dev' 2026-03-25 20:14:29 -07:00
Jeff Emmett db25d65c43 chore(rnotes): bump JS cache version to v=9
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:14:22 -07:00
Jeff Emmett 0f3eb45ffa feat(canvas): register social shapes in shape registry for cross-rApp sharing
Import, define, and register folk-social-thread, folk-social-campaign,
and folk-social-newsletter in canvas.html so they're available on any
canvas across rSpaces, rSchedule, rFlows, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:12:27 -07:00
Jeff Emmett 46bcbb87b4 Merge branch 'dev' 2026-03-25 20:11:44 -07:00
Jeff Emmett 77ac0c1e32 feat(rsocials): newsletter drafts, subscribers + MI route updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:11:31 -07:00
Jeff Emmett 2eac542e19 feat(rnotes): mobile stack navigation — Notion-style two-screen slide
Replace overlay sidebar with horizontal flex stack: full-width doc list
slides to full-width editor with back bar on note tap. Resize-aware.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:11:26 -07:00
Jeff Emmett 943c8ec084 Merge branch 'dev' 2026-03-25 20:04:22 -07:00