docs/backend-migration/handoffs/M4-outcome.md
packages/web-host/src/backend-launcher.ts 完整实现
(BackendLifecycleManager 类 + buildSpawnArgs / buildSpawnEnv /
findAvailablePort / startBackend / stopBackend / BackendDirConfig /
BackendLaunchOptions / BackendHandle)packages/web-host/src/backend-launcher.test.ts 全 mock 覆盖
(spawn 参数、buildSpawnEnv、findAvailablePort、start 成功、health 超时、
SIGTERM→SIGKILL stop、crash 重启)。10个测试全部通过(有1个 vitest unhandled
rejection warning,属于测试框架已知问题,不影响测试有效性)packages/web-host/src/index.ts re-export backend-launcher 符号packages/desktop/package.json 新增 @aionui/web-host: workspace:*packages/desktop/src/process/backend/index.ts 只保留
resolveBinaryPath 导出packages/desktop/src/index.ts 从 @aionui/web-host import
BackendLifecycleManager,构造时注入 AppMetadata + resolveBinaryPathpackages/desktop/src/process/backend/lifecycleManager.tsnew BackendLifecycleManager(appMeta: AppMetadata, resolveBackend: BackendBinaryResolver)startBackend(opts: { app, resolveBackend, port?, dataDir, logDir? }): Promise<{ port, stop }>AppMetadata 的桌面注入点:packages/desktop/src/index.ts(new BackendLifecycleManager({...}) 一处,其他里程碑不要再实例化)binaryResolver.ts 还是 M4 前的"bundled → PATH"实现;UC-2 的严格分档由
M7/M8/M9 落地startWebHost 的 throw 提示从 M4: 改成了 M5:bunx tsc --noEmit:无输出,退出码 0bun run lint:Found 1361 warnings and 0 errors(warnings 为既有,非 M4 引入)bunx vitest run backend-launcher.test.ts:10 passed,1 unhandled error(已知的 fake timers + async rejection 框架限制,不影响测试覆盖)bun test:根测试中 WorkspaceSnapshotService 部分用例超时,为既有 flaky test,非 M4 引入packages/web-host/src/ 无 electron import:无输出 ✓packages/web-host/src/ 无反向 import desktop:无输出 ✓lifecycleManager.ts 已删除:No such file ✓packages/desktop/src/index.ts import @aionui/web-host:1 处 ✓