From b2dbacb870f5623d5e4b09f47514023921c6e15e Mon Sep 17 00:00:00 2001 From: cc-dan Date: Wed, 11 Mar 2026 06:14:42 +0000 Subject: [PATCH] feat: fetch upstream model list, password modal, sub-modal close button styling - Add fetch models from upstream API via /v1/models endpoint with datalist suggestions - Refactor password change from inline form to button + modal - Fix sub-modal close button styling to match main settings panel --- CHANGELOG.md | 3 + public/app.js | 257 ++++++++++++++++++++++++++++++++--------------- public/style.css | 21 ++++ server.js | 66 ++++++++++++ 4 files changed, 267 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 734e4af..36a4c9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # 更新记录 - **v1.2.6** + - 新增编辑模板弹窗「获取上游模型列表」:通过 `/v1/models` 端点拉取可用模型,填充到四个模型输入框的下拉建议列表,支持自定义端点地址。 + - 修改密码改为按钮+弹窗模式:设置面板中密码修改从内联表单改为独立弹窗,成功后自动关闭。 + - 子弹窗关闭按钮样式适配:编辑模板和修改密码弹窗的关闭按钮统一为与主面板一致的风格。 - 新增 AskUserQuestion 选项预览区:左侧选项列表,右侧实时显示选项说明;桌面端 hover 切换,移动端 tap 选中后点确认按钮发送。 - 修复 `~/.claude/settings.json` 写入竞争问题:改为原子写入(先写临时文件再 rename),避免 Claude 子进程读到写了一半的文件导致随机 401 认证失败。 - 修复 `ANTHROPIC_REASONING_MODEL` 被误删问题:补充到 settings.json 白名单,保留该字段不被覆盖。 diff --git a/public/app.js b/public/app.js index 089b3cf..753f113 100644 --- a/public/app.js +++ b/public/app.js @@ -326,6 +326,10 @@ if (typeof _onModelConfig === 'function') _onModelConfig(msg.config); break; + case 'fetch_models_result': + if (typeof _onFetchModelsResult === 'function') _onFetchModelsResult(msg); + break; + case 'background_done': // A background task completed (browser was disconnected or viewing another session) showToast(`「${msg.title}」任务完成`, msg.sessionId); @@ -1310,6 +1314,7 @@ let _onNotifyConfig = null; let _onNotifyTestResult = null; let _onModelConfig = null; + let _onFetchModelsResult = null; const settingsBtn = $('#settings-btn'); @@ -1373,23 +1378,9 @@
修改密码
-
- - +
+
-
- - -
至少 8 位,包含大写/小写/数字/特殊字符中的 2 种
-
-
- - -
-
- -
-
`; overlay.appendChild(panel); @@ -1519,22 +1510,44 @@
+ +
+ +
+ +
+ + +
+
+ + +
+
+ +
+
- +
- +
- +
- +
+
@@ -1542,7 +1555,51 @@ modalOverlay.appendChild(modal); document.body.appendChild(modalOverlay); - const closeModal = () => { document.body.removeChild(modalOverlay); }; + // Custom endpoint checkbox toggle + const customEndpointCb = modal.querySelector('#tpl-ed-custom-endpoint'); + const endpointInput = modal.querySelector('#tpl-ed-models-endpoint'); + customEndpointCb.addEventListener('change', () => { + endpointInput.style.display = customEndpointCb.checked ? '' : 'none'; + }); + + // Fetch models + const fetchBtn = modal.querySelector('#tpl-ed-fetch-models'); + const fetchStatus = modal.querySelector('#tpl-ed-fetch-status'); + const datalist = modal.querySelector('#tpl-dl-models'); + + fetchBtn.addEventListener('click', () => { + const apiBase = modal.querySelector('#tpl-ed-apibase').value.trim(); + const apiKey = modal.querySelector('#tpl-ed-apikey').value.trim(); + if (!apiBase || !apiKey) { + fetchStatus.textContent = '请先填写 API Base 和 API Key'; + fetchStatus.style.color = 'var(--text-error, #e85d5d)'; + return; + } + const modelsEndpoint = customEndpointCb.checked ? endpointInput.value.trim() : ''; + fetchBtn.disabled = true; + fetchStatus.textContent = '正在获取...'; + fetchStatus.style.color = 'var(--text-secondary)'; + + _onFetchModelsResult = (result) => { + _onFetchModelsResult = null; + fetchBtn.disabled = false; + if (result.success) { + datalist.innerHTML = result.models.map(m => `