from __future__ import annotations from typing import Any, Literal from pydantic import BaseModel, ConfigDict, Field class ModeCard(BaseModel): model_config = ConfigDict(extra="ignore") workflow_mode: Literal["CHAT", "PLAN", "EXECUTE"] = "CHAT" mode_state: str = "IDLE" allowed_actions: list[str] = Field(default_factory=list) forbidden_actions: list[str] = Field(default_factory=list) exit_conditions: list[str] = Field(default_factory=list) class SemanticDecision(BaseModel): model_config = ConfigDict(extra="ignore") topic_relation: Literal["continue_current_topic", "new_topic", "uncertain"] mode_decision: Literal["stay_plan", "ready_confirm", "request_execute", "answer_only"] draft_patch: dict[str, Any] = Field(default_factory=dict) assistant_reply: str = "" requires_confirmation: bool = False requested_actions: list[str] = Field(default_factory=list) confidence: float = 0.0 uncertainties: list[str] = Field(default_factory=list) class DecisionGateResult(BaseModel): model_config = ConfigDict(extra="ignore") accepted: bool blocked_reasons: list[str] = Field(default_factory=list) allowed_actions: list[str] = Field(default_factory=list) next_plan_status: str needs_confirmation: bool = False mode_state_after: str | None = None