"""Temporal worker entrypoint for activity-core. Starts two workers (wired up in T20): - orchestrator-tq: RunActivityWorkflow + its activities - task-execution-tq: TaskExecutorWorkflow Run with: TEMPORAL_HOST=localhost:7233 \ ACTCORE_DB_URL=postgresql+asyncpg://actcore:actcore@localhost:5433/actcore \ python -m activity_core.worker Environment variables: TEMPORAL_HOST Temporal frontend address (default: localhost:7233) TEMPORAL_NAMESPACE Temporal namespace (default: default) ACTCORE_DB_URL App DB connection string (required) """ from __future__ import annotations import asyncio import os from temporalio.client import Client from temporalio.worker import Worker from activity_core.activities import ( init_session_factory, load_activity_definition, log_run, resolve_context, ) from activity_core.workflows import RunActivityWorkflow, TaskExecutorWorkflow TEMPORAL_HOST = os.environ.get("TEMPORAL_HOST", "localhost:7233") TEMPORAL_NAMESPACE = os.environ.get("TEMPORAL_NAMESPACE", "default") ORCHESTRATOR_TASK_QUEUE = "orchestrator-tq" TASK_EXECUTION_TASK_QUEUE = "task-execution-tq" async def run() -> None: db_url = os.environ.get("ACTCORE_DB_URL") if not db_url: raise RuntimeError("ACTCORE_DB_URL is required") init_session_factory(db_url) client = await Client.connect(TEMPORAL_HOST, namespace=TEMPORAL_NAMESPACE) orchestrator_worker = Worker( client, task_queue=ORCHESTRATOR_TASK_QUEUE, workflows=[RunActivityWorkflow], activities=[load_activity_definition, resolve_context, log_run], ) task_worker = Worker( client, task_queue=TASK_EXECUTION_TASK_QUEUE, workflows=[TaskExecutorWorkflow], activities=[], ) async with orchestrator_worker, task_worker: print( f"Workers running — queues: {ORCHESTRATOR_TASK_QUEUE!r}, " f"{TASK_EXECUTION_TASK_QUEUE!r} (namespace={TEMPORAL_NAMESPACE!r})" ) await asyncio.Future() # run until cancelled if __name__ == "__main__": asyncio.run(run())