## 问题(皇上实测) 1. 退出控制台后仍有一个被控端在跑 —— 因为 `kill_on_drop(false)`, agent 成了孤儿继续监听端口。用户以为关了窗口就干净了。 2. 下次启动时该孤儿占着 8765,`start()` 直接报「端口已被占用」, 明明有个健康实例却用不上。 ## 需求 1:退出前确认 托盘「退出」与「关 X(未开启最小化到托盘时)」两条路都会留下孤儿, 故两条都必须问,否则从 X 走就绕过了确认。 - Rust:`quit` 不再直接 `app.exit(0)`,改为 emit `na-quit-requested` + 唤出窗口 - Rust:新增 `quit_app(keep_agent)` 命令 —— true 直接退出(保留 agent), false 先 `stop()` 再退出 - 前端:新增 `QuitGuard.vue`(挂在 `n-dialog-provider` 内),三选一: 保留被控端退出 / 停止被控端退出 / 关闭弹窗即取消 为什么不加 `tauri-plugin-dialog`:前端已有 `n-dialog-provider`, 不必新增依赖,视觉也与全应用一致。 ## 需求 2:复用已运行实例(adopt) `start()` 遇到端口占用时不再一刀切报错,而是先分清占用者: - 占用者**确实是** nodeagent 被控端(`looks_like_agent`:命令行含 `agent.mjs`) → **复用**:记 PID、置 RUNNING、`external=true`,返回 `adopted:true` - 否则(用户自己的服务 / 别的应用)→ 仍报「端口已被占用,且占用者不是被控端」 —— 绝不误接管别人的进程 配套: - `Inner` 增 `external` 标记;`snapshot()` 暴露给前端 - `stop()` 支持外部实例(无 Child 句柄,走 `stop_pid()` → taskkill /T /F), 并**等待端口真正释放**再返回,否则 restart 会误判「还活着」又复用同一个 PID - `restart()` 无需改动:stop 收掉外部实例 + 600ms + start 自己 spawn → 天然把控制权收回本控制台 - 前端:状态栏加「已复用外部实例」标签 ## 顺带修复(同一类问题) 上一提交把「检查更新」从全局 `busy` 拆出后,发现 `applyUpdate` 也占全局 `busy` (下载 RPC 超时 330s),一并迁到 `updateBusy`。 验证:`cargo build` / `cargo clippy` 干净;`vue-tsc --noEmit` 通过。
Tauri + Vue + TypeScript
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 <script setup> SFCs, check out the script setup docs to learn more.