Skip to content

Releases: zhan-tz/dsh-plugin-runbook

v0.17.0 — 对话末尾的运行产物缩略图

Choose a tag to compare

@zhan-tz zhan-tz released this 17 Aug 04:25

你问:末尾有产物链接却没有图片链接,完全可以放浏览器可打开的链接。

根因:末尾那行来自核心包 dsh-client-ui-deliverables,它的词表只收编辑类工具的 locations——脚本跑出来的图片是它文档里明写的已知盲区(终端间接创建的文件不进匹配)。

修法:运行本注册进同一个 conversation.chat.turnTail 链。该链是赢者通吃的选举(first non-null wins),所以本插件在回合有可查看运行产物(png/jpg/webp/gif/svg/pdf)时优先当选,渲染缩略图 lane——每个 chip 是真链接,点击浏览器新标签打开(fileview 路由自带正确 mime 与 ETag 缓存)。当选时同时继承编辑产物行(镜像核心的 seq 过滤+去重语义,openFile 走宿主打开器),不会因为选举抢位而丢信息。

诚实限制:分页加载的更早回合,GUI 内部 memo 不重算 tail 链——lane 保证出现在会话底部(正是'对话末尾'诉求处)与之后新完成的回合上。

v0.16.0 — git 边与 agent 边真正落地

Choose a tag to compare

@zhan-tz zhan-tz released this 17 Aug 03:03

用户四个观察全部坐实为真 bug(刷新时闪现的 git/agent 边随后消失——数据真实存在,被预算饿死):

git 边(本对话曾为零的根因链)

  • 多仓探测:会话 cwd(家目录)≠ 真仓库——现在按运行脚本目录聚合候选仓(≤4),逐个探测、绝对化路径后合并
  • git status 条目是 {p,s} 对象,字符串拼接曾把它们变成 [object Object] 路径
  • 边池 150 先到先得,git 段最后入场全被拒 → 提交节点无边即被搁架不可见(这就是「一闪而过」)→ 提高预算并为 gitfile/gitline 保留席位
  • 节点 slice(0,132) 按插入序砍尾,结构节点最后插入必被砍 → 提交/agent 节点保留席位
  • junction 别名:会话编辑 node_modules/dsh-plugin-runbook/ 链接副本,git 记录真仓库路径——按仓库名段限定 basename 匹配

agent 紫边
GUI 会话列表永远不含子代理行(childSessions 恒空)→ 宿主从父会话日志自发现('subagent ' 提及 × 磁盘目录存在双验证)。本对话的 2 个子代理(评审/写报告)现在以紫节点+ran/edit 边出现。

澄清:git 边来自本地 git log(与 push/pull GitHub 无关);本对话此前无 git 边是上述四重饥饿,不是「只用本地」。

实测:本对话面板 16 提交节点(33 gitfile+15 gitline)+2 agent 节点;MDC 16 提交/72 gitfile;dz 产物与叙述引文回归全绿,零报错。

v0.15.0 — 垃圾节点清零

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 23:47

用户报告:图中大量 /USE、--truth、--data-dir、f_path 之类的垃圾节点掩埋真实文件。

根因:echo 收割器的字符类含 = 和 :,脚本的 usage 帮助文本把旗标名和真路径黏成一个 token(--data-dir=PATH、out: /path、f_path: /x),这些假路径被直接建为节点。磁盘上从来没有这些文件。

修复:ensure() 加准入门卫——basename 含 = 或 : 、以 - 开头、或没有真实扩展名结尾的 token 一律拒绝入图;全部调用点补空值守卫(此前一次漏护导致整面板崩溃,已全部排查)。MDC 会话流 12 个垃圾节点清零,真实节点 118 个不变,dz 四产物与叙述引文回归全绿。

v0.14.0 — 性能:手势直写相机 + turn 数据缓存

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 18:53

两处结构性优化,卡顿不再依赖图的大小:

手势相机直写 DOM:滚轮平移/捏合不再逐事件触发 React 重渲染(此前每个滚轮事件都要重建+diff ~250 个 SVG 元素树)。transform 直写 svg.style,160ms 空闲后一次性提交回状态;会话直播 flush 打断手势也不会回跳(camRef 以手势为权威、渲染从 camRef 取值);fit/复位会取消未决手势。手感与 v0.13.2 完全一致(反向平移、1.8x 捏合、纯净捕获)。

collectTurnData 按轮缓存:检查器循环与图重建每次渲染都对全部轮次做 O(events) reduce——直播 flush 期间是纯重复税。现在 WeakMap 按轮对象缓存,并以 artifact 值对象身份校验:直播中的轮次值更新即失效重算,历史轮次永久命中。

实测:帧率 8.3ms 中位/零 24ms+ 掉帧;反向平移 240→-240、捏合 1.467 增长、双击 fit 复位(含手势 pending 打断路径)、引文/浮层/手热区/捕获回归全绿,零报错。

v0.13.2 — 相机手感:反向平移 + 提速缩放

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 18:38
  • 双指平移反向:画布是「取景器」不是「纸张」——内容与手指反向移动,与 macOS 自然滚动手感一致(灯箱同步)
  • 捏合缩放提速约 1.8 倍(1.0018→1.0032/单位;灯箱 1.0022→1.0040)
  • 上一版的手势捕获(原生 non-passive 监听)保持不变

实测:双指下扫 240 → 内容上移 240;同幅捏合 scale 增长 1.241→1.467;引文/浮层/dz 四产物回归全绿,零报错。

v0.13.1 — 手势不再外泄:画布与浏览器各动各的

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 18:27

用户报告:画布上双指平移时外层页面跟着一起滚。

根因:React 17+ 把合成 onWheel 注册在根节点的 passive 监听器上——handler 里的 e.preventDefault() 是静默空操作(控制台会出现 'Unable to preventDefault inside passive event listener'),页面滚动从未被阻止。

修复:

  • 画布与图片灯箱都改为原生 addEventListener('wheel', …, { passive: false }),ref 携带最新 handler 闭包、effect 绑定/解绑
  • preventDefault 现在真正吞掉手势:双指平移只动相机,浏览器页面不动;捏合同理
  • 检查器与叙述引文内滚动容器加 overscroll-behavior:contain,滚到头也不会链式带动外层

实测(playwright):滚轮事件 camera 平移生效、passive 违规告警 0、window/祖先滚动位置不变、平移/捏合缩放手感与 v0.12.0 一致;引文、浮层检查器、dz 四产物回归全绿,零报错。

v0.13.0 — 检查器浮层:永远在视口里

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 18:19

用户报告:点击节点后的 运行/解释/上下文 弹窗锚在画布右下角,画布比视口高时弹窗在可视区外。采用用户的第二方案——固定大小、浮在最上层、不在画布里:

  • 检查器经 react-dom portal 挂到 document.body,position:fixed 锚定视口右下(16px 边距),z-index 2147480000——画布任意缩放/平移/滚动都不影响其可见性
  • 卡片自带 max-height: calc(100vh - 32px) 内部滚动,小屏也不溢出
  • IntersectionObserver 监视画布:滚出视野时浮层自动隐藏,不会悬在无关内容上
  • react-dom 不可用时回退旧的画布内 absolute 定位

实测(playwright):卡片 parentElement===document.body、computed position=fixed、right/bottom=16、四边全在视口内、Preview/Run/Explain/Open 按钮齐全;MDC 引文、本对话引文、dz 四产物回归全绿,零报错。

v0.12.0 — 触控板相机 + 有界会话流

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 18:09

两个用户反馈,一个共识。

触控板相机(不使用鼠标的人优先):

  • 双指滚动 = 平移,1:1 跟手(此前任何滚轮都被劫持为缩放,触控板完全没法用)
  • 捏合 = 平滑缩放(浏览器以 ctrl+wheel 送达),以光标为锚,0.25–2.5 连续无级
  • 灯箱(图片预览)同方案:捏合缩放、滚动平移
  • 实测:普通滚轮 translate +240 与手指行程一致 scale 不变;ctrl 滚轮 scale 0.46→0.58 锚点稳定

有界会话流(图的增长有天然上限):
用户模型:开发初期增删改查文件多,后期只在既有架构上修改——图应当饱和。此前两条随仓库增长的路径已切断:

  • 扫描脚本不再无条件进图:只有会话真跑过/真触及的脚本才进(未跑过的架构属于主链视图,不属于会话流)
  • 盲扫垫底降级:仅在图几乎为空时垫 24 个
  • MDC 会话流 87 → 43 节点(全部会话实证);本对话 205 次运行去重为 126 个文件节点——同脚本反复重跑不新增节点,重写同一文件不新增节点,这就是饱和性
  • resolveScanRef 间接 IO 解析保留(savefig(str(OUT/…)) 等相对路径仍能连上磁盘真文件)

回归:MDC dz 四产物 + 叙述引文(布置原文/RMSE 结论)、本对话面板 6 段引文,全部零报错。

v0.11.1 — 修复:两处看不见的根因

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 17:47

用户报告:①当前对话的运行本不可见 ②案例对话渲染不出/无上下文文本。诊断出一个共同根因 + 两个叙述层缺口:

根因(两个报告都是它):子会话带 edits 时 buildFileGraph 里对 for-const 循环变量重新赋值 → TypeError → 整个面板槽位崩溃。任何含子 agent 编辑的会话都触发。修复后两个会话面板都恢复渲染。

叙述层

  • 匹配与展示改用全文映射(seq 去重、每轮 24k 上限)——此前“头400+尾1000”截断恰好腰斩文件名所在的中段,环节聚合因此全部落空
  • 主链环节卡片聚合其声明文件的所有引文:24维特征 4 段、dz OOF 6 段、报告图 2 段;会话前历史环节 0 段(没讨论过就没有,不编造)
  • 逐块过滤 harness 桥接叙述(checkpoint/自动摘要),但用户粘贴的对话记录原样保留(那是你的原话)

验收:本对话面板 38 turns 渲染 + 6 段真实引文(含『首先我没看到效果,其次我要的不是高亮而是展开』);MDC 布置原文与 RMSE 结论引文保持;零报错。

v0.11.0 — 叙述引文:Jupyter 叙事层的缝合实现

Choose a tag to compare

@zhan-tz zhan-tz released this 16 Aug 17:26

Jupyter 的代码段之间是自然语言衔接;运行本的文件之间只有机械边。这版把会话里的叙述原文(你的指令、我的结论)按文件缝合到节点上——纯引用、零 LLM、零生成。

  • 点击任意节点 → 检查器出现「叙述引文」:所有触及该文件的轮次里的用户消息与助手结论原文
  • 关联规则:工具触及(文件/读入/运行)或 basename 在讨论文本中被提及(汇报结果的轮往往不再碰文件本体)
  • 用户消息归属:user/message 无 turn 字段且在 turn/start 之后 ~20ms 到达——按当前轮归属,seq 去重防重放翻倍
  • 长轮文本保头 400 + 尾 1000(结论在尾部);显示尾优先,原生
    展开全文(零 JS 状态,免疫会话 flush 重渲染)
  • 流变:timeline 直播增长,新轮次的引文自动补进片段列表

实测金标准:「排查MDC网络dz预测异常 (1)」中点击 train_belle2_dz_single_v1.py → 引文含布置原文「我就是说你在这个对话中复现一下从数据集到训练网络…」与结论原文「RMSE 8.94 cm…」(展开后可见),零报错。