/** * Light membership roles — Phase 4/5 preview. * Deep paid tiers + chain permissioning come later. */ export type MemberRole = | "viewer" | "portal_member" | "wallet_member" | "operator"; export type MembershipProfile = { primary: MemberRole; roles: MemberRole[]; tierLabel: string; blurb: string; }; const ROLE_META: Record< MemberRole, { label: string; can: string[] } > = { viewer: { label: "Viewer", can: ["Open explorer", "Read docs"], }, portal_member: { label: "Portal member", can: ["Dashboard", "Save session", "Request access later"], }, wallet_member: { label: "Wallet member", can: ["Show linked address", "Local anvil chain switch"], }, operator: { label: "Operator", can: ["Machine keys (M2M)", "Worker APIs — later"], }, }; export function roleLabel(role: MemberRole): string { return ROLE_META[role].label; } export function roleCapabilities(role: MemberRole): string[] { return ROLE_META[role].can; } /** * Derive light roles from how the person signed in. * Not security-critical yet — UI honesty only. */ export function membershipFor(input: { isSignedIn: boolean; source: "briven" | "demo" | "wallet" | "konnos" | null; walletAddress?: string | null; label?: string | null; }): MembershipProfile { if (!input.isSignedIn) { return { primary: "viewer", roles: ["viewer"], tierLabel: "Guest", blurb: "Sign in or connect a wallet for a personal dashboard.", }; } const roles = new Set(["viewer"]); if (input.source === "wallet" || input.walletAddress) { roles.add("wallet_member"); } if (input.source === "briven" || input.source === "demo") { roles.add("portal_member"); } // Placeholder: later map Briven project roles / M2M operator claims if (input.label?.toLowerCase().includes("operator")) { roles.add("operator"); } const list = Array.from(roles); const primary: MemberRole = list.includes("operator") ? "operator" : list.includes("wallet_member") && !list.includes("portal_member") ? "wallet_member" : list.includes("portal_member") ? "portal_member" : "viewer"; const tierLabel = primary === "operator" ? "Operator preview" : primary === "wallet_member" ? "Wallet member" : "Portal member"; const blurb = primary === "wallet_member" ? "You connected a browser wallet. Full chain membership (validators, gated APIs) lands later." : primary === "operator" ? "Operator-style access is preview-only. M2M machine clients power background jobs." : "You have a portal session. Paid tiers and network membership roles come later."; return { primary, roles: list, tierLabel, blurb }; }