diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs index eeb23130ea..1010df4223 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs @@ -17,6 +17,7 @@ use crate::services::storyteller::state::storyteller_credential_manager::Storyte use log::{error, info, warn}; use serde_derive::{Deserialize, Serialize}; use tauri::{AppHandle, State}; +use enums::tauri::ux::tauri_command_caller::TauriCommandCaller; use tokens::tokens::media_files::MediaFileToken; #[derive(Deserialize)] @@ -27,6 +28,21 @@ pub struct EnqueueImageTo3dObjectRequest { /// The model to use. pub model: Option, + + /// OPTIONAL. + /// Name of the frontend caller. + /// We'll use this to selectively trigger events. + pub frontend_caller: Option, + + /// OPTIONAL. + /// A frontend-defined identifier that we'll send back to the frontend + /// as a Tauri event on task completion. + pub frontend_subscriber_id: Option, + + /// OPTIONAL. + /// A frontend-defined payload that we'll send back to the frontend + /// as a Tauri event on task completion. + pub frontend_subscriber_payload: Option, } #[derive(Deserialize, Debug, Copy, Clone)] @@ -159,7 +175,7 @@ pub async fn handle_request( ) -> Result { let result = handle_object( - request, + &request, &app, &app_env_configs, &app_data_root, @@ -173,7 +189,12 @@ pub async fn handle_request( }; let result = success_event - .insert_into_task_database(task_database) + .insert_into_task_database_with_frontend_payload( + task_database, + request.frontend_caller.clone(), + request.frontend_subscriber_id.as_deref(), + request.frontend_subscriber_payload.as_deref(), + ) .await; if let Err(err) = result { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs index 9ff02721d1..1934c8cfc7 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs @@ -10,7 +10,7 @@ use crate::services::storyteller::state::storyteller_credential_manager::Storyte use tauri::AppHandle; pub async fn handle_object( - request: EnqueueImageTo3dObjectRequest, + request: &EnqueueImageTo3dObjectRequest, app: &AppHandle, app_env_configs: &AppEnvConfigs, app_data_root: &AppDataRoot, diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs index 21296aa980..558ae0a403 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs @@ -19,7 +19,7 @@ use storyteller_client::endpoints::generate::object::generate_hunyuan_3d_2_1_ima use tauri::AppHandle; pub async fn handle_object_artcraft( - request: EnqueueImageTo3dObjectRequest, + request: &EnqueueImageTo3dObjectRequest, app: &AppHandle, app_env_configs: &AppEnvConfigs, app_data_root: &AppDataRoot, @@ -59,7 +59,7 @@ pub async fn handle_object_artcraft( used_model = Some(GenerationModel::Hunyuan3d2_0); let request = GenerateHunyuan20ImageTo3dRequest { uuid_idempotency_token, - media_file_token: request.image_media_token, + media_file_token: request.image_media_token.clone(), }; let result = generate_hunyuan3d_2_0_image_to_3d( &app_env_configs.storyteller_host, @@ -82,7 +82,7 @@ pub async fn handle_object_artcraft( used_model = Some(GenerationModel::Hunyuan3d2_1); let request = GenerateHunyuan21ImageTo3dRequest { uuid_idempotency_token, - media_file_token: request.image_media_token, + media_file_token: request.image_media_token.clone(), }; let result = generate_hunyuan3d_2_1_image_to_3d( &app_env_configs.storyteller_host, diff --git a/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs b/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs index f745f91280..82b8d07993 100644 --- a/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs +++ b/crates/schema/public/enums/src/tauri/ux/tauri_command_caller.rs @@ -21,6 +21,8 @@ pub enum TauriCommandCaller { TextToImage, /// The image-to-video page ImageToVideo, + /// A mini-app (doesn't specify which one) + MiniApp, } impl_enum_display_and_debug_using_to_str!(TauriCommandCaller); @@ -36,6 +38,7 @@ impl TauriCommandCaller { Self::ImageEditor => "image_editor", Self::TextToImage => "text_to_image", Self::ImageToVideo => "image_to_video", + Self::MiniApp => "mini_app", } } @@ -45,6 +48,7 @@ impl TauriCommandCaller { "image_editor" => Ok(Self::ImageEditor), "text_to_image" => Ok(Self::TextToImage), "image_to_video" => Ok(Self::ImageToVideo), + "mini_app" => Ok(Self::MiniApp), _ => Err(EnumError::CouldNotConvertFromString(value.to_string())), } } @@ -57,6 +61,7 @@ impl TauriCommandCaller { Self::ImageEditor, Self::TextToImage, Self::ImageToVideo, + Self::MiniApp, ]) } } @@ -76,6 +81,7 @@ mod tests { assert_serialization(TauriCommandCaller::ImageEditor, "image_editor"); assert_serialization(TauriCommandCaller::TextToImage, "text_to_image"); assert_serialization(TauriCommandCaller::ImageToVideo, "image_to_video"); + assert_serialization(TauriCommandCaller::MiniApp, "mini_app"); } #[test] @@ -84,6 +90,7 @@ mod tests { assert_eq!(TauriCommandCaller::ImageEditor.to_str(), "image_editor"); assert_eq!(TauriCommandCaller::TextToImage.to_str(), "text_to_image"); assert_eq!(TauriCommandCaller::ImageToVideo.to_str(), "image_to_video"); + assert_eq!(TauriCommandCaller::MiniApp.to_str(), "mini_app"); } #[test] @@ -92,6 +99,7 @@ mod tests { assert_eq!(TauriCommandCaller::from_str("image_editor").unwrap(), TauriCommandCaller::ImageEditor); assert_eq!(TauriCommandCaller::from_str("text_to_image").unwrap(), TauriCommandCaller::TextToImage); assert_eq!(TauriCommandCaller::from_str("image_to_video").unwrap(), TauriCommandCaller::ImageToVideo); + assert_eq!(TauriCommandCaller::from_str("mini_app").unwrap(), TauriCommandCaller::MiniApp); } #[test] @@ -108,11 +116,12 @@ mod tests { #[test] fn all_variants() { let mut variants = TauriCommandCaller::all_variants(); - assert_eq!(variants.len(), 4); + assert_eq!(variants.len(), 5); assert_eq!(variants.pop_first(), Some(TauriCommandCaller::Canvas)); assert_eq!(variants.pop_first(), Some(TauriCommandCaller::ImageEditor)); assert_eq!(variants.pop_first(), Some(TauriCommandCaller::TextToImage)); assert_eq!(variants.pop_first(), Some(TauriCommandCaller::ImageToVideo)); + assert_eq!(variants.pop_first(), Some(TauriCommandCaller::MiniApp)); assert_eq!(variants.pop_first(), None); } } diff --git a/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageTo3dObject.ts b/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageTo3dObject.ts index 459985ef15..b214ab8cbe 100644 --- a/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageTo3dObject.ts +++ b/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageTo3dObject.ts @@ -17,6 +17,19 @@ export enum EnqueueImageTo3dObjectErrorType { export interface EnqueueImageTo3dObjectRequest { image_media_token?: string; model?: EnqueueImageTo3dObjectModel; + + // TODO: Actual enum. + frontend_caller?: string; + + // Optional frontend state to return later. + frontend_subscriber_id?: string; +} + +interface EnqueueImageTo3dObjectRequestRaw { + image_media_token?: string; + model?: EnqueueImageTo3dObjectModel; + frontend_caller?: string; + frontend_subscriber_id?: string; } export enum EnqueueImageTo3dObjectModel { @@ -40,11 +53,22 @@ export interface EnqueueImageTo3dObjectSuccess extends CommandResult { export type EnqueueImageTo3dObjectResult = EnqueueImageTo3dObjectSuccess | EnqueueImageTo3dObjectError; export const EnqueueImageTo3dObject = async (request: EnqueueImageTo3dObjectRequest) : Promise => { + let mutableRequest : EnqueueImageTo3dObjectRequestRaw = { + image_media_token: request.image_media_token, + model: request.model, + }; + + if (!!request.frontend_caller) { + mutableRequest.frontend_caller = request.frontend_caller; + } + + if (!!request.frontend_subscriber_id) { + mutableRequest.frontend_subscriber_id = request.frontend_subscriber_id; + } + let result = await invoke("enqueue_image_to_3d_object_command", { - request: { - image_media_token: request.image_media_token, - model: request.model, - } + request: mutableRequest, }); + return (result as EnqueueImageTo3dObjectResult); }