// filepath: src/stores/logs.ts import { defineStore } from 'pinia' import { ref } from 'vue' import { listen } from '@tauri-apps/api/event' export interface LogEntry { id: string taskId: string message: string level: 'info' | 'error' timestamp: number } interface LogEvent { id: string message: string level: string } export const useLogsStore = defineStore('logs', () => { const logs = ref([]) const isListening = ref(false) function addLog(taskId: string, message: string, level: 'info' | 'error') { logs.value.push({ id: crypto.randomUUID(), taskId, message, level, timestamp: Date.now() }) // Optional: Limit log size to avoid memory issues if (logs.value.length > 5000) { logs.value = logs.value.slice(-5000) } } async function initListener() { if (isListening.value) return isListening.value = true await listen('download-log', (event) => { const { id, message, level } = event.payload addLog(id, message, level as 'info' | 'error') }) } function clearLogs() { logs.value = [] } // UI State Persistence const autoScroll = ref(true) const scrollTop = ref(0) return { logs, addLog, initListener, clearLogs, autoScroll, scrollTop } })