Implement plans

This commit is contained in:
2026-03-04 02:19:22 +00:00
parent 34ee49410d
commit 0718a06c19
31 changed files with 3987 additions and 181 deletions

View File

@@ -2176,6 +2176,7 @@ class ExternalSyncEvent(models.Model):
("ok", "OK"),
("failed", "Failed"),
("retrying", "Retrying"),
("waiting_approval", "Waiting Approval"),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
@@ -2227,6 +2228,111 @@ class TaskProviderConfig(models.Model):
]
class CodexRun(models.Model):
STATUS_CHOICES = (
("queued", "Queued"),
("running", "Running"),
("waiting_approval", "Waiting Approval"),
("approved_waiting_resume", "Approved Waiting Resume"),
("denied", "Denied"),
("ok", "OK"),
("failed", "Failed"),
("cancelled", "Cancelled"),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="codex_runs")
task = models.ForeignKey(
DerivedTask,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="codex_runs",
)
derived_task_event = models.ForeignKey(
DerivedTaskEvent,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="codex_runs",
)
source_message = models.ForeignKey(
Message,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="codex_runs",
)
project = models.ForeignKey(
TaskProject,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="codex_runs",
)
epic = models.ForeignKey(
TaskEpic,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="codex_runs",
)
source_service = models.CharField(max_length=255, blank=True, default="")
source_channel = models.CharField(max_length=255, blank=True, default="")
external_chat_id = models.CharField(max_length=255, blank=True, default="")
status = models.CharField(max_length=32, choices=STATUS_CHOICES, default="queued")
request_payload = models.JSONField(default=dict, blank=True)
result_payload = models.JSONField(default=dict, blank=True)
error = models.TextField(blank=True, default="")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
indexes = [
models.Index(fields=["user", "status", "updated_at"]),
models.Index(fields=["user", "source_service", "source_channel", "created_at"]),
]
class CodexPermissionRequest(models.Model):
STATUS_CHOICES = (
("pending", "Pending"),
("approved", "Approved"),
("denied", "Denied"),
("expired", "Expired"),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="codex_permission_requests")
codex_run = models.ForeignKey(
CodexRun,
on_delete=models.CASCADE,
related_name="permission_requests",
)
external_sync_event = models.ForeignKey(
ExternalSyncEvent,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="codex_permission_requests",
)
approval_key = models.CharField(max_length=255, unique=True)
summary = models.TextField(blank=True, default="")
requested_permissions = models.JSONField(default=dict, blank=True)
resume_payload = models.JSONField(default=dict, blank=True)
status = models.CharField(max_length=16, choices=STATUS_CHOICES, default="pending")
requested_at = models.DateTimeField(auto_now_add=True)
resolved_at = models.DateTimeField(null=True, blank=True)
resolved_by_identifier = models.CharField(max_length=255, blank=True, default="")
resolution_note = models.TextField(blank=True, default="")
class Meta:
indexes = [
models.Index(fields=["user", "status", "requested_at"]),
models.Index(fields=["approval_key"]),
]
class ContactAvailabilitySettings(models.Model):
user = models.OneToOneField(
User,