Files
HomeAgent/cmd/gui/package.json
JianFeeeee e3c81269b6 fix(gui): 连接配置不再被空/半截文件覆写,保存改原子写
## 现象
connections.json 变成 {"connections":[],"currentId":null},
用户的连接列表全部丢失(2026-10-01 实测)。

## 根因:两个缺陷叠加
1) loadConnections() 的损坏恢复分支无法区分两种情况:
     · 文件内容确实损坏        → 备份+重建(合理)
     · 读到空/半截内容        → **也走同一条路,覆写成空配置**
   第二类真实会发生:saveConnections() 用非原子 writeFileSync 截断重写,
   落地过程存在「已截断、未写完」窗口;此刻任何一次读取拿到半截内容,
   JSON.parse 抛错 → 用户配置被永久销毁,且没有二次确认。

   实测(沙箱跑真实函数):空文件 -> 返回空配置,
   **并把文件改写成 {"connections":[],"currentId":null}**。

2) 损坏备份只写一个固定的 .bak,反复损坏会把上一份真实配置覆盖掉,
   于是「唯一的退路」也丢了。

## 改动
1) loadConnections():raw.trim()==="" 视为「尚未配置」,
   直接返回空配置,**不覆写、不备份**(BOM/纯空白同样处理)。
2) saveConnections():改为原子写 —— 先写同目录 .tmp-<pid>,
   再 renameSync 覆盖。rename 在同卷内原子,读者只会看到改写前
   或改写后的完整文件,从根上消除产生半截内容的竞态;失败时清理 tmp。
3) 真损坏的备份名带时间戳(connections.json.corrupt-<ISO>.bak),
   反复损坏不再互相覆盖。

## 判据
新增 cmd/gui/connections-io.test.mjs(进 npm test):
在 node:vm 里抽出 main.js 的**真实函数**执行,11 条断言覆盖
合法/空/纯空白/损坏/原子写残留。已做变异测试:删掉空文件守卫、
把备份名改回固定 .bak,均被判红。

## 实测(本机 Electron + 真实凭据)
  正常启动:connections.json MD5 前后一致(E8DD588F...),0 个 tmp 残留
  人工清空后启动:文件被自愈填充回真实配置,而非覆写成空

判据:cmd/gui npm test 全绿(32 条)。
2026-10-01 23:16:49 +08:00

47 lines
1.2 KiB
JSON

{
"name": "homeagent-gui",
"version": "1.4.0",
"author": "JianFeeeee <jianfeeeee@homeagent.local>",
"homepage": "https://gitcode.com/JianFeeeee/HomeAgent",
"description": "HomeAgent Desktop GUI - Multi-connection management dashboard",
"main": "main.js",
"scripts": {
"start": "electron . --no-sandbox",
"dev": "electron . --no-sandbox --dev",
"test": "node sse-backoff.test.mjs && node sse-backoff-behavior.test.mjs && node retry-guard.test.mjs && node endpoint-align.test.mjs && node connections-io.test.mjs",
"test-live": "node chat-perf.test.mjs && node protocol-align.test.mjs"
},
"dependencies": {
"koffi": "^3.1.6"
},
"devDependencies": {
"asar": "^3.2.0",
"electron": "^33.0.0",
"electron-builder": "^26.15.3",
"electron-packager": "^17.1.2",
"icojs": "^0.23.0",
"sharp": "^0.35.3"
},
"build": {
"appId": "com.homeagent.gui",
"productName": "HomeAgent",
"linux": {
"target": [
"deb",
"rpm",
"AppImage"
],
"category": "Utility",
"icon": "icon.svg"
},
"files": [
"main.js",
"preload.js",
"renderer/**/*",
"icon.svg",
"node_modules/**/*",
"!node_modules/electron-builder/**"
]
}
}