auto-save 2026-05-11 14:56 (~5)

This commit is contained in:
2026-05-11 14:56:13 +08:00
parent d95aed8917
commit a3a60f151e
5 changed files with 123 additions and 10 deletions

View File

@@ -594,6 +594,100 @@ async function testApiConnection() {
}
}
let _hermesConfigLoaded = false;
let _hermesConfigLoading = false;
function setHermesConfigStatus(text, isError = false) {
const el = document.getElementById("hermesConfigStatus");
if (!el) return;
el.textContent = text;
el.style.color = isError ? "var(--err)" : "";
}
async function refreshHermesConfig(force = false) {
if (_hermesConfigLoading || (_hermesConfigLoaded && !force)) return;
const modelEl = document.getElementById("hermesModelDefault");
if (!modelEl) return;
_hermesConfigLoading = true;
setHermesConfigStatus("正在读取线上配置...");
try {
const res = await fetch("/feishu/hermes-config", {
credentials: "same-origin",
cache: "no-store",
});
const data = await res.json().catch(() => ({}));
if (!res.ok || data.code !== 0) throw new Error(data.msg || ("HTTP " + res.status));
const config = data.config || {};
const model = config.model || {};
document.getElementById("hermesModelDefault").value = model.default || "";
document.getElementById("hermesModelProvider").value = model.provider || "";
document.getElementById("hermesModelBaseUrl").value = model.base_url || "";
document.getElementById("mcpServersYaml").value = config.mcp_servers_yaml || "";
if (model.default) syncModelPick(model.default);
_hermesConfigLoaded = true;
setHermesConfigStatus("已读取线上配置" + (config.lxc ? " · " + config.lxc : ""));
} catch (e) {
setHermesConfigStatus("读取失败: " + (e.message || e), true);
} finally {
_hermesConfigLoading = false;
}
}
async function saveHermesConfig() {
const modelDefault = document.getElementById("hermesModelDefault")?.value.trim() || "";
const provider = document.getElementById("hermesModelProvider")?.value.trim() || "openrouter";
const baseUrl = document.getElementById("hermesModelBaseUrl")?.value.trim() || "";
const mcpServersYaml = document.getElementById("mcpServersYaml")?.value || "";
if (!modelDefault) {
toast("默认模型不能为空");
return;
}
if (!confirm("保存后会重启线上 Hermes agent当前正在生成的任务可能中断。继续吗")) return;
const btn = document.getElementById("hermesConfigSaveBtn");
const oldHTML = btn?.innerHTML;
if (btn) {
btn.disabled = true;
btn.textContent = "保存并重启中...";
}
setHermesConfigStatus("正在写入 config.yaml 并重启 Hermes agent...");
try {
const res = await fetch("/feishu/hermes-config", {
method: "POST",
credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: {
default: modelDefault,
provider,
base_url: baseUrl,
},
mcp_servers_yaml: mcpServersYaml,
restart: true,
}),
});
const data = await res.json().catch(() => ({}));
if (!res.ok || data.code !== 0) throw new Error(data.msg || ("HTTP " + res.status));
const saved = data.config || {};
const savedModel = saved.model || {};
if (savedModel.default) syncModelPick(savedModel.default);
document.getElementById("mcpServersYaml").value = saved.mcp_servers_yaml || "";
_hermesConfigLoaded = false;
setHermesConfigStatus("已保存并重启 · 备份 " + (saved.backup || "已创建"));
toast("模型与 MCP 配置已生效");
setTimeout(() => {
pingBackend();
refreshDashboard();
}, 1800);
} catch (e) {
setHermesConfigStatus("保存失败: " + (e.message || e), true);
toast("保存失败: " + (e.message || e));
} finally {
if (btn) {
btn.disabled = false;
btn.innerHTML = oldHTML;
}
}
}
async function fetchIP() {
const el = document.getElementById("statIP");
if (el) el.textContent = location.hostname;