auto-save 2026-05-11 16:03 (~5)
This commit is contained in:
@@ -1,12 +1,5 @@
|
|||||||
{
|
{
|
||||||
"entries": [
|
"entries": [
|
||||||
{
|
|
||||||
"files_changed": 1,
|
|
||||||
"hash": "2d39ee4",
|
|
||||||
"message": "auto-save 2026-05-10 07:39 (~1)",
|
|
||||||
"ts": "2026-05-10T07:39:49+08:00",
|
|
||||||
"type": "commit"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"files_changed": 1,
|
"files_changed": 1,
|
||||||
"hash": "ee2e220",
|
"hash": "ee2e220",
|
||||||
@@ -3260,6 +3253,13 @@
|
|||||||
"type": "session-heartbeat",
|
"type": "session-heartbeat",
|
||||||
"message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 4 项未提交变更 · 最近提交:auto-save 2026-05-11 15:52 (~5)",
|
"message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 4 项未提交变更 · 最近提交:auto-save 2026-05-11 15:52 (~5)",
|
||||||
"files_changed": 4
|
"files_changed": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ts": "2026-05-11T15:58:12+08:00",
|
||||||
|
"type": "commit",
|
||||||
|
"message": "auto-save 2026-05-11 15:58 (~4)",
|
||||||
|
"hash": "8f80417",
|
||||||
|
"files_changed": 4
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
2
RULES.md
2
RULES.md
@@ -20,7 +20,7 @@
|
|||||||
- 爱马仕前端「仪表盘」活动热力图已重做为带摘要、月份标尺、紧凑格子和细分色阶的活动卡片
|
- 爱马仕前端「仪表盘」活动热力图已重做为带摘要、月份标尺、紧凑格子和细分色阶的活动卡片
|
||||||
- 爱马仕前端「设置 → 连接」可自助维护 API 地址 / API Key 并测试连接;「对话 → 存周报」和「设置 → 周报记录」会在本地保存任务描述、上下文片段和最终周报
|
- 爱马仕前端「设置 → 连接」可自助维护 API 地址 / API Key 并测试连接;「对话 → 存周报」和「设置 → 周报记录」会在本地保存任务描述、上下文片段和最终周报
|
||||||
- 爱马仕前端「设置 → AI 模型接入」和「设置 → MCP 工具接入」可分别维护 LXC 内 `/opt/hermes-agent/config.yaml` 的 `model` 与 `mcp_servers` 块,保存后重启 Docker `hermes-agent`
|
- 爱马仕前端「设置 → AI 模型接入」和「设置 → MCP 工具接入」可分别维护 LXC 内 `/opt/hermes-agent/config.yaml` 的 `model` 与 `mcp_servers` 块,保存后重启 Docker `hermes-agent`
|
||||||
- 当前前端静态壳缓存版本:`hermes-ui-v29`
|
- 当前前端静态壳缓存版本:`hermes-ui-v30`
|
||||||
- 文档 / 解析:https://styles.kang-kang.com
|
- 文档 / 解析:https://styles.kang-kang.com
|
||||||
- 管理后台:待定
|
- 管理后台:待定
|
||||||
- 代码仓:https://git.kang-kang.com/kangwan/hermes-glass-ui-personal
|
- 代码仓:https://git.kang-kang.com/kangwan/hermes-glass-ui-personal
|
||||||
|
|||||||
29
src/app.js
29
src/app.js
@@ -144,16 +144,28 @@ function ensureModelChoice(modelValue, labelValue = "") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function syncModelPick(modelValue) {
|
function updateModelDisplay(modelValue, providerValue = "") {
|
||||||
|
const model = (modelValue || state.model || DEFAULT_MODEL_ID).trim();
|
||||||
|
const provider = (providerValue || "").trim();
|
||||||
|
const pick = document.getElementById("modelPick");
|
||||||
|
const option = pick ? Array.from(pick.options).find(item => item.value === model) : null;
|
||||||
|
const label = option?.textContent || model;
|
||||||
|
const stat = document.getElementById("statModel");
|
||||||
|
const statSub = document.getElementById("statModelSub");
|
||||||
|
const aboutModel = document.getElementById("aboutModelValue");
|
||||||
|
if (stat) stat.textContent = label;
|
||||||
|
if (statSub) statSub.textContent = provider ? "Provider: " + provider : "Provider 以设置为准";
|
||||||
|
if (aboutModel) aboutModel.textContent = provider ? model + " · " + provider : model;
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncModelPick(modelValue, providerValue = "") {
|
||||||
const model = (modelValue || state.model || "").trim();
|
const model = (modelValue || state.model || "").trim();
|
||||||
const pick = document.getElementById("modelPick");
|
const pick = document.getElementById("modelPick");
|
||||||
if (!pick || !model) return;
|
if (!pick || !model) return;
|
||||||
ensureModelChoice(model);
|
ensureModelChoice(model);
|
||||||
let option = Array.from(pick.options).find(item => item.value === model);
|
|
||||||
pick.value = model;
|
pick.value = model;
|
||||||
state.model = model;
|
state.model = model;
|
||||||
const stat = document.getElementById("statModel");
|
updateModelDisplay(model, providerValue);
|
||||||
if (stat) stat.textContent = option.textContent || model;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------- 会话持久化 ----------
|
// ---------- 会话持久化 ----------
|
||||||
@@ -657,7 +669,8 @@ async function refreshHermesConfig(force = false) {
|
|||||||
},
|
},
|
||||||
mcp_servers_yaml: config.mcp_servers_yaml || "",
|
mcp_servers_yaml: config.mcp_servers_yaml || "",
|
||||||
};
|
};
|
||||||
if (model.default) syncModelPick(model.default);
|
if (model.default) syncModelPick(model.default, model.provider || "");
|
||||||
|
else updateModelDisplay(state.model, model.provider || "");
|
||||||
_hermesConfigLoaded = true;
|
_hermesConfigLoaded = true;
|
||||||
const suffix = config.lxc ? " · " + config.lxc : "";
|
const suffix = config.lxc ? " · " + config.lxc : "";
|
||||||
setHermesModelStatus("已读取模型配置" + suffix);
|
setHermesModelStatus("已读取模型配置" + suffix);
|
||||||
@@ -721,7 +734,7 @@ async function saveModelConfig() {
|
|||||||
restart: true,
|
restart: true,
|
||||||
});
|
});
|
||||||
const savedModel = saved.model || {};
|
const savedModel = saved.model || {};
|
||||||
if (savedModel.default) syncModelPick(savedModel.default);
|
if (savedModel.default) syncModelPick(savedModel.default, savedModel.provider || model.provider || "");
|
||||||
_hermesConfigSnapshot = {
|
_hermesConfigSnapshot = {
|
||||||
model: {
|
model: {
|
||||||
default: savedModel.default || model.default,
|
default: savedModel.default || model.default,
|
||||||
@@ -770,7 +783,7 @@ async function saveMcpConfig() {
|
|||||||
restart: true,
|
restart: true,
|
||||||
});
|
});
|
||||||
const savedModel = saved.model || model;
|
const savedModel = saved.model || model;
|
||||||
if (savedModel.default) syncModelPick(savedModel.default);
|
if (savedModel.default) syncModelPick(savedModel.default, savedModel.provider || model.provider || "");
|
||||||
document.getElementById("mcpServersYaml").value = saved.mcp_servers_yaml || "";
|
document.getElementById("mcpServersYaml").value = saved.mcp_servers_yaml || "";
|
||||||
_hermesConfigSnapshot = {
|
_hermesConfigSnapshot = {
|
||||||
model: {
|
model: {
|
||||||
@@ -1041,7 +1054,7 @@ function renderChat(streaming = false) {
|
|||||||
<span class="wh-mid">PARIS</span>
|
<span class="wh-mid">PARIS</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="welcome-title">${greet},今天想聊点什么?</div>
|
<div class="welcome-title">${greet},今天想聊点什么?</div>
|
||||||
<div class="welcome-sub">由 Gemini 3 Pro 驱动 · 你的私人 AI 助手</div>
|
<div class="welcome-sub">由当前 AI 模型驱动 · 你的私人 AI 助手</div>
|
||||||
<div class="welcome-chips">
|
<div class="welcome-chips">
|
||||||
<span class="chip" data-p="帮我规划今晚三道菜的晚餐">🍽 今晚吃什么</span>
|
<span class="chip" data-p="帮我规划今晚三道菜的晚餐">🍽 今晚吃什么</span>
|
||||||
<span class="chip" data-p="用通俗语言解释 MCP 协议">💡 解释一个概念</span>
|
<span class="chip" data-p="用通俗语言解释 MCP 协议">💡 解释一个概念</span>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<link rel="icon" type="image/svg+xml" href="./icon.svg">
|
<link rel="icon" type="image/svg+xml" href="./icon.svg">
|
||||||
<link rel="apple-touch-icon" href="./icon.svg">
|
<link rel="apple-touch-icon" href="./icon.svg">
|
||||||
<title>爱马仕 · AI</title>
|
<title>爱马仕 · AI</title>
|
||||||
<link rel="stylesheet" href="./styles.css?v=20260511-settings-v29">
|
<link rel="stylesheet" href="./styles.css?v=20260511-settings-v30">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
@@ -952,8 +952,8 @@ git push # Gitea kangwan/hermes-glass-ui-personal
|
|||||||
</div>
|
</div>
|
||||||
<div class="stat-body">
|
<div class="stat-body">
|
||||||
<div class="stat-label">当前模型</div>
|
<div class="stat-label">当前模型</div>
|
||||||
<div class="stat-value" id="statModel">Gemini 3 Pro</div>
|
<div class="stat-value" id="statModel">google/gemini-3.1-pro-preview</div>
|
||||||
<div class="stat-sub">Google AI Studio</div>
|
<div class="stat-sub" id="statModelSub">Provider 以设置为准</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat stat-lg">
|
<div class="stat stat-lg">
|
||||||
@@ -1385,7 +1385,7 @@ git push # Gitea kangwan/hermes-glass-ui-personal
|
|||||||
</div>
|
</div>
|
||||||
<div class="about-item">
|
<div class="about-item">
|
||||||
<div class="about-lbl">模型</div>
|
<div class="about-lbl">模型</div>
|
||||||
<div class="about-val">Gemini 3 Pro · Google AI Studio</div>
|
<div class="about-val" id="aboutModelValue">AI 模型接入配置为准</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="about-item">
|
<div class="about-item">
|
||||||
<div class="about-lbl">代理</div>
|
<div class="about-lbl">代理</div>
|
||||||
@@ -1408,6 +1408,6 @@ git push # Gitea kangwan/hermes-glass-ui-personal
|
|||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="./app.js?v=20260511-settings-v29"></script>
|
<script src="./app.js?v=20260511-settings-v30"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
// 爱马仕 Hermes · 轻量 Service Worker
|
// 爱马仕 Hermes · 轻量 Service Worker
|
||||||
// 静态壳走 network-first(拿不到再回退缓存),API 直通
|
// 静态壳走 network-first(拿不到再回退缓存),API 直通
|
||||||
const CACHE = "hermes-ui-v29";
|
const CACHE = "hermes-ui-v30";
|
||||||
const ASSETS = [
|
const ASSETS = [
|
||||||
"./",
|
"./",
|
||||||
"./index.html",
|
"./index.html",
|
||||||
"./styles.css?v=20260511-settings-v29",
|
"./styles.css?v=20260511-settings-v30",
|
||||||
"./app.js?v=20260511-settings-v29",
|
"./app.js?v=20260511-settings-v30",
|
||||||
"./manifest.webmanifest",
|
"./manifest.webmanifest",
|
||||||
"./icon.svg",
|
"./icon.svg",
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user