Initial commit: CI Agent competitive-intelligence monitoring app

FastAPI + Celery + Next.js + Postgres/Redis app with company monitoring,
source collection, LLM-based change analysis, enrichment, and account
security (Turnstile, escalating lockout, email verification).
This commit is contained in:
2026-08-05 10:48:20 -04:00
commit 1a4c80958f
365 changed files with 43541 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
from __future__ import annotations
import uuid
from datetime import datetime
from sqlalchemy import DateTime, Enum, ForeignKey, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column
from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin
from app.models.enums import MonitoringRunStatus, MonitoringRunTrigger
class MonitoringRun(Base, UUIDPrimaryKeyMixin, TimestampMixin):
__tablename__ = "monitoring_runs"
company_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("companies.id", ondelete="CASCADE"), index=True
)
trigger_type: Mapped[MonitoringRunTrigger] = mapped_column(
Enum(MonitoringRunTrigger, native_enum=False, length=20)
)
status: Mapped[MonitoringRunStatus] = mapped_column(
Enum(MonitoringRunStatus, native_enum=False, length=20),
default=MonitoringRunStatus.QUEUED,
)
started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
sources_attempted: Mapped[int] = mapped_column(Integer, default=0)
sources_successful: Mapped[int] = mapped_column(Integer, default=0)
sources_failed: Mapped[int] = mapped_column(Integer, default=0)
items_collected: Mapped[int] = mapped_column(Integer, default=0)
changes_detected: Mapped[int] = mapped_column(Integer, default=0)
error_summary: Mapped[str | None] = mapped_column(Text, nullable=True)
worker_task_id: Mapped[str | None] = mapped_column(String(255), nullable=True)