From a90a27e45d1ac53cfedcc46024c36be8313c158b Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 4 May 2026 02:18:33 -0400 Subject: [PATCH] debug logs (#1472) --- ...40bb01d23fcea3f844cceea7446a5c0cb4dc.json} | 17 +- ...aa22cc760addd850d618ce543fe05816d11e0.json | 12 + ...4221b5f288a4ae38e788e19bbd359db0b580f.json | 12 + ...d5af889790c3b2a8de27eb8ab64383c638d6.json} | 6 +- .../down.sql | 5 + .../2026-05-04-022013-0000_debug_logs/up.sql | 31 +++ .../down.sql | 6 + .../up.sql | 6 + .../sql/migrations_squashed/debug_logs.sql | 31 +++ .../generic_inference_jobs.sql | 4 + .../debug_logs/bulk_insert_debug_logs.rs | 83 ++++++ .../queries/debug_logs/insert_debug_log.rs | 62 +++++ .../src/queries/debug_logs/mod.rs | 2 + .../fal/get_inference_job_by_fal_id.rs | 5 + ...ert_generic_inference_job_for_fal_queue.rs | 1 + ...nference_job_for_fal_queue_mock_failure.rs | 1 + ...ob_for_fal_queue_with_apriori_job_token.rs | 7 + .../job/mark_job_failed_by_token.rs | 51 +++- ...edance2pro_queue_with_apriori_job_token.rs | 7 + .../database/mysql_queries/src/queries/mod.rs | 1 + .../src/by_table/debug_logs/debug_log_type.rs | 160 +++++++++++ .../enums/src/by_table/debug_logs/mod.rs | 1 + .../schema/public/enums/src/by_table/mod.rs | 1 + crates/schema/public/tokens/src/prefixes.rs | 2 + crates/schema/public/tokens/src/tokens/mod.rs | 3 + .../non_unique/debug_logs_event_token.rs | 14 + .../tokens/src/tokens/non_unique/mod.rs | 1 + .../flux_2_lora_edit_image_angle_handler.rs | 1 + ...qwen_edit_2511_edit_image_angle_handler.rs | 1 + .../gemini_25_flash_edit_image_handler.rs | 1 + .../edit/gpt_image_1_edit_image_handler.rs | 1 + .../image/edit/qwen_edit_image_handler.rs | 1 + ...5_lite_multi_function_image_gen_handler.rs | 1 + ...eam_v4_multi_function_image_gen_handler.rs | 1 + ...m_v4p5_multi_function_image_gen_handler.rs | 1 + ...ge_1p5_multi_function_image_gen_handler.rs | 1 + ...nana_2_multi_function_image_gen_handler.rs | 1 + ...banana_multi_function_image_gen_handler.rs | 1 + ...na_pro_multi_function_image_gen_handler.rs | 1 + ...erate_flux_pro_11_text_to_image_handler.rs | 1 + ...flux_pro_11_ultra_text_to_image_handler.rs | 1 + ...erate_gpt_image_1_text_to_image_handler.rs | 1 + .../generate_kling_1_6_pro_video_handler.rs | 1 + ...generate_kling_2_1_master_video_handler.rs | 1 + .../generate_kling_2_1_pro_video_handler.rs | 1 + ...eedance_1_0_lite_image_to_video_handler.rs | 1 + ...seedance_1_0_pro_image_to_video_handler.rs | 1 + .../generate_veo_2_image_to_video_handler.rs | 1 + ...erate_veo_3_fast_image_to_video_handler.rs | 1 + .../generate_veo_3_image_to_video_handler.rs | 1 + ...bo_pro_multi_function_video_gen_handler.rs | 1 + ...p6_pro_multi_function_video_gen_handler.rs | 1 + ...p0_pro_multi_function_video_gen_handler.rs | 1 + ...andard_multi_function_video_gen_handler.rs | 1 + ...p5_pro_multi_function_video_gen_handler.rs | 1 + ...ce_2p0_multi_function_video_gen_handler.rs | 1 + ...sora_2_multi_function_video_gen_handler.rs | 1 + ..._2_pro_multi_function_video_gen_handler.rs | 1 + ...1_fast_multi_function_video_gen_handler.rs | 1 + ...eo_3p1_multi_function_video_gen_handler.rs | 1 + .../image/omni_gen_image_generate_handler.rs | 19 ++ .../video/insert_db_job/insert_fal_job.rs | 1 + .../insert_db_job/insert_seedance2pro_jobs.rs | 1 + .../video/insert_db_job/shared_job_args.rs | 2 + .../video/omni_gen_video_generate_handler.rs | 20 ++ .../endpoints/webhooks/fal_webhook_handler.rs | 7 +- .../handle_failed_fal_webhook.rs | 30 ++- .../handle_successful_fal_webhook.rs | 28 +- frontend/package-lock.json | 253 ++++++------------ 69 files changed, 738 insertions(+), 188 deletions(-) rename .sqlx/{query-fbe482c8987231c3b5d75f2e792d0fdd033de8a7eb821428fa034752c73edfb7.json => query-2c98621c08055374fd09502c94ac40bb01d23fcea3f844cceea7446a5c0cb4dc.json} (84%) create mode 100644 .sqlx/query-8f8b64c0af5383ff3baaa8aa2f2aa22cc760addd850d618ce543fe05816d11e0.json create mode 100644 .sqlx/query-a9745ecf60b564ab096ee1dbe124221b5f288a4ae38e788e19bbd359db0b580f.json rename .sqlx/{query-29916e73a1784ea0b70ef4f637520b05efccc31e01840f681e9b042f82eb8f7e.json => query-c73be10c5677f78f81bc1c29872fd5af889790c3b2a8de27eb8ab64383c638d6.json} (80%) create mode 100644 _database/sql/migrations/2026-05-04-022013-0000_debug_logs/down.sql create mode 100644 _database/sql/migrations/2026-05-04-022013-0000_debug_logs/up.sql create mode 100644 _database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/down.sql create mode 100644 _database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/up.sql create mode 100644 _database/sql/migrations_squashed/debug_logs.sql create mode 100644 crates/schema/database/mysql_queries/src/queries/debug_logs/bulk_insert_debug_logs.rs create mode 100644 crates/schema/database/mysql_queries/src/queries/debug_logs/insert_debug_log.rs create mode 100644 crates/schema/database/mysql_queries/src/queries/debug_logs/mod.rs create mode 100644 crates/schema/public/enums/src/by_table/debug_logs/debug_log_type.rs create mode 100644 crates/schema/public/enums/src/by_table/debug_logs/mod.rs create mode 100644 crates/schema/public/tokens/src/tokens/non_unique/debug_logs_event_token.rs create mode 100644 crates/schema/public/tokens/src/tokens/non_unique/mod.rs diff --git a/.sqlx/query-fbe482c8987231c3b5d75f2e792d0fdd033de8a7eb821428fa034752c73edfb7.json b/.sqlx/query-2c98621c08055374fd09502c94ac40bb01d23fcea3f844cceea7446a5c0cb4dc.json similarity index 84% rename from .sqlx/query-fbe482c8987231c3b5d75f2e792d0fdd033de8a7eb821428fa034752c73edfb7.json rename to .sqlx/query-2c98621c08055374fd09502c94ac40bb01d23fcea3f844cceea7446a5c0cb4dc.json index 92581b4621..a1be0cf79a 100644 --- a/.sqlx/query-fbe482c8987231c3b5d75f2e792d0fdd033de8a7eb821428fa034752c73edfb7.json +++ b/.sqlx/query-2c98621c08055374fd09502c94ac40bb01d23fcea3f844cceea7446a5c0cb4dc.json @@ -1,6 +1,6 @@ { "db_name": "MySQL", - "query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n\n jobs.status as `status: enums::common::job_status_plus::JobStatusPlus`,\n \n jobs.maybe_external_third_party as `external_third_party: enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty`,\n jobs.maybe_external_third_party_id as `external_third_party_id`,\n\n jobs.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n jobs.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n jobs.creator_ip_address,\n \n jobs.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n\n jobs.created_at,\n jobs.updated_at\n\nFROM generic_inference_jobs as jobs\n\nWHERE jobs.maybe_external_third_party = ?\nAND jobs.maybe_external_third_party_id = ?\n ", + "query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n\n jobs.status as `status: enums::common::job_status_plus::JobStatusPlus`,\n \n jobs.maybe_external_third_party as `external_third_party: enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty`,\n jobs.maybe_external_third_party_id as `external_third_party_id`,\n\n jobs.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n jobs.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n jobs.creator_ip_address,\n \n jobs.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n jobs.maybe_debug_log_event_token as `maybe_debug_log_event_token: tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken`,\n\n jobs.created_at,\n jobs.updated_at\n\nFROM generic_inference_jobs as jobs\n\nWHERE jobs.maybe_external_third_party = ?\nAND jobs.maybe_external_third_party_id = ?\n ", "describe": { "columns": [ { @@ -85,6 +85,16 @@ }, { "ordinal": 8, + "name": "maybe_debug_log_event_token: tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken", + "type_info": { + "type": "VarString", + "flags": "BINARY", + "char_set": 224, + "max_size": 128 + } + }, + { + "ordinal": 9, "name": "created_at", "type_info": { "type": "Timestamp", @@ -94,7 +104,7 @@ } }, { - "ordinal": 9, + "ordinal": 10, "name": "updated_at", "type_info": { "type": "Timestamp", @@ -116,9 +126,10 @@ true, false, true, + true, false, false ] }, - "hash": "fbe482c8987231c3b5d75f2e792d0fdd033de8a7eb821428fa034752c73edfb7" + "hash": "2c98621c08055374fd09502c94ac40bb01d23fcea3f844cceea7446a5c0cb4dc" } diff --git a/.sqlx/query-8f8b64c0af5383ff3baaa8aa2f2aa22cc760addd850d618ce543fe05816d11e0.json b/.sqlx/query-8f8b64c0af5383ff3baaa8aa2f2aa22cc760addd850d618ce543fe05816d11e0.json new file mode 100644 index 0000000000..70fd909c66 --- /dev/null +++ b/.sqlx/query-8f8b64c0af5383ff3baaa8aa2f2aa22cc760addd850d618ce543fe05816d11e0.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_wallet_ledger_entry_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n maybe_debug_log_event_token = ?,\n\n status = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 16 + }, + "nullable": [] + }, + "hash": "8f8b64c0af5383ff3baaa8aa2f2aa22cc760addd850d618ce543fe05816d11e0" +} diff --git a/.sqlx/query-a9745ecf60b564ab096ee1dbe124221b5f288a4ae38e788e19bbd359db0b580f.json b/.sqlx/query-a9745ecf60b564ab096ee1dbe124221b5f288a4ae38e788e19bbd359db0b580f.json new file mode 100644 index 0000000000..42dc602414 --- /dev/null +++ b/.sqlx/query-a9745ecf60b564ab096ee1dbe124221b5f288a4ae38e788e19bbd359db0b580f.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "\nINSERT INTO debug_logs\nSET\n event_token = ?,\n debug_log_type = ?,\n maybe_creator_user_token = ?,\n message = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 4 + }, + "nullable": [] + }, + "hash": "a9745ecf60b564ab096ee1dbe124221b5f288a4ae38e788e19bbd359db0b580f" +} diff --git a/.sqlx/query-29916e73a1784ea0b70ef4f637520b05efccc31e01840f681e9b042f82eb8f7e.json b/.sqlx/query-c73be10c5677f78f81bc1c29872fd5af889790c3b2a8de27eb8ab64383c638d6.json similarity index 80% rename from .sqlx/query-29916e73a1784ea0b70ef4f637520b05efccc31e01840f681e9b042f82eb8f7e.json rename to .sqlx/query-c73be10c5677f78f81bc1c29872fd5af889790c3b2a8de27eb8ab64383c638d6.json index 65066114bc..084e2bb757 100644 --- a/.sqlx/query-29916e73a1784ea0b70ef4f637520b05efccc31e01840f681e9b042f82eb8f7e.json +++ b/.sqlx/query-c73be10c5677f78f81bc1c29872fd5af889790c3b2a8de27eb8ab64383c638d6.json @@ -1,12 +1,12 @@ { "db_name": "MySQL", - "query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n frontend_failure_category = ?,\n failure_reason = ?,\n\n status = ?\n ", + "query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n maybe_debug_log_event_token = ?,\n\n frontend_failure_category = ?,\n failure_reason = ?,\n\n status = ?\n ", "describe": { "columns": [], "parameters": { - "Right": 16 + "Right": 17 }, "nullable": [] }, - "hash": "29916e73a1784ea0b70ef4f637520b05efccc31e01840f681e9b042f82eb8f7e" + "hash": "c73be10c5677f78f81bc1c29872fd5af889790c3b2a8de27eb8ab64383c638d6" } diff --git a/_database/sql/migrations/2026-05-04-022013-0000_debug_logs/down.sql b/_database/sql/migrations/2026-05-04-022013-0000_debug_logs/down.sql new file mode 100644 index 0000000000..df5cee4df7 --- /dev/null +++ b/_database/sql/migrations/2026-05-04-022013-0000_debug_logs/down.sql @@ -0,0 +1,5 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +DROP TABLE IF EXISTS debug_logs; diff --git a/_database/sql/migrations/2026-05-04-022013-0000_debug_logs/up.sql b/_database/sql/migrations/2026-05-04-022013-0000_debug_logs/up.sql new file mode 100644 index 0000000000..6c681d2fc3 --- /dev/null +++ b/_database/sql/migrations/2026-05-04-022013-0000_debug_logs/up.sql @@ -0,0 +1,31 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +CREATE TABLE debug_logs ( + + -- Not used for anything except replication. + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + + -- Event token. Not unique — multiple log rows can share the same event. + event_token VARCHAR(32) NOT NULL, + + -- The type of debug log entry. + debug_log_type VARCHAR(24) NOT NULL, + + -- The user who created the log entry (if any). + maybe_creator_user_token VARCHAR(32) DEFAULT NULL, + + -- The log message body. + message MEDIUMTEXT NOT NULL, + + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + + -- INDICES -- + PRIMARY KEY (id), + KEY index_event_token (event_token), + KEY index_debug_log_type (debug_log_type), + KEY index_maybe_creator_user_token (maybe_creator_user_token), + KEY index_created_at (created_at) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/_database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/down.sql b/_database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/down.sql new file mode 100644 index 0000000000..967ff31519 --- /dev/null +++ b/_database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/down.sql @@ -0,0 +1,6 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +ALTER TABLE generic_inference_jobs + DROP COLUMN maybe_debug_log_event_token; diff --git a/_database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/up.sql b/_database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/up.sql new file mode 100644 index 0000000000..6dfd1b0667 --- /dev/null +++ b/_database/sql/migrations/2026-05-04-032408-0000_alter_generic_inference_jobs_add_debug_log_event_token/up.sql @@ -0,0 +1,6 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +ALTER TABLE generic_inference_jobs + ADD COLUMN maybe_debug_log_event_token VARCHAR(32) DEFAULT NULL; diff --git a/_database/sql/migrations_squashed/debug_logs.sql b/_database/sql/migrations_squashed/debug_logs.sql new file mode 100644 index 0000000000..6c681d2fc3 --- /dev/null +++ b/_database/sql/migrations_squashed/debug_logs.sql @@ -0,0 +1,31 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +-- noinspection SqlResolveForFile + +CREATE TABLE debug_logs ( + + -- Not used for anything except replication. + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + + -- Event token. Not unique — multiple log rows can share the same event. + event_token VARCHAR(32) NOT NULL, + + -- The type of debug log entry. + debug_log_type VARCHAR(24) NOT NULL, + + -- The user who created the log entry (if any). + maybe_creator_user_token VARCHAR(32) DEFAULT NULL, + + -- The log message body. + message MEDIUMTEXT NOT NULL, + + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + + -- INDICES -- + PRIMARY KEY (id), + KEY index_event_token (event_token), + KEY index_debug_log_type (debug_log_type), + KEY index_maybe_creator_user_token (maybe_creator_user_token), + KEY index_created_at (created_at) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/_database/sql/migrations_squashed/generic_inference_jobs.sql b/_database/sql/migrations_squashed/generic_inference_jobs.sql index a8ce198d7e..0f33243d0c 100644 --- a/_database/sql/migrations_squashed/generic_inference_jobs.sql +++ b/_database/sql/migrations_squashed/generic_inference_jobs.sql @@ -204,6 +204,10 @@ CREATE TABLE generic_inference_jobs ( -- off special workers to handle certain jobs. maybe_routing_tag VARCHAR(64) DEFAULT NULL, + -- Foreign key to the debug_logs table (event_token column). + -- Multiple debug_logs rows can share the same event token. + maybe_debug_log_event_token VARCHAR(32) DEFAULT NULL, + -- ========== JOB SYSTEM DETAILS ========== -- Jobs begin as "pending", then transition to other states. diff --git a/crates/schema/database/mysql_queries/src/queries/debug_logs/bulk_insert_debug_logs.rs b/crates/schema/database/mysql_queries/src/queries/debug_logs/bulk_insert_debug_logs.rs new file mode 100644 index 0000000000..b0ea96c899 --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/debug_logs/bulk_insert_debug_logs.rs @@ -0,0 +1,83 @@ +use std::marker::PhantomData; + +use log::warn; +use sqlx::{Executor, MySql, QueryBuilder}; + +use enums::by_table::debug_logs::debug_log_type::DebugLogType; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; +use tokens::tokens::users::UserToken; + +pub struct BulkInsertDebugLogsArgs<'e, 'c, E> +where + E: 'e + Executor<'c, Database = MySql>, +{ + /// If provided, all rows will share this event token. + /// If not provided, one will be generated. + pub apriori_debug_log_event_token: Option<&'e DebugLogEventToken>, + + /// The user associated with these debug log events (if any). + pub maybe_creator_user_token: Option<&'e UserToken>, + + /// The events to insert. + pub events: Vec, + + pub mysql_executor: E, + pub phantom: PhantomData<&'c E>, +} + +/// A single debug log event to insert. +/// +/// The `message` field should be a pre-serialized JSON string (or any text). +/// Callers should use `serde_json::to_string(...)` before constructing this. +pub struct DebugLogEvent { + pub debug_log_type: DebugLogType, + pub message: String, +} + +/// Bulk-insert debug log rows. All rows share the same event token. +/// +/// Returns the event token used. No-op (with a warning) if `events` is empty. +pub async fn bulk_insert_debug_logs<'e, 'c: 'e, E>( + args: BulkInsertDebugLogsArgs<'e, 'c, E>, +) -> Result +where + E: 'e + Executor<'c, Database = MySql>, +{ + let event_token = match args.apriori_debug_log_event_token { + Some(token) => token.clone(), + None => DebugLogEventToken::generate(), + }; + + if args.events.is_empty() { + warn!("bulk_insert_debug_logs called with no events; no-op."); + return Ok(event_token); + } + + let maybe_user_token_str = args.maybe_creator_user_token.map(|t| t.as_str().to_string()); + + let mut query_builder = QueryBuilder::new( + "INSERT INTO debug_logs (event_token, debug_log_type, maybe_creator_user_token, message) VALUES " + ); + + for (i, event) in args.events.iter().enumerate() { + query_builder.push("("); + query_builder.push_bind(event_token.as_str()); + query_builder.push(", "); + query_builder.push_bind(event.debug_log_type.to_str()); + query_builder.push(", "); + query_builder.push_bind(&maybe_user_token_str); + query_builder.push(", "); + query_builder.push_bind(&event.message); + query_builder.push(")"); + + if i < args.events.len() - 1 { + query_builder.push(", "); + } + } + + query_builder.build() + .execute(args.mysql_executor) + .await?; + + Ok(event_token) +} diff --git a/crates/schema/database/mysql_queries/src/queries/debug_logs/insert_debug_log.rs b/crates/schema/database/mysql_queries/src/queries/debug_logs/insert_debug_log.rs new file mode 100644 index 0000000000..82dc58cbe5 --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/debug_logs/insert_debug_log.rs @@ -0,0 +1,62 @@ +use std::marker::PhantomData; + +use sqlx::{Executor, MySql}; + +use enums::by_table::debug_logs::debug_log_type::DebugLogType; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; +use tokens::tokens::users::UserToken; + +pub struct InsertDebugLogArgs<'e, 'c, E> +where + E: 'e + Executor<'c, Database = MySql>, +{ + /// If provided, the row will use this event token. + /// If not provided, one will be generated. + pub apriori_debug_log_event_token: Option<&'e DebugLogEventToken>, + + /// The user associated with this debug log event (if any). + pub maybe_creator_user_token: Option<&'e UserToken>, + + /// The type of debug log event. + pub debug_log_type: DebugLogType, + + /// The log message body (pre-serialized JSON or any text). + pub message: &'e str, + + pub mysql_executor: E, + pub phantom: PhantomData<&'c E>, +} + +/// Insert a single debug log row. +/// +/// Returns the event token used. +pub async fn insert_debug_log<'e, 'c: 'e, E>( + args: InsertDebugLogArgs<'e, 'c, E>, +) -> Result +where + E: 'e + Executor<'c, Database = MySql>, +{ + let event_token = match args.apriori_debug_log_event_token { + Some(token) => token.clone(), + None => DebugLogEventToken::generate(), + }; + + sqlx::query!( + r#" +INSERT INTO debug_logs +SET + event_token = ?, + debug_log_type = ?, + maybe_creator_user_token = ?, + message = ? + "#, + event_token.as_str(), + args.debug_log_type.to_str(), + args.maybe_creator_user_token.map(|t| t.as_str()), + args.message, + ) + .execute(args.mysql_executor) + .await?; + + Ok(event_token) +} diff --git a/crates/schema/database/mysql_queries/src/queries/debug_logs/mod.rs b/crates/schema/database/mysql_queries/src/queries/debug_logs/mod.rs new file mode 100644 index 0000000000..946a135b54 --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/debug_logs/mod.rs @@ -0,0 +1,2 @@ +pub mod bulk_insert_debug_logs; +pub mod insert_debug_log; diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/get_inference_job_by_fal_id.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/get_inference_job_by_fal_id.rs index c758082dee..513940fc6d 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/get_inference_job_by_fal_id.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/get_inference_job_by_fal_id.rs @@ -9,6 +9,7 @@ use enums::common::job_status_plus::JobStatusPlus; use errors::AnyhowResult; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; use tokens::tokens::prompts::PromptToken; use tokens::tokens::users::UserToken; @@ -29,6 +30,7 @@ pub struct FalJobDetails { pub creator_ip_address: String, pub maybe_prompt_token: Option, + pub maybe_debug_log_event_token: Option, pub created_at: DateTime, pub updated_at: DateTime, @@ -51,6 +53,7 @@ struct RawJobRecord { creator_ip_address: String, maybe_prompt_token: Option, + maybe_debug_log_event_token: Option, created_at: DateTime, updated_at: DateTime, @@ -88,6 +91,7 @@ SELECT jobs.creator_ip_address, jobs.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`, + jobs.maybe_debug_log_event_token as `maybe_debug_log_event_token: tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken`, jobs.created_at, jobs.updated_at @@ -129,6 +133,7 @@ fn raw_record_to_public_result(record: RawJobRecord) -> AnyhowResult(args: In starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, mysql_executor: args.mysql_executor, phantom: args.phantom, }; diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs index c199e3ab3e..7a3e70b64f 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs @@ -68,6 +68,7 @@ pub async fn insert_generic_inference_job_for_fal_queue_mock_failure<'e, 'c: 'e, starting_job_status_override: Some(JobStatusPlus::CompleteFailure), maybe_frontend_failure_category: args.maybe_frontend_failure_category, maybe_failure_reason: args.maybe_failure_reason, + maybe_debug_log_event_token: None, mysql_executor: args.mysql_executor, phantom: args.phantom, }; diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs index 3c130fa5ab..1198c2fad4 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_with_apriori_job_token.rs @@ -13,6 +13,7 @@ use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; use tokens::tokens::prompts::PromptToken; use tokens::tokens::users::UserToken; @@ -47,6 +48,8 @@ pub struct InsertGenericInferenceForFalWithAprioriJobTokenArgs<'e, 'c, E> /// Set to `Some(JobStatusPlus::CompleteFailure)` for mock/test failure jobs. pub starting_job_status_override: Option, + pub maybe_debug_log_event_token: Option<&'e DebugLogEventToken>, + pub maybe_frontend_failure_category: Option, pub maybe_failure_reason: Option<&'e str>, @@ -139,6 +142,8 @@ SET is_debug_request = FALSE, maybe_routing_tag = NULL, + maybe_debug_log_event_token = ?, + frontend_failure_category = ?, failure_reason = ?, @@ -164,6 +169,8 @@ SET args.creator_ip_address, args.creator_set_visibility.to_str(), + args.maybe_debug_log_event_token.map(|t| t.as_str()), + maybe_frontend_failure_category_str, maybe_truncated_failure_reason, diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/job/mark_job_failed_by_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/job/mark_job_failed_by_token.rs index 0e17d212e9..13b72b75d7 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/job/mark_job_failed_by_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/job/mark_job_failed_by_token.rs @@ -1,5 +1,6 @@ use anyhow::anyhow; -use sqlx::MySqlPool; +use sqlx::pool::PoolConnection; +use sqlx::{MySql, MySqlPool}; use enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory; use enums::common::job_status_plus::JobStatusPlus; @@ -14,10 +15,52 @@ pub struct MarkJobFailedByTokenArgs<'a> { pub maybe_frontend_failure_category: Option, } +pub struct MarkJobFailedByTokenFromConnectionArgs<'a> { + pub mysql_connection: &'a mut PoolConnection, + pub job_token: &'a InferenceJobToken, + pub maybe_public_failure_reason: Option<&'a str>, + pub internal_debugging_failure_reason: &'a str, + pub maybe_frontend_failure_category: Option, +} + /// Permanently mark an inference job as failed, looked up by its token. -/// Unlike `mark_generic_inference_job_failure`, this does not allow retries — -/// the job will always land in `complete_failure`. +/// Uses a pool to acquire a connection. pub async fn mark_job_failed_by_token(args: MarkJobFailedByTokenArgs<'_>) -> AnyhowResult<()> { + execute_mark_failed(ExecuteMarkJobFailedByTokenArgs { + executor: args.pool, + job_token: args.job_token, + maybe_public_failure_reason: args.maybe_public_failure_reason, + internal_debugging_failure_reason: args.internal_debugging_failure_reason, + maybe_frontend_failure_category: args.maybe_frontend_failure_category, + }).await +} + +/// Permanently mark an inference job as failed, looked up by its token. +/// Uses an existing connection. +pub async fn mark_job_failed_by_token_from_connection(args: MarkJobFailedByTokenFromConnectionArgs<'_>) -> AnyhowResult<()> { + execute_mark_failed(ExecuteMarkJobFailedByTokenArgs { + executor: &mut **args.mysql_connection, + job_token: args.job_token, + maybe_public_failure_reason: args.maybe_public_failure_reason, + internal_debugging_failure_reason: args.internal_debugging_failure_reason, + maybe_frontend_failure_category: args.maybe_frontend_failure_category, + }).await +} + +struct ExecuteMarkJobFailedByTokenArgs<'a, E> { + executor: E, + job_token: &'a InferenceJobToken, + maybe_public_failure_reason: Option<&'a str>, + internal_debugging_failure_reason: &'a str, + maybe_frontend_failure_category: Option, +} + +async fn execute_mark_failed<'e, E>( + args: ExecuteMarkJobFailedByTokenArgs<'_, E>, +) -> AnyhowResult<()> +where + E: sqlx::Executor<'e, Database = MySql>, +{ let maybe_public_failure_reason = args.maybe_public_failure_reason.map(|reason| { let mut reason = reason.trim().to_string(); reason.truncate(512); @@ -46,7 +89,7 @@ WHERE token = ? args.maybe_frontend_failure_category, args.job_token.as_str() ) - .execute(args.pool) + .execute(args.executor) .await; match query_result { diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs index fd7ae6bd20..1ee245d565 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/seedance2pro/insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token.rs @@ -11,6 +11,7 @@ use enums::common::job_status_plus::JobStatusPlus; use enums::common::visibility::Visibility; use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; use tokens::tokens::prompts::PromptToken; use tokens::tokens::users::UserToken; use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken; @@ -40,6 +41,8 @@ pub struct InsertGenericInferenceForSeedance2ProWithAprioriJobTokenArgs<'e, 'c, pub creator_ip_address: &'e str, pub creator_set_visibility: Visibility, + pub maybe_debug_log_event_token: Option<&'e DebugLogEventToken>, + pub mysql_executor: E, pub phantom: PhantomData<&'c E>, @@ -103,6 +106,8 @@ SET is_debug_request = FALSE, maybe_routing_tag = NULL, + maybe_debug_log_event_token = ?, + status = ? "#, args.apriori_job_token.as_str(), @@ -127,6 +132,8 @@ SET args.creator_ip_address, args.creator_set_visibility.to_str(), + args.maybe_debug_log_event_token.map(|t| t.as_str()), + STATUS.to_str(), ); diff --git a/crates/schema/database/mysql_queries/src/queries/mod.rs b/crates/schema/database/mysql_queries/src/queries/mod.rs index 314cf56020..b48a436b44 100644 --- a/crates/schema/database/mysql_queries/src/queries/mod.rs +++ b/crates/schema/database/mysql_queries/src/queries/mod.rs @@ -8,6 +8,7 @@ pub mod billing; pub mod browser_session_logs; pub mod characters; pub mod comments; +pub mod debug_logs; pub mod database_time; pub mod email_sender_jobs; pub mod entity_stats; diff --git a/crates/schema/public/enums/src/by_table/debug_logs/debug_log_type.rs b/crates/schema/public/enums/src/by_table/debug_logs/debug_log_type.rs new file mode 100644 index 0000000000..ff488b446f --- /dev/null +++ b/crates/schema/public/enums/src/by_table/debug_logs/debug_log_type.rs @@ -0,0 +1,160 @@ +use std::collections::BTreeSet; + +#[cfg(test)] +use strum::EnumCount; +#[cfg(test)] +use strum::EnumIter; +use utoipa::ToSchema; + +use crate::error::enum_error::EnumError; + +/// Maximum serialized string length for database storage. +pub const MAX_LENGTH: usize = 24; + +/// Used in the `debug_logs` table in a `VARCHAR(24)` field. +/// +/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY. +#[cfg_attr(test, derive(EnumIter, EnumCount))] +#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum DebugLogType { + HttpRequest, + FalRequest, + KinoviRequest, + FalWebhook, +} + +impl_enum_display_and_debug_using_to_str!(DebugLogType); +impl_mysql_enum_coders!(DebugLogType); +impl_mysql_from_row!(DebugLogType); + +impl DebugLogType { + pub fn to_str(&self) -> &'static str { + match self { + Self::HttpRequest => "http_request", + Self::FalRequest => "fal_request", + Self::KinoviRequest => "kinovi_request", + Self::FalWebhook => "fal_webhook", + } + } + + pub fn from_str(value: &str) -> Result { + match value { + "http_request" => Ok(Self::HttpRequest), + "fal_request" => Ok(Self::FalRequest), + "kinovi_request" => Ok(Self::KinoviRequest), + "fal_webhook" => Ok(Self::FalWebhook), + _ => Err(EnumError::CouldNotConvertFromString(value.to_string())), + } + } + + pub fn all_variants() -> BTreeSet { + BTreeSet::from([ + Self::HttpRequest, + Self::FalRequest, + Self::KinoviRequest, + Self::FalWebhook, + ]) + } +} + +#[cfg(test)] +mod tests { + use crate::by_table::debug_logs::debug_log_type::DebugLogType; + use crate::by_table::debug_logs::debug_log_type::MAX_LENGTH; + use crate::test_helpers::assert_serialization; + + mod explicit_checks { + use super::*; + use crate::error::enum_error::EnumError; + + #[test] + fn test_serialization() { + assert_serialization(DebugLogType::HttpRequest, "http_request"); + assert_serialization(DebugLogType::FalRequest, "fal_request"); + assert_serialization(DebugLogType::KinoviRequest, "kinovi_request"); + assert_serialization(DebugLogType::FalWebhook, "fal_webhook"); + } + + #[test] + fn to_str() { + assert_eq!(DebugLogType::HttpRequest.to_str(), "http_request"); + assert_eq!(DebugLogType::FalRequest.to_str(), "fal_request"); + assert_eq!(DebugLogType::KinoviRequest.to_str(), "kinovi_request"); + assert_eq!(DebugLogType::FalWebhook.to_str(), "fal_webhook"); + } + + #[test] + fn from_str() { + assert_eq!(DebugLogType::from_str("http_request").unwrap(), DebugLogType::HttpRequest); + assert_eq!(DebugLogType::from_str("fal_request").unwrap(), DebugLogType::FalRequest); + assert_eq!(DebugLogType::from_str("kinovi_request").unwrap(), DebugLogType::KinoviRequest); + assert_eq!(DebugLogType::from_str("fal_webhook").unwrap(), DebugLogType::FalWebhook); + } + + #[test] + fn from_str_err() { + let result = DebugLogType::from_str("invalid"); + assert!(result.is_err()); + if let Err(EnumError::CouldNotConvertFromString(value)) = result { + assert_eq!(value, "invalid"); + } else { + panic!("Expected EnumError::CouldNotConvertFromString"); + } + } + + #[test] + fn all_variants() { + let mut variants = DebugLogType::all_variants(); + assert_eq!(variants.len(), 4); + assert_eq!(variants.pop_first(), Some(DebugLogType::HttpRequest)); + assert_eq!(variants.pop_first(), Some(DebugLogType::FalRequest)); + assert_eq!(variants.pop_first(), Some(DebugLogType::KinoviRequest)); + assert_eq!(variants.pop_first(), Some(DebugLogType::FalWebhook)); + assert_eq!(variants.pop_first(), None); + } + } + + mod mechanical_checks { + use super::*; + + #[test] + fn variant_length() { + use strum::IntoEnumIterator; + assert_eq!(DebugLogType::all_variants().len(), DebugLogType::iter().len()); + } + + #[test] + fn round_trip() { + for variant in DebugLogType::all_variants() { + assert_eq!(variant, DebugLogType::from_str(variant.to_str()).unwrap()); + assert_eq!(variant, DebugLogType::from_str(&format!("{}", variant)).unwrap()); + assert_eq!(variant, DebugLogType::from_str(&format!("{:?}", variant)).unwrap()); + } + } + + #[test] + fn serialized_length_ok_for_database() { + for variant in DebugLogType::all_variants() { + let serialized = variant.to_str(); + assert!(serialized.len() > 0, "variant {:?} is too short", variant); + assert!(serialized.len() <= MAX_LENGTH, "variant {:?} is too long via to_str()", variant); + } + for variant in DebugLogType::all_variants() { + let json = serde_json::to_string(&variant).unwrap().replace('"', ""); + assert!(json.len() <= MAX_LENGTH, "variant {:?} is too long via JSON: {:?}", variant, json); + } + } + + #[test] + fn serialized_names_must_only_contain_lowercase_alphanumeric_and_underscore() { + let valid_pattern = regex::Regex::new(r"^[a-z0-9_]+$").unwrap(); + + for variant in DebugLogType::all_variants() { + let to_str_value = variant.to_str(); + assert!(valid_pattern.is_match(to_str_value), + "to_str() for {:?} contains invalid characters: {:?} (only a-z, 0-9, _ allowed)", variant, to_str_value); + } + } + } +} diff --git a/crates/schema/public/enums/src/by_table/debug_logs/mod.rs b/crates/schema/public/enums/src/by_table/debug_logs/mod.rs new file mode 100644 index 0000000000..9d2e0d44fc --- /dev/null +++ b/crates/schema/public/enums/src/by_table/debug_logs/mod.rs @@ -0,0 +1 @@ +pub mod debug_log_type; diff --git a/crates/schema/public/enums/src/by_table/mod.rs b/crates/schema/public/enums/src/by_table/mod.rs index b18d8fff27..f128ccd3a3 100644 --- a/crates/schema/public/enums/src/by_table/mod.rs +++ b/crates/schema/public/enums/src/by_table/mod.rs @@ -4,6 +4,7 @@ pub mod batch_generations; pub mod characters; pub mod beta_keys; pub mod comments; +pub mod debug_logs; pub mod email_sender_jobs; pub mod entity_stats; pub mod featured_items; diff --git a/crates/schema/public/tokens/src/prefixes.rs b/crates/schema/public/tokens/src/prefixes.rs index 5e1091aea0..ae884e6feb 100644 --- a/crates/schema/public/tokens/src/prefixes.rs +++ b/crates/schema/public/tokens/src/prefixes.rs @@ -30,6 +30,7 @@ pub(crate) enum TokenPrefix { BrowserSessionLog, Character, Comment, + DebugLogEvent, DownloadJob, EmailSenderJob, GoogleSignInAccount, @@ -116,6 +117,7 @@ impl PrefixGenerator for TokenPrefix { Self::BrowserSessionLog => "bsl_", Self::Character => "character_", Self::Comment => "comment_", + Self::DebugLogEvent => "dbg_", Self::DownloadJob => "jdown_", // NB: Previously "JGUP:" Self::EmailSenderJob => "email_job_", Self::GoogleSignInAccount => "gsi_", diff --git a/crates/schema/public/tokens/src/tokens/mod.rs b/crates/schema/public/tokens/src/tokens/mod.rs index 8268d6e425..c80accb6d2 100644 --- a/crates/schema/public/tokens/src/tokens/mod.rs +++ b/crates/schema/public/tokens/src/tokens/mod.rs @@ -47,3 +47,6 @@ pub mod wallets; pub mod zs_voice_dataset_samples; pub mod zs_voice_datasets; pub mod zs_voices; + +// Non-unique tokens (used as indices, not primary keys) +pub mod non_unique; diff --git a/crates/schema/public/tokens/src/tokens/non_unique/debug_logs_event_token.rs b/crates/schema/public/tokens/src/tokens/non_unique/debug_logs_event_token.rs new file mode 100644 index 0000000000..f325a36abc --- /dev/null +++ b/crates/schema/public/tokens/src/tokens/non_unique/debug_logs_event_token.rs @@ -0,0 +1,14 @@ +use serde::Deserialize; +use serde::Serialize; + +use crate::prefixes::TokenPrefix; + +/// A non-unique event token for the `debug_logs` table. +/// Multiple log rows can share the same event token. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "database", derive(sqlx::Type))] +#[cfg_attr(feature = "database", sqlx(transparent))] +pub struct DebugLogEventToken(pub String); + +impl_string_token!(DebugLogEventToken); +impl_crockford_generator!(DebugLogEventToken, 32usize, TokenPrefix::DebugLogEvent, CrockfordLower); diff --git a/crates/schema/public/tokens/src/tokens/non_unique/mod.rs b/crates/schema/public/tokens/src/tokens/non_unique/mod.rs new file mode 100644 index 0000000000..382dc89d87 --- /dev/null +++ b/crates/schema/public/tokens/src/tokens/non_unique/mod.rs @@ -0,0 +1 @@ +pub mod debug_logs_event_token; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs index 6caa659485..38b214a3f8 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/flux_2_lora_edit_image_angle_handler.rs @@ -238,6 +238,7 @@ pub async fn flux_2_lora_edit_image_angle_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs index 4a07340394..65f630baa6 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/angle/qwen_edit_2511_edit_image_angle_handler.rs @@ -239,6 +239,7 @@ pub async fn qwen_edit_2511_edit_image_angle_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs index 3d4612cedc..d21246e1f3 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gemini_25_flash_edit_image_handler.rs @@ -265,6 +265,7 @@ pub async fn gemini_25_flash_edit_image_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs index 68bb4cc857..585da256cb 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/gpt_image_1_edit_image_handler.rs @@ -297,6 +297,7 @@ pub async fn gpt_image_1_edit_image_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs index 06b7225cfb..295fe016a2 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/edit/qwen_edit_image_handler.rs @@ -270,6 +270,7 @@ pub async fn qwen_edit_image_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs index a1b790efad..d96bb92864 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_5_lite_multi_function_image_gen_handler.rs @@ -313,6 +313,7 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs index b4d8520751..1205f4f940 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4_multi_function_image_gen_handler.rs @@ -334,6 +334,7 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs index ff4663612d..a203af4d52 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/bytedance_seedream_v4p5_multi_function_image_gen_handler.rs @@ -331,6 +331,7 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs index 263ccbc163..13e5b374da 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/gpt_image_1p5_multi_function_image_gen_handler.rs @@ -382,6 +382,7 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs index b8a3ab7286..0c06d6de62 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_2_multi_function_image_gen_handler.rs @@ -343,6 +343,7 @@ pub async fn nano_banana_2_multi_function_image_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs index d1d689e19e..1bb1c8e8a0 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_multi_function_image_gen_handler.rs @@ -333,6 +333,7 @@ pub async fn nano_banana_multi_function_image_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs index be4819d10d..d7b75c77a0 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/multi_function/nano_banana_pro_multi_function_image_gen_handler.rs @@ -354,6 +354,7 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs index 71034c7481..a1dd6ccab0 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_text_to_image_handler.rs @@ -215,6 +215,7 @@ pub async fn generate_flux_pro_11_text_to_image_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs index 0e994fcfda..2b0372fa00 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_flux_pro_11_ultra_text_to_image_handler.rs @@ -223,6 +223,7 @@ pub async fn generate_flux_pro_11_ultra_text_to_image_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs index 3eca4fe5c5..e8749bde15 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/text/generate_gpt_image_1_text_to_image_handler.rs @@ -229,6 +229,7 @@ pub async fn generate_gpt_image_1_text_to_image_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs index 3f619babb6..4edc12fc63 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_1_6_pro_video_handler.rs @@ -266,6 +266,7 @@ pub async fn generate_kling_1_6_pro_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs index 84d0763ce5..c79e404ef5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_master_video_handler.rs @@ -251,6 +251,7 @@ pub async fn generate_kling_2_1_master_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs index 8ee7bdb69d..c1057595cc 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_kling_2_1_pro_video_handler.rs @@ -266,6 +266,7 @@ pub async fn generate_kling_2_1_pro_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs index 1a078265a0..f8e6edbef1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_lite_image_to_video_handler.rs @@ -285,6 +285,7 @@ pub async fn generate_seedance_1_0_lite_image_to_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs index 35347e6371..07531dfab1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_seedance_1_0_pro_image_to_video_handler.rs @@ -261,6 +261,7 @@ pub async fn generate_seedance_1_0_pro_image_to_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs index 55e262fa8b..69cc2671eb 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_2_image_to_video_handler.rs @@ -257,6 +257,7 @@ pub async fn generate_veo_2_image_to_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs index c60049f15c..8e00147ee5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_fast_image_to_video_handler.rs @@ -263,6 +263,7 @@ pub async fn generate_veo_3_fast_image_to_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs index 5c8df8b3a9..03ca474740 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/image/generate_veo_3_image_to_video_handler.rs @@ -265,6 +265,7 @@ pub async fn generate_veo_3_image_to_video_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs index 0522dfa560..dff9d16850 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p5_turbo_pro_multi_function_video_gen_handler.rs @@ -340,6 +340,7 @@ pub async fn kling_2p5_turbo_pro_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs index dedaac4d6a..bd6b24b715 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_2p6_pro_multi_function_video_gen_handler.rs @@ -337,6 +337,7 @@ pub async fn kling_2p6_pro_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs index 3dac9bbefa..b10c680cfe 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_pro_multi_function_video_gen_handler.rs @@ -342,6 +342,7 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs index cbaa4fa27a..0df6dacb53 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/kling_3p0_standard_multi_function_video_gen_handler.rs @@ -342,6 +342,7 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs index 9a4c3b2378..73caecfe52 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_1p5_pro_multi_function_video_gen_handler.rs @@ -329,6 +329,7 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs index 0ffb085f60..a4c97c189b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs @@ -422,6 +422,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( maybe_avt_token: maybe_avt_token.as_ref(), creator_ip_address: &ip_address, creator_set_visibility: Visibility::Public, + maybe_debug_log_event_token: None, mysql_executor: &mut *transaction, phantom: Default::default(), } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs index e807dae56a..6352b93039 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_multi_function_video_gen_handler.rs @@ -358,6 +358,7 @@ pub async fn sora_2_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs index b844a1275a..1a909e70eb 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/sora_2_pro_multi_function_video_gen_handler.rs @@ -360,6 +360,7 @@ pub async fn sora_2_pro_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs index acbea8f541..99b996cd3c 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_fast_multi_function_video_gen_handler.rs @@ -424,6 +424,7 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs index a28fc4c3bc..e5012c3b7e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/veo_3p1_multi_function_video_gen_handler.rs @@ -424,6 +424,7 @@ pub async fn veo_3p1_multi_function_video_gen_handler( starting_job_status_override: None, maybe_frontend_failure_category: None, maybe_failure_reason: None, + maybe_debug_log_event_token: None, phantom: Default::default(), }).await; 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 0ebbf9f60c..032566e360 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 artcraft_api_defs::omni_gen::generate_response::omni_gen_image_generate_resp use artcraft_router::client::router_client::RouterClient; use artcraft_router::client::router_fal_client::RouterFalClient; use artcraft_router::generate::generate_image::generate_image_response::GenerateImageResponse; +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; @@ -19,6 +20,7 @@ use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation_provider::GenerationProvider; use enums::common::visibility::Visibility; use http_server_common::request::get_request_ip::get_request_ip; +use mysql_queries::queries::debug_logs::insert_debug_log::{insert_debug_log, InsertDebugLogArgs}; use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::FalCategory; use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue_with_apriori_job_token::{ insert_generic_inference_job_for_fal_queue_with_apriori_job_token, @@ -31,6 +33,7 @@ use mysql_queries::queries::prompt_context_items::insert_batch_prompt_context_it use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPromptArgs}; use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::media_files::MediaFileToken; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; use crate::billing::wallets::attempt_wallet_deduction::attempt_wallet_deduction_else_common_web_error; use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError; @@ -63,6 +66,8 @@ pub async fn omni_gen_image_generate_handler( payments_error_test(&request.prompt.as_deref().unwrap_or(""))?; + let debug_log_event_token = DebugLogEventToken::generate(); + let maybe_prompt_model_type: Option = request.model .as_ref() .map(|m| m.to_common_model_type()); @@ -154,6 +159,19 @@ pub async fn omni_gen_image_generate_handler( ).await?; } + // ==================== DEBUG LOG: HTTP REQUEST ==================== // + + if let Err(err) = insert_debug_log(InsertDebugLogArgs { + apriori_debug_log_event_token: Some(&debug_log_event_token), + maybe_creator_user_token: Some(user_token), + debug_log_type: DebugLogType::HttpRequest, + message: &serde_json::to_string(&*request).unwrap_or_default(), + mysql_executor: &mut *mysql_connection, + phantom: Default::default(), + }).await { + warn!("Failed to insert HTTP request debug log: {:?}", err); + } + // ==================== EXECUTE GENERATION ==================== // let fal_client = RouterFalClient::new( @@ -266,6 +284,7 @@ pub async fn omni_gen_image_generate_handler( maybe_avt_token: maybe_avt_token.as_ref(), creator_ip_address: &ip_address, creator_set_visibility: Visibility::Public, + maybe_debug_log_event_token: Some(&debug_log_event_token), mysql_executor: &mut *transaction, starting_job_status_override: None, maybe_frontend_failure_category: None, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs index a9f5cc25e9..154bcf9cf7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/insert_fal_job.rs @@ -34,6 +34,7 @@ pub async fn insert_fal_job(args: InsertFalJobArgs<'_, '_>) -> Result) maybe_avt_token: shared.maybe_avt_token, creator_ip_address: shared.ip_address, creator_set_visibility: Visibility::Public, + maybe_debug_log_event_token: shared.maybe_debug_log_event_token, mysql_executor: &mut **shared.transaction, maybe_inference_args: None, phantom: Default::default(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs index 52fff46b88..e452d37d34 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/insert_db_job/shared_job_args.rs @@ -1,5 +1,6 @@ use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; use tokens::tokens::prompts::PromptToken; use tokens::tokens::users::UserToken; @@ -9,6 +10,7 @@ pub struct SharedJobArgs<'a, 'tx> { pub user_token: &'a UserToken, pub maybe_avt_token: Option<&'a AnonymousVisitorTrackingToken>, pub maybe_prompt_token: Option<&'a PromptToken>, + pub maybe_debug_log_event_token: Option<&'a DebugLogEventToken>, pub ip_address: &'a str, pub transaction: &'a mut sqlx::Transaction<'tx, sqlx::MySql>, } 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 d4c7d17d37..8d5053a030 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 @@ -10,6 +10,7 @@ use url::Url; use artcraft_api_defs::omni_gen::cost_and_generate_requests::omni_gen_video_cost_and_generate_request::OmniGenVideoCostAndGenerateRequest; use artcraft_api_defs::omni_gen::generate_response::omni_gen_video_generate_response::OmniGenVideoGenerateResponse; use artcraft_router::generate::generate_video::generate_video_response::GenerateVideoResponse; +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; @@ -17,6 +18,7 @@ use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation::common_video_model::CommonVideoModel; use enums::common::generation_provider::GenerationProvider; use http_server_common::request::get_request_ip::get_request_ip; +use mysql_queries::queries::debug_logs::insert_debug_log::{insert_debug_log, InsertDebugLogArgs}; use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; use mysql_queries::queries::prompt_context_items::insert_batch_prompt_context_items::{ insert_batch_prompt_context_items, InsertBatchArgs, PromptContextItem, @@ -25,6 +27,7 @@ use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPrompt use tokens::tokens::characters::CharacterToken; use tokens::tokens::generic_inference_jobs::InferenceJobToken; use tokens::tokens::media_files::MediaFileToken; +use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken; use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError; use crate::http_server::endpoints::generate::common::payments_error_test::payments_error_test; @@ -64,6 +67,8 @@ pub async fn omni_gen_video_generate_handler( payments_error_test(&request.prompt.as_deref().unwrap_or(""))?; + let debug_log_event_token = DebugLogEventToken::generate(); + let maybe_prompt_model_type: Option = request.model .as_ref() .map(|m| m.to_common_model_type()); @@ -207,6 +212,19 @@ pub async fn omni_gen_video_generate_handler( }).await? }; + // ==================== DEBUG LOG: HTTP REQUEST ==================== // + + if let Err(err) = insert_debug_log(InsertDebugLogArgs { + apriori_debug_log_event_token: Some(&debug_log_event_token), + maybe_creator_user_token: Some(user_token), + debug_log_type: DebugLogType::HttpRequest, + message: &serde_json::to_string(&*request).unwrap_or_default(), + mysql_executor: &mut *mysql_connection, + phantom: Default::default(), + }).await { + warn!("Failed to insert HTTP request debug log: {:?}", err); + } + // ==================== WRITE RESULT ==================== // let ip_address = get_request_ip(&http_request); @@ -304,6 +322,7 @@ pub async fn omni_gen_video_generate_handler( user_token, maybe_avt_token: maybe_avt_token.as_ref(), maybe_prompt_token: prompt_token.as_ref(), + maybe_debug_log_event_token: Some(&debug_log_event_token), ip_address: &ip_address, transaction: &mut transaction, }, @@ -324,6 +343,7 @@ pub async fn omni_gen_video_generate_handler( user_token, maybe_avt_token: maybe_avt_token.as_ref(), maybe_prompt_token: prompt_token.as_ref(), + maybe_debug_log_event_token: Some(&debug_log_event_token), ip_address: &ip_address, transaction: &mut transaction, }, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal_webhook_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal_webhook_handler.rs index eb7387c196..dd7ee4c683 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal_webhook_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/fal_webhook_handler.rs @@ -53,17 +53,22 @@ pub async fn fal_webhook_handler( // Step 3: Hydrate the webhook contents. let hydrated_contents = hydrate_webhook_contents(&webhook_payload); + // Step 3.5: Acquire a MySQL connection for the handlers. + let mut mysql_connection = server_state.mysql_pool.acquire().await?; + // Step 4 & 5: Branch on the inner payload type. let result = match hydrated_contents { HydratedWebhookContents::Success(success_data) => { - handle_successful_fal_webhook(&server_state, request_id, &success_data, &server_state.pager).await + handle_successful_fal_webhook(&server_state, &mut mysql_connection, request_id, &success_data, &raw_body, &server_state.pager).await } HydratedWebhookContents::Error(error_data) => { handle_failed_fal_webhook( &server_state, + &mut mysql_connection, request_id, &error_data, webhook_payload.error.as_deref(), + &raw_body, ).await } HydratedWebhookContents::PayloadError(payload_error_data) => { diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_failure/handle_failed_fal_webhook.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_failure/handle_failed_fal_webhook.rs index 3fbde6cf79..e3afcf7ec3 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_failure/handle_failed_fal_webhook.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_failure/handle_failed_fal_webhook.rs @@ -1,22 +1,28 @@ use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError; use crate::state::server_state::ServerState; use actix_web::web::Json; +use enums::by_table::debug_logs::debug_log_type::DebugLogType; use enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory; use fal_client::webhook_api::raw::webhook_error_type::WebhookErrorType; use fal_client::webhook_api::hydrated::hydrated_webhook_contents::ErrorData; use http_server_common::response::response_success_helpers::SimpleGenericJsonSuccess; use log::{error, info, warn}; -use mysql_queries::queries::generic_inference::fal::get_inference_job_by_fal_id::get_inference_job_by_fal_id; -use mysql_queries::queries::generic_inference::job::mark_job_failed_by_token::{mark_job_failed_by_token, MarkJobFailedByTokenArgs}; +use mysql_queries::queries::debug_logs::insert_debug_log::{insert_debug_log, InsertDebugLogArgs}; +use mysql_queries::queries::generic_inference::fal::get_inference_job_by_fal_id::get_inference_job_by_fal_id_from_connection; +use mysql_queries::queries::generic_inference::job::mark_job_failed_by_token::{mark_job_failed_by_token_from_connection, MarkJobFailedByTokenFromConnectionArgs}; +use sqlx::pool::PoolConnection; +use sqlx::MySql; /// Handle a FAL webhook with status ERROR. /// /// Looks up the job by request_id and marks it as failed using the parsed error data. pub async fn handle_failed_fal_webhook( server_state: &ServerState, + mysql_connection: &mut PoolConnection, request_id: &str, error_data: &ErrorData, maybe_top_level_error: Option<&str>, + raw_body: &str, ) -> Result, AdvancedCommonWebError> { info!( @@ -28,7 +34,7 @@ pub async fn handle_failed_fal_webhook( ); // Look up the job record. - let job = match get_inference_job_by_fal_id(request_id, &server_state.mysql_pool).await { + let job = match get_inference_job_by_fal_id_from_connection(request_id, mysql_connection).await { Ok(Some(record)) => record, Ok(None) => { warn!("Could not find job record by fal request_id: {}", request_id); @@ -40,6 +46,20 @@ pub async fn handle_failed_fal_webhook( } }; + // Insert debug log for the webhook payload. + if let Some(debug_log_event_token) = &job.maybe_debug_log_event_token { + if let Err(err) = insert_debug_log(InsertDebugLogArgs { + apriori_debug_log_event_token: Some(debug_log_event_token), + maybe_creator_user_token: job.maybe_creator_user_token.as_ref(), + debug_log_type: DebugLogType::FalWebhook, + message: raw_body, + mysql_executor: &mut **mysql_connection, + phantom: Default::default(), + }).await { + warn!("Failed to insert Fal webhook debug log: {:?}", err); + } + } + // Build a failure reason from the error data or the top-level error string. let public_failure_reason = if let Some(msg) = &error_data.message { msg.clone() @@ -67,8 +87,8 @@ pub async fn handle_failed_fal_webhook( public_failure_reason, ); - if let Err(err) = mark_job_failed_by_token(MarkJobFailedByTokenArgs { - pool: &server_state.mysql_pool, + if let Err(err) = mark_job_failed_by_token_from_connection(MarkJobFailedByTokenFromConnectionArgs { + mysql_connection, job_token: &job.job_token, maybe_public_failure_reason: Some(&public_failure_reason), internal_debugging_failure_reason: &internal_failure_reason, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_success/handle_successful_fal_webhook.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_success/handle_successful_fal_webhook.rs index 0757825363..e58cf3b2e0 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_success/handle_successful_fal_webhook.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/webhooks/process_success/handle_successful_fal_webhook.rs @@ -1,10 +1,14 @@ use actix_web::web::Json; +use enums::by_table::debug_logs::debug_log_type::DebugLogType; use fal_client::webhook_api::hydrated::hydrated_webhook_contents::WebhookSuccessData; use http_server_common::response::response_success_helpers::SimpleGenericJsonSuccess; use log::{info, warn}; -use mysql_queries::queries::generic_inference::fal::get_inference_job_by_fal_id::get_inference_job_by_fal_id; +use mysql_queries::queries::debug_logs::insert_debug_log::{insert_debug_log, InsertDebugLogArgs}; +use mysql_queries::queries::generic_inference::fal::get_inference_job_by_fal_id::get_inference_job_by_fal_id_from_connection; use mysql_queries::queries::generic_inference::fal::mark_fal_generic_inference_job_successfully_done::{mark_fal_generic_inference_job_successfully_done, MarkJobArgs}; use pager::client::pager::Pager; +use sqlx::pool::PoolConnection; +use sqlx::MySql; use crate::http_server::common_responses::advanced_common_web_error::AdvancedCommonWebError; use crate::state::server_state::ServerState; @@ -16,14 +20,16 @@ use super::process_video_payload::process_video_payload; pub async fn handle_successful_fal_webhook( server_state: &ServerState, + mysql_connection: &mut PoolConnection, request_id: &str, success_data: &WebhookSuccessData, + raw_body: &str, pager: &Pager, ) -> Result, AdvancedCommonWebError> { - let db_result = get_inference_job_by_fal_id( + let db_result = get_inference_job_by_fal_id_from_connection( request_id, - &server_state.mysql_pool, + mysql_connection, ).await; let job = match db_result { @@ -40,6 +46,20 @@ pub async fn handle_successful_fal_webhook( info!("Fal webhook job record for request_id {}: {:?}", request_id, job); + // Insert debug log for the webhook payload. + if let Some(debug_log_event_token) = &job.maybe_debug_log_event_token { + if let Err(err) = insert_debug_log(InsertDebugLogArgs { + apriori_debug_log_event_token: Some(debug_log_event_token), + maybe_creator_user_token: job.maybe_creator_user_token.as_ref(), + debug_log_type: DebugLogType::FalWebhook, + message: raw_body, + mysql_executor: &mut **mysql_connection, + phantom: Default::default(), + }).await { + warn!("Failed to insert Fal webhook debug log: {:?}", err); + } + } + let mut maybe_media_token = None; let mut maybe_batch_token = None; @@ -92,7 +112,7 @@ pub async fn handle_successful_fal_webhook( job_token: &job.job_token, media_file_token: &media_token, maybe_batch_token: maybe_batch_token.as_ref(), - mysql_executor: &server_state.mysql_pool, + mysql_executor: &mut **mysql_connection, phantom: Default::default(), }).await.map_err(|err| { warn!("Error marking job as successfully done for request_id {}: {:?}", request_id, err); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6275dc9c8e..2e5bbc8123 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -349,6 +349,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -364,6 +365,7 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -823,6 +825,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2582,6 +2585,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" } @@ -2655,6 +2659,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", @@ -2799,6 +2804,7 @@ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "license": "MIT", + "peer": true, "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -2828,7 +2834,6 @@ "os": [ "aix" ], - "peer": true, "engines": { "node": ">=12" } @@ -2846,7 +2851,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } @@ -2864,7 +2868,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } @@ -2882,7 +2885,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=12" } @@ -2900,7 +2902,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=12" } @@ -2918,7 +2919,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=12" } @@ -2936,7 +2936,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -2954,7 +2953,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -2972,7 +2970,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -2990,7 +2987,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3008,7 +3004,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3026,7 +3021,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3044,7 +3038,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3062,7 +3055,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3080,7 +3072,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3098,7 +3089,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3116,7 +3106,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=12" } @@ -3150,7 +3139,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -3184,7 +3172,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=12" } @@ -3218,7 +3205,6 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=12" } @@ -3236,7 +3222,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } @@ -3254,7 +3239,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } @@ -3272,7 +3256,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=12" } @@ -3500,6 +3483,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" }, @@ -3869,7 +3853,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" } @@ -3914,6 +3897,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", @@ -5414,6 +5398,7 @@ "integrity": "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime": "0.21.6", "@module-federation/webpack-bundler-runtime": "0.21.6" @@ -5607,6 +5592,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" @@ -5721,6 +5707,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -8089,7 +8076,6 @@ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.85.2.tgz", "integrity": "sha512-kauC/oPaxklU4Y+u9gBfCBJm51qX6WBZq4xx0USCdimtp+G8+554kpygfSWIjoqCJa2o06bWxBEjesiuCv+LzA==", "license": "MIT", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8099,7 +8085,6 @@ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.85.2.tgz", "integrity": "sha512-XCginmxh0//++EXVOEJHBVZxHla294FzLCFF6jXwAUjvXVhqyIKyxhABfz+r4OOmaiuWk4Rtd4arqdAzeHeprg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.29.0", @@ -8121,7 +8106,6 @@ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.85.2.tgz", "integrity": "sha512-3KLgSg1kHvBpr93zMaQhvfYTgnCw7yZRED+3J4dMcYjfSjtD0Wf8SofU6uBmAw9JaVYvP43lpdwUpI4p0+ABsg==", "license": "MIT", - "peer": true, "dependencies": { "@react-native/dev-middleware": "0.85.2", "debug": "^4.4.0", @@ -8152,7 +8136,6 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.85.2.tgz", "integrity": "sha512-j+0b9H5f5hGTLQxHIhJU/b/W6ijuxJF+ZTLHB0se2kzUBNxFKd7DkIc6753qk3CJdiv55vxG3XDgmlpbHxOpmA==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8162,7 +8145,6 @@ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.85.2.tgz", "integrity": "sha512-r5BkhqPMfg3LmaZS5zadHmBNVH5h4bhSpv4BEPGfK4gat9HABAMzUzybi+2wpgU3SoHxnyKGdExEJvoqVcjeRg==", "license": "MIT", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "debug": "^4.4.0", @@ -8177,7 +8159,6 @@ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.85.2.tgz", "integrity": "sha512-3J+NaDUg+QEfDeLAUzgaWhpaxEg78g+KwbydlDCewh2G6WnHpsty8XooruxNHzyAsqVWywZMrzmbn78Ctc1O9Q==", "license": "MIT", - "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.85.2", @@ -8201,7 +8182,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" @@ -8218,7 +8198,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -8240,7 +8219,6 @@ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.85.2.tgz", "integrity": "sha512-YXBOLeAqFrv7XwUeBPTKZeOV1FIxn4AW7UAEitScf3ibC8bu8+6NpJu4HWgbNQHg7vDbbTZVbcOl8EwGxsSq2w==", "license": "MIT", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8250,7 +8228,6 @@ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.2.tgz", "integrity": "sha512-esGEAmKVM40DV/yVmNljCKZTIeUo7qXqc+Hwffkv3TG+b3E24xyFovHrbP98gGxZr2ZsEyx+2sKLdXF5asY5nw==", "license": "MIT", - "peer": true, "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } @@ -8259,8 +8236,7 @@ "version": "0.85.2", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.2.tgz", "integrity": "sha512-svuOLtjbFGXDdHsriHXuND5FgHg7XlkOXCbH/8+X4t76YLH6qSTffSIQQrKLDL5mn4EFU+Oh/PNO0/FfpnTOTg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@react-oauth/google": { "version": "0.13.4", @@ -8418,6 +8394,7 @@ "integrity": "sha512-gfc4Hu2Sysr+GyU/F12d2uvEfQwUwWvsOjBtiemhdN1xGOn1+FyYzlLl/aJ7AL9oYko8sDqOPyJCiApWJJGCCw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.8", "@babel/generator": "^7.21.5", @@ -9246,6 +9223,7 @@ "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.17.2.tgz", "integrity": "sha512-dTrAG1SgOLgz1DFBDsLHN0V34YqLsHEReVHYOI4UV/p+ALbn/BRQMw1MaUuqGXmX21ZTuCzzPegtTLNEOc8ixA==", "license": "MIT", + "peer": true, "dependencies": { "@remix-run/router": "1.23.0", "@types/cookie": "^0.6.0", @@ -9838,6 +9816,7 @@ "integrity": "sha512-2mR+2YBydlgZ7Q0Rpd6bCC3MBnV9TS0x857K0zIhbDj4BQOqaWVy1n7fx/B3MrS8TR0QCuzKfyDAjNz+XTyJVQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime-tools": "0.21.6", "@rspack/binding": "1.6.6", @@ -10552,6 +10531,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", @@ -10734,6 +10714,7 @@ "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.8" @@ -10948,6 +10929,7 @@ "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3" } @@ -11289,6 +11271,7 @@ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -11784,6 +11767,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -11806,6 +11790,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" } @@ -12145,6 +12130,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", @@ -14354,6 +14340,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" }, @@ -14415,6 +14402,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -14497,6 +14485,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -14570,8 +14559,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", @@ -14864,8 +14852,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", @@ -15166,7 +15153,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.33.3.tgz", "integrity": "sha512-/Z9xYdaJ1lC0pT9do6TqCqhOSLfZ5Ot8D5za1p+feEfWYupCOfGbhhEXN9r2ZgJtDNUNRw/Z+T2CvAGKBqtqWA==", "license": "MIT", - "peer": true, "dependencies": { "hermes-parser": "0.33.3" } @@ -15386,6 +15372,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -15418,7 +15405,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" } @@ -15820,7 +15806,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", @@ -15849,7 +15834,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", @@ -16258,7 +16242,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", @@ -16274,7 +16257,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" } @@ -16284,7 +16266,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" } @@ -16294,7 +16275,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", @@ -16312,15 +16292,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" }, @@ -16333,7 +16311,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" } @@ -16669,7 +16646,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/damerau-levenshtein": { "version": "1.0.8", @@ -17372,7 +17350,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", @@ -17428,6 +17407,7 @@ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -17520,7 +17500,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" } @@ -17732,6 +17711,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -18156,6 +18136,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", @@ -18212,6 +18193,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -18313,6 +18295,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", @@ -19048,14 +19031,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.1", "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -19229,7 +19212,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" }, @@ -19242,7 +19224,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" } @@ -19356,6 +19337,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19549,8 +19531,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.15.11", @@ -20421,22 +20402,19 @@ "version": "250829098.0.10", "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.10.tgz", "integrity": "sha512-TcRlZ0/TlyfJqquRFAWoyElVNnkdYRi/sEp4/Qy8/GYxjg8j2cS9D4MjuaQ+qimkmLN7AmO+44IznRf06mAr0w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.33.3", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz", "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.33.3", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz", "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==", "license": "MIT", - "peer": true, "dependencies": { "hermes-estree": "0.33.3" } @@ -20458,6 +20436,7 @@ "version": "4.12.7", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.7.tgz", "integrity": "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -20775,7 +20754,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" }, @@ -21948,6 +21926,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": "*", @@ -21977,7 +21956,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", @@ -21995,7 +21973,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" }, @@ -22008,7 +21985,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", @@ -22022,15 +21998,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", @@ -22046,7 +22020,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" }, @@ -22104,8 +22077,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", @@ -22113,6 +22085,7 @@ "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "abab": "^2.0.6", "cssstyle": "^3.0.0", @@ -22422,7 +22395,8 @@ "url": "https://github.com/sponsors/lavrton" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/language-subtag-registry": { "version": "0.3.23", @@ -22479,7 +22453,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" } @@ -22503,7 +22476,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" @@ -22514,7 +22486,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" } @@ -22523,13 +22494,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/lightningcss": { "version": "1.31.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "peer": true, "dependencies": { "detect-libc": "^2.0.3" }, @@ -23197,8 +23168,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", @@ -23521,7 +23491,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" } @@ -23540,8 +23509,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", @@ -23789,8 +23757,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", @@ -23837,7 +23804,6 @@ "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.3.tgz", "integrity": "sha512-1h3lbVrE6hGf1e/764HfhPGg/bGrWMJDDh7G2rc4gFYZboVuI40BlG/y+UhtbhQDNlO/csMvrcnK0YrTlHUVew==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/core": "^7.25.2", @@ -23892,7 +23858,6 @@ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.3.tgz", "integrity": "sha512-svAA+yMLpeMiGcz/jKJs4oHpIGEx4nBqNEJ5AGj4CYIg1efvK+A0TjR6tgIuc6tKO5e8JmN/1lglpN2+f3/z/w==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", @@ -23908,15 +23873,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" } @@ -23926,7 +23889,6 @@ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.3.tgz", "integrity": "sha512-0QElxwLaHqLZf+Xqio8QrjVbuXP/8sJfQBGSPiITlKDVXrVLefuzYVSH9Sj+QL6lrPj2gYZd/iwQh1yZuVKnLA==", "license": "MIT", - "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", @@ -23942,7 +23904,6 @@ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.3.tgz", "integrity": "sha512-TnSL1Fdvrw+2glTdBSRmA5TL8l/i16ECjsrUdf3E5HncA+sNx8KcwDG8r+3ct1UhfYcusJypzZqTN55FZZcwGg==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -23955,7 +23916,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" } @@ -23965,7 +23925,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" @@ -23979,7 +23938,6 @@ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.3.tgz", "integrity": "sha512-JmCzZWOETR+O22q8oPBWyQppx3roU9EbkbGzD8Gf1jukQ4b5T1fTzqqHruu6K4sTiNq5zVQySmKF6bp4kVARew==", "license": "MIT", - "peer": true, "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", @@ -23999,7 +23957,6 @@ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.3.tgz", "integrity": "sha512-cc0pvAa80ai1nDmqqz0P59a+0ZqCZ/YHU/3jEekZL6spFnYDfX8iDLdn9FR6kX+67rmzKxHNrbrSRFLX2AYocw==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", @@ -24014,7 +23971,6 @@ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.3.tgz", "integrity": "sha512-1cL4m4Jv1yRUt9RJExZQLfccscdlMNOcRG6LHLtmJhf3BG9j3MujPVc7CIpKYdFl+KUl+sdjge6oO3+meKCHQA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", @@ -24035,7 +23991,6 @@ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.3.tgz", "integrity": "sha512-3ofrG2OQyJbO9RNhCfOcl8QU7EE2WrSsnN5dFkuZaJO5+4Imujr9bUXmspeNlXRsOVk0F/rVRbEFH98lFSCkBQ==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" @@ -24049,7 +24004,6 @@ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.3.tgz", "integrity": "sha512-pjEzGDtoM8DTHAIPK/9u9ZxszEiuRohYUVImWvgbnB91V4gqYJpQcoEYUugf2NIm1lrX5HNu0OvNqWmPBnGYjA==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -24062,7 +24016,6 @@ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.3.tgz", "integrity": "sha512-o7HLRfMyVk9N2dUZ9VjQfB6xxUItL9Pi9WcqxURE7MEKOH6wbGt9/E92YdYLluTOtkzYAEVfdC6h6lcxqA+hMQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" @@ -24076,7 +24029,6 @@ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.3.tgz", "integrity": "sha512-jS48CeSzw78M8y6VE0f9uy3lVmfbOS677j2VCxnlmlYmnahcXuC6IhoN9K6LynNvos9517yUadcfgioju38xYQ==", "license": "MIT", - "peer": true, "dependencies": { "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", @@ -24097,7 +24049,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" } @@ -24107,7 +24058,6 @@ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.3.tgz", "integrity": "sha512-J9Tpo8NCycYrozRvBIUyOwGAu4xkawOsAppmTscFiaegK0WvuDGwIM53GbzVSnytCHjVAF0io5GQxpkrKTuc7g==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", @@ -24128,7 +24078,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" } @@ -24138,7 +24087,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.3.tgz", "integrity": "sha512-8S3baq2XhBaafHEH5Q8sJW6tmzsEJk80qKc3RU/nZV1MsnYq94RdjTUR6AyKjQd6Rfsk1BtBxhtiNnk7mgslCg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", @@ -24156,7 +24104,6 @@ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.3.tgz", "integrity": "sha512-Wjba7PyYktNRsHbPmkx2J2UX32rAzcDXjCu49zPHeF/viJlYJhwRaNePQcHaCRqQ+kmgQT4ThprsnJfDj71ZMA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.29.1", @@ -24181,7 +24128,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" @@ -24194,22 +24140,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" } @@ -24219,7 +24162,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" }, @@ -24236,7 +24178,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" } @@ -24246,7 +24187,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" } @@ -24256,7 +24196,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -25585,8 +25524,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", @@ -25770,8 +25708,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.22", @@ -25786,6 +25723,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", @@ -25943,7 +25881,6 @@ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.3.tgz", "integrity": "sha512-J7554Ef8bzmKaDY365Afq6PF+qtdnY/d5PKUQFrsKlZHV/N3OGZewVrvDrQDyX5V5NJjTpcAKtlrFZcDr+HvpQ==", "license": "MIT", - "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, @@ -26721,6 +26658,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -27026,6 +26964,7 @@ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -27109,6 +27048,7 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -27260,7 +27200,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" } @@ -27443,7 +27382,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" } @@ -27602,6 +27540,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" }, @@ -27650,7 +27589,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" @@ -27661,7 +27599,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -27683,6 +27620,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" @@ -28036,7 +27974,6 @@ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.6.0.tgz", "integrity": "sha512-90abYK2q5/qDM+GACs9zRvc5KhEEpEWqWlHSd64zTPNxg+9wCJvTfyD9x2so7hlQhjRYO1Fa6flR3BC/kpTFkA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.17.8", "@types/webxr": "*", @@ -28085,7 +28022,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" }, @@ -28108,7 +28044,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" }, @@ -28135,7 +28070,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -28146,7 +28080,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -28156,7 +28089,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", @@ -28170,8 +28102,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.3", @@ -28192,7 +28123,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "@types/react-reconciler": "^0.33.0", "its-fine": "^2.0.0", @@ -28210,7 +28140,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": "*" } @@ -28220,7 +28149,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" }, @@ -28233,7 +28161,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": "*" } @@ -28243,7 +28170,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" }, @@ -28319,7 +28245,6 @@ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.85.2.tgz", "integrity": "sha512-wmVKpAlcr+UB0L5SpbrV865EdleUP7I5+X+48e1aRsQK8q+wsTRBXeUwWVip/1l+HZwlZFeO8iOILJ16VRu0Cw==", "license": "MIT", - "peer": true, "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" @@ -28342,15 +28267,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.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.3.0" }, @@ -28394,7 +28317,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" @@ -28576,8 +28498,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", @@ -28766,8 +28687,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", @@ -29315,7 +29235,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" } @@ -30023,7 +29942,6 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -30359,15 +30277,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" }, @@ -30968,7 +30884,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" } @@ -31279,6 +31194,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -31448,14 +31364,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", @@ -31614,8 +31530,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", @@ -31918,7 +31833,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" } @@ -32020,6 +31934,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -32684,6 +32599,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -33577,6 +33493,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -33655,8 +33572,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", @@ -33683,7 +33599,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" } @@ -33771,6 +33686,7 @@ "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -33872,8 +33788,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", @@ -34158,6 +34073,7 @@ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -34372,6 +34288,7 @@ "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" }