feat(personas): Add persona_id support to Ticket/WorkerContext and ConductorEngine
This commit is contained in:
@@ -121,22 +121,25 @@ def parse_history_entries(history_strings: list[str], roles: list[str]) -> list[
|
||||
entries.append({"role": role, "content": content, "collapsed": True, "ts": ts})
|
||||
return entries
|
||||
|
||||
@dataclass
|
||||
@dataclass
|
||||
@dataclass
|
||||
class Ticket:
|
||||
id: str
|
||||
description: str
|
||||
target_symbols: List[str] = field(default_factory=list)
|
||||
context_requirements: List[str] = field(default_factory=list)
|
||||
depends_on: List[str] = field(default_factory=list)
|
||||
status: str = "todo"
|
||||
assigned_to: str = "unassigned"
|
||||
priority: str = "medium"
|
||||
target_file: Optional[str] = None
|
||||
target_symbols: List[str] = field(default_factory=list)
|
||||
context_requirements: List[str] = field(default_factory=list)
|
||||
depends_on: List[str] = field(default_factory=list)
|
||||
blocked_reason: Optional[str] = None
|
||||
step_mode: bool = False
|
||||
retry_count: int = 0
|
||||
manual_block: bool = False
|
||||
model_override: Optional[str] = None
|
||||
persona_id: Optional[str] = None
|
||||
|
||||
def mark_blocked(self, reason: str) -> None:
|
||||
self.status = "blocked"
|
||||
@@ -175,6 +178,7 @@ class Ticket:
|
||||
"retry_count": self.retry_count,
|
||||
"manual_block": self.manual_block,
|
||||
"model_override": self.model_override,
|
||||
"persona_id": self.persona_id,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
@@ -194,6 +198,7 @@ class Ticket:
|
||||
retry_count=data.get("retry_count", 0),
|
||||
manual_block=data.get("manual_block", False),
|
||||
model_override=data.get("model_override"),
|
||||
persona_id=data.get("persona_id"),
|
||||
)
|
||||
|
||||
|
||||
@@ -224,12 +229,15 @@ class Track:
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
@dataclass
|
||||
@dataclass
|
||||
class WorkerContext:
|
||||
ticket_id: str
|
||||
model_name: str
|
||||
tool_preset: Optional[str] = None
|
||||
messages: List[Dict[str, Any]] = field(default_factory=list)
|
||||
tool_preset: Optional[str] = None
|
||||
persona_id: Optional[str] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
|
||||
@@ -295,7 +295,8 @@ class ConductorEngine:
|
||||
ticket_id=ticket.id,
|
||||
model_name=model_name,
|
||||
messages=[],
|
||||
tool_preset=self.tier_usage["Tier 3"]["tool_preset"]
|
||||
tool_preset=self.tier_usage["Tier 3"]["tool_preset"],
|
||||
persona_id=ticket.persona_id
|
||||
)
|
||||
context_files = ticket.context_requirements if ticket.context_requirements else None
|
||||
|
||||
@@ -410,6 +411,22 @@ def run_worker_lifecycle(ticket: Ticket, context: WorkerContext, context_files:
|
||||
ai_client.set_provider(ai_client.get_provider(), context.model_name)
|
||||
ai_client.set_tool_preset(context.tool_preset)
|
||||
|
||||
# Apply Persona if specified
|
||||
if context.persona_id:
|
||||
from src.personas import PersonaManager
|
||||
from src import paths
|
||||
pm = PersonaManager(Path(paths.get_project_personas_path(Path.cwd())) if paths.get_project_personas_path(Path.cwd()).exists() else None)
|
||||
try:
|
||||
personas = pm.load_all()
|
||||
if context.persona_id in personas:
|
||||
persona = personas[context.persona_id]
|
||||
if persona.system_prompt:
|
||||
ai_client.set_custom_system_prompt(persona.system_prompt)
|
||||
if persona.bias_profile:
|
||||
ai_client.set_bias_profile(persona.bias_profile)
|
||||
except Exception as e:
|
||||
print(f"[WARN] Failed to load persona {context.persona_id}: {e}")
|
||||
|
||||
# Check for abort BEFORE any major work
|
||||
if engine and hasattr(engine, "_abort_events"):
|
||||
abort_event = engine._abort_events.get(ticket.id)
|
||||
|
||||
Reference in New Issue
Block a user