Refactor application and runtime boundaries
This commit is contained in:
@@ -670,6 +670,7 @@ impl App {
|
||||
effective.turn,
|
||||
messages,
|
||||
checkpoint,
|
||||
WorkSource::LocalChat,
|
||||
idle_timeout,
|
||||
) {
|
||||
Ok(active) => Some(active),
|
||||
@@ -1306,6 +1307,7 @@ impl App {
|
||||
checkpoint: session_checkpoint_path(session_id),
|
||||
bootstrap: None,
|
||||
},
|
||||
WorkSource::LocalChat,
|
||||
idle_timeout,
|
||||
)?,
|
||||
);
|
||||
@@ -1522,18 +1524,18 @@ impl App {
|
||||
.generation_service
|
||||
.as_ref()
|
||||
.ok_or_else(|| "The model runtime is unavailable.".to_owned())?
|
||||
.compact(
|
||||
effective.engine,
|
||||
effective.turn,
|
||||
.compact(CompactionInput {
|
||||
engine: effective.engine,
|
||||
turn: effective.turn,
|
||||
messages,
|
||||
reason,
|
||||
reason: reason.to_owned(),
|
||||
rebuild_system_prompt,
|
||||
session_compaction_checkpoint_path(
|
||||
checkpoint: session_compaction_checkpoint_path(
|
||||
self.selected_session
|
||||
.ok_or_else(|| "The active session is unavailable.".to_owned())?,
|
||||
),
|
||||
idle_timeout,
|
||||
)?;
|
||||
})?;
|
||||
self.active_compaction = Some(CompactionRequest {
|
||||
active,
|
||||
pending,
|
||||
@@ -1791,7 +1793,8 @@ impl App {
|
||||
effective.engine,
|
||||
effective.turn,
|
||||
messages,
|
||||
CheckpointTarget::OneShot(transient_cache_path()),
|
||||
CheckpointTarget::Transient(transient_cache_path()),
|
||||
WorkSource::LocalChat,
|
||||
idle_timeout,
|
||||
) {
|
||||
Ok(active) => {
|
||||
|
||||
@@ -497,6 +497,324 @@ impl App {
|
||||
}
|
||||
}
|
||||
|
||||
impl App {
|
||||
pub(super) fn update_preference_message(
|
||||
&mut self,
|
||||
message: Message,
|
||||
) -> Result<Message, Task<Message>> {
|
||||
match message {
|
||||
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 Err(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 Err(window::close(id));
|
||||
}
|
||||
}
|
||||
message => return Ok(message),
|
||||
}
|
||||
Err(Task::none())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
Reference in New Issue
Block a user