Implement executing tasks

This commit is contained in:
2026-03-03 16:41:28 +00:00
parent d6bd56dace
commit 9c14e51b43
42 changed files with 3410 additions and 121 deletions

View File

@@ -4,6 +4,7 @@ import re
from asgiref.sync import sync_to_async
from django.conf import settings
from django.db.models import Q
from core.clients.transport import send_message_raw
from core.messaging import ai as ai_runner
@@ -14,11 +15,13 @@ from core.models import (
DerivedTask,
DerivedTaskEvent,
ExternalSyncEvent,
ExternalChatLink,
Message,
PersonIdentifier,
TaskCompletionPattern,
TaskProviderConfig,
)
from core.tasks.providers.mock import get_provider
from core.tasks.providers import get_provider
_TASK_HINT_RE = re.compile(r"\b(todo|task|action|need to|please)\b", re.IGNORECASE)
_COMPLETION_RE = re.compile(r"\b(done|completed|fixed)\s*#([A-Za-z0-9_-]+)\b", re.IGNORECASE)
@@ -218,6 +221,64 @@ async def _emit_sync_event(task: DerivedTask, event: DerivedTaskEvent, action: s
provider_settings = dict(getattr(cfg, "settings", {}) or {})
provider = get_provider(provider_name)
idempotency_key = f"{provider_name}:{task.id}:{event.id}"
variants = _channel_variants(task.source_service or "", task.source_channel or "")
person_identifier = None
if variants:
person_identifier = await sync_to_async(
lambda: PersonIdentifier.objects.filter(
user=task.user,
service=task.source_service,
identifier__in=variants,
)
.select_related("person")
.order_by("-id")
.first()
)()
external_chat_id = ""
if person_identifier is not None:
link = await sync_to_async(
lambda: ExternalChatLink.objects.filter(
user=task.user,
provider=provider_name,
enabled=True,
)
.filter(
Q(person_identifier=person_identifier)
| Q(person=person_identifier.person)
)
.order_by("-updated_at", "-id")
.first()
)()
if link is not None:
external_chat_id = str(link.external_chat_id or "").strip()
# Worker-backed providers are queued and executed by `manage.py codex_worker`.
if bool(getattr(provider, "run_in_worker", False)):
await sync_to_async(ExternalSyncEvent.objects.update_or_create)(
idempotency_key=idempotency_key,
defaults={
"user": task.user,
"task": task,
"task_event": event,
"provider": provider_name,
"status": "pending",
"payload": {
"action": action,
"provider_payload": {
"task_id": str(task.id),
"title": task.title,
"external_key": task.external_key,
"reference_code": task.reference_code,
"source_service": str(task.source_service or ""),
"source_channel": str(task.source_channel or ""),
"external_chat_id": external_chat_id,
"payload": event.payload,
},
},
"error": "",
},
)
return
if action == "create":
result = provider.create_task(provider_settings, {
@@ -225,18 +286,27 @@ async def _emit_sync_event(task: DerivedTask, event: DerivedTaskEvent, action: s
"title": task.title,
"external_key": task.external_key,
"reference_code": task.reference_code,
"source_service": str(task.source_service or ""),
"source_channel": str(task.source_channel or ""),
"external_chat_id": external_chat_id,
})
elif action == "complete":
result = provider.mark_complete(provider_settings, {
"task_id": str(task.id),
"external_key": task.external_key,
"reference_code": task.reference_code,
"source_service": str(task.source_service or ""),
"source_channel": str(task.source_channel or ""),
"external_chat_id": external_chat_id,
})
else:
result = provider.append_update(provider_settings, {
"task_id": str(task.id),
"external_key": task.external_key,
"reference_code": task.reference_code,
"source_service": str(task.source_service or ""),
"source_channel": str(task.source_channel or ""),
"external_chat_id": external_chat_id,
"payload": event.payload,
})