import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, OneToMany, Index, } from 'typeorm'; import { User } from './User'; import { Subscription } from './Subscription'; import { ChatMessage } from './ChatMessage'; export enum AgentStatus { PENDING = 'pending', APPROVED = 'approved', REJECTED = 'rejected', SUSPENDED = 'suspended', } @Entity('agents') @Index(['status', 'approvedAt']) @Index(['category']) @Index(['reputation']) export class Agent { @PrimaryGeneratedColumn('uuid') id: string; @Column() name: string; @Column({ nullable: true }) avatar?: string; // Avatar/image URL @Column('text') description: string; @Column() endpoint: string; // Creator's agent endpoint URL @Column({ nullable: true }) category?: string; // e.g., "image generation", "code analysis", "data processing" @Column('decimal', { precision: 3, scale: 2, default: 0 }) reputation: number; // Rating from 0-5 (average) @Column('text', { array: true, default: [] }) capabilities: string[]; // e.g., ["text-to-image", "image-editing", "file-processing"] @Column('text', { nullable: true }) promptTemplate?: string; // Optional system prompt template @Column('jsonb', { nullable: true }) metadata?: Record; // Additional agent configuration @Column('decimal', { precision: 10, scale: 2 }) price: number; // Legacy field (kept for backward compatibility) @Column('decimal', { precision: 10, scale: 2 }) pointsPerTask: number; // Points charged per task (1 point = $0.05) @Column({ default: true }) isSubscription: boolean; // Legacy: true for subscriptions, false for pay-per-task (deprecated - use pointsPerTask) @Column({ nullable: true }) subscriptionDuration?: number; // Duration in days (if subscription) - Legacy field @Column({ type: 'enum', enum: AgentStatus, default: AgentStatus.PENDING, }) status: AgentStatus; @Column({ nullable: true }) ipfsHash?: string; // IPFS hash for metadata storage @Column({ nullable: true }) approvedAt?: Date; @Column({ nullable: true }) approvedBy?: string; // Admin user ID @Column({ default: 0 }) usageCount: number; // Track total usage @Column({ default: 0 }) ratingCount: number; // Number of ratings (for calculating reputation) @ManyToOne(() => User, (user: User) => user.agents, { eager: false }) creator: User; @Column() creatorId: string; @OneToMany(() => Subscription, (subscription: Subscription) => subscription.agent) subscriptions: Subscription[]; @OneToMany(() => ChatMessage, (message: ChatMessage) => message.agent) messages: ChatMessage[]; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; }