Commit Graph

1522 Commits

Author SHA1 Message Date
Jeff Emmett 94964dfe88 ci: use internal registry (bypass Cloudflare upload limit)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:46:14 -07:00
Jeff Emmett f0fc60e6d5 ci: add Gitea Actions CI/CD pipeline
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:32:14 -07:00
Jeff Emmett 1dcc3ff0a1 Fix SVG dataset crash and 403 on intent API
- Remove `dataset = {}` assignment on SVG circle element (read-only
  property on SVGElement, causes TypeError crash on every render)
- Add authHeaders() helper using encryptid-token from localStorage
- Include Authorization header on all mutating intent API calls
  (create, solver/run, accept, reject)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 23:17:14 -07:00
Jeff Emmett 2907935c50 fix(rtime): use getApiBase() for subdomain-compatible URL routing
Replace all hardcoded /${space}/rtime paths with getApiBase() which
derives the correct API base from window.location.pathname. This
supports both subdomain routing (demo.rspace.online/rtime) and
path-based fallback (/demo/rtime).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 22:46:33 -07:00
Jeff Emmett 08cae267fe feat(rtime): add intent-routed resource-backed commitments
Integrate Anoma-style intent routing into rTime so that commitments
become resource-backed intents that a solver can compose into multi-party
collaboration recommendations.

New modules:
- schemas-intent.ts: Intent, SolverResult, SkillCurve, Reputation types + 4 CRDT doc schemas
- solver.ts: Mycelium Clustering algorithm (bipartite graph matching, VP filtering, scoring)
- settlement.ts: Atomic settlement via saga pattern with escrow confirm/rollback
- skill-curve.ts: Per-skill bonding curve (demand/supply pricing)
- reputation.ts: Per-skill reputation scoring with time-based decay
- intent-routes.ts: 10 Hono API routes (intent CRUD, solver, settlement, curves, reputation)

Modified:
- schemas.ts: Added intentId/status fields to Commitment
- mod.ts: Registered 4 new docSchemas, mounted intent routes, added Collaborate output path
- folk-timebank-app.ts: Added Collaborate tab with intent cards, solver results panel,
  accept/reject buttons, create intent modal, skill price display, and status rings on pool orbs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 22:36:06 -07:00
Jeff Emmett 16fe8f7626 Fix rSheet: remove space slug from URL paths
Space context comes from subdomain routing, not URL path segments.
Fix appUrl, externalApp.url, and onboardingActions.href to use
subdomain-compatible paths without {space} prefix.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 20:19:17 -07:00
Jeff Emmett 9a45b19435 Add rSheet module — collaborative spreadsheets via dSheet
- New module at modules/rsheet/mod.ts using externalApp pattern
- Embedded Y.js-backed spreadsheet grid with real-time sync
- Connects to shared y-websocket server for collaboration
- Registered in server/index.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:25:36 -07:00
Jeff Emmett 0a4ee86976 fix(rpubs): move format selector from toolbar to write step bottom bar
Remove "Digest" format dropdown from the editor toolbar header. Move format
selector into the write step bottom bar as a clickable badge with dropdown.
Fix CSS bug where dropdown panels with display:flex overrode the HTML hidden
attribute, causing a visible rectangle artifact.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:44:09 -07:00
Jeff Emmett 1ee14b7520 fix(rcal): consistent viewport sizing + touch pinch-zoom fix
Make calendar views fill a consistent ~60vh area across all zoom levels
(month/season/year/multi-year) using flex stretching. Fix touch pinch-zoom
by removing pinch-zoom from touch-action so our pointer handler fires
instead of native page zoom.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:26:52 -07:00
Jeff Emmett 1ad721a579 chore(backlog): add TASK-MEDIUM.6 connections dashboard task
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 15:56:35 -07:00
Jeff Emmett 32093a0fc3 refactor(connections): move from space settings to user account
Connections are per-user, not per-space. Move the platform connections
dashboard from the space settings modal (5th tab) to the My Account
modal as a collapsible section. Add selective sharing: users connect
platforms to their personal data store, then choose which community
spaces to share data into via per-provider space checkboxes.

New endpoints: GET/POST /api/oauth/sharing for per-user sharing config.
Sharing config stored as Automerge doc {userSpace}:oauth:sharing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 15:52:15 -07:00
Jeff Emmett bed124f869 feat(infra): add ollama to on-demand sidecar lifecycle
Ollama now starts on API request and stops after 5min idle, saving
~5-6GB RAM when not in use. Part of server-wide resource caps rollout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 14:26:23 -07:00
Jeff Emmett dbfddb2fb5 feat(infra): on-demand sidecar lifecycle + resource caps
KiCad, FreeCAD, and Blender sidecars now start on API request and stop
after 5min idle, saving ~8GB RAM when not in use. Docker socket mounted
into rspace container for container lifecycle control. Memory/CPU limits
added to all services to prevent runaway resource consumption.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 13:29:42 -07:00
Jeff Emmett 26aa6433be feat(connections): add platform connections dashboard in space settings
New "Connections" tab in space settings with n8n-style visual dashboard
showing platform cards (Google, Notion, ClickUp live + 7 coming soon)
connected via SVG bezier lines to central rSpace hub node. Includes
OAuth connect/disconnect flows and GET /api/oauth/status endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 13:04:02 -07:00
Jeff Emmett eec88ac661 fix(flipbook): use <img> elements instead of background-image for page rendering
background-image data URLs on divs can fail silently in StPageFlip's
shadow DOM context, producing white pages. Switch to <img> elements
with explicit pixel dimensions and object-fit:cover for reliable
rendering. Add white background to .stf__item as a safety net.
Applies to both folk-pubs-flipbook and folk-book-reader.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 13:02:28 -07:00
Jeff Emmett 6ce8ede568 fix(rmeets): bump JS cache version to bypass stale CF 301 redirect
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 12:48:05 -07:00
Jeff Emmett bb31bd33c2 fix(routing): prevent /modules/ path from being redirected as a space slug
The subdomain canonicalization logic treated "modules" as a space slug,
redirecting /modules/rmeets/... to modules.rspace.online/rmeets/... (503).
Add "modules" to the serverPaths exclusion set so module JS assets
served from /modules/ are handled by Hono instead of redirected.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 12:26:23 -07:00
Jeff Emmett 0a6dcef4b9 feat(blender): pan/zoom viewer for rendered images
Rendered 3D images now center-fit on load and support:
- Mouse wheel zoom (toward cursor)
- Click-drag pan (mouse, pen, touch)
- Pinch-to-zoom (multi-touch)
- Double-click to reset view
- Reset button on hover

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 12:22:20 -07:00
Jeff Emmett bb19b4bc89 fix: consolidate PWA banners — install in browser, update in PWA only
Remove duplicate purple update banner from website/shell.ts that overlapped
with the server/shell.ts banner. Now a single banner system:
- Browser: "Install rSpace app" prompt (via beforeinstallprompt)
- Installed PWA: "New version available" prompt (via SW update detection)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 12:09:59 -07:00
Jeff Emmett 26c07a7672 fix(layout): restore flex chain for tab panes after TabCache.init()
TabCache.init() wraps all #app children into a .rspace-tab-pane div,
breaking the flex layout introduced in 2cbff89. Make active panes flex
columns so subnav/tabbar/rapp-content flex properties are respected.
Wrap fragment-loaded content in .rapp-content for consistent scrolling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 11:57:47 -07:00
Jeff Emmett 0519e113b6 refactor(rmeets): remove /room/ prefix from meeting URLs
/rmeets/jeff now opens a room directly instead of requiring /rmeets/room/jeff.
Catch-all /:room route registered last so /meet, /recordings, /search still work.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 11:17:42 -07:00
Jeff Emmett 7faaa5c977 chore(backlog): add phase-0 milestone and tasks 126–139
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 11:12:05 -07:00
Jeff Emmett 5bc64a5b4e fix(touch): pointer event parity for slash commands, collab overlay, canvas, and wallet charts
Convert remaining mouse-only event listeners to Pointer Events so touch
and pen inputs work identically to mouse across rApps and canvas:

- rnotes slash-command: mousedown/mouseenter → pointerdown/pointerenter
- collab overlay: mousemove → pointermove for cursor broadcast, click → pointerdown for collab-id tracking
- canvas.html: toolbar label reveal gated behind @media (hover: hover), :active fallbacks on 12 button selectors, JS mouseenter/mouseleave → pointerenter/pointerleave
- wallet-viz D3 charts: all mouseover/mousemove/mouseout → pointerenter/pointermove/pointerleave on transaction paths, balance area, Sankey links, and reset button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 11:06:44 -07:00
Jeff Emmett 690e4dedb4 refactor: consolidate space settings — both gear icons open same tabbed modal
Remove rstack-space-settings slide-out panel. Enhance the existing tabbed
modal in rstack-space-switcher with add-member (username search + email
invite) and pending email invites (with revoke). Header gear now calls
openSettingsModal() on the space switcher instead of toggling the old panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:58:30 -07:00
Jeff Emmett 2cbff8925d fix(layout): viewport-filling rApp layout — eliminate body scroll
Make #app a flex column with height:100vh so all rApps fill the viewport
exactly. Wrap module body in .rapp-content flex child. Replace all
hardcoded calc(100vh - Npx) with height:100% across 20+ components.
Remove sticky positioning from subnav/tabbar (now flex items).
Generalize mobile body-flex to all pages (not just canvas-layout).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:57:09 -07:00
Jeff Emmett 0a21caa5e5 feat(pwa): install banner + update notification for service worker
- Install banner appears above header when beforeinstallprompt fires
  (dismissed state persisted in localStorage, never shows again)
- Update banner appears when a new SW version is detected waiting
  (click "Update" → SKIP_WAITING message → SW activates → page reloads)
- SW no longer auto-skipWaiting on install; waits for client message
- Bumped SW cache version to v5 and registration to ?v=5
- Banner CSS: fixed at top, z-index above all chrome, slide-in animation
- Header/tab-row/app offsets adjust when banner visible

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:40:07 -07:00
Jeff Emmett 7d5209021a feat(rnotes): web clipper download, URL/file note creation from sidebar
- Copy browser extension into repo so /extension/download works in Docker
- Add "Web Clipper" button to sidebar footer
- Replace simple "+" with context menu: New Note / From URL / Upload File
- BOOKMARK notes from URL, IMAGE/AUDIO/FILE notes from uploaded files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:37:13 -07:00
Jeff Emmett 24c1598e60 fix: contain MI bar z-index within header stacking context on mobile
On desktop the header is position:fixed which creates a stacking
context, containing the MI bar's z-index:10001. On mobile the header
switches to position:sticky without z-index, so no stacking context
is created and the MI bar's z-index leaks out above the tab row
(z-index:9998). Fix by adding z-index:9999 to the header on mobile.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:32:36 -07:00
Jeff Emmett 6c7c00dc95 fix: hide MI bar on mobile to prevent overlap with rApp tab row
The MI bar (header center section) was wrapping to a full-width
third row on mobile, overlapping the rApp slider tab bar below it.
Hide both the MI bar and its header container on mobile. Users can
still access MI via Cmd+K or the floating pill.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:27:33 -07:00
Jeff Emmett 7888596623 refactor(shell): move minimize chevron from tab row to subnav bar
The minimize toggle now lives at the right edge of each rApp's subnav
bar instead of the tab row. When minimized, both header and tab row
slide up and the subnav becomes a thin fixed strip with just the
restore chevron. Every rApp already has a subnav (except canvas which
has its own chrome).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:23:42 -07:00
Jeff Emmett f6767ca841 fix(rnotes): add /transcripts route for sub-tab navigation
The Transcripts sub-tab pill in the rNotes header linked to
/{space}/rnotes/transcripts but no route existed. Add the route
serving the voice recorder/transcription app.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:21:57 -07:00
Jeff Emmett c82646c458 feat: settings gear shows members first, comment bell gets dropdown panel
Settings panel now shows Members + Add Member sections at the top
regardless of which rApp is active, making invite/membership the
primary action. Comment bell replaced with a dropdown panel showing
all comment threads sorted by recency, with a "New Comment" button
to enter pin-placement mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:16:30 -07:00
Jeff Emmett 0c83a8257c fix: enable presence and collab sync for demo space users
Remove the demo exclusion guard so demo space gets the full offline
runtime, WebSocket presence relay, and Automerge sync.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:04:25 -07:00
Jeff Emmett 34f0387c88 fix(rmaps): bump JS cache version + add demo debug logs
Bump folk-map-viewer.js?v=6 → v=7 to bust Cloudflare cache.
Add console logs to trace demo marker creation flow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:00:16 -07:00
Jeff Emmett 6b6646af1a fix: add space-switcher dropdown to main landing page header
The rspace.online root page was missing the rstack-space-switcher
component that all other pages (module pages, space dashboard,
module landing pages) already include in their headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 09:58:07 -07:00
Jeff Emmett 3be0fb6eed fix: collab overlay stuck on 'Connecting' in demo/standalone pages
The offline runtime is not created for demo space (spaceSlug==="demo"),
so the collab overlay polled forever waiting for it. Now gives up after
~10s and transitions to connected state for standalone display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 09:55:23 -07:00
Jeff Emmett 81d8102f69 feat(tours): add guided tour links to 7 landing pages and startTour() to 5 components
Landing pages now consistently include "Start Guided Tour →" in the
hero CTA area. Components that already had internal tours (rbnb, rvnb,
rsplat) get a public startTour() wrapper; rtime and rmeets get full
TourEngine integration with contextual steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 09:33:11 -07:00
Jeff Emmett 636360ce5f fix(rpubs): fix flipbook white screen and align flow with /press landing
- Flipbook: wrap async initFlipbook in try-catch with scroll fallback,
  add 500ms verification timeout for silent StPageFlip failures, quote
  data URLs in background-image, expand shadow DOM CSS coverage
- Flow: rename steps Create/Preview/Publish → Write/Press/Print to
  match rpubs.online/press landing page description
- Routes: add /press editor route, bump script cache to v=3
- Publish panel: fix getEditorContent() reading from cached content
  instead of missing textarea (not rendered during print step)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:52:24 -07:00
Jeff Emmett 1cc083a655 feat(rmaps): replace SVG demo with real MapLibre GL festival meetup
The demo previously showed a static SVG world map with 6 hardcoded print
providers — completely different from the real app. Now shows a real
MapLibre GL map with 5 animated participants, 4 waypoint pins, a route
line, and the full app UI (header, sidebar, controls, mobile bottom sheet).
Visitors see exactly what the product looks like.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:47:02 -07:00
Jeff Emmett b5c6477f47 feat(rtime): add timebank commitment pool & weaving dashboard rApp
Port hcc-mem-staging SPA into rSpace as the rTime module. Canvas-based
commitment pool with physics orbs, SVG weaving editor with hex nodes
and bezier wires, execution panel, and optional Cyclos timebank proxy.
Automerge CRDT persistence, demo seeding, and full landing page
explaining community-based ledgers and emergent collaboration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:42:49 -07:00
Jeff Emmett 36ae954da4 feat(shell): add header minimize toggle for more viewport space
Adds a [^] chevron button at the right end of the tab row that collapses
all header bars into a thin 24px restore strip. State persists via
localStorage across page reloads. Works on both desktop (fixed) and
mobile (sticky) layouts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:35:12 -07:00
Jeff Emmett 7fec0cb699 fix: deduplicate online user count by username
Same user with multiple tabs/connections (different peer IDs) was
counted multiple times. Now deduplicates by username, keeping the
most recently seen entry per user for badge count and panel display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:27:35 -07:00
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