Commit Graph

1724 Commits

Author SHA1 Message Date
Jeff Emmett 9a0ebedf69 Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m25s Details
2026-04-10 11:19:40 -04:00
Jeff Emmett 8887e18dda fix: rename rsheet module to rsheets (fixes missing module crash)
The rsheet→rsheets rename was partially applied - server/index.ts
imported rsheets/mod but the files still lived at rsheet/. This
caused a crash on startup: "Cannot find module '../modules/rsheets/mod'".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 11:19:32 -04:00
Jeff Emmett 5e204df357 Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m51s Details
2026-04-10 11:15:15 -04:00
Jeff Emmett 1de038eeab feat(comments): spatial comment pins on all rApp module pages
Adds Figma-style threaded comment markers anchored to data-collab-id
elements across all module pages. Comments stored in per-space Automerge
doc, synced via existing local-first stack. Bell is now context-aware
(canvas pins on canvas, module pins on module pages). Notifications
route through existing WS/push/email system with new module_comment
and module_mention event types.

New files: module-comment-types, module-comment-schemas,
rstack-module-comments component. Updated: shell, comment bell,
notification routes. Added data-collab-id to crowdsurf, rtime, rmeets.
Fixed pre-existing SKILL_LABELS import error in rtime/mod.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 11:15:05 -04:00
Jeff Emmett 0fa3582c73 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m51s Details
2026-04-10 10:34:21 -04:00
Jeff Emmett f0039bcb7c fix(mcp): add untracked rchats + rsheet schema files
These schemas are imported by the MCP tool files and module mod.ts
but were never committed, causing a crash on deploy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 10:34:12 -04:00
Jeff Emmett aaebd0c0ad Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m29s Details
2026-04-10 10:25:29 -04:00
Jeff Emmett 2e8e702d75 feat(mcp): 101 MCP tools across all 35 rApps + security hardening + MI integration
- Add centralized auth helper (_auth.ts) with resolveAccess() enforcing
  space visibility (public/permissioned/private) and role-based access
- Retrofit 5 existing tool groups (rcal, rnotes, rtasks, rwallet, spaces)
  with resolveAccess gates
- Add 30 new MCP tool files covering all remaining rApps:
  rsocials, rnetwork, rinbox, rtime, rfiles, rschedule, rvote, rchoices,
  rtrips, rcart, rexchange, rbnb, rvnb, crowdsurf, rbooks, rpubs, rmeets,
  rtube, rswag, rdesign, rsplat, rphotos, rflows, rdocs, rdata, rforum,
  rchats, rmaps, rsheet, rgov
- Add ForMI data exports to all module mod.ts files
- Wire 6 core modules into MI context (mi-data-queries.ts, mi-routes.ts)
- forceAuth for sensitive modules (rinbox, rchats)
- Omit sensitive fields (storagePath, fileHash, bodyHtml) from responses

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 10:25:17 -04:00
Jeff Emmett 2d0ca98ae6 fix(canvas): disabled module gating + toolbar reorganization
CI/CD / deploy (push) Failing after 3m4s Details
- Remove MODULE_BADGES fallback in tab-bar add-menu (show "Loading rApps..." instead of leaking all modules)
- Block ?tool= URL param from spawning shapes for disabled modules
- Add disabled-module overlay on existing canvas shapes (grayed out + "Module disabled" badge)
- Guard newShape() against creating shapes for disabled modules
- Reorganize toolbar from 10 groups to 9 category-aligned groups:
  Write, Embed (core 4), Communicate, Plan, Decide, Spend, Create, AI, Record
- Eliminate duplicate "Connect" groups, slim mega "Embed" group, merge "Travel" into "Plan"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 20:36:25 -04:00
Jeff Emmett 234c8e6703 fix(canvas): disabled module gating + toolbar reorganization
- Remove MODULE_BADGES fallback in tab-bar add-menu (show "Loading rApps..." instead of leaking all modules)
- Block ?tool= URL param from spawning shapes for disabled modules
- Add disabled-module overlay on existing canvas shapes (grayed out + "Module disabled" badge)
- Guard newShape() against creating shapes for disabled modules
- Reorganize toolbar from 10 groups to 9 category-aligned groups:
  Write, Embed (core 4), Communicate, Plan, Decide, Spend, Create, AI, Record
- Eliminate duplicate "Connect" groups, slim mega "Embed" group, merge "Travel" into "Plan"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 20:35:58 -04:00
Jeff Emmett f1f63ca142 feat(rdata): add data membrane visualization to landing page
CI/CD / deploy (push) Successful in 2m57s Details
Add interactive concentric zone visualization showing Personal (encrypted/local),
Permissioned, and Public data membranes. Drag-and-drop objects between zones
triggers permission change confirmations. Mobile-optimized with tap-to-select,
responsive node sizing, and scroll prevention.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 00:02:21 +00:00
Jeff Emmett 69da9b0ee7 feat(rdata): add data membrane visualization to landing page
Add interactive concentric zone visualization showing Personal (encrypted/local),
Permissioned, and Public data membranes. Drag-and-drop objects between zones
triggers permission change confirmations. Mobile-optimized with tap-to-select,
responsive node sizing, and scroll prevention.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 00:02:04 +00:00
Jeff Emmett b5d07fff1f Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m53s Details
2026-04-09 15:56:40 -04:00
Jeff Emmett dd38dcb631 feat(tabs): close-all button with confirmation dialog
Adds a ✕ button next to the + tab button that closes all open rApp tabs
and returns to the user dashboard. Shows a confirm() prompt with tab count
before proceeding.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 15:56:30 -04:00
Jeff Emmett 24c0905c03 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m45s Details
2026-04-09 14:12:16 -04:00
Jeff Emmett de698a2aa3 feat(comments): notify all space members on new comments and replies
Broadcasts in-app, push, and email notifications to all space members
when a comment pin is created or replied to. @mentioned users get their
specific mention notification instead (no double-notify). Fixes pre-existing
TS error in rtasks local-first-client (missing dueDate default).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 14:12:09 -04:00
Jeff Emmett 019ceadd0d Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m27s Details
2026-04-09 14:03:36 -04:00
Jeff Emmett 85cf54b811 feat: global bug report button — floating widget on every page
Adds a small bug icon (bottom-right) that opens a modal to collect
errors, device info, comments, and optional screenshots, then emails
the report to jeff@jeffemmett.com via the existing SMTP transport.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 14:03:27 -04:00
Jeff Emmett 5916e7bba2 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m40s Details
2026-04-09 13:57:25 -04:00
Jeff Emmett 83267a2209 fix(link-preview): add ca-certificates to Docker + implement design-agent route
The oven/bun:1-slim image lacks system CA certs, causing TLS verification
failures on outbound HTTPS for link-preview. Also implements the
/api/design-agent SSE endpoint — Gemini Flash tool loop driving the
Scribus bridge for DTP layout generation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 13:57:16 -04:00
Jeff Emmett d83486f030 Merge branch 'dev'
CI/CD / deploy (push) Successful in 3m36s Details
2026-04-09 13:48:32 -04:00
Jeff Emmett 7836b1d956 perf(collab): lazy GC timer — start on first peer, stop when empty
The collab overlay was running a 5s setInterval GC timer on every page
load even with zero peers. Now the timer starts only when the first
peer arrives and stops when all peers are garbage collected.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 13:48:18 -04:00
Jeff Emmett 6cc87ead3f Merge branch 'dev'
CI/CD / deploy (push) Failing after 3m14s Details
2026-04-09 13:41:32 -04:00
Jeff Emmett 5ddde13b0d feat: magic link responses for polls and RSVPs
HMAC-signed stateless tokens let external respondents vote on rChoices
polls or RSVP to rCal events via a single tap — no account required.
Routes mounted at /respond/:token bypass space auth. Typed EventAttendee
schema replaces unknown[] on CalendarEvent.attendees. Invite endpoints
on both modules generate tokens and optionally send email invitations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 13:41:17 -04:00
Jeff Emmett b89e247e6c Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m54s Details
2026-04-09 12:44:08 -04:00
Jeff Emmett 17a5922a44 feat(rcal): semantic zoom on overlapping day cell events
When 3+ events land on the same day in month view, individual event
labels collapse into spatial summary chips showing where the user
needs to be (e.g. "Berlin 3", "Amsterdam 2"). Chip granularity
auto-adapts: city → country → continent as location diversity grows.
Virtual events shown separately. ≤2 events still show full labels.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 12:44:01 -04:00
Jeff Emmett 883970442f Merge branch 'dev'
CI/CD / deploy (push) Has been cancelled Details
2026-04-09 12:43:28 -04:00
Jeff Emmett 35c3a48296 fix(sidecar): bump Docker API version from 1.43 to 1.44
Docker Engine 29.0.4 on Netcup requires minimum API version 1.44,
causing all sidecar starts (Blender, FreeCAD, KiCad, Ollama) to fail
with "client version 1.43 is too old".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 12:43:24 -04:00
Jeff Emmett 3aa3604d5d docs: add README with rApp catalog and digital primitives overview
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 12:40:07 -04:00
Jeff Emmett 75fef85df8 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m40s Details
2026-04-08 22:27:23 -04:00
Jeff Emmett a711af055a fix(encryptid): remove all remaining authenticatorAttachment: 'platform' hardcodes
Three client-side registration flows still had authenticatorAttachment: 'platform'
hardcoded, blocking Samsung Passkey and Linux users:
- lib/rspace-header.ts (main site header registration)
- shared/components/rstack-identity.ts (2 occurrences)

Also added server-side validation for missing userId in register/complete
to return 400 instead of crashing with TypeError.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 22:27:16 -04:00
Jeff Emmett d69dfa4618 Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m24s Details
2026-04-08 19:30:48 -04:00
Jeff Emmett b2d443421e fix(encryptid): allow cross-platform authenticators on Linux
Registration was hardcoded to authenticatorAttachment: 'platform',
which rejects devices without a platform authenticator (common on
Linux desktops). Now only forces platform when available, otherwise
lets browser offer cross-platform options (security keys, phone as
authenticator). Also relaxed isEncryptIDAvailable() to only require
WebAuthn support, not platform auth specifically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 19:30:41 -04:00
Jeff Emmett f051a5a644 Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m9s Details
2026-04-08 19:25:58 -04:00
Jeff Emmett ca45eb43d2 fix(encryptid): handle non-JSON error responses in auth flow
When EncryptID server returns plain text errors (e.g. "Internal Server
Error"), the client's .json() calls threw SyntaxError which surfaced
as an ugly parse error to users. Add .catch() to all unsafe .json()
calls in session.ts, login-button.ts, and recovery.ts so auth
gracefully falls back to unsigned tokens instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 19:25:51 -04:00
Jeff Emmett 282e6a62c6 Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m4s Details
2026-04-08 13:28:15 -04:00
Jeff Emmett 65b72ed7ac feat(rcal): map shows routes with booking status, calendar keeps semantic zoom
Map always shows individual event markers (no clustering). Transit
lines now colored by booking status: green solid = booked, red dashed
= not yet booked. New bookingStatus field on CalendarEvent as
placeholder for the forthcoming booking pipeline. Calendar views
retain semantic zoom (country/city chips at year/season/month levels).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 13:28:08 -04:00
Jeff Emmett 988b10fd65 fix(encryptid): use port 25 without auth for internal Mailcow SMTP
SMTP auth (port 587) credentials are stale, causing 535 auth failures
on startup. Detect internal mailcow/postfix hosts and connect on port
25 without auth, matching the pattern already used in server/spaces.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 23:01:07 -04:00
Jeff Emmett 1ac52e301f Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m36s Details
2026-04-07 22:32:27 -04:00
Jeff Emmett 883f4b5f2c feat(rtasks): assignee dropdown from space members + drag guard
- Load space members via /api/spaces/:slug/members for assignee dropdown
- Detail panel shows <select> with space members when available, falls
  back to text input when unauthenticated or no members loaded
- Assignee badge shown on task cards with resolved display names
- Assignee selectable on task creation form
- Server accepts assignee_id on POST /api/spaces/:slug/tasks
- Add _justDragged guard to prevent column click-to-create from
  firing after a drag operation ends (100ms debounce)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 22:32:20 -04:00
Jeff Emmett f111cb66ad Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m22s Details
2026-04-07 15:29:27 -04:00
Jeff Emmett 64ba4c1f1f feat(rmeets): enable shared video & music toolbar buttons
Add sharedvideo and sharedmusic to Jitsi toolbar config in both
the full-screen view and folk-jitsi-room component. Also set
disableThirdPartyRequests to false so the features aren't blocked.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 15:29:13 -04:00
Jeff Emmett e247befaae Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m6s Details
2026-04-07 14:55:17 -04:00
Jeff Emmett a4a800a498 fix(rmeets): remove loading spinner after Jitsi iframe injection
The "Connecting to meeting..." loading div remained visible on top of
the Jitsi iframe in the minimal view. The iframe is created by the
JitsiMeetExternalAPI constructor, so remove the spinner immediately after.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 14:55:11 -04:00
Jeff Emmett 280fb9426c Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m35s Details
2026-04-07 14:50:49 -04:00
Jeff Emmett a3ec58a4c5 fix(rmeets): correct Jitsi external API script path
The Jitsi server at jeffsi.localvibe.live serves the external API at
/libs/external_api.min.js, not /external_api.min.js (which returns HTML
due to SPA routing). Fixed in both the inline minimal view and the
folk-jitsi-room component's dynamic script loader.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 14:50:44 -04:00
Jeff Emmett bdd6ab35ec Merge branch 'dev'
CI/CD / deploy (push) Failing after 2m19s Details
2026-04-06 21:26:25 -04:00
Jeff Emmett 4918787bb5 fix(rtasks): enable public writes + click-to-create in any column
- Add publicWrite to rtasks module so unauthenticated task creation works
  (was blocked by space auth middleware returning 403)
- Click empty column space or "+ Add task" to open create form in that column
- Tasks created in clicked column get that column's status automatically
- Show error message when task creation fails instead of silent failure

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 21:26:18 -04:00
Jeff Emmett 17a17103f4 Merge branch 'dev'
CI/CD / deploy (push) Successful in 2m55s Details
2026-04-06 20:27:56 -04:00
Jeff Emmett ab5129d7dc refactor(rtasks): remove workspace list, single board per space
Load kanban board directly on page load instead of showing a workspace
picker first. ClickUp connect button moved into board nav.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 20:27:44 -04:00