Skip to content

Releases: kkutysllb/dsh-coding-sidebar

dsh-coding-sidebar 1.0.40

Choose a tag to compare

@kkutysllb kkutysllb released this 08 Oct 01:05

dsh-coding-sidebar 1.0.40

做减法的一版:移除「智能体团队」与「侧边对话」两个页签(使用率低、维护面大,
属于鸡肋功能),同时移除「侧边栏内容 / 文件预览」的按功能启停开关——全部功能
内置开启,设置页只保留各功能的参数入口。

变更

移除「智能体团队」页签

  • 页签从 + 菜单与注册表里整体删除;随删的还有整条支撑线:
    • 服务端:team-routes.ts(team.createTask / team.updateTask CAS 转发桥)、
      team-types.ts;
    • 客户端:TeamView.tsx、team-model.ts、team-projection.ts 及对应样式;
    • context-types.ts 的 agentTeam 投影镜像类型(上游 dsh-experimental-agent-team
      的 0.1.7 投影不再被读取);
    • api.ts 的 team.createTask / team.updateTask 调用;
    • 测试:tests/team-model.mjs、tests/team-projection.mjs 与
      run-openpath-tests.mjs 里的对应用例块。
  • 上游「智能体团队」插件本身不受影响——本插件只是不再挂它的工作台页签。

移除「侧边对话」页签

  • 页签整体删除;随删的还有整条支撑线:
    • 服务端:sidechat-routes.ts(sidechat.start/prompt/cancel/dispose/info/events
      六条路由 + 模型跟随装订)、sidechat-core.ts(继承种子/边界提示/收件箱队列等纯模型)、
      assistant-live.ts(实时流缓冲,唯一消费方就是侧聊路由);
    • 客户端:SideChatView.tsx、sidechat-transcript.ts、sidechat-questions.ts
      (提问回答路径)及对应样式;
    • client/index.tsx 的 uiSession 待答面捕获(唯一消费方是侧聊提问卡);
    • api.ts 的 sidechat* 六个调用与 withDeadline(唯一用户是 sidechat.events);
    • wire.ts 的 sidechat-error 错误码;
    • 测试:tests/sidechat-*.mjs 四件套与 pnpm test 里的对应条目;
    • 契约检查:check-plugin-contract.mjs 的 ④⑥⑦⑧ 四组侧聊回归闸随之撤销
      (⑤ CSS 类名静态比对等通用检查保留)。
  • 兼容说明:历史会话里可能仍有旧版本创建的 Side: 前缀子会话——
    subagent-detect.isSideThreadSummary 的过滤保留(常量移入该文件),
    这些行继续从子代理拓扑与活动图里排除;wire.ts 之外的旧持久化布局若还开着
    sidechat / team 类型页签,渲染为通用「页签类型已不可用」空态(OrphanedTab),
    关掉即可。

移除「按功能启停」开关(设置页)

  • 「侧边栏内容」与「文件预览」两组小卡不再提供 enable 开关:内置页签与文件查看器
    全部恒可用,卡片保留为功能清单 + 设置入口(声明了 settings.toggles 的功能
    仍从卡片底部齿轮条进入参数弹窗,如终端字体、浏览器接管、编辑器合并模式等)。
  • 随删的机制面:
    • SidebarPrefs.tabsEnabled / viewersEnabled 字段、Loader schema(volatile)与
      用户 PrefsSchema 两个入口、客户端 parsePrefs 解析;
    • betterSidebar 服务的 isTabEnabled / isViewerEnabled 方法;
    • openTab 的禁用拒绝分支、matchFileViewer 的禁用跳步、+ 菜单的启用过滤、
      外链接管的「目标页签必须启用」前置、openPath 接管的编辑器启用前置、
      新会话种子在编辑器禁用时降级 none 的分支、sidebar_open 工具的
      目标页签启用预检(含 registerOpenTool 的 readPrefs 参数)。
  • 旧文档里已存的 tabsEnabled / viewersEnabled 键不再被读取(缺省即全部开启),
    无需迁移。
  • 偏好字段数 26 → 24(run-openpath-tests 的 volatile 矩阵断言同步更新)。

迁移与兼容

  • 从 1.0.39 升级:旧的侧聊线程与团队会话数据不受影响(都是上游会话树里的普通
    子会话),只是本插件不再提供入口;需要继续使用这两个功能的用户请停留在 1.0.39。
  • 设置文档里的 tabsEnabled / viewersEnabled 遗留键无副作用,可留可删。

dsh-coding-sidebar 1.0.38

Choose a tag to compare

@kkutysllb kkutysllb released this 04 Oct 13:11

dsh-coding-sidebar 1.0.38

文件页签标题本地化:中文环境下新任务侧栏原本显示英文 Files,现在按当前
语言显示「文件」;同时修掉它背后那个「同一个文件窗口开出两个页签」的去重缺陷。

变更

文件窗口标题跟随语言(src/client/state.ts)

  • 故障(现场 2026-10-02):中文环境下打开一条新任务,右侧栏默认的文件页签
    标题是英文 Files;任务跑一会儿再从「在文件夹中显示」等路径打开同一个窗口,
    标题又变成「文件」——同一块 UI 出现两种文案。
  • 根因:只有两条打开路径把标题写死成英文字面量,其余路径都走
    locales.ts 的 t('files'):
    1. makeDefaultState() 的新会话种子页签(title: 'Files');
    2. sanitizePersistedTab() 的 explorer → editor 迁移(旧持久态里的
      独立 explorer 页签重开为文件窗口)。
  • 为什么切语言/刷新都救不回来:页签标题是存进状态里的字段而不是渲染期
    算出来的字符串——TabBar 只读 tab.title,标题在创建时定稿,整棵面板重渲染
    不会重写它;而这个字段还会落进 localStorage(dsh-sidebar:v1:<sessionId>)
    永久保存。所以旧值必须在加载期自愈,否则已存在的会话永远显示 Files。
  • 修法:
    • 种子与迁移两处改走 t('files');
    • sanitizePersistedTab() 对无 path 的 editor 页签(= 文件窗口本身,
      标题是派生的 UI 文案而非用户数据、且本仓库没有任何页签重命名入口)在每次
      加载时按当前语言重派生标题——旧版本写进去的 Files 因此自愈,
      中↔英(以及 better-locale 的 ja 覆盖)双向都跟随语言;
    • 带 path 的 editor 页签标题保持原样(文件名是数据,不是文案),
      FLOAT 窗口里的文件窗口同样自愈。

文件窗口单实例(editorTabKey,src/client/state.ts + builtins/tabs.tsx)

  • 故障(第二半):revealInExplorer()(「在文件夹中显示」/ 产出文件行)走
    openTab({type:'editor', title: t('files')}),与种子页签的 id(tab:N)不同,
    本该靠 dedupeKey 收敛到同一个文件窗口;但 editor 描述符的键是
    (tab) => tab.path,无 path 时返回 undefined,而 service.applyDedupe()
    在键为 undefined 时整段跳过去重(if (key !== undefined))——于是同一个
    文件窗口被开出两个页签(一个 Files、一个「文件」),与该描述符自己的注释
    「the single files window」相矛盾。
  • 修法:新增导出 editorTabKey(tab): string(tab.path ?? ''),editor
    描述符改用它。语义:按路径去重,但所有无 path 的 editor 页签是同一个
    文件窗口。带路径的 per-path 窗口行为不变。
  • 用户可见的行为变化:+ 菜单里的「文件」在文件窗口已打开时聚焦它
    (而不是再开一个),与「单一文件窗口」的既有设计意图一致。

测试(tests/tab-i18n.mjs,新增 17 条断言,已挂进 pnpm test)

  • 直接 import 真源码 state.ts + locales.ts(unrun 加载 TS,不是孪生副本)。
  • 覆盖:中/英种子标题、seed='none' 回归、无 path 文件窗口的持久态自愈(含
    explorer 迁移、FLOAT)、带 path 页签标题不被改写、无 path 非 editor 页签
    不被改写、结构损坏仍整体拒绝、editorTabKey 的碰撞/区分语义,外加两条
    源码守卫(state.ts 不得再出现 title: 'Files';editor 描述符必须用
    editorTabKey)——防止这两处硬编码回流。

兼容性说明

  • 无 peer/契约变化;dsh 声明、cordis.patch.yml、服务面与 agent 工具均未动。
  • 持久态格式不变(只重写无 path 文件窗口的标题字段),旧状态、旧 FLOAT、
    旧 explorer 页签都按既有迁移路径继续可读。

验证

  • node tests/tab-i18n.mjs:17/17 PASS(TDD:先落测试观察到 5 条干净 RED,
    再实现至全绿)。
  • pnpm test 全量 ALL PASS;pnpm typecheck 0;pnpm smoke 通过;
    pnpm check:artifacts 字节可复现(192 文件)。
  • 产物级核验:lib/client.js 中 title:"Files" 硬编码命中数 2 → 0,
    editorTabKey 在内 2 处。
  • 待实机验证:重启后中文环境下新任务的默认页签显示「文件」,且反复
    「在文件夹中显示」不再新增第二个文件页签。

dsh-coding-sidebar 1.0.37

Choose a tag to compare

@kkutysllb kkutysllb released this 02 Oct 08:35

dsh-coding-sidebar 1.0.37

本版两块重点:工作流图可手动摆放(节点级拖动 + 树形/紧凑/网格一键整理)与
后台任务浮动面板显示作业真实输出(不再只在模型读过时才显示)。另有
「任务管理」tab 的整体升级:工作流图画布(新视图,与经典树共享同一视图模型与
折叠状态)、两分组折叠聚合,以及 TeamView 的 0.1.7 投影迁移修复(此前所有受支持
宿主上团队 tab 都是「服务缺失」空态)。

变更

工作流图(新视图,subagent-tasks-model + subagent-tasks-layout + WorkflowGraph)

  • 会话树渲染为分层节点 + 三次贝塞尔连线的画布:拖拽平移、滚轮缩放到光标、
    双击背景适配
    ,右下控制条(放大 / 缩小 / 适配)。工具条新增 图/树切换
    (宽屏默认图、窄屏默认树),两种模式共享同一视图模型与折叠状态。
  • 节点卡:类型徽章(主代理 / 子代理 / 已完成聚合 / 待命聚合 / 占位)+ 名称 +
    底部状态条(状态点 + 状态词);运行中节点扫过动画
    (prefers-reduced-motion 下关闭);当前会话 accent 描边。
  • 未水合分支渲染为占位节点(直接子代理计数),并同时触发一次投影读取——
    水合后自动替换为真实子树。

两分组折叠聚合

  • 子代理按续接模式分两组:已完成(one-shot + 空闲)与 待命(continuable +
    空闲,可再次唤起);组员数 ≥ FOLD_MIN(6)时折叠为单行聚合(名字行取前两个
    成员名),点击展开/收起。运行中行永不折叠。
  • 取代旧的「展开更早的 N 个子代理」按时间切割(该键保留于语言包,暂未删除)。

TeamView:agentTeam 投影迁移(P0 修复)

  • 故障:0.1.7 删除了服务面的 remoteView / remoteCreateTask /
    remoteUpdateTask 三方法;本插件团队 tab 仍调用 remoteView——peer 下限
    (>=0.1.7-rc.2)之后的所有宿主上,团队 tab 恒显「服务缺失」空态、零报错。
  • 读路径:改读 Lead Session 的 agentTeam Session 投影
    (projectionsBySession[leadId].values.agentTeam,推送式)——客户端订阅
    sessions.list,纯派生模块 team-projection.ts 把投影映射到既有 TeamView
    形状(成员活跃态/lead 显示名从会话摘要富化;failure 上浮为 notice)。
    一次性 refreshProjections(leadId) 触发首次读取;删除 team.view 路由与
    轮询刷新。
  • 写路径:服务方法更名 remoteCreateTask/remoteUpdateTask →
    createTask/updateTask(caller 仍为 Session 活 Agent;请求形状不变);
    team.createTask / team.updateTask 两条路由保留。
  • 冲突语义不变:过期修订(CAS)提示 teamConflict,看板随投影推送自动回正。

样式表静默失效修复 + 选择条重做 + 样式门禁

  • 真根因(比观感严重得多):sidebar.module.css 里 .plansEmpty .plansHint
    的闭合大括号在 1.0.14 提交中丢失(git log -S 定位),其后所有追加规则被
    lightningcss 编译成顶层嵌套(产物里是 }& .S…_explorerSelectionBar{…}),
    浏览器直接丢弃 —— 本轮"选择条样式完全不生效"就是这么来的。受影响规则共
    11 条:tocFlash、变更页目录组(gitDir*)、多选组(explorerRowSelected /
    explorerSelection*)。已补回大括号,产物中嵌套产物归零。
  • 选择条重做:不再是一排 UA 默认灰按钮(rgb(107,107,107) + 2px outset),
    改为胶囊式:细边框 border-l2 + 分层背景 bg-layer-2 + 阴影,左侧计数
    label-secondary,右侧为文本按钮(默认无底色、hover 浮起 interactive-bg-hover、
    带 focus-visible 焦点环),11px 字号。选中行改为 interactive-bg-hover 底 +
    左侧 2px 指示条。
  • 门禁(防同类静默失效):tests 新增"仓库内每个 .css 去注释后必须大括号
    平衡";smoke 新增产物级断言"无顶层嵌套产物(}& .)+ 选择条规则以正常选择器
    产出"——这类"少一个括号、后面全部失效"的缺陷从此会当场判红。

注册失败必须回滚(上游 v0.22.1「接管 id 孤儿化」的同构守卫)

  • 问题同构:本仓库有两处 for (…) disposers.push(register(…)) ——内建
    tab/viewer 注册(src/client/builtins/index.ts)与八个 agent 工具注册
    (src/tools.ts)。中途任一步抛错时,前面已占用 id 的 disposer 随栈帧一起
    丢失
    ,这些 tab/工具永久无法再注册(下次激活一直 "already registered",
    直到刷新页面)——正是上游 #770/#771 那类缺陷。
  • 修法:新增纯模块 src/registration.ts 的 registerBatch():逐项注册并
    立刻记录 disposer;任一步失败逆序释放已占用项后原样抛出,使重试真的
    能重新注册
    ;返回的 disposer 幂等,单个 disposer 抛错不拖住其余。两处注册
    序列都改为整批原子(tab 与 viewer 视为同一批)。
  • 附带加固:注册表的 notify() 抽为 notifyIsolated()——订阅者抛错不再
    打断"注册 + 通知"链路(否则 tabs.set 已生效而 disposer 未返回,同样产生
    孤儿 id),也不会跳过其后的订阅者。
  • 测试:9 条断言钉在事件日志上——LIFO 释放、幂等、失败后无残留、失败点之后
    不再尝试、回滚后重试成功、failed 释放事件可观测、dispose 抛错不拖累、
    void 注册安全、订阅者抛错不中断注册且 disposer 仍能释放。

文件页四项(上游 v0.24.1 对应项:多选 / 压缩下载 / 打开方式双源 / fs.trees)

  • 多选:file-selection.ts 纯语义(Cmd/Ctrl 加减、Shift 按可见行序取区间、
    折叠后剔除不可见项、Cmd/Ctrl+A 全选、Escape 清空),行内 aria-selected +
    高亮,吸底选择条显示「已选择 N 项」并承载批量动作;配 20 条 node 单测。
  • 压缩下载:新增 zip.ts(自研打包器:可压缩走 deflate、否则 store、
    UTF-8 名标志位、目录项、Unix 权限、条目/字节双上限、RFC 5987 下载名)与
    archive-routes.ts(archive.build 立即返回任务、archive.status 报
    done/total 真进度、archive.result 交付字节;并发 4、TTL 5 分钟、单次下载后
    释放、48MB 传输上限)。客户端轮询进度并在按钮上显示「打包中 done/total」,
    浏览器侧 Blob 保存。
  • 打开方式双源:宿主 apps.list 扫描 /Applications、/System/Applications、
    ~/Applications(一分钟缓存、上限 200),open.external 新增 app 动作
    (open -a <app> <path>,argv-only 无 shell);客户端把本机应用并入菜单,
    与内建编辑器同列,远程工作区自动隐藏(本地专用)。
  • fs.trees 批量 + 性能:新增批量路由(一次 ≤32 条、单点失败只影响自己、
    读并发 8),客户端展开一层后预取至多 8 个子目录(不递归、跳过隐藏目录);
    listDirectory 改为一次 readdir 批量取回再切片(原先 opendir 异步逐条
    迭代)并按目录 mtime 做 LRU 缓存(上限 256,目录自身 mtime 变化即失效)。
  • 实测(1 万条目录):冷路径 29.4ms → 7.8ms(3.8×),命中缓存
    0.05ms(约 160×);8 个子目录 1 次批量请求 3.81ms vs 8 次顺序 4.69ms
    (省的是 8→1 次往返)。功能实测:多选 2 项 + 选择条、Shift 区间 4 项、
    真实下载 client.zip 745KB(testzip 无错、目录递归、命名正确)、含目录
    超 48MB 时给出明确拒绝提示、打开方式子菜单同时列出内建编辑器与本机应用
    (124 项,apps.list 200)、扩展目录时观察到 fs.trees 批量请求。

变更页层级树(上游 v0.24.1 对应项)

  • 新增纯模型 src/client/changes-tree.ts:扁平路径 → 目录树,含
    单子链压缩(src/client/office/viewer 合成一行,不占五级台阶)、
    递归文件计数、目录优先 + 大小写不敏感排序、折叠展平
    (flattenChangesTree)与目录路径收集。配套 node 单测 20+ 条
    (压缩/计数/排序/折叠/空段容错/深度)。
  • Git 视角:暂存区与未暂存区都改为层级树——目录行带 ▾ 折叠、递归计数徽标
    与目录级暂存/取消暂存(git add -A -- <dir>,paths git 原生支持目录,
    一次调用覆盖其下全部文件);文件行按层缩进,行内 +/− 统计与单文件操作不变。
  • 会话视角:同一套树模型按目录分组会话文件操作(行内预览保持不变)。
  • 实测(真实未提交变更):.tmp-tree-check → a/b/c 压缩链 indent 0/14/28px、
    递归计数正确(src 6 / client 4 / tree-check-dir 2)、折叠后 8→7 目录且
    36→32 行、点 src 目录的暂存按钮后 6 个文件整体移入「已暂存 (6)」且
    未暂存区保留其余目录;无页面报错。

浮动窗(上游 v0.22.0 对应项 ③)

  • 新增 FloatingPane(src/client/FloatingPane.tsx + 同名 module.css):可拖拽
    (标题栏)、可四边与四角拉伸、内容区自滚动(拉大把余量给内容,不给
    留白),只有关闭按钮或 Escape 结束——外部点击、失焦、锚点离屏都不关;
    几何按内容键记忆(重开回到上次位置/尺寸),窗口缩小后自动钳回可见区。
    几何数学抽成纯函数 floating-geometry.ts(默认右下角放置 / 视口钳制 /
    八向拉伸 + 最小尺寸),配套 node 单测 12 条。
  • 两个消费者:后台任务输出(原贴底坞改为浮窗,输出未读时给"等待模型读取"
    提示)、共享任务详情/编辑(编辑表单移入浮窗,余量交给描述区)。
  • 交互实现要点:不用 setPointerCapture(它会把随后的 click 重定向到浮窗,
    正是工作流图那个"点不动"的根因),手势期间挂 window 指针监听;浮窗是交互
    弹层,刻意不退出宿主拖拽域(app-region 保持 blanket 的 no-drag),
    与 v0.22.1 那条修复的分工一致。
  • 实机验证(dev 应用 + 真实后台作业 sleep 6000):打开浮窗(562×342,
    底 rgb(44,44,46)=bg-layer-2、描边 border-l2、标题 label-primary 全部
    解析正确)→ 拖拽 (-300,-200) 精确位移 → 右下角拉伸 562×342→782×482
    (+220/+140 精确)→ 外部点击不关 → Escape 关闭 → 重开几何记忆一致
    (1716,536,782,482);无页面报错。

后台任务浮动面板显示作业真实输出

  • 故障:面板原先只回放 job_output("模型读过什么")。模型没读过的作业,面板
    长期停在"等待模型读取"提示——即使作业正在疯狂打印;用户点开浮动面板看不到
    具体输出。
  • 修法:读作业自己的输出环(新增 src/job-retained-output.ts,走宿主注册表
    的非消费读 readAt,不触碰模型的 job_output 游标与 notice 状态,与上游
    job.follow 流读的是同一个投影)。面板取最新 256KB 窗口,越窗/lossy 标记
    截断;响应新增 source: 'live' | 'model'——live 时空输出就是"真的还没输出",
    不再误报"等待模型读取"。作业记录已回收 / 注册表缺读接口时回落到原回放路径。
  • 实测:运行中作业的面板输出随作业增长(长度 42 → 126 → 216 → 306 → 426,
    行数 3 → 29,内容即作业真实 stdout),起始即包含最早保留行;无页面报错。
    单测覆盖读整圈、长输出只取最新窗口并标截断、lossy 标截断、空输出不标截断、
    记录回收/缺接口/无注册表一律回落 undefined。

轨迹图图例在窄侧栏不再竖排

  • 故障:图例是一行可收缩且不换行的 flex,侧栏一窄,每个 chip 被压到小于内容
    宽度,标签便逐字换行("输 入"竖排)。
  • 修法:chip 自身 flex: none + white-space: nowrap(永不被压扁),整行改为
    按 chip 换行(flex-wrap: wrap + 行列间距),搜索框改为可收缩但有下限
    (flex: 0 1 96px; min-width: 72px)。
  • 实测:默认 479px 图例 2 行、单个 chip 高 16–18px;把面板压到 210px 后变为
    4 行、chip 仍为 16–18px(单行),被压扁(scrollWidth > clientWidth)的 chip
    数 = 0
    ,不再出现竖排文字。

自动整理:树形 / 紧凑 / 网格三种排布

  • 控制条新增 树形 | 紧凑 | 网格 三枚芯片(data-wf-mode,aria-pressed 标出
    当前模式):点任意一枚 = 清掉手动偏移 + 按该模式重排 + 重新适配,一步把
    "子代理太多看不清"拉回一张整齐的图;模式按树根缓存,切模式/重开标签不丢。
  • 纯布局新增 TaskLayoutMode:tree(层级,父居中,间距 36/64)、compact
    (同层级、间距 14/38)、grid(按深度分行并按列网格折行,每行至多 6 列
    ——宽扇出从一条无尽长条变成可读的块)。三种模式共用同一套连线与包围盒计算,
    手动偏移在任一模式下都仍然生效。
  • 实测(同一棵树,面板 467×819):内容盒 tree 1184×196 / compact 1096×170 /
    grid 1080×158,适配后缩放 0.279 → 0.303 → 0.432,即网格模式下卡片实际
    大 55%;点击任意模式都会把手动偏移清零(offsets 6 → 0);切换后仍可拖动、
    可重置、可再整理;无页面报错。单测覆盖:紧凑行距更小、网格横向更窄且把宽行折成
    多行、网格无重叠卡片、连线数量不变、偏移在网格模式同样生效。

节点级拖动(任务管理图:手动摆放卡片)

  • 交互:直接拖动画布上的卡片即可移动。默认连同其子树一起走(拖动主代理
    就是整棵树平移),按住 Alt/Option 只移动该卡片;Alt 的语义写进代码注释,
    手柄光标为 grab/拖动态 grabbing。
  • 实现:手动位置以「相对自动布局的偏移」保存(NodeOffsets),自动布局仍是
    底座——layoutTasksViewModel(model, offsets) 在放置之后应用偏移,连线与内容
    包围盒都按拖动后的真实位置重算
    ;偏移按树根缓存(与相机同族、切模式/重开标签
    不丢),并提供 「⟲ 重置布局」 回到自动布局(无手动布局时不显示该按钮)。
  • 不误触:拖动位移超过阈值后,松手不会触发导航;轻点(未移动)仍照常进入该
    子会话。画布平移、缩放、适配都不受影响;「适配」会把拖到负坐标的内容一并框进来
    (minX/minY 参与计算)。
  • 实测:叶子子代理拖动 → 偏移 1 条(只动自己);拖主代理 → 偏移 6 条(整棵
    子树);Alt + 拖主代理 → 1 条;拖动后连线同步变化;点「重置布局」逐字节回到
    自动位置且按钮消失;轻点仍能进入子会话;无页面报错。纯函数单测覆盖偏移应用、
    子树/单节点语义、增量基于手势起点、包围盒越界扩张与重置。

工作流图相机策略修复(手动拖动总被踩回默认区域)

  • 故障:fit() 原先在每次模型/布局变化时无条件执行——执行期的活动
    轮询(live 2s、workflow runs 5s、会话 feed)不断重建视图模型与布局,于是
    手动拖动的位置每两秒被重新适配踩回默认区域,部分节点长期在视口外;fit()
    还会清掉"用户已手动调整"标记,让自动适配永远赢。
  • 修法:新树(root id 变化)才自动适配并清除手动标记;同一棵树
    只在视图仍处自动态时适配(!userAdjustedRef),用户一旦拖动/缩放就不再
    抢占;ResizeObserver 与拖拽中同样不抢;「适配」按钮保持显式复位语义。
  • 实测:拖动 -220,-120 后触发刷新 + 跨两轮轮询(覆盖 live 与 workflow
    两个轮询窗),transform 逐字节不变;「适配」可复位。
  • 相机跨模式/跨重挂粘滞:图/树切换会重挂画布组件,原先相机随之丢失。
    现按树根缓存相机(含"用户已接管"标记,容量 12、最旧淘汰):切回图或
    离开会话再回来重开任务管理,都恢复到你上次的取景;未见过的树仍走自动适配。
    实测:拖动后 translate(-51.5,217) → 树→图 保持 → 切走工作区/会话再切回并
    重开任务管理仍为 translate(8.5,257)(与拖动值逐字节一致,而全新适配为
    translate(208.5,347))。

macOS 桌面拖拽域修复(上游 v0.22.1 / issue #772)

  • 故障:宿主规则 html[data-platform=darwin] body > :not(#root) { -webkit-app-region: no-drag } 命中本插件直挂 body 的面板宿主;而
    app-region 无视 pointer-events,视口尺寸的宿主层把整条标题栏拖拽带
    抵消——桌面壳上「窗口拖一次就失效、双击标题栏缩放失效」。
  • 修法(照上游):面板宿主与放大视图(mermaid modal,同样 portal 到
    body 的铺满层)用中性值 -webkit-app-region: initial !important 退出
    blanket;宿主的子层保持 no-drag(我们的按钮在标题栏条上按下不会
    变成拖窗,延续 #103/#111 的既有约束);交互弹层(划选弹层/浮动窗/锚定
    气泡)不加 initial,否则按下会变拖窗。
  • 实测(计算样式 + CSSOM):宿主 none / 子层 no-drag;模拟
    data-platform=darwin 后普通 body 子元素仍为 no-drag(blanket 未被
    破坏),证明只退出了我们这两层。产物级断言已加入 smoke(中性规则
    ≥2 处 + 子层 no-drag 在位)。

工作流 run 入图(上游 v0.22.0 对应项)

  • 宿主折叠:新增 src/subagent-workflow.ts(纯函数)从 tool-workflow/*
    事件家族折叠 run:run-start{runId,name} / agent-start{seq,label,phase?,childId}
    / agent-end{seq,outcome} / run-end{stopReason}。相位按组内最小 seq
    排序(工作流定义序),无相位成员排尾;agent-end 的 outcome 按 seq 归位。
  • 路由:subagents.workflow(src/subagent-workflow-route.ts)折整个会话
    树;宿主无 subagent 服务时仍折叠根会话(主代理发起的 run 可见),单个会话
    日志不可读只跳过该会话。
  • 入图:buildTasksViewModel 新增 run / phase / member 三种节点——
    run 挂在发起代理下,相位成框,成员带真实 childId 时把目录子会话重挂到
    相位下(保留其子树),目录里没有的成员用 run 数据合成(可点击导航)。
    树与图共用同一模型,两种模式都渲染。

合并活动行(上游 v0.22.0 卡片底条)

  • mergedActivity()(src/subagent-activity.ts):把窗口...
Read more

dsh-coding-sidebar 1.0.36

Choose a tag to compare

@kkutysllb kkutysllb released this 01 Oct 08:53

dsh-coding-sidebar 1.0.36

「任务管理」tab 升级:对齐上游 v0.22.0 的重做方向——工作流图画布(新视图,与经典树共享同一视图模型与折叠状态)、两分组折叠聚合,以及 TeamView 的 0.1.7 投影迁移修复(此前所有受支持宿主上团队 tab 都是「服务缺失」空态)。

变更

工作流图(新视图,subagent-tasks-model + subagent-tasks-layout + WorkflowGraph)

  • 会话树渲染为分层节点 + 三次贝塞尔连线的画布:拖拽平移、滚轮缩放到光标、
    双击背景适配
    ,右下控制条(放大 / 缩小 / 适配)。工具条新增 图/树切换
    (宽屏默认图、窄屏默认树),两种模式共享同一视图模型与折叠状态。
  • 节点卡:类型徽章(主代理 / 子代理 / 已完成聚合 / 待命聚合 / 占位)+ 名称 +
    底部状态条(状态点 + 状态词);运行中节点扫过动画
    (prefers-reduced-motion 下关闭);当前会话 accent 描边。
  • 未水合分支渲染为占位节点(直接子代理计数),并同时触发一次投影读取——
    水合后自动替换为真实子树。

两分组折叠聚合

  • 子代理按续接模式分两组:已完成(one-shot + 空闲)与 待命(continuable +
    空闲,可再次唤起);组员数 ≥ FOLD_MIN(6)时折叠为单行聚合(名字行取前两个
    成员名),点击展开/收起。运行中行永不折叠。
  • 取代旧的「展开更早的 N 个子代理」按时间切割(该键保留于语言包,暂未删除)。

TeamView:agentTeam 投影迁移(P0 修复)

  • 故障:0.1.7 删除了服务面的 remoteView / remoteCreateTask /
    remoteUpdateTask 三方法;本插件团队 tab 仍调用 remoteView——peer 下限
    (>=0.1.7-rc.2)之后的所有宿主上,团队 tab 恒显「服务缺失」空态、零报错。
  • 读路径:改读 Lead Session 的 agentTeam Session 投影
    (projectionsBySession[leadId].values.agentTeam,推送式)——客户端订阅
    sessions.list,纯派生模块 team-projection.ts 把投影映射到既有 TeamView
    形状(成员活跃态/lead 显示名从会话摘要富化;failure 上浮为 notice)。
    一次性 refreshProjections(leadId) 触发首次读取;删除 team.view 路由与
    轮询刷新。
  • 写路径:服务方法更名 remoteCreateTask/remoteUpdateTask →
    createTask/updateTask(caller 仍为 Session 活 Agent;请求形状不变);
    team.createTask / team.updateTask 两条路由保留。
  • 冲突语义不变:过期修订(CAS)提示 teamConflict,看板随投影推送自动回正。

样式表静默失效修复 + 选择条重做 + 样式门禁

  • 真根因(比观感严重得多):sidebar.module.css 里 .plansEmpty .plansHint
    的闭合大括号在 1.0.14 提交中丢失(git log -S 定位),其后所有追加规则被
    lightningcss 编译成顶层嵌套(产物里是 }& .S…_explorerSelectionBar{…}),
    浏览器直接丢弃 —— 本轮"选择条样式完全不生效"就是这么来的。受影响规则共
    11 条:tocFlash、变更页目录组(gitDir*)、多选组(explorerRowSelected /
    explorerSelection*)。已补回大括号,产物中嵌套产物归零。
  • 选择条重做:不再是一排 UA 默认灰按钮(rgb(107,107,107) + 2px outset),
    改为胶囊式:细边框 border-l2 + 分层背景 bg-layer-2 + 阴影,左侧计数
    label-secondary,右侧为文本按钮(默认无底色、hover 浮起 interactive-bg-hover、
    带 focus-visible 焦点环),11px 字号。选中行改为 interactive-bg-hover 底 +
    左侧 2px 指示条。
  • 门禁(防同类静默失效):tests 新增"仓库内每个 .css 去注释后必须大括号
    平衡";smoke 新增产物级断言"无顶层嵌套产物(}& .)+ 选择条规则以正常选择器
    产出"——这类"少一个括号、后面全部失效"的缺陷从此会当场判红。

注册失败必须回滚(上游 v0.22.1「接管 id 孤儿化」的同构守卫)

  • 问题同构:本仓库有两处 for (…) disposers.push(register(…)) ——内建
    tab/viewer 注册(src/client/builtins/index.ts)与八个 agent 工具注册
    (src/tools.ts)。中途任一步抛错时,前面已占用 id 的 disposer 随栈帧一起
    丢失
    ,这些 tab/工具永久无法再注册(下次激活一直 "already registered",
    直到刷新页面)——正是上游 #770/#771 那类缺陷。
  • 修法:新增纯模块 src/registration.ts 的 registerBatch():逐项注册并
    立刻记录 disposer;任一步失败逆序释放已占用项后原样抛出,使重试真的
    能重新注册
    ;返回的 disposer 幂等,单个 disposer 抛错不拖住其余。两处注册
    序列都改为整批原子(tab 与 viewer 视为同一批)。
  • 附带加固:注册表的 notify() 抽为 notifyIsolated()——订阅者抛错不再
    打断"注册 + 通知"链路(否则 tabs.set 已生效而 disposer 未返回,同样产生
    孤儿 id),也不会跳过其后的订阅者。
  • 测试:9 条断言钉在事件日志上——LIFO 释放、幂等、失败后无残留、失败点之后
    不再尝试、回滚后重试成功、failed 释放事件可观测、dispose 抛错不拖累、
    void 注册安全、订阅者抛错不中断注册且 disposer 仍能释放。

文件页四项(上游 v0.24.1 对应项:多选 / 压缩下载 / 打开方式双源 / fs.trees)

  • 多选:file-selection.ts 纯语义(Cmd/Ctrl 加减、Shift 按可见行序取区间、
    折叠后剔除不可见项、Cmd/Ctrl+A 全选、Escape 清空),行内 aria-selected +
    高亮,吸底选择条显示「已选择 N 项」并承载批量动作;配 20 条 node 单测。
  • 压缩下载:新增 zip.ts(自研打包器:可压缩走 deflate、否则 store、
    UTF-8 名标志位、目录项、Unix 权限、条目/字节双上限、RFC 5987 下载名)与
    archive-routes.ts(archive.build 立即返回任务、archive.status 报
    done/total 真进度、archive.result 交付字节;并发 4、TTL 5 分钟、单次下载后
    释放、48MB 传输上限)。客户端轮询进度并在按钮上显示「打包中 done/total」,
    浏览器侧 Blob 保存。
  • 打开方式双源:宿主 apps.list 扫描 /Applications、/System/Applications、
    ~/Applications(一分钟缓存、上限 200),open.external 新增 app 动作
    (open -a <app> <path>,argv-only 无 shell);客户端把本机应用并入菜单,
    与内建编辑器同列,远程工作区自动隐藏(本地专用)。
  • fs.trees 批量 + 性能:新增批量路由(一次 ≤32 条、单点失败只影响自己、
    读并发 8),客户端展开一层后预取至多 8 个子目录(不递归、跳过隐藏目录);
    listDirectory 改为一次 readdir 批量取回再切片(原先 opendir 异步逐条
    迭代)并按目录 mtime 做 LRU 缓存(上限 256,目录自身 mtime 变化即失效)。
  • 实测(1 万条目录):冷路径 29.4ms → 7.8ms(3.8×),命中缓存
    0.05ms(约 160×);8 个子目录 1 次批量请求 3.81ms vs 8 次顺序 4.69ms
    (省的是 8→1 次往返)。功能实测:多选 2 项 + 选择条、Shift 区间 4 项、
    真实下载 client.zip 745KB(testzip 无错、目录递归、命名正确)、含目录
    超 48MB 时给出明确拒绝提示、打开方式子菜单同时列出内建编辑器与本机应用
    (124 项,apps.list 200)、扩展目录时观察到 fs.trees 批量请求。

变更页层级树(上游 v0.24.1 对应项)

  • 新增纯模型 src/client/changes-tree.ts:扁平路径 → 目录树,含
    单子链压缩(src/client/office/viewer 合成一行,不占五级台阶)、
    递归文件计数、目录优先 + 大小写不敏感排序、折叠展平
    (flattenChangesTree)与目录路径收集。配套 node 单测 20+ 条
    (压缩/计数/排序/折叠/空段容错/深度)。
  • Git 视角:暂存区与未暂存区都改为层级树——目录行带 ▾ 折叠、递归计数徽标
    与目录级暂存/取消暂存(git add -A -- <dir>,paths git 原生支持目录,
    一次调用覆盖其下全部文件);文件行按层缩进,行内 +/− 统计与单文件操作不变。
  • 会话视角:同一套树模型按目录分组会话文件操作(行内预览保持不变)。
  • 实测(真实未提交变更):.tmp-tree-check → a/b/c 压缩链 indent 0/14/28px、
    递归计数正确(src 6 / client 4 / tree-check-dir 2)、折叠后 8→7 目录且
    36→32 行、点 src 目录的暂存按钮后 6 个文件整体移入「已暂存 (6)」且
    未暂存区保留其余目录;无页面报错。

浮动窗(上游 v0.22.0 对应项 ③)

  • 新增 FloatingPane(src/client/FloatingPane.tsx + 同名 module.css):可拖拽
    (标题栏)、可四边与四角拉伸、内容区自滚动(拉大把余量给内容,不给
    留白),只有关闭按钮或 Escape 结束——外部点击、失焦、锚点离屏都不关;
    几何按内容键记忆(重开回到上次位置/尺寸),窗口缩小后自动钳回可见区。
    几何数学抽成纯函数 floating-geometry.ts(默认右下角放置 / 视口钳制 /
    八向拉伸 + 最小尺寸),配套 node 单测 12 条。
  • 两个消费者:后台任务输出(原贴底坞改为浮窗,输出未读时给"等待模型读取"
    提示)、共享任务详情/编辑(编辑表单移入浮窗,余量交给描述区)。
  • 交互实现要点:不用 setPointerCapture(它会把随后的 click 重定向到浮窗,
    正是工作流图那个"点不动"的根因),手势期间挂 window 指针监听;浮窗是交互
    弹层,刻意不退出宿主拖拽域(app-region 保持 blanket 的 no-drag),
    与 v0.22.1 那条修复的分工一致。
  • 实机验证(dev 应用 + 真实后台作业 sleep 6000):打开浮窗(562×342,
    底 rgb(44,44,46)=bg-layer-2、描边 border-l2、标题 label-primary 全部
    解析正确)→ 拖拽 (-300,-200) 精确位移 → 右下角拉伸 562×342→782×482
    (+220/+140 精确)→ 外部点击不关 → Escape 关闭 → 重开几何记忆一致
    (1716,536,782,482);无页面报错。

轨迹图图例在窄侧栏不再竖排

  • 故障:图例是一行可收缩且不换行的 flex,侧栏一窄,每个 chip 被压到小于内容
    宽度,标签便逐字换行("输 入"竖排)。
  • 修法:chip 自身 flex: none + white-space: nowrap(永不被压扁),整行改为
    按 chip 换行(flex-wrap: wrap + 行列间距),搜索框改为可收缩但有下限
    (flex: 0 1 96px; min-width: 72px)。
  • 实测:默认 479px 图例 2 行、单个 chip 高 16–18px;把面板压到 210px 后变为
    4 行、chip 仍为 16–18px(单行),被压扁(scrollWidth > clientWidth)的 chip
    数 = 0
    ,不再出现竖排文字。

自动整理:树形 / 紧凑 / 网格三种排布

  • 控制条新增 树形 | 紧凑 | 网格 三枚芯片(data-wf-mode,aria-pressed 标出
    当前模式):点任意一枚 = 清掉手动偏移 + 按该模式重排 + 重新适配,一步把
    "子代理太多看不清"拉回一张整齐的图;模式按树根缓存,切模式/重开标签不丢。
  • 纯布局新增 TaskLayoutMode:tree(层级,父居中,间距 36/64)、compact
    (同层级、间距 14/38)、grid(按深度分行并按列网格折行,每行至多 6 列
    ——宽扇出从一条无尽长条变成可读的块)。三种模式共用同一套连线与包围盒计算,
    手动偏移在任一模式下都仍然生效。
  • 实测(同一棵树,面板 467×819):内容盒 tree 1184×196 / compact 1096×170 /
    grid 1080×158,适配后缩放 0.279 → 0.303 → 0.432,即网格模式下卡片实际
    大 55%;点击任意模式都会把手动偏移清零(offsets 6 → 0);切换后仍可拖动、
    可重置、可再整理;无页面报错。单测覆盖:紧凑行距更小、网格横向更窄且把宽行折成
    多行、网格无重叠卡片、连线数量不变、偏移在网格模式同样生效。

节点级拖动(任务管理图:手动摆放卡片)

  • 交互:直接拖动画布上的卡片即可移动。默认连同其子树一起走(拖动主代理
    就是整棵树平移),按住 Alt/Option 只移动该卡片;Alt 的语义写进代码注释,
    手柄光标为 grab/拖动态 grabbing。
  • 实现:手动位置以「相对自动布局的偏移」保存(NodeOffsets),自动布局仍是
    底座——layoutTasksViewModel(model, offsets) 在放置之后应用偏移,连线与内容
    包围盒都按拖动后的真实位置重算
    ;偏移按树根缓存(与相机同族、切模式/重开标签
    不丢),并提供 「⟲ 重置布局」 回到自动布局(无手动布局时不显示该按钮)。
  • 不误触:拖动位移超过阈值后,松手不会触发导航;轻点(未移动)仍照常进入该
    子会话。画布平移、缩放、适配都不受影响;「适配」会把拖到负坐标的内容一并框进来
    (minX/minY 参与计算)。
  • 实测:叶子子代理拖动 → 偏移 1 条(只动自己);拖主代理 → 偏移 6 条(整棵
    子树);Alt + 拖主代理 → 1 条;拖动后连线同步变化;点「重置布局」逐字节回到
    自动位置且按钮消失;轻点仍能进入子会话;无页面报错。纯函数单测覆盖偏移应用、
    子树/单节点语义、增量基于手势起点、包围盒越界扩张与重置。

工作流图相机策略修复(手动拖动总被踩回默认区域)

  • 故障:fit() 原先在每次模型/布局变化时无条件执行——执行期的活动
    轮询(live 2s、workflow runs 5s、会话 feed)不断重建视图模型与布局,于是
    手动拖动的位置每两秒被重新适配踩回默认区域,部分节点长期在视口外;fit()
    还会清掉"用户已手动调整"标记,让自动适配永远赢。
  • 修法:新树(root id 变化)才自动适配并清除手动标记;同一棵树
    只在视图仍处自动态时适配(!userAdjustedRef),用户一旦拖动/缩放就不再
    抢占;ResizeObserver 与拖拽中同样不抢;「适配」按钮保持显式复位语义。
  • 实测:拖动 -220,-120 后触发刷新 + 跨两轮轮询(覆盖 live 与 workflow
    两个轮询窗),transform 逐字节不变;「适配」可复位。
  • 相机跨模式/跨重挂粘滞:图/树切换会重挂画布组件,原先相机随之丢失。
    现按树根缓存相机(含"用户已接管"标记,容量 12、最旧淘汰):切回图或
    离开会话再回来重开任务管理,都恢复到你上次的取景;未见过的树仍走自动适配。
    实测:拖动后 translate(-51.5,217) → 树→图 保持 → 切走工作区/会话再切回并
    重开任务管理仍为 translate(8.5,257)(与拖动值逐字节一致,而全新适配为
    translate(208.5,347))。

macOS 桌面拖拽域修复(上游 v0.22.1 / issue #772)

  • 故障:宿主规则 html[data-platform=darwin] body > :not(#root) { -webkit-app-region: no-drag } 命中本插件直挂 body 的面板宿主;而
    app-region 无视 pointer-events,视口尺寸的宿主层把整条标题栏拖拽带
    抵消——桌面壳上「窗口拖一次就失效、双击标题栏缩放失效」。
  • 修法(照上游):面板宿主与放大视图(mermaid modal,同样 portal 到
    body 的铺满层)用中性值 -webkit-app-region: initial !important 退出
    blanket;宿主的子层保持 no-drag(我们的按钮在标题栏条上按下不会
    变成拖窗,延续 #103/#111 的既有约束);交互弹层(划选弹层/浮动窗/锚定
    气泡)不加 initial,否则按下会变拖窗。
  • 实测(计算样式 + CSSOM):宿主 none / 子层 no-drag;模拟
    data-platform=darwin 后普通 body 子元素仍为 no-drag(blanket 未被
    破坏),证明只退出了我们这两层。产物级断言已加入 smoke(中性规则
    ≥2 处 + 子层 no-drag 在位)。

工作流 run 入图(上游 v0.22.0 对应项)

  • 宿主折叠:新增 src/subagent-workflow.ts(纯函数)从 tool-workflow/*
    事件家族折叠 run:run-start{runId,name} / agent-start{seq,label,phase?,childId}
    / agent-end{seq,outcome} / run-end{stopReason}。相位按组内最小 seq
    排序(工作流定义序),无相位成员排尾;agent-end 的 outcome 按 seq 归位。
  • 路由:subagents.workflow(src/subagent-workflow-route.ts)折整个会话
    树;宿主无 subagent 服务时仍折叠根会话(主代理发起的 run 可见),单个会话
    日志不可读只跳过该会话。
  • 入图:buildTasksViewModel 新增 run / phase / member 三种节点——
    run 挂在发起代理下,相位成框,成员带真实 childId 时把目录子会话重挂到
    相位下(保留其子树),目录里没有的成员用 run 数据合成(可点击导航)。
    树与图共用同一模型,两种模式都渲染。

合并活动行(上游 v0.22.0 卡片底条)

  • mergedActivity()(src/subagent-activity.ts):把窗口内的 tool/call 按
    名称归并计数(首次出现序),并找出最新无 tool/result 的调用作为
    「在跑那条」;窗口语义与 lastActivity 对齐(尾部 N 条 surface message)。
  • subagents.live 每条活动带上 merged;树行在图/树两种模式下都多一行
    「Bash ×2 · fs_read ×1 · 运行中 fs_write」,图节点底条运行中追加归并摘要。

工作流图交互修复(实机发现的三个缺陷)

  • 画布只显示一小块:图模式仍复用 overflow-y:auto 的滚动容器,其中
    flex:1 无效 → 画布塌缩成内容高度。现图模式切换为弹性列
    (.subagentBodyGraph,不滚动),画布撑满面板(实测 1019px / 面板 1029px)。
  • 节点点不动、+/−/适配没反应(同一根因):容器上调用
    setPointerCapture 会把随后的 click 重定向到容器,节点 <g> 与控制条
    按钮的 onClick 都不触发。现改为拖拽期间挂 window 指针监听,不再捕获;
    控制条另行 stopPropagation 与拖拽解耦。实测:缩放/平移/适配/节点导航
    全部生效(点子代理 → 面包屑切到该子会话)。
  • 尺寸变化不重排:新增...
Read more

dsh-coding-sidebar v1.0.35

Choose a tag to compare

@kkutysllb kkutysllb released this 29 Sep 15:03

dsh-coding-sidebar v1.0.35

发布日期:2026-09-29 · 面向 DSH 0.1.7-rc.2 与 0.2.0-rc.1(同一份包双兼容)

兼容 0.2.0-rc.1:peer 口径重写

此前 11 条 @deepseek-ai/dsh-* peer 写作
^0.1.5-rc.2 || ^0.1.6-alpha.1 || ^0.1.6-alpha.2 || ^0.1.7-alpha.1。
caret 在 semver 下 desugar 成 >=0.1.x <0.2.0-0 —— 上界被改写成 0.2.0-0,
恰好挡掉 prerelease 版 0.2.0-rc.1,闸门即便带 includePrerelease 也救不回来。

后果不是报错而是静默失效:上游 dsh 的插件兼容闸门
(plugin-compatibility.ts + compatibility-preflight.ts)对不兼容的 profile 行
直接 disabled: true,侧边栏整片消失,stderr 只有一行警告。

统一改为 >=0.1.7-rc.2 <1.0.0:

  • 下界含 0.1.7-rc.2 ⇒ 老版本 KCoder(v0.6.14–v0.6.18)的新装用户不受影响
    (那些版本的预置声明是 caret 的 ^1.0.34,本版发布后会被解析到 1.0.35);
  • 上界是不带 -0 的 1.0.0 ⇒ 0.2 / 0.3 的 rc 与正式版都能通过,
    不必每出一个 rc 就改一次口径。

任务计划:递归扫描次级目录

「任务计划」页此前只扫约定目录(plans/、docs/plans/、.plans/)的顶层
*.md,模块注释里写死了「Deeper nesting is deliberately ignored」。按主题或版本
分层存放的计划(plans/2026-09/rollout.md、plans/upstream/0.2.0/plan.md)
一份都不会出现。

现在递归收录各层级的 *.md:

  • 深度上限 6 层(PLAN_SCAN_MAX_DEPTH),避免一次轮询变成无界文件系统遍历;
  • 不下钻 node_modules(PLAN_SCAN_SKIP_DIRS);
  • 不跟随符号链接目录(只进入 Dirent 判为真实目录/文件的条目),遍历不会绕环;
  • 去重(dev:ino)、按 mtime 倒序、相对路径破平、上限 20 条、标题取 512 字节
    head 首标题 —— 语义均不变。

其它

  • devDependencies 由 0.1.7-alpha.1 对齐到 0.2.0-rc.1,在本版引擎依赖树上
    通过 tsc --noEmit。
  • lib/ 内的构建期版本常量(SIDEBAR_SERVICE_VERSION)随重建同步。

验证

  • pnpm typecheck exit 0(0.2.0-rc.1 依赖树)
  • node tests/run-openpath-tests.mjs ALL PASS(含新增的递归/三层嵌套/
    node_modules 跳过/符号链接不跟随四组用例)
  • check:contract / check:artifacts(产物可复现,178 文件字节不变)/ smoke 全过

dsh-coding-sidebar v1.0.34

Choose a tag to compare

@kkutysllb kkutysllb released this 25 Sep 04:37

dsh-coding-sidebar v1.0.34

发布日期:2026-09-25 · 面向 DSH 0.1.7(rc 系列)· 上游同源:DSH-better-sidebar 0.21.1

侧边对话(Side Chat)转正

(beta) 标记移除——这一版把它从「摆着不能用」修成可用、可流式、可读:

  • 能读了(本轮最大的一条):此前侧边对话永远空白。根因是 fetchThread 开头一段遗留的
    能力探测——它先查 ctx.connection.api.sessions.history 是否存在,而当前 rc 载体的客户端
    没有 connection.api 这个面(迁到 remote-namespace 之后),探测失败即 return:
    transcript 一次都不拉,连插件自家的路由都不会被调用。
  • 读法换了:通用 session.history 对 subagent 来源的会话直接拒绝
    (session/agent-busy:"subagent Sessions require their durable parent address"),
    而侧边对话的子会话正是这一类 ⇒ 改走插件自家路由 sidechat.events
    (主机侧切掉继承的 fork seed;活线程读 snapshotEvents()、冷线程走 persistence.open(id,'read')
    句柄,两条路都不激活子会话;带 afterSeq/beforeSeq/maxEvents 分页)。
  • 实时逐字输出:0.1.5 起流式文本不再写入会话日志(旧 assistant/chunk 事件永不再来),
    在途增量是作用域帧 agent/assistant-stream。插件现在订阅它({ global: true },
    与引擎自己的折叠实现同款)折成按会话的有界缓冲,经 sidechat.events 的 live 行送到界面,
    定稿后由 assistant/message 覆盖(不重复、不闪回)。
  • 轮询节拍修了两处:① 不再以 running 为前提——引擎不给 subagent 来源的会话产生 running
    状态
    (恒假),此前导致「只拉一次」;② 等回复期间不退避,且用户动作会取消已排好的那一拍
    (只清退避计数没用,定时器已经 armed)。
  • 工具行结构化(移植自同源上游 0.21.1,与主对话渲染同一批宿主 Block 原子):
    改动卡(edit/write:路径 + 新文本,调用时即出现)、读取卡(行窗口:路径 +
    已读/总行数 + 带行号代码块,行号契约与宿主一致)、终端卡(bash:工作目录 + $ 命令 +
    输出 + 退出药丸,[exit code: N] / [killed by signal: X] 尾标记剥出);
    失败结果退回通用文本行;畸形 meta 一律弃卡而不崩。
  • 每轮收尾一行:token 用量(输出累加、输入取最后一次)与墙钟时长(turn/start → turn/end)。
  • 读失败不再静默:客户端对 sidechat.events 设 5s 截止、主机冷读设 2.5s 上限,超时会明说。

提问回答路径(本轮新增:侧边对话的提问真正可答)

现场:子会话用 ask_user_question 提问时,在输入框敲答案回车没有任何反应——插件当时只走
sidechat.prompt(把回答当成追问送出去),而子会话正卡在那个提问上,于是两边都不动;
提问卡上的选项也只是静态文本,点不了。

引擎的机制(packages/client/ui-user-questions + api-gateway)与本轮接法:

  • 提问走 Remote waterfall user-questions/request,客户端监听器把请求登记成 Session 级
    pending interaction
    (uiSession.sessionStatus 按 sessionId 可见);只有调它的
    answer({ answers }) 才把答案交回服务器。侧边对话的子会话同样会登记——反向解析用的是
    sessions.retainAgentScope(sessionId)(按 id 现取作用域),与「主视图专用」的那几道栅栏无关。
  • 该面通过 waitable ctx.inject(['uiSession'], …) 捕获(别的插件提供的服务;裸 ctx.get 读不到),
    读法与作答都在 src/client/sidechat-questions.ts(结构化消费:只认形状,不 import 引擎运行值)。
  • 问答卡可点:选项渲染成按钮(单选点完即答;多选累积后由「提交回答」收口),
    选项文本原样回传(引擎按 label 匹配);历史里的提问卡不会长出按钮——按题目 id 序列
    与当前待答请求配对,只有配对上的那一行才可交互。
  • 输入框分流:有待答提问时回车先是回答(填第一道未答题,凑齐即成批提交),没有待答时
    才是追问——这正是此前缺的那条判据。提问期间发送键仍在(没有选项的题目也能点着作答),
    停止键也仍在(子会话此时仍是 running)。
  • 答案编码逐字对齐引擎 QuestionComposer.submitDrafts:单选下 custom 与 selected 互斥
    (有自定义文本即清空 selected),多选下两者并存,id 回显题目 id。
  • 选项卡样式的选项卡(按实机反馈调整):选项不再是缩进的一段文本,而是独立卡面上的卡片行
    ——指示器(单选圆点 / 多选方框,选中填充并出勾)+ 主文本 + 次要说明;选中态改用与发送键同一个
    信息蓝描边(深色主题下 brand-primary 是浅色,做描边读不出「选中」);问题本体、detail
    与「可多选」提示都在卡内,整卡用独立卡面(bg-layer-1 + 描边 + 圆角)与工具行正文分开。
    渲染用的是引擎的请求本体(pending.questions)而不是工具行里的副本:配对按题目 id 序列成立,
    请求本体才是权威(带 detail,也是宿主真正在等的那批题)。

模型跟随主会话(本轮新增)

现场:侧边对话永远跑「配置里第一个默认模型」,主会话切到 GLM-5.3-Flash Max 也不跟随
(截图里主会话跑 GLM、侧边栏徽标写 deepseek-v4-flash)。

根因是引擎有两套模型状态,插件拿错了那套:

  • AgentOptions(=插件的 parent.options)是 agent 创建时的启动参数——引擎自己创建主会话时
    传的就是 agentDefaultModel.currentSelection()(部署默认);
  • 用户在会话里换的模型走 session.selectModel → session/selection 事件 + 运行时装订的
    selection(ApiSessionAgentController.selectionFor,由 composeAgent 的 setup 装订),
    从不回写 agent.options。

而插件的子会话 setup 是自己写的(只挂 preset)——把引擎那步 install 跳过了(旧注释还写着
「child carries the parent's provider/model in agentOptions」,前提本身就是错的)。
⇒ 子会话退回启动参数 = 默认模型。

修法三条:

  1. 建线程时装订:子会话 setup 里补上 agents.selectionFor(agent)——引擎 composeAgent
    的第一步(packages/api-session-controller/src/agent.ts:393)。它按会话自己的日志投影
    解析 pending ?? lastUsed,而子会话的日志带着父会话的 fork seed ⇒ 解析出的正是父会话此刻的模型
    (含推理档位);冷恢复同理(子会话自己的 request/header 就是它上次真正用过的模型)。
    两处 setup(新建 / 冷恢复)都装订,服务缺席或投影缺席时记一行警告并退回启动参数。
  2. 每次投递前对齐:sidechat.prompt 在投递消息前把线程对齐到父会话此刻的选择。只装订开局
    那一次不够——用户之后在主会话换模型,已存在的线程不会自己知道(针对 subagent 的
    session.selectModel 被引擎 fence 掉)。相同则一个字节都不写(只有真的不同才落一条
    model/selection)。
  3. 徽标不再说谎:sidechat.info 原先报 agent.options(启动参数)。现在报装订的选择;
    冷线程报持久记录里最后一次请求头真正用过的模型(resolveLoggedModelSelection)。

第二轮修正(真正的根因,前两版都错在这里):前两版都去调
ctx.get('agents').selectionFor(...) / selectForNextRequest(...)——那两个方法不在 agents
服务上
。ctx.get('agents') 是核心 AgentRegistry(create/get/resume),而
selectionFor/selectForNextRequest 在 ApiSessionAgentController 上,那是个私有实例
(private readonly agents),根本不注册成服务 ⇒ 那两处调用恒为 no-op(可选链把 TypeError
吞了)。于是:建线程时看着「跟上了」其实是 agentOptions 带过去的 provider/model 在起作用;
而「已经开着的线程换模型」没有任何机制——现场正是「第一次跟随、之后不跟随」。

正确的公开装配面是 installModelSelection(agentCtx, ref)(@deepseek-ai/dsh-agent,引擎自己的
composeAgent 也用它),它在 agent 作用域挂三件事:system-prompt/assemble 写入 provider/model
变量、agent/request 用 ref.assembled 覆盖请求配置(真正决定模型的那一步)、agent/pre-step
在换路由时追加一条耐久「model changed」通知。而 ref 就是一个可变对象:

  • 建线程:装订一个本插件持有的 ref,初值 = 父会话此刻的选择;
  • 冷恢复:初值 = 线程自己日志里生效的那个(pending ?? lastUsed);
  • 每次投递前对齐:直接改 ref.current(下一次请求组装即生效),并落一条 model/selection
    事件(耐久 + 转录里那行「已跟随主会话切换到 X」);本来就一致则一个字节都不写;
  • 徽标读的是这个 ref(不再是 agent.options,也不再依赖任何可选服务)。

失败必须看得见:sidechat.prompt 现在回传 modelFollow { ok, switched, model?, reason? },
面板在 ok=false 时直接显示「未能跟随主会话的模型:<原因>」——两轮实机排查都是因为「静默不发散」
才多绕了一圈,这条把本轮所有早退原因(没记录父会话 / 父会话不在 / 读不到模型选择 / 线程未装订)
变成了界面上的字。

实机复验补的一轮(首版没生效):首版只走 sessionProjections 投影,而裸 ctx.get 在
某些挂载顺序下取不到该服务 ⇒ 跟随静默失效(徽标不换、也没有任何提示)。这一轮:

  • 加日志兜底:effectiveModelSelectionFromLog 是引擎 modelSelection 投影的等价 fold
    (model/selection → pending;request/header → lastUsed,与 pending 相同即消费掉 pending),
    投影取不到就地折会话日志(snapshotEvents())——同一份事实源,少一个服务依赖;
  • 父会话两级查找:先 sessions.get(id),退 agents.get(id).session;
  • 不再无声跳过:每条早退路径都记一行带原因的警告(没有 parentSession / 父会话不在 / 投影与日志
    都读不到 / 服务缺 selectForNextRequest / 对齐抛错),换模型成功也记一行 info;
  • 转录里看得见:子会话日志新出现的 model/selection 渲染成一行「已跟随主会话切换到 X」
    (此前用户只能靠徽标猜,而徽标还会说谎)。

追问队列卡(本轮新增)

现场:侧边对话正在跑的时候追问一句,输入框一清空就什么都没有了——其实消息没丢,是看不见:
追问走引擎的排队语义(agent.followup),消息在引擎领取之前不进会话日志,转录里自然没有它。

  • 唯一知道队列的地方是 agent 收件箱的 nextTurn:主机侧 sidechat.info 现在把它读出来
    (queuedFollowups,防御式收窄 + 多文本块拼接),客户端在输入框正上方画成队列卡:
    「队列中 N 条追问(当前回合结束后依次发送)」+ 每条正文(两行截断)+ 一行提示。
  • 队列随 info 的每一拍刷新 ⇒ 引擎领取一条,卡片自己少一条,转录里同时出现那条用户消息。
  • 「停止」保持原语义(keepInbox):只中止当前回合,队列保留——提示里也这么写了。

修复与加固

  • openTab 展开判据抽出为无依赖纯函数(src/client/open-intent.ts),新增真源码行为测试
    tests/open-intent.mjs(13 例,含 v0.1.33 那条 type + meta 回归)。
  • 新增侧边对话行为测试 tests/sidechat-live.mjs(16 例:实时流折叠、root/ctx 双通道、
    transcript 合并与定稿覆盖、工具卡收窄与退化、每轮汇总聚合)。
  • 契约断言新增检查 ④(四项回归闸,静态钉住本轮五个真 bug 的形态,断言前先剥注释)。
  • 新增追问队列测试 tests/sidechat-queue.mjs(5 例:顺序与身份、多文本块拼接与裁白、
    畸形收件箱不造行、缺 id 兜底、只看 nextTurn 不看 steering)。
  • 契约断言新增检查 ⑧(队列两项回归闸:主机必须读收件箱、客户端必须画队列卡)。
  • 新增模型跟随测试 tests/sidechat-model.mjs(12 例:投影取值 pending ?? lastUsed 与容错、
    冷线程请求头解析、主机侧接线用真函数 + 假服务驱动——一致则零写入 / 不同则写出父会话选择 /
    服务缺席与抛错都只降级不抛;以及投影服务缺席时走日志兜底仍能跟随、
    早退路径必须留下带原因的警告)。
  • 契约断言新增检查 ⑦(模型跟随三项回归闸:必须调 selectionFor(;两处 setup 都要装订;
    每次投递前必须对齐)。
  • 新增回答路径行为测试 tests/sidechat-questions.mjs(15 例:待答面结构化收窄与容错、
    useSyncExternalStore 要求的引用稳定性、单选/多选草稿语义、答案编码对齐引擎、输入框分流判据、
    历史卡配对)。
  • 契约断言新增检查 ⑤(css.<类名> 必须在本文件 import 的那张 CSS 表里定义):CSS Modules 按
    文件哈希类名,跨文件引用取到的是 undefined ⇒ 样式无声失效——P3 的三张结构化卡正是这样
    上线且没人看出来的(内容照常,只是没排版)。这条检查当场还抓出 TrajectoryGraph.tsx 里一处同类
    死引用(css.legendEdgeOn,实际样式由 aria-pressed 承载,已删)。
  • 契约断言新增检查 ⑥(回答路径两项回归闸:提交路径必须含回答分支;待答面必须走 waitable
    ctx.inject(['uiSession']) 且不得进全必需的 inject 清单)。
  • 发布构建环境无关:构建模式只认显式开关(KCODER_BUILD_MODE),不再继承环境 NODE_ENV
    ——此前 npm publish(会跑 prepack 重建)在 NODE_ENV=development 的 shell 里会把开发版分支
    打进发布包(1.0.33 的实测证据:发布产物的 lib/client-office.js 与 dev 构建逐字节相同)。

升级注意

  • 侧边对话的既有线程历史都还在:它们此前「空白」是读取路径的问题,不是数据丢了。
  • 冷会话读有 2.5s 上限:超时会明确报「读取超时」,而不是无限等待或静默空白。
  • 本轮诊断代码已全部移除(零残留);保留的是两类正式防御(两侧超时)与双通道订阅
    (作用域帧的投递边界随宿主组合而异,折叠幂等)。

dsh-coding-sidebar 1.0.33

Choose a tag to compare

@kkutysllb kkutysllb released this 24 Sep 16:33

dsh-coding-sidebar 1.0.33

定时任务轮尾卡「打开」不再展开原生右栏列——详情落到自家「任务计划」tab;同版修掉
预览期的 remote.schedule 取用报错,以及「带 meta 的 open 落进收起面板」。

新增:定时任务预览(「任务计划」tab 承接)

  • 背景:0.1.7-rc.2 的定时任务轮尾卡「打开」会展开原生右栏列——该列一展开就在主
    对话区旁留一大片空白(与 dsh-context 那次同源)。产品要求屏蔽该列,把详情落进自家侧边栏。
  • 设计——数据面与导航面分离:
    • 引擎只传身份:openTab({type:'plans', id:'plans', meta:{kcScheduleTask:{sessionId,taskId}}}),
      再补一次 updateTab(plans 是 single tab,去重只聚焦、不写 meta——不补这次,
      第二条任务的「打开」仍会显示上一条)。
    • 数据由本插件自取:ctx.remote.schedule.list({sessionId}) 后按 id 命中。该 remote 面
      按可选查找、绝不写进 inject:上游默认不挂 schedule 插件,缺席时必须保留计划文档
      列表、只报「读不到这条任务」,不能让整个插件挂不起来。插件缺席时引擎回落原生右栏 tab。
  • 改动:
    • 新增 src/client/ScheduleTaskPreview.tsx:预览卡(标题 / 频率 / 下次触发 / 提示词)
      • readScheduleTaskTarget(meta) 守卫(无标记即不占位,页面与原来完全一致);
        every 按秒/分/时归一,其余按 kind 命名。
    • PlansView 新增 ctx / scheduleTask / onDismissSchedule 三个 props,预览渲染在
      文档列表之上。
    • plans descriptor 读 tab.meta 接预览;onDismissSchedule 用 meta: {} 清标记
      ——updateTab 会丢弃 undefined 字段,写 undefined 等于没清。
    • locales:zh + en 各补 18 键(其余 19 个语言文件是 Record<string,string>,不参与键齐性);
      CSS 新增 .schedPreview* 块,全部走既有 --dsw-alias-* token,零硬编码颜色。

修复

remote.schedule 改用延迟装配

  • 现象:预览渲染时抛 读取任务失败: cannot get property "remote.schedule" without inject。
  • 根因:ctx.remote 是可追踪服务代理,深层路径(remote.schedule)会被整体
    校验 inject,直接读属性即抛;而把该面写进本插件 inject 清单,又会让它在上游默认
    (不挂 schedule 插件)的载具上整体不挂载——Cordis 的 inject 是 all-required。
  • 处置:改走 ctx.get 延迟装配,缺面时降级为「读不到这条任务」。

带 meta 的 openTab 归入「内容型」

  • 现象:预览已能取到任务,但面板收起时点轮尾卡「打开」看不到任何变化。
  • 根因:只有带 path/url 的 open 才走「内容型」分支并自动展开面板,纯 type + meta
    被判成 type-only ⇒ tab 开在收起的面板里,表现成「点了没反应」(activateTab 不展开,
    togglePanel 又不是公开 API,引擎侧无解)。
  • 处置:判据扩到 seed.meta——带 meta 的 open 就是「带着要显示的内容来的」,与
    path/url 同类,理应落在可见处。影响面已核:+ 菜单(本就在面板内,展开幂等)、
    agent 终端自动开 tab(不传 meta)、sidechat 的 meta:{threadId}(走 descriptor.createTab,
    不经过 seed.meta)。附带治好 sidechat 自动开 tab 却落在收起面板的同类潜在缺口。

分发:本版必须 bump 版本

  • 现象:引擎的重定向生效了(「任务计划」tab 被打开),但面板里没有预览——根因不在
    代码,在分发。
  • KCoder 的 bundle 物化是版本驱动的:
    staleTarget = !intact || 版本不可读 || gt(srcVersion, dstVersion)。「1.0.32 == 1.0.32」
    ⇒ 跳过拷贝 ⇒ profile 里那份实体仍是旧构建(kcScheduleTask 0 命中),运行的插件里根本
    没有预览代码。
  • 故 package.json → 1.0.33(lib 随 pnpm build 重建,构建期注入的
    SIDEBAR_SERVICE_VERSION 同步为 1.0.33)。
  • 教训(已写进 README 开发清单):只要物化是版本驱动的,插件改动要到达已装应用就必须
    bump 版本;否则代码在 bundle/ 里、不在 profile 里,表现成「改了但没生效」,而
    typecheck / 单测 / 产物检查全绿。

文档

  • README「本地开发」补三条跨层默认语义:可选面只能走 ctx.get / ctx.inject;插件改动必须
    bump 版本;程序化 openTab 要用户看见就必须带 meta。完整版见 KCoder 仓
    docs/plugin-dev-checklist.md。

兼容性说明(重要)

  • 本版数据缝仍是 0.1.7 单线,沿用 1.0.32 的 projectionsBySession / refreshProjections /
    jobs 客户端面;0.1.6 系宿主请继续使用 1.0.30。
  • package.json 的 peer 范围仍声明 ^0.1.6-alpha.2,与实现的 0.1.7 单线存在口径差
    ——1.0.32 已提出该口径差,本版未动(建议后续收口到 ^0.1.7-alpha.1,或补 0.1.6 回退分支)。

验证

  • 发布前在 HEAD(7d4a451)上重跑:typecheck exit 0;test ALL PASS;smoke 通过;
    sync:check 镜像对账通过;check:artifacts 175 文件字节不变 ✓。
  • 产物缝核对:lib/client.js / lib/client-registry.js 内 kcScheduleTask 与
    schedPreviewTitle 就位,版本常量 1.0.33 同步;本仓 / dsh-plugins 镜像 / KCoder bundle
    三份一致(后两仓已同批提交推送)。
  • 行为面:tests/ 是纯 helper 级(无 openTab 的行为测试),故「预览可见」「面板自动展开」
    只有类型 + 产物两道静态证据,由作者 dev 实机确认。
  • 环境口径提醒:check:artifacts 的重建会继承 shell 环境。若 shell 带
    NODE_ENV=development(DSH 侧车 shell 即如此),rolldown 会把 react-is 的
    development 副本内联进 lib/client-office.js(+77KB 且含 $1 改名漂移),闸门会误报
    「产物不可复现」。发版前请用 env -u NODE_ENV pnpm check:artifacts,或先收口脚本(见遗留)。

遗留

  • 作业缝的在线验证仍未做(1.0.32 遗留项):新起的侧车作业注册表为空(作业是进程内的),
    该半已做代码 / 产物 / 类型三重核对,待现场有活作业时确认。
  • scripts/check-artifacts.mjs 未固定 NODE_ENV,存在上述误报面——建议在重建三步里显式
    env: { ...process.env, NODE_ENV: 'production' }。

dsh-coding-sidebar 1.0.32

Choose a tag to compare

@kkutysllb kkutysllb released this 23 Sep 23:06

dsh-coding-sidebar 1.0.32

修复 0.1.7-rc.1 下「任务管理」页恒显「加载中…」:子代理目录与作业名册两条
0.1.6 数据缝被上游移除后,改为按 0.1.7 新契约读取。

现象

  • 0.1.7-rc.1 宿主下,「任务管理」页把整棵拓扑渲染成一列 disabled 行、每行都写
    「加载中…」(现场:36 个子代理全如此),且永不恢复;控制台零报错。

根因(逐行闭合)

  • SubagentView 仍在读 0.1.6 时代的列表快照字段,而 0.1.7 已移除:
    • list.subagentsByParent(子代理目录)——运行时产物命中数 43 → 0
    • list.jobsBySession(作业名册)——44 → 0
  • 两者都是可选链调用(setSubagentCatalogOpen?.() 等):缺失时静默 no-op,
    于是 catalogs = {} → rootCatalog === undefined →
    summaryBackedLoading = (rootCatalog === undefined) && directChildren(byId).length > 0
    恒真 → 走 CatalogLoadingRows,按摘要镜像逐个子会话渲染 aria-disabled
    占位行、标签固定 t('loading')。既不报错也不自愈。
  • 教训:这类回归里「控制台 0 error」是无效证据——判定要看 DOM
    (aria-disabled 行数)与产物字段命中数。

迁移(按上游 0.1.7 契约)

  • 目录:改读 projectionsBySession[parentId].values.subagentCatalog(标准逐
    Session 投影值),按上游参考消费者 ui-subagent/SubagentHeaderLineage.tsx
    的派生方式还原 state / error / entries;行活动态取 Session 摘要;hasChildren
    由子会话自身目录得出。未打开的目录分支用 refreshProjections(sessionId)
    显式读取——它取代了 0.1.6 的 setSubagentCatalogOpen / refreshSubagents 对
    (无 un-observe 对端,故清理半边删除)。依据上游决策记录
    .agents/notes/implemented/simplification/2026-09-08-web-subagent-catalog-projections.md。
  • 作业:改用 ctx.get('jobs')(api-job-controller 客户端半)的 state
    快照 + 按会话 watchRows(sessionId);行形状与旧镜像一致,派生逻辑未动、只换
    数据源。用 ctx.get 而非硬 inject,保留「运行时缺该半则整段不显示」的降级姿态。
  • 同 bug 类第三处:TeamView.openTeammate 也在调已消失的 refreshSubagents
    (打开成员前刷新名册),改为 refreshProjections。

新增

  • src/client/subagent-catalogs.ts —— 投影 → 页面既有 catalog 形状的纯派生;
  • src/client/use-jobs-rows.ts —— 作业名册订阅(watchRows 集合随树/会话变化释放)。

兼容性说明(重要)

  • 本版数据缝为 0.1.7 单线:projectionsBySession / refreshProjections /
    jobs 客户端服务均为 0.1.7 才有的面。实证:0.1.6-alpha.2 宿主 runtime
    (KCoder 内置 runtime)中 projectionsBySession 与 refreshProjections 命中
    均为 0,且不存在 job-controller 包。
  • 0.1.6 系宿主请继续使用 1.0.30(含 0.1.6 数据缝与 1.0.28 的任务管理导航修复);
    在 0.1.6 上安装本版会让「任务管理」页退回「加载中…」占位行。
  • package.json 的 peer 范围目前仍声明 ^0.1.6-alpha.2,与实现的 0.1.7 单线
    存在口径差——建议后续把 peer 收口到 ^0.1.7-alpha.1,或补 0.1.6 回退分支。

验证

  • 独立复核(发布前在 HEAD 上重跑):typecheck exit 0;tests ALL PASS;
    smoke 通过;check:artifacts 174 文件字节可复现。
  • 产物缝核对:subagentsByParent / setSubagentCatalogOpen / refreshSubagents
    均 0 命中;projectionsBySession / refreshProjections / watchRows 在位。
  • 作者 rc.1 dev 实机验证(隔离实例 + 同 dev home,打开 36 子代理会话):
    修复前 36 个 role=treeitem[aria-disabled=true] 全「加载中…」;修复后
    36 个 treeitem、aria-disabled 0,显示真实条目,页面「加载中…」计数 0。

遗留

  • 作业缝的在线验证未做:新起的侧车作业注册表为空(作业是进程内的),
    该半已做代码 / 产物 / 类型三重核对,待现场有活作业时确认。

dsh-coding-sidebar 1.0.31

Choose a tag to compare

@kkutysllb kkutysllb released this 23 Sep 13:25

dsh-coding-sidebar 1.0.31

客户端图清单纠偏:dsh.client.inject 改列 0.1.7 真实存在的图行,去掉已消亡的
@deepseek-ai/dsh-client-runtime 与类型包 ui-slots;无行为改动。
本版同时是 1.0.29 / 1.0.30 的发布载体(两版未单独上架 npm)。

变更

客户端清单:inject 改列真实图行(7 条)

  • 去掉 @deepseek-ai/dsh-client-runtime:0.1.7-alpha.1 已无此包(末版
    0.1.1-rc.2)。清单是客户端图的到达序提示,指向不存在的行会被
    client-modules 的 graphRows 查找静默跳过——不影响启动,但清单失真会
    掩盖真实依赖、让排障时误以为该包仍是契约的一部分。
  • 去掉 @deepseek-ai/dsh-client-ui-slots:它只是类型包(PropsRuntime 类型
    导入),不是客户端图行;slots 的图行提供方是 ui-renderer。
  • 改列真实提供方 7 条:dsh-api-remotes、dsh-api-session-controller、
    dsh-client-connection、dsh-client-locale、dsh-client-modules、
    dsh-client-ui-conversation、dsh-client-ui-renderer——服务面对应
    remote(+remote.session) / sessions / connection / locale / modules
    / slots,外加轨迹图经 ctx.get('uiConversation') 探针订阅的宿主
    trajectory target 行;src/client/index.tsx 的 inject 数组未改动。

冒烟闸门同步(scripts/smoke-plugin.mjs)

  • dsh.client.inject 断言由钉死的「五件套」改为上列 7 条图行清单;旧断言钉着
    已消亡的 dsh-client-runtime 与类型包 ui-slots,在本版清单变更后必然失败
    (prepack 会拦下发布),故随本版一并收口,并补注释写明判据。

产物刷新

  • lib/client.js / lib/client-registry.js:随清单与版本号重建(横幅版本由
    tsdown 从 package.json 注入,本版为 1.0.31)。
  • lib/client-office.js:换用干净全量重建产物。已提交版本来自 watch/增量
    构建,与干净重建存在字节分歧(多内联一份 react-is@16 开发包、
    isRegExp → isRegExp$1 改名、体积差)——与 v1.0.27 命中过的成因同类;
    已确认连续两次干净重建字节一致后再提交。

兼容性说明

  • 无行为改动:清单只是到达序提示,1.0.30 及更早的宿主组合行为不变;
    client-office 的刷新只改分包内部打包形态,docx / xlsx / pptx 三个视图导出不变。
  • peer 范围不变(^0.1.5-rc.2 || ^0.1.6-alpha.1 || ^0.1.6-alpha.2 || ^0.1.7-alpha.1);
    ui-slots / ui-primitives 等类型包仍在 peer 声明内,只从图清单移除。
  • npm 通道自 1.0.28 起未再上架:本版把 1.0.29(settings 命名空间 →
    0.1.7 profile-config / volatile 迁移)与 1.0.30(0.1.7-alpha.1 契约批:
    图标命名 / V4 source kind / jobs caller / 依赖平移)一并带到 latest;
    0.1.7 线宿主请安装 ≥ 1.0.31。

验证

typecheck 0、tests ALL PASS(601 例)、build + check:artifacts(172 个产物文件
连续两次干净重建字节可复现)+ smoke 全绿(清单断言改列 7 条后通过)。
真源提交 71b740a(清单与产物)、563dd97(门禁断言 + client-office 干净产物)。

dsh-coding-sidebar 1.0.30

Choose a tag to compare

@kkutysllb kkutysllb released this 23 Sep 13:26

dsh-coding-sidebar 1.0.30

适配 dsh 0.1.7-alpha.1 契约批:图标 size-neutral 命名、V4 会话来源 kind、
jobs kill caller 改 SessionId、依赖与 peer 范围平移。

变更

图标:size-neutral 新命名(24 文件 / 30 个导入名)

  • Icon*Outline16 / Icon*Outline14 → Icon*OutlineRegular,*Fill* 同理
    (上游改为按字形而非字号命名);插件自有的 19 个本地图标不动。

V4 会话格式:来源 kind 去包装

  • 消息来源废除 kind:'plugin' 包装——侧边对话的边界注入改用自有 kind
    'sidechat-injection'(按上游 time-context 同范式 declare module '@deepseek-ai/dsh-llm' 扩 MessageSourceMap);识别仍走文本前缀,行为不变。

jobs:kill 的 caller 类型改 SessionId

  • 0.1.7 的归属栅栏按会话比对,继续传 Agent 会 404;结构面与注释同步。

依赖平移

  • devDeps 12 条平移到已发布的 0.1.7-alpha.1(此前误判为未发布);
  • peer 11 条追加 || ^0.1.7-alpha.1——peer 范围是累加,^0.1.5-rc.2 || ^0.1.6-alpha.1 || ^0.1.6-alpha.2 保持不变,0.1.6 及更早宿主不被排除。

核对结论(无需改动)

  • agentPresets 的 resolve / mount 保留;
  • subagent descriptor 同名同参;SubagentListEntry 的 activity / hasChildren
    仍可用;
  • webServer 的 register / registerUpgrade 形态未变。

兼容性说明

  • peer 范围含 0.1.5-rc.2 / 0.1.6-alpha.1 / 0.1.6-alpha.2 / 0.1.7-alpha.1:
    0.1.6 系宿主仍可安装,会话导航等接缝自带 0.1.5 回退链;
  • 本版包含 1.0.28 的任务管理导航修复(workspace-nav 接缝:等待式注入捕获
    uiWorkspace + 方法调用保 this + 三态降级)。

验证

typecheck 0、tests ALL PASS(582 例)、build + check:artifacts(产物 172 文件
字节可复现)+ smoke 全绿;线上 1.0.28 tarball 复核含 nav-seam v3 修复代码。
真源提交 be00eb7(镜像:dsh-plugins 8798af3)。