//! 创意互动 Agent 领域模型。 //! //! 本 crate 只描述会话、阶段、消息和目标绑定的纯领域事实;LLM、SSE、 //! 图片生成和 SpacetimeDB 写表均留在外层 adapter。 use serde::{Deserialize, Serialize}; #[cfg(feature = "spacetime-types")] use spacetimedb::SpacetimeType; pub const CREATIVE_AGENT_SESSION_ID_PREFIX: &str = "creative-session-"; pub const CREATIVE_AGENT_MESSAGE_ID_PREFIX: &str = "creative-message-"; pub const CREATIVE_AGENT_BINDING_ID_PREFIX: &str = "creative-binding-"; #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum CreativeAgentStage { Idle, Perceiving, Thinking, Remembering, SelectingPuzzleTemplate, WaitingTemplateConfirmation, PlanningPuzzleLevels, Acting, Reflecting, Collaborating, TargetReady, WaitingUser, Failed, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum CreativeAgentMessageRole { User, Assistant, System, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum CreativeAgentMessageKind { Chat, Stage, ActionResult, Warning, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum CreativeTargetPlayType { Puzzle, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum CreativeTargetStage { PuzzleAgentWorkspace, PuzzleResult, PuzzleRuntime, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct CreativeInputImageSnapshot { pub asset_id: Option, pub read_url: Option, pub thumbnail_url: Option, pub width: Option, pub height: Option, pub summary: Option, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct CreativeInputSummarySnapshot { pub text: Option, pub entry_context: String, pub images: Vec, pub material_summary: Option, pub unsupported_capabilities_json: String, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct CreativeAgentMessageSnapshot { pub message_id: String, pub session_id: String, pub role: CreativeAgentMessageRole, pub kind: CreativeAgentMessageKind, pub text: String, pub created_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct CreativeAgentTargetBindingSnapshot { pub binding_id: String, pub session_id: String, pub play_type: CreativeTargetPlayType, pub target_session_id: String, pub target_stage: CreativeTargetStage, pub result_profile_id: Option, pub created_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct CreativeAgentSessionSnapshot { pub session_id: String, pub owner_user_id: String, pub stage: CreativeAgentStage, pub input_summary: CreativeInputSummarySnapshot, pub messages: Vec, pub puzzle_template_selection_json: Option, pub puzzle_image_generation_plan_json: Option, pub target_binding: Option, pub created_at_micros: i64, pub updated_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct CreativeAgentSessionProcedureResult { pub ok: bool, pub session_json: Option, pub error_message: Option, } impl CreativeAgentStage { pub fn as_str(self) -> &'static str { match self { Self::Idle => "idle", Self::Perceiving => "perceiving", Self::Thinking => "thinking", Self::Remembering => "remembering", Self::SelectingPuzzleTemplate => "selecting_puzzle_template", Self::WaitingTemplateConfirmation => "waiting_template_confirmation", Self::PlanningPuzzleLevels => "planning_puzzle_levels", Self::Acting => "acting", Self::Reflecting => "reflecting", Self::Collaborating => "collaborating", Self::TargetReady => "target_ready", Self::WaitingUser => "waiting_user", Self::Failed => "failed", } } } impl CreativeAgentMessageRole { pub fn as_str(self) -> &'static str { match self { Self::User => "user", Self::Assistant => "assistant", Self::System => "system", } } } impl CreativeAgentMessageKind { pub fn as_str(self) -> &'static str { match self { Self::Chat => "chat", Self::Stage => "stage", Self::ActionResult => "action_result", Self::Warning => "warning", } } } impl CreativeTargetPlayType { pub fn as_str(self) -> &'static str { match self { Self::Puzzle => "puzzle", } } } impl CreativeTargetStage { pub fn as_str(self) -> &'static str { match self { Self::PuzzleAgentWorkspace => "puzzle-agent-workspace", Self::PuzzleResult => "puzzle-result", Self::PuzzleRuntime => "puzzle-runtime", } } }