/** * Society Protocol - Federation System v1.0 * * Sistema de federações inspirado no Matrix Protocol * - Federações permissionadas com governança * - Políticas customizáveis por federação * - Homeservers e rooms hierárquicos * - ACLs e permissões granulares * - social.md para definição de federações */ import { EventEmitter } from 'events'; import { type Storage } from './storage.js'; import { type Identity } from './identity.js'; export type FederationId = string; export type PolicyId = string; export type RoleId = string; export type FederationVisibility = 'public' | 'private' | 'invite-only'; export type MemberStatus = 'pending' | 'member' | 'moderator' | 'admin' | 'banned'; export type GovernanceModel = 'dictatorship' | 'oligarchy' | 'democracy' | 'meritocracy'; export interface FederationPolicy { id: PolicyId; name: string; description: string; type: 'allow' | 'deny' | 'require'; resource: string; conditions?: { minReputation?: number; minTrustTier?: 'bronze' | 'silver' | 'gold' | 'platinum'; requireVerification?: boolean; allowedRoles?: RoleId[]; }; createdAt: number; createdBy: string; } export interface FederationRole { id: RoleId; name: string; description: string; permissions: string[]; hierarchy: number; color?: string; } export interface FederationMember { did: string; displayName: string; status: MemberStatus; role: RoleId; joinedAt: number; invitedBy?: string; reputationAtJoin: number; lastActivity: number; metadata?: { avatar?: string; bio?: string; specialties?: string[]; }; } export interface FederationGovernance { model: GovernanceModel; admins: string[]; moderators: string[]; policyChangeThreshold: number; electionEnabled: boolean; electionIntervalDays?: number; votingPower: 'equal' | 'reputation' | 'stake'; } export interface Federation { id: FederationId; name: string; description: string; visibility: FederationVisibility; did: string; creator: string; createdAt: number; governance: FederationGovernance; policies: FederationPolicy[]; roles: FederationRole[]; members: Map; memberCount: number; onlineCount: number; homeserver?: string; rooms: string[]; settings: { allowGuestAccess: boolean; requireInvitation: boolean; autoVerifyMembers: boolean; messageRetentionDays: number; maxRoomSize: number; federationOutbound: boolean; federationInbound: boolean; }; encryption: { enabled: boolean; algorithm: 'x25519-xsalsa20-poly1305' | 'aes-256-gcm'; keyRotationDays: number; }; tags: string[]; avatar?: string; banner?: string; language: string; timezone: string; } export interface SocialManifest { social: { name: string; version: string; description: string; author: string; created: string; }; federation: { visibility: FederationVisibility; governance: GovernanceModel; homeserver?: string; }; policies: Array<{ name: string; type: 'allow' | 'deny' | 'require'; resource: string; conditions?: Record; }>; roles: Array<{ name: string; permissions: string[]; hierarchy: number; }>; settings: { allowGuestAccess: boolean; requireInvitation: boolean; messageRetentionDays: number; maxRoomSize: number; }; } export type FederationPeeringStatus = 'pending' | 'active' | 'rejected' | 'revoked'; export interface FederationPeeringPolicy { allowedTypes: string[]; maxRatePerMinute: number; privacyMode: 'metadata-only' | 'summary' | 'full'; allowedRooms?: string[]; blockedRooms?: string[]; } export interface FederationPeering { id: string; sourceFederationId: FederationId; sourceFederationDid: string; targetFederationDid: string; requestedBy: string; status: FederationPeeringStatus; policy: FederationPeeringPolicy; reason?: string; createdAt: number; updatedAt: number; respondedAt?: number; } export declare class FederationEngine extends EventEmitter { private storage; private identity; private federations; private memberFederations; private proposals; private peerings; constructor(storage: Storage, identity: Identity); createFederation(name: string, description: string, visibility?: FederationVisibility, manifest?: SocialManifest): Promise; joinFederation(federationId: FederationId, did: string, displayName: string, inviterDid?: string): Promise; leaveFederation(federationId: FederationId, did: string): Promise; proposePolicyChange(federationId: FederationId, policy: Partial, proposerDid: string): Promise; voteOnProposal(federationId: FederationId, proposalId: string, voterDid: string, vote: 'yes' | 'no' | 'abstain'): Promise; requestPeering(sourceFederationId: FederationId, targetFederationDid: string, policy?: Partial): Promise; respondPeering(peeringId: string, accepted: boolean, reason?: string): Promise; revokePeering(peeringId: string, reason?: string): Promise; listPeerings(federationId: FederationId, status?: FederationPeeringStatus): FederationPeering[]; getPeering(peeringId: string): FederationPeering | undefined; hasPermission(federation: Federation, did: string, permission: string): boolean; checkPolicy(federation: Federation, action: string, actorDid: string, context?: Record): { allowed: boolean; reason?: string; }; static parseSocialManifest(yamlContent: string): SocialManifest; createFederationFromSocial(socialPath: string): Promise; getFederation(id: FederationId): Federation | undefined; getMemberFederations(did: string): Federation[]; getPublicFederations(): Federation[]; searchFederations(query: string): Federation[]; private getDefaultPolicy; private getDefaultRoles; private normalizePeeringPolicy; private calculateVotingPower; private addMemberToIndex; private removeMemberFromIndex; private saveFederation; private loadFederations; private loadGovernance; private loadPeerings; private persistPeering; private getProposal; private evaluateProposal; private hydrateFederation; private normalizeMembers; } //# sourceMappingURL=federation.d.ts.map