Changes, bugfixes and updates to the matrix. Added 1.2v batteries

This commit is contained in:
2026-04-13 12:45:50 +02:00
parent beef23d48e
commit 7b140d4079
10 changed files with 179 additions and 62 deletions

View File

@@ -1202,8 +1202,6 @@ function initAudit() {
const el = document.getElementById(id);
if (el) el.value = "";
});
const cb = document.getElementById("filter-confirmed");
if (cb) cb.checked = false;
const banner = document.getElementById("audit-task-filter-banner");
if (banner) {
banner.textContent = `Showing entries for run ${_auditTaskId.slice(0, 8)}`;
@@ -1218,7 +1216,6 @@ function initAudit() {
const el = document.getElementById(id);
if (el) el.value = "";
});
document.getElementById("filter-confirmed").checked = false;
_auditTaskId = "";
const banner = document.getElementById("audit-task-filter-banner");
if (banner) banner.style.display = "none";
@@ -1235,8 +1232,6 @@ async function loadAudit(page) {
const end = document.getElementById("filter-end")?.value;
const tool = document.getElementById("filter-tool")?.value;
const session = document.getElementById("filter-session")?.value;
const confirmed = document.getElementById("filter-confirmed")?.checked;
const startISO = parseEuDate(start);
const endISO = parseEuDate(end, true);
if (startISO) params.set("start", startISO);
@@ -1244,7 +1239,6 @@ async function loadAudit(page) {
if (tool) params.set("tool_name", tool);
if (session) params.set("session_id", session);
if (_auditTaskId) params.set("task_id", _auditTaskId);
if (confirmed) params.set("confirmed_only", "true");
params.set("page", auditPage);
params.set("per_page", 50);
@@ -1265,7 +1259,6 @@ function renderAuditTable(data) {
<td><code>${esc(e.tool_name)}</code></td>
<td class="args-cell">${esc(JSON.stringify(e.arguments).slice(0, 80))}</td>
<td>${esc((e.result_summary || "").slice(0, 80))}</td>
<td>${e.confirmed ? '<span class="badge badge-green">✓</span>' : '<span class="badge badge-red">✗</span>'}</td>
<td><code>${esc((e.session_id || "").slice(0,8))}</code></td>
`;
tr.addEventListener("click", () => openAuditDetail(e));
@@ -1292,9 +1285,6 @@ function openAuditDetail(e) {
document.getElementById("audit-detail-ts").textContent = formatDate(e.timestamp);
document.getElementById("audit-detail-session").textContent = e.session_id || "—";
document.getElementById("audit-detail-task").textContent = e.task_id || "—";
document.getElementById("audit-detail-confirmed").innerHTML = e.confirmed
? '<span class="badge badge-green">Yes</span>'
: '<span class="badge badge-red">No</span>';
let _args = e.arguments;
if (typeof _args === "string") { try { _args = JSON.parse(_args); } catch {} }
document.getElementById("audit-detail-args").textContent =
@@ -1411,6 +1401,7 @@ async function saveProviderKey(provider) {
document.getElementById(`provider-key-${provider}-input`).value = "";
showFlash(`${provider} key saved.`);
loadProviderKeys();
loadDefaultProvider();
} else {
const d = await r.json().catch(() => ({}));
showFlash(d.detail || "Error saving key.");
@@ -1420,7 +1411,7 @@ async function saveProviderKey(provider) {
async function clearProviderKey(provider) {
if (!confirm(`Clear the ${provider} API key? This may break agent runs that rely on it.`)) return;
const r = await fetch(`/api/settings/provider-keys/${provider}`, { method: "DELETE" });
if (r.ok) { showFlash(`${provider} key cleared.`); loadProviderKeys(); }
if (r.ok) { showFlash(`${provider} key cleared.`); loadProviderKeys(); loadDefaultProvider(); }
else showFlash("Error clearing key.");
}
@@ -2448,6 +2439,7 @@ function initSettings() {
loadApiKeyStatus();
loadProviderKeys();
loadUsersBaseFolder();
loadDefaultProvider();
loadLimits();
loadDefaultModels();
loadProxyTrust();
@@ -2785,13 +2777,56 @@ async function loadLimits() {
if (mcrEl) mcrEl.value = data.max_concurrent_runs;
if (defaultsEl) {
defaultsEl.textContent =
`.env defaults: max_tool_calls=${data.defaults.max_tool_calls}, ` +
`max_autonomous_runs_per_hour=${data.defaults.max_autonomous_runs_per_hour}, ` +
`max_concurrent_runs=${data.defaults.max_concurrent_runs}`;
`Built-in defaults: tool_calls=${data.defaults.max_tool_calls}, ` +
`runs/hour=${data.defaults.max_autonomous_runs_per_hour}, ` +
`concurrent=${data.defaults.max_concurrent_runs}`;
}
} catch { /* ignore */ }
}
async function loadDefaultProvider() {
const sel = document.getElementById("default-provider-select");
if (!sel) return;
try {
const r = await fetch("/api/settings/provider");
if (!r.ok) return;
const data = await r.json();
const labels = { anthropic: "Anthropic", openrouter: "OpenRouter", openai: "OpenAI" };
const available = data.available_providers || [];
sel.innerHTML = "";
if (available.length === 0) {
const opt = document.createElement("option");
opt.value = "";
opt.textContent = "No providers configured";
sel.appendChild(opt);
sel.disabled = true;
sel.closest("section")?.querySelector(".btn")?.setAttribute("disabled", "");
return;
}
for (const p of available) {
const opt = document.createElement("option");
opt.value = p;
opt.textContent = labels[p] || p;
sel.appendChild(opt);
}
sel.disabled = false;
sel.closest("section")?.querySelector(".btn")?.removeAttribute("disabled");
sel.value = data.default_provider || available[0];
} catch { /* ignore */ }
}
async function saveDefaultProvider() {
const sel = document.getElementById("default-provider-select");
if (!sel) return;
const r = await fetch("/api/settings/provider", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ default_provider: sel.value }),
});
if (r.ok) showFlash("Default provider saved ✓");
else showFlash("Error saving default provider");
}
async function loadDefaultModels() {
const defSel = document.getElementById("dm-default");
const freeSel = document.getElementById("dm-free");
@@ -5725,3 +5760,15 @@ document.addEventListener("DOMContentLoaded", () => {
initNav();
_initPage(location.pathname);
});
// Close any open modal on Escape
document.addEventListener("keydown", e => {
if (e.key !== "Escape") return;
const overlay = [...document.querySelectorAll(".modal-overlay")]
.find(el => el.style.display !== "none" && !el.classList.contains("hidden"));
if (!overlay) return;
// Find the ✕ close button, or any button whose onclick closes the modal
const closeBtn = [...overlay.querySelectorAll("button")]
.find(b => b.textContent.trim() === "✕" || /^close/i.test((b.getAttribute("onclick") || "").trim()));
closeBtn?.click();
});