File size: 2,928 Bytes
4a2ab42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3b7834d
 
 
 
 
 
4a2ab42
 
 
 
 
 
 
3b7834d
 
 
 
 
 
4a2ab42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import uuid

from sqlalchemy import (
    JSON,
    Boolean,
    Column,
    DateTime,
    ForeignKey,
    Integer,
    String,
    Text,
)
from sqlalchemy.orm import relationship

from core.database import Base, utc_now


class PluginRegistry(Base):
    __tablename__ = "plugin_registry"

    plugin_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    namespace = Column(String, unique=True, nullable=False, index=True)
    version = Column(String, nullable=False)
    trust_level = Column(
        String, nullable=False
    )  # 'official', 'verified', 'community', 'custom'
    status = Column(
        String, default="inactive", index=True
    )  # 'active', 'inactive', 'quarantined'
    metadata_json = Column(JSON, nullable=False)
    signature = Column(Text)
    created_at = Column(DateTime, default=utc_now)
    updated_at = Column(DateTime, default=utc_now, onupdate=utc_now)
    created_by = Column(String, ForeignKey("users.id"))

    # Relationships
    dependencies = relationship(
        "PluginDependency", back_populates="plugin", cascade="all, delete-orphan"
    )
    permissions = relationship(
        "PluginPermission", back_populates="plugin", cascade="all, delete-orphan"
    )
    executions = relationship("PluginExecution", back_populates="plugin")


class PluginDependency(Base):
    __tablename__ = "plugin_dependencies"

    dependency_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    plugin_id = Column(String, ForeignKey("plugin_registry.plugin_id"), index=True)
    depends_on_namespace = Column(String, nullable=False)
    version_constraint = Column(String, nullable=False)
    is_required = Column(Boolean, default=True)
    created_at = Column(DateTime, default=utc_now)

    plugin = relationship("PluginRegistry", back_populates="dependencies")


class PluginPermission(Base):
    __tablename__ = "plugin_permissions"

    permission_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    plugin_id = Column(String, ForeignKey("plugin_registry.plugin_id"), index=True)
    permission_name = Column(String, nullable=False)
    granted_at = Column(DateTime, default=utc_now)
    granted_by = Column(String, ForeignKey("users.id"))

    plugin = relationship("PluginRegistry", back_populates="permissions")


class PluginExecution(Base):
    __tablename__ = "plugin_executions"

    execution_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    plugin_id = Column(String, ForeignKey("plugin_registry.plugin_id"), index=True)
    started_at = Column(DateTime, default=utc_now)
    completed_at = Column(DateTime)
    status = Column(String)  # 'success', 'failure', 'timeout'
    execution_time_ms = Column(Integer)
    error_message = Column(Text)
    input_hash = Column(String)
    output_hash = Column(String)

    plugin = relationship("PluginRegistry", back_populates="executions")