import { PanelSection, PanelSectionRow, staticClasses, } from "@decky/ui" import { definePlugin, } from "@decky/api" import { FaChartLine } from "react-icons/fa" import MainPanel from "./components/main-panel" import { useSettings, useSession, useGameDetection } from "./lib/store" import { readAndParseMangohudLog, clearMangohudLog, writeMangohudConfig, startMangohudLogging, stopMangohudLogging, getHardwareInfo, getOsVersion, getProtonVersion, getLaunchOptions, } from "./lib/api" function Content() { const { settings, updateSetting, loaded } = useSettings() const { recordingState, session, recentSessions, error, setError, startRecording, stopRecording, updateSession, addToRecent, reset, onGameStart, onGameStop, setGameName, } = useSession() // ── Game detection via polling ──────────────────────────────── useGameDetection(setGameName, recordingState) // ── Handle start recording ──────────────────────────────────── async function handleStart() { // Write MangoHud config with logging settings await writeMangohudConfig() // Clear any previous log file await clearMangohudLog() // Fire-and-forget: try to start MangoHud logging (retries until game launches) startMangohudLogging() startRecording() } // ── Handle stop recording: parse log + read system info ──────── async function handleStop() { try { // Try to stop MangoHud logging (best-effort, may fail if game already closed) await stopMangohudLogging() stopRecording() // Parse the MangoHud log const logResult = await readAndParseMangohudLog() if (logResult.error) { setError(logResult.error) return } // Read system info in parallel const [hwInfo, osVersion] = await Promise.all([ getHardwareInfo(), getOsVersion(), ]) // Read Proton version + launch options if we have an app ID let protonVersion = "" let launchOptions = "" const currentAppId = session.appId if (currentAppId) { try { const [pv, lo] = await Promise.all([ getProtonVersion(currentAppId), getLaunchOptions(currentAppId), ]) protonVersion = pv launchOptions = lo } catch { // Non-critical, continue without } } // Use settings hardware override if set, otherwise auto-detected const hardwareSlug = settings.hardwareSlug || hwInfo.slug updateSession({ fpsAvg: logResult.fpsAvg ?? null, fpsLow: logResult.fpsLow ?? null, fpsHigh: logResult.fpsHigh ?? null, fpsOnePercentLow: logResult.fpsOnePercentLow ?? null, tdpWatts: logResult.tdpWatts ?? null, hardwareSlug, hardwareName: hwInfo.name, osVersion, protonVersion, launchOptions, }) } catch (e) { console.error("[DeckyVault] Error stopping recording:", e) setError("Failed to process recording. Check the MangoHud log.") } } if (!loaded) { return (
Loading...
) } return ( <> ) } // ── DeckyVault icon (flat SVG) ──────────────────────────────── function DeckyVaultIcon() { return ( ) } export default definePlugin(() => { return { name: "DeckyVault", titleView:
DeckyVault
, content: , icon: , alwaysRender: true, onDismount() { console.log("[DeckyVault] Plugin unloading") }, } })