优化页面交互并增强 Provider 配置能力
Build / build (push) Canceled after 0s
Playwright / e2e (push) Canceled after 0s

- 表单下拉框不再用 label 包裹,改为 div + aria-label,避免点击后
  下拉面板瞬间关闭
- Provider 卡片新增「从上游获取模型」和「修改」入口,支持编辑
  base URL、API Key 与 api_mode,凭据写入对应的环境变量
- 服务端抽出 provider-model-discovery 统一不同 api_mode 的模型发现,
  旧的 custom_providers 与新的 providers 字典结构都能正确更新
- Agent Bridge 改为后台启动,HTTP 接口在 Python 运行时就绪前即可用;
  worker 连接被拒时按类型重试,不重放可能已产生副作用的请求
- 断线重连后恢复 profiles、models 与会话列表,健康检查改为自调度
  的 setTimeout,离线时 2 秒后重试
- 批量删除确认文案改用 Popconfirm content,避免变成侧栏触发器文本
This commit is contained in:
2026-10-22 14:29:48 +08:00
committed by trae-solo-agent
parent 90c759c760
commit 3ca960f388
35 changed files with 876 additions and 78 deletions
+11 -4
View File
@@ -41,7 +41,8 @@ export const useAppStore = defineStore('app', () => {
const customModels = ref<Record<string, string[]>>({})
const modelAliases = ref<Record<string, Record<string, string>>>({})
const modelVisibility = ref<ModelVisibility>({})
const healthPollTimer = ref<ReturnType<typeof setInterval>>()
const healthPollTimer = ref<ReturnType<typeof setTimeout>>()
let healthPollGeneration = 0
const nodeVersion = ref('')
const isDocker = ref(false)
@@ -301,13 +302,19 @@ export const useAppStore = defineStore('app', () => {
function startHealthPolling(interval = 30000) {
stopHealthPolling()
checkConnection()
healthPollTimer.value = setInterval(checkConnection, interval)
const generation = healthPollGeneration
const poll = async () => {
await checkConnection()
if (generation !== healthPollGeneration) return
healthPollTimer.value = setTimeout(poll, connected.value ? interval : Math.min(interval, 2000))
}
void poll()
}
function stopHealthPolling() {
healthPollGeneration++
if (healthPollTimer.value) {
clearInterval(healthPollTimer.value)
clearTimeout(healthPollTimer.value)
healthPollTimer.value = undefined
}
}
+3 -1
View File
@@ -995,11 +995,13 @@ export const useChatStore = defineStore('chat', () => {
} else {
clearActiveSession()
}
sessionsLoaded.value = true
return true
} catch (err) {
console.error('Failed to load sessions:', err)
return false
} finally {
isLoadingSessions.value = false
sessionsLoaded.value = true
}
}