Electron 启动与进程边界
入口和职责
main/index.ts 负责应用生命周期、窗口、单实例/存储初始化、服务装配和 IPC 注册。preload 暴露受控 bridge;renderer 通过 bridge 读取快照、订阅事件和请求操作。共享类型在 desktop/shared 中维护,UI 组件不直接操作 fs、凭据或子进程。
主窗口使用专属 preload、入口 HTML 和受控桥接。用户浏览器面板使用独立沙箱 <webview>,挂载前移除 preload,不能获得主界面的 bridge 权限。不要把预览页面当作受信任设置界面。
服务 owner
| 服务 | 持有状态 | 生命周期重点 |
|---|---|---|
| SessionHost | 会话、run、插件快照、队列及事件订阅 | 事实先持久化,维护会话事务与通用服务接口 |
| BuiltinPluginRuntime | 提问、联网、协作、后台命令、记忆、标题与通知的运行时状态及策略 | 负责装配、恢复、取消与清理,关闭后等待 drain |
| StateStore/SettingsStore | 业务与设置/凭据 | 单写者锁、schema、generation |
| History Worker | JSONL 写入和索引 | durable ack、错误传播 |
| PaneServices | PTY 与浏览器视图 | owner 校验、显示边界、释放 |
| 通知/快捷键服务 | 系统注册与焦点状态 | 注册回滚和窗口销毁清理 |
插件实现位于独立的 builtin-plugins 包,不依赖 Electron、UI 或具体 SQLite 实现。桌面注入模型调用、存储、历史、事件和原生通知等通用接口,详见插件运行时隔离。
IPC 校验与订阅
renderer 发出的 task ID、路径、请求 ID 和选项都需在主进程校验,不能因为 TypeScript 类型正确就信任运行时输入。文件预览、导出、编辑器打开、终端输入和任务操作各有授权范围和参数检查。
订阅返回清理函数,组件卸载时解除;异步响应核对当前 scope,避免旧任务结果覆盖新任务。快照带水位,随后只应用更新的增量事件。bridge 使用结构化可序列化数据,不跨进程传真实对象句柄。
启动与退出
开发模式加载本地 Vite,生产模式加载构建后的 renderer;入口选择由 load-renderer 集中处理。窗口加载不应自动触发模型请求。
退出先停止接收新工作,收尾会话/队列和持久化,释放 Worker、原生视图、PTY、快捷键与存储锁。renderer 崩溃可以重建视图,但不能因此复送已接受输入。捕获错误保存在本地日志,项目不包含遥测上传链路。