UNPKG

oneie

Version:

Build apps, websites, and AI agents in English. Zero-interaction setup for AI agents (Claude Code, Cursor, Windsurf). Download to your computer, run in the cloud, deploy to the edge. Open source and free forever.

588 lines (493 loc) 14.3 kB
--- title: Groups dimension: groups category: groups.md tags: ai, groups, multi-tenant related_dimensions: events, knowledge, people, things scope: global created: 2025-11-03 updated: 2025-11-03 version: 1.0.0 ai_context: | This document is part of the groups dimension in the groups.md category. Location: one/groups/groups.md Purpose: Documents groups: multi-tenant platform structure Related dimensions: events, knowledge, people, things For AI agents: Read this to understand groups. --- # Groups: Multi-Tenant Platform Structure **Groups are the hierarchical isolation boundary for multi-tenancy in the ONE Platform.** For details on the ONE group (vision, strategy, revenue), see **[ONE Group →](./one.md)** ## Overview The ONE Platform operates as a multi-tenant system where: - **Platform Owner (Anthony)** owns the infrastructure and smart contracts (100%) - **Groups** are tenant containers for resources and users (with 6 types) - **Group Owners** manage their groups and members - **Group Users** have scoped access to group resources ## Table: `groups` **Schema Structure:** ```typescript { _id: Id<"groups">, name: string, type: "friend_circle" | "business" | "community" | "dao" | "government" | "organization", parentGroupId?: Id<"groups">, // For hierarchical nesting properties: { // Identity slug?: string, // URL-friendly (e.g., "acme") domain?: string, // Custom domain (e.g., "acme.one.ie") logo?: string, description?: string, // Status & Plan (mainly for organizations) plan?: "starter" | "pro" | "enterprise", // Limits & Usage (mainly for organizations) limits?: { users: number, storage: number, // GB apiCalls: number, // Per month cycles: number, // Per month }, usage?: { users: number, storage: number, apiCalls: number, cycles: number, }, // Billing (mainly for organizations) billing?: { customerId?: string, // Stripe customer ID subscriptionId?: string, currentPeriodEnd?: number, // Blockchain billing cryptoEnabled?: boolean, treasuryAddress?: { sui?: string, solana?: string, base?: string, }, }, // Settings settings?: { allowSignups?: boolean, requireEmailVerification?: boolean, enableTwoFactor?: boolean, allowedDomains?: string[], // Cycle settings cycleEnabled?: boolean, cycleModels?: string[], // ["gpt-4", "claude-3.5", "llama-3"] }, // Revenue share (if group generates platform revenue) revenueShare?: number, // 0.0 to 1.0 (0 = platform keeps all) trialEndsAt?: number, }, status: "draft" | "active" | "archived", createdAt: number, updatedAt: number, } ``` ## Group Types ### 1. **friend_circle** Small groups of 2-10 people who know each other personally - Family groups - Close friend circles - Small social groups ### 2. **business** Commercial entities and teams - Startups - Small businesses - Teams and departments ### 3. **community** Open membership groups around shared interests - Online communities - Fan clubs - Special interest groups ### 4. **dao** Decentralized autonomous organizations - Token-gated groups - On-chain governance - Treasury management ### 5. **government** Public sector and civic groups - Municipal services - Public agencies - Civic organizations ### 6. **organization** Large-scale multi-tenant business entities - Enterprise customers - SaaS tenants - White-label deployments ## Core Relationships (Connections) **Membership:** `creator` → `group` via `member_of` - `metadata.role`: `"group_owner"` | `"group_user"` - `metadata.permissions`: Array of permission strings **Ownership:** `creator` → `group` via `owns` - Platform owner (Anthony) owns the ONE group at 100% - Group owners may own their groups **Hierarchy:** `group` → `group` via `parentGroupId` - Groups can nest within groups - Parent groups can access child group data (configurable) **Resource Ownership:** `group` → resources via `owns` - Content, workflows, tokens, products, websites - All group resources link back to group via ownership connection ## Core Events **Group Lifecycle:** - `group_created` - When group is created - `group_updated` - Settings, plan, or limits changed - `user_invited_to_group` - Invitation sent - `user_joined_group` - User accepts invitation - `user_removed_from_group` - User removed from group **Billing Events (mainly for organizations):** - `payment_event` - Subscription payments (Stripe or crypto) - `subscription_event` - Plan changes (starter → pro → enterprise) **Cycle Events:** - `cycle_request` - Group member requests cycle - `cycle_completed` - Result delivered - `cycle_quota_exceeded` - Monthly limit hit **Revenue Events:** - `group_revenue_generated` - When group's activity generates platform revenue - `revenue_share_distributed` - If group has revenue share agreement ## Code Examples ### Create ONE Platform Group (Anthony's) ```typescript // Create the ONE group (owned by Anthony) const oneGroupId = await db.insert("groups", { name: "ONE Platform", type: "organization", parentGroupId: undefined, // Top-level group properties: { slug: "one", domain: "one.ie", plan: "enterprise", limits: { users: 1000000, // Unlimited for platform storage: 1000000, // 1PB apiCalls: -1, // Unlimited cycles: -1, // Unlimited }, usage: { users: 0, storage: 0, apiCalls: 0, cycles: 0, }, billing: { cryptoEnabled: true, treasuryAddress: { sui: process.env.PLATFORM_TREASURY_SUI, solana: process.env.PLATFORM_TREASURY_SOLANA, base: process.env.PLATFORM_TREASURY_BASE, }, }, settings: { allowSignups: true, requireEmailVerification: true, enableTwoFactor: true, cycleEnabled: true, cycleModels: ["gpt-4", "claude-3.5", "llama-3"], }, revenueShare: 0, // Anthony keeps 100% of revenue }, status: "active", createdAt: Date.now(), updatedAt: Date.now(), }); // Anthony owns the ONE group (100%) await db.insert("connections", { fromThingId: anthonyId, toThingId: oneGroupId, relationshipType: "owns", metadata: { ownershipPercentage: 100, }, createdAt: Date.now(), }); // Anthony is also a member with group_owner role await db.insert("connections", { fromThingId: anthonyId, toThingId: oneGroupId, relationshipType: "member_of", metadata: { role: "group_owner", permissions: ["*"], // All permissions }, createdAt: Date.now(), }); // Log creation event await db.insert("events", { groupId: oneGroupId, type: "group_created", actorId: anthonyId, targetId: oneGroupId, timestamp: Date.now(), metadata: { name: "ONE Platform", slug: "one", type: "organization", plan: "enterprise", }, }); ``` ### Create Customer Group (Multi-Tenant) ```typescript // Customer creates their own group const customerGroupId = await db.insert("groups", { name: "Acme Corp", type: "organization", parentGroupId: undefined, // Top-level tenant properties: { slug: "acme", domain: "acme.one.ie", plan: "pro", limits: { users: 50, storage: 100, // GB apiCalls: 100000, cycles: 10000, // 10K cycles/month }, usage: { users: 0, storage: 0, apiCalls: 0, cycles: 0, }, billing: { customerId: "cus_stripe123", subscriptionId: "sub_stripe456", cryptoEnabled: false, }, settings: { allowSignups: false, requireEmailVerification: true, enableTwoFactor: false, cycleEnabled: true, cycleModels: ["gpt-4", "claude-3.5"], }, revenueShare: 0.1, // Customer gets 10% revenue share if they refer users }, status: "active", createdAt: Date.now(), updatedAt: Date.now(), }); // Customer is group_owner await db.insert("connections", { fromThingId: customerId, toThingId: customerGroupId, relationshipType: "member_of", metadata: { role: "group_owner", permissions: ["read", "write", "admin", "billing"], }, createdAt: Date.now(), }); ``` ### Create Hierarchical Groups (Department within Organization) ```typescript // Create parent organization const orgId = await db.insert("groups", { name: "Tech Corp", type: "organization", parentGroupId: undefined, properties: { slug: "techcorp", plan: "enterprise", }, status: "active", createdAt: Date.now(), updatedAt: Date.now(), }); // Create child business group (department) const deptId = await db.insert("groups", { name: "Engineering Team", type: "business", parentGroupId: orgId, // Nest within parent properties: { description: "Product engineering department", }, status: "active", createdAt: Date.now(), updatedAt: Date.now(), }); // Create friend circle within department (squad) const squadId = await db.insert("groups", { name: "Backend Squad", type: "friend_circle", parentGroupId: deptId, // Nest within department properties: { description: "Backend services team", }, status: "active", createdAt: Date.now(), updatedAt: Date.now(), }); ``` ### Track Group Cycle Usage ```typescript // User in group requests cycle await db.insert("events", { groupId: customerGroupId, type: "cycle_request", actorId: userId, targetId: cycleRequestId, timestamp: Date.now(), metadata: { model: "gpt-4", cost: 0.045, price: 0.1, }, }); // Update group usage const group = await db.get(customerGroupId); await db.patch(customerGroupId, { properties: { ...group.properties, usage: { ...group.properties.usage, cycles: group.properties.usage.cycles + 1, }, }, updatedAt: Date.now(), }); // Check if quota exceeded if (group.properties.usage.cycles >= group.properties.limits.cycles) { await db.insert("events", { groupId: customerGroupId, type: "cycle_quota_exceeded", actorId: "system", targetId: customerGroupId, timestamp: Date.now(), metadata: { limit: group.properties.limits.cycles, usage: group.properties.usage.cycles, }, }); } ``` ### Revenue Share Distribution ```typescript // When customer group generates platform revenue await db.insert("events", { groupId: customerGroupId, type: "group_revenue_generated", actorId: customerGroupId, targetId: anthonyId, // Platform owner timestamp: Date.now(), metadata: { totalRevenue: 1000.0, // $1K generated by group groupShare: 100.0, // 10% to group platformShare: 900.0, // 90% to Anthony revenueSharePercentage: 0.1, }, }); // Distribute revenue share (if configured) if (group.properties.revenueShare > 0) { await db.insert("events", { groupId: customerGroupId, type: "revenue_share_distributed", actorId: anthonyId, targetId: customerId, timestamp: Date.now(), metadata: { amount: 100.0, percentage: 0.1, network: "sui", txDigest: "...", }, }); } ``` ## Queries **List group members:** ```typescript const members = await db .query("connections") .withIndex("to_type", (q) => q.eq("toThingId", groupId).eq("relationshipType", "member_of"), ) .collect(); const memberEntities = await Promise.all( members.map((m) => db.get(m.fromThingId)), ); ``` **List group resources:** ```typescript const resources = await db .query("connections") .withIndex("from_type", (q) => q.eq("fromThingId", groupId).eq("relationshipType", "owns"), ) .collect(); ``` **Get child groups (hierarchical query):** ```typescript const childGroups = await db .query("groups") .filter((q) => q.eq(q.field("parentGroupId"), groupId)) .collect(); ``` **Get group cycle usage:** ```typescript const group = await db.get(groupId); const usage = group.properties.usage?.cycles || 0; const limit = group.properties.limits?.cycles || 0; const percentageUsed = (usage / limit) * 100; ``` **Recent group activity:** ```typescript const events = await db .query("events") .withIndex("group_time", (q) => q.eq("groupId", groupId)) .order("desc") .take(100) .collect(); ``` **Calculate group revenue (for revenue share):** ```typescript const revenueEvents = await db .query("events") .withIndex("type_time", (q) => q.eq("type", "group_revenue_generated")) .filter((q) => q.eq(q.field("actorId"), groupId)) .collect(); const totalRevenue = revenueEvents.reduce( (sum, e) => sum + e.metadata.totalRevenue, 0, ); const groupShare = revenueEvents.reduce( (sum, e) => sum + e.metadata.groupShare, 0, ); ``` ## Multi-Tenant Isolation **Access Control Pattern:** ```typescript // Check if user can access group resource export const canAccess = async ( userId: Id<"things">, groupId: Id<"groups">, requiredPermission: string, ) => { const membership = await db .query("connections") .withIndex("from_type", (q) => q .eq("fromThingId", userId) .eq("toThingId", groupId) .eq("relationshipType", "member_of"), ) .first(); if (!membership) return false; const permissions = membership.metadata.permissions || []; return permissions.includes("*") || permissions.includes(requiredPermission); }; ``` ## Notes - **Platform Owner (Anthony)** - Owns ONE group at 100%, receives all platform revenue - **Multi-tenant** - Each group isolated via membership connections - **Hierarchical** - Groups can nest infinitely (friend circles → businesses → organizations) - **6 group types** - friend_circle, business, community, dao, government, organization - **Protocol-agnostic** - Blockchain interactions via `metadata.network` - **Cycle quotas** - Monthly limits enforced per group (mainly organizations) - **Revenue share** - Optional revenue split for referring groups (configurable 0-100%) - **Blockchain billing** - Groups can pay via crypto (SUI/Solana/Base) - **Usage tracking** - All cycle/API usage tracked in group properties - **Event history** - Complete audit trail of group activity - **Flexible scale** - From friend circles (2 people) to governments (billions) without schema changes