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 => `