diff --git a/apps/orchestral-cli/src/agent.rs b/apps/orchestral-cli/src/agent.rs index f8808d23..d227a196 100644 --- a/apps/orchestral-cli/src/agent.rs +++ b/apps/orchestral-cli/src/agent.rs @@ -303,7 +303,7 @@ async fn build_agent_host_with_journals( .with_context(|| format!("load Generic Agent config '{}'", config_path.display()))?; let (backend, profile, model, temperature) = resolve_model(&config).await?; let reasoning = - crate::model_controls::resolve_reasoning(config.agent.reasoning, profile.as_ref())?; + crate::model_controls::resolve_reasoning(config.agent.reasoning.clone(), profile.as_ref())?; let (model_backend, token_meter) = build_model_backend( &backend, &model, @@ -311,7 +311,7 @@ async fn build_agent_host_with_journals( profile.as_ref(), config.agent.stream_buffer, options.credential_file.as_deref(), - reasoning, + reasoning.clone(), )?; let mut agent_config = GenericAgentConfig::new("orchestral/internal", "generic-agent"); @@ -423,7 +423,7 @@ async fn build_agent_host_with_journals( agent_config.project_instructions.iter().map(|doc| format!("{}\n Scope: {}", doc.source, doc.scope)).collect::>().join("\n")), models: config.providers.models.clone(), model_backend: backend.clone(), - reasoning, + reasoning: reasoning.clone(), }; let session_history = if matches!(config.journal.backend.as_str(), "fs" | "filesystem") { crate::local_sessions::LocalSessionHistory::Directory(base_journal_root) diff --git a/apps/orchestral-cli/src/cli.rs b/apps/orchestral-cli/src/cli.rs index d8b8a8f9..95c284c0 100644 --- a/apps/orchestral-cli/src/cli.rs +++ b/apps/orchestral-cli/src/cli.rs @@ -47,12 +47,8 @@ pub struct Cli { /// Override the model's sampling temperature. #[arg(long, global = true)] temperature: Option, - /// Generic Agent reasoning: default omits controls; none disables effort; on/off toggle thinking. - #[arg( - long, - value_name = "default|none|minimal|low|medium|high|xhigh|max|on|off", - global = true - )] + /// Generic Agent reasoning: default omits controls; on/off toggle thinking; other names request provider effort. Use effort: for literal reserved names. + #[arg(long, value_name = "default|on|off|EFFORT|effort:NAME", global = true)] reasoning: Option, /// Continue the conversation with this session ID #[arg(long, global = true)] @@ -125,7 +121,7 @@ impl Cli { model_profile: self.model_profile.clone(), model, temperature: self.temperature, - reasoning: self.reasoning, + reasoning: self.reasoning.clone(), base_url, api_key_env: self.api_key_env.clone(), no_auth: self.no_auth, @@ -223,7 +219,12 @@ mod tests { .reasoning, Some(ReasoningPreference::Default) ); - assert!(Cli::try_parse_from(["orchestral", "--reasoning", "ultra", "inspect"]).is_err()); + assert_eq!( + Cli::try_parse_from(["orchestral", "--reasoning", "ultra", "inspect"]) + .unwrap() + .reasoning, + Some(ReasoningPreference::Custom("ultra".into())) + ); let native = Cli::try_parse_from(["orchestral", "--reasoning", "high", "sessions", "agents"]) .unwrap(); diff --git a/apps/orchestral-cli/src/model_controls.rs b/apps/orchestral-cli/src/model_controls.rs index 4f20c90b..38c333c8 100644 --- a/apps/orchestral-cli/src/model_controls.rs +++ b/apps/orchestral-cli/src/model_controls.rs @@ -49,6 +49,9 @@ pub(crate) fn openai_reasoning( Preference::High => OpenAiReasoningControl::Effort(Effort::High), Preference::XHigh => OpenAiReasoningControl::Effort(Effort::XHigh), Preference::Max => OpenAiReasoningControl::Effort(Effort::Max), + Preference::Custom(value) => { + OpenAiReasoningControl::Effort(value.parse().map_err(anyhow::Error::msg)?) + } Preference::Default => unreachable!(), })) } @@ -75,6 +78,7 @@ pub(crate) fn discovered_model(model: orchestral_model_openai::DiscoveredModel) Effort::High => Preference::High, Effort::XHigh => Preference::XHigh, Effort::Max => Preference::Max, + Effort::Custom(value) => Preference::Custom(value), })); } if caps.thinking.is_some() { diff --git a/apps/orchestral-cli/src/model_controls/tests.rs b/apps/orchestral-cli/src/model_controls/tests.rs index 16dd8d04..203e50c6 100644 --- a/apps/orchestral-cli/src/model_controls/tests.rs +++ b/apps/orchestral-cli/src/model_controls/tests.rs @@ -60,6 +60,17 @@ fn profile_reasoning_and_explicit_default_have_distinct_precedence() { ReasoningPreference::Default ); let mut invalid = profile.clone(); + for (value, expected) in [ + ("future-next", "future-next"), + ("HIGH", "HIGH"), + ("effort:off", "off"), + ] { + invalid.config["reasoning"] = json!(value); + assert_eq!( + resolve_reasoning(None, Some(&invalid)).unwrap(), + ReasoningPreference::Custom(expected.into()) + ); + } invalid.config["reasoning"] = json!(true); assert!(resolve_reasoning(None, Some(&invalid)).is_err()); } diff --git a/apps/orchestral-cli/src/runtime/client/config.rs b/apps/orchestral-cli/src/runtime/client/config.rs index b5dd0d5c..0f058cb8 100644 --- a/apps/orchestral-cli/src/runtime/client/config.rs +++ b/apps/orchestral-cli/src/runtime/client/config.rs @@ -116,7 +116,10 @@ fn merge_model_overrides(requested: &ModelOverrides, automatic: &ModelOverrides) .or_else(|| automatic.model_profile.clone()), model: requested.model.clone().or_else(|| automatic.model.clone()), temperature: requested.temperature.or(automatic.temperature), - reasoning: requested.reasoning.or(automatic.reasoning), + reasoning: requested + .reasoning + .clone() + .or_else(|| automatic.reasoning.clone()), base_url: requested.base_url.clone(), api_key_env: requested.api_key_env.clone(), no_auth: requested.no_auth, @@ -211,7 +214,7 @@ fn apply_model_overrides_to_yaml( serde_yaml::to_value(temperature).context("serialize temperature")?, ); } - if let Some(reasoning) = overrides.reasoning { + if let Some(reasoning) = &overrides.reasoning { set_yaml_key(agent, "reasoning", serde_yaml::to_value(reasoning)?); } if overrides.base_url.is_some() || overrides.api_key_env.is_some() || overrides.no_auth { @@ -557,6 +560,8 @@ mod tests { ReasoningPreference::Off, ReasoningPreference::None, ReasoningPreference::Default, + ReasoningPreference::Custom("future-next".into()), + ReasoningPreference::Custom("on".into()), ] { let mut yaml: YamlValue = serde_yaml::from_str(&raw).unwrap(); apply_model_overrides_to_yaml( @@ -564,7 +569,7 @@ mod tests { &config, &ModelOverrides { model: Some("selected-api-model".into()), - reasoning: Some(reasoning), + reasoning: Some(reasoning.clone()), ..Default::default() }, ) diff --git a/apps/orchestral-cli/src/tui/menu.rs b/apps/orchestral-cli/src/tui/menu.rs index 6acb59be..225e4df2 100644 --- a/apps/orchestral-cli/src/tui/menu.rs +++ b/apps/orchestral-cli/src/tui/menu.rs @@ -142,7 +142,7 @@ pub(crate) const COMMANDS: &[(&str, &str, &str)] = &[ ( "/reasoning", "Change reasoning", - "Inspect the current model's reasoning controls for the next request", + "Inspect declared controls, or /reasoning ; effort: sends a literal effort", ), ( "/copy", diff --git a/apps/orchestral-cli/src/tui/models.rs b/apps/orchestral-cli/src/tui/models.rs index 02e81391..625a8551 100644 --- a/apps/orchestral-cli/src/tui/models.rs +++ b/apps/orchestral-cli/src/tui/models.rs @@ -131,18 +131,31 @@ pub(super) async fn reasoning(metadata: &HostMetadata, current: &str) -> Result< } fn reasoning_choices(model: &DiscoveredModel) -> Vec { - use ReasoningPreference as R; - model.reasoning.clone().unwrap_or_else(|| { - vec![ - R::Default, - R::None, - R::Minimal, - R::Low, - R::Medium, - R::High, - R::XHigh, - R::Max, - ] + model + .reasoning + .clone() + .unwrap_or_else(|| vec![ReasoningPreference::Default]) +} + +pub(super) fn reasoning_argument(command: &str) -> Option<&str> { + let rest = command.strip_prefix("/reasoning")?; + rest.starts_with(char::is_whitespace).then(|| rest.trim()) +} + +pub(super) fn explicit_reasoning( + metadata: &HostMetadata, + current: &str, + value: &str, +) -> Result { + let value = value + .parse::() + .map_err(anyhow::Error::msg)?; + // Validate protocol support without requiring optional model discovery. + crate::model_controls::openai_reasoning(&metadata.model_backend, value.clone())?; + Ok(Selection::Reasoning { + backend: metadata.model_backend.name.clone(), + model: current.to_owned(), + value, }) } @@ -154,7 +167,7 @@ fn reasoning_menu(metadata: &HostMetadata, model: &DiscoveredModel) -> Menu { reasoning_choices(model) .into_iter() .map(|value| { - let description = match value { + let description = match &value { ReasoningPreference::Default if model.thinking_default_enabled == Some(true) => { @@ -166,7 +179,7 @@ fn reasoning_menu(metadata: &HostMetadata, model: &DiscoveredModel) -> Menu { "Use service default (thinking off); omit controls" } ReasoningPreference::Default if !declared => { - "Capabilities not declared; omit controls by default" + "Capabilities not declared; use /reasoning or --reasoning for the service to validate an explicit request" } ReasoningPreference::Default => "Use service default; omit reasoning controls", ReasoningPreference::On => { @@ -179,7 +192,7 @@ fn reasoning_menu(metadata: &HostMetadata, model: &DiscoveredModel) -> Menu { } }; choice( - value.as_str(), + &value.to_string(), Selection::Reasoning { backend: metadata.model_backend.name.clone(), model: model.id.clone(), diff --git a/apps/orchestral-cli/src/tui/models/tests.rs b/apps/orchestral-cli/src/tui/models/tests.rs index 23550b55..88a251ed 100644 --- a/apps/orchestral-cli/src/tui/models/tests.rs +++ b/apps/orchestral-cli/src/tui/models/tests.rs @@ -191,9 +191,69 @@ fn binary_reasoning_menu_lists_only_default_on_off_and_marks_unknown_explicitly( "selectable choices must not become a read-only detail panel" ); assert!(menu.choices[0].description.contains("not declared")); - assert!(menu - .choices - .iter() - .filter(|choice| choice.label != "default") - .all(|choice| choice.description.contains("validated by the service"))); + assert_eq!(menu.choices.len(), 1); + assert!(menu.choices[0].description.contains("/reasoning ")); +} + +#[test] +fn declared_efforts_round_trip_through_menu_and_selection_without_local_control_aliases() { + let metadata = metadata("http://127.0.0.1:1/v1"); + for (name, label) in [ + ("ultra", "ultra"), + ("future-next", "future-next"), + ("HIGH", "HIGH"), + ("on", "effort:on"), + ("off", "effort:off"), + ("default", "effort:default"), + ("effort:on", "effort:effort:on"), + ] { + let model = + crate::model_controls::discovered_model(orchestral_model_openai::DiscoveredModel { + id: "model".into(), + max_context_tokens: None, + reasoning: Some(orchestral_model_openai::OpenAiReasoningCapabilities { + supported_efforts: Some(vec![name.parse().unwrap()]), + thinking: None, + }), + }); + let menu = reasoning_menu(&metadata, &model); + assert_eq!(menu.choices.len(), 2); + assert_eq!(menu.choices[1].label, label); + let selection = serde_json::from_str(&menu.choices[1].value).unwrap(); + let mut overrides = ModelOverrides::default(); + apply_selection(&metadata, "model", &mut overrides, selection).unwrap(); + let control = crate::model_controls::openai_reasoning( + &metadata.model_backend, + overrides.reasoning.unwrap(), + ) + .unwrap() + .unwrap(); + assert_eq!( + control, + orchestral_model_openai::OpenAiReasoningControl::Effort(name.parse().unwrap()) + ); + } +} + +#[test] +fn explicit_reasoning_command_needs_no_discovery_and_preserves_custom_effort() { + let metadata = metadata("http://127.0.0.1:1/v1"); + for (command, expected) in [ + ("/reasoning future-next", "future-next"), + ("/reasoning\tHIGH", "HIGH"), + ("/reasoning effort:on", "on"), + ] { + let argument = reasoning_argument(command).unwrap(); + let selection = explicit_reasoning(&metadata, "model", argument).unwrap(); + let mut overrides = ModelOverrides::default(); + apply_selection(&metadata, "model", &mut overrides, selection).unwrap(); + assert_eq!(overrides.model.as_deref(), Some("model")); + assert_eq!( + overrides.reasoning, + Some(ReasoningPreference::Custom(expected.into())) + ); + } + assert!(reasoning_argument("/reasoning").is_none()); + assert!(reasoning_argument("/reasoningful high").is_none()); + assert!(explicit_reasoning(&metadata, "model", "effort:").is_err()); } diff --git a/apps/orchestral-cli/src/tui/services.rs b/apps/orchestral-cli/src/tui/services.rs index c2abc59d..a0ff9716 100644 --- a/apps/orchestral-cli/src/tui/services.rs +++ b/apps/orchestral-cli/src/tui/services.rs @@ -92,7 +92,8 @@ impl Tasks { if (matches!( name.as_str(), "/model" | "/model profiles" | "/reasoning" | "/new" - ) || matches!(selection, Some((MenuKind::Models | MenuKind::Sessions, _)))) + ) || super::models::reasoning_argument(&name).is_some() + || matches!(selection, Some((MenuKind::Models | MenuKind::Sessions, _)))) && active { state.ui_notice = Some( @@ -156,6 +157,7 @@ impl Tasks { self.generation = self.generation.wrapping_add(1); let generation = self.generation; let changes_host_state = name == "/new" + || super::models::reasoning_argument(&name).is_some() || matches!(selection, Some((MenuKind::Models | MenuKind::Sessions, _))) || matches!(action, Some(LocalAction::SetSkillEnabled { .. })) || (name.starts_with("/skills ") && name.trim() != "/skills list"); @@ -317,6 +319,17 @@ pub(crate) async fn command( "/reasoning" => Ok(Response::Menu( super::models::reasoning(&host.metadata, &host.model).await?, )), + command if super::models::reasoning_argument(command).is_some() => { + let value = super::models::reasoning_argument(command).unwrap(); + let selection = super::models::explicit_reasoning(&host.metadata, &host.model, value)?; + choose( + host, + options, + MenuKind::Models, + serde_json::to_string(&selection)?, + ) + .await + } "/resume" => { let sessions = host .session_history diff --git a/apps/orchestral-cli/tests/agent_live_e2e/tui_experience.rs b/apps/orchestral-cli/tests/agent_live_e2e/tui_experience.rs index 6fc26c6f..1e51f9a3 100644 --- a/apps/orchestral-cli/tests/agent_live_e2e/tui_experience.rs +++ b/apps/orchestral-cli/tests/agent_live_e2e/tui_experience.rs @@ -520,7 +520,8 @@ fn tui_pty_discovers_models_and_preserves_reasoning_when_resuming_a_session() { repeat_handler: false, body: serde_json::to_vec(&json!({"data":[ {"id":"fixture-model", "max_model_len":32768}, - {"id":"api-alternate", "max_model_len":32768, "reasoning":{"thinking":{"default_enabled":true}}} + {"id":"api-alternate", "max_model_len":32768, "reasoning":{ + "thinking":{"default_enabled":true}, "supported_efforts":["future-next", "on"]}} ]})) .unwrap(), } @@ -552,6 +553,20 @@ fn tui_pty_discovers_models_and_preserves_reasoning_when_resuming_a_session() { assert!(model_request_text(&request.body).contains("API_SELECTION_CONFIRMED")); openai_text_response("RESUMED_SELECTION_CONFIRMED") }), + Box::new(|request| { + assert_eq!(request.body["model"], "api-alternate"); + assert_eq!(request.body["reasoning_effort"], "future-next"); + assert!(request.body.get("chat_template_kwargs").is_none()); + assert!(model_request_text(&request.body).contains("RESUMED_SELECTION_CONFIRMED")); + openai_text_response("FUTURE_EFFORT_CONFIRMED") + }), + Box::new(|request| { + assert_eq!(request.body["model"], "api-alternate"); + assert_eq!(request.body["reasoning_effort"], "on"); + assert!(request.body.get("chat_template_kwargs").is_none()); + assert!(model_request_text(&request.body).contains("FUTURE_EFFORT_CONFIRMED")); + openai_text_response("LITERAL_EFFORT_CONFIRMED") + }), ], Some(models), ); @@ -582,7 +597,7 @@ fn tui_pty_discovers_models_and_preserves_reasoning_when_resuming_a_session() { ); tui.send_paste("/reasoning"); tui.wait_for_screen( - |s| s.contains("Reasoning") && s.contains("Disable thinking explicitly"), + |s| s.contains("Reasoning") && s.contains("Use service default (thinking on)"), LOCAL_PROCESS_TIMEOUT, ); tui.send(b"off\r"); @@ -618,11 +633,36 @@ fn tui_pty_discovers_models_and_preserves_reasoning_when_resuming_a_session() { |s| s.contains("RESUMED_SELECTION_CONFIRMED") && s.contains("replied"), LOCAL_PROCESS_TIMEOUT, ); + tui.send_paste("/reasoning"); + tui.wait_for_screen( + |s| s.contains("Reasoning") && s.contains("future-next"), + LOCAL_PROCESS_TIMEOUT, + ); + tui.send(b"future-next\r"); + tui.wait_for_screen( + |s| s.contains("Reasoning future-next selected"), + LOCAL_PROCESS_TIMEOUT, + ); + tui.send_paste("continue with the declared future effort"); + tui.wait_for_screen( + |s| s.contains("FUTURE_EFFORT_CONFIRMED") && s.contains("replied"), + LOCAL_PROCESS_TIMEOUT, + ); + tui.send_paste("/reasoning effort:on"); + tui.wait_for_screen( + |s| s.contains("Reasoning effort:on selected"), + LOCAL_PROCESS_TIMEOUT, + ); + tui.send_paste("continue with the literal provider effort"); + tui.wait_for_screen( + |s| s.contains("LITERAL_EFFORT_CONFIRMED") && s.contains("replied"), + LOCAL_PROCESS_TIMEOUT, + ); tui.send(b"\x04"); let output = tui.finish(LOCAL_PROCESS_TIMEOUT); assert!(output.status.success()); output.assert_terminal_restored(); - assert_eq!(server.join().unwrap().len(), 3); + assert_eq!(server.join().unwrap().len(), 5); } #[cfg(windows)] diff --git a/core/orchestral-core/src/config/reasoning.rs b/core/orchestral-core/src/config/reasoning.rs index bf61f654..a896e727 100644 --- a/core/orchestral-core/src/config/reasoning.rs +++ b/core/orchestral-core/src/config/reasoning.rs @@ -3,8 +3,8 @@ use serde::{Deserialize, Serialize}; /// An explicit reasoning preference, distinct from an absent configuration override. -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(try_from = "String", into = "String")] pub enum ReasoningPreference { /// Leave the provider's default unchanged; omit reasoning controls from requests. #[default] @@ -17,6 +17,8 @@ pub enum ReasoningPreference { High, XHigh, Max, + /// A provider-defined effort name, preserved without normalization. + Custom(String), /// Enable thinking when the provider exposes a binary thinking control. On, /// Disable thinking when the provider exposes a binary thinking control. @@ -24,7 +26,16 @@ pub enum ReasoningPreference { } impl ReasoningPreference { - pub fn as_str(self) -> &'static str { + pub fn as_str(&self) -> std::borrow::Cow<'_, str> { + if let Self::Custom(value) = self { + return if matches!(value.as_str(), "default" | "on" | "off") + || value.starts_with("effort:") + { + format!("effort:{value}").into() + } else { + value.as_str().into() + }; + } match self { Self::Default => "default", Self::None => "none", @@ -36,13 +47,32 @@ impl ReasoningPreference { Self::Max => "max", Self::On => "on", Self::Off => "off", + Self::Custom(_) => unreachable!(), } + .into() + } + + /// Interpret a service-declared name as an effort, never as a local toggle/default. + pub fn from_effort(value: &str) -> Result { + if value.trim().is_empty() { + return Err("reasoning effort must be a non-empty string".to_owned()); + } + Ok(match value { + "none" => Self::None, + "minimal" => Self::Minimal, + "low" => Self::Low, + "medium" => Self::Medium, + "high" => Self::High, + "xhigh" => Self::XHigh, + "max" => Self::Max, + _ => Self::Custom(value.to_owned()), + }) } } impl std::fmt::Display for ReasoningPreference { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(self.as_str()) + f.write_str(&self.as_str()) } } @@ -50,8 +80,75 @@ impl std::str::FromStr for ReasoningPreference { type Err = String; fn from_str(value: &str) -> Result { - serde_json::from_value(serde_json::Value::String(value.to_owned())).map_err(|_| { - "expected default, none, minimal, low, medium, high, xhigh, max, on, or off".to_owned() - }) + match value { + "default" => Ok(Self::Default), + "on" => Ok(Self::On), + "off" => Ok(Self::Off), + _ => Self::from_effort(value.strip_prefix("effort:").unwrap_or(value)), + } + } +} + +impl TryFrom for ReasoningPreference { + type Error = String; + + fn try_from(value: String) -> Result { + value.parse() + } +} + +impl From for String { + fn from(value: ReasoningPreference) -> Self { + value.to_string() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn provider_efforts_round_trip_without_becoming_local_controls() { + for name in [ + "ultra", + "future-next", + "HIGH", + "default", + "on", + "off", + "effort:on", + "effort:", + ] { + let effort = ReasoningPreference::from_effort(name).unwrap(); + assert!(matches!(effort, ReasoningPreference::Custom(_))); + let json = serde_json::to_value(&effort).unwrap(); + assert_eq!( + serde_json::from_value::(json).unwrap(), + effort + ); + assert_eq!( + effort.to_string().parse::().unwrap(), + effort + ); + } + assert_eq!( + "default".parse::().unwrap(), + ReasoningPreference::Default + ); + assert_eq!( + "on".parse::().unwrap(), + ReasoningPreference::On + ); + assert_eq!( + "off".parse::().unwrap(), + ReasoningPreference::Off + ); + assert_eq!( + "none".parse::().unwrap(), + ReasoningPreference::None + ); + for invalid in ["", " ", "effort:", "effort: "] { + assert!(invalid.parse::().is_err()); + } } } diff --git a/plugins/orchestral-agent-codex/src/lib.rs b/plugins/orchestral-agent-codex/src/lib.rs index 00d5032d..12613658 100644 --- a/plugins/orchestral-agent-codex/src/lib.rs +++ b/plugins/orchestral-agent-codex/src/lib.rs @@ -733,7 +733,10 @@ impl CodexConnector { dispatch_journal_dir: None, ..CodexAppServerConfig::default() }, - creation_schema: codex_session_creation_schema(), + creation_schema: codex_creation_schema( + &CodexModelCache::default(), + &CodexUserDefaults::default(), + ), artifact_resolver: None, artifact_blob_store: None, artifact_publisher: None, @@ -763,7 +766,10 @@ impl CodexConnector { dispatch_journal_dir: None, ..CodexAppServerConfig::default() }, - creation_schema: codex_session_creation_schema(), + creation_schema: codex_creation_schema( + &CodexModelCache::default(), + &CodexUserDefaults::default(), + ), artifact_resolver: None, artifact_blob_store: None, artifact_publisher: None, @@ -1407,92 +1413,96 @@ struct CodexUserDefaults { } fn codex_session_creation_schema() -> Value { - const FALLBACK_MODELS: [&str; 6] = [ - "gpt-5.6-sol", - "gpt-5.6-terra", - "gpt-5.6-luna", - "gpt-5.5", - "gpt-5.4", - "gpt-5.4-mini", - ]; - const REASONING_ORDER: [&str; 6] = ["low", "medium", "high", "xhigh", "max", "ultra"]; - let home = codex_home(); let cache = fs::read_to_string(home.join("models_cache.json")) .ok() .and_then(|contents| serde_json::from_str::(&contents).ok()) .unwrap_or_default(); + let defaults = fs::read_to_string(home.join("config.toml")) + .ok() + .and_then(|contents| toml::from_str::(&contents).ok()) + .unwrap_or_default(); + codex_creation_schema(&cache, &defaults) +} + +fn codex_creation_schema(cache: &CodexModelCache, defaults: &CodexUserDefaults) -> Value { let visible_models = cache .models .iter() - .filter(|model| model.visibility == "list" && model.supported_in_api) - .collect::>(); - let models = if visible_models.is_empty() { - FALLBACK_MODELS - .iter() - .map(|model| (*model).to_owned()) - .collect::>() - } else { - visible_models - .iter() - .map(|model| model.slug.clone()) - .collect::>() - }; - let mut reasoning_efforts = REASONING_ORDER - .iter() - .filter(|effort| { - visible_models.is_empty() - || visible_models.iter().any(|model| { - model - .supported_reasoning_levels - .iter() - .any(|level| level.effort == **effort) - }) + .filter(|model| { + model.visibility == "list" && model.supported_in_api && !model.slug.trim().is_empty() }) - .map(|effort| (*effort).to_owned()) .collect::>(); - if reasoning_efforts.is_empty() { - reasoning_efforts = REASONING_ORDER - .iter() - .map(|effort| (*effort).to_owned()) - .collect(); - } - let defaults = fs::read_to_string(home.join("config.toml")) - .ok() - .and_then(|contents| toml::from_str::(&contents).ok()) - .unwrap_or_default(); let default_model = defaults .model - .filter(|model| models.contains(model)) - .unwrap_or_else(|| models[0].clone()); + .as_deref() + .filter(|model| !model.trim().is_empty()); let model_default_effort = visible_models .iter() - .find(|model| model.slug == default_model) - .and_then(|model| model.default_reasoning_level.clone()); + .find(|model| Some(model.slug.as_str()) == default_model) + .and_then(|model| model.default_reasoning_level.as_deref()); let default_reasoning_effort = defaults .model_reasoning_effort - .filter(|effort| reasoning_efforts.contains(effort)) + .as_deref() + .filter(|effort| !effort.trim().is_empty()) .or(model_default_effort) - .filter(|effort| reasoning_efforts.contains(effort)) - .unwrap_or_else(|| "medium".to_owned()); + .filter(|effort| !effort.trim().is_empty()); + let mut models = Vec::new(); + let mut reasoning_efforts = Vec::new(); + for model in &visible_models { + if !models.contains(&model.slug.as_str()) { + models.push(model.slug.as_str()); + } + for level in &model.supported_reasoning_levels { + if !level.effort.trim().is_empty() + && !reasoning_efforts.contains(&level.effort.as_str()) + { + reasoning_efforts.push(level.effort.as_str()); + } + } + } + // Preserve native catalog strings and explicit user defaults without a + // client-owned vocabulary. Codex validates the selected model/effort pair. + let has_catalog_models = !models.is_empty(); + let has_catalog_efforts = !reasoning_efforts.is_empty(); + if let Some(model) = default_model { + if !models.contains(&model) { + models.push(model); + } + } + if let Some(effort) = default_reasoning_effort { + if !reasoning_efforts.contains(&effort) { + reasoning_efforts.push(effort); + } + } + let mut model_field = json!({ + "type": "string", "title": "模型(留空使用 Codex 默认)", "minLength": 1 + }); + let mut reasoning_field = json!({ + "type": "string", "title": "推理强度(由所选模型验证)", "minLength": 1 + }); + // Missing metadata leaves an optional text field, rather than advertising + // a fixed set of invented model IDs or effort levels. + if has_catalog_models { + model_field["enum"] = json!(models); + } + if has_catalog_efforts { + reasoning_field["enum"] = json!(reasoning_efforts); + } + if let Some(model) = default_model { + model_field["default"] = json!(model); + } + if let Some(effort) = default_reasoning_effort { + reasoning_field["default"] = json!(effort); + } json!({ "type": "object", "additionalProperties": false, - "required": ["model", "reasoning_effort", "sandbox_mode", "approval_policy"], + "required": ["sandbox_mode", "approval_policy"], "properties": { - "model": { - "type": "string", - "title": "模型", - "default": default_model, - "enum": models - }, - "reasoning_effort": { - "type": "string", - "title": "推理强度", - "default": default_reasoning_effort, - "enum": reasoning_efforts - }, + "model": model_field, + "reasoning_effort": reasoning_field, "sandbox_mode": { "type": "string", "title": "文件与命令权限", @@ -2069,6 +2079,142 @@ mod tests { use super::*; + #[test] + fn native_catalog_preserves_new_efforts_and_explicit_defaults() { + let mut cache: CodexModelCache = serde_json::from_value(json!({"models": [{ + "slug": "native-future-model", "visibility": "list", "supported_in_api": true, + "default_reasoning_level": "ultra", + "supported_reasoning_levels": [ + {"effort": "low"}, {"effort": "ultra"}, {"effort": "future-Deep"}, + {"effort": "ultra"}, {"effort": " "} + ] + }]})) + .unwrap(); + let defaults = CodexUserDefaults { + model: Some("native-future-model".into()), + model_reasoning_effort: None, + }; + let schema = codex_creation_schema(&cache, &defaults); + assert_eq!( + schema["properties"]["reasoning_effort"]["enum"], + json!(["low", "ultra", "future-Deep"]) + ); + assert_eq!(schema["properties"]["reasoning_effort"]["default"], "ultra"); + + cache.models[0] + .supported_reasoning_levels + .push(CodexReasoningLevel { + effort: "new-after-refresh".into(), + }); + let refreshed = codex_creation_schema(&cache, &defaults); + assert!(refreshed["properties"]["reasoning_effort"]["enum"] + .as_array() + .unwrap() + .contains(&json!("new-after-refresh"))); + let configured = codex_creation_schema( + &cache, + &CodexUserDefaults { + model: Some("explicit-new-model".into()), + model_reasoning_effort: Some("explicit-new-effort".into()), + }, + ); + assert_eq!( + configured["properties"]["model"]["default"], + "explicit-new-model" + ); + assert_eq!( + configured["properties"]["reasoning_effort"]["default"], + "explicit-new-effort" + ); + assert!(configured["properties"]["reasoning_effort"]["enum"] + .as_array() + .unwrap() + .contains(&json!("explicit-new-effort"))); + } + + #[test] + fn missing_native_catalog_uses_native_defaults_without_invented_choices() { + let schema = + codex_creation_schema(&CodexModelCache::default(), &CodexUserDefaults::default()); + for field in ["model", "reasoning_effort"] { + assert!(schema["properties"][field].get("enum").is_none()); + assert!(schema["properties"][field].get("default").is_none()); + assert!(!schema["required"] + .as_array() + .unwrap() + .contains(&json!(field))); + } + let settings = session_creation_settings(&json!({ + "sandbox_mode": "workspace-write", "approval_policy": "on-request" + })) + .unwrap(); + assert!(settings.model.is_none()); + assert!(settings.reasoning_effort.is_none()); + + let configured = codex_creation_schema( + &CodexModelCache::default(), + &CodexUserDefaults { + model: Some("configured-model".into()), + model_reasoning_effort: Some("configured-effort".into()), + }, + ); + assert_eq!( + configured["properties"]["model"]["default"], + "configured-model" + ); + assert_eq!( + configured["properties"]["reasoning_effort"]["default"], + "configured-effort" + ); + for field in ["model", "reasoning_effort"] { + assert!(configured["properties"][field].get("enum").is_none()); + } + } + + #[tokio::test] + async fn native_session_preserves_ultra_and_future_efforts_on_the_rpc() { + for effort in ["ultra", "future-Deep"] { + let (client_io, server_io) = duplex(64 * 1024); + let (client_read, client_write) = tokio::io::split(client_io); + let (server_read, mut server_write) = tokio::io::split(server_io); + let rpc = CodexRpcClient::from_io( + client_read, + client_write, + Duration::from_secs(1), + 1024 * 1024, + ); + let connector = CodexConnector::with_client(rpc, "codex/test"); + let server = tokio::spawn(async move { + let mut requests = BufReader::new(server_read).lines(); + let start = read_request(&mut requests).await; + assert_eq!(start["method"], "thread/start"); + assert_eq!( + start["params"]["config"], + json!({"model_reasoning_effort": effort}) + ); + write_result( + &mut server_write, + &start, + json!({ + "thread": thread("future-effort-session", Value::Null), + "model": "native-model", "reasoningEffort": effort + }), + ) + .await; + }); + let session = connector.create_session(CreateAgentSessionRequest { + cwd: None, title: None, + options: json!({"sandbox_mode":"workspace-write", "approval_policy":"on-request", "model":"native-model", "reasoning_effort":effort}), + extensions: BTreeMap::new(), + }).await.unwrap(); + assert_eq!( + session.execution_profile.reasoning_effort.as_deref(), + Some(effort) + ); + server.await.unwrap(); + } + } + const ONE_PIXEL_PNG: &str = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII="; @@ -3248,14 +3394,11 @@ mod tests { .as_ref() .and_then(|creation| creation.input_schema.as_ref()) .expect("Codex creation options must be declared"); - assert!(!creation_schema["properties"]["model"]["enum"] - .as_array() - .unwrap() - .is_empty()); - assert!(!creation_schema["properties"]["reasoning_effort"]["enum"] - .as_array() - .unwrap() - .is_empty()); + assert_eq!(creation_schema["properties"]["model"]["type"], "string"); + assert_eq!( + creation_schema["properties"]["reasoning_effort"]["type"], + "string" + ); let created = connector .create_session(CreateAgentSessionRequest { diff --git a/plugins/orchestral-model-openai/src/endpoint.rs b/plugins/orchestral-model-openai/src/endpoint.rs index 5eed676a..462c9cdc 100644 --- a/plugins/orchestral-model-openai/src/endpoint.rs +++ b/plugins/orchestral-model-openai/src/endpoint.rs @@ -244,7 +244,9 @@ mod tests { json!({"thinking": {}}), json!({"thinking": {"default_enabled": "secret"}}), json!({"supported_efforts": "secret"}), - json!({"supported_efforts": ["secret"]}), + json!({"supported_efforts": [""]}), + json!({"supported_efforts": [" "]}), + json!({"supported_efforts": [false]}), ] { let error = parse_model_metadata(&json!({"data": [{"id": "model", "reasoning": reasoning}]})) @@ -259,6 +261,42 @@ mod tests { .is_err()); } + #[test] + fn discovered_efforts_preserve_future_names_case_and_reserved_local_words() { + let names = [ + "ultra", + "future-next", + "HIGH", + "on", + "off", + "default", + "effort:high", + ]; + let models = parse_model_metadata(&json!({"data": [{"id": "future", "max_model_len": 8192, + "reasoning": {"supported_efforts": names}}]})) + .unwrap(); + assert_eq!(models[0].max_context_tokens, Some(8192)); + let efforts = models[0] + .reasoning + .as_ref() + .unwrap() + .supported_efforts + .as_ref() + .unwrap(); + let actual = efforts + .iter() + .map(OpenAiReasoningEffort::as_str) + .collect::>(); + assert_eq!(actual, names.into_iter().collect()); + assert_eq!( + serde_json::to_value(efforts).unwrap(), + json!(efforts + .iter() + .map(OpenAiReasoningEffort::as_str) + .collect::>()) + ); + } + #[test] fn duplicate_capacity_minimum_and_reasoning_agreement_are_independent() { let models = parse_model_metadata(&json!({"data": [ diff --git a/plugins/orchestral-model-openai/src/lib.rs b/plugins/orchestral-model-openai/src/lib.rs index cdc747cb..5c913d09 100644 --- a/plugins/orchestral-model-openai/src/lib.rs +++ b/plugins/orchestral-model-openai/src/lib.rs @@ -137,8 +137,13 @@ impl OpenAiCompatibleBackend { if let Value::Object(sampling) = sampling { body.extend(sampling); } - match self.reasoning { + match &self.reasoning { Some(OpenAiReasoningControl::Effort(effort)) => { + if effort.as_str().trim().is_empty() { + return Err(ModelError::invalid_request( + "reasoning effort must be non-empty", + )); + } body.insert("reasoning_effort".to_owned(), json!(effort)); } Some(OpenAiReasoningControl::Thinking(enabled)) => { @@ -268,7 +273,7 @@ impl ModelTokenMeter for OpenAiCompatibleBackend { let config = config.expect("OpenAI token meter scalar configuration is serializable"); // Preserve existing recovery identities when no control was selected. // Explicit controls affect both wire size and the model's continuation. - let config = match self.reasoning { + let config = match &self.reasoning { Some(control) => serde_json::to_vec(&("reasoning-control/v1", config, control)) .expect("typed reasoning control is serializable"), None => config, @@ -331,7 +336,7 @@ impl ModelBackend for OpenAiCompatibleBackend { Value::String(encoding_identity.to_owned()), ); } - if let Some(control) = self.reasoning { + if let Some(control) = &self.reasoning { extensions.insert( "openai-compatible/reasoning-control".to_owned(), json!(control), diff --git a/plugins/orchestral-model-openai/src/reasoning.rs b/plugins/orchestral-model-openai/src/reasoning.rs index 874f2644..c72d7ebe 100644 --- a/plugins/orchestral-model-openai/src/reasoning.rs +++ b/plugins/orchestral-model-openai/src/reasoning.rs @@ -1,12 +1,12 @@ -//! Explicit reasoning requests and optional model-declared controls. A known -//! wire vocabulary is not a claim that every endpoint/model supports its values. +//! Explicit reasoning requests and optional model-declared controls. Provider +//! effort names are extensible and preserve their exact spelling on the wire. use std::{fmt, str::FromStr}; use serde::{Deserialize, Serialize}; -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] +#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] +#[serde(try_from = "String", into = "String")] pub enum OpenAiReasoningEffort { None, Minimal, @@ -15,10 +15,11 @@ pub enum OpenAiReasoningEffort { High, XHigh, Max, + Custom(String), } impl OpenAiReasoningEffort { - /// Recognized request values, independently of a model's advertised support. + /// Common spellings, not an exhaustive capability list. pub const ALL: [Self; 7] = [ Self::None, Self::Minimal, @@ -29,7 +30,7 @@ impl OpenAiReasoningEffort { Self::Max, ]; - pub const fn as_str(self) -> &'static str { + pub fn as_str(&self) -> &str { match self { Self::None => "none", Self::Minimal => "minimal", @@ -38,6 +39,7 @@ impl OpenAiReasoningEffort { Self::High => "high", Self::XHigh => "xhigh", Self::Max => "max", + Self::Custom(value) => value, } } } @@ -52,20 +54,34 @@ impl FromStr for OpenAiReasoningEffort { type Err = String; fn from_str(value: &str) -> Result { - Self::ALL + if value.trim().is_empty() { + return Err("reasoning effort must be a non-empty string".to_owned()); + } + Ok(Self::ALL .into_iter() .find(|effort| effort.as_str() == value) - .ok_or_else(|| { - "expected reasoning effort none, minimal, low, medium, high, xhigh, or max" - .to_owned() - }) + .unwrap_or_else(|| Self::Custom(value.to_owned()))) + } +} + +impl TryFrom for OpenAiReasoningEffort { + type Error = String; + + fn try_from(value: String) -> Result { + value.parse() + } +} + +impl From for String { + fn from(value: OpenAiReasoningEffort) -> Self { + value.to_string() } } /// Select one wire control, preventing contradictory standard/extension fields. /// Absence of this enum means the service's default; `Effort(None)` is an /// explicit request to disable reasoning and must not be omitted. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] #[serde(tag = "kind", content = "value", rename_all = "snake_case")] pub enum OpenAiReasoningControl { Effort(OpenAiReasoningEffort), diff --git a/plugins/orchestral-model-openai/src/reasoning/tests.rs b/plugins/orchestral-model-openai/src/reasoning/tests.rs index 9cbada9c..3e175205 100644 --- a/plugins/orchestral-model-openai/src/reasoning/tests.rs +++ b/plugins/orchestral-model-openai/src/reasoning/tests.rs @@ -23,24 +23,30 @@ fn backend(format: OpenAiToolResultFormat) -> OpenAiCompatibleBackend { #[test] fn reasoning_effort_vocabulary_is_typed_and_none_is_an_explicit_value() { - for effort in OpenAiReasoningEffort::ALL { + for effort in OpenAiReasoningEffort::ALL.into_iter().chain( + [ + "ultra", + "future-next", + "HIGH", + "default", + "on", + "off", + "effort:future", + ] + .into_iter() + .map(|name| name.parse().unwrap()), + ) { assert_eq!( effort.as_str().parse::().unwrap(), effort ); - assert_eq!(serde_json::to_value(effort).unwrap(), effort.as_str()); + assert_eq!(serde_json::to_value(&effort).unwrap(), effort.as_str()); assert_eq!( serde_json::from_value::(json!(effort.as_str())).unwrap(), effort ); } - for invalid in [ - json!("default"), - json!("on"), - json!("HIGH"), - json!(false), - json!(0), - ] { + for invalid in [json!(""), json!(" "), json!(false), json!(0)] { assert!(serde_json::from_value::(invalid).is_err()); } assert_eq!( @@ -53,17 +59,33 @@ fn reasoning_effort_vocabulary_is_typed_and_none_is_an_explicit_value() { ); } -#[test] -fn explicit_reasoning_changes_only_its_wire_control_and_recovery_identity() { - let request = crate::tests::request(); - let controls = OpenAiReasoningEffort::ALL +fn controls() -> impl Iterator { + OpenAiReasoningEffort::ALL .into_iter() + .chain( + [ + "ultra", + "future-next", + "HIGH", + "default", + "on", + "off", + "effort:future", + ] + .into_iter() + .map(|name| name.parse().unwrap()), + ) .map(OpenAiReasoningControl::Effort) .chain([ OpenAiReasoningControl::Thinking(false), OpenAiReasoningControl::Thinking(true), - ]); - for control in controls { + ]) +} + +#[test] +fn explicit_reasoning_changes_only_its_wire_control_and_recovery_identity() { + let request = crate::tests::request(); + for control in controls() { for format in [ OpenAiToolResultFormat::Text, OpenAiToolResultFormat::Json, @@ -77,9 +99,9 @@ fn explicit_reasoning_changes_only_its_wire_control_and_recovery_identity() { assert!(default_body.get("reasoning_effort").is_none()); assert!(default_body.get("chat_template_kwargs").is_none()); - let configured = original.with_reasoning_control(Some(control)); + let configured = original.with_reasoning_control(Some(control.clone())); let mut body = configured.build_request_body(&request).unwrap(); - match control { + match &control { OpenAiReasoningControl::Effort(effort) => { assert_eq!( body.as_object_mut().unwrap().remove("reasoning_effort"), @@ -125,14 +147,7 @@ fn explicit_reasoning_changes_only_its_wire_control_and_recovery_identity() { #[test] fn distinct_explicit_controls_cannot_share_the_same_meter_identity() { let mut digests = std::collections::BTreeSet::new(); - for control in OpenAiReasoningEffort::ALL - .into_iter() - .map(OpenAiReasoningControl::Effort) - .chain([ - OpenAiReasoningControl::Thinking(false), - OpenAiReasoningControl::Thinking(true), - ]) - { + for control in controls() { let digest = backend(OpenAiToolResultFormat::Yaml) .with_reasoning_control(Some(control)) .meter_descriptor() @@ -140,3 +155,13 @@ fn distinct_explicit_controls_cannot_share_the_same_meter_identity() { assert!(digests.insert(serde_json::to_string(&digest).unwrap())); } } + +#[test] +fn empty_programmatic_effort_is_rejected_before_sending_a_request() { + let backend = backend(OpenAiToolResultFormat::Json).with_reasoning_control(Some( + OpenAiReasoningControl::Effort(OpenAiReasoningEffort::Custom(" ".into())), + )); + assert!(backend + .build_request_body(&crate::tests::request()) + .is_err()); +} diff --git a/web/orchestral-web/dist/assets/orchestral-web-dxha89eb1d2c837c2ee.js b/web/orchestral-web/dist/assets/orchestral-web-dxh40c65c6d31d0e1.js similarity index 99% rename from web/orchestral-web/dist/assets/orchestral-web-dxha89eb1d2c837c2ee.js rename to web/orchestral-web/dist/assets/orchestral-web-dxh40c65c6d31d0e1.js index a61a2faf..8c217688 100644 --- a/web/orchestral-web/dist/assets/orchestral-web-dxha89eb1d2c837c2ee.js +++ b/web/orchestral-web/dist/assets/orchestral-web-dxh40c65c6d31d0e1.js @@ -1,2 +1,2 @@ function ut(c,t,e,n){if(n==="style"){c.style.setProperty(t,e);return}if(n){c.setAttributeNS(n,t,e);return}switch(t){case"value":c.tagName==="OPTION"?K(c,t,e):c.value!==e&&(c.value=e);break;case"initial_value":c.defaultValue=e;break;case"checked":c.checked=x(e);break;case"initial_checked":c.defaultChecked=x(e);break;case"selected":c.selected=x(e);break;case"initial_selected":c.defaultSelected=x(e);break;case"dangerous_inner_html":c.innerHTML=e;break;case"style":let r={};for(let _=0;_{for(let n of e)this.handleResizeEvent(n)})),this.resizeObserver.observe(t)}removeResizeObserver(t){this.resizeObserver&&this.resizeObserver.unobserve(t)}handleIntersectionEvent(t){let e=t.target,n=new CustomEvent("visible",{bubbles:!1,detail:t});e.dispatchEvent(n)}createIntersectionObserver(t){this.intersectionObserver||(this.intersectionObserver=new IntersectionObserver(e=>{for(let n of e)this.handleIntersectionEvent(n)})),this.intersectionObserver.observe(t)}removeIntersectionObserver(t){this.intersectionObserver&&this.intersectionObserver.unobserve(t)}createListener(t,e,n){if(t=="resize"?this.createResizeObserver(e):t=="visible"&&this.createIntersectionObserver(e),n)this.global[t]===void 0?(this.global[t]={active:1,callback:this.handler},this.root.addEventListener(t,this.handler)):this.global[t].active++;else{let r=e.getAttribute("data-dioxus-id");this.local[r]||(this.local[r]={}),e.addEventListener(t,this.handler)}}removeListener(t,e,n){e=="resize"?this.removeResizeObserver(t):e=="visible"?this.removeIntersectionObserver(t):n?this.removeBubblingListener(e):this.removeNonBubblingListener(t,e)}removeBubblingListener(t){this.global[t].active--,this.global[t].active===0&&(this.root.removeEventListener(t,this.global[t].callback),delete this.global[t])}removeNonBubblingListener(t,e){let n=t.getAttribute("data-dioxus-id");delete this.local[n][e],Object.keys(this.local[n]).length===0&&delete this.local[n],t.removeEventListener(e,this.handler)}removeAllNonBubblingListeners(t){let e=t.getAttribute("data-dioxus-id");delete this.local[e]}getNode(t){return this.nodes[t]}pushRoot(t){this.stack.push(t)}appendChildren(t,e){let n=this.nodes[t],r=this.stack.splice(this.stack.length-e);for(let _=0;_0;_--)n=n.nextSibling}return n}saveTemplate(t,e){this.templates[e]=t}hydrate_node(t,e){let n=t.getAttribute("data-node-hydration").split(","),r=e[parseInt(n[0])];if(this.nodes[r]=t,n.length>1){t.listening=n.length-1,t.setAttribute("data-dioxus-id",r.toString());for(let _=1;__.nextNode()?_.currentNode!==u:!1;for(;_.currentNode;){let h=_.currentNode;if(h.nodeType===Node.COMMENT_NODE){let y=h.textContent,J=y.split("placeholder");if(J.length>1){if(this.nodes[t[parseInt(J[1])]]=h,!g())break;continue}let G=y.split("node-id");if(G.length>1){let k=h.nextSibling;h.remove();let N,O;if(k.nodeType===Node.COMMENT_NODE){let ot=k.parentElement.insertBefore(document.createTextNode(""),k);N=k,O=ot}else O=k,N=O.nextSibling;_.currentNode=N,this.nodes[t[parseInt(G[1])]]=O;let it=h===r||!g();if(N.remove(),it)break;continue}}if(!g())break}}}setAttributeInner(t,e,n,r){ut(t,e,n,r)}};var v,I,w,C,L,F=class extends H{constructor(t){super(),this.d=t,this.m=null,this.p=null,this.ls=null,this.t=null,this.op=null,this.e=null,this.z=null,this.metaflags=null,this.u16buf=null,this.u16bufp=null,this.u32buf=null,this.u32bufp=null,this.u8buf=null,this.u8bufp=null,this.attr=[],this.attr_cache_hit=null,this.attr_cache_idx,this.get_attr=function(){return this.attr_cache_idx=this.u8buf[this.u8bufp++],this.attr_cache_idx&128?(this.attr_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.attr[this.attr_cache_idx&4294967167]=this.attr_cache_hit,this.attr_cache_hit):this.attr[this.attr_cache_idx&4294967167]},this.el=[],this.el_cache_hit=null,this.el_cache_idx,this.get_el=function(){return this.el_cache_idx=this.u8buf[this.u8bufp++],this.el_cache_idx&128?(this.el_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.el[this.el_cache_idx&4294967167]=this.el_cache_hit,this.el_cache_hit):this.el[this.el_cache_idx&4294967167]},this.evt=[],this.evt_cache_hit=null,this.evt_cache_idx,this.get_evt=function(){return this.evt_cache_idx=this.u8buf[this.u8bufp++],this.evt_cache_idx&128?(this.evt_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.evt[this.evt_cache_idx&4294967167]=this.evt_cache_hit,this.evt_cache_hit):this.evt[this.evt_cache_idx&4294967167]},this.namespace=[],this.namespace_cache_hit=null,this.namespace_cache_idx,this.get_namespace=function(){return this.namespace_cache_idx=this.u8buf[this.u8bufp++],this.namespace_cache_idx&128?(this.namespace_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.namespace[this.namespace_cache_idx&4294967167]=this.namespace_cache_hit,this.namespace_cache_hit):this.namespace[this.namespace_cache_idx&4294967167]},this.ns_cache=[],this.ns_cache_cache_hit=null,this.ns_cache_cache_idx,this.get_ns_cache=function(){return this.ns_cache_cache_idx=this.u8buf[this.u8bufp++],this.ns_cache_cache_idx&128?(this.ns_cache_cache_hit=this.s.substring(this.sp,this.sp+=this.u8buf[this.u8bufp++]),this.ns_cache[this.ns_cache_cache_idx&4294967167]=this.ns_cache_cache_hit,this.ns_cache_cache_hit):this.ns_cache[this.ns_cache_cache_idx&4294967167]},this.s="",this.lsp=null,this.sp=null,this.sl=null,this.c=new TextDecoder}update_memory(t){this.m=new DataView(t.buffer)}run(){if(this.metaflags=this.m.getUint32(this.d,!0),this.metaflags>>>6&1&&(this.ls=this.m.getUint32(this.d+24,!0)),this.p=this.ls,this.metaflags>>>4&1&&(this.t=this.m.getUint32(this.d+16,!0),this.u16buf=new Uint16Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%2)/2)),this.u16bufp=0,this.metaflags>>>3&1&&(this.t=this.m.getUint32(this.d+12,!0),this.u32buf=new Uint32Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%4)/4)),this.u32bufp=0,this.metaflags>>>5&1&&(this.t=this.m.getUint32(this.d+20,!0),this.u8buf=new Uint8Array(this.m.buffer,this.t,(this.m.buffer.byteLength-this.t-(this.m.buffer.byteLength-this.t)%1)/1)),this.u8bufp=0,this.metaflags&1&&(this.lsp=this.m.getUint32(this.d+4,!0)),this.metaflags>>>2&1)if(this.sl=this.m.getUint32(this.d+8,!0),this.metaflags>>>1&1){for(this.sp=this.lsp,this.s="",this.e=this.sp+(this.sl/4|0)*4;this.sp>8,(this.t&16711680)>>16,this.t>>24),this.sp+=4;for(;this.sp{this.handler(r,n,v)});break;case 25:this.nodes[this.u32buf[this.u32bufp++]]=this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let r=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,r})());break;case 26:{let r=this.stack.splice(this.stack.length-this.u16buf[this.u16bufp++]);this.loadChild((()=>{this.e=this.u8bufp+this.u32buf[this.u32bufp++];let u=this.u8buf.slice(this.u8bufp,this.e);return this.u8bufp=this.e,u})()).replaceWith(...r)}break;case 27:return!0}this.op>>>=8}}run_from_bytes(t){this.d=0,this.update_memory(new Uint8Array(t)),this.run()}};function Q(c,t,e,n){if(n==="style"){c.style.setProperty(t,e);return}if(n){c.setAttributeNS(n,t,e);return}switch(t){case"value":c.tagName==="OPTION"?X(c,t,e):c.value!==e&&(c.value=e);break;case"initial_value":c.defaultValue=e;break;case"checked":c.checked=E(e);break;case"initial_checked":c.defaultChecked=E(e);break;case"selected":c.selected=E(e);break;case"initial_selected":c.defaultSelected=E(e);break;case"dangerous_inner_html":c.innerHTML=e;break;case"style":let r={};for(let _=0;_0){this.waiting.shift()(t);return}this.pending.push(t)}async recv(){return new Promise((t,e)=>{if(this.pending.length>0){t(this.pending.shift());return}this.waiting.push(t)})}},B=class{inner;constructor(t){this.inner=new WeakRef(t)}rustSend(t){let e=this.inner.deref();e&&e.rustSend(t)}async rustRecv(){let t=this.inner.deref();if(t)return await t.rustRecv()}},Y=class{weak(){return new B(this)}};globalThis.__nextChannelId=0;globalThis.__channels=[];var M=class extends Y{js_to_rust;rust_to_js;owner;id;constructor(t){super(),this.owner=t,this.js_to_rust=new z,this.rust_to_js=new z,this.id=globalThis.__nextChannelId,globalThis.__channels[this.id]=this,globalThis.__nextChannelId+=1}weak(){return new B(this)}async recv(){return await this.rust_to_js.recv()}send(t){this.js_to_rust.send(t)}rustSend(t){this.rust_to_js.send(t)}async rustRecv(){return await this.js_to_rust.recv()}close(){globalThis.__channels[this.id]=null}};var W=class{__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Rt.unregister(this),t}free(){let t=this.__destroy_into_raw();s.__wbg_intounderlyingbytesource_free(t,0)}get autoAllocateChunkSize(){return s.intounderlyingbytesource_autoAllocateChunkSize(this.__wbg_ptr)>>>0}cancel(){let t=this.__destroy_into_raw();s.intounderlyingbytesource_cancel(t)}pull(t){return s.intounderlyingbytesource_pull(this.__wbg_ptr,t)}start(t){s.intounderlyingbytesource_start(this.__wbg_ptr,t)}get type(){let t=s.intounderlyingbytesource_type(this.__wbg_ptr);return kt[t]}};Symbol.dispose&&(W.prototype[Symbol.dispose]=W.prototype.free);var U=class{__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Nt.unregister(this),t}free(){let t=this.__destroy_into_raw();s.__wbg_intounderlyingsink_free(t,0)}abort(t){let e=this.__destroy_into_raw();return s.intounderlyingsink_abort(e,t)}close(){let t=this.__destroy_into_raw();return s.intounderlyingsink_close(t)}write(t){return s.intounderlyingsink_write(this.__wbg_ptr,t)}};Symbol.dispose&&(U.prototype[Symbol.dispose]=U.prototype.free);var P=class{__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,Ot.unregister(this),t}free(){let t=this.__destroy_into_raw();s.__wbg_intounderlyingsource_free(t,0)}cancel(){let t=this.__destroy_into_raw();s.intounderlyingsource_cancel(t)}pull(t){return s.intounderlyingsource_pull(this.__wbg_ptr,t)}};Symbol.dispose&&(P.prototype[Symbol.dispose]=P.prototype.free);var R=class c{static __wrap(t){let e=Object.create(c.prototype);return e.__wbg_ptr=t,rt.register(e,e.__wbg_ptr,e),e}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,rt.unregister(this),t}free(){let t=this.__destroy_into_raw();s.__wbg_jsowner_free(t,0)}};Symbol.dispose&&(R.prototype[Symbol.dispose]=R.prototype.free);function $(){return{__proto__:null,"./orchestral-web_bg.js":{__proto__:null,__wbg_Error_408e67f47ca7b58b:function(t,e){return Error(a(t,e))},__wbg_Number_3890faa6d3ff057d:function(t){return Number(t)},__wbg_String_8564e559799eccda:function(t,e){let n=String(e),r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg___wbindgen_bigint_get_as_i64_c4ecf48528083721:function(t,e){let n=e,r=typeof n=="bigint"?n:void 0;o().setBigInt64(t+8,f(r)?BigInt(0):r,!0),o().setInt32(t+0,!f(r),!0)},__wbg___wbindgen_boolean_get_c9c83ebd41b34df3:function(t){let e=t,n=typeof e=="boolean"?e:void 0;return f(n)?16777215:n?1:0},__wbg___wbindgen_debug_string_a57024b9c6e4a48b:function(t,e){let n=Z(e),r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg___wbindgen_in_ac983077f137f2e6:function(t,e){return t in e},__wbg___wbindgen_is_bigint_8ffbbef442139384:function(t){return typeof t=="bigint"},__wbg___wbindgen_is_function_5e4570eb24ffa122:function(t){return typeof t=="function"},__wbg___wbindgen_is_null_7d13f41e1a2d5140:function(t){return t===null},__wbg___wbindgen_is_object_a2790eb24c211ea0:function(t){let e=t;return typeof e=="object"&&e!==null},__wbg___wbindgen_is_string_e6f02f0ea5f20a32:function(t){return typeof t=="string"},__wbg___wbindgen_is_undefined_6cff064c44e0d823:function(t){return t===void 0},__wbg___wbindgen_jsval_eq_0a18949a61670320:function(t,e){return t===e},__wbg___wbindgen_jsval_loose_eq_acf2776254a8d832:function(t,e){return t==e},__wbg___wbindgen_memory_5dc2a138835b0f8e:function(){return s.memory},__wbg___wbindgen_number_get_136b9679cab35cfb:function(t,e){let n=e,r=typeof n=="number"?n:void 0;o().setFloat64(t+8,f(r)?0:r,!0),o().setInt32(t+0,!f(r),!0)},__wbg___wbindgen_string_get_d154f1e671052120:function(t,e){let n=e,r=typeof n=="string"?n:void 0;var _=f(r)?0:l(r,s.__wbindgen_malloc,s.__wbindgen_realloc),u=b;o().setInt32(t+4,u,!0),o().setInt32(t+0,_,!0)},__wbg___wbindgen_throw_bb96b2010945f0bc:function(t,e){throw new Error(a(t,e))},__wbg__wbg_cb_unref_be22cc64ae6946a0:function(t){t._wbg_cb_unref()},__wbg_abort_d8615b5857e112b3:function(t){t.abort()},__wbg_aborted_086a8e1f35ee10d0:function(t){return t.aborted},__wbg_addEventListener_3b8edc02c33d9f77:function(){return i(function(t,e,n,r){t.addEventListener(a(e,n),r)},arguments)},__wbg_altKey_59aa5e82c1e32003:function(t){return t.altKey},__wbg_altKey_753fdbc251308d47:function(t){return t.altKey},__wbg_altKey_755975127b4ad2c8:function(t){return t.altKey},__wbg_animationName_32f25a492ad37a10:function(t,e){let n=e.animationName,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_appendChild_d5cbce3d5fa81471:function(){return i(function(t,e){return t.appendChild(e)},arguments)},__wbg_arrayBuffer_393639d72165e90f:function(t){return t.arrayBuffer()},__wbg_back_95d82ddc159806b3:function(){return i(function(t){t.back()},arguments)},__wbg_blockSize_7fad8bcc48860290:function(t){return t.blockSize},__wbg_blur_3f0715f311929c30:function(){return i(function(t){t.blur()},arguments)},__wbg_body_eb2e7e7701fa47ae:function(t){let e=t.body;return f(e)?0:d(e)},__wbg_borderBoxSize_1848950efcad2b8b:function(t){return t.borderBoxSize},__wbg_boundingClientRect_74cb2064bcae2394:function(t){return t.boundingClientRect},__wbg_bubbles_004494fc9c11b448:function(t){return t.bubbles},__wbg_buffer_78291c0e094ccf99:function(t){return t.buffer},__wbg_button_3963e81aec2b2f60:function(t){return t.button},__wbg_buttons_688a15d7be68a0b2:function(t){return t.buttons},__wbg_byobRequest_f8b1c89429b77545:function(t){let e=t.byobRequest;return f(e)?0:d(e)},__wbg_byteLength_336bc7d303511ba0:function(t){return t.byteLength},__wbg_byteOffset_2b1d5b10453ce198:function(t){return t.byteOffset},__wbg_call_1c5886ab9c57d1c7:function(){return i(function(t,e){return t.call(e)},arguments)},__wbg_call_35dba3c747ad7521:function(){return i(function(t,e,n){return t.call(e,n)},arguments)},__wbg_cancel_9610ed0dbe990e64:function(t){return t.cancel()},__wbg_catch_8094577c3f159ad5:function(t,e){return t.catch(e)},__wbg_changedTouches_33c06951b4b4dda5:function(t){return t.changedTouches},__wbg_charCodeAt_ee49a2dd698e4f66:function(t,e){return t.charCodeAt(e>>>0)},__wbg_checkValidity_b53bbf0eee983ed0:function(t){return t.checkValidity()},__wbg_checked_e5cdc0e72e42fdfd:function(t){return t.checked},__wbg_clearData_4eb1734920cb5219:function(){return i(function(t){t.clearData()},arguments)},__wbg_clearData_e96b980ffb4fa0c9:function(){return i(function(t,e,n){t.clearData(a(e,n))},arguments)},__wbg_clearTimeout_113b1cde814ec762:function(t){return clearTimeout(t)},__wbg_clientHeight_834c029be3d903a7:function(t){return t.clientHeight},__wbg_clientWidth_ad03e8eb6c2b0c56:function(t){return t.clientWidth},__wbg_clientX_73f0b294f91b259a:function(t){return t.clientX},__wbg_clientX_bc105f55752462e3:function(t){return t.clientX},__wbg_clientY_7be14b984b1cf33f:function(t){return t.clientY},__wbg_clientY_a4c1ea57bd41430f:function(t){return t.clientY},__wbg_close_0c1f30aeb9a080a7:function(t){t.close()},__wbg_close_72f69f5f2de2bc73:function(){return i(function(t){t.close()},arguments)},__wbg_close_97cdb44c3a7878f6:function(){return i(function(t){t.close()},arguments)},__wbg_code_1bac1fd03147d97e:function(t,e){let n=e.code,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_contentBoxSize_7a901078c88a8f5c:function(t){return t.contentBoxSize},__wbg_controller_d903271e81e8d035:function(t){let e=t.controller;return f(e)?0:d(e)},__wbg_createComment_8bb21f73bb03ef86:function(t,e,n){return t.createComment(a(e,n))},__wbg_createElementNS_f18ede2d74f15ea1:function(){return i(function(t,e,n,r,_){return t.createElementNS(e===0?void 0:a(e,n),a(r,_))},arguments)},__wbg_createElement_7f42344eee7bb810:function(){return i(function(t,e,n){return t.createElement(a(e,n))},arguments)},__wbg_createIndex_9e2beb35a103225a:function(){return i(function(t,e,n,r){return t.createIndex(a(e,n),r)},arguments)},__wbg_createIndex_f8a090296c419c6c:function(){return i(function(t,e,n,r,_){return t.createIndex(a(e,n),r,_)},arguments)},__wbg_createObjectStore_2ddc8f74181944c1:function(){return i(function(t,e,n,r){return t.createObjectStore(a(e,n),r)},arguments)},__wbg_createTextNode_f5ee2b1cd3e249bb:function(t,e,n){return t.createTextNode(a(e,n))},__wbg_crypto_ee03eb25b52ea298:function(){return i(function(t){return t.crypto},arguments)},__wbg_ctrlKey_8f6cb44d63052c81:function(t){return t.ctrlKey},__wbg_ctrlKey_9490b716a4845258:function(t){return t.ctrlKey},__wbg_ctrlKey_a018a97cfc9bef87:function(t){return t.ctrlKey},__wbg_dataTransfer_edccf220abf064b7:function(t){let e=t.dataTransfer;return f(e)?0:d(e)},__wbg_data_875f40a485a142fe:function(t,e){let n=e.data;var r=f(n)?0:l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_deleteIndex_d8f266d4cd6cc82c:function(){return i(function(t,e,n){t.deleteIndex(a(e,n))},arguments)},__wbg_deleteObjectStore_ed0e7d0b256bead4:function(){return i(function(t,e,n){t.deleteObjectStore(a(e,n))},arguments)},__wbg_delete_27b012593b3f623b:function(){return i(function(t,e){return t.delete(e)},arguments)},__wbg_delete_f5f770c2c3985b22:function(t,e,n){t.delete(a(e,n))},__wbg_deltaMode_1eedd4132dd540ba:function(t){return t.deltaMode},__wbg_deltaX_9df7ccb6bdd1b836:function(t){return t.deltaX},__wbg_deltaY_13780a1f1e6d6f8c:function(t){return t.deltaY},__wbg_deltaZ_0d4cbe6a855bd4d5:function(t){return t.deltaZ},__wbg_detail_a14541d9a4a86290:function(t){return t.detail},__wbg_devicePixelRatio_e60a2d12bfd01f78:function(t){return t.devicePixelRatio},__wbg_documentElement_5db4560019067e32:function(t){let e=t.documentElement;return f(e)?0:d(e)},__wbg_document_ac38448dbfd31a57:function(t){let e=t.document;return f(e)?0:d(e)},__wbg_done_669171204c3dcae2:function(t){return t.done},__wbg_dropEffect_9cc87f6c97d565ff:function(t,e){let n=e.dropEffect,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_effectAllowed_bb01f084148c0dd2:function(t,e){let n=e.effectAllowed,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_elapsedTime_360b4ceef380864b:function(t){return t.elapsedTime},__wbg_elapsedTime_8d29fd70c3f16204:function(t){return t.elapsedTime},__wbg_encodeURIComponent_afe46611ccfc945e:function(t,e){return encodeURIComponent(a(t,e))},__wbg_enqueue_7d68a21eda78e72f:function(){return i(function(t,e){t.enqueue(e)},arguments)},__wbg_entries_7774d489e1da5f4f:function(t){return Object.entries(t)},__wbg_entries_e86f3a8157ca8e4b:function(t){return t.entries()},__wbg_error_24e6ac605d438e54:function(){return i(function(t){let e=t.error;return f(e)?0:d(e)},arguments)},__wbg_error_43de27aff4f7934f:function(t){let e=t.error;return f(e)?0:d(e)},__wbg_error_dd408a7b3cb542dd:function(t){console.error(t)},__wbg_fetch_9b478faef8cda538:function(t){return fetch(t)},__wbg_files_23f07d08213e997e:function(t){let e=t.files;return f(e)?0:d(e)},__wbg_files_56a897754f75826b:function(t){let e=t.files;return f(e)?0:d(e)},__wbg_focus_77d7483c7b2b9f30:function(){return i(function(t){t.focus()},arguments)},__wbg_force_9bcab01773f0c226:function(t){return t.force},__wbg_forward_b8b5cb852321306e:function(){return i(function(t){t.forward()},arguments)},__wbg_getAll_6b556cfcbf040afc:function(){return i(function(t,e){return t.getAll(e)},arguments)},__wbg_getAll_86c18743042fe4ca:function(){return i(function(t){return t.getAll()},arguments)},__wbg_getAll_a678c287135e9fce:function(){return i(function(t,e,n){return t.getAll(e,n>>>0)},arguments)},__wbg_getAsFile_d83c2fce0fba8d88:function(){return i(function(t){let e=t.getAsFile();return f(e)?0:d(e)},arguments)},__wbg_getAttribute_4c6e1df05f9ee034:function(t,e,n,r){let _=e.getAttribute(a(n,r));var u=f(_)?0:l(_,s.__wbindgen_malloc,s.__wbindgen_realloc),g=b;o().setInt32(t+4,g,!0),o().setInt32(t+0,u,!0)},__wbg_getBoundingClientRect_8165472d0fc91753:function(t){return t.getBoundingClientRect()},__wbg_getData_7b73a3e658ca866b:function(){return i(function(t,e,n,r){let _=e.getData(a(n,r)),u=l(_,s.__wbindgen_malloc,s.__wbindgen_realloc),g=b;o().setInt32(t+4,g,!0),o().setInt32(t+0,u,!0)},arguments)},__wbg_getElementById_1637d6969b003cda:function(t,e,n){let r=t.getElementById(a(e,n));return f(r)?0:d(r)},__wbg_getItem_eb388fb8c39edb35:function(){return i(function(t,e,n,r){let _=e.getItem(a(n,r));var u=f(_)?0:l(_,s.__wbindgen_malloc,s.__wbindgen_realloc),g=b;o().setInt32(t+4,g,!0),o().setInt32(t+0,u,!0)},arguments)},__wbg_getNode_b14ec18ffa4892a9:function(t,e){return t.getNode(e>>>0)},__wbg_getRandomValues_6a55335db8979694:function(){return i(function(t,e,n){return t.getRandomValues(D(e,n))},arguments)},__wbg_getReader_bb0230851fbf986b:function(){return i(function(t){return t.getReader()},arguments)},__wbg_get_0ddd29d2bb6bc3b5:function(t,e){let n=t[e>>>0];return f(n)?0:d(n)},__wbg_get_46b096a8e041ddcc:function(t,e){let n=t[e>>>0];return f(n)?0:d(n)},__wbg_get_4babbbf9303c1945:function(){return i(function(t,e){return t.get(e)},arguments)},__wbg_get_70bc8da7f67ceeb7:function(t,e,n,r){let _=e.get(a(n,r));var u=f(_)?0:l(_,s.__wbindgen_malloc,s.__wbindgen_realloc),g=b;o().setInt32(t+4,g,!0),o().setInt32(t+0,u,!0)},__wbg_get_7473564f5d9fdd2a:function(){return i(function(t,e,n,r){let _=e.get(a(n,r));var u=f(_)?0:l(_,s.__wbindgen_malloc,s.__wbindgen_realloc),g=b;o().setInt32(t+4,g,!0),o().setInt32(t+0,u,!0)},arguments)},__wbg_get_8caf461d5632abc2:function(t,e,n){let r=e[n>>>0];var _=f(r)?0:l(r,s.__wbindgen_malloc,s.__wbindgen_realloc),u=b;o().setInt32(t+4,u,!0),o().setInt32(t+0,_,!0)},__wbg_get_971a0c45d172643f:function(){return i(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_c0c8f8d7da0c03dd:function(t,e){return t[e>>>0]},__wbg_get_d173c0308df22d37:function(){return i(function(t,e){return Reflect.get(t,e)},arguments)},__wbg_get_done_ce5b5691b59c07f2:function(t){let e=t.done;return f(e)?16777215:e?1:0},__wbg_get_select_data_44a585f337de4182:function(t,e){let n=tt(e),r=Ft(n,s.__wbindgen_malloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_get_unchecked_e20b893aeafc3fca:function(t,e){return t[e>>>0]},__wbg_get_value_58309ba057b715e1:function(t){return t.value},__wbg_get_with_ref_key_6412cf3094599694:function(t,e){return t[e]},__wbg_hash_597d991faa794205:function(){return i(function(t,e){let n=e.hash,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},arguments)},__wbg_head_6c0efd90f4024307:function(t){let e=t.head;return f(e)?0:d(e)},__wbg_headers_92567b07014384b9:function(t){return t.headers},__wbg_height_928e06ca343c884b:function(t){return t.height},__wbg_height_949ea86de6d5d939:function(t){return t.height},__wbg_height_c25c887c11a170f2:function(t){return t.height},__wbg_height_f9570f7786f9a01f:function(t){return t.height},__wbg_history_8941dec1bcca1cc5:function(){return i(function(t){return t.history},arguments)},__wbg_identifier_784fe576dd872072:function(t){return t.identifier},__wbg_indexNames_703bfb0316b8e10d:function(t){return t.indexNames},__wbg_index_bed5a9f21dfebeea:function(){return i(function(t,e,n){return t.index(a(e,n))},arguments)},__wbg_initialize_6d1129af221f598b:function(t,e,n){t.initialize(e,n)},__wbg_inlineSize_cbd06e91714e38d0:function(t){return t.inlineSize},__wbg_installing_a2d8330c3d41ebb8:function(t){let e=t.installing;return f(e)?0:d(e)},__wbg_instanceof_AnimationEvent_8b6c1d527074bbd2:function(t){let e;try{e=t instanceof AnimationEvent}catch{e=!1}return e},__wbg_instanceof_ArrayBuffer_993d02d2d254cad1:function(t){let e;try{e=t instanceof ArrayBuffer}catch{e=!1}return e},__wbg_instanceof_Blob_1d876a01ae2b8e98:function(t){let e;try{e=t instanceof Blob}catch{e=!1}return e},__wbg_instanceof_Clipboard_854098c7a4db2040:function(t){let e;try{e=t instanceof Clipboard}catch{e=!1}return e},__wbg_instanceof_CompositionEvent_317b9efe4acc4f13:function(t){let e;try{e=t instanceof CompositionEvent}catch{e=!1}return e},__wbg_instanceof_CustomEvent_6c85398680c2c999:function(t){let e;try{e=t instanceof CustomEvent}catch{e=!1}return e},__wbg_instanceof_Document_2c9a76b03a14f24f:function(t){let e;try{e=t instanceof Document}catch{e=!1}return e},__wbg_instanceof_DragEvent_3ef600c07c137dcc:function(t){let e;try{e=t instanceof DragEvent}catch{e=!1}return e},__wbg_instanceof_Element_a3960bb00f4964bc:function(t){let e;try{e=t instanceof Element}catch{e=!1}return e},__wbg_instanceof_Error_61d8a02a0f3383a1:function(t){let e;try{e=t instanceof Error}catch{e=!1}return e},__wbg_instanceof_Event_a63d0fcd6fbc1f25:function(t){let e;try{e=t instanceof Event}catch{e=!1}return e},__wbg_instanceof_File_0cf3712639a95e23:function(t){let e;try{e=t instanceof File}catch{e=!1}return e},__wbg_instanceof_FocusEvent_5be57dd20cf1d3db:function(t){let e;try{e=t instanceof FocusEvent}catch{e=!1}return e},__wbg_instanceof_HtmlElement_6b02a3740edba922:function(t){let e;try{e=t instanceof HTMLElement}catch{e=!1}return e},__wbg_instanceof_HtmlFormElement_ab33e8c914cfe17d:function(t){let e;try{e=t instanceof HTMLFormElement}catch{e=!1}return e},__wbg_instanceof_HtmlInputElement_6077656bcaf1eb33:function(t){let e;try{e=t instanceof HTMLInputElement}catch{e=!1}return e},__wbg_instanceof_HtmlSelectElement_f94f3a0c638a54e1:function(t){let e;try{e=t instanceof HTMLSelectElement}catch{e=!1}return e},__wbg_instanceof_HtmlTextAreaElement_6d5fbbcef108f57a:function(t){let e;try{e=t instanceof HTMLTextAreaElement}catch{e=!1}return e},__wbg_instanceof_IdbDatabase_e9dd9f20c51d8d42:function(t){let e;try{e=t instanceof IDBDatabase}catch{e=!1}return e},__wbg_instanceof_IdbFactory_8b61495ce09d6c93:function(t){let e;try{e=t instanceof IDBFactory}catch{e=!1}return e},__wbg_instanceof_IdbOpenDbRequest_b913751ffb9239bb:function(t){let e;try{e=t instanceof IDBOpenDBRequest}catch{e=!1}return e},__wbg_instanceof_IdbRequest_471b050024626dac:function(t){let e;try{e=t instanceof IDBRequest}catch{e=!1}return e},__wbg_instanceof_IdbTransaction_434039323c136132:function(t){let e;try{e=t instanceof IDBTransaction}catch{e=!1}return e},__wbg_instanceof_KeyboardEvent_ab6e9b5a4d8bf1db:function(t){let e;try{e=t instanceof KeyboardEvent}catch{e=!1}return e},__wbg_instanceof_Map_9a4d6ead180ae3a9:function(t){let e;try{e=t instanceof Map}catch{e=!1}return e},__wbg_instanceof_MouseEvent_512ca61e491035ae:function(t){let e;try{e=t instanceof MouseEvent}catch{e=!1}return e},__wbg_instanceof_Node_ad9597995317f467:function(t){let e;try{e=t instanceof Node}catch{e=!1}return e},__wbg_instanceof_PointerEvent_e1feff2b590ac0ad:function(t){let e;try{e=t instanceof PointerEvent}catch{e=!1}return e},__wbg_instanceof_Response_8f49efbd4bfd76d6:function(t){let e;try{e=t instanceof Response}catch{e=!1}return e},__wbg_instanceof_ServiceWorkerContainer_7ecdcbf1e4b03193:function(t){let e;try{e=t instanceof ServiceWorkerContainer}catch{e=!1}return e},__wbg_instanceof_ServiceWorkerRegistration_b4a1e232c705d60a:function(t){let e;try{e=t instanceof ServiceWorkerRegistration}catch{e=!1}return e},__wbg_instanceof_TouchEvent_0e254b2ef874a6e3:function(t){let e;try{e=t instanceof TouchEvent}catch{e=!1}return e},__wbg_instanceof_TransitionEvent_fa18c3a01fcacac9:function(t){let e;try{e=t instanceof TransitionEvent}catch{e=!1}return e},__wbg_instanceof_Uint8Array_f935dbb0aa7cdeed:function(t){let e;try{e=t instanceof Uint8Array}catch{e=!1}return e},__wbg_instanceof_WheelEvent_444f10468019d1b4:function(t){let e;try{e=t instanceof WheelEvent}catch{e=!1}return e},__wbg_instanceof_Window_5625ff9937037a38:function(t){let e;try{e=t instanceof Window}catch{e=!1}return e},__wbg_intersectionRatio_03e4d8b18c1b3a9c:function(t){return t.intersectionRatio},__wbg_intersectionRect_ed9d474798f38836:function(t){return t.intersectionRect},__wbg_isArray_6339f732981044bf:function(t){return Array.isArray(t)},__wbg_isComposing_33d4d04c1349b4c0:function(t){return t.isComposing},__wbg_isIntersecting_cd67c3e29798c6a7:function(t){return t.isIntersecting},__wbg_isPrimary_eecfdfe4ebb61e14:function(t){return t.isPrimary},__wbg_isSafeInteger_f3d6cd19ccfe4512:function(t){return Number.isSafeInteger(t)},__wbg_item_b5842778aa6f5277:function(t,e){let n=t.item(e>>>0);return f(n)?0:d(n)},__wbg_items_a35cb18496760505:function(t){return t.items},__wbg_iterator_5cebbb86e33c6dd6:function(){return Symbol.iterator},__wbg_keyPath_9c57c5afa3721ba6:function(){return i(function(t){return t.keyPath},arguments)},__wbg_key_d1b2fd5ee42567c0:function(t,e){let n=e.key,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_kind_19a1b3bfb51a6cc1:function(t,e){let n=e.kind,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_lastModified_a866385c6ec928bb:function(t){return t.lastModified},__wbg_left_5acbc01043b87b48:function(t){return t.left},__wbg_length_2dd58ff350b5afcd:function(t){return t.length},__wbg_length_363ea82d88478ffe:function(t){return t.length},__wbg_length_36bd29c6848c2144:function(t){return t.length},__wbg_length_5038e4965f457d02:function(t){return t.length},__wbg_length_7afd83ae4ddf324f:function(t){return t.length},__wbg_length_a7beabda2cca47d5:function(t){return t.length},__wbg_length_ecfa2c63d3d0d82c:function(t){return t.length},__wbg_localStorage_19bddab1e4cb2413:function(){return i(function(t){let e=t.localStorage;return f(e)?0:d(e)},arguments)},__wbg_location_00f2951912aef6cc:function(t){return t.location},__wbg_location_5d269cf0aa99107a:function(t){return t.location},__wbg_message_c141d5e68716b595:function(t){return t.message},__wbg_metaKey_332b18d7718cb496:function(t){return t.metaKey},__wbg_metaKey_917f037461143e51:function(t){return t.metaKey},__wbg_metaKey_f282cd52fbd7cb27:function(t){return t.metaKey},__wbg_multiEntry_c687b423d703e7ab:function(t){return t.multiEntry},__wbg_name_41b795553ec88cd8:function(t,e){let n=e.name,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_name_6267d577fb6182b1:function(t,e){let n=e.name,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_name_7adfb7f7f1539878:function(t){return t.name},__wbg_navigator_6cfdd5fa246d910f:function(t){return t.navigator},__wbg_new_0e691dfd4c345c12:function(){return i(function(){return new DataTransfer},arguments)},__wbg_new_116be93542d39019:function(){return new Array},__wbg_new_1f27644530c822b2:function(){return i(function(){return new FileReader},arguments)},__wbg_new_358857d90afd5a2d:function(t,e){return new Error(a(t,e))},__wbg_new_77cc4f4f472aeb81:function(t){return new Uint8Array(t)},__wbg_new_95039e162b0c4466:function(){return i(function(){return new Headers},arguments)},__wbg_new_b4f72b5144efe03b:function(){return i(function(){return new URLSearchParams},arguments)},__wbg_new_c4a5c3368506feb1:function(){return i(function(t,e){return new URL(a(t,e))},arguments)},__wbg_new_c5dc7c0518fdb0ba:function(t){return new F(t>>>0)},__wbg_new_cdf041679ded4c5f:function(){return new Map},__wbg_new_e942d9e3968e46f8:function(t){return new M(R.__wrap(t))},__wbg_new_ebe3e0f6837f0879:function(){return new Object},__wbg_new_f5712de39c931ddf:function(){return i(function(){return new AbortController},arguments)},__wbg_new_f9d6489212f3b2b3:function(t){return new Date(t)},__wbg_new_from_slice_3eea173078478cfe:function(t,e){return new Uint8Array(D(t,e))},__wbg_new_typed_cceaf62d8d95e9f2:function(t,e){try{var n={a:t,b:e},r=(u,g)=>{let h=n.a;n.a=0;try{return yt(h,n.b,u,g)}finally{n.a=h}};return new Promise(r)}finally{n.a=0}},__wbg_new_with_args_75f20e1087b74fa8:function(t,e,n,r){return new Function(a(t,e),a(n,r))},__wbg_new_with_byte_offset_and_length_ff6e927f8d72f0c3:function(t,e,n){return new Uint8Array(t,e>>>0,n>>>0)},__wbg_new_with_form_8833d74a595aeed7:function(){return i(function(t){return new FormData(t)},arguments)},__wbg_new_with_str_4ebb1146a76a8593:function(){return i(function(t,e){return new Request(a(t,e))},arguments)},__wbg_new_with_str_700d95be59a0a385:function(){return i(function(t,e){return new URLSearchParams(a(t,e))},arguments)},__wbg_new_with_str_and_init_5a37d576dec75a86:function(){return i(function(t,e,n){return new Request(a(t,e),n)},arguments)},__wbg_next_42cf16ee0dafc9e2:function(){return i(function(t){return t.next()},arguments)},__wbg_next_8f26b64fa5e9f64b:function(t){return t.next},__wbg_now_8b265300afd5f2b9:function(){return Date.now()},__wbg_objectStoreNames_94ee5410bc505cae:function(t){return t.objectStoreNames},__wbg_objectStore_222b7add2b5c2770:function(){return i(function(t,e,n){return t.objectStore(a(e,n))},arguments)},__wbg_offsetLeft_8b1c7d8afefdd3ae:function(t){return t.offsetLeft},__wbg_offsetTop_a9aa1cddffa2f9d8:function(t){return t.offsetTop},__wbg_offsetX_2db1c144fa76228b:function(t){return t.offsetX},__wbg_offsetY_b32f2328bb79e445:function(t){return t.offsetY},__wbg_ok_917dc17857b16c56:function(t){return t.ok},__wbg_onLine_abefe885eda90c44:function(t){return t.onLine},__wbg_open_66c8b00ee562451f:function(){return i(function(t,e,n){return t.open(a(e,n))},arguments)},__wbg_open_c5ecda93515ce190:function(){return i(function(t,e,n,r){return t.open(a(e,n),r>>>0)},arguments)},__wbg_ownerDocument_82c473eb17b62fb0:function(t){let e=t.ownerDocument;return f(e)?0:d(e)},__wbg_pageX_234a4849d7ad38ca:function(t){return t.pageX},__wbg_pageX_9e121a228bc2b964:function(t){return t.pageX},__wbg_pageY_79757348b09cf17c:function(t){return t.pageY},__wbg_pageY_9fcf5b857d758455:function(t){return t.pageY},__wbg_parentElement_ef76606593484767:function(t){let e=t.parentElement;return f(e)?0:d(e)},__wbg_pathname_bc564f9e4fcdd029:function(){return i(function(t,e){let n=e.pathname,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},arguments)},__wbg_pointerId_c1e1cd6b32d6d017:function(t){return t.pointerId},__wbg_pointerType_b3dafa8fb9c97016:function(t,e){let n=e.pointerType,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_pressure_7a96116e299b1c26:function(t){return t.pressure},__wbg_preventDefault_19878c58b8010668:function(t){t.preventDefault()},__wbg_propertyName_8d8b49d1e9852814:function(t,e){let n=e.propertyName,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_prototypesetcall_de8e0d9553586985:function(t,e,n){Uint8Array.prototype.set.call(D(t,e),n)},__wbg_pseudoElement_26a108889f4db96a:function(t,e){let n=e.pseudoElement,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_pseudoElement_9dc96f734133c56b:function(t,e){let n=e.pseudoElement,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_pushState_eb9e1dcf29d2f366:function(){return i(function(t,e,n,r,_,u){t.pushState(e,a(n,r),_===0?void 0:a(_,u))},arguments)},__wbg_push_adb0107829f02d75:function(t,e){return t.push(e)},__wbg_put_49ed48c98d0c0d3c:function(){return i(function(t,e){return t.put(e)},arguments)},__wbg_put_5e0ae8c80bb952a7:function(){return i(function(t,e,n){return t.put(e,n)},arguments)},__wbg_querySelector_2c472eddb417c6b3:function(){return i(function(t,e,n){let r=t.querySelector(a(e,n));return f(r)?0:d(r)},arguments)},__wbg_queueMicrotask_ac694eae12e92dfb:function(t){queueMicrotask(t)},__wbg_queueMicrotask_be5fe34a8f4cad4d:function(t){return t.queueMicrotask},__wbg_radiusX_5746e14c2ed39dcc:function(t){return t.radiusX},__wbg_radiusY_1b747e60b6156855:function(t){return t.radiusY},__wbg_readAsArrayBuffer_1e0bf6cd0613d7fd:function(){return i(function(t,e){t.readAsArrayBuffer(e)},arguments)},__wbg_readAsText_3990b1994faed1cb:function(){return i(function(t,e){t.readAsText(e)},arguments)},__wbg_read_ae34ffedeb11f034:function(t){return t.read()},__wbg_register_a9b9832c051a8a21:function(t,e,n){return t.register(a(e,n))},__wbg_releaseLock_f38d2d1c08212a8a:function(t){t.releaseLock()},__wbg_reload_4640945d13a6e37c:function(){return i(function(t){t.reload()},arguments)},__wbg_repeat_8afe4eb608701a7e:function(t){return t.repeat},__wbg_replaceState_e7ac4029d2fd43ae:function(){return i(function(t,e,n,r,_,u){t.replaceState(e,a(n,r),_===0?void 0:a(_,u))},arguments)},__wbg_requestAnimationFrame_bcb3ce6247e27dd4:function(){return i(function(t,e){return t.requestAnimationFrame(e)},arguments)},__wbg_resolve_020f95d838c6ef25:function(t){return Promise.resolve(t)},__wbg_respond_f88cbcebace42068:function(){return i(function(t,e){t.respond(e>>>0)},arguments)},__wbg_result_0501bea148306f01:function(){return i(function(t){return t.result},arguments)},__wbg_result_89c2bfc79be07ad2:function(){return i(function(t){return t.result},arguments)},__wbg_rootBounds_83f633fd54aa4a13:function(t){let e=t.rootBounds;return f(e)?0:d(e)},__wbg_rotationAngle_60447694aae67756:function(t){return t.rotationAngle},__wbg_run_005df3744a5aa7cf:function(t){t.run()},__wbg_rustRecv_c9dcac227ecc00d9:function(t){return t.rustRecv()},__wbg_rustSend_56478f16de514546:function(t,e){t.rustSend(e)},__wbg_saveTemplate_e3c1a1e2ac405343:function(t,e,n,r){var _=Ct(e,n);s.__wbindgen_free(e,n*4,4),t.saveTemplate(_,r)},__wbg_screenX_18c359be7a0ddf55:function(t){return t.screenX},__wbg_screenX_a5783b55bfd207a5:function(t){return t.screenX},__wbg_screenY_4feed72cb13664eb:function(t){return t.screenY},__wbg_screenY_7372f7b411f8b43b:function(t){return t.screenY},__wbg_scrollHeight_7d333b172b4e3ba3:function(t){return t.scrollHeight},__wbg_scrollHeight_afbe84d0c28d8f93:function(t){return t.scrollHeight},__wbg_scrollIntoView_49a46961bbda8765:function(t,e){t.scrollIntoView(e)},__wbg_scrollLeft_73f67cba2ed45a8c:function(t){return t.scrollLeft},__wbg_scrollTo_ebc3153048c8e24e:function(t,e,n){t.scrollTo(e,n)},__wbg_scrollTop_a6658cd5de70de43:function(t){return t.scrollTop},__wbg_scrollTop_dacf35eddc723d68:function(t){return t.scrollTop},__wbg_scrollWidth_b353aef788aa0bc6:function(t){return t.scrollWidth},__wbg_scrollX_181b5c8bcd3df278:function(){return i(function(t){return t.scrollX},arguments)},__wbg_scrollY_47193160b143bbe9:function(){return i(function(t){return t.scrollY},arguments)},__wbg_scroll_fa4745a57b7f81bb:function(t,e){t.scroll(e)},__wbg_search_3ab40a92dceeaacb:function(t,e){let n=e.search,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_search_e85b52d847b83659:function(){return i(function(t,e){let n=e.search,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},arguments)},__wbg_sessionStorage_3682bd48ec378aea:function(){return i(function(t){let e=t.sessionStorage;return f(e)?0:d(e)},arguments)},__wbg_setAttributeInner_a29bef1cf5d53ffe:function(t,e,n,r,_,u){Q(t,a(e,n),r,_===0?void 0:a(_,u))},__wbg_setAttribute_507f8367905a9c03:function(){return i(function(t,e,n,r,_){t.setAttribute(a(e,n),a(r,_))},arguments)},__wbg_setData_6ed09bd88068b75c:function(){return i(function(t,e,n,r,_){t.setData(a(e,n),a(r,_))},arguments)},__wbg_setItem_b0bb6a578106db69:function(){return i(function(t,e,n,r,_){t.setItem(a(e,n),a(r,_))},arguments)},__wbg_setProperty_684ce273e28a7037:function(){return i(function(t,e,n,r,_){t.setProperty(a(e,n),a(r,_))},arguments)},__wbg_setTimeout_ef24d2fc3ad97385:function(){return i(function(t,e){return setTimeout(t,e)},arguments)},__wbg_set_014226dfeca53178:function(t,e,n){return t.set(e,n)},__wbg_set_6be42768c690e380:function(t,e,n){t[e]=n},__wbg_set_a80955eb93b145c6:function(t,e,n){t[e>>>0]=n},__wbg_set_auto_increment_2eb586fcd2b0a448:function(t,e){t.autoIncrement=e!==0},__wbg_set_b9b5b5cb7b495037:function(t,e,n){t.set(D(e,n))},__wbg_set_behavior_3b9d875369f000f4:function(t,e){t.behavior=et[e]},__wbg_set_behavior_82295bc4197c42ad:function(t,e){t.behavior=et[e]},__wbg_set_block_184aed92bb2b5929:function(t,e){t.block=nt[e]},__wbg_set_body_f301b68bff45f419:function(t,e){t.body=e},__wbg_set_cache_ab8f11813716fe29:function(t,e){t.cache=xt[e]},__wbg_set_credentials_d7f3b810cbf191e1:function(t,e){t.credentials=Et[e]},__wbg_set_dropEffect_5aefb7a79c54cc28:function(t,e,n){t.dropEffect=a(e,n)},__wbg_set_e92392c4b44c5de1:function(){return i(function(t,e,n,r,_){t.set(a(e,n),a(r,_))},arguments)},__wbg_set_effectAllowed_a9d4049eff35d626:function(t,e,n){t.effectAllowed=a(e,n)},__wbg_set_headers_805555608daf7f2a:function(t,e){t.headers=e},__wbg_set_href_25904ecc26f99de9:function(){return i(function(t,e,n){t.href=a(e,n)},arguments)},__wbg_set_inline_927f3aa796a97168:function(t,e){t.inline=nt[e]},__wbg_set_key_path_58041cdcf1bd692a:function(t,e){t.keyPath=e},__wbg_set_left_24d4eab4db15d76c:function(t,e){t.left=e},__wbg_set_method_cf2b992b9a610bc3:function(t,e,n){t.method=a(e,n)},__wbg_set_multi_entry_4c8f78a72947f121:function(t,e){t.multiEntry=e!==0},__wbg_set_name_ee3dff836477d7b3:function(t,e,n){t.name=a(e,n)},__wbg_set_onabort_fda794cb1089d6b5:function(t,e){t.onabort=e},__wbg_set_oncomplete_ff31bdacaa1b3558:function(t,e){t.oncomplete=e},__wbg_set_onerror_3dff0f2abceea5e9:function(t,e){t.onerror=e},__wbg_set_onerror_41278ace6abe3973:function(t,e){t.onerror=e},__wbg_set_onload_a82519c1b28925a3:function(t,e){t.onload=e},__wbg_set_onsuccess_86d76d6974cd57e4:function(t,e){t.onsuccess=e},__wbg_set_onupgradeneeded_79b60102909f4a5e:function(t,e){t.onupgradeneeded=e},__wbg_set_onversionchange_40b00d32e440a05e:function(t,e){t.onversionchange=e},__wbg_set_referrer_policy_3f990097931e92b7:function(t,e){t.referrerPolicy=It[e]},__wbg_set_scrollRestoration_c1658f4c57ede79b:function(){return i(function(t,e){t.scrollRestoration=At[e]},arguments)},__wbg_set_scrollTop_95b38daef1936437:function(t,e){t.scrollTop=e},__wbg_set_search_65c58ba6f17e037f:function(t,e,n){t.search=a(e,n)},__wbg_set_signal_115b9e9423652e66:function(t,e){t.signal=e},__wbg_set_textContent_e027901c7bc836b5:function(t,e,n){t.textContent=e===0?void 0:a(e,n)},__wbg_set_top_ccef3a52058a4f8c:function(t,e){t.top=e},__wbg_set_unique_c03185d3bf563306:function(t,e){t.unique=e!==0},__wbg_shiftKey_61fed1db405ac0ac:function(t){return t.shiftKey},__wbg_shiftKey_8eca009f693152b4:function(t){return t.shiftKey},__wbg_shiftKey_d24455602deb3490:function(t){return t.shiftKey},__wbg_signal_58449b7eb331d1be:function(t){return t.signal},__wbg_size_86ca1114f3d8af74:function(t){return t.size},__wbg_state_e5e56a3e7c7f1862:function(t){let e=t.state;return(St.indexOf(e)+1||7)-1},__wbg_state_ebb066fae96b67dc:function(){return i(function(t){return t.state},arguments)},__wbg_static_accessor_GLOBAL_THIS_466428f93b4eaa76:function(){let t=typeof globalThis>"u"?null:globalThis;return f(t)?0:d(t)},__wbg_static_accessor_GLOBAL_c7aea38d4de089bc:function(){let t=typeof global>"u"?null:global;return f(t)?0:d(t)},__wbg_static_accessor_SELF_42d4fae05e59267a:function(){let t=typeof self>"u"?null:self;return f(t)?0:d(t)},__wbg_static_accessor_WINDOW_e0db14a0eba6a812:function(){let t=typeof window>"u"?null:window;return f(t)?0:d(t)},__wbg_status_b0de02a07fd7d927:function(t){return t.status},__wbg_stringify_f93a4ebae9231922:function(){return i(function(t){return JSON.stringify(t)},arguments)},__wbg_style_f09d6445af3dd2c6:function(t){return t.style},__wbg_tangentialPressure_a78ee9016e967e4b:function(t){return t.tangentialPressure},__wbg_targetTouches_5f2e2a29d0bb5bcd:function(t){return t.targetTouches},__wbg_target_13424fe1cdc436ac:function(t){let e=t.target;return f(e)?0:d(e)},__wbg_textContent_a8ab419abd77b63c:function(t,e){let n=e.textContent;var r=f(n)?0:l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_text_9302f33ea8cfce7b:function(){return i(function(t){return t.text()},arguments)},__wbg_then_7026b513a94278a8:function(t,e){return t.then(e)},__wbg_then_72819b8d4e081fb5:function(t,e,n){return t.then(e,n)},__wbg_tiltX_4594cff8aea85eca:function(t){return t.tiltX},__wbg_tiltY_ba9c64e202c067f6:function(t){return t.tiltY},__wbg_time_74022b69536c6fc3:function(t){return t.time},__wbg_toLocaleString_63cb6702fb0eb40d:function(t,e,n,r){return t.toLocaleString(a(e,n),r)},__wbg_toString_033acf19ce89359c:function(t){return t.toString()},__wbg_toString_2f0b0aec069cb718:function(t){return t.toString()},__wbg_top_66d56bb4eca7d9c5:function(t){return t.top},__wbg_touches_c55ad1629cfa1067:function(t){return t.touches},__wbg_transaction_4c999693e6e601bf:function(){return i(function(t,e,n){return t.transaction(e,vt[n])},arguments)},__wbg_transaction_77d93778cbec28c3:function(t){let e=t.transaction;return f(e)?0:d(e)},__wbg_twist_934902e5510cfae9:function(t){return t.twist},__wbg_type_69f042676195fffa:function(t,e){let n=e.type,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_type_93f0d0fe5e0ba871:function(t,e){let n=e.type,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_type_e27e57bae7245d17:function(t,e){let n=e.type,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_unique_6772a50ead7321df:function(t){return t.unique},__wbg_update_5da611edafee5486:function(){return i(function(t){return t.update()},arguments)},__wbg_update_memory_4060a0ab30633318:function(t,e){t.update_memory(e)},__wbg_url_3e90676c7072325d:function(t,e){let n=e.url,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_userAgent_adc3e375481683f8:function(){return i(function(t,e){let n=e.userAgent,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},arguments)},__wbg_value_1e2369fab29b420e:function(t){return t.value},__wbg_value_35f0fb42e7c3d468:function(t,e){let n=e.value,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_value_75dd6140b2a4f88b:function(t,e){let n=e.value,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_value_ea3f13bcabcbe7ca:function(t,e){let n=e.value,r=l(n,s.__wbindgen_malloc,s.__wbindgen_realloc),_=b;o().setInt32(t+4,_,!0),o().setInt32(t+0,r,!0)},__wbg_view_7685fe4b2845c5b6:function(t){let e=t.view;return f(e)?0:d(e)},__wbg_visibilityState_78b3e77642525a69:function(t){let e=t.visibilityState;return(Tt.indexOf(e)+1||3)-1},__wbg_visualViewport_6ac37a44608e245f:function(t){let e=t.visualViewport;return f(e)?0:d(e)},__wbg_waiting_4981d172b968d242:function(t){let e=t.waiting;return f(e)?0:d(e)},__wbg_weak_76ec38e642028ca7:function(t){return t.weak()},__wbg_width_25247161d477c7d5:function(t){return t.width},__wbg_width_9eed45149c0366f2:function(t){return t.width},__wbg_width_c13a68522d4564f3:function(t){return t.width},__wbg_width_d1e8b84daff94792:function(t){return t.width},__wbg_writeText_0346496782732979:function(t,e,n){return t.writeText(a(e,n))},__wbg_x_7a405109a5d032a5:function(t){return t.x},__wbg_y_6b4b18ebd874d4d4:function(t){return t.y},__wbindgen_cast_0000000000000001:function(t,e){return p(t,e,mt)},__wbindgen_cast_0000000000000002:function(t,e){return p(t,e,dt)},__wbindgen_cast_0000000000000003:function(t,e){return p(t,e,gt)},__wbindgen_cast_0000000000000004:function(t,e){return p(t,e,ht)},__wbindgen_cast_0000000000000005:function(t,e){return p(t,e,wt)},__wbindgen_cast_0000000000000006:function(t,e){return Lt(t,e,pt)},__wbindgen_cast_0000000000000007:function(t,e){return p(t,e,bt)},__wbindgen_cast_0000000000000008:function(t,e){return p(t,e,lt)},__wbindgen_cast_0000000000000009:function(t){return t},__wbindgen_cast_000000000000000a:function(t){return t},__wbindgen_cast_000000000000000b:function(t,e){return a(t,e)},__wbindgen_cast_000000000000000c:function(t){return BigInt.asUintN(64,t)},__wbindgen_init_externref_table:function(){let t=s.__wbindgen_externrefs,e=t.grow(4);t.set(0,void 0),t.set(e+0,void 0),t.set(e+1,null),t.set(e+2,!0),t.set(e+3,!1)}}}}function bt(c,t){s._ZN12wasm_bindgen7convert8closures1_6invoke17he6aa64882236cc9eE(c,t)}function lt(c,t){s._ZN12wasm_bindgen7convert8closures1_6invoke17hf938ac78bbafcdedE(c,t)}function dt(c,t,e){s._ZN12wasm_bindgen7convert8closures1_6invoke17h78628cacb618bd15E(c,t,e)}function gt(c,t,e){s._ZN12wasm_bindgen7convert8closures1_6invoke17h435f9b592293b86eE(c,t,e)}function ht(c,t,e){s._ZN12wasm_bindgen7convert8closures1_6invoke17h82801740c1c745cbE(c,t,e)}function wt(c,t,e){s._ZN12wasm_bindgen7convert8closures1_6invoke17hb31a6aefa9ed63cbE(c,t,e)}function pt(c,t,e){s._ZN12wasm_bindgen7convert8closures1_1_6invoke17h688d772c50e6ffe0E(c,t,e)}function mt(c,t,e){let n=s._ZN12wasm_bindgen7convert8closures1_6invoke17h96eb8ec2077044faE(c,t,e);if(n[1])throw zt(n[0])}function yt(c,t,e,n){s._ZN12wasm_bindgen7convert8closures1_6invoke17h1378a6c3997a5e04E(c,t,e,n)}var vt=["readonly","readwrite","versionchange","readwriteflush","cleanup"],kt=["bytes"],It=["","no-referrer","no-referrer-when-downgrade","origin","origin-when-cross-origin","unsafe-url","same-origin","strict-origin","strict-origin-when-cross-origin"],xt=["default","no-store","reload","no-cache","force-cache","only-if-cached"],Et=["omit","same-origin","include"],et=["auto","instant","smooth"],nt=["start","center","end","nearest"],At=["auto","manual"],St=["parsed","installing","installed","activating","activated","redundant"],Tt=["hidden","visible"],Rt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(c=>s.__wbg_intounderlyingbytesource_free(c,1)),Nt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(c=>s.__wbg_intounderlyingsink_free(c,1)),Ot=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(c=>s.__wbg_intounderlyingsource_free(c,1)),rt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(c=>s.__wbg_jsowner_free(c,1));function d(c){let t=s.__externref_table_alloc();return s.__wbindgen_externrefs.set(t,c),t}var q=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(c=>s.__wbindgen_destroy_closure(c.a,c.b));function Z(c){let t=typeof c;if(t=="number"||t=="boolean"||c==null)return`${c}`;if(t=="string")return`"${c}"`;if(t=="symbol"){let r=c.description;return r==null?"Symbol":`Symbol(${r})`}if(t=="function"){let r=c.name;return typeof r=="string"&&r.length>0?`Function(${r})`:"Function"}if(Array.isArray(c)){let r=c.length,_="[";r>0&&(_+=Z(c[0]));for(let u=1;u1)n=e[1];else return toString.call(c);if(n=="Object")try{return"Object("+JSON.stringify(c)+")"}catch{return"Object"}return c instanceof Error?`${c.name}: ${c.message} -${c.stack}`:n}function Ct(c,t){c=c>>>0;let e=o(),n=[];for(let r=c;r>>0,S().subarray(c/1,c/1+t)}var m=null;function o(){return(m===null||m.buffer.detached===!0||m.buffer.detached===void 0&&m.buffer!==s.memory.buffer)&&(m=new DataView(s.memory.buffer)),m}function a(c,t){return Mt(c>>>0,t)}var A=null;function S(){return(A===null||A.byteLength===0)&&(A=new Uint8Array(s.memory.buffer)),A}function i(c,t){try{return c.apply(this,t)}catch(e){let n=d(e);s.__wbindgen_exn_store(n)}}function f(c){return c==null}function Lt(c,t,e){let n={a:c,b:t,cnt:1},r=(..._)=>{n.cnt++;try{return e(n.a,n.b,..._)}finally{r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(s.__wbindgen_destroy_closure(n.a,n.b),n.a=0,q.unregister(n))},q.register(r,n,n),r}function p(c,t,e){let n={a:c,b:t,cnt:1},r=(..._)=>{n.cnt++;let u=n.a;n.a=0;try{return e(u,n.b,..._)}finally{n.a=u,r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(s.__wbindgen_destroy_closure(n.a,n.b),n.a=0,q.unregister(n))},q.register(r,n,n),r}function Ft(c,t){let e=t(c.length*4,4)>>>0;for(let n=0;n>>0;return S().subarray(h,h+g.length).set(g),b=g.length,h}let n=c.length,r=t(n,1)>>>0,_=S(),u=0;for(;u127)break;_[r+u]=g}if(u!==n){u!==0&&(c=c.slice(u)),r=e(r,n,n=u+c.length*3,1)>>>0;let g=S().subarray(r+u,r+n),h=T.encodeInto(c,g);u+=h.written,r=e(r,n,u,1)>>>0}return b=u,r}function zt(c){let t=s.__wbindgen_externrefs.get(c);return s.__externref_table_dealloc(c),t}var j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});j.decode();var Bt=2146435072,V=0;function Mt(c,t){return V+=t,V>=Bt&&(j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),j.decode(),V=t),j.decode(S().subarray(c,c+t))}var T=new TextEncoder;"encodeInto"in T||(T.encodeInto=function(c,t){let e=T.encode(c);return t.set(e),{read:c.length,written:e.length}});var b=0,Dt,jt,s;function _t(c,t){return jt=c,s=c.exports,Dt=t,m=null,A=null,s.__wbindgen_start(),s}async function Wt(c,t){if(typeof Response=="function"&&c instanceof Response){if(!c.ok)throw new Error(`failed to fetch Wasm: ${c.status} ${c.statusText} fetching '${c.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(c,t)}catch(r){if(e(c.type)&&c.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let n=await c.arrayBuffer();return await WebAssembly.instantiate(n,t)}else{let n=await WebAssembly.instantiate(c,t);return n instanceof WebAssembly.Instance?{instance:n,module:c}:n}function e(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function st(c){if(s!==void 0)return s;c!==void 0&&(Object.getPrototypeOf(c)===Object.prototype?{module:c}=c:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=$();c instanceof WebAssembly.Module||(c=new WebAssembly.Module(c));let e=new WebAssembly.Instance(c,t);return _t(e,c)}async function ct(c){if(s!==void 0)return s;c!==void 0&&(Object.getPrototypeOf(c)===Object.prototype?{module_or_path:c}=c:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),c===void 0&&(c=new URL("orchestral-web_bg.wasm",import.meta.url));let t=$();(typeof c=="string"||typeof Request=="function"&&c instanceof Request||typeof URL=="function"&&c instanceof URL)&&(c=fetch(c));let{instance:e,module:n}=await Wt(await c,t);return _t(e,n)}globalThis.__wasm_split_main_initSync=st;ct({module_or_path:"/./assets/orchestral-web_bg-dxhf46ad8a6644b989e.wasm"}).then(c=>{globalThis.__dx_mainWasm=c,globalThis.__dx_mainInit=ct,globalThis.__dx_mainInitSync=st,globalThis.__dx___wbg_get_imports=$,c.__wbindgen_start==null&&c.main()});export{W as IntoUnderlyingByteSource,U as IntoUnderlyingSink,P as IntoUnderlyingSource,R as JSOwner,ct as default,st as initSync}; +${c.stack}`:n}function Ct(c,t){c=c>>>0;let e=o(),n=[];for(let r=c;r>>0,S().subarray(c/1,c/1+t)}var m=null;function o(){return(m===null||m.buffer.detached===!0||m.buffer.detached===void 0&&m.buffer!==s.memory.buffer)&&(m=new DataView(s.memory.buffer)),m}function a(c,t){return Mt(c>>>0,t)}var A=null;function S(){return(A===null||A.byteLength===0)&&(A=new Uint8Array(s.memory.buffer)),A}function i(c,t){try{return c.apply(this,t)}catch(e){let n=d(e);s.__wbindgen_exn_store(n)}}function f(c){return c==null}function Lt(c,t,e){let n={a:c,b:t,cnt:1},r=(..._)=>{n.cnt++;try{return e(n.a,n.b,..._)}finally{r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(s.__wbindgen_destroy_closure(n.a,n.b),n.a=0,q.unregister(n))},q.register(r,n,n),r}function p(c,t,e){let n={a:c,b:t,cnt:1},r=(..._)=>{n.cnt++;let u=n.a;n.a=0;try{return e(u,n.b,..._)}finally{n.a=u,r._wbg_cb_unref()}};return r._wbg_cb_unref=()=>{--n.cnt===0&&(s.__wbindgen_destroy_closure(n.a,n.b),n.a=0,q.unregister(n))},q.register(r,n,n),r}function Ft(c,t){let e=t(c.length*4,4)>>>0;for(let n=0;n>>0;return S().subarray(h,h+g.length).set(g),b=g.length,h}let n=c.length,r=t(n,1)>>>0,_=S(),u=0;for(;u127)break;_[r+u]=g}if(u!==n){u!==0&&(c=c.slice(u)),r=e(r,n,n=u+c.length*3,1)>>>0;let g=S().subarray(r+u,r+n),h=T.encodeInto(c,g);u+=h.written,r=e(r,n,u,1)>>>0}return b=u,r}function zt(c){let t=s.__wbindgen_externrefs.get(c);return s.__externref_table_dealloc(c),t}var j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});j.decode();var Bt=2146435072,V=0;function Mt(c,t){return V+=t,V>=Bt&&(j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),j.decode(),V=t),j.decode(S().subarray(c,c+t))}var T=new TextEncoder;"encodeInto"in T||(T.encodeInto=function(c,t){let e=T.encode(c);return t.set(e),{read:c.length,written:e.length}});var b=0,Dt,jt,s;function _t(c,t){return jt=c,s=c.exports,Dt=t,m=null,A=null,s.__wbindgen_start(),s}async function Wt(c,t){if(typeof Response=="function"&&c instanceof Response){if(!c.ok)throw new Error(`failed to fetch Wasm: ${c.status} ${c.statusText} fetching '${c.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(c,t)}catch(r){if(e(c.type)&&c.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}let n=await c.arrayBuffer();return await WebAssembly.instantiate(n,t)}else{let n=await WebAssembly.instantiate(c,t);return n instanceof WebAssembly.Instance?{instance:n,module:c}:n}function e(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function st(c){if(s!==void 0)return s;c!==void 0&&(Object.getPrototypeOf(c)===Object.prototype?{module:c}=c:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));let t=$();c instanceof WebAssembly.Module||(c=new WebAssembly.Module(c));let e=new WebAssembly.Instance(c,t);return _t(e,c)}async function ct(c){if(s!==void 0)return s;c!==void 0&&(Object.getPrototypeOf(c)===Object.prototype?{module_or_path:c}=c:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),c===void 0&&(c=new URL("orchestral-web_bg.wasm",import.meta.url));let t=$();(typeof c=="string"||typeof Request=="function"&&c instanceof Request||typeof URL=="function"&&c instanceof URL)&&(c=fetch(c));let{instance:e,module:n}=await Wt(await c,t);return _t(e,n)}globalThis.__wasm_split_main_initSync=st;ct({module_or_path:"/./assets/orchestral-web_bg-dxh9d568181cdcc75c5.wasm"}).then(c=>{globalThis.__dx_mainWasm=c,globalThis.__dx_mainInit=ct,globalThis.__dx_mainInitSync=st,globalThis.__dx___wbg_get_imports=$,c.__wbindgen_start==null&&c.main()});export{W as IntoUnderlyingByteSource,U as IntoUnderlyingSink,P as IntoUnderlyingSource,R as JSOwner,ct as default,st as initSync}; diff --git a/web/orchestral-web/dist/assets/orchestral-web_bg-dxhf46ad8a6644b989e.wasm b/web/orchestral-web/dist/assets/orchestral-web_bg-dxh9d568181cdcc75c5.wasm similarity index 64% rename from web/orchestral-web/dist/assets/orchestral-web_bg-dxhf46ad8a6644b989e.wasm rename to web/orchestral-web/dist/assets/orchestral-web_bg-dxh9d568181cdcc75c5.wasm index c2c9f1d9..905b1235 100644 Binary files a/web/orchestral-web/dist/assets/orchestral-web_bg-dxhf46ad8a6644b989e.wasm and b/web/orchestral-web/dist/assets/orchestral-web_bg-dxh9d568181cdcc75c5.wasm differ diff --git a/web/orchestral-web/dist/index.html b/web/orchestral-web/dist/index.html index b1254c4a..fa9a5b18 100644 --- a/web/orchestral-web/dist/index.html +++ b/web/orchestral-web/dist/index.html @@ -10,9 +10,9 @@ - +
- + diff --git a/web/orchestral-web/dist/sw.js b/web/orchestral-web/dist/sw.js index e5f60147..fdba2663 100644 --- a/web/orchestral-web/dist/sw.js +++ b/web/orchestral-web/dist/sw.js @@ -1 +1 @@ -const CACHE_PREFIX="orchestral-dioxus-",BUILD_ID="dxha89eb1d2c837c2ee",CACHE_NAME=`${CACHE_PREFIX}${BUILD_ID}`,SHELL_FILES=["./","./index.html","./manifest.webmanifest","./icons/favicon.svg","./icons/icon-192.svg","./icons/icon-512.svg","./icons/maskable-icon.svg","./icons/apple-touch-icon.svg","./icons/icon-192.png","./icons/icon-512.png","./icons/maskable-icon.png","./icons/apple-touch-icon.png"],offlineDocument=new URL("./index.html",self.location.href).href;function isSensitive(n,t){if(n.headers.has("Authorization"))return!0;const i=`${t.pathname}${t.search}`.toLowerCase();return/(?:^|\/)api(?:\/|$)/.test(t.pathname.toLowerCase())||/(?:^|\/)(?:stream|transcript|token)(?:\/|$|[?&])/.test(i)||/[?&](?:access_?token|token|secret|transcript)=/.test(i)}self.addEventListener("install",n=>{n.waitUntil((async()=>{await(await caches.open(CACHE_NAME)).addAll(SHELL_FILES),await self.skipWaiting()})())}),self.addEventListener("activate",n=>{n.waitUntil((async()=>{const t=await caches.keys(),i=t.some(e=>e.startsWith(CACHE_PREFIX)&&e!==CACHE_NAME);await Promise.all(t.filter(e=>e.startsWith(CACHE_PREFIX)&&e!==CACHE_NAME).map(e=>caches.delete(e)));const a=await caches.open(CACHE_NAME),s=await a.keys();if(await Promise.all(s.map(e=>{const c=new URL(e.url);return isSensitive(e,c)?a.delete(e):Promise.resolve(!1)})),await self.clients.claim(),i){const e=await self.clients.matchAll({type:"window",includeUncontrolled:!0});for(const c of e)c.postMessage({type:"ORCHESTRAL_UPDATE_READY"})}})())}),self.addEventListener("fetch",n=>{const{request:t}=n;if(t.method!=="GET")return;const i=new URL(t.url);if(i.origin!==self.location.origin||isSensitive(t,i))return;if(t.mode==="navigate"){n.respondWith((async()=>{try{return await fetch(t,{cache:"no-store"})}catch{return await caches.match(offlineDocument)??new Response("Orchestral is offline",{status:503,headers:{"Content-Type":"text/plain; charset=utf-8"}})}})());return}(["/assets/","/wasm/","/icons/"].some(s=>i.pathname.includes(s))||i.pathname.endsWith(".webmanifest"))&&n.respondWith((async()=>{const s=await caches.match(t);if(s)return s;const e=await fetch(t);return e.ok&&e.type==="basic"&&await(await caches.open(CACHE_NAME)).put(t,e.clone()),e})())}),self.addEventListener("message",n=>{n.data?.type==="SKIP_WAITING"&&self.skipWaiting()}),self.addEventListener("notificationclick",n=>{n.notification.close(),n.waitUntil((async()=>{const t=new URL(n.notification.data?.url||"./",self.location.origin),i=t.origin===self.location.origin?t.href:new URL("./",self.location.href).href,s=(await self.clients.matchAll({type:"window",includeUncontrolled:!0})).find(e=>new URL(e.url).origin===self.location.origin);if(s){await s.focus(),"navigate"in s&&await s.navigate(i);return}await self.clients.openWindow(i)})())}); +const CACHE_PREFIX="orchestral-dioxus-",BUILD_ID="dxh40c65c6d31d0e1",CACHE_NAME=`${CACHE_PREFIX}${BUILD_ID}`,SHELL_FILES=["./","./index.html","./manifest.webmanifest","./icons/favicon.svg","./icons/icon-192.svg","./icons/icon-512.svg","./icons/maskable-icon.svg","./icons/apple-touch-icon.svg","./icons/icon-192.png","./icons/icon-512.png","./icons/maskable-icon.png","./icons/apple-touch-icon.png"],offlineDocument=new URL("./index.html",self.location.href).href;function isSensitive(n,t){if(n.headers.has("Authorization"))return!0;const i=`${t.pathname}${t.search}`.toLowerCase();return/(?:^|\/)api(?:\/|$)/.test(t.pathname.toLowerCase())||/(?:^|\/)(?:stream|transcript|token)(?:\/|$|[?&])/.test(i)||/[?&](?:access_?token|token|secret|transcript)=/.test(i)}self.addEventListener("install",n=>{n.waitUntil((async()=>{await(await caches.open(CACHE_NAME)).addAll(SHELL_FILES),await self.skipWaiting()})())}),self.addEventListener("activate",n=>{n.waitUntil((async()=>{const t=await caches.keys(),i=t.some(e=>e.startsWith(CACHE_PREFIX)&&e!==CACHE_NAME);await Promise.all(t.filter(e=>e.startsWith(CACHE_PREFIX)&&e!==CACHE_NAME).map(e=>caches.delete(e)));const a=await caches.open(CACHE_NAME),s=await a.keys();if(await Promise.all(s.map(e=>{const c=new URL(e.url);return isSensitive(e,c)?a.delete(e):Promise.resolve(!1)})),await self.clients.claim(),i){const e=await self.clients.matchAll({type:"window",includeUncontrolled:!0});for(const c of e)c.postMessage({type:"ORCHESTRAL_UPDATE_READY"})}})())}),self.addEventListener("fetch",n=>{const{request:t}=n;if(t.method!=="GET")return;const i=new URL(t.url);if(i.origin!==self.location.origin||isSensitive(t,i))return;if(t.mode==="navigate"){n.respondWith((async()=>{try{return await fetch(t,{cache:"no-store"})}catch{return await caches.match(offlineDocument)??new Response("Orchestral is offline",{status:503,headers:{"Content-Type":"text/plain; charset=utf-8"}})}})());return}(["/assets/","/wasm/","/icons/"].some(s=>i.pathname.includes(s))||i.pathname.endsWith(".webmanifest"))&&n.respondWith((async()=>{const s=await caches.match(t);if(s)return s;const e=await fetch(t);return e.ok&&e.type==="basic"&&await(await caches.open(CACHE_NAME)).put(t,e.clone()),e})())}),self.addEventListener("message",n=>{n.data?.type==="SKIP_WAITING"&&self.skipWaiting()}),self.addEventListener("notificationclick",n=>{n.notification.close(),n.waitUntil((async()=>{const t=new URL(n.notification.data?.url||"./",self.location.origin),i=t.origin===self.location.origin?t.href:new URL("./",self.location.href).href,s=(await self.clients.matchAll({type:"window",includeUncontrolled:!0})).find(e=>new URL(e.url).origin===self.location.origin);if(s){await s.focus(),"navigate"in s&&await s.navigate(i);return}await self.clients.openWindow(i)})())}); diff --git a/web/orchestral-web/src/components/session_control.rs b/web/orchestral-web/src/components/session_control.rs index daae2070..3e015942 100644 --- a/web/orchestral-web/src/components/session_control.rs +++ b/web/orchestral-web/src/components/session_control.rs @@ -217,6 +217,9 @@ fn AgentSessionCreateCard( let name = field.name.clone(); move |event| { values.write().insert(name.clone(), event.value()); } }, + if !field.required { + option { value: "", "使用默认值" } + } for option_value in field.options.clone() { option { value: "{option_value}", "{option_value}" } } @@ -381,6 +384,9 @@ fn ActionCard( values.write().insert(name.clone(), event.value()); } }, + if !field.required { + option { value: "", "使用默认值" } + } for option_value in field.options.clone() { option { value: "{option_value}", "{option_value}" } } @@ -592,6 +598,62 @@ mod tests { ); } + #[test] + fn clearing_optional_enum_fields_omits_them_without_changing_permissions() { + let form = action_form(&Some(serde_json::json!({ + "type": "object", + "required": ["sandbox_mode", "approval_policy"], + "properties": { + "model": { + "type": "string", "enum": ["native-model", "future-model"], + "default": "native-model" + }, + "reasoning_effort": { + "type": "string", "enum": ["ultra", "future-Deep"] + }, + "sandbox_mode": { + "type": "string", "enum": ["read-only", "workspace-write"], + "default": "workspace-write" + }, + "approval_policy": { + "type": "string", "enum": ["on-request", "never"], + "default": "on-request" + } + } + }))); + let mut values = initial_action_values(&form); + assert_eq!( + action_arguments(&form, &values, "").unwrap(), + serde_json::json!({ + "model": "native-model", "sandbox_mode": "workspace-write", + "approval_policy": "on-request" + }) + ); + values.insert("model".into(), "future-model".into()); + values.insert("reasoning_effort".into(), "future-Deep".into()); + assert_eq!( + action_arguments(&form, &values, "").unwrap()["reasoning_effort"], + "future-Deep" + ); + + for field in ["model", "reasoning_effort"] { + values.insert(field.into(), String::new()); + } + assert_eq!( + action_arguments(&form, &values, "").unwrap(), + serde_json::json!({ + "sandbox_mode": "workspace-write", "approval_policy": "on-request" + }) + ); + for field in ["sandbox_mode", "approval_policy"] { + let mut missing_permission = values.clone(); + missing_permission.remove(field); + assert!(action_arguments(&form, &missing_permission, "").is_err()); + missing_permission.insert(field.into(), String::new()); + assert!(action_arguments(&form, &missing_permission, "").is_err()); + } + } + #[test] fn current_directory_shortcut_targets_the_orchestral_workspace() { assert_eq!(