设计稿 · 桌面端 Electron
AutoAgent Studio dsh-app:// · profile/desktop
~/deepseek-harness CPU RUN MDL deepseek-v3 PLG 14 SCAN 12ms
探索未至之境 预览版
本地智能体工作站v0.1.5-rc.2
> 描述一个任务,或粘贴一段 PLC 程序让我分析…
SESSION 0x1A2F TOKENS 4.2k / 128k TOOLS 8 READY
AutoAgent Studio dsh-app://shell/startup.html
上电自检 v0.1.5-rc.2 · win-x64

正在启动 AutoAgent Studio… 准备就绪后将自动打开工作区。

诊断缓冲区 0 / 4
读取 desktop-runtime.json…

放行条件:四项全部 OK 才提交主界面 —— 对应 navigateMain(applicationUrl) 仅在 backend.host !== undefined 时执行。任一项未通过即停留在本页,不进入主界面。

AutoAgent Studio dsh-app:// · profile/desktop
探索未至之境

该槽位仅在会话为空态(无当前会话,或当前会话为空白)时激活,且一旦有任一 provider 可用即自动结束。同槽位另有 welcome-notice(order -100,"内测声明",确认后持久化)。逐字文案取自 locales.ts,属门禁断言范围,不可删改。

设计规格 · 决策一:移除「模块扫描」页

该页代码确实存在(packages/client/web/src/boot-page.ts),但正常启动下不可能被看到,因此不投入设计。原因是一条可验证的链路:

环节事实结果
资源通道 main.ts:283-296 — dsh-app://app/* 转交 Host 进程内 fetch() 无网络栈、无磁盘往返,bundle 由内存直出
bundle 到达时机 webserver 以 script-src 行把 __DSH_BOOT__ 注入 index.html(parser 阻塞式) main.ts 执行前插件 factory 已注册
激活耗时 boot.ts:76-87 — 并行建 entry + loader.await(),模块体惰性就地执行 毫秒级,与插件数量基本无关
DOM 交接 ui-renderer/src/client/index.ts:58-82 — hydrateRoot + useLayoutEffect 首帧换应用 整段窗口常小于一帧(16.7 ms),浏览器不产生绘制
结论 它实质是慢路径 / 故障路径界面(bundle 偏大、插件导入或激活失败) 不单独设计;其失败态由主界面与启动页的既有错误语义覆盖

决策二:启动页四项自检 · 真实信号契约(真进度)

启动页拿到的 IPC 只有 starting | ready | error(backend-controller.ts:6),子进程侧 IPC 只有 ready | fatal(host-protocol.ts:48-55)。因此诚实的自检项恰好是四项,每项都由真实事件驱动,不存在装饰性进度。括注为需新增的部分。

#自检项驱动信号(真实来源)通过判据 / 改动量
01 配置准备 · 应用 release backend-controller.ts:65 await prepare()
(main.ts:262 传入 applyRelease / assertProfileRuntime)
prepare 正常 resolve。零改动:在 await 前后发一次阶段。
02 内置 Node · dsh 子进程 host-process.ts:109 spawn(node, [entry,…]) 子进程已建立且字节管道可用。需把 spawn 结果回调出 DesktopHostProcess。
03 组合插件图 host-process.ts:105-162 readyPromise
(子进程"完整组合已激活"后才 resolve)
收到 ready 事件即通过。粒度边界:子进程只发 ready/fatal,看不到逐插件进度;要逐插件点亮须先扩展 host-protocol 事件,本稿不假设。
04 打开工作区 main.ts:267 navigateMain(applicationUrl) 仅当 backend.host !== undefined。放行门:前三项全 OK 才走到这里,否则停留本页。

落地需要的最小改动面:DesktopBackendState 的 starting 分支增加 stage 字段;三处发点(prepare 前后、spawn 后、ready);startup.js 按 stage 点亮;回归 apps/desktop/tests/startup-renderer.spec.ts 与 backend 相关用例。

决策二附:故障处理(分级恢复)

任一项 FAULT 即停留在启动页并给处理方法,按影响面从轻到重排列。三项动作已存在于 main.ts:232-247 recoverApplication,文案键亦已存在,无需新增。

级别动作(真实 IPC)适用与代价
L1restart · 重试启动偶发占用、子进程异常退出。代价最低,先试它。
L2plugins-disable-all · 禁用全部第三方插件并重试用于定位是哪个插件拖垮启动。已装插件与配置保留,可恢复。
L3reset-configuration · 重置 Desktop 并重试删除桌面端 profile 与第三方插件、不保留备份。共享任务与设置保留。本稿必须在按钮上写明"不保留备份"。
—重装指导(静态文案)应用文件缺失或损坏时给出;不可自动执行。

决策三:首启凭据弹窗(纳入工控风)

维度事实与设计落点
槽位settings.onboarding,注册 id deepseek-official、order 0;同槽另有 welcome-notice(order -100)
调度SettingsRoot.tsx:139-144 — 仅会话为空态时激活,逐个未完成步骤渲染
触发onboardingReadiness 返回 credential-missing(无任何可用 provider 且官方凭据可写);变为 provider-ready 立即自行结束
结构复用 Models 页的 ProviderEditor:credentialOnly + credentialRequired + autoFocusCredential + hideTitle,只暴露一个密钥字段
文案键onboardingTitle / onboardingDescription / onboardingLater / onboardingSave / onboardingSaving / keyRequired(不可删改)
样式落点模态外壳 OnboardingModal.module.css + 弹窗 DeepSeekOnboardingDialog.module.css;仅需覆盖遮罩浓度、卡片边框层级、密钥输入聚焦环与等宽字段标签,不动 ProviderEditor 逻辑
主界面同屏与空态主页同时可见,故遮罩下保留主页轮廓(本稿以网格 + 幽灵 hero 示意),确保用户仍知道自己没离开主页

令牌映射同主界面规格表(琥珀主色、RUN 绿、数据青、网格底纹),此处省略。动画约束:仅 transform / opacity / background-position / stroke-dashoffset,整体包 prefers-reduced-motion 降级。