import { WebProjectBackup } from './components/WebProjectBackup' import { useEffect, useState } from 'react' import { ProjectProvider } from './contexts/ProjectContext' import { ViewProvider, useView } from './contexts/ViewContext' import { KeyboardShortcutsProvider } from './contexts/KeyboardShortcutsContext' import { AppSettingsProvider, useAppSettings } from './contexts/AppSettingsContext' import { DevFlagsProvider } from './contexts/DevFlagsContext' import { useGenerationRecoveryWatcher } from './hooks/use-generation-recovery-watcher' import { Home } from './views/Home' import { Project } from './views/Project' import { webRequest } from './lib/web-platform' import { useBackend } from './hooks/use-backend' import { DevPanel } from './components/DevPanel' import { KeyboardShortcutsModal } from './components/KeyboardShortcutsModal' function Workspace() { const { currentView, goHome } = useView() const { connected, isLoading } = useBackend() const { isLoaded, runtimePolicyLoaded } = useAppSettings() useGenerationRecoveryWatcher() const ready = connected && isLoaded && runtimePolicyLoaded return
{ready ? 'LTX backend connected · generation runs on the remote server' : isLoading ? 'Checking LTX connection…' : 'LTX is not ready. Activate Video mode in Athena Deck. The connection is checked automatically.'}
{currentView === 'home' ? : ready ? :

Projects are retained. Generation becomes available when the LTX backend and its settings are reachable.

}
} export default function App() { const [session, setSession] = useState<{ backendUrl: string } | null>(null) const [checking, setChecking] = useState(true) const [password, setPassword] = useState('') const [error, setError] = useState('') const [message, setMessage] = useState('') const [help, setHelp] = useState(false) useEffect(() => { void webRequest<{ backendUrl: string }>('/web/session').then(setSession).catch(() => {}).finally(() => setChecking(false)) }, []) useEffect(() => { const listener = (event: Event) => setMessage((event as CustomEvent).detail); window.addEventListener('web-status', listener); return () => window.removeEventListener('web-status', listener) }, []) useEffect(() => { const listener = () => setHelp(true); window.addEventListener('open-settings', listener); return () => window.removeEventListener('open-settings', listener) }, []) if (checking) return
Loading LTX DeskWEB…
if (!session) return
{ event.preventDefault(); setError('') try { await webRequest('/web/login', { password }); setPassword(''); setSession(await webRequest('/web/session')) } catch (e) { setError(e instanceof Error ? e.message : String(e)) } }}>

LTX DeskWEB

Browser workspace for your LTX backend.

setPassword(e.target.value)} className="mt-2 mb-4 w-full p-3 bg-zinc-800 rounded" />

{error}

return
LTX DeskWEB · Preview
{help && } {message &&
{message}
}
}