| 1 | # 手动创建会话的恢复机制 |
| 2 | |
| 3 | [English](MANUAL_SESSION_CREATION_RECOVERY.md) |
| 4 | |
| 5 | ## 任务所有权与自动恢复 |
| 6 | |
| 7 | 新建、启动恢复、手动重试统一交给本进程创建管理器。中断后沿用原操作、会话及 |
| 8 | Topic ID。跨进程执行权限仍由原有操作系统创建锁决定,不能根据锁文件存在、 |
| 9 | 大小、时间或诊断状态判断可以接手。 |
| 10 | |
| 11 | 遇到锁被占用时,任务保留在队列,按带小幅抖动的 0.5、1、2、4、最多 5 秒间隔 |
| 12 | 重试。启动恢复等待标签恢复完成后启用,并每 30 秒补扫。前端查询只展示进度。 |
| 13 | 取得锁后重新读取最新 revision 和 phase。失败任务需要用户明确重试,并绑定其 |
| 14 | 观察到的 revision;迟到重试不能重新启动一次更新的失败。 |
| 15 | |
| 16 | 运行时构建成功后,结果保存遇到暂时性错误只重试保存,并保留原结果和创建锁, |
| 17 | 不会重复构建。身份冲突、不兼容状态和不支持的数据库版本显示为阻塞。已归档或 |
| 18 | 删除的会话不会因为恢复创建而重新激活。 |
| 19 | |
| 20 | 后台恢复不会改变当前选中的会话;新的导航操作优先于较早的新建完成回调。 |
| 21 | Topic 激活在发布就绪事件前确定终态,后台清理尚未完成时再次切换,也不会 |
| 22 | 对已经就绪的请求重复发送取消事件。 |
| 23 | |
| 24 | ## 进度与诊断 |
| 25 | |
| 26 | 现有 Begin/Get/List/Retry 接口参数不变,响应增加可选 `progress`。 |
| 27 | 状态包括排队、执行、等待锁、存储重试、阻塞和停止中。阶段、阶段开始时间、 |
| 28 | 耗时、下次重试时间、慢操作标记和脱敏错误码仅用于观察。缺失或未知字段必须 |
| 29 | 安全展示为等待恢复或状态暂不可用。 |
| 30 | |
| 31 | 恢复提示区域提供“导出创建诊断”,对应 `ExportManualCreationDiagnostics()`。 |
| 32 | JSON 包含构建标识、本进程当前任务快照和最近 256 条阶段/尝试事件。导出不读取 |
| 33 | 会话数据库,不包含消息、附件、供应商配置或原始服务日志;不会推测其他进程的 |
| 34 | PID 和执行阶段。服务日志也记录阶段变化及限频慢阶段警告。 |
| 35 | |
| 36 | 单阶段 30 秒无进展只触发诊断提示,不会因此释放锁或抢占任务。遇到卡住时, |
| 37 | 请在重启应用前从发生问题的进程导出报告,并记录触发操作及大致时间。报告可以 |
| 38 | 缩小阻塞范围,不能直接证明所有历史 `starting` 记录的根因。 |
| 39 | |
| 40 | ## 退出与兼容性 |
| 41 | |
| 42 | 退出先冻结新任务,停止补扫和重试,取消构建并等待实际执行结束,之后才关闭 |
| 43 | 共享资源。构建换代关闭旧通知通道,不代表旧执行者已经停止。等待超过 10 秒时, |
| 44 | 退出返回可重试失败并保留资源和任务所有权,不能提前关库或报告干净退出。 |
| 45 | 被退出中断的创建保留为下次启动可恢复状态。本次不新增用户取消新建入口。 |
| 46 | |
| 47 | SQLite 格式、锁路径、身份算法及持久化 `reserved/starting/ready/failed` 状态 |
| 48 | 保持不变。只更新 phase/error,保留未知 JSON 字段。本地进度不写入创建记录。 |
| 49 | 旧客户端可忽略新增响应字段,新客户端可以读取旧记录。 |
| 50 | |
| 51 | ## 验证 |
| 52 | |
| 53 | 在 Desktop 独立 Go 模块内运行: |
| 54 | |
| 55 | ```sh |
| 56 | go test -race . -run 'TestManualCreation|TestComposerRestart|TestShutdownServiceFailure|TestArchiveLastVisibleSession' -count=1 |
| 57 | node ../scripts/desktop-windows-go-tests.mjs --all |
| 58 | ``` |
| 59 | |
| 60 | 测试使用隔离目录和真实子进程锁,覆盖持锁者退出、两个管理器竞争、等待期间 |
| 61 | revision 变化、只重试结果保存、构建换代后的实际结束、退出所有权、存储复用、 |
| 62 | 未知字段和归档后新建。Windows x64 与 macOS 均需原生执行;交叉编译不能证明 |
| 63 | 原生锁和退出行为通过。 |
| 64 | |
| 65 | 前端测试包括恢复提示、纯文本发送、输入框退出持久化和导航顺序。 |
| 66 | `node bench/manual-creation-recovery.mjs` 使用真实组件及模拟宿主,在 Chromium |
| 67 | 中验证交互。使用本机 Chrome 时可设置 `CHROME_EXECUTABLE`。该浏览器测试不代表 |
| 68 | 原生文件保存对话框已验证。 |
| 69 |