}
// 切换模型:保存到任务,并重启会话以应用
+ // 注意:监听器在脚本加载时只绑定一次(见下方初始化区),不放在 showTerminalMode 内,
+ // 避免重复进入终端页导致重复绑定 / 未绑定,从而引起“点了没反应”。
let modelSwitching = false;
- modelSelect.addEventListener('change', async () => {
+ function onModelChange() {
if (modelSwitching || !currentTask) return;
const newModel = modelSelect.value;
modelSwitching = true;
modelSelect.disabled = true;
- try {
- const res = await fetch(API + '/api/tasks/' + currentTask.id + '/model', {
- method: 'POST',
- headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()),
- body: JSON.stringify({ model: newModel })
- });
- if (!res.ok) {
- const d = await res.json().catch(()=>({}));
- alert(d.error || '设置模型失败');
+ (async () => {
+ try {
+ const res = await fetch(API + '/api/tasks/' + currentTask.id + '/model', {
+ method: 'POST',
+ headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()),
+ body: JSON.stringify({ model: newModel })
+ });
+ if (!res.ok) {
+ const d = await res.json().catch(()=>({}));
+ alert(d.error || '设置模型失败');
+ modelSelect.value = (currentTask.model) || '';
+ return;
+ }
+ const data = await res.json();
+ currentTask.model = (data.task && data.task.model) || '';
+ term.writeln('\x1b[33m⏳ 切换模型为 "' + (currentTask.model || '默认·最新GLM') + '",正在重启会话...\x1b[0m');
+ // 重启以应用新模型(resume 同样会采用新 --model)
+ killCurrent();
+ if (term) term.clear();
+ connectWS();
+ } catch (e) {
+ alert('设置模型失败: ' + e.message);
modelSelect.value = (currentTask.model) || '';
- return;
+ } finally {
+ modelSwitching = false;
+ modelSelect.disabled = false;
}
- const data = await res.json();
- currentTask.model = (data.task && data.task.model) || '';
- term.writeln('\x1b[33m⏳ 切换模型为 "' + (currentTask.model || '默认·最新GLM') + '",正在重启会话...\x1b[0m');
- // 重启以应用新模型(resume 同样会采用新 --model)
- killCurrent();
- if (term) term.clear();
- connectWS();
- } catch (e) {
- alert('设置模型失败: ' + e.message);
- modelSelect.value = (currentTask.model) || '';
- } finally {
- modelSwitching = false;
- modelSelect.disabled = false;
- }
- });
+ })();
+ }
// ========== 终端输入辅助 ==========
function sendInput(text) {
term.writeln('\x1b[33m⏳ 重启会话中...\x1b[0m');
connectWS();
};
+
+ // 模型下拉:全局只绑定一次
+ // - change:切换模型并重启会话
+ // - focus / mousedown:点开下拉时实时刷新模型列表(B 方案,所见即最新)
+ modelSelect.addEventListener('change', onModelChange);
+ modelSelect.addEventListener('focus', () => { loadModelSelect(); });
+ modelSelect.addEventListener('mousedown', () => { loadModelSelect(); });
document.getElementById('btn-list').onclick = () => { window.open('/', 'cb_picker'); };
document.getElementById('btn-close').onclick = () => {
killCurrent();