entity: IRCChannel version: "1.0" description: "IRC-style chat channel" package: irc_webchat fields: id: type: cuid primary: true generated: true description: "Unique channel identifier" tenantId: type: uuid required: true index: true description: "Tenant this channel belongs to" name: type: string required: true max_length: 50 pattern: "^#[a-zA-Z0-9_-]+$" description: "Channel name (e.g., #general)" topic: type: string nullable: true max_length: 500 description: "Channel topic" description: type: string nullable: true description: "Channel description" mode: type: enum required: true values: [public, private, secret] default: public description: "Channel visibility mode" password: type: string nullable: true description: "Password for private channels" maxUsers: type: integer nullable: true description: "Maximum users limit" slowMode: type: integer nullable: true description: "Seconds between messages" isDefault: type: boolean default: false index: true description: "Whether users auto-join this channel" createdAt: type: bigint required: true description: "Creation timestamp" createdBy: type: uuid nullable: true description: "Creator user ID" indexes: - fields: [tenantId, name] unique: true name: tenant_name acl: create: moderator: true read: user: true update: moderator: true delete: admin: true --- entity: IRCMessage version: "1.0" description: "IRC chat message" package: irc_webchat fields: id: type: cuid primary: true generated: true description: "Unique message identifier" tenantId: type: uuid required: true description: "Tenant this message belongs to" channelId: type: cuid required: true index: true description: "Channel this message belongs to" userId: type: uuid required: true index: true description: "User who sent the message" username: type: string required: true description: "Username at time of message" type: type: enum required: true values: [message, action, notice, system, join, part, kick, ban] default: message description: "Message type" content: type: string required: true description: "Message content" isCommand: type: boolean default: false description: "Whether message was a command" metadata: type: json nullable: true description: "Additional data (mentions, links, etc.)" createdAt: type: bigint required: true index: true description: "Message timestamp" indexes: - fields: [channelId, createdAt] name: channel_time acl: create: user: true read: user: true update: supergod: true delete: moderator: true --- entity: IRCMembership version: "1.0" description: "User membership in an IRC channel" package: irc_webchat fields: id: type: cuid primary: true generated: true description: "Unique membership identifier" channelId: type: cuid required: true index: true description: "Channel ID" userId: type: uuid required: true index: true description: "User ID" username: type: string required: true description: "Username" role: type: enum required: true values: [user, voice, halfop, op, admin, owner] default: user description: "User role in channel" joinedAt: type: bigint required: true description: "Join timestamp" lastActive: type: bigint nullable: true description: "Last activity timestamp" isBanned: type: boolean default: false description: "Whether user is banned" isKicked: type: boolean default: false description: "Whether user was kicked" kickReason: type: string nullable: true description: "Reason for kick" metadata: type: json nullable: true description: "User preferences in channel" indexes: - fields: [channelId, userId] unique: true name: channel_user acl: create: user: true read: user: true update: moderator: true delete: moderator: true