docs: Add islands-planets agent context file
Documents Islands (personal spaces) and Planets (group spaces) architecture, API endpoints, data models, and TODO roadmap. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
8e11dc732f
commit
ac99f0f1e4
|
|
@ -0,0 +1,230 @@
|
|||
# Islands & Planets - SocioWire Agent Context
|
||||
|
||||
## Overview
|
||||
|
||||
SocioWire has two types of virtual spaces:
|
||||
- **Islands** = Personal user spaces (like a profile page but immersive)
|
||||
- **Planets** = Group spaces (like Discord servers/communities)
|
||||
|
||||
Both render as 3D environments that replace the main map view when selected.
|
||||
|
||||
---
|
||||
|
||||
## Current State (Jan 2025)
|
||||
|
||||
### Backend (DEPLOYED)
|
||||
- `sociowire/island-service:planets-v1` - Running on swarm
|
||||
- `sociowire/core-api:planets-v1` - Running on swarm
|
||||
|
||||
**Island Service** (`/home/swire/sociowire-code/users-service/island-service/`)
|
||||
- `db.go` - Database connection (YugabyteDB)
|
||||
- `handlers.go` - Island CRUD handlers
|
||||
- `planets.go` - Planet model + CRUD functions
|
||||
- `planet_handlers.go` - Planet HTTP handlers
|
||||
- `main.go` - Server setup
|
||||
|
||||
**Core API Proxies** (`/home/swire/sociowire-code/backend-service/core-api/`)
|
||||
- `island_proxy.go` - Proxies island requests to island-service
|
||||
- `planet_proxy.go` - Proxies planet requests to island-service
|
||||
|
||||
### Frontend (PARTIAL)
|
||||
- `src/api/client.js` - API functions for islands and planets
|
||||
- `src/components/Island/IslandUniverse.jsx` - Universe view (modal) with tabs
|
||||
- `src/components/Island/IslandViewer.jsx` - Individual island viewer
|
||||
- `src/styles/universe.css` - Universe styling with tabs
|
||||
- `src/styles/island.css` - Island viewer styling
|
||||
- Translations in `src/locales/en|fr|es/translation.json`
|
||||
|
||||
---
|
||||
|
||||
## Data Models
|
||||
|
||||
### Island (Personal Space)
|
||||
```go
|
||||
type Island struct {
|
||||
ID string // "island-123"
|
||||
UserID int64 // Owner user ID
|
||||
Username string // @username
|
||||
DisplayName string
|
||||
Bio string
|
||||
Seed int64 // For procedural generation
|
||||
VirtualX float64 // Position in universe
|
||||
VirtualY float64
|
||||
VirtualZ float64
|
||||
TerrainType string // tropical, desert, arctic, volcanic, meadow
|
||||
ColorPalette string // vibrant, sunset, pastel, etc.
|
||||
AvatarURL string
|
||||
BannerURL string
|
||||
ContentCount int // Number of posts
|
||||
CreatedAt string
|
||||
UpdatedAt string
|
||||
}
|
||||
```
|
||||
|
||||
### Planet (Group Space)
|
||||
```go
|
||||
type Planet struct {
|
||||
ID string // "planet-1"
|
||||
GroupID int64 // Unique group ID
|
||||
Name string // Planet name
|
||||
Description string
|
||||
Seed int64
|
||||
VirtualX float64
|
||||
VirtualY float64
|
||||
VirtualZ float64
|
||||
TerrainType string // tropical, desert, meadow, volcanic, arctic, ocean, crystal
|
||||
ColorPalette string // vibrant, sunset, pastel, monochrome, cosmic, neon
|
||||
Size string // small, medium, large, giant
|
||||
BannerURL string
|
||||
MemberCount int
|
||||
ContentCount int
|
||||
Visibility string // public, private, invite-only
|
||||
OwnerID int64
|
||||
CreatedAt string
|
||||
UpdatedAt string
|
||||
}
|
||||
|
||||
type PlanetMember struct {
|
||||
PlanetID string
|
||||
UserID int64
|
||||
Username string
|
||||
Role string // owner, admin, moderator, member
|
||||
JoinedAt string
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### Islands
|
||||
| Method | Endpoint | Description |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/api/islands/nearby` | List islands |
|
||||
| GET | `/api/islands/by-username/{username}` | Get island by username |
|
||||
| GET | `/api/islands/{id}` | Get island by ID |
|
||||
| PUT | `/api/islands/avatar` | Sync avatar URL |
|
||||
| PUT | `/api/islands/{id}` | Update island |
|
||||
|
||||
### Planets
|
||||
| Method | Endpoint | Description |
|
||||
|--------|----------|-------------|
|
||||
| GET | `/api/planets/nearby` | List public planets |
|
||||
| GET | `/api/planets/{id}` | Get planet by ID |
|
||||
| POST | `/api/planets` | Create planet |
|
||||
| PUT | `/api/planets/{id}` | Update planet |
|
||||
| POST | `/api/planets/{id}/join` | Join planet |
|
||||
| POST | `/api/planets/{id}/leave` | Leave planet |
|
||||
| GET | `/api/planets/{id}/members` | Get members |
|
||||
| GET | `/api/user/planets` | Get user's planets |
|
||||
|
||||
---
|
||||
|
||||
## Frontend API Client
|
||||
|
||||
```javascript
|
||||
// Islands
|
||||
fetchIslands({ limit }) -> Island[]
|
||||
fetchIslandByUsername(username) -> Island
|
||||
fetchIslandByID(id) -> Island
|
||||
updateIsland(id, updates) -> Island
|
||||
|
||||
// Planets
|
||||
fetchPlanets({ limit }) -> Planet[]
|
||||
fetchPlanet(id) -> Planet
|
||||
createPlanet({ name, visibility }) -> Planet
|
||||
updatePlanet(id, updates) -> Planet
|
||||
joinPlanet(id) -> { ok: true }
|
||||
leavePlanet(id) -> { ok: true }
|
||||
fetchPlanetMembers(id, { limit }) -> PlanetMember[]
|
||||
fetchUserPlanets() -> Planet[]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## UI Components
|
||||
|
||||
### IslandUniverse (Modal)
|
||||
- Opens from TopBar "Islands" button or SEO section
|
||||
- Shows 3D space map with all islands and planets
|
||||
- **Tabs**: All | Islands | Planets (to filter view)
|
||||
- Click island/planet to open viewer
|
||||
- MapLibre GL for 3D rendering
|
||||
|
||||
### IslandViewer (Full Page Replacement)
|
||||
- Replaces main map when viewing an island
|
||||
- Shows island terrain with posts, apps, documents
|
||||
- Profile editing for own island
|
||||
- Tabs: Profile | Posts | Settings
|
||||
|
||||
### PlanetViewer (TODO)
|
||||
- Similar to IslandViewer but for groups
|
||||
- Member list, roles, group posts
|
||||
- Join/Leave functionality
|
||||
- Admin panel for owners
|
||||
|
||||
---
|
||||
|
||||
## What's Next (TODO)
|
||||
|
||||
### Phase 1: Full-page Islands
|
||||
1. When clicking an island in Universe, replace map with IslandViewer (full page)
|
||||
2. Add back button to return to map
|
||||
3. Show island posts in a feed format
|
||||
4. Allow posting content to island
|
||||
|
||||
### Phase 2: Planet Viewer
|
||||
1. Create PlanetViewer component (similar to IslandViewer)
|
||||
2. Show planet info, members list, posts
|
||||
3. Join/Leave buttons
|
||||
4. Member management for admins
|
||||
|
||||
### Phase 3: Island Apps & Documents
|
||||
1. Widget system for islands (apps)
|
||||
2. Document storage/display
|
||||
3. Customizable island layout
|
||||
4. Drag-drop island editing
|
||||
|
||||
### Phase 4: Planet Features
|
||||
1. Planet channels (like Discord)
|
||||
2. Planet roles and permissions
|
||||
3. Planet events
|
||||
4. Planet announcements
|
||||
|
||||
---
|
||||
|
||||
## Swarm Services
|
||||
|
||||
```bash
|
||||
# Current running services
|
||||
backend_core-api sociowire/core-api:planets-v1
|
||||
sociowire_island-service sociowire/island-service:planets-v1
|
||||
users_island-service sociowire/island-service:planets-v1
|
||||
sociowire_frontend sociowire/frontend:v103
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Key Files to Edit
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `src/components/Island/IslandUniverse.jsx` | Universe modal with tabs |
|
||||
| `src/components/Island/IslandViewer.jsx` | Island full-page view |
|
||||
| `src/components/Island/PlanetViewer.jsx` | Planet full-page view (CREATE) |
|
||||
| `src/api/client.js` | API functions |
|
||||
| `src/App.jsx` | Route handling, modal state |
|
||||
| `src/styles/universe.css` | Universe styles |
|
||||
| `src/styles/island.css` | Island styles |
|
||||
| `src/locales/*/translation.json` | Translations |
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
- Islands are auto-created when user registers (linked to user)
|
||||
- Planets must be explicitly created by users
|
||||
- Both use MapLibre GL for 3D terrain rendering
|
||||
- Terrain is procedurally generated from seed
|
||||
- Universe shows all islands/planets floating in space
|
||||
- Backend uses YugabyteDB (Postgres-compatible)
|
||||
Loading…
Reference in New Issue