# Changelog ## 0.2.1 (2026-11-04) ### Fixed - 统一保存目录弹窗的实心主按钮(「保存设置」/确认类按钮)悬停时落进通用 hover 的深色底,深色文字几乎不可读。现在实心按钮悬停保持浅底深字,并补了一条样式回归断言。 ## 0.2.0 (2026-11-04) ### Changed - **面板重做(Graphite Studio)**:设备画面优先铺满可用宽高(等比、不裁切);截图 / 录屏 / 调试改为 36px 单行主操作(触屏 44px),开始后原位变「停止」并计时,不挪按钮;顶部设备选择合入标题栏,常驻完整保存路径条(换行不省略);旧音量加减与旋转按钮移除,改为设备媒体静音(再次点击恢复原音量,不代表来电/闹钟静音);新增「最近保存」记录与图片/视频预览、设置与确认弹窗、每次操作的明确提示。窄屏自动转浮窗,停靠位置沿用 B26 四列。 - **采集真正落盘**:截图保存 PNG,普通录屏保存 MP4,调试保存分段 MP4 + 全量 logcat + 操作时间线,三者共用同一目录与同前缀命名;统一目录在采集启动时固定,采集中不可修改;成功落盘后才登记,失败保留设备原件与重试入口,可更换目录重试,不显示成功。 - **待保存可恢复**:录屏/调试的进行态与待保存意图写入宿主持久状态,进程重载后仍可继续保存;调试停止先等在途动作结束再写清单;普通录屏 180 秒自动结束同样走保存流程。 - **目录选择**:目录设置的「选择」复用宿主目录选择链——DSH Desktop 的 `__DSH_DIRECTORY_PICKER__` 桥(Electron 文件夹对话框)优先,其次 `uiWorkspace.pickDirectory()`(与 project-manager 添加仓库同一条链);选中只回填草稿,仍需「保存设置」确认。目录选择器为 browse 组合(远程/浏览器运行方式)时不再弹不可用的附属面板,而是明确提示直接输入绝对路径;旧的直连原生选择器路由仅作最后兜底。 - **实时输入**:H.264 画面中的按下、移动、抬起直接走现有 scrcpy 控制连接;按下/抬起立即发送,移动按绘制节奏合并,触摸与滚轮共用串行队列。滚轮统一像素/行/页单位,大增量分段保量;截图降级模式保留抬手后合成手势。手势绑定设备、画面尺寸与标识;取消、丢失指针捕获、关窗、切设备及 agent 接管时释放,长按每 750ms 续租,浏览器失联由 2s 超时释放;输入失败可见,不重放不确定的按下。本地 host 模块打入单一入口,避免 Desktop 热重载后子模块仍命中旧 ESM 缓存。 - **调试取证时间锚**:设备时钟采样(接收前后夹取)与录屏内嵌原生帧时间元数据共同给出每帧真实墙钟;**每个录屏分段启动前各采一次时钟**,设备时钟中途被步进也不会让某个分段越界;操作前帧取「最坏时钟偏移下仍早于操作」的最后一帧,操作后帧取「最晚偏移下仍晚于操作」的第一帧,稀疏录屏不会误选更晚帧;按帧号精确抽帧并只接受本次唯一临时文件产出的有效 PNG;目标时刻不在已保存分段内、操作超过 12 个、无新帧等情况全部写进 frameIssues,不静默少帧;未校准会话显式标注,不冒充操作证据。 ### Fixed - scrcpy 3.3.4 滚轮包按 21 字节、有符号定点值编码,修复原 25 字节浮点包造成的控制消息错位。 - agent 点按/滑动和元素操作保留设备物理坐标;滚动仅在控制连接边界换算一次,面板继续使用画面坐标。非法、超限批次整批拒绝,保留按下/抬起边界;旧手势标识不能释放新手势。 - 断连恢复:旧串流会话迟到的 onDead 不再驱逐或标记已接管的新会话,健康流也不再上报上一代会话的过期错误。 - 保存失败不再先移除记录;设备采集文件为空、MP4 未封装等失败均明确报错并保留重试。 - 调试分析不再静默失败:每次分析先清空自己的帧目录、缺少 ffmpeg/ffprobe 时直接点名缺哪个、ffmpeg 成功退出却没写文件按「没有生成新的有效PNG」处理、帧目录不可写时报告路径。 - 时钟采样与待保存校验共用同一个宽度上限常量,消除 2ms 边界造成的「采样成功但永远存不了」。 ### Verification - `npm test`:`node scripts/check-capture.mjs` + `node scripts/check-input.mjs`。input 15 组无设备回归(协议、输入校验、释放/超时、锁定、坐标/元素操作、队列及指针捕获、强制解锁后重连)。 - capture 回归:状态原子升级、固定目录、FLAG_SECURE 守卫、保存重试与分段轮转(含异步换段采样)、登记/预览、旧实例竞态、设备时钟校准的稀疏帧选择与新鲜帧校验、时钟宽度边界(1000 通过 / 1001 拒绝,会话与分段两级)、分析管道源码级守卫(精确取帧、只接受本次产出、清空帧目录、越界必须报告)。 - 真机实测:H.264 实时点按/拖动/滚轮、长按续租、媒体静音恢复、录屏与调试落盘及失败重试、受保护页面提示与控件树降级;不保证所有设备的固定时延。 ## 0.1.3 (2026-11-03) ### Changed - **B26 面板成为右侧第三列(与 dsh-project-manager 卡片详情页平级)**:停靠形态原先固定 `right:0`,与卡片详情页(同样 `right:0`、z-index 80 > 面板 60)完全重叠——详情一开,面板就被压在下面,1280 宽下只剩 100px 露头。现在面板自己量好位置,钉在「会话窗口 | 右侧边栏 | 面板 | 卡片详情」的第三格:右边缘 = 详情列左边缘(`视口宽 − 详情列 left`,读 `.dpm-global-detail` 的位置),详情开/关、拖宽、隐藏、窗口缩放都实时跟随(ResizeObserver + MutationObserver,事件驱动不轮询)。没装 project-manager 或详情列不存在 → 退回贴最右,不报错。project-manager 零改动:它的排版公式(中列让位 = 详情宽 + 右侧栏宽 − 轨道宽、右侧栏向左挪 详情宽)本来就给面板让出了那一格,实测 1800 宽四列铺满零重叠(会话 0–680 | 右侧栏 680–980 | 面板 979–1438 | 详情 1438–1800)。 - 停靠面板补 `box-sizing:border-box`:`width:420px` 之前没算 `padding:14px`,实际 450px,比向宿主申请的 420px 多占 30px(会压住右侧边栏)——现在申请多少就是多少。 ## 0.1.2 (2026-09-20) ### Fixed - **B25 连接时频繁黑屏(静态屏看门狗误报 + 重连清屏)**:面板连接后时不时黑屏、FPS 0。根因:静态屏幕下 MediaCodec surface 编码器无新输入帧就不产输出帧(连周期 IDR 也没有),客户端「解码饥荒看门狗」(12s 零解码帧即重连)把健康静默误判为断流 → 每 ~15s 强制重连;且重连时 onMeta 对 canvas.width/height 同值赋值也清空位图 → 黑闪循环(9 天日志 1613 次订阅 86% 寿命 <30s,最长连跑 176 次短命重连)。两处修复:①看门狗增加 payloadSeen>0 前提——只有「收到视频帧却解不出」(缓存不可解码/desync)才重连,「根本没帧」(画面静止)不重连,真故障保护路径原样保留;②canvas 尺寸仅变化才重设——重连保留上一帧画面,黑闪消失。实测:修复后同场景订阅寿命 14-23s → 306s+(无重连);boot-check [A]-[E] 全绿。 ## 0.1.1 (2026-09-16) ### Fixed - **B24 样式自愈(头部按钮/面板「破相」修复)**:实测捕获一次瞬时故障——按钮 DOM 在场但 33 条 CSS 全部失效(白底黑框、图标在上文字在下的裸样式),同屏邻插件按钮样式正常,判定为本插件 `