"""Core data models for the OPC system.""" from __future__ import annotations import uuid from dataclasses import dataclass, field from datetime import datetime from enum import Enum from typing import Any, Literal # --------------------------------------------------------------------------- # Enums # --------------------------------------------------------------------------- RoleRuntimeStatus = Literal["idle", "running", "blocked"] ROLE_RUNTIME_STATUSES: frozenset[str] = frozenset({"idle", "running", "blocked"}) def normalize_role_runtime_status( status: Any, focused_work_item_id: Any = "", *, default: RoleRuntimeStatus = "idle", ) -> RoleRuntimeStatus: """Collapse company-mode role/member/seat runtime status to three states. Legacy values are normalized at the boundary so the runtime does not keep carrying ``cold`` / ``reserved`` / ``draining`` style states internally. """ text = str(status or "").strip().lower() focused = bool(str(focused_work_item_id or "").strip()) if text == "idle": return "idle" if text == "running": return "running" if focused else "idle" if text == "blocked": return "blocked" if text == "": return "blocked" if focused else default if text == "cold": return "idle" if text in {"reserved", "booting", "draining"}: return "running" if focused else "idle" if text in {"dead", "handoff_pending"}: return "blocked" if focused: return "blocked" return default class ExecutionMode(str, Enum): TASK_MODE = "task_mode" COMPANY_MODE = "company_mode" PROJECT_MODE = "task_mode" SINGLE_AGENT = "task_mode" MULTI_AGENT = "company_mode" @classmethod def _missing_(cls, value: object) -> "ExecutionMode" | None: if not isinstance(value, str): return None normalized = value.strip().lower() if normalized in {"project_mode", "task_mode", "project", "task"}: return cls.TASK_MODE if normalized in {"company_mode", "company"}: return cls.COMPANY_MODE return None class CompanyProfile(str, Enum): CORPORATE = "corporate" CUSTOM = "custom" class GoalLevel(str, Enum): COMPANY = "company" DEPARTMENT = "department" TEAM = "team" TASK = "task" class GoalStatus(str, Enum): ACTIVE = "active" COMPLETED = "completed" PAUSED = "paused" CANCELLED = "cancelled" class WorkItemExecutionStrategy(str, Enum): AUTO = "auto" NATIVE = "native" EXTERNAL = "external" MIXED = "mixed" class TaskStatus(str, Enum): PENDING = "pending" RUNNING = "running" IDLE = "idle" BLOCKED = "blocked" AWAITING_PEER = "awaiting_peer" AWAITING_MANAGER_REVIEW = "awaiting_manager_review" AWAITING_HUMAN = "awaiting_human" AWAITING_REVIEW = "awaiting_review" DONE = "done" FAILED = "failed" CANCELLED = "cancelled" class Phase(str, Enum): """Single authoritative state of a delegation work item. Replaces the previous mixture of `status` + 5 metadata sub-state fields. Pure-function projections (kanban_column / is_runnable / effective_owner / verdict / task_status_for_phase) and the transition table live in `opc.layer2_organization.phase`. """ # ─── kanban column: todo (not yet started) ──────────────────────────── QUEUED = "queued" # manager has not released READY = "ready" # released, dispatchable READY_FOR_REWORK = "ready_for_rework" # returned by reviewer WAITING_DEPENDENCIES = "waiting_dependencies" # upstream not done # ─── kanban column: in_progress (worker holds the card) ─────────────── RUNNING = "running" WAITING_FOR_PEER = "waiting_for_peer" WAITING_FOR_CHILDREN = "waiting_for_children" PAUSED = "paused" # soft-interrupted NEEDS_ATTENTION = "needs_attention" # worker flagged blocker # ─── kanban column: in_review (manager holds the card) ──────────────── AWAITING_MANAGER_REVIEW = "awaiting_manager_review" AWAITING_HUMAN = "awaiting_human" # ─── kanban column: done (terminal) ─────────────────────────────────── APPROVED = "approved" FAILED = "failed" CANCELLED = "cancelled" class AgentStatus(str, Enum): IDLE = "idle" RUNNING = "running" BLOCKED = "blocked" ERROR = "error" class MessageUrgency(str, Enum): BLOCKING = "blocking" HIGH = "high" NORMAL = "normal" LOW = "low" class MessageStatus(str, Enum): SENT = "sent" DELIVERED = "delivered" READ = "read" REPLIED = "replied" TIMED_OUT = "timed_out" CANCELLED = "cancelled" class AgentEndpointType(str, Enum): COMPANY_ROLE = "company_role" NATIVE_SUBAGENT = "native_subagent" EXTERNAL_AGENT = "external_agent" class CommsTransportKind(str, Enum): DM = "dm" BROADCAST = "broadcast" MEETING = "meeting" SYSTEM = "system" class CommsSemanticType(str, Enum): # Values observed in runtime or kept for the legacy single-team path that # a future C-batch cleanup will evaluate. 10 other values # (ASSIGNMENT, DEPENDENCY_REQUEST, DEPENDENCY_REPLY, APPROVAL_REPLY, # CROSS_TEAM_REQUEST, CROSS_TEAM_REPLY, PERMISSION_REQUEST, # PERMISSION_RESPONSE, PLAN_APPROVAL_REQUEST, PLAN_APPROVAL_RESPONSE) # were removed: zero code writes them and no runtime message ever # carries them — they were only referenced in classification set # literals (themselves dead code paths) and worker_envelope look-up # tables. See plans/task-cleanup-dead-comms.md. WORK_UPDATE = "work_update" IDLE_NOTIFICATION = "idle_notification" BLOCKED_ON_DECISION = "blocked_on_decision" HANDOFF_READY = "handoff_ready" WORK_ITEM_RESULT = "work_item_result" BLOCKER = "blocker" APPROVAL_REQUEST = "approval_request" COMPLETION = "completion" STATUS_DIGEST = "status_digest" class CommsState(str, Enum): OPEN = "open" ACKNOWLEDGED = "acknowledged" RESOLVED = "resolved" EXPIRED = "expired" SUPERSEDED = "superseded" class MeetingStatus(str, Enum): OPEN = "open" IN_PROGRESS = "in_progress" DECIDED = "decided" CLOSED = "closed" CANCELLED = "cancelled" class EscalationType(str, Enum): INFO_NEEDED = "info_needed" DECISION_NEEDED = "decision_needed" RISK_WARNING = "risk_warning" RECOMMENDATION = "recommendation" class RiskLevel(str, Enum): LOW = "low" MEDIUM = "medium" HIGH = "high" CRITICAL = "critical" class ApprovalAction(str, Enum): AUTO_APPROVE = "auto_approve" ESCALATE = "escalate" REJECT = "reject" REQUIRE_INPUT = "require_input" class PermissionResolution(str, Enum): ALLOW = "allow" ASK = "ask" DENY = "deny" class PermissionScope(str, Enum): ONCE = "once" SESSION = "session" PROJECT = "project" GLOBAL = "global" class ReorgScope(str, Enum): TASK_ADJUSTMENT = "task_adjustment" ORG_MUTATION = "org_mutation" class ReorgRiskLevel(str, Enum): LOW = "low" MEDIUM = "medium" HIGH = "high" class ReorgProposalStatus(str, Enum): PROPOSED = "proposed" APPROVED = "approved" DENIED = "denied" APPLIED = "applied" FAILED = "failed" CANCELLED = "cancelled" class ReorgEventKind(str, Enum): PROPOSED = "proposed" APPROVED = "approved" DENIED = "denied" APPLIED = "applied" MIGRATED = "migrated" AUTO_TASK_ADJUSTED = "auto_task_adjusted" FAILED = "failed" # --------------------------------------------------------------------------- # Layer 0: Messages # --------------------------------------------------------------------------- @dataclass class UserMessage: channel: str user_id: str content: str attachments: list[Any] = field(default_factory=list) timestamp: datetime = field(default_factory=datetime.now) session_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_context: str | None = None metadata: dict[str, Any] = field(default_factory=dict) @dataclass class SystemMessage: channel: str user_id: str session_id: str content: str message_type: Literal["reply", "escalation", "progress", "suggestion"] = "reply" actions: list[dict] = field(default_factory=list) task_ref: str | None = None metadata: dict = field(default_factory=dict) # --------------------------------------------------------------------------- # Layer 1: Mode Selection (replaces old RouterDecision) # --------------------------------------------------------------------------- @dataclass class ModeSelection: """Lightweight mode selection — the user explicitly chooses task or company mode; no LLM-based routing is needed.""" mode: ExecutionMode = ExecutionMode.TASK_MODE org_id: str | None = None preferred_agent: str | None = None domains: list[str] = field(default_factory=list) company_profile: str | None = None sub_tasks: list[Any] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) RouterDecision = ModeSelection # --------------------------------------------------------------------------- # Layer 2: Tasks & Organization # --------------------------------------------------------------------------- # Boundary note: # - In task mode, Task is the user-visible business unit. # - In company mode, Task is only the runtime execution envelope used by # agent/tool/session infrastructure. The company business identity is # DelegationWorkItem.work_item_id, and its business state is # DelegationWorkItem.phase. @dataclass class Task: id: str = field(default_factory=lambda: str(uuid.uuid4())) session_id: str | None = None parent_session_id: str | None = None title: str = "" description: str = "" assigned_to: str = "" status: TaskStatus = TaskStatus.PENDING priority: int = 5 dependencies: list[str] = field(default_factory=list) execution_lock: bool = False context_snapshot: dict = field(default_factory=dict) assigned_external_agent: str | None = None created_at: datetime = field(default_factory=datetime.now) deadline: datetime | None = None result: dict | None = None parent_id: str | None = None project_id: str = "default" tags: list[str] = field(default_factory=list) comments: list[dict] = field(default_factory=list) retry_count: int = 0 max_retries: int = 3 metadata: dict = field(default_factory=dict) org_id: str | None = None goal_id: str | None = None checkout_run_id: str | None = None execution_locked_at: datetime | None = None linked_work_item_id: str = field(default="", repr=False, compare=False) @dataclass class AdaptiveRoleProfile: label: str = "" facets: list[str] = field(default_factory=list) authority_scope: list[str] = field(default_factory=list) execution_bias: str = "balanced" review_bias: str = "balanced" collaboration_style: str = "async" confidence: float = 0.0 evidence: list[str] = field(default_factory=list) @dataclass class AdaptiveWorkItemProfile: turn_kind: str = "execute" dependency_class: str = "hard" blocked_by_projection_ids: list[str] = field(default_factory=list) blocked_by_signals: list[str] = field(default_factory=list) required_artifacts: list[str] = field(default_factory=list) reads: list[str] = field(default_factory=list) writes: list[str] = field(default_factory=list) gate_owner_role_id: str = "" soft_release_allowed: bool = False confidence: float = 0.0 @dataclass class AdaptiveSignalSpec: name: str owner_role_id: str = "" required: bool = True strict: bool = False satisfied: bool = False evidence: list[str] = field(default_factory=list) @dataclass class CoordinationSpec: version: int = 1 inference_mode: str = "heuristic" fallback_mode: str = "conservative" role_profile: AdaptiveRoleProfile = field(default_factory=AdaptiveRoleProfile) work_item_profile: AdaptiveWorkItemProfile = field(default_factory=AdaptiveWorkItemProfile) signals: list[AdaptiveSignalSpec] = field(default_factory=list) emitted_signals: list[str] = field(default_factory=list) hard_dependency_work_item_ids: list[str] = field(default_factory=list) soft_dependency_work_item_ids: list[str] = field(default_factory=list) normalized_state: str = "planned" notes: list[str] = field(default_factory=list) confidence: float = 0.0 evidence: list[str] = field(default_factory=list) @dataclass class DelegationRun: run_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str = "" company_profile: str = CompanyProfile.CORPORATE.value execution_model: str = "actor_runtime" final_decider_role_id: str = "" top_level_role_ids: list[str] = field(default_factory=list) status: str = "pending" lifecycle_status: str = "active" current_revision: int = 1 latest_deliverable_summary: str = "" recovery_pointer: dict[str, Any] = field(default_factory=dict) project_dossier: dict[str, Any] = field(default_factory=dict) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class DelegationCell: cell_id: str = field(default_factory=lambda: str(uuid.uuid4())) run_id: str = "" manager_role_id: str = "" member_role_ids: list[str] = field(default_factory=list) status: str = "idle" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) # Company-mode boundary note: # DelegationWorkItem is the user/business work unit. The structured # work_item_runtime_links table owns the runtime Task projection relation. @dataclass class DelegationWorkItem: work_item_id: str = field(default_factory=lambda: str(uuid.uuid4())) run_id: str = "" cell_id: str = "" team_instance_id: str = "" team_id: str = "" role_id: str = "" seat_id: str = "" seat_state_id: str = "" role_runtime_session_id: str = "" parent_work_item_id: str | None = None source_role_id: str | None = None source_seat_id: str | None = None title: str = "" summary: str = "" kind: str = "execute" projection_id: str = "" phase: Phase = Phase.READY batch_id: str = "" batch_index: int = 0 deliverable_summary: str = "" blocked_reason: str = "" handoff_status: str = "pending" continuation_source: str = "" manager_role_id: str = "" manager_seat_id: str = "" claimed_by_role_runtime_session_id: str = "" claimed_by_seat_id: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) def __post_init__(self) -> None: if not isinstance(self.phase, Phase): try: self.phase = Phase(str(self.phase or Phase.READY.value)) except ValueError: self.phase = Phase.READY self.metadata = dict(self.metadata or {}) @dataclass class DelegationEvent: event_id: str = field(default_factory=lambda: str(uuid.uuid4())) run_id: str = "" work_item_id: str | None = None cell_id: str | None = None role_id: str | None = None event_type: str = "created" payload: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class RoleRuntimeSession: role_session_id: str = field(default_factory=lambda: str(uuid.uuid4())) run_id: str = "" project_id: str = "default" team_instance_id: str = "" team_id: str = "" role_id: str = "" seat_id: str = "" seat_state_id: str = "" employee_id: str = "" focused_work_item_id: str = "" background_work_item_ids: list[str] = field(default_factory=list) manager_role_ids: list[str] = field(default_factory=list) manager_seat_ids: list[str] = field(default_factory=list) seat_ids: list[str] = field(default_factory=list) adapter_session_state: dict[str, Any] = field(default_factory=dict) inbox_state: dict[str, Any] = field(default_factory=dict) memory_slices_by_work_item: dict[str, list[str]] = field(default_factory=dict) resume_state: dict[str, Any] = field(default_factory=dict) current_work_item: dict[str, Any] = field(default_factory=dict) latest_notification: dict[str, Any] = field(default_factory=dict) manager_digest: dict[str, Any] = field(default_factory=dict) status: str = "idle" # Fix 5 PR3: FIFO queue of work_item_ids awaiting this role's session. # A role executes one work item at a time (``focused_work_item_id``); # new runnable work for the same role is appended here by the # ``enqueue_session_work_on_runnable_hook``. When focus clears, the # ``clear_session_focus_on_terminal_hook`` pops the head and signals # the dispatcher to pick it up. Gated by # ``OrgConfig.role_serial_queue_enabled`` (on by default for company mode). pending_work_item_ids: list[str] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) DelegationRoleSession = RoleRuntimeSession @dataclass class CompanyMemberSession: member_session_id: str = field(default_factory=lambda: str(uuid.uuid4())) role_session_id: str = "" team_instance_id: str = "" team_id: str = "" role_id: str = "" seat_id: str = "" seat_state_id: str = "" employee_id: str = "" status: str = "idle" resident_status: str = "idle" current_task_id: str = "" focused_work_item_id: str = "" background_work_item_ids: list[str] = field(default_factory=list) inbox_cursor: int = 0 working_memory: list[str] = field(default_factory=list) memory_slices_by_work_item: dict[str, list[str]] = field(default_factory=dict) resume_state: dict[str, Any] = field(default_factory=dict) adapter_session_state: dict[str, Any] = field(default_factory=dict) pending_inbox: list[dict[str, Any]] = field(default_factory=list) queued_inbox: list[dict[str, Any]] = field(default_factory=list) actionable_chat: list[dict[str, Any]] = field(default_factory=list) protocol_backlog: list[dict[str, Any]] = field(default_factory=list) notification_backlog: list[dict[str, Any]] = field(default_factory=list) actionable_inbox_count: int = 0 protocol_backlog_count: int = 0 notification_backlog_count: int = 0 latest_notification: dict[str, Any] = field(default_factory=dict) manager_role_id: str = "" manager_role_ids: list[str] = field(default_factory=list) inbox_state: dict[str, Any] = field(default_factory=dict) current_turn_mode: str = "" current_assignment: dict[str, Any] = field(default_factory=dict) current_work_item: dict[str, Any] = field(default_factory=dict) manager_digest: dict[str, Any] = field(default_factory=dict) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class TeamInstance: team_instance_id: str = field(default_factory=lambda: str(uuid.uuid4())) run_id: str = "" project_id: str = "default" team_id: str = "" session_id: str = "" status: str = "pending" seat_ids: list[str] = field(default_factory=list) role_ids: list[str] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class SeatState: seat_state_id: str = field(default_factory=lambda: str(uuid.uuid4())) team_instance_id: str = "" run_id: str = "" project_id: str = "default" team_id: str = "" seat_id: str = "" role_id: str = "" employee_id: str = "" member_session_id: str = "" role_runtime_session_id: str = "" status: str = "idle" resident_status: str = "idle" current_task_id: str = "" current_work_item_id: str = "" manager_role_id: str = "" manager_seat_id: str = "" manager_role_ids: list[str] = field(default_factory=list) manager_seat_ids: list[str] = field(default_factory=list) inbox_state: dict[str, Any] = field(default_factory=dict) resume_state: dict[str, Any] = field(default_factory=dict) current_work_item: dict[str, Any] = field(default_factory=dict) latest_notification: dict[str, Any] = field(default_factory=dict) manager_digest: dict[str, Any] = field(default_factory=dict) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class StructuredReviewVerdict: label: Literal["approve", "reject"] = "reject" summary: str = "" blocking_issues: list[str] = field(default_factory=list) followups: list[str] = field(default_factory=list) @dataclass class ArtifactContract: summary: str = "" write_scope: str = "" expected_artifacts: list[str] = field(default_factory=list) downstream_consumer: list[str] = field(default_factory=list) allowed_collaboration_targets: list[str] = field(default_factory=list) status: str = "pending" issues: list[str] = field(default_factory=list) @dataclass class VerificationEvidence: status: str = "missing" verdict: str = "" summary: str = "" checks: list[dict[str, Any]] = field(default_factory=list) raw_output: str = "" @dataclass class EnvironmentManifest: """Structured record of environment state produced by a setup work item.""" platform: str = "" tools_installed: list[dict[str, Any]] = field(default_factory=list) env_vars: dict[str, str] = field(default_factory=dict) runtime_type: str = "native" runtime_path: str = "" activate_command: str = "" shell_prefix: str = "" shell_prefix_win: str = "" gpu_available: bool = False gpu_info: str = "" verification_checks: list[dict[str, Any]] = field(default_factory=list) verification_checks_win: list[dict[str, Any]] = field(default_factory=list) notes: str = "" @dataclass class WorkspaceManifest: """Structured record of the shared workspace prepared for a runtime.""" root_path: str = "" manifest_path: str = "" reserved_paths: dict[str, str] = field(default_factory=dict) status: str = "ready" notes: list[str] = field(default_factory=list) @dataclass class DataAcquisitionReport: """Structured readiness report for task-critical external inputs.""" status: str = "missing_critical" designated_input_dir: str = "" required_inputs: list[str] = field(default_factory=list) present_inputs: list[str] = field(default_factory=list) missing_inputs: list[str] = field(default_factory=list) attempted_sources: list[str] = field(default_factory=list) attempted_tools: list[str] = field(default_factory=list) prepared_assets: list[str] = field(default_factory=list) blocked_reasons: list[str] = field(default_factory=list) acquisition_attempted: bool = False report_path: str = "" log_path: str = "" source_candidates_path: str = "" download_manifest_path: str = "" provenance_summary: str = "" notes: list[str] = field(default_factory=list) @dataclass class RecruitmentNeed: """One staffing decision the recruiter must make for a company role. The recruiter runs once before execution enters the org, so each need corresponds to a single role in the topology (not a fixed runtime step). """ role_id: str role_name: str = "" role_responsibility: str = "" request_text: str = "" domains: list[str] = field(default_factory=list) existing_employee_ids: list[str] = field(default_factory=list) @dataclass class RecruitmentCandidateRecommendation: template_id: str template_name: str category: str = "" domains: list[str] = field(default_factory=list) prompt_ref: str = "" preferred_external_agent: str | None = None source_path: str = "" rationale: str = "" proposed_employee_name: str = "" proposed_employee_id: str = "" metadata: dict[str, Any] = field(default_factory=dict) @dataclass class RecruitmentEmployeeRecommendation: employee_id: str employee_name: str role_id: str category: str = "" domains: list[str] = field(default_factory=list) learned_skill_refs: list[str] = field(default_factory=list) experience_score: float = 0.0 rationale: str = "" metadata: dict[str, Any] = field(default_factory=dict) @dataclass class RecruitmentProposal: role_id: str status: Literal["existing_staff", "proposed_hire", "fallback_role_only", "direct_role_execution"] = "fallback_role_only" rationale: str = "" role_labels: list[str] = field(default_factory=list) candidate: RecruitmentCandidateRecommendation | None = None existing_employee: RecruitmentEmployeeRecommendation | None = None existing_employee_ids: list[str] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) @dataclass class RecruitmentPlan: company_profile: str = CompanyProfile.CORPORATE.value proposals: list[RecruitmentProposal] = field(default_factory=list) recruiter_feedback: list[str] = field(default_factory=list) summary: str = "" metadata: dict[str, Any] = field(default_factory=dict) @dataclass class ReorgRoleChange: action: Literal["add", "remove", "replace", "update"] = "update" role_id: str = "" replacement_role_id: str | None = None role: dict[str, Any] = field(default_factory=dict) reason: str = "" @dataclass class ReorgTaskAdjustment: task_id: str = "" action: Literal["reassign", "reprioritize", "update_description", "append_acceptance_criteria", "request_review"] = "reassign" new_role_id: str | None = None priority: int | None = None description_append: str = "" acceptance_criteria: list[str] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) @dataclass class ReorgChangeSet: role_changes: list[ReorgRoleChange] = field(default_factory=list) task_adjustments: list[ReorgTaskAdjustment] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) @dataclass class ReorgMigrationPlan: affected_task_ids: list[str] = field(default_factory=list) affected_checkpoint_ids: list[str] = field(default_factory=list) affected_handoff_ids: list[str] = field(default_factory=list) role_mapping: dict[str, str] = field(default_factory=dict) invalidated_waits: list[str] = field(default_factory=list) migration_notes: list[str] = field(default_factory=list) compatibility_warnings: list[str] = field(default_factory=list) rollback_snapshot_id: str | None = None metadata: dict[str, Any] = field(default_factory=dict) @dataclass class OrgSnapshot: snapshot_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" org_version: int = 1 runtime_topology_version: int = 1 company_name: str = "" topology: str = "" roles: list[dict[str, Any]] = field(default_factory=list) company_profile: str = CompanyProfile.CORPORATE.value active_tasks: list[dict[str, Any]] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class ReorgProposal: proposal_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str | None = None task_id: str | None = None initiated_by: str = "owner" source_role_id: str = "" scope: ReorgScope = ReorgScope.ORG_MUTATION risk_level: ReorgRiskLevel = ReorgRiskLevel.MEDIUM status: ReorgProposalStatus = ReorgProposalStatus.PROPOSED title: str = "" summary: str = "" rationale: str = "" user_confirmation_required: bool = True old_org_version: int = 1 new_org_version: int = 1 old_runtime_topology_version: int = 1 new_runtime_topology_version: int = 1 changeset: ReorgChangeSet = field(default_factory=ReorgChangeSet) migration_plan: ReorgMigrationPlan = field(default_factory=ReorgMigrationPlan) impact_summary: dict[str, Any] = field(default_factory=dict) approval_notes: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class TaskResult: status: TaskStatus content: str = "" artifacts: dict = field(default_factory=dict) escalation: dict | None = None cost: float = 0.0 token_usage: dict = field(default_factory=dict) @dataclass class ApprovalDecision: action: ApprovalAction risk_level: RiskLevel rationale: str confidence: float = 0.0 requires_user_input: bool = False policy_source: str = "heuristic" suggested_response: str = "" metadata: dict = field(default_factory=dict) @dataclass class RuntimePermissionDecision: resolution: PermissionResolution scope: PermissionScope = PermissionScope.ONCE risk_level: RiskLevel = RiskLevel.LOW rationale: str = "" source: str = "runtime" metadata: dict[str, Any] = field(default_factory=dict) @dataclass class ModelCapabilitySet: model: str supports_streaming: bool = True supports_tool_calling: bool = True supports_streaming_tool_calls: bool = True supports_thinking: bool = False supports_multimodal: bool = False supports_documents: bool = False supports_video: bool = False provider_family: str = "" metadata: dict[str, Any] = field(default_factory=dict) @dataclass class RuntimeLLMEvent: event_type: str payload: dict[str, Any] = field(default_factory=dict) model: str = "" timestamp: datetime = field(default_factory=datetime.now) @dataclass class ExternalSession: agent_type: str project_id: str = "default" session_id: str = "" opc_session_id: str | None = None task_id: str | None = None workspace_path: str = "" run_mode: str = "batch" status: str = "unknown" metadata: dict = field(default_factory=dict) updated_at: datetime = field(default_factory=datetime.now) @dataclass class ExecutionCheckpoint: checkpoint_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str | None = None checkpoint_type: str = "" status: str = "pending" task_id: str | None = None payload: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) # --------------------------------------------------------------------------- # Layer 2: Inter-Agent Communication # --------------------------------------------------------------------------- @dataclass class AgentEndpointRef: endpoint_id: str endpoint_type: AgentEndpointType = AgentEndpointType.COMPANY_ROLE role_id: str = "" task_id: str = "" projection_id: str = "" session_id: str = "" @dataclass class CommsEnvelope: message_id: str = field(default_factory=lambda: str(uuid.uuid4())) session_id: str = "" project_id: str = "default" task_id: str = "" projection_id: str = "" transport_kind: CommsTransportKind = CommsTransportKind.DM semantic_type: CommsSemanticType = CommsSemanticType.WORK_UPDATE state: CommsState = CommsState.OPEN from_endpoint: AgentEndpointRef = field(default_factory=lambda: AgentEndpointRef(endpoint_id="")) to_endpoint: AgentEndpointRef = field(default_factory=lambda: AgentEndpointRef(endpoint_id="")) subject: str = "" content: str = "" artifact_refs: list[str] = field(default_factory=list) refs: dict[str, Any] = field(default_factory=dict) transport_metadata: dict[str, Any] = field(default_factory=dict) payload: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class ResidentAssignmentEnvelope: assignment_id: str = field(default_factory=lambda: str(uuid.uuid4())) member_session_id: str = "" team_instance_id: str = "" team_id: str = "" seat_id: str = "" seat_state_id: str = "" role_runtime_session_id: str = "" work_item_projection_id: str = "" work_item_turn_type: str = "" role_id: str = "" employee_id: str = "" manager_role_id: str = "" task_id: str = "" session_id: str = "" write_scope: str = "" ownership_contract: str = "" dependency_snapshot: list[str] = field(default_factory=list) pending_inbox: list[dict[str, Any]] = field(default_factory=list) actionable_chat: list[dict[str, Any]] = field(default_factory=list) protocol_backlog: list[dict[str, Any]] = field(default_factory=list) latest_notification: dict[str, Any] = field(default_factory=dict) resident_status: str = "idle" team_memory_digest: str = "" artifact_refs: list[str] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class AgentMessage: msg_id: str = field(default_factory=lambda: str(uuid.uuid4())) msg_type: Literal[ "question", "inform", "request_review", "flag_issue", "decision_needed", "ack", "answer" ] = "inform" from_agent: str = "" to_agents: list[str] = field(default_factory=list) subject: str = "" body: str = "" context_ref: str | None = None urgency: MessageUrgency = MessageUrgency.NORMAL reply_needed: bool = False requires_ack: bool = False timeout_action: str | None = None reply_to_msg_id: str | None = None task_id: str | None = None status: MessageStatus = MessageStatus.SENT timestamp: datetime = field(default_factory=datetime.now) processed_at: datetime | None = None transport_kind: CommsTransportKind = CommsTransportKind.DM semantic_type: CommsSemanticType = CommsSemanticType.WORK_UPDATE comms_state: CommsState = CommsState.OPEN correlation_id: str = "" refs: dict[str, Any] = field(default_factory=dict) metadata: dict[str, Any] = field(default_factory=dict) @dataclass class StructuredHandoff: handoff_id: str = field(default_factory=lambda: str(uuid.uuid4())) objective: str = "" completed_work: str = "" artifacts: list[str] = field(default_factory=list) open_questions: list[str] = field(default_factory=list) assumptions: list[str] = field(default_factory=list) decisions: list[str] = field(default_factory=list) risks: list[str] = field(default_factory=list) next_actions: list[str] = field(default_factory=list) acceptance_criteria: list[str] = field(default_factory=list) summary: str = "" source_task_id: str | None = None source_projection_id: str | None = None source_projection_title: str | None = None source_work_item_id: str | None = None target_work_item_id: str | None = None @dataclass class MeetingRoom: room_id: str = field(default_factory=lambda: str(uuid.uuid4())) task_id: str | None = None topic: str = "" participants: list[str] = field(default_factory=list) shared_context: str = "" agenda: list[str] = field(default_factory=list) max_rounds: int = 5 decision_owner: str = "coordinator" status: MeetingStatus = MeetingStatus.OPEN decision_method: str = "" current_round: int = 0 pending_participants: list[str] = field(default_factory=list) consensus: dict[str, Any] = field(default_factory=dict) outcome: dict | None = None transcript: list[dict] = field(default_factory=list) metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) last_activity_at: datetime = field(default_factory=datetime.now) deadline_at: datetime | None = None @dataclass class WorkItemDecisionRecord: decision_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" task_id: str | None = None role_id: str = "" projection_id: str = "" category: str = "general" summary: str = "" details: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class ArtifactRecord: artifact_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" task_id: str | None = None projection_id: str = "" role_id: str = "" name: str = "" artifact_type: str = "generic" location: str = "" status: str = "active" details: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class RoleMemoryRecord: memory_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" role_id: str = "" scope: str = "project" summary: str = "" details: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class HandoffRecord: handoff_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str | None = None task_id: str | None = None from_role: str = "" to_role: str = "" source_projection_id: str = "" target_projection_id: str = "" source_work_item_id: str = "" target_work_item_id: str = "" summary: str = "" payload: dict[str, Any] = field(default_factory=dict) requires_ack: bool = False status: str = "sent" received_at: datetime | None = None acked_at: datetime | None = None accepted_at: datetime | None = None rejected_at: datetime | None = None response_summary: str = "" ack_message_id: str | None = None response_message_id: str | None = None metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class ReorgEventRecord: event_id: str = field(default_factory=lambda: str(uuid.uuid4())) proposal_id: str = "" project_id: str = "default" event_kind: ReorgEventKind = ReorgEventKind.PROPOSED summary: str = "" details: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class SessionRecord: session_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" parent_session_id: str | None = None title: str = "" mode: str = "primary" status: str = "active" summary: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class SessionMessageRecord: message_id: str = field(default_factory=lambda: str(uuid.uuid4())) session_id: str = "" role: str = "user" task_id: str | None = None agent_id: str | None = None parent_message_id: str | None = None summary_flag: bool = False metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class SessionPartRecord: part_id: str = field(default_factory=lambda: str(uuid.uuid4())) message_id: str = "" session_id: str = "" part_type: str = "text" payload: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class SessionCompactionRecord: compaction_id: str = field(default_factory=lambda: str(uuid.uuid4())) session_id: str = "" compaction_message_id: str = "" source_boundary_message_id: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class SessionMemorySnapshotRecord: snapshot_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str = "" summary_message_id: str = "" source_boundary_message_id: str = "" summary_text: str = "" memory_text: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class AgentCompactionRecord: compaction_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str = "" employee_id: str = "" role_id: str = "" compaction_message_id: str = "" source_boundary_message_id: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class AgentMemorySnapshotRecord: snapshot_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str = "" employee_id: str = "" role_id: str = "" memory_scope: str = "session" memory_kind: str = "process" summary_message_id: str = "" source_boundary_message_id: str = "" summary_text: str = "" memory_text: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class SessionLinkRecord: link_id: str = field(default_factory=lambda: str(uuid.uuid4())) project_id: str = "default" session_id: str = "" linked_session_id: str | None = None task_id: str | None = None link_type: str = "child_session" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) # --------------------------------------------------------------------------- # Layer 3: Agent # --------------------------------------------------------------------------- @dataclass class AgentInfo: role_id: str name: str responsibility: str status: AgentStatus = AgentStatus.IDLE current_task_id: str | None = None reports_to: str = "owner" icon: str | None = None can_spawn: list[str] = field(default_factory=list) tools: list[str] = field(default_factory=list) preferred_external_agent: str | None = None prompt_refs: list[str] = field(default_factory=list) skill_refs: list[str] = field(default_factory=list) handoff_template_ref: str | None = None memory_policy_ref: str | None = None artifact_contract_ref: str | None = None runtime_policy: dict[str, Any] = field(default_factory=dict) org_id: str | None = None budget_monthly_cents: int = 0 spent_monthly_cents: int = 0 heartbeat_enabled: bool = False heartbeat_interval_sec: int = 300 last_heartbeat_at: datetime | None = None capabilities: str = "" # --------------------------------------------------------------------------- # Layer 4: Organization Entities # --------------------------------------------------------------------------- @dataclass class Organization: org_id: str = field(default_factory=lambda: str(uuid.uuid4())) name: str = "" description: str = "" status: str = "active" company_profile: str = CompanyProfile.CORPORATE.value budget_monthly_cents: int = 0 spent_monthly_cents: int = 0 metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) updated_at: datetime = field(default_factory=datetime.now) @dataclass class Goal: goal_id: str = field(default_factory=lambda: str(uuid.uuid4())) org_id: str = "" parent_id: str | None = None owner_agent_id: str | None = None level: GoalLevel = GoalLevel.TASK title: str = "" description: str = "" status: GoalStatus = GoalStatus.ACTIVE priority: int = 5 deadline: datetime | None = None metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) @dataclass class CostEvent: event_id: str = field(default_factory=lambda: str(uuid.uuid4())) org_id: str | None = None agent_id: str | None = None task_id: str | None = None model: str = "" tokens_in: int = 0 tokens_out: int = 0 cost_usd: float = 0.0 timestamp: datetime = field(default_factory=datetime.now) @dataclass class OrgAgent: """Persistent agent membership within an organization.""" agent_id: str = field(default_factory=lambda: str(uuid.uuid4())) org_id: str = "" role_id: str = "" name: str = "" reports_to: str | None = None budget_monthly_cents: int = 0 spent_monthly_cents: int = 0 heartbeat_enabled: bool = False heartbeat_interval_sec: int = 300 last_heartbeat_at: datetime | None = None status: str = "idle" capabilities: str = "" metadata: dict[str, Any] = field(default_factory=dict) created_at: datetime = field(default_factory=datetime.now) # --------------------------------------------------------------------------- # Layer 6: Events # --------------------------------------------------------------------------- @dataclass class OPCEvent: event_type: str payload: dict = field(default_factory=dict) timestamp: datetime = field(default_factory=datetime.now) event_id: str = field(default_factory=lambda: str(uuid.uuid4()))