@lynn123411/dsh-workspace-tree
v2.3.0
Published
DSH 工作区树:侧栏工作区浏览器——注册工作区按目录嵌套、无归属会话落「未分组」;安全归档区(归档有门槛、进区必可删、删除零守卫 fail-loud),附带重命名/移除/IDE 打开等管理。
Downloads
2,806
Maintainers
Readme
@lynn123411/dsh-workspace-tree
DSH 工作区树:接管左侧栏工作区浏览——三档分组(按工作区 / 工作区树 / 单一列表,默认按目录嵌套的树)、会话搜索、视图排序与会话拖拽,无归属会话落「未分组」,附带工作区重命名/移除/在 IDE 中打开、安全归档区(进了归档区就一定删得掉)、级联物理删除与会话全局重命名。归档/删除链路零守卫、fail-loud;删除墓碑以 Host 物理存在性校验权威自愈,误写墓碑不会永久隐藏存活会话。内核契约基线:DSH 0.1.6(主视图当前会话、会话导航、作用域租用与状态座位)。
特性
- 三档分组与排序(与官方一致):视图选项菜单(官方
Menu原语 + portal,不会被头部裁切)提供分组方式(按工作区平铺 / 工作区树 / 单一列表,默认工作区树)与排序方式(最近更新 / 手动,默认最近更新);排序、折叠与手选顺序按浏览器本地记忆。注册工作区在树模式下按真实路径的祖先/后代关系组织,子工作区排在自己父级的会话之前;祖先的文件夹图标按子树状态三档呈现(有会话为灰色开口文件夹、无会话为白色线框开口文件夹),蓝色高亮跟随当前会话所在的祖先链,并可在组头透传子树聚合状态点(运行 / 等待 / 已完成)。 - 会话搜索(与官方一致):头部按钮展开搜索框(框内自带关闭按钮,Escape 同样退出),标题 / 工作区名的子串命中即时列出,250ms 防抖后并入 Host 内容检索(同一入口
sessions.search,结果上限由 Host 给定)并显示片段;前一次请求随新输入中止,真实失败时保留本地命中并如实提示;部署本身没开内容检索(openAt: "never"的会话索引、或未挂载dsh-session-query)时按能力事实处理——静默降级为只做本地匹配,不提示也不重试;选中结果即打开该会话、收起搜索,并把它的行滚进视野(自动展开所在组与祖先)。 - 视图交互(与官方一致):每组默认只显示 5 条普通会话,超出部分由「展开其余 N 个会话 / 收起」控制;工作区组(含「未分组」)可折叠,折叠状态按浏览器记忆;拖拽会话即改为手动顺序(顺序按账号存:工作区 / 未分组 / 单一列表各自一份,因此树模式下别的工作区那几行不亮插入标记——官方同样不支持跨工作区拖拽),拖拽工作区在注册表里持久重排同层顺序;全局面板打开时主视图会话不再显示选中态,只随当前会话出现的空白草稿行一并隐藏。
- 未分组:不属于任何已注册工作区的会话照官方列表原样落进「未分组」区块(可折叠、同样受每组 5 条上限约束),插件不替用户注册工作区,也不改动这些会话的归属。
- 后代子代理状态透传(与官方一致):父会话自身空闲、但它的不间断 subagent 谱系里还有后代在跑时,这一行同样显示运行中,悬停提示与 Hover 卡写明「N 个子代理运行中」;从某条会话 fork 出来的独立会话不会被算作子代理。归档门槛同样认这一层——后代子代理在跑时不给归档(按钮置灰并说明原因、动作侧复查、Host 侧按持久谱系逐个后代核验),因此凡进入归档区的会话,其谱系内也必然没有任何在跑的后代。
- 添加工作区(两个入口,同一套交互):侧栏顶部的全局入口用于添加任意位置的第一个工作区;每个工作区行另有一个行内入口,选择器以该工作区目录为起始路径(只作起点,不限制越出)——macOS 的原生窗口经
osascript的default location直接开在该目录,其余环境的内置浏览对话框也以它为起始层。本机 macOS 单击直达 Finder:宿主侧osascript … choose folder弹出原生「选择文件夹」窗口(与 DSH 自带 native 前端同一条命令、同样的取消判定),窗口开在本机屏幕上,远端设备看不到,那类环境宿主报不支持、同一按钮改走内置浏览;取消不产生任何工作区、也不弹错误。选定目录后只做幂等注册(要开会话就点该工作区自己的「新建会话」)。 - 内置目录浏览:宿主不能弹 Finder 时(非 macOS、旧版宿主半边、探测失败),按钮打开插件自持的浏览对话框——面包屑 + 当前层目录列表(隐藏目录加暗淡标记)+ 绝对路径直输 + 「新建文件夹并进入」(走官方
uiWorkspace.createDirectory),底层只用官方 browse 原语;两种能力都不可用时如实报出原因。 - 隐藏式工作区管理:移除工作区 = 仅移除显示(本地记忆)——隐藏该工作区节点,注册、目录文件、会话日志与会话归属均不受影响;被隐藏工作区的归档会话仍在归档区可见可恢复;重新添加同一目录后,工作区连同其会话一起恢复显示;空工作区自动真注销——名下已无任何可见会话与归档会话的工作区,移除时直接经官方 workspace/delete RPC 注销注册表记录(同样不删磁盘目录与会话文件,注销失败自动降级为仅隐藏)。
- 会话可见性跟随官方:官方列表返回的有效会话一律可见,工作区视图显示活跃会话、归档区显示已归档会话;新建但未发送消息的空白草稿仅在当前处于打开状态时可见(显示为本地化的「新建会话」,并恒定钉在该组最前),切换到其他会话即隐藏(官方从不物理删除会话文件,本插件只在设置页按需回收空壳,见下条);subagent 来源的会话保持隐藏,从会话 fork 出来的独立会话不会被误判。
- 一键删除空壳会话:设置页「侧边栏 - 工作区树」提供「删除所有空壳会话」按钮(确认弹窗后执行)。空壳判据取官方列表投影自己的
blank——官网applySessionListMetadata对「从未产生过turn/start」的会话给出的权威标记,因此不需要(也不能)自行解析会话日志:DSH 的会话日志是多帧 zstd,Node 的 zstd 绑定只解得出首帧 header。判据不可用(sessionController缺席)时拒绝执行而不是猜。三重排除确保不会误删:运行中(列表 running 位 + Host 侧活 Agent 状态复查,挡住转发位窗口期)、正在打开(已 attach 到本进程 session store,含你正在打字的当前草稿)、子代理会话(交给父会话的级联删除)。执行复用归档删除那套 fail-loud 级联引擎(物理删除 + 子代理闭包 + 注册表/归档/projcache 剔除),删不掉的留在原地并逐条列出原因,可幂等重试;删掉的 id 记入本地墓碑,官方列表收敛前不会以「未分组会话」复现。 - 安全归档区(进区必可删):会话必须先移入归档才能执行永久删除,彻底防止日常误删;归档沿用官方
workspace/archiveSessionRPC,运行中/等待回复审批的会话不允许归档——门槛三层:行按钮置灰(提示)、动作侧读 store 活快照 + 官方会话状态座位复查(运行中 / 等待审批·计划复核·提问 一律拒绝)、以及 Host 权威复查/archive/guardCheck(官方 RPC 在 Host 侧没有运行态守卫,客户端 running 位又是转发事实、存在窗口期,故归档前问一次agents.get(sessionId).status;不可达时 fail-open 放行),空白草稿不归档。进入归档区的会话必然空闲且只读(输入栏替换为只读条),因此删除零守卫、无条件执行;删除为 fail-loud:物理删除必须全部成功才从注册表/归档剔除,真实失败(文件被锁、权限不足等)会如实报错并把会话留在归档区,可幂等重试。 - 级联物理删除与持久化墓碑(物理自愈):永久删除时自动递归级联清理其派生的全部 Subagent 子代理物理文件、注册关系及
session_projcache投影元数据缓存,杜绝磁盘与元数据孤儿残留;级联范围只认真正的 Subagent(origin === "subagent"/delegationDepth > 0),从某条会话 fork 出来的独立会话绝不会被连带删除;删除成功后会话经本地持久化墓碑在任何标签页/刷新后都不可见。墓碑自愈以物理存在性为权威判据:官方列表仍返回的墓碑会向 Host 查询会话目录是否仍在——删除成功必然使目录消失,因此「目录仍在」即会话存活、墓碑系误写(如历史版本残留),自动作废恢复显示;「目录已没了」才是收敛竞态,继续隐藏直至列表收敛。设置页另提供「清空墓碑」一键兜底。 - 归档只读阅览与就地恢复:归档区支持点击直接在主视口阅览已归档会话的历史记录,严格执行只读白名单(保留文本浏览与消息/代码复制,自动隐藏分支/重试/反馈/审批按钮并替换输入栏为只读状态条),支持就地一键恢复会话;阅览中的归档会话仍可随时删除。
- 简洁归档管理:归档区按工作区分组展示(无归属的归档会话单独成「未分组」分组),支持单条恢复/永久删除、组级恢复全部/删除全部、一键恢复所有/一键删除所有;批量删除逐条执行——能删的删掉,删不掉的留在归档区并逐条列出原因;失效归档(官方列表已不再返回的 ID)在进入归档区时自动静默清理,无提示行/按钮。
- 在 IDE 中打开工作区:在每个工作区/组头的按钮栏提供一键在外部 IDE(VS Code、CodeBuddy CN、Cursor、Windsurf、Trae、WebStorm、IDEA、PyCharm、Zed、Sublime 或自定义命令)中打开对应工作区的功能;IDE 类型限白名单(未知类型拒绝,绝对路径且存在时放行),自定义命令只读服务端设置,Windows 下含 shell 元字符的路径拒绝执行。
- 全局会话重命名:无论会话当前是否处于打开状态,均可通过 Host RPC 实时重命名;会话侧允许确认未改动的标题(与官方一致,把当前的自动标题钉成显式标题),工作区侧重名会被拦下并提示。
- 活动定时任务标记(与官方一致):会话行的列表投影值里 schedule 非空时,标题后显示闹钟标记(带 tooltip 与 aria 标签,本身不是按钮,点击照旧打开会话)。
- Hover 卡(与官方一致):工作区行与会话行悬停显示卡片——工作区卡列出标题、完整目录与创建时间并可一键复制路径,会话卡列出标题、「多久之前」与每条状态文案并可一键复制标题(空白草稿卡只读)。
- 状态点与相对时间走官方原语:状态点直接用
ui-primitives的StateDot(五档语义),行尾相对时间分档走官方relativeTime,弹窗与目录对话框的骨架走官方Modal,会话恢复走官方workspaces.unarchiveSession——同一能力不再各写一份。 - 悬停标题滚动(与官方一致):会话行与归档行的标题被省略号截断时,鼠标悬停即平滑滚到末尾露出尾部,离开时一步归位;
prefers-reduced-motion下两次移动都直接跳转。 - 配置自由:在「设置 - 侧边栏 - 工作区树」中配置是否启用(关闭后回退官方工作区浏览器,注册级、刷新页面生效)、默认打开的 IDE 或自定义启动命令,并提供「清空墓碑」与「删除所有空壳会话」兜底入口;配置经 DSH 设置服务持久化到
~/.dsh/settings.yaml,重启/换端口不丢失。「侧边栏」设置页与dsh-mattpocock-skills-deck共用(先加载者当选页面宿主,参与者可增删;机制见仓库docs/rules/shared-settings-page.md)。 - 主题完美适配:全面接入 DSH 设计系统(
--dsh-*/--dsw-*变量),完美自适应浅色与深色主题。
安装
dsh plugin --profile web add @lynn123411/dsh-workspace-tree