From 0f0be0844e12a6f8c5b32da66ea5dcba538661d2 Mon Sep 17 00:00:00 2001 From: Hanashi Date: Thu, 30 Jul 2026 18:13:06 -0400 Subject: [PATCH] seedream 5 ultra --- .../src/api/router_image_model.rs | 7 + .../generate_image_request_builder.rs | 5 + .../image_generation_request.rs | 11 + .../generate_image/providers/artcraft/mod.rs | 1 + .../artcraft/seedream_5p0_pro_ultra/build.rs | 17 ++ .../artcraft/seedream_5p0_pro_ultra/cost.rs | 208 ++++++++++++++ .../artcraft/seedream_5p0_pro_ultra/mod.rs | 3 + .../seedream_5p0_pro_ultra/request.rs | 17 ++ ...router_image_request_to_artcraft_prompt.rs | 1 + ...edance2pro_queue_with_apriori_job_token.rs | 10 +- .../inference_job_product_category.rs | 12 +- .../inference_model_type.rs | 6 + .../common/generation/common_image_model.rs | 7 +- .../common/generation/common_model_type.rs | 13 +- .../src/configs/omni_gen/image_models.rs | 35 +++ .../image/estimate_image_cost_handler.rs | 1 + .../image/omni_api_image_generate_handler.rs | 20 +- .../image/pipeline_v2/run_pipeline_v2.rs | 30 +- .../video/helpers/build_router_client.rs | 2 +- .../endpoints/omni_api/generate/video/mod.rs | 1 - .../video/omni_api_video_generate_handler.rs | 2 +- .../video/pipeline_v2/run_pipeline_v2.rs | 2 +- .../video => shared_utils}/kinovi_account.rs | 0 .../endpoints/omni_api/shared_utils/mod.rs | 1 + .../audio/omni_gen_audio_generate_handler.rs | 2 +- .../audio/pipeline_v2/run_pipeline_v2.rs | 2 +- .../image/omni_gen_image_generate_handler.rs | 20 +- .../image/pipeline_v2/run_pipeline_v2.rs | 28 +- .../mesh/pipeline_v2/run_pipeline_v2.rs | 2 +- .../splat/pipeline_v2/run_pipeline_v2.rs | 2 +- .../video/helpers/build_router_client.rs | 2 +- .../endpoints/omni_gen/generate/video/mod.rs | 1 - .../video/omni_gen_video_generate_handler.rs | 2 +- .../video/pipeline_v2/run_pipeline_v2.rs | 2 +- .../video => shared_utils}/kinovi_account.rs | 0 .../endpoints/omni_gen/shared_utils/mod.rs | 1 + frontend/package-lock.json | 256 ++++++------------ 37 files changed, 518 insertions(+), 214 deletions(-) create mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/build.rs create mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/cost.rs create mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/mod.rs create mode 100644 crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/request.rs rename crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/{generate/video => shared_utils}/kinovi_account.rs (100%) rename crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/{generate/video => shared_utils}/kinovi_account.rs (100%) diff --git a/crates/api_clients/artcraft/artcraft_router/src/api/router_image_model.rs b/crates/api_clients/artcraft/artcraft_router/src/api/router_image_model.rs index 919da20843..f1f04abc9d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/api/router_image_model.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/api/router_image_model.rs @@ -43,6 +43,8 @@ pub enum RouterImageModel { Seedream5Lite, #[serde(rename = "seedream_5p0_pro")] Seedream5p0Pro, + #[serde(rename = "seedream_5p0_pro_u")] + Seedream5p0ProUltra, #[serde(rename = "qwen_edit_2511_angles")] QwenEdit2511Angles, #[serde(rename = "flux_2_lora_angles")] @@ -80,4 +82,9 @@ mod tests { fn seedream_5p0_pro_serializes_to_seedream_5p0_pro() { assert_round_trip(RouterImageModel::Seedream5p0Pro, "seedream_5p0_pro"); } + + #[test] + fn seedream_5p0_pro_ultra_serializes_to_seedream_5p0_pro_u() { + assert_round_trip(RouterImageModel::Seedream5p0ProUltra, "seedream_5p0_pro_u"); + } } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request_builder.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request_builder.rs index 936880b833..70a9778347 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request_builder.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/generate_image_request_builder.rs @@ -27,6 +27,7 @@ use crate::generate::generate_image::providers::artcraft::seedream_4::build::bui use crate::generate::generate_image::providers::artcraft::seedream_4p5::build::build_artcraft_seedream_4p5; use crate::generate::generate_image::providers::artcraft::seedream_5_lite::build::build_artcraft_seedream_5_lite; use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro::build::build_artcraft_seedream_5p0_pro; +use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro_ultra::build::build_artcraft_seedream_5p0_pro_ultra; use crate::generate::generate_image::providers::fal::flux_1_dev::build::build_fal_flux_1_dev; use crate::generate::generate_image::providers::fal::flux_1_schnell::build::build_fal_flux_1_schnell; use crate::generate::generate_image::providers::fal::flux_2_lora_angles::build::build_fal_flux_2_lora_angles; @@ -122,6 +123,7 @@ impl GenerateImageRequestBuilder { (RouterProvider::Artcraft, RouterImageModel::Seedream4p5) => build_artcraft_seedream_4p5(self), (RouterProvider::Artcraft, RouterImageModel::Seedream5Lite) => build_artcraft_seedream_5_lite(self), (RouterProvider::Artcraft, RouterImageModel::Seedream5p0Pro) => build_artcraft_seedream_5p0_pro(self), + (RouterProvider::Artcraft, RouterImageModel::Seedream5p0ProUltra) => build_artcraft_seedream_5p0_pro_ultra(self), (RouterProvider::Artcraft, RouterImageModel::QwenEdit2511Angles) => build_artcraft_qwen_edit_2511_angles(self), (RouterProvider::Artcraft, RouterImageModel::Flux2LoraAngles) => build_artcraft_flux_2_lora_angles(self), (RouterProvider::Artcraft, RouterImageModel::Midjourney7) => build_artcraft_midjourney_7(self), @@ -149,6 +151,9 @@ impl GenerateImageRequestBuilder { (RouterProvider::Seedance2Pro, RouterImageModel::Midjourney7Niji) => build_kinovi_midjourney_7_niji(self), (RouterProvider::Seedance2Pro, RouterImageModel::Midjourney8) => build_kinovi_midjourney_8(self), (RouterProvider::Seedance2Pro, RouterImageModel::Seedream5p0Pro) => build_kinovi_seedream_5p0_pro(self), + // The Ultra alias sends the exact same Kinovi request; only the Kinovi + // account it is billed to differs, and that is chosen by the caller. + (RouterProvider::Seedance2Pro, RouterImageModel::Seedream5p0ProUltra) => build_kinovi_seedream_5p0_pro(self), _ => self.unsupported_provider_and_model(), } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_request.rs index 6f5cd96477..87ae78e60b 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_request.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/image_generation_request.rs @@ -41,6 +41,8 @@ use crate::generate::generate_image::providers::artcraft::seedream_5_lite::cost: use crate::generate::generate_image::providers::artcraft::seedream_5_lite::request::ArtcraftSeedream5LiteRequestState; use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro::cost::ArtcraftSeedream5p0ProCostState; use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro::request::ArtcraftSeedream5p0ProRequestState; +use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro_ultra::cost::ArtcraftSeedream5p0ProUltraCostState; +use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro_ultra::request::ArtcraftSeedream5p0ProUltraRequestState; use crate::generate::generate_image::providers::fal::flux_1_dev::cost::FalFlux1DevCostState; use crate::generate::generate_image::providers::fal::flux_1_dev::request::FalFlux1DevRequestState; use crate::generate::generate_image::providers::fal::flux_1_schnell::cost::FalFlux1SchnellCostState; @@ -97,6 +99,7 @@ pub enum ImageGenerationRequest { ArtcraftSeedream4p5(ArtcraftSeedream4p5RequestState), ArtcraftSeedream5Lite(ArtcraftSeedream5LiteRequestState), ArtcraftSeedream5p0Pro(ArtcraftSeedream5p0ProRequestState), + ArtcraftSeedream5p0ProUltra(ArtcraftSeedream5p0ProUltraRequestState), ArtcraftQwenEdit2511Angles(ArtcraftQwenEdit2511AnglesRequestState), ArtcraftFlux2LoraAngles(ArtcraftFlux2LoraAnglesRequestState), ArtcraftMidjourney7(ArtcraftMidjourney7RequestState), @@ -144,6 +147,7 @@ impl ImageGenerationRequest { Self::ArtcraftSeedream4p5(_) => RouterProvider::Artcraft, Self::ArtcraftSeedream5Lite(_) => RouterProvider::Artcraft, Self::ArtcraftSeedream5p0Pro(_) => RouterProvider::Artcraft, + Self::ArtcraftSeedream5p0ProUltra(_) => RouterProvider::Artcraft, Self::ArtcraftQwenEdit2511Angles(_) => RouterProvider::Artcraft, Self::ArtcraftFlux2LoraAngles(_) => RouterProvider::Artcraft, Self::ArtcraftMidjourney7(_) => RouterProvider::Artcraft, @@ -218,6 +222,9 @@ impl ImageGenerationRequest { Self::ArtcraftSeedream5p0Pro(request) => { Ok(ArtcraftSeedream5p0ProCostState::from_request(request).estimate_cost()) } + Self::ArtcraftSeedream5p0ProUltra(request) => { + Ok(ArtcraftSeedream5p0ProUltraCostState::from_request(request).estimate_cost()) + } Self::ArtcraftQwenEdit2511Angles(request) => { Ok(ArtcraftQwenEdit2511AnglesCostState::from_request(request).estimate_cost()) } @@ -317,6 +324,10 @@ impl ImageGenerationRequest { let artcraft_client = client.get_artcraft_client_ref()?; request.send(artcraft_client).await } + Self::ArtcraftSeedream5p0ProUltra(request) => { + let artcraft_client = client.get_artcraft_client_ref()?; + request.send(artcraft_client).await + } Self::ArtcraftQwenEdit2511Angles(request) => { let artcraft_client = client.get_artcraft_client_ref()?; request.send(artcraft_client).await diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/mod.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/mod.rs index dd51f632d4..cde52f8c63 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/mod.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/mod.rs @@ -20,3 +20,4 @@ pub mod seedream_4; pub mod seedream_4p5; pub mod seedream_5_lite; pub mod seedream_5p0_pro; +pub mod seedream_5p0_pro_ultra; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/build.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/build.rs new file mode 100644 index 0000000000..24339af5d2 --- /dev/null +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/build.rs @@ -0,0 +1,17 @@ +use enums::common::generation::common_image_model::CommonImageModel as CommonImageModelEnum; + +use crate::errors::artcraft_router_error::ArtcraftRouterError; +use crate::generate::generate_image::generate_image_request_builder::GenerateImageRequestBuilder; +use crate::generate::generate_image::image_generation_draft_or_request::ImageGenerationDraftOrRequest; +use crate::generate::generate_image::image_generation_request::ImageGenerationRequest; +use crate::generate::generate_image::providers::artcraft::build_common::build_artcraft_omni_image_request; +use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro_ultra::request::ArtcraftSeedream5p0ProUltraRequestState; + +pub fn build_artcraft_seedream_5p0_pro_ultra( + builder: GenerateImageRequestBuilder, +) -> Result { + let request = build_artcraft_omni_image_request(builder, CommonImageModelEnum::Seedream5p0ProUltra)?; + Ok(ImageGenerationDraftOrRequest::Request( + ImageGenerationRequest::ArtcraftSeedream5p0ProUltra(ArtcraftSeedream5p0ProUltraRequestState { request }), + )) +} diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/cost.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/cost.rs new file mode 100644 index 0000000000..c0811dfc73 --- /dev/null +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/cost.rs @@ -0,0 +1,208 @@ +use enums::common::generation::common_resolution::CommonResolution as CommonResolutionEnum; + +use crate::generate::generate_image::image_generation_cost_estimate::ImageGenerationCostEstimate; +use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro_ultra::request::ArtcraftSeedream5p0ProUltraRequestState; + +/// Customer-facing price per image at 1k resolution (the default), in USD cents. +const USD_CENTS_PER_IMAGE_1K: u64 = 10; + +/// Customer-facing price per image at 2k resolution, in USD cents. +const USD_CENTS_PER_IMAGE_2K: u64 = 16; + +/// Cost state for Artcraft Seedream 5.0 Pro Ultra. Pricing is per image and +/// resolution-dependent: +/// +/// 1K (default) → 10¢, 2K → 16¢. 3K/4K fall back to 2K pricing; 0.5K and +/// legacy video resolutions (480p/720p/1080p) fall back to 1K. +#[derive(Clone, Debug)] +pub struct ArtcraftSeedream5p0ProUltraCostState { + pub resolution: Option, + pub num_images: u16, +} + +impl ArtcraftSeedream5p0ProUltraCostState { + pub fn from_request(request: &ArtcraftSeedream5p0ProUltraRequestState) -> Self { + Self { + resolution: request.request.resolution, + num_images: request.request.image_batch_count.unwrap_or(1), + } + } + + pub fn estimate_cost(&self) -> ImageGenerationCostEstimate { + let cost_per_image: u64 = cost_per_image_in_cents(self.resolution); + let cost_in_usd_cents = cost_per_image * self.num_images as u64; + ImageGenerationCostEstimate { + cost_in_credits: Some(cost_in_usd_cents), + cost_in_usd_cents: Some(cost_in_usd_cents), + is_free: false, + is_unlimited: false, + is_rate_limited: false, + has_watermark: false, + failures_are_refunded: None, + } + } +} + +fn cost_per_image_in_cents(resolution: Option) -> u64 { + use CommonResolutionEnum as R; + match resolution { + None + | Some(R::HalfK) + | Some(R::OneK) + | Some(R::FourEightyP) + | Some(R::SevenTwentyP) + | Some(R::TenEightyP) => USD_CENTS_PER_IMAGE_1K, + Some(R::TwoK) | Some(R::ThreeK) | Some(R::FourK) => USD_CENTS_PER_IMAGE_2K, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::api::router_image_model::RouterImageModel; + use crate::api::router_provider::RouterProvider; + use crate::api::router_resolution::RouterResolution; + use crate::client::request_mismatch_mitigation_strategy::RequestMismatchMitigationStrategy; + use crate::generate::generate_image::generate_image_request_builder::GenerateImageRequestBuilder; + + fn estimate(resolution: Option, image_batch_count: u16) -> ImageGenerationCostEstimate { + let builder = GenerateImageRequestBuilder { + model: RouterImageModel::Seedream5p0ProUltra, + provider: RouterProvider::Artcraft, + prompt: Some("an anime girl riding a dinosaur".to_string()), + image_inputs: None, + resolution, + aspect_ratio: None, + quality: None, + image_batch_count: Some(image_batch_count), + horizontal_angle: None, + vertical_angle: None, + zoom: None, + request_mismatch_mitigation_strategy: RequestMismatchMitigationStrategy::ErrorOut, + generation_mode_mismatch_strategy: None, + idempotency_token: None, + }; + builder.build2().unwrap().estimate_cost().unwrap() + } + + fn cost_cents(resolution: Option, image_batch_count: u16) -> u64 { + estimate(resolution, image_batch_count).cost_in_usd_cents.unwrap() + } + + // ── Default / 1K (10¢) ── + + #[test] + fn default_resolution_one_image_is_10c() { assert_eq!(cost_cents(None, 1), 10); } + + #[test] + fn one_k_one_image_is_10c() { assert_eq!(cost_cents(Some(RouterResolution::OneK), 1), 10); } + + #[test] + fn one_k_four_images_is_40c() { assert_eq!(cost_cents(Some(RouterResolution::OneK), 4), 40); } + + // ── 2K (16¢) ── + + #[test] + fn two_k_one_image_is_16c() { assert_eq!(cost_cents(Some(RouterResolution::TwoK), 1), 16); } + + #[test] + fn two_k_four_images_is_64c() { assert_eq!(cost_cents(Some(RouterResolution::TwoK), 4), 64); } + + // ── Fallbacks ── + + #[test] + fn four_k_falls_back_to_two_k_pricing() { + assert_eq!( + ArtcraftSeedream5p0ProUltraCostState { + resolution: Some(CommonResolutionEnum::FourK), + num_images: 1, + }.estimate_cost().cost_in_usd_cents, + Some(16), + ); + } + + #[test] + fn half_k_falls_back_to_one_k_pricing() { + assert_eq!( + ArtcraftSeedream5p0ProUltraCostState { + resolution: Some(CommonResolutionEnum::HalfK), + num_images: 1, + }.estimate_cost().cost_in_usd_cents, + Some(10), + ); + } + + // ── Credits track USD cents exactly (1 credit = 1 cent) ── + + #[test] + fn credits_equal_usd_cents() { + for batch in 1..=4u16 { + let one_k = estimate(Some(RouterResolution::OneK), batch); + assert_eq!(one_k.cost_in_credits, one_k.cost_in_usd_cents, "1k batch {}", batch); + let two_k = estimate(Some(RouterResolution::TwoK), batch); + assert_eq!(two_k.cost_in_credits, two_k.cost_in_usd_cents, "2k batch {}", batch); + } + } + + // ── The price must exceed the base Seedream 5.0 Pro price ── + + #[test] + fn price_exceeds_base_seedream_5p0_pro_price() { + use crate::generate::generate_image::providers::artcraft::seedream_5p0_pro::cost::ArtcraftSeedream5p0ProCostState; + + for resolution in [None, Some(CommonResolutionEnum::OneK), Some(CommonResolutionEnum::TwoK)] { + for num_images in [1u16, 4] { + let ultra_cents = ArtcraftSeedream5p0ProUltraCostState { resolution, num_images } + .estimate_cost().cost_in_usd_cents.unwrap(); + let base_cents = ArtcraftSeedream5p0ProCostState { resolution, num_images } + .estimate_cost().cost_in_usd_cents.unwrap(); + assert!( + ultra_cents > base_cents, + "ultra price {}¢ must exceed base price {}¢ ({:?} batch {})", + ultra_cents, base_cents, resolution, num_images, + ); + } + } + } + + // ── The Artcraft price must cover the Kinovi provider cost ── + + #[test] + fn price_covers_kinovi_cost() { + use seedance2pro_client::generate::image::generate_seedream_5p0_pro::{ + KinoviSeedream5p0ProBatchCount, KinoviSeedream5p0ProResolution, + }; + use crate::generate::generate_image::providers::kinovi::seedream_5p0_pro::cost::KinoviSeedream5p0ProCostState; + + let cases = [ + (RouterResolution::OneK, KinoviSeedream5p0ProResolution::OneK, 1u16, KinoviSeedream5p0ProBatchCount::One), + (RouterResolution::OneK, KinoviSeedream5p0ProResolution::OneK, 4u16, KinoviSeedream5p0ProBatchCount::Four), + (RouterResolution::TwoK, KinoviSeedream5p0ProResolution::TwoK, 1u16, KinoviSeedream5p0ProBatchCount::One), + (RouterResolution::TwoK, KinoviSeedream5p0ProResolution::TwoK, 4u16, KinoviSeedream5p0ProBatchCount::Four), + ]; + for (router_res, kinovi_res, batch, kinovi_batch) in cases { + let artcraft_cents = cost_cents(Some(router_res), batch); + let kinovi_cents = KinoviSeedream5p0ProCostState { + resolution: kinovi_res, + batch_count: kinovi_batch, + }.estimate_cost().cost_in_usd_cents.unwrap(); + assert!( + artcraft_cents > kinovi_cents, + "artcraft price {}¢ must exceed kinovi cost {}¢ ({:?} batch {})", + artcraft_cents, kinovi_cents, router_res, batch, + ); + } + } + + // ── Flags ── + + #[test] + fn cost_flags_are_correct() { + let cost = ArtcraftSeedream5p0ProUltraCostState { resolution: None, num_images: 1 }.estimate_cost(); + assert!(!cost.is_free); + assert!(!cost.is_unlimited); + assert!(!cost.is_rate_limited); + assert!(!cost.has_watermark); + assert_eq!(cost.failures_are_refunded, None); + } +} diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/mod.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/mod.rs new file mode 100644 index 0000000000..98150bd014 --- /dev/null +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/mod.rs @@ -0,0 +1,3 @@ +pub mod build; +pub mod cost; +pub mod request; diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/request.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/request.rs new file mode 100644 index 0000000000..500f0aa30f --- /dev/null +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_image/providers/artcraft/seedream_5p0_pro_ultra/request.rs @@ -0,0 +1,17 @@ +use artcraft_api_defs::omni_gen::cost_and_generate_requests::omni_gen_image_cost_and_generate_request::OmniGenImageCostAndGenerateRequest; + +use crate::client::router_artcraft_client::RouterArtcraftClient; +use crate::errors::artcraft_router_error::ArtcraftRouterError; +use crate::generate::generate_image::generate_image_response::GenerateImageResponse; +use crate::generate::generate_image::providers::artcraft::request_common::send_artcraft_omni_image_request; + +#[derive(Clone, Debug)] +pub struct ArtcraftSeedream5p0ProUltraRequestState { + pub request: OmniGenImageCostAndGenerateRequest, +} + +impl ArtcraftSeedream5p0ProUltraRequestState { + pub async fn send(&self, client: &RouterArtcraftClient) -> Result { + send_artcraft_omni_image_request(&self.request, client).await + } +} diff --git a/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs b/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs index 9c1548961f..8a86e9a2f4 100644 --- a/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs +++ b/crates/desktop/artcraft/src/core/commands/generate/common/router_image_request_to_artcraft_prompt.rs @@ -55,6 +55,7 @@ fn image_model_to_common_model_type(model: RouterImageModel) -> Option Some(CommonModelType::Seedream4p5), RouterImageModel::Seedream5Lite => Some(CommonModelType::Seedream5Lite), RouterImageModel::Seedream5p0Pro => Some(CommonModelType::Seedream5p0Pro), + RouterImageModel::Seedream5p0ProUltra => Some(CommonModelType::Seedream5p0ProUltra), RouterImageModel::QwenEdit2511Angles => Some(CommonModelType::QwenEdit2511Angles), RouterImageModel::Flux2LoraAngles => Some(CommonModelType::Flux2LoraAngles), RouterImageModel::GrokImagineImage => Some(CommonModelType::GrokImagineImage), diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs index e2bed838fd..fcddba4e23 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/api_providers/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs @@ -83,7 +83,8 @@ pub async fn insert_generic_inference_job_for_seedance2pro_queue_with_apriori_jo Some(CommonModelType::Midjourney7) | Some(CommonModelType::Midjourney7Niji) | Some(CommonModelType::Midjourney8) | - Some(CommonModelType::Seedream5p0Pro) => true, + Some(CommonModelType::Seedream5p0Pro) | + Some(CommonModelType::Seedream5p0ProUltra) => true, _ => false, }; @@ -111,7 +112,12 @@ pub async fn insert_generic_inference_job_for_seedance2pro_queue_with_apriori_jo InferenceJobExternalThirdParty::Seedance2ProAlt, InferenceJobProductCategory::Seedance2ProVideoAlt, ), - (KinoviVersion::BytePlusUltra, _) => ( + (KinoviVersion::BytePlusUltra, true) => ( + InferenceJobType::Seedance2ProBytePlusUltraQueue, + InferenceJobExternalThirdParty::Seedance2ProBytePlusUltra, + InferenceJobProductCategory::Seedance2ProImageBytePlusUltra, + ), + (KinoviVersion::BytePlusUltra, false) => ( InferenceJobType::Seedance2ProBytePlusUltraQueue, InferenceJobExternalThirdParty::Seedance2ProBytePlusUltra, InferenceJobProductCategory::Seedance2ProVideoBytePlusUltra, diff --git a/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_job_product_category.rs b/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_job_product_category.rs index e367d23061..17af27caaa 100644 --- a/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_job_product_category.rs +++ b/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_job_product_category.rs @@ -72,6 +72,10 @@ pub enum InferenceJobProductCategory { #[serde(rename = "seedance2pro_video_bpu")] Seedance2ProVideoBytePlusUltra, + /// Seedance 2 Pro / Kinovi (BytePlus Ultra account): image generation. + #[serde(rename = "seedance2pro_image_bpu")] + Seedance2ProImageBytePlusUltra, + // =============== WORLD LABS =============== /// World Labs: Gaussian Splat Generation @@ -183,6 +187,7 @@ impl InferenceJobProductCategory { Self::Seedance2ProAudio => "seedance2pro_audio", Self::Seedance2ProVideoAlt => "seedance2pro_video_alt", Self::Seedance2ProVideoBytePlusUltra => "seedance2pro_video_bpu", + Self::Seedance2ProImageBytePlusUltra => "seedance2pro_image_bpu", Self::WorldlabsSplat => "worldlabs_splat", Self::TtsGptSoVits => "tts_gpt_so_vits", Self::TtsStyleTts2 => "tts_style_tts2", @@ -226,6 +231,7 @@ impl InferenceJobProductCategory { "seedance2pro_audio" => Ok(Self::Seedance2ProAudio), "seedance2pro_video_alt" => Ok(Self::Seedance2ProVideoAlt), "seedance2pro_video_bpu" => Ok(Self::Seedance2ProVideoBytePlusUltra), + "seedance2pro_image_bpu" => Ok(Self::Seedance2ProImageBytePlusUltra), "worldlabs_splat" => Ok(Self::WorldlabsSplat), "tts_gpt_so_vits" => Ok(Self::TtsGptSoVits), "tts_style_tts2" => Ok(Self::TtsStyleTts2), @@ -272,6 +278,7 @@ impl InferenceJobProductCategory { Self::Seedance2ProAudio, Self::Seedance2ProVideoAlt, Self::Seedance2ProVideoBytePlusUltra, + Self::Seedance2ProImageBytePlusUltra, Self::WorldlabsSplat, Self::TtsGptSoVits, Self::TtsStyleTts2, @@ -324,6 +331,7 @@ mod tests { assert_serialization(InferenceJobProductCategory::Seedance2ProAudio, "seedance2pro_audio"); assert_serialization(InferenceJobProductCategory::Seedance2ProVideoAlt, "seedance2pro_video_alt"); assert_serialization(InferenceJobProductCategory::Seedance2ProVideoBytePlusUltra, "seedance2pro_video_bpu"); + assert_serialization(InferenceJobProductCategory::Seedance2ProImageBytePlusUltra, "seedance2pro_image_bpu"); assert_serialization(InferenceJobProductCategory::WorldlabsSplat, "worldlabs_splat"); assert_serialization(InferenceJobProductCategory::TtsGptSoVits, "tts_gpt_so_vits"); assert_serialization(InferenceJobProductCategory::TtsStyleTts2, "tts_style_tts2"); @@ -366,6 +374,7 @@ mod tests { assert_eq!(InferenceJobProductCategory::Seedance2ProAudio.to_str(), "seedance2pro_audio"); assert_eq!(InferenceJobProductCategory::Seedance2ProVideoAlt.to_str(), "seedance2pro_video_alt"); assert_eq!(InferenceJobProductCategory::Seedance2ProVideoBytePlusUltra.to_str(), "seedance2pro_video_bpu"); + assert_eq!(InferenceJobProductCategory::Seedance2ProImageBytePlusUltra.to_str(), "seedance2pro_image_bpu"); assert_eq!(InferenceJobProductCategory::WorldlabsSplat.to_str(), "worldlabs_splat"); assert_eq!(InferenceJobProductCategory::TtsGptSoVits.to_str(), "tts_gpt_so_vits"); assert_eq!(InferenceJobProductCategory::TtsStyleTts2.to_str(), "tts_style_tts2"); @@ -407,6 +416,7 @@ mod tests { assert_eq!(InferenceJobProductCategory::from_str("seedance2pro_audio").unwrap(), InferenceJobProductCategory::Seedance2ProAudio); assert_eq!(InferenceJobProductCategory::from_str("seedance2pro_video_alt").unwrap(), InferenceJobProductCategory::Seedance2ProVideoAlt); assert_eq!(InferenceJobProductCategory::from_str("seedance2pro_video_bpu").unwrap(), InferenceJobProductCategory::Seedance2ProVideoBytePlusUltra); + assert_eq!(InferenceJobProductCategory::from_str("seedance2pro_image_bpu").unwrap(), InferenceJobProductCategory::Seedance2ProImageBytePlusUltra); assert_eq!(InferenceJobProductCategory::from_str("worldlabs_splat").unwrap(), InferenceJobProductCategory::WorldlabsSplat); assert_eq!(InferenceJobProductCategory::from_str("tts_gpt_so_vits").unwrap(), InferenceJobProductCategory::TtsGptSoVits); assert_eq!(InferenceJobProductCategory::from_str("tts_style_tts2").unwrap(), InferenceJobProductCategory::TtsStyleTts2); @@ -434,7 +444,7 @@ mod tests { #[test] fn all_variants() { // Static check - const EXPECTED_COUNT : usize = 38; + const EXPECTED_COUNT : usize = 39; assert_eq!(InferenceJobProductCategory::all_variants().len(), EXPECTED_COUNT); assert_eq!(InferenceJobProductCategory::iter().len(), EXPECTED_COUNT); diff --git a/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs b/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs index 8f842791eb..9083b77cfb 100644 --- a/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs +++ b/crates/schema/public/enums/src/by_table/generic_inference_jobs/inference_model_type.rs @@ -129,6 +129,8 @@ pub enum InferenceModelType { Seedream5Lite, #[serde(rename = "seedream_5p0_pro")] Seedream5p0Pro, + #[serde(rename = "seedream_5p0_pro_u")] + Seedream5p0ProUltra, #[serde(rename = "midjourney")] Midjourney, #[serde(rename = "midjourney_v6")] @@ -337,6 +339,7 @@ impl InferenceModelType { Self::Seedream4p5 => "seedream_4p5", Self::Seedream5Lite => "seedream_5_lite", Self::Seedream5p0Pro => "seedream_5p0_pro", + Self::Seedream5p0ProUltra => "seedream_5p0_pro_u", Self::Midjourney => "midjourney", Self::MidjourneyV6 => "midjourney_v6", Self::MidjourneyV6p1 => "midjourney_v6p1", @@ -466,6 +469,7 @@ impl InferenceModelType { "seedream_4p5" => Ok(Self::Seedream4p5), "seedream_5_lite" => Ok(Self::Seedream5Lite), "seedream_5p0_pro" => Ok(Self::Seedream5p0Pro), + "seedream_5p0_pro_u" => Ok(Self::Seedream5p0ProUltra), "midjourney" => Ok(Self::Midjourney), "midjourney_v6" => Ok(Self::MidjourneyV6), "midjourney_v6p1" => Ok(Self::MidjourneyV6p1), @@ -599,6 +603,7 @@ impl InferenceModelType { Self::Seedream4p5, Self::Seedream5Lite, Self::Seedream5p0Pro, + Self::Seedream5p0ProUltra, Self::Midjourney, Self::MidjourneyV6, Self::MidjourneyV6p1, @@ -715,6 +720,7 @@ impl InferenceModelType { CommonModelType::Seedream4p5 => Self::Seedream4p5, CommonModelType::Seedream5Lite => Self::Seedream5Lite, CommonModelType::Seedream5p0Pro => Self::Seedream5p0Pro, + CommonModelType::Seedream5p0ProUltra => Self::Seedream5p0ProUltra, CommonModelType::Midjourney => Self::Midjourney, CommonModelType::MidjourneyV6 => Self::MidjourneyV6, CommonModelType::MidjourneyV6p1 => Self::MidjourneyV6p1, diff --git a/crates/schema/public/enums/src/common/generation/common_image_model.rs b/crates/schema/public/enums/src/common/generation/common_image_model.rs index 3b84ff7e72..42e81d2bf6 100644 --- a/crates/schema/public/enums/src/common/generation/common_image_model.rs +++ b/crates/schema/public/enums/src/common/generation/common_image_model.rs @@ -49,6 +49,8 @@ pub enum CommonImageModel { Seedream5Lite, #[serde(rename = "seedream_5p0_pro")] Seedream5p0Pro, + #[serde(rename = "seedream_5p0_pro_u")] + Seedream5p0ProUltra, #[serde(rename = "qwen_edit_2511_angles")] QwenEdit2511Angles, #[serde(rename = "flux_2_lora_angles")] @@ -78,6 +80,7 @@ impl CommonImageModel { Self::Seedream4p5 => CommonModelType::Seedream4p5, Self::Seedream5Lite => CommonModelType::Seedream5Lite, Self::Seedream5p0Pro => CommonModelType::Seedream5p0Pro, + Self::Seedream5p0ProUltra => CommonModelType::Seedream5p0ProUltra, Self::QwenEdit2511Angles => CommonModelType::QwenEdit2511Angles, Self::Flux2LoraAngles => CommonModelType::Flux2LoraAngles, } @@ -115,6 +118,7 @@ mod tests { assert_serialization(CommonImageModel::Seedream4p5, "seedream_4p5"); assert_serialization(CommonImageModel::Seedream5Lite, "seedream_5_lite"); assert_serialization(CommonImageModel::Seedream5p0Pro, "seedream_5p0_pro"); + assert_serialization(CommonImageModel::Seedream5p0ProUltra, "seedream_5p0_pro_u"); assert_serialization(CommonImageModel::QwenEdit2511Angles, "qwen_edit_2511_angles"); assert_serialization(CommonImageModel::Flux2LoraAngles, "flux_2_lora_angles"); } @@ -141,6 +145,7 @@ mod tests { (CommonImageModel::Seedream4p5, CommonModelType::Seedream4p5), (CommonImageModel::Seedream5Lite, CommonModelType::Seedream5Lite), (CommonImageModel::Seedream5p0Pro, CommonModelType::Seedream5p0Pro), + (CommonImageModel::Seedream5p0ProUltra, CommonModelType::Seedream5p0ProUltra), (CommonImageModel::QwenEdit2511Angles, CommonModelType::QwenEdit2511Angles), (CommonImageModel::Flux2LoraAngles, CommonModelType::Flux2LoraAngles), ]; @@ -169,7 +174,7 @@ mod tests { #[test] fn variant_count() { use strum::IntoEnumIterator; - assert_eq!(CommonImageModel::iter().len(), 21); + assert_eq!(CommonImageModel::iter().len(), 22); } #[test] diff --git a/crates/schema/public/enums/src/common/generation/common_model_type.rs b/crates/schema/public/enums/src/common/generation/common_model_type.rs index 0c2b5db723..4fa0a5c0db 100644 --- a/crates/schema/public/enums/src/common/generation/common_model_type.rs +++ b/crates/schema/public/enums/src/common/generation/common_model_type.rs @@ -85,6 +85,9 @@ pub enum CommonModelType { /// Seedream 5.0 Pro as routed via kinovi #[serde(rename = "seedream_5p0_pro")] Seedream5p0Pro, + /// Seedream 5.0 Pro as routed via the kinovi ultra account + #[serde(rename = "seedream_5p0_pro_u")] + Seedream5p0ProUltra, /// Midjourney without distinguishing a model type or version #[serde(rename = "midjourney")] @@ -291,6 +294,7 @@ impl CommonModelType { Self::Seedream4p5 => "seedream_4p5", Self::Seedream5Lite => "seedream_5_lite", Self::Seedream5p0Pro => "seedream_5p0_pro", + Self::Seedream5p0ProUltra => "seedream_5p0_pro_u", Self::Midjourney => "midjourney", Self::MidjourneyV6 => "midjourney_v6", Self::MidjourneyV6p1 => "midjourney_v6p1", @@ -403,6 +407,7 @@ impl CommonModelType { "seedream_4p5" => Ok(Self::Seedream4p5), "seedream_5_lite" => Ok(Self::Seedream5Lite), "seedream_5p0_pro" => Ok(Self::Seedream5p0Pro), + "seedream_5p0_pro_u" => Ok(Self::Seedream5p0ProUltra), "midjourney" => Ok(Self::Midjourney), "midjourney_v6" => Ok(Self::MidjourneyV6), "midjourney_v6p1" => Ok(Self::MidjourneyV6p1), @@ -519,6 +524,7 @@ impl CommonModelType { Self::Seedream4p5, Self::Seedream5Lite, Self::Seedream5p0Pro, + Self::Seedream5p0ProUltra, Self::Midjourney, Self::MidjourneyV6, Self::MidjourneyV6p1, @@ -632,6 +638,7 @@ impl CommonModelType { Self::Seedream4p5 => CommonModelClass::Image, Self::Seedream5Lite => CommonModelClass::Image, Self::Seedream5p0Pro => CommonModelClass::Image, + Self::Seedream5p0ProUltra => CommonModelClass::Image, Self::Midjourney => CommonModelClass::Image, Self::MidjourneyV6 => CommonModelClass::Image, Self::MidjourneyV6p1 => CommonModelClass::Image, @@ -755,6 +762,7 @@ mod tests { assert_serialization(CommonModelType::Seedream4p5, "seedream_4p5"); assert_serialization(CommonModelType::Seedream5Lite, "seedream_5_lite"); assert_serialization(CommonModelType::Seedream5p0Pro, "seedream_5p0_pro"); + assert_serialization(CommonModelType::Seedream5p0ProUltra, "seedream_5p0_pro_u"); assert_serialization(CommonModelType::Midjourney, "midjourney"); assert_serialization(CommonModelType::MidjourneyV6, "midjourney_v6"); assert_serialization(CommonModelType::MidjourneyV6p1, "midjourney_v6p1"); @@ -861,6 +869,7 @@ mod tests { assert_eq!(CommonModelType::Seedream4p5.to_str(), "seedream_4p5"); assert_eq!(CommonModelType::Seedream5Lite.to_str(), "seedream_5_lite"); assert_eq!(CommonModelType::Seedream5p0Pro.to_str(), "seedream_5p0_pro"); + assert_eq!(CommonModelType::Seedream5p0ProUltra.to_str(), "seedream_5p0_pro_u"); assert_eq!(CommonModelType::Midjourney.to_str(), "midjourney"); assert_eq!(CommonModelType::MidjourneyV6.to_str(), "midjourney_v6"); assert_eq!(CommonModelType::MidjourneyV6p1.to_str(), "midjourney_v6p1"); @@ -971,6 +980,7 @@ mod tests { assert_eq!(CommonModelType::from_str("seedream_4p5").unwrap(), CommonModelType::Seedream4p5); assert_eq!(CommonModelType::from_str("seedream_5_lite").unwrap(), CommonModelType::Seedream5Lite); assert_eq!(CommonModelType::from_str("seedream_5p0_pro").unwrap(), CommonModelType::Seedream5p0Pro); + assert_eq!(CommonModelType::from_str("seedream_5p0_pro_u").unwrap(), CommonModelType::Seedream5p0ProUltra); assert_eq!(CommonModelType::from_str("midjourney").unwrap(), CommonModelType::Midjourney); assert_eq!(CommonModelType::from_str("midjourney_v6").unwrap(), CommonModelType::MidjourneyV6); assert_eq!(CommonModelType::from_str("midjourney_v6p1").unwrap(), CommonModelType::MidjourneyV6p1); @@ -1052,7 +1062,7 @@ mod tests { #[test] fn all_variants() { let mut variants = CommonModelType::all_variants(); - assert_eq!(variants.len(), 97); + assert_eq!(variants.len(), 98); // Image models assert_eq!(variants.pop_first(), Some(CommonModelType::Flux1Dev)); assert_eq!(variants.pop_first(), Some(CommonModelType::Flux1Schnell)); @@ -1080,6 +1090,7 @@ mod tests { assert_eq!(variants.pop_first(), Some(CommonModelType::Seedream4p5)); assert_eq!(variants.pop_first(), Some(CommonModelType::Seedream5Lite)); assert_eq!(variants.pop_first(), Some(CommonModelType::Seedream5p0Pro)); + assert_eq!(variants.pop_first(), Some(CommonModelType::Seedream5p0ProUltra)); assert_eq!(variants.pop_first(), Some(CommonModelType::Midjourney)); assert_eq!(variants.pop_first(), Some(CommonModelType::MidjourneyV6)); assert_eq!(variants.pop_first(), Some(CommonModelType::MidjourneyV6p1)); diff --git a/crates/service/web/storyteller_web/src/configs/omni_gen/image_models.rs b/crates/service/web/storyteller_web/src/configs/omni_gen/image_models.rs index a01c84d96b..13fb9a4cd4 100644 --- a/crates/service/web/storyteller_web/src/configs/omni_gen/image_models.rs +++ b/crates/service/web/storyteller_web/src/configs/omni_gen/image_models.rs @@ -470,6 +470,37 @@ fn build_omni_gen_image_models() -> Vec { ..Default::default() }); + models.push(OmniGenImageModelDetails { + model: CommonImageModel::Seedream5p0ProUltra, + model_creator: Some(ModelCreator::Bytedance), + full_name: Some("Seedream 5.0 Pro Ultra".to_string()), + text_prompt_supported: Some(true), + image_refs_supported: Some(true), + image_refs_max: Some(14), + aspect_ratio_options: Some(vec![ + CommonAspectRatio::Auto, + CommonAspectRatio::WideTwentyOneByNine, + CommonAspectRatio::WideSixteenByNine, + CommonAspectRatio::WideThreeByTwo, + CommonAspectRatio::WideFourByThree, + CommonAspectRatio::Square, + CommonAspectRatio::TallThreeByFour, + CommonAspectRatio::TallTwoByThree, + CommonAspectRatio::TallNineBySixteen, + ]), + aspect_ratio_default: Some(CommonAspectRatio::Square), + aspect_ratio_default_when_editing: Some(CommonAspectRatio::Auto), + resolution_options: Some(vec![ + CommonResolution::OneK, + CommonResolution::TwoK, + ]), + resolution_default: Some(CommonResolution::TwoK), + batch_size_min: Some(1), + batch_size_max: Some(8), + batch_size_default: Some(1), + ..Default::default() + }); + models } @@ -519,6 +550,10 @@ fn build_omni_gen_image_model_providers() -> Vec Result RouterImageModel::Seedream4p5, CommonImageModel::Seedream5Lite => RouterImageModel::Seedream5Lite, CommonImageModel::Seedream5p0Pro => RouterImageModel::Seedream5p0Pro, + CommonImageModel::Seedream5p0ProUltra => RouterImageModel::Seedream5p0ProUltra, CommonImageModel::GrokImagineImage => RouterImageModel::GrokImagineImage, CommonImageModel::GrokImagineImageQuality => RouterImageModel::GrokImagineImageQuality, CommonImageModel::QwenEdit2511Angles => RouterImageModel::QwenEdit2511Angles, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs index 7c3bf15793..195660d77b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/omni_api_image_generate_handler.rs @@ -13,6 +13,7 @@ use enums::by_table::debug_logs::debug_log_type::DebugLogType; use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType; use enums::by_table::prompts::prompt_type::PromptType; use enums::common::generation::common_generation_mode::CommonGenerationMode; +use enums::common::generation::common_image_model::CommonImageModel; use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation_provider::GenerationProvider; use enums::common::platform_type::PlatformType; @@ -37,6 +38,7 @@ use crate::http_server::endpoints::omni_api::generate::image::insert_db_job::ins use crate::http_server::endpoints::omni_api::generate::image::insert_db_job::insert_seedance2pro_jobs::{insert_seedance2pro_jobs, InsertSeedance2proJobsArgs}; use crate::http_server::endpoints::omni_api::generate::image::insert_db_job::shared_job_args::SharedJobArgs; use crate::http_server::endpoints::omni_api::generate::image::pipeline_v2::run_pipeline_v2::{run_pipeline_v2, RunPipelineV2Args}; +use crate::http_server::endpoints::omni_api::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::user_lookup::api_keys::require_api_key_user::require_api_key_user; use crate::http_server::user_lookup::user_session::session_utils::lookup::user_session_feature_flags::UserSessionFeatureFlags; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; @@ -135,6 +137,14 @@ pub async fn omni_api_image_generate_handler( let router_builder = hydrate_to_router_request(&request)?; + // ==================== PIPELINE DISPATCH ==================== // + + let kinovi_account = match request.model { + Some(CommonImageModel::Seedream5p0ProUltra) => KinoviAccount::BytePlusUltra, + // Everything else goes through Volcengine + _ => KinoviAccount::Volcengine, + }; + // ==================== DEBUG LOG: HTTP REQUEST ==================== // if let Err(err) = insert_debug_log(InsertDebugLogArgs { @@ -170,6 +180,7 @@ pub async fn omni_api_image_generate_handler( server_state: &server_state, user_token, resolved_media: &resolved_media, + kinovi_account, debug_log_context: &debug_log_context, mysql_connection, }).await; @@ -289,10 +300,11 @@ pub async fn omni_api_image_generate_handler( GenerateImageResponse::Seedance2Pro(payload) => { info!("Inserting seedance2pro image job(s) with token: {:?}", pipeline_result.apriori_job_token); - // The image-side omni pipeline always dispatches Midjourney via the - // Volcengine Kinovi account today. If we ever route to BytePlus / - // BytePlus Ultra here, mirror the video-side `kinovi_account` knob. - let kinovi_version = KinoviVersion::Volcengine; + let kinovi_version = match kinovi_account { + KinoviAccount::Volcengine => KinoviVersion::Volcengine, + KinoviAccount::BytePlus => KinoviVersion::BytePlus, + KinoviAccount::BytePlusUltra => KinoviVersion::BytePlusUltra, + }; let result = insert_seedance2pro_jobs(InsertSeedance2proJobsArgs { primary_order_id: &payload.order_id, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/pipeline_v2/run_pipeline_v2.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/pipeline_v2/run_pipeline_v2.rs index 18bd22b70a..f017e510c1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/pipeline_v2/run_pipeline_v2.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/image/pipeline_v2/run_pipeline_v2.rs @@ -21,6 +21,7 @@ use crate::http_server::endpoints::generate::common::generation_debug_logs::{ insert_provider_request_debug_log, provider_request_debug_log_type, GenerationDebugLogContext, }; use crate::http_server::endpoints::omni_api::generate::image::pipeline_result::ImagePipelineResult; +use crate::http_server::endpoints::omni_api::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_api::shared_utils::map_seedance2pro_router_error::map_router_error_to_web_error; use crate::state::server_state::ServerState; use crate::util::lookup::lookup_media_files_as_cdn_url_list_and_map::MediaFilesAsCdnUrlListAndMap; @@ -30,6 +31,7 @@ pub struct RunPipelineV2Args<'a> { pub server_state: &'a ServerState, pub user_token: &'a UserToken, pub resolved_media: &'a MediaFilesAsCdnUrlListAndMap, + pub kinovi_account: KinoviAccount, pub debug_log_context: &'a GenerationDebugLogContext<'a>, /// The handler's open connection. The pipeline uses it for its remaining /// pre-request DB writes (billing, outbound-request debug log) and releases @@ -49,6 +51,7 @@ pub async fn run_pipeline_v2( server_state, user_token, resolved_media, + kinovi_account, debug_log_context, mut mysql_connection, } = args; @@ -97,7 +100,7 @@ pub async fn run_pipeline_v2( // across the external generation call below. drop(mysql_connection); - let response = finalize_and_generate(draft_or_request, server_state, resolved_media).await?; + let response = finalize_and_generate(draft_or_request, server_state, resolved_media, kinovi_account).await?; Ok(ImagePipelineResult { apriori_job_token, @@ -118,15 +121,17 @@ fn build_execution_request( }) } -/// Route each image model to the provider that fulfils it. Midjourney is -/// served via the Seedance2Pro/Kinovi (Volcengine) backend; everything else -/// flows through Fal. +/// Route each image model to the provider that fulfils it. Midjourney and +/// Seedream 5.0 Pro (both variants) are served via the Seedance2Pro/Kinovi +/// backend; everything else flows through Fal. Which Kinovi account fulfils +/// a Kinovi request is the handler's `kinovi_account` choice. fn provider_for_model(model: RouterImageModel) -> RouterProvider { match model { RouterImageModel::Midjourney7 | RouterImageModel::Midjourney7Niji | RouterImageModel::Midjourney8 - | RouterImageModel::Seedream5p0Pro => RouterProvider::Seedance2Pro, + | RouterImageModel::Seedream5p0Pro + | RouterImageModel::Seedream5p0ProUltra => RouterProvider::Seedance2Pro, _ => RouterProvider::Fal, } } @@ -172,9 +177,10 @@ async fn finalize_and_generate( draft_or_request: ImageGenerationDraftOrRequest, server_state: &ServerState, resolved_media: &MediaFilesAsCdnUrlListAndMap, + kinovi_account: KinoviAccount, ) -> Result { let provider = draft_or_request.get_provider(); - let client = build_router_client(provider, server_state)?; + let client = build_router_client(provider, server_state, kinovi_account)?; // Inline the draft finalization so the draft context can borrow `client`. let request: ImageGenerationRequest = match draft_or_request { @@ -204,6 +210,7 @@ async fn finalize_and_generate( fn build_router_client( provider: RouterProvider, server_state: &ServerState, + kinovi_account: KinoviAccount, ) -> Result { match provider { RouterProvider::Fal => { @@ -214,11 +221,12 @@ fn build_router_client( Ok(RouterClient::Fal(fal_client)) }, RouterProvider::Seedance2Pro => { - // Midjourney image generation always uses the Volcengine account. - // Per-request account selection (like the video flow's - // `KinoviAccount` enum) isn't needed here yet — if it ever is, plumb - // a parallel knob through `RunPipelineV2Args`. - let cookies = server_state.inference_providers.seedance2pro.cookies_volcengine.clone(); + let seedance2pro = &server_state.inference_providers.seedance2pro; + let cookies = match kinovi_account { + KinoviAccount::Volcengine => seedance2pro.cookies_volcengine.clone(), + KinoviAccount::BytePlus => seedance2pro.cookies_byteplus.clone(), + KinoviAccount::BytePlusUltra => seedance2pro.cookies_byteplus_ultra.clone(), + }; let session = Seedance2ProSession::from_cookies_string(cookies); Ok(RouterClient::Seedance2Pro(RouterSeedance2ProClient::new(session))) }, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/helpers/build_router_client.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/helpers/build_router_client.rs index 0e153c7cb8..2805025bea 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/helpers/build_router_client.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/helpers/build_router_client.rs @@ -9,7 +9,7 @@ use artcraft_router::client::router_seedance2pro_client::RouterSeedance2ProClien use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::endpoints::omni_api::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_api::shared_utils::kinovi_account::KinoviAccount; use crate::state::server_state::ServerState; pub fn build_router_client( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/mod.rs index 65f5fa3973..2d64bb7cbe 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/mod.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/mod.rs @@ -4,4 +4,3 @@ pub mod helpers; pub mod ingest_url_inputs; pub mod pipeline_v2; pub mod insert_db_job; -pub mod kinovi_account; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs index 5e707c6f56..bc6170a9e2 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/omni_api_video_generate_handler.rs @@ -43,7 +43,7 @@ use crate::http_server::endpoints::omni_api::generate::video::insert_db_job::ins use crate::http_server::endpoints::omni_api::generate::video::insert_db_job::insert_grok_api_job::{insert_grok_api_job, InsertGrokApiJobArgs}; use crate::http_server::endpoints::omni_api::generate::video::insert_db_job::insert_seedance2pro_jobs::{insert_seedance2pro_jobs, InsertSeedance2proJobsArgs}; use crate::http_server::endpoints::omni_api::generate::video::insert_db_job::shared_job_args::SharedJobArgs; -use crate::http_server::endpoints::omni_api::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_api::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_api::generate::video::pipeline_v2::run_pipeline_v2::{run_pipeline_v2, RunPipelineV2Args}; use crate::http_server::endpoints::omni_api::shared_utils::video::validate_video_request::validate_video_request; use crate::http_server::user_lookup::user_session::session_utils::lookup::user_session_feature_flags::UserSessionFeatureFlags; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/pipeline_v2/run_pipeline_v2.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/pipeline_v2/run_pipeline_v2.rs index 2d863f0b1e..274b3adc61 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/pipeline_v2/run_pipeline_v2.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/pipeline_v2/run_pipeline_v2.rs @@ -23,7 +23,7 @@ use crate::http_server::endpoints::omni_api::generate::video::helpers::build_rou use crate::http_server::endpoints::omni_api::generate::video::helpers::pipeline_result::PipelineResult; use crate::http_server::endpoints::omni_api::generate::video::helpers::resolve_media_tokens_to_urls::resolve_media_tokens_to_urls; use mysql_queries::queries::generic_inference::common::job_cost_estimates::JobCostEstimates; -use crate::http_server::endpoints::omni_api::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_api::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_api::shared_utils::map_seedance2pro_router_error::map_router_error_to_web_error; use crate::state::server_state::ServerState; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/kinovi_account.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/kinovi_account.rs similarity index 100% rename from crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/generate/video/kinovi_account.rs rename to crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/kinovi_account.rs diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/mod.rs index 91f31a387b..7c6aded461 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/mod.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_api/shared_utils/mod.rs @@ -1,4 +1,5 @@ pub mod check_url_inputs; +pub mod kinovi_account; pub mod map_seedance2pro_router_error; pub mod media_uploads; pub mod video; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/omni_gen_audio_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/omni_gen_audio_generate_handler.rs index 28122a0b65..798a831947 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/omni_gen_audio_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/omni_gen_audio_generate_handler.rs @@ -36,7 +36,7 @@ use crate::http_server::endpoints::omni_gen::generate::audio::insert_db_job::ins use crate::http_server::endpoints::omni_gen::generate::audio::insert_db_job::insert_seedance2pro_job::{insert_seedance2pro_job, InsertSeedance2proJobArgs}; use crate::http_server::endpoints::omni_gen::generate::audio::pipeline_v2::run_pipeline_v2::{run_pipeline_v2, RunPipelineV2Args}; use crate::http_server::endpoints::omni_gen::generate::video::insert_db_job::shared_job_args::SharedJobArgs; -use crate::http_server::endpoints::omni_gen::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_gen::shared_utils::audio::validate_audio_request::validate_audio_request; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; use crate::http_server::web_utils::get_request_platform_type::get_request_platform_type; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/pipeline_v2/run_pipeline_v2.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/pipeline_v2/run_pipeline_v2.rs index 5498bfec67..6d639cf217 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/pipeline_v2/run_pipeline_v2.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/audio/pipeline_v2/run_pipeline_v2.rs @@ -22,7 +22,7 @@ use crate::http_server::endpoints::omni_gen::generate::audio::helpers::pipeline_ use crate::http_server::endpoints::omni_gen::generate::audio::helpers::resolve_media_tokens_to_urls::resolve_media_tokens_to_urls; use crate::http_server::endpoints::omni_gen::generate::video::helpers::bill_wallet::bill_wallet; use crate::http_server::endpoints::omni_gen::generate::video::helpers::build_router_client::build_router_client; -use crate::http_server::endpoints::omni_gen::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_gen::shared_utils::map_seedance2pro_router_error::map_router_error_to_web_error; use crate::state::server_state::ServerState; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs index 9891523691..2f3ab8292a 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/omni_gen_image_generate_handler.rs @@ -12,6 +12,7 @@ use enums::by_table::debug_logs::debug_log_type::DebugLogType; use enums::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType; use enums::by_table::prompts::prompt_type::PromptType; use enums::common::generation::common_generation_mode::CommonGenerationMode; +use enums::common::generation::common_image_model::CommonImageModel; use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation_provider::GenerationProvider; use http_server_common::request::get_request_ip::get_request_ip; @@ -34,6 +35,7 @@ use crate::http_server::endpoints::omni_gen::generate::image::insert_db_job::ins use crate::http_server::endpoints::omni_gen::generate::image::insert_db_job::insert_seedance2pro_jobs::{insert_seedance2pro_jobs, InsertSeedance2proJobsArgs}; use crate::http_server::endpoints::omni_gen::generate::image::insert_db_job::shared_job_args::SharedJobArgs; use crate::http_server::endpoints::omni_gen::generate::image::pipeline_v2::run_pipeline_v2::{run_pipeline_v2, RunPipelineV2Args}; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::user_lookup::user_session::session_utils::lookup::user_session_feature_flags::UserSessionFeatureFlags; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; use crate::http_server::web_utils::get_request_platform_type::get_request_platform_type; @@ -130,6 +132,14 @@ pub async fn omni_gen_image_generate_handler( let router_builder = hydrate_to_router_request(&request)?; + // ==================== PIPELINE DISPATCH ==================== // + + let kinovi_account = match request.model { + Some(CommonImageModel::Seedream5p0ProUltra) => KinoviAccount::BytePlusUltra, + // Everything else goes through Volcengine + _ => KinoviAccount::Volcengine, + }; + // ==================== DEBUG LOG: HTTP REQUEST ==================== // let ip_address = get_request_ip(&http_request); @@ -168,6 +178,7 @@ pub async fn omni_gen_image_generate_handler( server_state: &server_state, user_token, resolved_media: &resolved_media, + kinovi_account, debug_log_context: &debug_log_context, mysql_connection, }).await; @@ -286,10 +297,11 @@ pub async fn omni_gen_image_generate_handler( GenerateImageResponse::Seedance2Pro(payload) => { info!("Inserting seedance2pro image job(s) with token: {:?}", pipeline_result.apriori_job_token); - // The image-side omni pipeline always dispatches Midjourney via the - // Volcengine Kinovi account today. If we ever route to BytePlus / - // BytePlus Ultra here, mirror the video-side `kinovi_account` knob. - let kinovi_version = KinoviVersion::Volcengine; + let kinovi_version = match kinovi_account { + KinoviAccount::Volcengine => KinoviVersion::Volcengine, + KinoviAccount::BytePlus => KinoviVersion::BytePlus, + KinoviAccount::BytePlusUltra => KinoviVersion::BytePlusUltra, + }; let result = insert_seedance2pro_jobs(InsertSeedance2proJobsArgs { primary_order_id: &payload.order_id, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/pipeline_v2/run_pipeline_v2.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/pipeline_v2/run_pipeline_v2.rs index 8f856b724c..5bfd718c28 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/pipeline_v2/run_pipeline_v2.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/image/pipeline_v2/run_pipeline_v2.rs @@ -21,6 +21,7 @@ use crate::http_server::endpoints::generate::common::generation_debug_logs::{ insert_provider_request_debug_log, provider_request_debug_log_type, GenerationDebugLogContext, }; use crate::http_server::endpoints::omni_gen::generate::image::pipeline_result::ImagePipelineResult; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_gen::shared_utils::map_seedance2pro_router_error::map_router_error_to_web_error; use crate::state::server_state::ServerState; use crate::util::lookup::lookup_media_files_as_cdn_url_list_and_map::MediaFilesAsCdnUrlListAndMap; @@ -30,6 +31,7 @@ pub struct RunPipelineV2Args<'a> { pub server_state: &'a ServerState, pub user_token: &'a UserToken, pub resolved_media: &'a MediaFilesAsCdnUrlListAndMap, + pub kinovi_account: KinoviAccount, pub debug_log_context: &'a GenerationDebugLogContext<'a>, /// The handler's open connection. The pipeline uses it for its remaining /// pre-request DB writes (billing, outbound-request debug log) and releases @@ -49,6 +51,7 @@ pub async fn run_pipeline_v2( server_state, user_token, resolved_media, + kinovi_account, debug_log_context, mut mysql_connection, } = args; @@ -97,7 +100,7 @@ pub async fn run_pipeline_v2( // across the external generation call below. drop(mysql_connection); - let response = finalize_and_generate(draft_or_request, server_state, resolved_media).await?; + let response = finalize_and_generate(draft_or_request, server_state, resolved_media, kinovi_account).await?; Ok(ImagePipelineResult { apriori_job_token, @@ -119,14 +122,16 @@ fn build_execution_request( } /// Route each image model to the provider that fulfils it. Midjourney and -/// Seedream 5.0 Pro are served via the Seedance2Pro/Kinovi (Volcengine) -/// backend; everything else flows through Fal. +/// Seedream 5.0 Pro (both variants) are served via the Seedance2Pro/Kinovi +/// backend; everything else flows through Fal. Which Kinovi account fulfils +/// a Kinovi request is the handler's `kinovi_account` choice. fn provider_for_model(model: RouterImageModel) -> RouterProvider { match model { RouterImageModel::Midjourney7 | RouterImageModel::Midjourney7Niji | RouterImageModel::Midjourney8 - | RouterImageModel::Seedream5p0Pro => RouterProvider::Seedance2Pro, + | RouterImageModel::Seedream5p0Pro + | RouterImageModel::Seedream5p0ProUltra => RouterProvider::Seedance2Pro, _ => RouterProvider::Fal, } } @@ -172,9 +177,10 @@ async fn finalize_and_generate( draft_or_request: ImageGenerationDraftOrRequest, server_state: &ServerState, resolved_media: &MediaFilesAsCdnUrlListAndMap, + kinovi_account: KinoviAccount, ) -> Result { let provider = draft_or_request.get_provider(); - let client = build_router_client(provider, server_state)?; + let client = build_router_client(provider, server_state, kinovi_account)?; // Inline the draft finalization so the draft context can borrow `client`. let request: ImageGenerationRequest = match draft_or_request { @@ -204,6 +210,7 @@ async fn finalize_and_generate( fn build_router_client( provider: RouterProvider, server_state: &ServerState, + kinovi_account: KinoviAccount, ) -> Result { match provider { RouterProvider::Fal => { @@ -214,11 +221,12 @@ fn build_router_client( Ok(RouterClient::Fal(fal_client)) }, RouterProvider::Seedance2Pro => { - // Midjourney image generation always uses the Volcengine account. - // Per-request account selection (like the video flow's - // `KinoviAccount` enum) isn't needed here yet — if it ever is, plumb - // a parallel knob through `RunPipelineV2Args`. - let cookies = server_state.inference_providers.seedance2pro.cookies_volcengine.clone(); + let seedance2pro = &server_state.inference_providers.seedance2pro; + let cookies = match kinovi_account { + KinoviAccount::Volcengine => seedance2pro.cookies_volcengine.clone(), + KinoviAccount::BytePlus => seedance2pro.cookies_byteplus.clone(), + KinoviAccount::BytePlusUltra => seedance2pro.cookies_byteplus_ultra.clone(), + }; let session = Seedance2ProSession::from_cookies_string(cookies); Ok(RouterClient::Seedance2Pro(RouterSeedance2ProClient::new(session))) }, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/mesh/pipeline_v2/run_pipeline_v2.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/mesh/pipeline_v2/run_pipeline_v2.rs index 6b84bd3229..28fdcf1604 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/mesh/pipeline_v2/run_pipeline_v2.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/mesh/pipeline_v2/run_pipeline_v2.rs @@ -21,7 +21,7 @@ use crate::http_server::endpoints::omni_gen::generate::mesh::helpers::pipeline_r use crate::http_server::endpoints::omni_gen::generate::mesh::helpers::resolve_media_tokens_to_urls::resolve_media_tokens_to_urls; use crate::http_server::endpoints::omni_gen::generate::video::helpers::bill_wallet::bill_wallet; use crate::http_server::endpoints::omni_gen::generate::video::helpers::build_router_client::build_router_client; -use crate::http_server::endpoints::omni_gen::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_gen::shared_utils::map_seedance2pro_router_error::map_router_error_to_web_error; use crate::state::server_state::ServerState; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/splat/pipeline_v2/run_pipeline_v2.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/splat/pipeline_v2/run_pipeline_v2.rs index 720aa09933..2b467e9dcf 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/splat/pipeline_v2/run_pipeline_v2.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/splat/pipeline_v2/run_pipeline_v2.rs @@ -22,7 +22,7 @@ use crate::http_server::endpoints::omni_gen::generate::splat::helpers::pipeline_ use crate::http_server::endpoints::omni_gen::generate::splat::helpers::resolve_media_tokens_to_urls::resolve_media_tokens_to_urls; use crate::http_server::endpoints::omni_gen::generate::video::helpers::bill_wallet::bill_wallet; use crate::http_server::endpoints::omni_gen::generate::video::helpers::build_router_client::build_router_client; -use crate::http_server::endpoints::omni_gen::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_gen::shared_utils::splat::map_worldlabs_router_error::map_worldlabs_router_error; use crate::state::server_state::ServerState; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/helpers/build_router_client.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/helpers/build_router_client.rs index ad6bfce8fe..591d7877b0 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/helpers/build_router_client.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/helpers/build_router_client.rs @@ -11,7 +11,7 @@ use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession; use worldlabs_api_client::credentials::world_labs_api_creds::WorldLabsApiCreds; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::endpoints::omni_gen::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::state::server_state::ServerState; pub fn build_router_client( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/mod.rs index a6796f2d16..4cd3b52436 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/mod.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/mod.rs @@ -2,4 +2,3 @@ pub mod omni_gen_video_generate_handler; pub mod helpers; pub mod pipeline_v2; pub mod insert_db_job; -pub mod kinovi_account; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs index 411781b0bc..6783232c88 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/omni_gen_video_generate_handler.rs @@ -40,7 +40,7 @@ use crate::http_server::endpoints::omni_gen::generate::video::insert_db_job::ins use crate::http_server::endpoints::omni_gen::generate::video::insert_db_job::insert_grok_api_job::{insert_grok_api_job, InsertGrokApiJobArgs}; use crate::http_server::endpoints::omni_gen::generate::video::insert_db_job::insert_seedance2pro_jobs::{insert_seedance2pro_jobs, InsertSeedance2proJobsArgs}; use crate::http_server::endpoints::omni_gen::generate::video::insert_db_job::shared_job_args::SharedJobArgs; -use crate::http_server::endpoints::omni_gen::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_gen::generate::video::pipeline_v2::run_pipeline_v2::{run_pipeline_v2, RunPipelineV2Args}; use crate::http_server::endpoints::omni_gen::shared_utils::video::validate_video_request::validate_video_request; use crate::http_server::user_lookup::user_session::session_utils::lookup::user_session_feature_flags::UserSessionFeatureFlags; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/pipeline_v2/run_pipeline_v2.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/pipeline_v2/run_pipeline_v2.rs index 04893ed21f..f73147b18f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/pipeline_v2/run_pipeline_v2.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/pipeline_v2/run_pipeline_v2.rs @@ -23,7 +23,7 @@ use crate::http_server::endpoints::omni_gen::generate::video::helpers::build_rou use crate::http_server::endpoints::omni_gen::generate::video::helpers::pipeline_result::PipelineResult; use crate::http_server::endpoints::omni_gen::generate::video::helpers::resolve_media_tokens_to_urls::resolve_media_tokens_to_urls; use mysql_queries::queries::generic_inference::common::job_cost_estimates::JobCostEstimates; -use crate::http_server::endpoints::omni_gen::generate::video::kinovi_account::KinoviAccount; +use crate::http_server::endpoints::omni_gen::shared_utils::kinovi_account::KinoviAccount; use crate::http_server::endpoints::omni_gen::shared_utils::map_seedance2pro_router_error::map_router_error_to_web_error; use crate::state::server_state::ServerState; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/kinovi_account.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/shared_utils/kinovi_account.rs similarity index 100% rename from crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/kinovi_account.rs rename to crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/shared_utils/kinovi_account.rs diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/shared_utils/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/shared_utils/mod.rs index f0d6d96a4f..dc387835f6 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/shared_utils/mod.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/shared_utils/mod.rs @@ -1,4 +1,5 @@ pub mod audio; +pub mod kinovi_account; pub mod map_router_cost_error; pub mod map_seedance2pro_router_error; pub mod mesh; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 54142bd5aa..9e19456435 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -372,6 +372,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -387,6 +388,7 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -870,6 +872,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -2664,6 +2667,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" } @@ -2740,6 +2744,7 @@ "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", "license": "MIT", + "peer": true, "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", @@ -2881,6 +2886,7 @@ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", "license": "MIT", + "peer": true, "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" @@ -2891,6 +2897,7 @@ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -2916,6 +2923,7 @@ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", "license": "MIT", + "peer": true, "dependencies": { "@emotion/memoize": "^0.9.0" } @@ -2939,7 +2947,6 @@ "os": [ "aix" ], - "peer": true, "engines": { "node": ">=12" } @@ -2957,7 +2964,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } @@ -2975,7 +2981,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } @@ -2993,7 +2998,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } @@ -3011,7 +3015,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=12" } @@ -3029,7 +3032,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=12" } @@ -3047,7 +3049,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -3065,7 +3066,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -3083,7 +3083,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3101,7 +3100,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3119,7 +3117,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3137,7 +3134,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3155,7 +3151,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3173,7 +3168,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3191,7 +3185,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3209,7 +3202,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3227,7 +3219,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3261,7 +3252,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -3295,7 +3285,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -3329,7 +3318,6 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=12" } @@ -3347,7 +3335,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } @@ -3365,7 +3352,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } @@ -3383,7 +3369,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } @@ -3613,6 +3598,7 @@ "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -3882,7 +3868,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -3927,6 +3912,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "license": "MIT", + "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -5402,6 +5388,7 @@ "integrity": "sha512-pYUNvaQQBEwP66TLrjmmfkDIrTmPnX0kK86HgClkWLQKkX/oCgnqDxEgNbjeCc75dwUvZP6fW2d0pZ5++XILTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime": "2.5.1", "@module-federation/webpack-bundler-runtime": "2.5.1" @@ -5579,6 +5566,7 @@ "integrity": "sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime": "0.15.0", "@module-federation/webpack-bundler-runtime": "0.15.0" @@ -5678,6 +5666,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -8052,7 +8041,6 @@ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.86.0.tgz", "integrity": "sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==", "license": "MIT", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8062,7 +8050,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.86.0.tgz", "integrity": "sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.29.0", @@ -8084,7 +8071,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.86.0.tgz", "integrity": "sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==", "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.86.0", "debug": "^4.4.0", @@ -8115,7 +8101,6 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.86.0.tgz", "integrity": "sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8125,7 +8110,6 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.86.0.tgz", "integrity": "sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==", "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "debug": "^4.4.0", @@ -8140,7 +8124,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.86.0.tgz", "integrity": "sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==", "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.86.0", @@ -8164,7 +8147,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -8181,7 +8163,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -8203,7 +8184,6 @@ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.86.0.tgz", "integrity": "sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==", "license": "MIT", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8213,7 +8193,6 @@ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", "license": "MIT", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8222,8 +8201,7 @@ "version": "0.86.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.0.tgz", "integrity": "sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-oauth/google": { "version": "0.13.5", @@ -8362,6 +8340,7 @@ "integrity": "sha512-yEDrKcIICHnaJdUOdBAXQTNXoehB0J3FBcZr4CnK6Alic6cVJGGBGMtJdIO7DUwNySwoYvkUTS3qnXuk2zGYZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.8", "@babel/generator": "^7.21.5", @@ -9154,6 +9133,7 @@ "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.17.5.tgz", "integrity": "sha512-SyJ5n2pQyo4ERGvjjLvL2PpRWBzlC2qzO5KkkOE2ygOiNcgOu9WQnnom9GI8KgsTRCO8JnIeLHFRcmxZnVBjfw==", "license": "MIT", + "peer": true, "dependencies": { "@remix-run/router": "1.23.3", "@types/cookie": "^0.6.0", @@ -9776,6 +9756,7 @@ "integrity": "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime-tools": "0.22.0", "@rspack/binding": "1.7.11", @@ -10501,6 +10482,7 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -10683,6 +10665,7 @@ "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.8" @@ -10931,6 +10914,7 @@ "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3" } @@ -11289,6 +11273,7 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -11771,6 +11756,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.42.tgz", "integrity": "sha512-5L7SUaFC1RyDraj2yRhyBzHTobyXHmohD100CChNtyPyleoq37Mqab5Gn8XEKI04dfN/oqPdpHk38MgcQWHbZg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -11793,6 +11779,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.0.tgz", "integrity": "sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -12129,6 +12116,7 @@ "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", @@ -14400,6 +14388,7 @@ "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "license": "MIT", + "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -14461,6 +14450,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -14542,6 +14532,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -14615,8 +14606,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-colors": { "version": "4.1.3", @@ -14901,8 +14891,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/assertion-error": { "version": "2.0.1", @@ -15205,7 +15194,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.36.0.tgz", "integrity": "sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==", "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.36.0" } @@ -15428,6 +15416,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -15460,7 +15449,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "node-int64": "^0.4.0" } @@ -15863,7 +15851,6 @@ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -15892,7 +15879,6 @@ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz", "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", @@ -16296,7 +16282,6 @@ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -16312,7 +16297,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -16322,7 +16306,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -16332,7 +16315,6 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -16350,15 +16332,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/connect/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -16371,7 +16351,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -16707,7 +16686,8 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/culori": { "version": "4.0.2", @@ -17430,7 +17410,8 @@ "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/embla-carousel-react": { "version": "8.6.0", @@ -17486,6 +17467,7 @@ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -17593,7 +17575,6 @@ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "license": "MIT", - "peer": true, "dependencies": { "stackframe": "^1.3.4" } @@ -17805,6 +17786,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -18229,6 +18211,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -18285,6 +18268,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -18410,6 +18394,7 @@ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -19153,14 +19138,14 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/express": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -19335,7 +19320,6 @@ "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", "license": "(MIT OR Apache-2.0)", - "peer": true, "bin": { "dotslash": "bin/dotslash" }, @@ -19348,7 +19332,6 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bser": "2.1.1" } @@ -19463,6 +19446,7 @@ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19656,8 +19640,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.16.0", @@ -20515,22 +20498,19 @@ "version": "250829098.0.14", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.14.tgz", "integrity": "sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.36.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz", "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.36.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz", "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==", "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.36.0" } @@ -20553,6 +20533,7 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.24.tgz", "integrity": "sha512-I36D1s+HgQc55KbhEr4iybfxv/9o1zdpw+XEM6dJa91LqQD0HCoSGdxpRJCZE+aavs87j4V3Ls2OJzq8C/U4iw==", "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -20869,7 +20850,6 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "license": "MIT", - "peer": true, "dependencies": { "queue": "6.0.2" }, @@ -22051,6 +22031,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "license": "MIT", + "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -22080,7 +22061,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -22098,7 +22078,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -22111,7 +22090,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -22125,15 +22103,13 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -22149,7 +22125,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -22218,8 +22193,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/jsdom": { "version": "22.1.0", @@ -22227,6 +22201,7 @@ "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "abab": "^2.0.6", "cssstyle": "^3.0.0", @@ -22585,7 +22560,8 @@ "url": "https://github.com/sponsors/lavrton" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/language-subtag-registry": { "version": "0.3.23", @@ -22643,7 +22619,6 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -22675,7 +22650,6 @@ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -22686,7 +22660,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -22695,14 +22668,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "license": "MPL-2.0", + "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -23381,8 +23354,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -23705,7 +23677,6 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tmpl": "1.0.5" } @@ -23724,8 +23695,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -23991,8 +23961,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/merge-descriptors": { "version": "1.0.3", @@ -24039,7 +24008,6 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.4.tgz", "integrity": "sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/core": "^7.25.2", @@ -24093,7 +24061,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.4.tgz", "integrity": "sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -24109,15 +24076,13 @@ "version": "0.35.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { "version": "0.35.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.35.0" } @@ -24127,7 +24092,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.4.tgz", "integrity": "sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==", "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -24143,7 +24107,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.4.tgz", "integrity": "sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -24156,7 +24119,6 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14" } @@ -24166,7 +24128,6 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -24180,7 +24141,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.4.tgz", "integrity": "sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==", "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -24200,7 +24160,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.4.tgz", "integrity": "sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -24215,7 +24174,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.4.tgz", "integrity": "sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -24236,7 +24194,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.4.tgz", "integrity": "sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -24250,7 +24207,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.4.tgz", "integrity": "sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -24263,7 +24219,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.4.tgz", "integrity": "sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -24277,7 +24232,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.4.tgz", "integrity": "sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==", "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", @@ -24298,7 +24252,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -24308,7 +24261,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.4.tgz", "integrity": "sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -24329,7 +24281,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -24339,7 +24290,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.4.tgz", "integrity": "sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", @@ -24357,7 +24307,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.4.tgz", "integrity": "sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", @@ -24382,7 +24331,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -24395,22 +24343,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/hermes-estree": { "version": "0.35.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/metro/node_modules/hermes-parser": { "version": "0.35.0", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.35.0" } @@ -24420,7 +24365,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -24437,7 +24381,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -24447,7 +24390,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -24457,7 +24399,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -25672,6 +25613,7 @@ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -25716,8 +25658,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-machine-id": { "version": "1.1.12", @@ -25904,8 +25845,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/nwsapi": { "version": "2.2.24", @@ -25920,6 +25860,7 @@ "integrity": "sha512-2wL/2fSmIbRWn6zXaQ/g3kj5DfEaTw/aJkPr6ozJh8BUq5iYKE+tS9oh0PjsVVwN6Pybe80Lu+mn9RgWyeV3xw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -26077,7 +26018,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.4.tgz", "integrity": "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -26837,6 +26777,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -27142,6 +27083,7 @@ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -27229,6 +27171,7 @@ "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -27379,7 +27322,6 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "license": "MIT", - "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -27564,7 +27506,6 @@ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "~2.0.3" } @@ -27714,6 +27655,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -27783,7 +27725,6 @@ "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "license": "MIT", - "peer": true, "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -27794,7 +27735,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -27816,6 +27756,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -28208,7 +28149,6 @@ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.6.1.tgz", "integrity": "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", @@ -28257,7 +28197,6 @@ "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", "license": "MIT", - "peer": true, "dependencies": { "@types/react-reconciler": "^0.28.9" }, @@ -28280,7 +28219,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -28307,7 +28245,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -28318,7 +28255,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -28328,7 +28264,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -28342,8 +28277,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react-spring/node_modules/react-konva": { "version": "19.2.5", @@ -28364,7 +28298,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@types/react-reconciler": "^0.33.0", "its-fine": "^2.0.0", @@ -28382,7 +28315,6 @@ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.33.0.tgz", "integrity": "sha512-HZOXsKT0tGI9LlUw2LuedXsVeB88wFa536vVL0M6vE8zN63nI+sSr1ByxmPToP5K5bukaVscyeCJcF9guVNJ1g==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*" } @@ -28392,7 +28324,6 @@ "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", "license": "MIT", - "peer": true, "dependencies": { "@types/react-reconciler": "^0.28.9" }, @@ -28405,7 +28336,6 @@ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "*" } @@ -28415,7 +28345,6 @@ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -28491,7 +28420,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.86.0.tgz", "integrity": "sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==", "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -28514,15 +28442,13 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react-spring/node_modules/ws": { "version": "7.5.11", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28583,7 +28509,6 @@ "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", "license": "MIT", - "peer": true, "peerDependencies": { "react": ">=16.13", "react-dom": ">=16.13" @@ -28777,8 +28702,7 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", @@ -28967,8 +28891,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", @@ -29502,7 +29425,6 @@ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -30166,7 +30088,6 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -30510,15 +30431,13 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -31049,7 +30968,6 @@ "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", "license": "MIT", - "peer": true, "peerDependencies": { "react": ">=17.0" } @@ -31351,6 +31269,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -31569,14 +31488,14 @@ "version": "0.171.0", "resolved": "https://registry.npmjs.org/three/-/three-0.171.0.tgz", "integrity": "sha512-Y/lAXPaKZPcEdkKjh0JOAHVv8OOnv/NDJqm0wjfCzyQmfKxV7zvkwsnBgPBKTzJHToSOhRGQAGbPJObT59B/PQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/through2": { "version": "2.0.5", @@ -31720,8 +31639,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -32026,7 +31944,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -32128,6 +32045,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -32827,6 +32745,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -33723,6 +33642,7 @@ "integrity": "sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.6", @@ -33801,8 +33721,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/vscode-uri": { "version": "3.1.0", @@ -33829,7 +33748,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "makeerror": "1.0.12" } @@ -33917,6 +33835,7 @@ "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", @@ -34017,8 +33936,7 @@ "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "3.0.0", @@ -34303,6 +34221,7 @@ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -34525,6 +34444,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" }