agentic-os/dashboard/pages/settings.js

158 lines
6.6 KiB
JavaScript

async function renderSettings() {
const content = document.getElementById('pageContent');
content.innerHTML = `
<div class="page-header">
<div>
<h1 class="page-title">Settings</h1>
<p class="page-subtitle">Configure Agentic OS</p>
</div>
<button class="btn btn-primary" onclick="saveSettings()">💾 Save Settings</button>
</div>
<div id="settingsForm"><div class="loading">Loading...</div></div>
`;
try {
const settings = await api.getSettings();
const container = document.getElementById('settingsForm');
const prefs = settings.agent_preferences || {};
const dashboard = settings.dashboard || {};
const limits = settings.free_tier_limits || {};
container.innerHTML = `
<div class="card">
<div class="card-header"><span class="card-title">Agent Preferences</span></div>
<div class="grid grid-2">
<div class="form-group">
<label class="form-label">opencode Enabled</label>
<select id="ocEnabled">
<option value="true" ${prefs.opencode?.enabled !== false ? 'selected' : ''}>Enabled</option>
<option value="false" ${prefs.opencode?.enabled === false ? 'selected' : ''}>Disabled</option>
</select>
</div>
<div class="form-group">
<label class="form-label">Hermes Enabled</label>
<select id="hermesEnabled">
<option value="true" ${prefs.hermes?.enabled !== false ? 'selected' : ''}>Enabled</option>
<option value="false" ${prefs.hermes?.enabled === false ? 'selected' : ''}>Disabled</option>
</select>
</div>
<div class="form-group">
<label class="form-label">Gemini CLI Enabled</label>
<select id="geminiEnabled">
<option value="true" ${prefs.gemini?.enabled !== false ? 'selected' : ''}>Enabled</option>
<option value="false" ${prefs.gemini?.enabled === false ? 'selected' : ''}>Disabled</option>
</select>
</div>
<div class="form-group">
<label class="form-label">Dashboard Theme</label>
<select id="themeSelect">
<option value="dark" ${dashboard.dark_mode !== false ? 'selected' : ''}>Dark</option>
<option value="light" ${dashboard.dark_mode === false ? 'selected' : ''}>Light</option>
</select>
</div>
</div>
</div>
<div class="card">
<div class="card-header"><span class="card-title">Dashboard</span></div>
<div class="grid grid-2">
<div class="form-group">
<label class="form-label">Port</label>
<input id="dashPort" value="${dashboard.port || 8080}" type="number">
</div>
<div class="form-group">
<label class="form-label">Host</label>
<input id="dashHost" value="${dashboard.host || '127.0.0.1'}">
</div>
</div>
</div>
<div class="card">
<div class="card-header"><span class="card-title">Free Tier Limits</span></div>
<div class="grid grid-2">
<div class="form-group">
<label class="form-label">Gemini Flash — Requests/Day</label>
<input id="geminiReqs" value="${limits.gemini_flash?.requests_per_day || 1500}" type="number">
</div>
<div class="form-group">
<label class="form-label">Gemini Flash — Tokens/Day</label>
<input id="geminiTokens" value="${limits.gemini_flash?.tokens_per_day || 1000000}" type="number">
</div>
<div class="form-group">
<label class="form-label">OpenRouter Free — Requests/Day</label>
<input id="orReqs" value="${limits.openrouter_free?.requests_per_day || 100}" type="number">
</div>
<div class="form-group">
<label class="form-label">OpenRouter Free — Tokens/Day</label>
<input id="orTokens" value="${limits.openrouter_free?.tokens_per_day || 200000}" type="number">
</div>
</div>
</div>
<div class="card" style="border-color:var(--red)">
<div class="card-header"><span class="card-title" style="color:var(--red)">Danger Zone</span></div>
<p style="font-size:13px;color:var(--text2);margin-bottom:12px">Reset all settings to defaults. This cannot be undone.</p>
<button class="btn btn-danger" onclick="resetSettings()">Reset to Defaults</button>
</div>
`;
} catch (err) {
document.getElementById('settingsForm').innerHTML = `<div class="empty-state"><div class="icon">⚠</div><p>${escapeHtml(err.message)}</p></div>`;
}
}
async function saveSettings() {
try {
const settings = {
agent_preferences: {
opencode: { enabled: document.getElementById('ocEnabled').value === 'true' },
hermes: { enabled: document.getElementById('hermesEnabled').value === 'true' },
gemini: { enabled: document.getElementById('geminiEnabled').value === 'true' },
},
dashboard: {
port: parseInt(document.getElementById('dashPort').value) || 8080,
host: document.getElementById('dashHost').value || '127.0.0.1',
dark_mode: document.getElementById('themeSelect').value === 'dark',
},
free_tier_limits: {
gemini_flash: {
requests_per_day: parseInt(document.getElementById('geminiReqs').value) || 1500,
tokens_per_day: parseInt(document.getElementById('geminiTokens').value) || 1000000,
},
openrouter_free: {
requests_per_day: parseInt(document.getElementById('orReqs').value) || 100,
tokens_per_day: parseInt(document.getElementById('orTokens').value) || 200000,
},
},
};
await api.updateSettings(settings);
showToast('Settings saved', 'success');
renderSettings();
} catch (err) {
showToast(`Error: ${err.message}`, 'error');
}
}
function resetSettings() {
if (!confirm('Reset all settings to defaults?')) return;
const defaults = {
theme: 'dark',
agent_preferences: {
opencode: { enabled: true, binary: 'opencode', max_turns: 50 },
hermes: { enabled: true, binary: 'hermes' },
gemini: { enabled: true, binary: 'gemini', model: 'gemini-2.5-flash' },
},
dashboard: { port: 8080, host: '127.0.0.1', dark_mode: true },
free_tier_limits: {
gemini_flash: { requests_per_day: 1500, tokens_per_day: 1000000 },
openrouter_free: { requests_per_day: 100, tokens_per_day: 200000 },
},
};
api.updateSettings(defaults).then(() => {
showToast('Settings reset to defaults', 'success');
renderSettings();
}).catch(err => {
showToast(`Error: ${err.message}`, 'error');
});
}