Files
HomeAgent/cmd/gui/preload.js
jianf 5a8fda955a gui: 性能修复(星图/reasoning/渲染循环)+设备桥配置解耦(独立prefs+IPC)
性能(卡死修复, 已部署本机验证 GPU 91%->14%):
- reasoning_content 懒加载: 折叠正文不再 marked.parse, 点击展开时才解析
- 星图动画仅"星图"子面板激活才跑, 12fps限制, 关抗锯齿+pixelRatio=1, 粒子3000->1200
- renderAll/refreshAll 非chat视图跳过聊天整块重建
- switchView(chat) 多段延迟滚动到底部(修复进入停在顶部)

设备桥(配置与连接解耦, 为远程homed被控做准备):
- 设备桥改由 gui-prefs.json 的 deviceBridge{enabled,gateway,token} 驱动, 不再依赖 type=device 连接
- 新增 IPC device-bridge:get/set (状态查询+动态启停), preload 暴露 deviceBridge API
- whenReady 按 prefs 启动设备桥

待后续: 设备页UI入口(renderDevices 本机卡片仍被 conn.type!==device 条件挡住, 需改为始终显示+调用 device-bridge:set)
2026-08-17 17:35:47 +08:00

49 lines
1.6 KiB
JavaScript

const { contextBridge, ipcRenderer } = require("electron");
contextBridge.exposeInMainWorld("homeagent", {
win: {
minimize: () => ipcRenderer.invoke("window:minimize"),
toggleMaximize: () => ipcRenderer.invoke("window:toggleMaximize"),
close: () => ipcRenderer.invoke("window:close"),
},
connections: {
list: () => ipcRenderer.invoke("connections:list"),
add: (conn) => ipcRenderer.invoke("connections:add", conn),
update: (id, updates) =>
ipcRenderer.invoke("connections:update", { id, updates }),
delete: (id) => ipcRenderer.invoke("connections:delete", id),
setCurrent: (id) => ipcRenderer.invoke("connections:setCurrent", id),
},
cli: {
request: (socketPath, apiKey, line) =>
ipcRenderer.invoke("cli:request", { socketPath, apiKey, line }),
},
webui: {
setAuth: (url, cookie, headers, username, password) =>
ipcRenderer.invoke("webui:setAuth", {
url,
cookie,
headers,
username,
password,
}),
openLogin: (url, username, password) =>
ipcRenderer.invoke("webui:openLogin", { url, username, password }),
onLoginResult: (cb) =>
ipcRenderer.on("webui:login-result", (_e, d) => cb(d)),
},
cacheBg: (src) => ipcRenderer.invoke("bg:cache", { src }),
log: (m) => ipcRenderer.invoke("log:r", m),
prefs: {
get: () => ipcRenderer.invoke("prefs:get"),
set: (p) => ipcRenderer.invoke("prefs:set", p),
},
device: {
identity: () => ipcRenderer.invoke("device:identity"),
},
deviceBridge: {
get: () => ipcRenderer.invoke("device-bridge:get"),
set: (cfg) => ipcRenderer.invoke("device-bridge:set", cfg),
},
});