Fix CI/CD: Add Gitea Actions workflow and fix linting issues
This commit is contained in:
14
orchestrator/__init__.py
Normal file
14
orchestrator/__init__.py
Normal file
@@ -0,0 +1,14 @@
|
||||
"""
|
||||
Orchestrator Module for 7000%AUTO
|
||||
Manages AI agent workflow and project state
|
||||
"""
|
||||
|
||||
from .state import ProjectState, StateManager, AgentType
|
||||
from .opencode_client import OpenCodeClient, OpenCodeError
|
||||
from .workflow import WorkflowOrchestrator, WorkflowEvent, WorkflowEventType
|
||||
|
||||
__all__ = [
|
||||
'ProjectState', 'StateManager', 'AgentType',
|
||||
'OpenCodeClient', 'OpenCodeError',
|
||||
'WorkflowOrchestrator', 'WorkflowEvent', 'WorkflowEventType'
|
||||
]
|
||||
2799
orchestrator/opencode_client.py
Normal file
2799
orchestrator/opencode_client.py
Normal file
File diff suppressed because it is too large
Load Diff
131
orchestrator/state.py
Normal file
131
orchestrator/state.py
Normal file
@@ -0,0 +1,131 @@
|
||||
"""
|
||||
Project State Management for 7000%AUTO
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
from typing import Optional, Dict, List, Any
|
||||
|
||||
|
||||
class AgentType(str, Enum):
|
||||
"""Agent types in the workflow"""
|
||||
IDEATOR = "ideator"
|
||||
PLANNER = "planner"
|
||||
DEVELOPER = "developer"
|
||||
TESTER = "tester"
|
||||
UPLOADER = "uploader"
|
||||
EVANGELIST = "evangelist"
|
||||
|
||||
|
||||
@dataclass
|
||||
class ProjectState:
|
||||
"""State of a project in the workflow"""
|
||||
project_id: int
|
||||
current_agent: Optional[str] = None
|
||||
status: str = "ideation"
|
||||
idea: Optional[Dict[str, Any]] = None
|
||||
plan: Optional[Dict[str, Any]] = None
|
||||
dev_test_iterations: int = 0
|
||||
github_url: Optional[str] = None
|
||||
x_post_url: Optional[str] = None
|
||||
created_at: datetime = field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = field(default_factory=datetime.utcnow)
|
||||
errors: List[str] = field(default_factory=list)
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return {
|
||||
"project_id": self.project_id,
|
||||
"current_agent": self.current_agent,
|
||||
"status": self.status,
|
||||
"idea": self.idea,
|
||||
"plan": self.plan,
|
||||
"dev_test_iterations": self.dev_test_iterations,
|
||||
"github_url": self.github_url,
|
||||
"x_post_url": self.x_post_url,
|
||||
"created_at": self.created_at.isoformat() if self.created_at else None,
|
||||
"updated_at": self.updated_at.isoformat() if self.updated_at else None,
|
||||
"errors": self.errors
|
||||
}
|
||||
|
||||
|
||||
class StateManager:
|
||||
"""Manages project states"""
|
||||
|
||||
def __init__(self):
|
||||
self._states: Dict[int, ProjectState] = {}
|
||||
self._active_project_id: Optional[int] = None
|
||||
self._lock = asyncio.Lock()
|
||||
|
||||
async def get_state(self, project_id: int) -> Optional[ProjectState]:
|
||||
"""Get state for a project"""
|
||||
async with self._lock:
|
||||
return self._states.get(project_id)
|
||||
|
||||
async def create_state(self, project_id: int) -> ProjectState:
|
||||
"""Create new project state"""
|
||||
async with self._lock:
|
||||
state = ProjectState(project_id=project_id)
|
||||
self._states[project_id] = state
|
||||
return state
|
||||
|
||||
async def update_state(
|
||||
self,
|
||||
project_id: int,
|
||||
current_agent: Optional[str] = None,
|
||||
status: Optional[str] = None,
|
||||
idea: Optional[Dict] = None,
|
||||
plan: Optional[Dict] = None,
|
||||
dev_test_iterations: Optional[int] = None,
|
||||
github_url: Optional[str] = None,
|
||||
x_post_url: Optional[str] = None,
|
||||
error: Optional[str] = None
|
||||
) -> Optional[ProjectState]:
|
||||
"""Update project state"""
|
||||
async with self._lock:
|
||||
state = self._states.get(project_id)
|
||||
if not state:
|
||||
return None
|
||||
|
||||
if current_agent is not None:
|
||||
state.current_agent = current_agent
|
||||
if status is not None:
|
||||
state.status = status
|
||||
if idea is not None:
|
||||
state.idea = idea
|
||||
if plan is not None:
|
||||
state.plan = plan
|
||||
if dev_test_iterations is not None:
|
||||
state.dev_test_iterations = dev_test_iterations
|
||||
if github_url is not None:
|
||||
state.github_url = github_url
|
||||
if x_post_url is not None:
|
||||
state.x_post_url = x_post_url
|
||||
if error is not None:
|
||||
state.errors.append(error)
|
||||
|
||||
state.updated_at = datetime.utcnow()
|
||||
return state
|
||||
|
||||
async def get_active_project_id(self) -> Optional[int]:
|
||||
"""Get currently active project ID"""
|
||||
async with self._lock:
|
||||
return self._active_project_id
|
||||
|
||||
async def set_active_project(self, project_id: Optional[int]):
|
||||
"""Set active project"""
|
||||
async with self._lock:
|
||||
self._active_project_id = project_id
|
||||
|
||||
async def get_active_state(self) -> Optional[ProjectState]:
|
||||
"""Get state of active project"""
|
||||
project_id = await self.get_active_project_id()
|
||||
if project_id is None:
|
||||
return None
|
||||
return await self.get_state(project_id)
|
||||
|
||||
async def get_all_states(self) -> List[ProjectState]:
|
||||
"""Get all project states"""
|
||||
async with self._lock:
|
||||
return list(self._states.values())
|
||||
1059
orchestrator/workflow.py
Normal file
1059
orchestrator/workflow.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user