Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Settings | LT</title> | |
| <link rel="stylesheet" href="/static/css/common.css"> | |
| <link rel="stylesheet" href="/static/css/analyze.css"> | |
| </head> | |
| <body data-page="settings"> | |
| <nav class="main-nav" id="main-nav"></nav> | |
| <div class="page-wrapper"> | |
| <!-- Data Sync --> | |
| <div class="control-panel control-panel--compact u-mt-lg"> | |
| <div class="control-panel__main"> | |
| <div class="card-title">Data Sync</div> | |
| <div class="card-subtitle u-mb-md"> | |
| Sync market data from Alpaca and upload to HuggingFace Dataset. | |
| </div> | |
| <div id="sync-status" class="u-mb-md" style="display:flex;gap:var(--space-md);flex-wrap:wrap;"> | |
| <div class="badge badge-neutral" id="hf-repo">--</div> | |
| <div class="badge badge-neutral" id="hf-token">--</div> | |
| <div class="badge badge-neutral" id="hf-last-sync">--</div> | |
| </div> | |
| <div class="action-row"> | |
| <button id="btn-sync-now" class="btn btn-primary">Sync Now</button> | |
| <button id="btn-push-config" class="btn btn-secondary">Push Config</button> | |
| <button id="btn-restore-config" class="btn btn-secondary">Restore Config</button> | |
| </div> | |
| <div id="sync-log" class="u-mt-md" style="font-family:var(--font-mono,monospace);font-size:var(--font-sm);color:var(--text-secondary,#999);min-height:1.5em;"></div> | |
| </div> | |
| </div> | |
| </div> | |
| <script> | |
| // ββ Sync Status ββ | |
| async function loadStatus() { | |
| try { | |
| const resp = await fetch('/api/hf/status'); | |
| const data = await resp.json(); | |
| document.getElementById('hf-repo').textContent = 'Repo: ' + data.repo; | |
| document.getElementById('hf-token').textContent = data.token_set ? 'Token: set' : 'Token: missing'; | |
| document.getElementById('hf-token').className = data.token_set ? 'badge badge-positive' : 'badge badge-negative'; | |
| document.getElementById('hf-last-sync').textContent = 'Last sync: ' + (data.last_sync || 'Never'); | |
| } catch (err) { | |
| document.getElementById('sync-log').textContent = 'Error loading status: ' + err.message; | |
| } | |
| } | |
| function setLog(msg) { | |
| document.getElementById('sync-log').textContent = msg; | |
| } | |
| // ββ Sync Now ββ | |
| document.getElementById('btn-sync-now').onclick = async () => { | |
| const btn = document.getElementById('btn-sync-now'); | |
| btn.disabled = true; | |
| setLog('Starting full sync...'); | |
| try { | |
| const resp = await fetch('/api/hf/sync', { method: 'POST' }); | |
| const data = await resp.json(); | |
| setLog('Sync started. Runs in background β check logs for progress.'); | |
| } catch (err) { | |
| setLog('Error: ' + err.message); | |
| } finally { | |
| btn.disabled = false; | |
| } | |
| }; | |
| // ββ Push Config ββ | |
| document.getElementById('btn-push-config').onclick = async () => { | |
| const btn = document.getElementById('btn-push-config'); | |
| btn.disabled = true; | |
| setLog('Pushing config to HF...'); | |
| try { | |
| const resp = await fetch('/api/hf/push-config', { method: 'POST' }); | |
| const data = await resp.json(); | |
| setLog(data.success ? 'Config pushed successfully.' : 'Push failed.'); | |
| } catch (err) { | |
| setLog('Error: ' + err.message); | |
| } finally { | |
| btn.disabled = false; | |
| } | |
| }; | |
| // ββ Restore Config ββ | |
| document.getElementById('btn-restore-config').onclick = async () => { | |
| const btn = document.getElementById('btn-restore-config'); | |
| btn.disabled = true; | |
| setLog('Restoring config from HF...'); | |
| try { | |
| const resp = await fetch('/api/hf/restore-config', { method: 'POST' }); | |
| const data = await resp.json(); | |
| setLog(data.success ? 'Config restored. Reload page to see changes.' : 'Restore failed.'); | |
| } catch (err) { | |
| setLog('Error: ' + err.message); | |
| } finally { | |
| btn.disabled = false; | |
| } | |
| }; | |
| // Init | |
| loadStatus(); | |
| </script> | |
| <script src="/static/js/common.js"></script> | |
| <script src="/static/js/analyze-modal.js"></script> | |
| <script src="/static/js/nav.js"></script> | |
| </body> | |
| </html> | |