41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from agentci.domain.models import Job, JobKind
|
|
from agentci.workflows.common import Dependencies
|
|
from agentci.workflows.implement import ImplementWorkflow
|
|
from agentci.workflows.plan import PlanWorkflow
|
|
from agentci.workflows.pull_request import PullRequestWorkflow
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class Dispatcher:
|
|
def __init__(self, dependencies: Dependencies) -> None:
|
|
plan = PlanWorkflow(dependencies)
|
|
pull_request = PullRequestWorkflow(dependencies)
|
|
self.handlers = {
|
|
JobKind.PLAN: plan.plan,
|
|
JobKind.DISCUSS: plan.discuss,
|
|
JobKind.ITERATE_PLAN: plan.iterate,
|
|
JobKind.IMPLEMENT: ImplementWorkflow(dependencies).run,
|
|
JobKind.ITERATE_IMPLEMENT: pull_request.iterate,
|
|
JobKind.FIX: pull_request.fix,
|
|
}
|
|
|
|
async def dispatch(self, job: Job) -> None:
|
|
extra = {
|
|
"operation": "workflow.dispatch",
|
|
"job_id": job.id,
|
|
"target": job.target_key,
|
|
"stage": job.kind.value,
|
|
}
|
|
log.info("workflow dispatch started", extra=extra)
|
|
try:
|
|
await self.handlers[job.kind](job)
|
|
except Exception:
|
|
log.exception("workflow dispatch failed", extra=extra)
|
|
raise
|
|
log.info("workflow dispatch completed", extra=extra)
|