Commit Graph

1600 Commits

Author SHA1 Message Date
Jeff Emmett b83dc1d32d Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m20s Details
2026-04-03 14:17:50 -07:00
Jeff Emmett 4a54e6af16 fix: enforce subdomain routing — spaces are subdomains, never path segments
Audit and fix ~60 violations across 47 files where URLs were constructed
as /{space}/moduleId instead of /moduleId (subdomain provides the space).

- Add getModuleApiBase() helper to shared/url-helpers.ts
- Fix client components: use getModuleApiBase() for fetch URLs,
  rspaceNavUrl() for navigation
- Fix server routes: use c.get("isSubdomain") for redirects and
  JSON response URLs
- Fix OAuth callbacks (notion, google, clickup): subdomain-aware redirects
- Fix email notification URLs (rvote): use {space}.rspace.online format
- Fix webhook registration (rtasks/clickup): subdomain-aware endpoint URL
- Replace broken #getSpaceSlug() methods in folk-feed, folk-splat
- Replace NODE_ENV checks with proper isSubdomain checks (rdata, rnetwork)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:09:53 -07:00
Jeff Emmett 7c6861bf50 fix(transak): let Infisical inject all Transak keys instead of empty compose vars
Empty compose env vars were blocking Infisical secret injection at startup.
Only TRANSAK_ENV needs to be in compose; API keys and secrets come from Infisical.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:03:51 -07:00
Jeff Emmett d262eff097 fix(rgov): use path-only href instead of /${space}/ prefix
Spaces are subdomains, not path segments. /rspace is correct since
the space context comes from the subdomain.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 13:32:04 -07:00
Jeff Emmett d62fb6c215 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m25s Details
2026-04-03 13:15:36 -07:00
Jeff Emmett 16f224f065 feat(rgov): add seed template with two example governance circuits
Seeds demo spaces with a "Build a Climbing Wall" circuit (labor threshold +
capital threshold + proprietor signoff → project) and a "Community Potluck"
circuit (budget knob + RSVPs threshold + venue signoff → project), each
pre-wired with arrows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 13:15:25 -07:00
Jeff Emmett 614a9fd1cd Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m36s Details
2026-04-03 13:07:16 -07:00
Jeff Emmett 559d146099 feat(rgov): add GovMods landing page and onboarding
Rich landing page with do-ocratic framing, SVG circuit diagram,
"GovMods" branding, modular governance vs monolithic comparison,
and onboarding action. Module now has landingPage function for
bare-domain rendering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 13:07:02 -07:00
Jeff Emmett f375eb1b43 feat(rgov): add rGov governance decision circuit module
Implements 5 new FolkShape web components for visual governance:
- folk-gov-binary: Yes/No signoff gates
- folk-gov-threshold: Numeric progress gates with contributions
- folk-gov-knob: SVG rotary parameter knobs with temporal viscosity
- folk-gov-project: Circuit aggregators (walks arrow graph backward)
- folk-gov-amendment: Modification proposals with approval voting

Also adds "satisfied" gate condition to folk-arrow, 5 AI canvas
tools, module registration, and all canvas.html wiring.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 13:01:08 -07:00
Jeff Emmett 4e40c4bf70 feat(rtime): unified Canvas view — merge Pool + Weave with pan/zoom
CI/CD / deploy (push) Successful in 2m28s Details
Replace 3-tab layout (Pool/Weave/Collaborate) with 2-tab Canvas + Collaborate.
Canvas tab has collapsible left pool panel with orbs alongside infinite SVG
canvas with pan/zoom (ctrl+wheel zoom, wheel pan, space+drag, touch pinch).

- Long-press orb in pool → drag onto canvas to create commitment node
- Drop on matching task port auto-creates wire connection
- Gold glow highlights unfulfilled task ports matching dragged skill
- "Frame as Tasks" button on solver results creates task nodes with
  dashed intent frame on canvas
- Add intentFrameId to Task schema for solver-to-task linkage
- Zoom controls overlay (+/−/reset)
- Light/dark theme support for all new elements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 12:07:23 -07:00
Jeff Emmett 5f45014226 feat(rtime): unified Canvas view — merge Pool + Weave with pan/zoom
Replace 3-tab layout (Pool/Weave/Collaborate) with 2-tab Canvas + Collaborate.
Canvas tab has collapsible left pool panel with orbs alongside infinite SVG
canvas with pan/zoom (ctrl+wheel zoom, wheel pan, space+drag, touch pinch).

- Long-press orb in pool → drag onto canvas to create commitment node
- Drop on matching task port auto-creates wire connection
- Gold glow highlights unfulfilled task ports matching dragged skill
- "Frame as Tasks" button on solver results creates task nodes with
  dashed intent frame on canvas
- Add intentFrameId to Task schema for solver-to-task linkage
- Zoom controls overlay (+/−/reset)
- Light/dark theme support for all new elements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 12:06:58 -07:00
jeffemmett 3ae4a7f3ed Merge pull request 'feat(rcart): add MoonPay with Transak fallback' (#11) from dev into main
CI/CD / deploy (push) Successful in 2m20s Details
2026-04-03 08:23:23 +02:00
Jeff Emmett fab155b411 feat(rcart): add MoonPay integration with Transak fallback
Add MoonPay as the primary card payment provider for rCart. MoonPay
uses HMAC-SHA256 signed URLs (no session API needed, no IP whitelisting).
Falls back to Transak if MoonPay keys aren't configured.

- shared/moonpay.ts: URL builder with HMAC signing, currency mapping
- New /api/payments/:id/card-session endpoint picks provider automatically
- Frontend uses unified startCardPayment() with multi-provider message handling
- Set MOONPAY_API_KEY + MOONPAY_SECRET_KEY to activate

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 06:23:14 +00:00
jeffemmett 8634571090 Merge pull request 'fix: use STAGING for Transak until production gateway resolved' (#10) from dev into main
CI/CD / deploy (push) Successful in 2m20s Details
2026-04-03 07:46:50 +02:00
Jeff Emmett c1e8048089 fix: allow TRANSAK_ENV to be set via Infisical (default STAGING)
Hardcoded PRODUCTION overrode the Infisical value. Use env var with
STAGING default until Transak production gateway auth issue is resolved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 05:46:41 +00:00
jeffemmett 570551658c Merge pull request 'fix: try gateway for Transak token refresh' (#9) from dev into main
CI/CD / deploy (push) Successful in 2m28s Details
2026-04-03 05:58:19 +02:00
Jeff Emmett 125bed3ad7 fix: try gateway for Transak token refresh before legacy API
Production gateway rejects tokens from api.transak.com. Try getting
the access token from the gateway endpoint first (which staging
confirms works), then fall back to the legacy API endpoint.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:58:09 +00:00
jeffemmett 71bfd5c0e8 Merge pull request 'feat: migrate to Transak Secure Widget URL API' (#8) from dev into main
CI/CD / deploy (push) Successful in 2m18s Details
2026-04-03 05:17:28 +02:00
Jeff Emmett e61da960ea feat: migrate to Transak Secure Widget URL API
Transak now requires widget URLs to be generated server-side via their
gateway session API. Direct query-parameter URLs are deprecated.

- Add getAccessToken() with 7-day caching for partner access tokens
- Add createSecureWidgetUrl() that calls the gateway session endpoint
- Falls back to legacy direct URL if gateway returns an error (e.g.
  production IP not yet whitelisted)
- Update rCart and rFlows to use the secure API

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:17:18 +00:00
jeffemmett f3d8e90475 Merge pull request 'fix(rcart): use defaultCryptoAmount for Transak widget' (#7) from dev into main
CI/CD / deploy (push) Successful in 2m19s Details
2026-04-03 05:02:28 +02:00
Jeff Emmett 4f87807438 fix(rcart): use defaultCryptoAmount for Transak widget
Transak rejects `cryptoAmount` when combined with fiatCurrency params.
Use `defaultCryptoAmount` which pre-fills the amount without conflicting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:02:19 +00:00
jeffemmett 31b97a12ab Merge pull request 'fix(rcart): Generate QR button reachable on mobile' (#6) from dev into main
CI/CD / deploy (push) Successful in 2m19s Details
2026-04-03 04:57:02 +02:00
Jeff Emmett f469f3f40d fix(rcart): ensure Generate QR button is reachable on mobile
The payment request form button was cut off on mobile because the shell
uses height:100vh with overflow:hidden on #app. Add padding-bottom to
the .page container so the button scrolls into view within the flex
overflow:auto content area.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:56:53 +00:00
jeffemmett 4690921d9c Merge pull request 'fix: persist docs created via setDoc (payment not found)' (#5) from dev into main
CI/CD / deploy (push) Successful in 2m26s Details
2026-04-03 04:54:24 +02:00
Jeff Emmett d8e954dfb6 fix: persist docs created via setDoc (fixes payment not found)
SyncServer.setDoc() was not calling onDocChange, so documents created
via setDoc (including payment requests) were only stored in memory and
lost on container restart. This caused "Payment request not found"
errors after deploys. Now setDoc triggers the same persistence callback
as changeDoc.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:54:11 +00:00
jeffemmett ee0dd3d741 Merge pull request 'fix(rcart): make payment pages publicly accessible' (#4) from dev into main
CI/CD / deploy (push) Successful in 2m33s Details
2026-04-03 04:34:06 +02:00
Jeff Emmett 19885c98e6 fix(rcart): make payment pages publicly accessible
Payment request URLs (e.g. /rcart/pay/:id) should be accessible without
authentication, even in private spaces. The API endpoints were already
exempted from auth, but the client-side shell gate was redirecting
unauthenticated visitors to the module landing page. Set
spaceVisibility="public" on the payment page render to bypass this.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:33:53 +00:00
jeffemmett d13a766c7c Merge pull request 'fix(rcart): use popup for Transak payment in all envs' (#3) from dev into main
CI/CD / deploy (push) Successful in 2m21s Details
2026-04-03 04:26:47 +02:00
Jeff Emmett 3c801aecaf fix(rcart): use popup for Transak in all environments
Transak production also sends X-Frame-Options: SAMEORIGIN, blocking
iframe embeds. Switch to popup window for all environments, not just
staging. Show "payment opened in new window" status with re-open button.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:26:30 +00:00
jeffemmett cf3abb9b86 Merge pull request 'fix(rcart): add Transak API key to docker-compose' (#2) from dev into main
CI/CD / deploy (push) Successful in 2m33s Details
2026-04-03 04:07:14 +02:00
Jeff Emmett 1b8fcbdf47 fix(rcart): add Transak API key to docker-compose environment
TRANSAK_ENV was set to PRODUCTION but TRANSAK_API_KEY_PRODUCTION was
missing, causing the Transak session endpoint to return 503. Add the
env var reference so rCart card payments work in production.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:06:57 +00:00
jeffemmett 8327d5b7f8 Merge pull request 'fix(rflows): align Openfort wallet label with flow-service' (#1) from dev into main
CI/CD / deploy (push) Successful in 2m40s Details
2026-04-03 03:59:40 +02:00
Jeff Emmett 8c349d2003 fix(rflows): align Openfort wallet label with flow-service
Use `user-${email}` instead of raw `email` as the Openfort player label,
matching the flow-service convention. Openfort rejects colons in labels,
and both codepaths must use the same format so users get the same wallet
regardless of whether they on-ramp via rfunds.online or rspace.online.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 01:59:24 +00:00
Jeff Emmett 570bfa95cb Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m43s Details
2026-04-02 16:21:09 -07:00
Jeff Emmett 6364eb8deb feat(shell): add Request Access button and Go to My Space fallback on access gate
When a logged-in user visits a private space they don't have access to,
the gate now shows a "Request Access" button (calls POST /api/spaces/:slug/access-requests)
and a "Go to {username}'s Space" secondary link. Handles already-pending (409) gracefully.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 16:20:56 -07:00
Jeff Emmett a73746bec3 Merge branch 'dev'
CI/CD / deploy (push) Waiting to run Details
2026-04-02 16:05:25 -07:00
Jeff Emmett 1cdbce0bcc fix(shell): update space-switcher on landing pages to show user's space or demo
Landing, module-landing, and sub-page-info pages showed a stale "Spaces"
dropdown. Now checks encryptid_session and sets the switcher to
{username}'s Space (logged in) or demo (logged out).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 16:05:14 -07:00
Jeff Emmett 2c3f8568a3 fix: use subdomain format {space}.rspace.online instead of path-based routing
Space creation popup slug field now shows input followed by .rspace.online
suffix instead of rspace.online/ prefix. Also fixes rtasks notification
link and browser extension help text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 15:16:07 -07:00
Jeff Emmett 666130954c fix: use subdomain format {space}.rspace.online instead of path-based routing
Space creation popup slug field now shows input followed by .rspace.online
suffix instead of rspace.online/ prefix. Also fixes rtasks notification
link and browser extension help text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 15:16:02 -07:00
Jeff Emmett f60e4683d5 ci: retrigger pipeline
CI/CD / deploy (push) Waiting to run Details
2026-04-02 15:11:43 -07:00
Jeff Emmett 52e2f77383 feat(canvas): add clipboard interop for tldraw/Excalidraw/JSON paste + Ctrl+C copy
CI/CD / deploy (push) Waiting to run Details
Enable pasting structured shape data from tldraw, Excalidraw, and generic
JSON into the rSpace canvas, with automatic type conversion and viewport
centering. Ctrl+C on selected shapes writes rSpace JSON to clipboard for
round-trip paste or external consumption.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 15:08:55 -07:00
Jeff Emmett 87bafc9d74 feat(rtime): port 14 missing hcc-mem-staging features to rTime module
- Connection & exec state persistence (POST /api/connections, PUT exec-state)
- Exec step detail forms for all 5 types (venue, comms, notes, prep, launch)
- Step state machine fix: click to expand/collapse, action button to complete
- Task editor links field with dynamic add/remove and server persistence
- Cyclos-aware launch handler with fallback to demo celebration
- Fix dead EXEC_STEPS[taskId] lookup, auto-place first task on empty canvas
- DID display truncation for unreadable DIDs in intent routes
- Dark/light theme toggle with localStorage persistence
- Hex hover stroke, commitment description in hex nodes, edit pencil on tasks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 15:08:43 -07:00
Jeff Emmett 5b4300db77 fix(ipfs): correct Kubo container hostname (collab-server-ipfs-1)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 15:06:05 -07:00
Jeff Emmett 789b74a776 ci: retrigger pipeline
CI/CD / deploy (push) Waiting to run Details
2026-04-02 15:05:16 -07:00
Jeff Emmett ca756b22aa Merge branch 'dev' 2026-04-02 14:28:19 -07:00
Jeff Emmett 1672477f68 feat(ipfs): add IPFS integration for backups and generated files
Pin encrypted backups and AI-generated files to Kubo (ipfs.jeffemmett.com)
as fire-and-forget redundancy. Filesystem remains primary storage — IPFS
failures are logged and swallowed. Adds /api/ipfs routes for status,
pin/unpin, and gateway proxy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 14:24:39 -07:00
Jeff Emmett c716723686 Merge branch 'dev'
CI/CD / deploy (push) Failing after 21m52s Details
2026-04-02 14:07:10 -07:00
Jeff Emmett 4b2592c27f fix(rinbox): handle IMAP socket errors to prevent server crash-loop
ImapFlow clients were created without .on('error') handlers. Socket
timeouts emitted unhandled errors that crashed the entire process,
taking down all 32 modules. Added error handlers to all 3 ImapFlow
instantiation sites and a process-level uncaughtException/unhandledRejection
safety net.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 13:50:45 -07:00
Jeff Emmett 83ae2e9bd9 Merge branch 'dev'
CI/CD / deploy (push) Successful in 6m9s Details
2026-04-01 15:54:15 -07:00
Jeff Emmett 14f7ccb090 fix(scribus): add healthcheck override for scribus-novnc
The Dockerfile's healthcheck hit a nonexistent /health endpoint, causing
permanent "unhealthy" status. Override with a check that accepts any HTTP
response (including 401) as proof the service is running.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 15:21:30 -07:00