Both ai-planner.ts and gemini.ts now use LiteLLM's OpenAI-compatible
API (http://litellm:4000) which proxies to Gemini Flash. Falls back
to direct Gemini API if LITELLM_API_KEY not set.
- docker-compose joins ai-internal network for LiteLLM access
- LITELLM_URL and LITELLM_API_KEY env vars added
- GEMINI_API_KEY kept as optional fallback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace simple NL→JSON parse with Gemini function-calling agent that
geocodes destinations (Nominatim), searches flights (Kiwi Tequila),
finds Airbnb listings, and computes routes (ORS/OSRM) during planning.
- New ai-tools.ts with 4 tool functions (geocode, flights, accommodation, routes)
- New ai-planner.ts with Gemini 2.0 Flash agentic loop (max 8 iterations)
- New /api/trips/plan endpoint (60s timeout for external API calls)
- Enhanced ParsedTripPreview with flight/accommodation carousels, route summary, mini map
- Trip creation now persists lat/lng, route segments, and selected bookings
- NLInput shows rotating status messages during planning
- Kiwi flight search gracefully degrades when API key not configured
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The maplibre-gl webpack alias in next.config.mjs was intercepting CSS
sub-path imports, causing 'Module not found' for maplibre-gl/dist/maplibre-gl.css.
Removed the alias entirely (not needed for Next.js 14) and moved the CSS
import to layout.tsx so it resolves directly from node_modules.
Also adds the prisma migration file for RouteSegment table
(20260324000000_add_route_segments).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows an informational popup with rich landing page content on first
visit, re-openable via a fixed info button (bottom-right corner).
Dismissible via X button, overlay click, or Escape key. Uses
localStorage to track first-visit state.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reinforces the r-suite "your tools" philosophy across all rApp landing pages.
Also normalizes title separators to em-dash (—) for consistency.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AppSwitcher: rTube/rSwag → Creating, rSocials → Sharing, rData → Observing
- EcosystemFooter: updated link order to match new categories
- UserMenu: 🔑 Sign In button, 🔐 lock when logged in
- SpaceSwitcher: reads EncryptID token, sends Bearer header
- /api/spaces proxy: forwards to rspace.online (canonical spaces)
- /api/me: verifies EncryptID token for auth status
- Header.tsx: standardized bg-slate-900/85 across all apps
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Traefik wildcard HostRegexp for <space>.r*.online subdomains
- Middleware subdomain extraction and path rewriting
- Provision endpoint with owner_did acknowledgement
- Registry enforces space ownership via EncryptID JWT
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Features and Built for Groups sections. Move Header from page.tsx
to layout.tsx for all sub-routes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Space links now go to <space>.<app-domain> (e.g., myspace.rfunds.online)
instead of rspace.online/<space>. Domain derived from window.location
when not explicitly provided.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace inline nav/Navbar with shared Header component
- Header pattern: AppSwitcher dropdown / SpaceSwitcher / actions / Sign In
- SpaceSwitcher and UserMenu work without SDK dependency
- Consistent across all r*Apps
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Part of the ridentity.online branding migration. The EncryptID auth
server is now accessible at auth.ridentity.online (with the legacy
encryptid.jeffemmett.com kept as a backward-compatible alias).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Standardize to dark background (#0f172a / slate-900) and add emoji
data URI favicon matching the rStack ecosystem.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds the unified rStack app switcher with pastel badges, emoji icons,
and categorized navigation across all 17 rStack apps.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Inject rdata.online/collect.js tracking script in layout
- Add rData link to ecosystem footer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
AuthProvider wraps layout, auth.ts provides requireAuth/isAuthed/requireTripRole.
POST/PUT/DELETE routes require auth, GET routes remain open for demo access.
Trip creator is added as OWNER collaborator. Dockerfile updated for SDK copy.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace all fetch() calls and static fallbacks with real-time WebSocket
connection to the shared demo community. All card components now display
live Alpine Explorer 2026 data synced across the r* ecosystem.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- rVote proxy: use space-scoped /api/s/{slug}/api/proposals instead of top-level
- rNotes proxy: fetch all notebooks and filter by slug server-side
- rCart demo: map carts array directly (each cart = one gear item)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Convert demo page from static server component to interactive client
component with live data fetching and graceful static fallbacks
- Add /api/trips/by-slug/[slug] for slug-based trip lookup
- Add /api/trips/[id]/packing/[itemId] PATCH for toggling packed status
- Add proxy routes for rNotes, rVote, rCart (server-side, no CORS needed)
- Add demo trip seed script (prisma/seed-demo.ts)
- Packing checkboxes are now interactive with optimistic updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace minimal footer with full 10-app ecosystem footer on landing page.
Update demo footer: rename rStack to r* Ecosystem, add rNetwork, fix emoji order.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- POST /api/trips/[id]/canvas: auto-creates rspace community, populates
with trip shapes (itinerary, destinations, bookings, budget, packing)
- POST /api/trips/[id]/sync: receives shape updates from canvas postMessage
bridge, updates corresponding DB records
- Trip dashboard: wires up onShapeUpdate callback, adds "Create Canvas" button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostMessage listener in CanvasEmbed receives shape updates from
the embedded rspace canvas iframe. Canvas-sync utility provides
type guards and API helpers for pushing shapes to rspace.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>