Lightweight containerized prosody tooling + moved auth scripts + xmpp reconnect/auth stabilization
This commit is contained in:
@@ -21,6 +21,7 @@ from core.models import (
|
||||
TaskProviderConfig,
|
||||
)
|
||||
from core.tasks.codex_support import channel_variants, resolve_external_chat_id
|
||||
from core.tasks.codex_approval import queue_codex_event_with_pre_approval
|
||||
|
||||
_CODEX_DEFAULT_RE = re.compile(
|
||||
r"^\s*(?:\.codex\b|#codex#?)(?P<body>.*)$",
|
||||
@@ -278,25 +279,48 @@ class CodexCommandHandler(CommandHandler):
|
||||
"resolution_note",
|
||||
]
|
||||
)
|
||||
if request.external_sync_event_id:
|
||||
await sync_to_async(ExternalSyncEvent.objects.filter(id=request.external_sync_event_id).update)(
|
||||
status="ok",
|
||||
error="",
|
||||
)
|
||||
run = request.codex_run
|
||||
run.status = "approved_waiting_resume"
|
||||
run.error = ""
|
||||
await sync_to_async(run.save)(update_fields=["status", "error", "updated_at"])
|
||||
source_service = str(run.source_service or "")
|
||||
source_channel = str(run.source_channel or "")
|
||||
provider_payload = dict(run.request_payload.get("provider_payload") or {})
|
||||
provider_payload.update(
|
||||
{
|
||||
"mode": "approval_response",
|
||||
"approval_key": approval_key,
|
||||
"resume_payload": dict(request.resume_payload or {}),
|
||||
"codex_run_id": str(run.id),
|
||||
"source_service": source_service,
|
||||
"source_channel": source_channel,
|
||||
}
|
||||
)
|
||||
resume_payload = dict(request.resume_payload or {})
|
||||
resume_action = str(resume_payload.get("action") or "").strip().lower()
|
||||
resume_provider_payload = dict(resume_payload.get("provider_payload") or {})
|
||||
if resume_action and resume_provider_payload:
|
||||
provider_payload = dict(resume_provider_payload)
|
||||
provider_payload["codex_run_id"] = str(run.id)
|
||||
provider_payload["source_service"] = source_service
|
||||
provider_payload["source_channel"] = source_channel
|
||||
event_action = resume_action
|
||||
resume_idempotency_key = str(resume_payload.get("idempotency_key") or "").strip()
|
||||
resume_event_key = (
|
||||
resume_idempotency_key
|
||||
if resume_idempotency_key
|
||||
else f"codex_approval:{approval_key}:approved"
|
||||
)
|
||||
else:
|
||||
provider_payload = dict(run.request_payload.get("provider_payload") or {})
|
||||
provider_payload.update(
|
||||
{
|
||||
"mode": "approval_response",
|
||||
"approval_key": approval_key,
|
||||
"resume_payload": dict(request.resume_payload or {}),
|
||||
"codex_run_id": str(run.id),
|
||||
"source_service": source_service,
|
||||
"source_channel": source_channel,
|
||||
}
|
||||
)
|
||||
event_action = "append_update"
|
||||
resume_event_key = f"codex_approval:{approval_key}:approved"
|
||||
await sync_to_async(ExternalSyncEvent.objects.update_or_create)(
|
||||
idempotency_key=f"codex_approval:{approval_key}:approved",
|
||||
idempotency_key=resume_event_key,
|
||||
defaults={
|
||||
"user": trigger.user,
|
||||
"task_id": run.task_id,
|
||||
@@ -304,7 +328,7 @@ class CodexCommandHandler(CommandHandler):
|
||||
"provider": "codex_cli",
|
||||
"status": "pending",
|
||||
"payload": {
|
||||
"action": "append_update",
|
||||
"action": event_action,
|
||||
"provider_payload": provider_payload,
|
||||
},
|
||||
"error": "",
|
||||
@@ -319,6 +343,11 @@ class CodexCommandHandler(CommandHandler):
|
||||
await sync_to_async(request.save)(
|
||||
update_fields=["status", "resolved_at", "resolved_by_identifier", "resolution_note"]
|
||||
)
|
||||
if request.external_sync_event_id:
|
||||
await sync_to_async(ExternalSyncEvent.objects.filter(id=request.external_sync_event_id).update)(
|
||||
status="failed",
|
||||
error="approval_denied",
|
||||
)
|
||||
run = request.codex_run
|
||||
run.status = "denied"
|
||||
run.error = "approval_denied"
|
||||
@@ -411,7 +440,7 @@ class CodexCommandHandler(CommandHandler):
|
||||
source_service=service,
|
||||
source_channel=channel,
|
||||
external_chat_id=external_chat_id,
|
||||
status="queued",
|
||||
status="waiting_approval",
|
||||
request_payload={"action": "append_update", "provider_payload": dict(payload)},
|
||||
result_payload={},
|
||||
error="",
|
||||
@@ -421,22 +450,20 @@ class CodexCommandHandler(CommandHandler):
|
||||
await sync_to_async(run.save)(update_fields=["request_payload", "updated_at"])
|
||||
|
||||
idempotency_key = f"codex_cmd:{trigger.id}:{mode}:{task.id}:{hashlib.sha1(str(body_text or '').encode('utf-8')).hexdigest()[:12]}"
|
||||
await sync_to_async(ExternalSyncEvent.objects.update_or_create)(
|
||||
await sync_to_async(queue_codex_event_with_pre_approval)(
|
||||
user=trigger.user,
|
||||
run=run,
|
||||
task=task,
|
||||
task_event=None,
|
||||
action="append_update",
|
||||
provider_payload=dict(payload),
|
||||
idempotency_key=idempotency_key,
|
||||
defaults={
|
||||
"user": trigger.user,
|
||||
"task": task,
|
||||
"task_event": None,
|
||||
"provider": "codex_cli",
|
||||
"status": "pending",
|
||||
"payload": {
|
||||
"action": "append_update",
|
||||
"provider_payload": dict(payload),
|
||||
},
|
||||
"error": "",
|
||||
},
|
||||
)
|
||||
return CommandResult(ok=True, status="ok", payload={"codex_run_id": str(run.id)})
|
||||
return CommandResult(
|
||||
ok=True,
|
||||
status="ok",
|
||||
payload={"codex_run_id": str(run.id), "approval_required": True},
|
||||
)
|
||||
|
||||
async def execute(self, ctx: CommandContext) -> CommandResult:
|
||||
trigger = await self._load_trigger(ctx.message_id)
|
||||
|
||||
Reference in New Issue
Block a user