Commit Graph

1620 Commits

Author SHA1 Message Date
Jeff Emmett 4822f0858a fix(rtasks): bump JS cache version to v5 for new frontend features
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:53:25 -04:00
Jeff Emmett eeab84e588 feat(rtasks): add detail panel, column management, search/filter, drag polish
- Task detail slide-out panel with inline editing of all fields
- Column/status management via gear icon (add, remove, rename, reorder)
- Search & filter bar with text search, priority dropdown, label click filter
- Enhanced task cards with description preview, due date badge, delete hover
- Drag polish with rotation/scale transform on dragging cards
- Empty drop zones always visible with green highlight on drag-over
- Escape key closes detail panel and column editor
- Individual field saves on blur/change (no full re-render flicker)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:49:58 -04:00
Jeff Emmett c590bacc40 fix(rtasks): add auth headers to all API calls + canvas toolbar to bottom-right
rtasks fetch calls were missing Authorization Bearer headers, causing 401s
on private/permissioned spaces. Added authHeaders() helper using encryptid-token
from localStorage (matching pattern in folk-feed, folk-multisig-email, etc.).

Also includes: due date field, task detail panel, search/filter, column editor,
board PATCH endpoint, and canvas toolbar repositioned to bottom-right corner
(collapsed wrench icon on all screen sizes, panel opens leftward).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:42:16 -04:00
Jeff Emmett a76a6a9f6e feat(rcal): add semantic zoom for map and calendar views
Map markers now aggregate by continent/country/city based on spatial
zoom level instead of always showing individual dots. Calendar views
(year, season, multi-year, month) show zoom-aware spatial labels.
New geo-hierarchy.ts provides offline continent/country lookup from
coordinates with breadcrumb generation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:40:08 -04:00
Jeff Emmett 75c230eabe fix(rmeets): correct Jitsi API config and auto-join room from URL slug
Fix configOverwrite/interfaceConfigOverwrite property names (were
configOverrides/interfaceConfigOverrides — silently ignored by Jitsi).
Disable pre-join lobby so rooms render immediately. Add error handling
for script load failures. Use external_api.min.js to match component.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:24:15 -04:00
Jeff Emmett 13410dd3e7 fix(rmeets): default room view to clean full-screen Jitsi without shell
Swap default /:room route to serve minimal full-screen Jitsi (previously
required ?minimal=1). Shell mode now opt-in via ?shell=1 or director mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:11:05 -04:00
Jeff Emmett 391d3a0cb6 feat(rflows): port distributed mortgage simulator from rfunds-online
Replaces the simple lending pool dashboard at /mortgage with the full
rfunds-online mortgage simulator. Models community-funded mortgages with
80+ tranches, variable terms, reinvestment loops, secondary markets,
and 5 visualization modes (Network, Flow, Grid, Lender calc, Borrower calc).

New files:
- mortgage-types.ts & mortgage-engine.ts (pure TS, copied verbatim)
- folk-mortgage-simulator.ts (1639-line web component, all views)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:10:59 -04:00
Jeff Emmett 8321a9015a revert: restore app switcher to left sidebar
Reverts 4420d9c — the FAB change was applied to the wrong component.
The intended target is the rSpace canvas toolbar, not the app switcher.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:05:38 -04:00
Jeff Emmett f26f7e14bd fix(sw): bump cache version to v6 to flush stale cached 301 redirect
The old service worker cached the root URL (/) as a 301→/rcal during
the standaloneDomain misconfiguration. Bumping the SW cache version
forces a full cache purge on next activation, clearing the stale
redirect for all users.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 12:39:36 -04:00
Jeff Emmett 6c1298b796 fix(routing): prevent cached 301 redirects on root and standalone domains
Root route now sends no-cache headers to bust stale 301s from the
rcal standaloneDomain mishap. Standalone domain redirects changed from
301 (permanent/browser-cached) to 302 (temporary) so misconfiguration
can never stick in user browsers again.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 12:27:53 -04:00
Jeff Emmett c037e13423 feat(rmeets): minimal mode for clean meeting links without rSpace shell
Add ?minimal=1 query param that renders a full-screen Jitsi meeting
page without the rSpace header, tab bar, or module chrome. Used by
scheduled meeting links so guests get a clean, direct video call
experience. Includes prejoin screen, all standard Jitsi controls,
and auto-closes the tab when the meeting ends.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 01:24:31 +00:00
Jeff Emmett 7e07170304 fix: ranking drag-drop, spider slider drag, video gen timeout & progress
- Ranking: replace broken :hover drop-target with getBoundingClientRect hit testing
- Spider: add #isSliding guard to prevent slider destruction during drag
- Video gen: bump timeout to 10min, show real fal.ai queue position/status
- Fix NotificationCategory type to include 'payment' in db.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 16:03:58 -04:00
Jeff Emmett 4420d9cafe feat(shell): move app switcher from left sidebar to bottom-right FAB
Repositions the rApp switcher as a floating action button in the bottom-right
corner that expands upward into a rounded panel. Removes all sidebar push-offset
CSS since the panel now overlays content without layout shift.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 15:59:36 -04:00
Jeff Emmett 15ca1868b0 fix(rcal): fix calendar view layout bugs — uneven day widths, event overlap, duplicate detail
- Change grid-template-columns from repeat(7, 1fr) to repeat(7, minmax(0, 1fr)) to prevent
  content from stretching day cells unevenly
- Add computeEventColumns() helper using greedy interval-coloring algorithm with per-cluster
  column counts for tiling overlapping events side-by-side
- Apply sub-column layout to day view, week view, and horizontal day view so concurrent events
  no longer render on top of each other
- Guard duplicate day detail rendering when expanded day is at end-of-row or last day of month

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 15:24:30 -04:00
Jeff Emmett e4a0ccd80b feat(rtime): add gas tank fuel gauge and mycelial auto-connect suggestion
Replace thin 4px progress bar on task nodes with a prominent 12px fuel
gauge showing committed (green) + proposed (amber) hours vs total needed.
When an orb is dropped on open canvas, auto-find nearest unfulfilled task
and show a pulsing preview wire with confirm/dismiss buttons — human
approval required before creating the connection.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 15:13:54 -04:00
Jeff Emmett a43bc3b3ee fix: make profile dropdown buttons clickable (pointerdown→click)
pointerdown on document was hiding the dropdown before click could fire
on My Account / My Spaces / My Wallets buttons. Switching to click lets
stopPropagation in item handlers prevent premature close.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 14:29:20 -04:00
Jeff Emmett 9897bf6517 fix(rcal): revert standaloneDomain to rcal.online — rspace.online hijacked all traffic
Setting standaloneDomain to "rspace.online" caused the domain→module redirect
system to treat ALL rspace.online traffic as rcal, redirecting / to /rcal.
The correct value is "rcal.online" which redirects old rcal.online → rspace.online/rcal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 19:25:14 -04:00
Jeff Emmett b1c54a6e66 fix: update rCal landing, de-spam info popups, fix stale URLs & banner persistence
- rCal landing: strip inline style overrides, use standard rl-* CSS classes
- rCal mod: update standaloneDomain from rcal.online to rspace.online
- Info popup: change from per-rApp auto-show to global one-time auto-show
- Update banner: track dismissal in sessionStorage so it stops re-showing
  on every page load within the same session (likely the "persistent banner")
- rpubs landing: fix stale rcart.online URLs → demo.rspace.online/rcart

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 19:14:27 -04:00
Jeff Emmett efb7ee5600 fix(rexchange): add demo seeding and server-rendered order book page
Replace missing folk-exchange-app.js with server-rendered HTML order book.
Seed 8 demo intents, 2 trades, and 5 reputation records on startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:57:59 -04:00
Jeff Emmett bf8e11d426 feat(rexchange): add P2P crypto/fiat exchange module with escrow & reputation
Community members post buy/sell intents for CRDT tokens (cUSDC, $MYCO, fUSDC)
against 8 fiat currencies. Bipartite solver matches intents every 60s. Escrow
via token-service burn/mint trio. Reputation scoring with badges. 14 API routes,
canvas shape with physics orbs, and landing page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-04 18:32:16 -04:00
Jeff Emmett 7f98dfcdb1 fix: load persisted docs before module onInit to prevent re-seeding
Module onInit functions (rvote, rtasks, rcal, etc.) call seedDemoIfEmpty
which checks the sync server for existing docs. Previously onInit ran
as an IIFE before loadAllDocs completed, so it always found empty docs
and re-seeded demo data — overwriting user deletions/changes. Now
onInit runs inside the loadAllDocs .then() chain, ensuring persisted
data is loaded before any seed checks run.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 04:05:51 +00:00
Jeff Emmett df8901c975 feat(rgov): clickable signoff gates with authority check + project recalc
Binary signoff nodes now have a clickable checkbox that toggles
satisfied state. Checks EncryptID JWT for authority (assignee match),
falls back to allowing anyone in demo mode. Toggling a signoff
auto-recalculates connected project aggregator gate counts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 02:07:13 +00:00
Jeff Emmett ba7a5733b8 fix(rgov): mobile-friendly canvas with collapsible sidebars and touch support
- Collapsible palette sidebar (hamburger toggle, hidden by default on mobile)
- Pinch-to-zoom and two-finger pan for touch/pen
- Larger touch targets for ports and zoom controls
- Responsive text sizing and compact toolbar on small screens
- Detail panel goes full-width on very small screens
- touch-action: none on SVG to prevent browser gesture conflicts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 02:04:52 +00:00
Jeff Emmett 2e2fbae8bf feat(rgov): standalone n8n-style GovMod circuit canvas
Add <folk-gov-circuit> component with interactive SVG canvas pre-loaded
with 3 demo governance circuits. 8 node types (signoff, threshold, knob,
project, quadratic, conviction, multisig, sankey) with pan/zoom, node
dragging, Bezier wiring, palette sidebar, and detail panel. Compatible
with rspace canvas shape types for rapplet integration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:55:52 +00:00
Jeff Emmett 5b4ab00a2d fix(rgov): render canvas directly instead of redirecting to /rspace
The rgov module page was showing a static description with a link to
/rspace. Now it renders the actual canvas (same as rspace module) with
moduleId="rgov" so GovMod shapes display inline at /rgov.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:41:08 +00:00
Jeff Emmett 0e2eebf890 feat(encryptid): add wallet lookup + payment notification APIs
Add internal endpoints for payment infrastructure integration:
- GET /api/internal/user-by-wallet — resolve wallet to email/username
- POST /api/internal/notify — trigger in-app notifications by wallet/DID
- Add 'payment' notification category and payment_sent/received event types

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:28:33 +00:00
Jeff Emmett d1a9fc338d feat(rtime): add external time logs API and fulfillment dashboard
Add ExternalTimeLog schema and REST endpoints for ingesting time entries
from backlog-md CLI. Auto-creates commitments, links to existing tasks,
and supports solo settlement with reputation/skill curve updates.

New Fulfillment dashboard tab shows time logs, skill totals with progress
bars, and inline settle buttons. Export-to-backlog endpoint enables
importing rTime tasks into local backlog.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 17:38:08 -07:00
Jeff Emmett b3d6f2eba8 feat(rgov): add quadratic, conviction, multisig & sankey GovMods
Four new governance circuit shapes for delegated democracy:
- folk-gov-quadratic: weight transformer (sqrt/log/linear dampening)
- folk-gov-conviction: time-weighted conviction accumulator (gate/tuner modes)
- folk-gov-multisig: M-of-N multiplexor gate with signer management
- folk-gov-sankey: auto-discovered governance flow visualizer with animated SVG

Registered in canvas-tools (4 AI tool declarations), index exports,
mod.ts (shapes, tools, types, seed Circuit 3), folk-gov-project
(recognizes new types), and landing page (Advanced GovMods section).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 17:03:39 -07:00
Jeff Emmett 5f2b3fd8d1 fix(rcart): streamline Transak widget — skip exchange screen, auto-fill user data
Added hideExchangeScreen, isAutoFillUserData, and paymentMethod params
to both Transak endpoints. This skips the initial exchange screen (we
already provide all required fields) and auto-fills email for Lite KYC,
reducing friction for small transactions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 16:04:59 -07:00
Jeff Emmett 42546c9a63 fix: use internal mailcow relay (port 25) for all SMTP transports
SMTP auth on port 587 was broken across all modules due to stale
credentials. Since rspace is on the mailcow Docker network, all 6
SMTP transports now use unauthenticated relay on port 25 when the
host is the internal postfix container. Fixes emails for: payment
receipts, space invitations, inbox approvals, agent notifications,
scheduled emails, and publication sharing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 15:12:42 -07:00
Jeff Emmett 4919ca1021 fix(rcart): use port 25 internal relay for payment emails
SMTP auth credentials were stale, causing all payment confirmation
emails to silently fail. Since rspace is on the mailcow Docker network,
use unauthenticated relay on port 25 instead of port 587 with auth.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 15:06:57 -07:00
Jeff Emmett 55067729b1 fix(rcart): graceful server-side page for paid/expired/cancelled payments
When a payment request is in a terminal state (paid, confirmed, expired,
cancelled, filled), the /pay/:id route now renders a static HTML page
with a clear message instead of loading the full JS component. Prevents
"corrupted content error" and shows a friendly "already paid" message.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:58:35 -07:00
Jeff Emmett f9dc06394c fix(rcart): force Transak dark mode with colorMode param
Text inputs were rendering in light mode making text invisible against
the dark background. Added colorMode: 'DARK' to both Transak widget
endpoints.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:52:28 -07:00
Jeff Emmett 15990cc147 fix(rcart): infer Transak fiat amount from crypto amount for stablecoins
When fiatAmount wasn't explicitly set on a payment request, Transak
defaulted to 300 USD. Now for USDC/USDT/DAI/cUSDC, the fiat amount
is inferred from the crypto amount (1:1 peg) so the widget opens with
the correct payment amount.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:48:48 -07:00
Jeff Emmett 4d06156e5f fix(rtime): scale commitment orbs relative to basket size
Orb radius now uses 8-15% of basket radius with sqrt(hours) scaling
instead of fixed pixel sizes (18+hours*9). Prevents orbs from being
oversized on small baskets or undersized on large ones. Hover expansion
also scales proportionally (15% instead of fixed 5px).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:41:05 -07:00
Jeff Emmett 0337797b7c fix(rtime): enable touch drag for commitment pool orbs on mobile
Add touch-action:none on canvas and preventDefault on pointerdown to
prevent the browser from claiming touch events for scroll/pan gestures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:35:45 -07:00
Jeff Emmett d4612d6fb8 fix(ascii-gen): handle raw HTML response from ascii-art service
The ascii-art service returns raw HTML, not JSON. Wrap response in
{html, text} JSON envelope and strip tags for plain text version.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:31:22 -07:00
Jeff Emmett 46c326278a feat: ASCII art canvas tool, video gen fixes, scribus/notebook sidecars
- Add folk-ascii-gen canvas shape with pattern/palette selectors
- Add POST /api/ascii-gen proxy to ascii-art service
- Register create_ascii_art in canvas tools + triage panel
- Fix WAN 2.1 t2v endpoint URL (fal-ai/wan/v2.1 → fal-ai/wan-t2v)
- Convert video gen to async job queue (avoids Cloudflare timeouts)
- Fix Docker API Content-Type bug in sidecar-manager
- Convert scribus-novnc and open-notebook to on-demand sidecars
- Add ensureSidecar("scribus-novnc") to rDesign bridge proxy
- Fix Hono ContextVariableMap and handleTransakMessage type errors

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:25:48 -07:00
Jeff Emmett 801de38b4a feat(rtime): commitment splitting, pool removal & approval workflow
When dragging a commitment to a task, hours are now split (min of
available, needed), the pool orb shrinks or disappears, and
connections track proposed/committed status with approve/decline UI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 14:20:48 -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 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 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 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
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
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
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
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