import { writable } from "svelte/store" import { invoke } from "@tauri-apps/api/core" // ### RE-EXPORT IPC STORES export { jarvisState, ipcConnected, lastRecognizedText, lastExecutedCommand, lastError, connectIpc, enableIpc, disableIpc, disconnectIpc, sendAction, stopJarvisApp, reloadCommands } from "./lib/ipc" // ### RUNNING STATE export const isJarvisRunning = writable(false) export const jarvisRamUsage = writable(0) export const jarvisCpuUsage = writable(0) // ### ASSISTANT VOICE export const assistantVoice = writable("") // ### APP INFO export const appInfo = writable({ tgOfficialLink: "", feedbackLink: "", repositoryLink: "", logFilePath: "" }) // ### INIT FUNCTIONS (call these from a component) export async function loadVoiceSetting() { try { const voice = await invoke("db_read", { key: "assistant_voice" }) assistantVoice.set(voice) } catch (err) { console.error("failed to load voice setting:", err) } } export async function loadAppInfo() { try { const [tg, feedback, repo, logPath] = await Promise.all([ invoke("get_tg_official_link"), invoke("get_feedback_link"), invoke("get_repository_link"), invoke("get_log_file_path") ]) appInfo.set({ tgOfficialLink: tg, feedbackLink: feedback, repositoryLink: repo, logFilePath: logPath }) } catch (err) { console.error("failed to load app info:", err) } } export async function updateJarvisStats() { try { const stats = await invoke<{running: boolean, ram_mb: number, cpu_usage: number}>("get_jarvis_app_stats") isJarvisRunning.set(stats.running) jarvisRamUsage.set(stats.ram_mb) jarvisCpuUsage.set(stats.cpu_usage) } catch (err) { console.error("failed to get jarvis stats:", err) } } // polling manager let statsInterval: ReturnType | null = null export function startStatsPolling(intervalMs = 5000) { if (statsInterval) return // already running updateJarvisStats() statsInterval = setInterval(updateJarvisStats, intervalMs) } export function stopStatsPolling() { if (statsInterval) { clearInterval(statsInterval) statsInterval = null } }