Repository navigation
Releases: kkutysllb/dsh-coding-sidebar
Release list
dsh-coding-sidebar 1.0.40
dsh-coding-sidebar 1.0.40
做减法的一版:移除「智能体团队」与「侧边对话」两个页签(使用率低、维护面大,
属于鸡肋功能),同时移除「侧边栏内容 / 文件预览」的按功能启停开关——全部功能
内置开启,设置页只保留各功能的参数入口。
变更
移除「智能体团队」页签
- 页签从
+菜单与注册表里整体删除;随删的还有整条支撑线:- 服务端:
team-routes.ts(team.createTask/team.updateTaskCAS 转发桥)、
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
dsh-coding-sidebar 1.0.38
文件页签标题本地化:中文环境下新任务侧栏原本显示英文
Files,现在按当前
语言显示「文件」;同时修掉它背后那个「同一个文件窗口开出两个页签」的去重缺陷。
变更
文件窗口标题跟随语言(src/client/state.ts)
- 故障(现场 2026-10-02):中文环境下打开一条新任务,右侧栏默认的文件页签
标题是英文Files;任务跑一会儿再从「在文件夹中显示」等路径打开同一个窗口,
标题又变成「文件」——同一块 UI 出现两种文案。 - 根因:只有两条打开路径把标题写死成英文字面量,其余路径都走
locales.ts的t('files'):makeDefaultState()的新会话种子页签(title: 'Files');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 typecheck0;pnpm smoke通过;
pnpm check:artifacts字节可复现(192 文件)。- 产物级核验:
lib/client.js中title:"Files"硬编码命中数 2 → 0,
editorTabKey在内 2 处。 - 待实机验证:重启后中文环境下新任务的默认页签显示「文件」,且反复
「在文件夹中显示」不再新增第二个文件页签。
dsh-coding-sidebar 1.0.37
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 的
agentTeamSession 投影
(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.zip745KB(testzip无错、目录递归、命名正确)、含目录
超 48MB 时给出明确拒绝提示、打开方式子菜单同时列出内建编辑器与本机应用
(124 项,apps.list200)、扩展目录时观察到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):把窗口...
dsh-coding-sidebar 1.0.36
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 的
agentTeamSession 投影
(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.zip745KB(testzip无错、目录递归、命名正确)、含目录
超 48MB 时给出明确拒绝提示、打开方式子菜单同时列出内建编辑器与本机应用
(124 项,apps.list200)、扩展目录时观察到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与拖拽解耦。实测:缩放/平移/适配/节点导航
全部生效(点子代理 → 面包屑切到该子会话)。 - 尺寸变化不重排:新增...
dsh-coding-sidebar v1.0.35
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 typecheckexit 0(0.2.0-rc.1 依赖树)node tests/run-openpath-tests.mjsALL PASS(含新增的递归/三层嵌套/
node_modules跳过/符号链接不跟随四组用例)check:contract/check:artifacts(产物可复现,178 文件字节不变)/smoke全过
dsh-coding-sidebar v1.0.34
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」,前提本身就是错的)。
⇒ 子会话退回启动参数 = 默认模型。
修法三条:
- 建线程时装订:子会话 setup 里补上
agents.selectionFor(agent)——引擎composeAgent
的第一步(packages/api-session-controller/src/agent.ts:393)。它按会话自己的日志投影
解析pending ?? lastUsed,而子会话的日志带着父会话的 fork seed ⇒ 解析出的正是父会话此刻的模型
(含推理档位);冷恢复同理(子会话自己的request/header就是它上次真正用过的模型)。
两处 setup(新建 / 冷恢复)都装订,服务缺席或投影缺席时记一行警告并退回启动参数。 - 每次投递前对齐:
sidechat.prompt在投递消息前把线程对齐到父会话此刻的选择。只装订开局
那一次不够——用户之后在主会话换模型,已存在的线程不会自己知道(针对 subagent 的
session.selectModel被引擎 fence 掉)。相同则一个字节都不写(只有真的不同才落一条
model/selection)。 - 徽标不再说谎:
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
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,预览渲染在
文档列表之上。plansdescriptor 读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 里那份实体仍是旧构建(kcScheduleTask0 命中),运行的插件里根本
没有预览代码。 - 故
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)上重跑:typecheckexit 0;testALL PASS;smoke通过;
sync:check镜像对账通过;check:artifacts175 文件字节不变 ✓。 - 产物缝核对:
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
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 → 0list.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;
testsALL PASS;
smoke通过;check:artifacts174 文件字节可复现。 - 产物缝核对:
subagentsByParent/setSubagentCatalogOpen/refreshSubagents
均 0 命中;projectionsBySession/refreshProjections/watchRows在位。 - 作者 rc.1 dev 实机验证(隔离实例 + 同 dev home,打开 36 子代理会话):
修复前 36 个role=treeitem[aria-disabled=true]全「加载中…」;修复后
36 个 treeitem、aria-disabled0,显示真实条目,页面「加载中…」计数 0。
遗留
- 作业缝的在线验证未做:新起的侧车作业注册表为空(作业是进程内的),
该半已做代码 / 产物 / 类型三重核对,待现场有活作业时确认。
dsh-coding-sidebar 1.0.31
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
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)。