Commit Graph

73 Commits

Author SHA1 Message Date
Jeff Emmett fe3e3621af feat(canvas): rApplet Phase 2 — port chips, data flow, toolbar palette, 15 module applets
- Replace port-indicator dots with port-chip pills (colored border + dot + name)
- Add setPortValue override bridging FolkArrow piping to onInputReceived/emitOutput
- Add Applets toolbar group with dynamic palette + template section
- 15 new module applet files: rtasks, rtime, rcal, rchats, rdata, rdocs,
  rnotes, rphotos, rmaps, rnetwork, rchoices, rinbox, rsocials, rbooks, rexchange
- 20 total applet cards across 18 modules (was 5 across 3)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 13:08:49 -04:00
Jeff Emmett 0f6b5ecd8d fix: disable all feature tours — shell welcome tour, TourEngine, landing links
Tours were demoing stale features and auto-triggering annoyingly.
TourEngine.start() now returns immediately (no-ops). Shell welcome
tour JS/CSS/HTML removed. "Start Guided Tour" links stripped from
all 27 landing pages. Tour CSS selectors removed from info panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 11:12:00 -04:00
Jeff Emmett 70cb919541 fix(rnetwork): add auth headers to graph viewer API calls; add Blender multi-user
- Fix 401 errors on rNetwork by passing encryptid-token as Bearer auth
  on /api/info, /api/graph, /api/workspaces fetch calls
- Add blender-multiuser replication server (multi-user-server:0.5.8)
  to docker-compose with health check and resource limits
- Add Multiplayer tab to folk-blender shape with connection info,
  server status check, and setup instructions
- Add /api/blender-multiuser/status endpoint for TCP health probe

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 23:32:33 -04:00
Jeff Emmett 9e4f24ecd2 fix(rnetwork): bump JS cache versions for CRM delegation components
Bust Cloudflare CDN cache after Sankey visualization overhaul.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 13:04:11 -04:00
Jeff Emmett 8535ab24a2 feat(rtime): commitment pooling + weaving split-pane redesign
Resizable divider (20-65% drag, localStorage persist), pool UX upgrade
(labels, woven % badge, drag-to-weave button), multi-strand woven
connection rendering, project frames with drag/resize/auto-assign,
task dependency arrows with diamond dep-ports, mobile responsive layout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 12:46:39 -04:00
Jeff Emmett 4f8cddaaf7 feat(holons): add Holon Explorer canvas shape with hex hierarchy + appreciation
New folk-holon-explorer shape unifying H3 geospatial holons and nested
rSpace spaces into a zoomable circular navigator with appreciation weight
normalization and MetatronGrid sacred geometry background. Endorsements
logged to trust engine via new POST /api/trust/endorse endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 12:41:35 -04:00
Jeff Emmett 53c757e68e fix: comprehensive memory leak and performance fixes across 44 files
Browser-side:
- Fix switchSpace() to LRU-evict idle space WebSocket connections (cap: 3)
- Add runtime.unsubscribe() to disconnectedCallback in 24 components
- Fix DocSyncManager.unsubscribe() to clean up syncStates, timers, listeners
- Fix 14 components leaking RAF loops, ResizeObservers, MutationObservers,
  document/window listeners, setIntervals, MapLibre WebGL contexts, and
  AbortControllers on disconnect
- Deduplicate Automerge WASM: module builds now use global shim from
  shell-offline instead of bundling ~2.5MB each (8 modules affected)

Server-side:
- Add LRU eviction to SyncServer.#docs (cap: 500, evicts idle docs with
  no subscribers, persists to disk before eviction)
- registerWatcher() now returns unsubscribe function

Data:
- Cap unbounded CRDT arrays: rexchange chatMessages (200), rcart events (200)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 22:26:24 -04:00
Jeff Emmett 99492cc532 feat: extend browser back button support to all rApp modules with view navigation
Adds ViewHistory integration to 9 additional modules (rtime, rswag, rwallet,
rbnb, rvnb, rnetwork, crowdsurf, rtube, rflows-mortgage), bringing the total
to 17 modules. Browser back now navigates within the current rApp tab before
falling through to tab switching.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 17:48:31 -04:00
Jeff Emmett de9cc21301 feat(rmeets): require username on join, fix settings/background, add MI toolbar
- Enable prejoin page so users must enter a display name before joining
- Add requireDisplayName, SETTINGS_SECTIONS, disableVirtualBackground config
- Add floating Meeting Intelligence button with recordings/search links
- Add chat, settings, participants-pane to folk-jitsi-room toolbar
- Also includes: rDocs module expansion, tab-cache/view-history updates,
  converter rewrites, MCP tool additions, OAuth fixes, backlog tasks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 14:06:47 -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 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 c4b85a82e6 feat(rnetwork): graph visualization polish, delegation sync, layers persistence
Phase 1 — UX Polish: loading spinner, node hover glow (THREE.RingGeometry),
empty state, live slider labels, keyboard shortcuts (Esc/F/T/L), toast
notifications, touch-friendly sizing (@media <=768px).

Phase 2 — Live Data Integration: edit delegation flow (POST vs PATCH),
cross-component sync via CustomEvent("delegations-updated"), dynamic
getAuthUrl() fallback chain, sparkline weight tracking via trust events,
revocation-aware time slider, new GET /api/trust/events endpoint,
include_revoked + revokedAt support on /api/delegations/space.

Phase 3 — New Visualizations: BFS delegation path tracing (max depth 3),
node/edge opacity dimming for non-path elements, transitive chain indicators
(TorusGeometry when >30% received weight), network metrics sidebar (Gini
concentration index, top 5 influencers with click-to-focus), log-scale
flow thickness (1.5 + log10(1 + w*9) * 3).

Phase 4 — Layers Persistence: LayerConfig + CrossLayerFlowConfig schema
types, CRDT doc version bump to 2 with migration, saveLayerConfig/
getLayerConfig in local-first-client, auto-persist on rebuildLayerGraph,
restore-on-connect, onEngineTick sine-wave pulse animation for compatible
feed targets during wiring, wiring progress indicator banner.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 14:46:18 -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 df8631360e feat(collab): unified presence system across all 27 rApps
Harmonize the two disconnected presence systems into one:
- New shared/collab-presence.ts utility (broadcastPresence, startPresenceHeartbeat)
- Collab overlay now listens to custom presence messages, shows module context in people panel
- Fixed Shadow DOM focus tracking using composedPath() for focus rings through shadow boundaries
- Replaced rNotes custom presence with shared utility (kept sidebar dots)
- Added presence heartbeat to all 27 rApp components with dynamic context strings
- Bumped cache versions in all modified mod.ts files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 16:56:06 -07:00
Jeff Emmett e09ae1d8d2 fix(rnetwork): prevent TubeGeometry NaN errors in 3D graph
Links with curved curvature create TubeGeometry that crashes with NaN
positions when force simulation hasn't converged yet. Add linkVisibility
guard to hide links until both endpoints have valid coordinates, and
bump warmupTicks from 50 to 100 for more settling time.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 23:16:45 -07:00
Jeff Emmett 15c118923b fix(spaces): match owner DID format in space list + resolve all TS errors
Space dropdown showed "Request Access" for the owner's own space because
the /api/spaces endpoint only checked claims.sub against ownerDID, missing
the did🔑 format used by auto-provisioned spaces. Now uses dual-check
matching the resolveRole helper pattern.

Also fixes 15 pre-existing TypeScript errors:
- server/index.ts: add Hono AppEnv type for context variables
- modules/rnetwork/mod.ts: cast tuple index to number for arithmetic
- modules/rsplat/folk-splat-viewer.ts: type CDN-loaded three.js as any
- modules/rtube/mod.ts: cast Uint8Array to BlobPart for FormData

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 11:11:32 -07:00
Jeff Emmett 84c3c318d8 feat: async 3D gen, calendar reminder widget, cross-module drag, subdomain URL fixes
- Make /api/3d-gen async with job queue + email notification on completion
- Add reminder mini-calendar widget to canvas (top-right on shape select)
- Make items draggable across 6 modules (rNotes, rTasks, rFiles, rSplat, rPhotos, rBooks)
- Upgrade rCal drop handler with time-picker popover instead of confirm()
- Show reminder indicators (dots + badges) on calendar days
- Fix subdomain routing: remove space slug from server-rendered sub-nav,
  tab bar, and module links in production (/{moduleId} not /{space}/{moduleId})
- Add buildSpaceUrl() helper for correct external URL generation
- Fix rcart payment URLs for subdomain routing
- Fix rSchedule email links to use subdomain format

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:18:51 +00:00
Jeff Emmett 9008640f79 perf(rnetwork): optimize 3D graph rendering + fix cross-platform mobile PWA
Graph performance: seed node positions to prevent NaN geometry warnings,
cache sprite textures, reduce simulation ticks (120→50 warmup, 300→150
cooldown), cap particles at 2, lower sphere segments, halve label canvas
size, add sessionStorage graph data cache with 60s TTL.

Mobile PWA: add both mobile-web-app-capable (Chrome/Android) and
apple-mobile-web-app-capable (iOS), viewport-fit=cover for notch support,
apple-mobile-web-app-title, safe-area CSS insets on header/body, fix
admin.html missing all mobile meta tags.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 22:08:22 -07:00
Jeff Emmett b86af45610 feat(rnetwork): add Automerge schemas + local-first-client for CRM sync
Contact metadata, relationships, and graph layout positions sync
via CRDT. Delegations remain server-authoritative in PostgreSQL.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:45:01 -07:00
Jeff Emmett ee54ec219d feat(rnetwork): add Layers mode for multi-rApp 3D visualization
Adds a "Layers" toggle to the graph viewer that lets users select 2-3
rApps and visualize them as labeled planes on user-assignable axes
(XY/XZ/YZ) with hub+feed nodes, cross-layer flow wiring via compatible
FlowKinds, animated particle edges, and unrestricted camera orbit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:44:50 -07:00
Jeff Emmett 20c4a19e06 feat(rnetwork): absolute token weights instead of fractional averages
Weight accounting now uses actual base weights per authority (×100 for
integer tokens). Formula: effective = max(0, base - delegatedAway) + received.
If you have 95 Gov tokens and delegate 48, you retain 47; the recipient
gains 48 on top of their own base.

- Detail panel shows breakdown: base − delegated + received = effective
- Badge shows integer token count per authority
- Member list sidebar shows per-authority G/E/T weights (color-coded)
- Sorted by total effective weight (sum across all authorities)
- No more averages — absolute weight of voice

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:39:05 -07:00
Jeff Emmett 7cab8d6187 feat(rnetwork): responsive zoom, larger nodes/labels, member list sidebar
- Zoom: 2x/0.5x steps (was 1.33x/0.75x), 200ms animation, scroll speed 2.5x
- Node sizing: range 6-56px in trust mode (was 4-30px) for dramatic differentiation
- Text labels: 512x96 canvas with 36px font, 14x3.5 sprite scale (was 256x64, 24px, 8x2)
- Member list sidebar: toggled via "List" button, shows admins/members/viewers grouped
  with effective weight, click to fly camera to node, responsive mobile stack layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:21:23 -07:00
Jeff Emmett 03de21ddd5 feat(rnetwork): concentric spheres layout with Fibonacci distribution
Replace flat ring layout with 3D sphere distribution using Fibonacci
spiral for even node placement. Wireframe sphere guides replace flat
ring guides — visible from every camera angle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:05:30 -07:00
Jeff Emmett e5b5c551b1 feat(rnetwork): multi-select delegation with per-node sliders and fuzzy search
- Click any person/member node to add them to delegation selection
- Each selected node gets 3 inline sliders (Gov/Econ/Tech) for weight assignment
- Fuzzy search input in delegation panel to find and add members by name
- Remaining weight display per authority
- "Confirm All Delegations" commits all at once, recomputes weights live
- Replaces old two-step popup with single-panel multi-select UX

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:54:45 -07:00
Jeff Emmett 48cbf22492 fix(rnetwork): check URL space slug not effectiveSpace for demo detection
effectiveSpace resolves to 'global' for rnetwork (global-scoped module),
so check the URL space param instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:49:55 -07:00
Jeff Emmett 33721819db fix(rnetwork): show demo members in demo space even when CRM token exists
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:47:56 -07:00
Jeff Emmett 98cd239418 feat(rnetwork): weight accounting, ring layout, inline delegation UI
- Per-authority effective weight computation (delegated/received/retained)
- Concentric ring layout (admin/member/viewer) with visual guides
- Inline delegation popup with total + domain split sliders
- Authority labels renamed: Gov/Econ/Tech with consistent colors
- Authority-filtered edge view in trust mode
- Demo delegation preview with live graph updates
- Trust API endpoints for delegation CRUD and score queries

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 16:34:54 -07:00
Jeff Emmett cab80f30e7 refactor(rnetwork): move Open CRM to sub-nav header
Remove standalone "Open CRM" button from graph view body and add
"Open Twenty CRM" as an external link in the module sub-nav bar,
next to Community CRM. Dashed border + margin-left:auto pushes it
to the right edge for visual distinction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 15:52:10 -07:00
Jeff Emmett 44e7639124 fix(rnetwork): switch to unpkg CDN with dynamic fallback for 3d-force-graph
jsdelivr was returning 503. Switch primary CDN to unpkg and add a dynamic
fallback loader that tries both CDNs if the initial script tag fails.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 12:24:54 -07:00
Jeff Emmett a1f8103237 fix(rnetwork): remove header and stats bar to maximize canvas space
Remove the "Network Graph" title and People/Organizations/Members/Cross-org
stats bar. Reduce toolbar margin for minimal chrome above the canvas.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:45:19 -07:00
Jeff Emmett e37fefe8a4 fix(rnetwork): treat TWENTY_API_TOKEN=disabled as unset
Infisical injects secrets at startup when the env var is empty/falsy,
so setting it to "disabled" blocks injection while this change ensures
the demo data fallback still triggers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:36:51 -07:00
Jeff Emmett aa6f04e45e fix: resolve all 127 TypeScript errors with Hono type augmentation
Add types/hono.d.ts declaring effectiveSpace, spaceRole, and isOwner
on Hono's ContextVariableMap. Remove 127 "as any" casts across 18
files. Fix ParticipantStatus type in rmaps SyncMessage union.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:25:29 -07:00
Jeff Emmett 073a64fe56 feat(rnetwork): expand demo CRM to 48 members with delegation-only flows
Remove Demo DAO and space hub placeholder nodes — members now connect
only via trust delegation edges. Add 24 new members (m25–m48) with
ops-vertical specializations and expand delegation arrays to 141 edges
(47 per authority) with proper hierarchical flow patterns.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 20:08:05 -07:00
Jeff Emmett fb9448681c Populate demo CRM with 24 DAO members and delegation network
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 00:24:01 +00:00
Jeff Emmett 2cb1ff092b feat(shell): redesign rApp info popup as centered modal with overlay
- Fix z-index (9000 → 10001) so popup renders above header and tab bar
- Center popup as a proper modal with blurred backdrop overlay
- Header now shows module emoji icon + name (fetched from API)
- Bigger, bolder CTA buttons with gradient fills and hover effects
- Tour/guide links auto-promoted to prominent purple-accent buttons
- Loading spinner animation, Escape key to dismiss, click-outside-to-close
- Mobile: slides up from bottom instead of top-right corner
- Also: rcart/rwallet subnav route support, rcart tour simplification

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 11:24:41 -07:00
Jeff Emmett 87d5e8b1cb fix(rnetwork): pre-load THREE before graph creation
nodeThreeObject callback was returning a Promise (from async
createNodeObjectAsync) because THREE wasn't cached yet. Pre-load
THREE via import("three") before creating the graph so the callback
always returns a synchronous Three.js object.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 10:30:43 -07:00
Jeff Emmett f4d7448c9d fix(rnetwork): use UMD build for 3d-force-graph, avoid ESM bare specifiers
ESM builds on esm.sh kept resolving transitive deps to latest versions
that import three/webgpu. Switch to the pre-built UMD bundle from
jsdelivr which bundles all deps including Three.js. Keep separate
import map entry for "three" ESM for custom node object creation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 10:23:04 -07:00
Jeff Emmett 14dead3896 fix(rnetwork): lock esm.sh transitive deps with * prefix
esm.sh was resolving three-render-objects@^1.29 to latest 1.x which
imports three/webgpu. The * prefix locks transitive dependency
versions to those specified in the package's own dependency tree.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 02:15:58 -07:00
Jeff Emmett 4d6e7664a4 fix(rnetwork): pin 3d-force-graph@1.73.4, revert to three.module.js
three.webgpu.js doesn't export legacy utilities like UniformsUtils
needed by Three.js addons. Pin 3d-force-graph to 1.73.4 which
predates the three/webgpu dependency, and use three.module.js.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 02:06:42 -07:00
Jeff Emmett ccf31edcbe fix(rnetwork): use three.webgpu.js for WebGPURenderer export
Map both "three" and "three/webgpu" to three.webgpu.js so only one
copy loads and WebGPURenderer is available. Also externalize
three/webgpu in esm.sh URL so it uses the import map.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 02:00:27 -07:00
Jeff Emmett 47d2c41400 fix(rnetwork): remove linkLineDash (3D unsupported), fix three/webgpu duplication
- Remove .linkLineDash() chain call — only exists in 2D force-graph,
  not 3d-force-graph. Dashed edges were visual-only, no functional loss.
- Map three/webgpu to three.module.js instead of three.webgpu.js to
  avoid loading two full copies of Three.js.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:54:17 -07:00
Jeff Emmett dfcd3fa85a fix(rnetwork): add three/webgpu to import map for 3d-force-graph
The esm.sh bundle of 3d-force-graph@1.79.1 imports "three/webgpu"
which wasn't in the import map. Map it to the jsdelivr CDN path.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:42:52 -07:00
Jeff Emmett 9091c988ff feat: add subnav outputPaths for rcart, rmeets, rwallet; CRM URL-path tabs
- rcart: add subscriptions outputPath
- rmeets: add rooms + recordings outputPaths
- rwallet: add wallets, tokens, transactions outputPaths
- folk-crm-view: read active tab from URL pathname instead of ?tab=
  query param (with backward compat fallback)
- rstack-app-switcher: rename rtasks category to "Work & Productivity"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:37:05 -07:00
Jeff Emmett 0c3d8728a0 fix: graph 3d-force-graph resolution, DID/username display, space role checks
- Switch 3d-force-graph CDN from jsdelivr to esm.sh with bundle-deps
  to resolve missing "three-forcegraph" bare specifier error
- Fix storeCredential() to pass displayName and DID to createUser()
  (prevents NULL did column for credential-first user creation)
- Fix invite acceptance to use claims.did instead of claims.sub for
  space_members.user_did (DID format consistency)
- Fix session refresh to look up username from DB when missing from
  old token (prevents empty username after token refresh)
- Fix resolveCallerRole() in spaces.ts to check both claims.sub and
  claims.did against ownerDID and member keys (auto-provisioned spaces
  store ownerDID as did🔑, API-created as raw userId)
- Refactor CRM route to use URL subpath tabs with renderCrm helper

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:31:24 -07:00
Jeff Emmett 7a771f53c9 fix(rnetwork): add missing importmap entry for three/examples/jsm/
3d-force-graph imports from three/examples/jsm/controls/DragControls.js
but only three/addons/ was mapped. Add the three/examples/jsm/ prefix
so the browser can resolve it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:53:46 -07:00
Jeff Emmett 4c44eb9941 feat(rnetwork): enhanced trust flow viz + rename authorities to gov/fin/dev-ops
- Compute delegatedWeight per node from delegation edges (both directions)
- Animated directional particles on delegation edges (count/size ~ weight)
- Wider delegation edges (1+weight*8) with 0.15 curvature
- "All" authority overlay mode with per-authority colored edges
- Rename 5 authorities (voting/moderation/curation/treasury/membership)
  to 3 verticals: gov-ops, fin-ops, dev-ops
- DB migration: update CHECK constraint + migrate existing data
- Update all frontend components + backend defaults

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:51:30 -07:00
Jeff Emmett f2d575d1a2 feat(shell): add consistent rApp tab bar system with URL-backed ?tab= params
Server-rendered tab bar via renderShell tabs option. Tabs use ?tab= query
params with history.replaceState and dispatch rapp-tab-change events.
Migrated rNetwork CRM from internal Shadow DOM tabs to the shared system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:50:26 -07:00
Jeff Emmett 1f4b28aee1 feat(rnetwork): convert graph viewer from 2D SVG to 3D WebGL
Replace custom SVG force-directed layout with 3d-force-graph (Three.js)
loaded via CDN importmap. Left-drag pans, scroll zooms, right-drag orbits.
Nodes rendered as colored spheres with sprite labels and trust badges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:25:16 -07:00
Jeff Emmett 841a5ff2b6 feat(rnetwork): add 'Full CRM' link to Twenty in CRM header
Ensures the traditional Twenty CRM interface is always accessible
via a header link alongside the rNetwork CRM tabs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:18:44 -07:00
Jeff Emmett 845704d5a4 fix(rnetwork): use per-space scoping for trust data (not global)
rNetwork declares defaultScope='global' for CRM data, but trust/
delegation data is per-space. The effectiveSpace middleware resolved
to 'global' causing all EncryptID queries to pass space=global,
returning empty results. Fixed by using URL space param directly
for trust-related endpoints.

Also fixed delegations proxy to use /api/delegations/space endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:16:17 -07:00