Refactor application and runtime boundaries
This commit is contained in:
317
src/app.rs
317
src/app.rs
@@ -21,10 +21,14 @@ use crate::config::{
|
||||
use crate::database::{Database, ProjectWithSessions, SessionState, StoredMessage};
|
||||
#[cfg(any(target_os = "macos", test))]
|
||||
use crate::engine::ChatTurn;
|
||||
#[cfg(target_os = "macos")]
|
||||
use crate::metrics::WorkSource;
|
||||
use crate::metrics::{KvCacheReport, Metrics, MetricsSnapshot};
|
||||
use crate::model::{self, DownloadOutcome, DownloadProgress, ManagedArtifactId, ModelChoice};
|
||||
#[cfg(target_os = "macos")]
|
||||
use crate::runtime::{ActiveGeneration, CheckpointTarget, GenerationEvent, GenerationService};
|
||||
use crate::runtime::{
|
||||
ActiveGeneration, CheckpointTarget, CompactionInput, GenerationEvent, GenerationService,
|
||||
};
|
||||
use crate::settings::{
|
||||
DiagnosticPreferences, ExecutionPreferences, GIB, GenerationPreferences, KvCachePreferences,
|
||||
ReasoningMode, RuntimePreferences, SpeculativePreferences, SsdPreferences, SteeringPreferences,
|
||||
@@ -942,6 +946,10 @@ impl App {
|
||||
}
|
||||
|
||||
pub(crate) fn update(&mut self, message: Message) -> Task<Message> {
|
||||
let message = match self.update_preference_message(message) {
|
||||
Ok(message) => message,
|
||||
Err(task) => return task,
|
||||
};
|
||||
match message {
|
||||
Message::Noop => {
|
||||
#[cfg(target_os = "macos")]
|
||||
@@ -1136,312 +1144,6 @@ impl App {
|
||||
self.sync_native_menu();
|
||||
}
|
||||
Message::MetricsTick => self.sample_metrics(),
|
||||
Message::PreferenceModelChanged(model) => {
|
||||
self.preference_draft.model = model;
|
||||
if !model.supports_dspark() {
|
||||
self.preference_draft.legacy_mtp_enabled = false;
|
||||
self.preference_draft.dspark_enabled = false;
|
||||
self.preference_draft.dspark_confidence_threshold.clear();
|
||||
self.preference_draft.dspark_strict = false;
|
||||
}
|
||||
if model == ModelChoice::Glm52 {
|
||||
self.preference_draft.power_percent.clear();
|
||||
self.preference_draft.prefill_chunk.clear();
|
||||
self.preference_draft.directional_steering_file.clear();
|
||||
self.preference_draft.directional_steering_ffn.clear();
|
||||
self.preference_draft.directional_steering_attn.clear();
|
||||
} else {
|
||||
self.preference_draft.glm_mtp = false;
|
||||
self.preference_draft.glm_mtp_timing = false;
|
||||
self.preference_draft.ssd_full_layers.clear();
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceLegacyMtpChanged(enabled) => {
|
||||
self.preference_draft.legacy_mtp_enabled =
|
||||
self.preference_draft.model.supports_dspark() && enabled;
|
||||
if self.preference_draft.legacy_mtp_enabled {
|
||||
self.preference_draft.dspark_enabled = false;
|
||||
self.preference_draft.dspark_confidence_threshold.clear();
|
||||
self.preference_draft.dspark_strict = false;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceDsparkChanged(enabled) => {
|
||||
self.preference_draft.dspark_enabled =
|
||||
self.preference_draft.model.supports_dspark() && enabled;
|
||||
if !self.preference_draft.dspark_enabled {
|
||||
self.preference_draft.dspark_confidence_threshold.clear();
|
||||
self.preference_draft.dspark_strict = false;
|
||||
} else {
|
||||
self.preference_draft.legacy_mtp_enabled = false;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceTimeoutChanged(value) => {
|
||||
self.preference_draft.idle_timeout_minutes = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceA2uiChanged(enabled) => {
|
||||
self.preference_draft.a2ui_enabled = enabled;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceEndpointPortChanged(value) => {
|
||||
self.preference_draft.endpoint_port = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceEndpointEnabledChanged(enabled) => {
|
||||
self.preference_draft.endpoint_enabled = enabled;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceEndpointCorsChanged(enabled) => {
|
||||
self.preference_draft.endpoint_cors = enabled;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceDevBrainEnabledChanged(enabled) => {
|
||||
self.preference_draft.dev_brain_enabled = enabled;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceDevBrainVaultChanged(value) => {
|
||||
self.preference_draft.dev_brain_vault_path = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGitDiffLayoutChanged(layout) => {
|
||||
self.preference_draft.git_diff_layout = layout;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGitDiffAlgorithmChanged(algorithm) => {
|
||||
self.preference_draft.git_diff_algorithm = algorithm;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGitContextLinesChanged(value) => {
|
||||
self.preference_draft.git_context_lines = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGitInterhunkLinesChanged(value) => {
|
||||
self.preference_draft.git_interhunk_lines = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGitIndentHeuristicChanged(enabled) => {
|
||||
self.preference_draft.git_indent_heuristic = enabled;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGitWhitespaceChanged(whitespace) => {
|
||||
self.preference_draft.git_whitespace = whitespace;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGitIgnoreBlankLinesChanged(enabled) => {
|
||||
self.preference_draft.git_ignore_blank_lines = enabled;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::ChooseDevBrainVault => {
|
||||
return Task::perform(
|
||||
async {
|
||||
AsyncFileDialog::new()
|
||||
.set_title("Choose an Obsidian vault")
|
||||
.pick_folder()
|
||||
.await
|
||||
.map(|folder| folder.path().to_path_buf())
|
||||
},
|
||||
Message::DevBrainVaultPicked,
|
||||
);
|
||||
}
|
||||
Message::DevBrainVaultPicked(path) => {
|
||||
if let Some(path) = path {
|
||||
self.preference_draft.dev_brain_vault_path =
|
||||
path.to_string_lossy().into_owned();
|
||||
self.preference_error = None;
|
||||
}
|
||||
}
|
||||
Message::RestoreDevBrainDefaultGuides => {
|
||||
self.preference_error = None;
|
||||
self.restore_dev_brain_confirmation = true;
|
||||
}
|
||||
Message::ConfirmRestoreDevBrainDefaultGuides => {
|
||||
self.restore_dev_brain_confirmation = false;
|
||||
self.preference_error = crate::dev_brain::restore_default_guides(Path::new(
|
||||
&self.preference_draft.dev_brain_vault_path,
|
||||
))
|
||||
.err();
|
||||
}
|
||||
Message::CancelRestoreDevBrainDefaultGuides => {
|
||||
self.restore_dev_brain_confirmation = false;
|
||||
}
|
||||
Message::PreferenceContextChanged(value) => {
|
||||
self.preference_draft.context_tokens = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceMaxTokensChanged(value) => {
|
||||
self.preference_draft.max_generated_tokens = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSystemPromptAction(action) => {
|
||||
self.preference_draft.system_prompt.perform(action);
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceTemperatureChanged(value) => {
|
||||
self.preference_draft.temperature = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceTopPChanged(value) => {
|
||||
self.preference_draft.top_p = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceMinPChanged(value) => {
|
||||
self.preference_draft.min_p = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSeedChanged(value) => {
|
||||
self.preference_draft.seed = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceReasoningChanged(value) => {
|
||||
self.preference_draft.reasoning_mode = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceCpuThreadsChanged(value) => {
|
||||
self.preference_draft.cpu_threads = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferencePowerChanged(value) => {
|
||||
self.preference_draft.power_percent = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferencePrefillChunkChanged(value) => {
|
||||
self.preference_draft.prefill_chunk = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceQualityChanged(value) => {
|
||||
self.preference_draft.quality = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceWarmWeightsChanged(value) => {
|
||||
self.preference_draft.warm_weights = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceMtpDraftChanged(value) => {
|
||||
self.preference_draft.mtp_draft_tokens = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceMtpMarginChanged(value) => {
|
||||
self.preference_draft.mtp_margin = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGlmMtpChanged(value) => {
|
||||
self.preference_draft.glm_mtp =
|
||||
self.preference_draft.model == ModelChoice::Glm52 && value;
|
||||
if !self.preference_draft.glm_mtp {
|
||||
self.preference_draft.glm_mtp_timing = false;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceGlmMtpTimingChanged(value) => {
|
||||
self.preference_draft.glm_mtp_timing =
|
||||
self.preference_draft.model == ModelChoice::Glm52 && value;
|
||||
if self.preference_draft.glm_mtp_timing {
|
||||
self.preference_draft.glm_mtp = true;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceDsparkConfidenceChanged(value) => {
|
||||
self.preference_draft.dspark_confidence_threshold = value;
|
||||
if self.preference_draft.model.supports_dspark()
|
||||
&& !self
|
||||
.preference_draft
|
||||
.dspark_confidence_threshold
|
||||
.trim()
|
||||
.is_empty()
|
||||
{
|
||||
self.preference_draft.dspark_enabled = true;
|
||||
self.preference_draft.legacy_mtp_enabled = false;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceDsparkStrictChanged(value) => {
|
||||
self.preference_draft.dspark_strict =
|
||||
self.preference_draft.model.supports_dspark() && value;
|
||||
if self.preference_draft.dspark_strict {
|
||||
self.preference_draft.dspark_enabled = true;
|
||||
self.preference_draft.legacy_mtp_enabled = false;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSsdChanged(value) => {
|
||||
self.preference_draft.ssd_streaming = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSsdColdChanged(value) => {
|
||||
self.preference_draft.ssd_streaming_cold = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSsdCacheChanged(value) => {
|
||||
self.preference_draft.ssd_cache = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSsdFullLayersChanged(value) => {
|
||||
if self.preference_draft.model == ModelChoice::Glm52 {
|
||||
self.preference_draft.ssd_full_layers = value;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSsdPreloadChanged(value) => {
|
||||
self.preference_draft.ssd_preload_experts = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSteeringFileChanged(value) => {
|
||||
if self.preference_draft.model != ModelChoice::Glm52 {
|
||||
self.preference_draft.directional_steering_file = value;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSteeringFfnChanged(value) => {
|
||||
if self.preference_draft.model != ModelChoice::Glm52 {
|
||||
self.preference_draft.directional_steering_ffn = value;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSteeringAttnChanged(value) => {
|
||||
if self.preference_draft.model != ModelChoice::Glm52 {
|
||||
self.preference_draft.directional_steering_attn = value;
|
||||
}
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceSimulatedMemoryChanged(value) => {
|
||||
self.preference_draft.simulated_used_memory_gib = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceExpertProfileChanged(value) => {
|
||||
self.preference_draft.expert_profile_path = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceKvBudgetChanged(value) => {
|
||||
self.preference_draft.kv_budget_gib = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceKvMinTokensChanged(value) => {
|
||||
self.preference_draft.kv_min_tokens = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceKvColdMaxChanged(value) => {
|
||||
self.preference_draft.kv_cold_max_tokens = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::PreferenceKvContinuedIntervalChanged(value) => {
|
||||
self.preference_draft.kv_continued_interval_tokens = value;
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::ResetPreferences => {
|
||||
self.preference_draft.reset();
|
||||
self.preference_error = None;
|
||||
}
|
||||
Message::SavePreferences => {
|
||||
self.save_preferences();
|
||||
if self.preference_error.is_none()
|
||||
&& let Some(id) = self.preferences_window
|
||||
{
|
||||
return window::close(id);
|
||||
}
|
||||
}
|
||||
Message::DownloadArtifact(artifact) => {
|
||||
self.start_model_operation(artifact, ModelOperation::Download)
|
||||
}
|
||||
@@ -2131,6 +1833,7 @@ impl App {
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => unreachable!("preference messages are dispatched before the main update"),
|
||||
}
|
||||
Task::none()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user