use super::*; impl From for CustomWorldPublishWorldInput { fn from(input: CustomWorldPublishWorldRecordInput) -> Self { Self { session_id: input.session_id, profile_id: input.profile_id, owner_user_id: input.owner_user_id, public_work_code: input.public_work_code, author_public_user_code: input.author_public_user_code, draft_profile_json: input.draft_profile_json, legacy_result_profile_json: input.legacy_result_profile_json, setting_text: input.setting_text, author_display_name: input.author_display_name, published_at_micros: input.published_at_micros, } } } pub(crate) fn empty_string_to_none(value: String) -> Option { let trimmed = value.trim(); if trimmed.is_empty() { None } else { Some(trimmed.to_string()) } } pub(crate) fn i64_to_u64_ms(value: i64) -> u64 { value.max(0) as u64 } pub(crate) fn parse_optional_json_value( value: Option<&str>, fallback: serde_json::Value, label: &str, ) -> Result { match value.map(str::trim).filter(|value| !value.is_empty()) { Some(value) => parse_json_value(value, label), None => Ok(fallback), } } #[derive(Clone, Debug, PartialEq)] pub struct CustomWorldLibraryMutationRecord { pub entry: CustomWorldLibraryEntryRecord, pub gallery_entry: Option, } #[derive(Clone, Debug, PartialEq)] pub struct CustomWorldPublishWorldRecord { pub compiled_record: CustomWorldPublishedProfileCompileRecord, pub entry: CustomWorldLibraryEntryRecord, pub gallery_entry: Option, pub session_stage: String, } #[derive(Clone, Debug, PartialEq)] pub struct CustomWorldAgentMessageRecord { pub message_id: String, pub role: String, pub kind: String, pub text: String, pub created_at: String, pub related_operation_id: Option, } #[derive(Clone, Debug, PartialEq)] pub struct CustomWorldAgentOperationRecord { pub operation_id: String, pub operation_type: String, pub status: String, pub phase_label: String, pub phase_detail: String, pub progress: u32, pub error_message: Option, pub started_at_micros: i64, pub updated_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldAgentOperationProgressRecordInput { pub session_id: String, pub owner_user_id: String, pub operation_id: String, // SpacetimeDB 模块侧使用枚举存储操作类型,这里保留字符串给 API 层做轻量传参。 pub operation_type: String, pub operation_status: String, pub phase_label: String, pub phase_detail: String, pub operation_progress: u32, pub error_message: Option, pub updated_at_micros: i64, } #[derive(Clone, Debug, PartialEq)] pub struct CustomWorldSupportedActionRecord { pub action: String, pub enabled: bool, pub reason: Option, } #[derive(Clone, Debug, PartialEq)] pub struct CustomWorldCheckpointRecord { pub checkpoint_id: String, pub created_at: String, pub label: String, } // 兼容并行 custom world facade 中仍在使用的旧命名,避免本轮 module-npc 收口被无关改动阻塞。 pub type CustomWorldAgentCheckpointRecord = CustomWorldCheckpointRecord; #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldResultPreviewBlockerRecord { pub id: String, pub code: String, pub message: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldPublishGateRecord { pub profile_id: String, pub blockers: Vec, pub blocker_count: u32, pub publish_ready: bool, pub can_enter_world: bool, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldDraftCardDetailSectionRecord { pub section_id: String, pub label: String, pub value: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldProfileRemixRecordInput { pub source_owner_user_id: String, pub source_profile_id: String, pub target_owner_user_id: String, pub target_profile_id: String, pub author_display_name: String, pub remixed_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldProfilePlayReportRecordInput { pub owner_user_id: String, pub profile_id: String, pub played_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldProfileLikeReportRecordInput { pub owner_user_id: String, pub profile_id: String, pub user_id: String, pub liked_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldPublishWorldRecordInput { pub session_id: String, pub profile_id: String, pub owner_user_id: String, pub public_work_code: Option, pub author_public_user_code: String, pub draft_profile_json: String, pub legacy_result_profile_json: Option, pub setting_text: String, pub author_display_name: String, pub published_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldAgentMessageSubmitRecordInput { pub session_id: String, pub owner_user_id: String, pub user_message_id: String, pub user_message_text: String, pub operation_id: String, pub submitted_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct CustomWorldAgentActionExecuteRecordInput { pub session_id: String, pub owner_user_id: String, pub operation_id: String, pub action: String, pub payload_json: Option, pub submitted_at_micros: i64, } #[derive(Clone, Debug, PartialEq)] pub struct CustomWorldAgentActionExecuteRecord { pub operation: CustomWorldAgentOperationRecord, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishPlayReportRecordInput { pub session_id: String, pub user_id: String, pub elapsed_ms: u64, pub reported_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishRunStartRecordInput { pub run_id: String, pub session_id: String, pub owner_user_id: String, pub started_at_micros: i64, } #[derive(Clone, Debug, PartialEq)] pub struct BigFishInputSubmitRecordInput { pub run_id: String, pub owner_user_id: String, pub x: f32, pub y: f32, pub submitted_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishLikeReportRecordInput { pub session_id: String, pub user_id: String, pub liked_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishWorkRemixRecordInput { pub source_session_id: String, pub target_session_id: String, pub target_owner_user_id: String, pub welcome_message_id: String, pub remixed_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleAgentSessionCreateRecordInput { pub session_id: String, pub owner_user_id: String, pub seed_text: String, pub welcome_message_id: String, pub welcome_message_text: String, pub config_json: Option, pub created_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleAgentMessageSubmitRecordInput { pub session_id: String, pub owner_user_id: String, pub user_message_id: String, pub user_message_text: String, pub submitted_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleAgentMessageFinalizeRecordInput { pub session_id: String, pub owner_user_id: String, pub assistant_message_id: Option, pub assistant_reply_text: Option, pub config_json: Option, pub progress_percent: u32, pub stage: String, pub updated_at_micros: i64, pub error_message: Option, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleCompileDraftRecordInput { pub session_id: String, pub owner_user_id: String, pub profile_id: String, pub author_display_name: String, pub game_name: Option, pub summary_text: Option, pub tags_json: Option, pub cover_image_src: Option, pub compiled_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleWorkUpdateRecordInput { pub profile_id: String, pub owner_user_id: String, pub game_name: String, pub theme_text: String, pub twist_rule: String, pub summary_text: String, pub tags_json: String, pub cover_image_src: String, pub background_prompt: String, pub background_image_src: String, pub shape_options_json: String, pub hole_options_json: String, pub shape_count: u32, pub difficulty: u32, pub updated_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleRunStartRecordInput { pub run_id: String, pub owner_user_id: String, pub profile_id: String, pub started_at_ms: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleRunDropRecordInput { pub run_id: String, pub owner_user_id: String, pub hole_id: String, pub client_snapshot_version: u64, pub client_event_id: String, pub dropped_at_ms: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleRunStopRecordInput { pub run_id: String, pub owner_user_id: String, pub stopped_at_ms: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleRunRestartRecordInput { pub source_run_id: String, pub next_run_id: String, pub owner_user_id: String, pub restarted_at_ms: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleRunTimeUpRecordInput { pub run_id: String, pub owner_user_id: String, pub finished_at_ms: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct VisualNovelAgentMessageSubmitRecordInput { pub session_id: String, pub owner_user_id: String, pub user_message_id: String, pub user_message_text: String, pub submitted_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct VisualNovelAgentMessageFinalizeRecordInput { pub session_id: String, pub owner_user_id: String, pub assistant_message_id: Option, pub assistant_reply_text: Option, pub draft_json: Option, pub pending_action_json: Option, pub status: String, pub progress_percent: u32, pub updated_at_micros: i64, pub error_message: Option, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct VisualNovelWorkCompileRecordInput { pub session_id: String, pub owner_user_id: String, pub profile_id: String, pub work_id: Option, pub author_display_name: String, pub work_title: Option, pub work_description: Option, pub tags_json: Option, pub cover_image_src: Option, pub compiled_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct VisualNovelRunStartRecordInput { pub run_id: String, pub owner_user_id: String, pub profile_id: String, pub mode: String, pub snapshot_json: Option, pub started_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct VisualNovelRunSnapshotRecordInput { pub run_id: String, pub owner_user_id: String, pub status: String, pub current_scene_id: Option, pub current_phase_id: Option, pub visible_character_ids_json: String, pub flags_json: String, pub metrics_json: String, pub available_choices_json: String, pub text_mode_enabled: bool, pub snapshot_json: Option, pub updated_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct VisualNovelHistoryEntryRecordInput { pub entry_id: String, pub run_id: String, pub owner_user_id: String, pub turn_index: u32, pub source: String, pub action_text: Option, pub steps_json: String, pub snapshot_before_hash: Option, pub snapshot_after_hash: Option, pub created_at_micros: i64, } #[derive(Clone, Debug, PartialEq)] pub struct VisualNovelAgentMessageRecord { pub message_id: String, pub session_id: String, pub role: String, pub kind: String, pub text: String, pub created_at: String, } #[derive(Clone, Debug, PartialEq)] pub struct VisualNovelHistoryEntryRecord { pub entry_id: String, pub run_id: String, pub owner_user_id: String, pub profile_id: String, pub turn_index: u32, pub source: String, pub action_text: Option, pub steps: serde_json::Value, pub snapshot_before_hash: Option, pub snapshot_after_hash: Option, pub created_at: String, } #[derive(Clone, Debug, PartialEq)] pub struct VisualNovelRunRecord { pub run_id: String, pub owner_user_id: String, pub profile_id: String, pub mode: String, pub status: String, pub current_scene_id: Option, pub current_phase_id: Option, pub visible_character_ids: Vec, pub flags: serde_json::Value, pub metrics: serde_json::Value, pub history: Vec, pub available_choices: serde_json::Value, pub text_mode_enabled: bool, pub created_at: String, pub updated_at: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleAnchorItemRecord { pub key: String, pub label: String, pub value: String, pub status: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleAnchorPackRecord { pub theme: SquareHoleAnchorItemRecord, pub twist_rule: SquareHoleAnchorItemRecord, pub shape_count: SquareHoleAnchorItemRecord, pub difficulty: SquareHoleAnchorItemRecord, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleCreatorConfigRecord { pub theme_text: String, pub twist_rule: String, pub shape_count: u32, pub difficulty: u32, pub shape_options: Vec, pub hole_options: Vec, pub background_prompt: String, pub cover_image_src: Option, pub background_image_src: Option, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleShapeOptionRecord { pub option_id: String, pub shape_kind: String, pub label: String, pub target_hole_id: String, pub image_prompt: String, pub image_src: Option, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleHoleOptionRecord { pub hole_id: String, pub hole_kind: String, pub label: String, pub image_prompt: String, pub image_src: Option, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleResultDraftRecord { pub profile_id: String, pub game_name: String, pub theme_text: String, pub twist_rule: String, pub summary: String, pub tags: Vec, pub cover_image_src: Option, pub background_prompt: String, pub background_image_src: Option, pub shape_options: Vec, pub hole_options: Vec, pub shape_count: u32, pub difficulty: u32, pub publish_ready: bool, pub blockers: Vec, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleAgentMessageRecord { pub id: String, pub role: String, pub kind: String, pub text: String, pub created_at: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleAgentSessionRecord { pub session_id: String, pub current_turn: u32, pub progress_percent: u32, pub stage: String, pub anchor_pack: SquareHoleAnchorPackRecord, pub config: SquareHoleCreatorConfigRecord, pub draft: Option, pub messages: Vec, pub last_assistant_reply: Option, pub published_profile_id: Option, pub updated_at: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleWorkProfileRecord { pub work_id: String, pub profile_id: String, pub owner_user_id: String, pub source_session_id: Option, pub author_display_name: String, pub game_name: String, pub theme_text: String, pub twist_rule: String, pub summary: String, pub tags: Vec, pub cover_image_src: Option, pub background_prompt: String, pub background_image_src: Option, pub shape_options: Vec, pub hole_options: Vec, pub shape_count: u32, pub difficulty: u32, pub publication_status: String, pub play_count: u32, pub updated_at: String, pub published_at: Option, pub publish_ready: bool, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct SquareHoleShapeSnapshotRecord { pub shape_id: String, pub shape_kind: String, pub label: String, pub target_hole_id: String, pub color: String, pub image_src: Option, } #[derive(Clone, Debug, PartialEq)] pub struct SquareHoleHoleSnapshotRecord { pub hole_id: String, pub hole_kind: String, pub label: String, pub x: f32, pub y: f32, pub image_src: Option, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishSessionCreateRecordInput { pub session_id: String, pub owner_user_id: String, pub seed_text: String, pub welcome_message_id: String, pub welcome_message_text: String, pub created_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishMessageSubmitRecordInput { pub session_id: String, pub owner_user_id: String, pub user_message_id: String, pub user_message_text: String, pub assistant_message_id: String, pub submitted_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishMessageFinalizeRecordInput { pub session_id: String, pub owner_user_id: String, pub assistant_message_id: Option, pub assistant_reply_text: Option, pub stage: String, pub progress_percent: u32, pub anchor_pack_json: String, pub error_message: Option, pub updated_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishDraftCompileRecordInput { pub session_id: String, pub owner_user_id: String, pub draft_json: Option, pub compiled_at_micros: i64, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishAnchorItemRecord { pub key: String, pub label: String, pub value: String, pub status: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishAnchorPackRecord { pub gameplay_promise: BigFishAnchorItemRecord, pub ecology_visual_theme: BigFishAnchorItemRecord, pub growth_ladder: BigFishAnchorItemRecord, pub risk_tempo: BigFishAnchorItemRecord, } #[derive(Clone, Debug, PartialEq)] pub struct BigFishLevelBlueprintRecord { pub level: u32, pub name: String, pub one_line_fantasy: String, pub text_description: String, pub silhouette_direction: String, pub size_ratio: f32, pub visual_description: String, pub visual_prompt_seed: String, pub idle_motion_description: String, pub move_motion_description: String, pub motion_prompt_seed: String, pub merge_source_level: Option, pub prey_window: Vec, pub threat_window: Vec, pub is_final_level: bool, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishBackgroundBlueprintRecord { pub theme: String, pub color_mood: String, pub foreground_hints: String, pub midground_composition: String, pub background_depth: String, pub safe_play_area_hint: String, pub spawn_edge_hint: String, pub background_prompt_seed: String, } #[derive(Clone, Debug, PartialEq, Eq)] pub struct BigFishAgentMessageRecord { pub message_id: String, pub role: String, pub kind: String, pub text: String, pub created_at: String, } #[derive(Clone, Debug, PartialEq)] pub struct BigFishVector2Record { pub x: f32, pub y: f32, }