feat(phase9): extract_content_tags_cmd Tauri wrapper

Bridges LlmEngine::extract_content_tags to the frontend with the same
spawn_blocking + PowerAssertion guard the cleanup_text command uses.
Returns a ContentTags object serialised to camelCase JSON. Errors
surface as readable strings so the frontend toast shows actionable
text on the rare grammar-bypass path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-25 00:03:38 +01:00
parent 7567bede52
commit ef42c95000
2 changed files with 26 additions and 1 deletions

View File

@@ -6,7 +6,7 @@ use crate::AppState;
use kon_ai_formatting::{llm_cleanup_text, LlmPromptPreset};
use kon_core::hardware;
use kon_llm::model_manager::{self, model_info};
use kon_llm::LlmModelId;
use kon_llm::{ContentTags, LlmModelId};
#[derive(Debug, serde::Serialize)]
#[serde(rename_all = "camelCase")]
@@ -398,3 +398,26 @@ pub async fn cleanup_transcript_text_cmd(
.map_err(|e| e.to_string())?
.map_err(|e| e.to_string())
}
/// Phase 9 LLM-powered content tags. On-demand from the History page;
/// never auto-runs. Heavy work (LlmEngine::extract_content_tags is
/// synchronous llama-cpp inference) is wrapped in spawn_blocking so it
/// does not stall the Tauri runtime, with the same App-Nap power
/// assertion the other LLM commands use.
#[tauri::command]
pub async fn extract_content_tags_cmd(
state: State<'_, AppState>,
transcript: String,
) -> Result<ContentTags, String> {
if !state.llm_engine.is_loaded() {
return Err("LLM not loaded. Download an AI model in Settings.".to_string());
}
let engine = state.llm_engine.clone();
tokio::task::spawn_blocking(move || {
let _power_guard = PowerAssertion::begin("kon LLM content-tag extraction");
engine.extract_content_tags(&transcript)
})
.await
.map_err(|e| e.to_string())?
.map_err(|e| e.to_string())
}

View File

@@ -373,6 +373,8 @@ pub fn run() {
commands::clipboard::copy_to_clipboard,
// Filesystem (Phase 9 save-dialog path)
commands::fs::write_text_file_cmd,
// LLM content tags (Phase 9)
commands::llm::extract_content_tags_cmd,
// Paste (auto-insert at cursor)
commands::paste::paste_text,
commands::paste::paste_text_replacing,