dsh-compass 已发布,右侧文件夹面板和只读 git tree #1989
Replies: 13 comments 2 replies
|
Right-side context file panel is a solid gap - the conversation column gets claustrophobic without a files/git sidecar. Added dsh-compass to the dsh-subscribe registry (554 plugins) for discovery: github:Happy2Git/dsh-compass. Two quick suggestions from the UI-plugin side:
Happy to cross-link from the ecosystem map once you have a release tag. |
|
这个面板第一天是在官方仓库里直接改的,其实很顺手。dsh 的架构本身就是插件式,每块功能都是独立的包,当时觉得"一切皆插件"嘛,发布的时候拆出去还不简单。结果今天真到发布,发现完全不是那么回事,光解耦就花了一整天。 难在哪。面板待在仓库内部的时候,读目录借的是仓库里的目录服务,读文件借的是仓库里的读取接口,类型、构建、测试全都长在大仓库身上。想把它单独发出去,这些依赖要么自己带,要么砍掉,每一个都要动手。 今天做的事就是拆。目录读取改由包自己读文件系统,不再依赖仓库内部的目录服务;git 后端、面板本体合成一个包;构建改成纯转译,clone 下来就能编译;再一个个验证安装、路由、界面,拆完才敢发。 所以经验就一条,在仓库里是插件,和能独立发出去,是两回事。新功能从第一天起就要按独立可发布的标准写,别等发布那天再解耦。 还有个开发体验上的感受。写插件的热插拔不算丝滑,改完代码经常要重新构建、重启服务、刷新页面才看得到效果,后端侧的改动每次都要重启服务。开发这两天,不少时间花在这来回上。 上面这段是我自己的经历。下面几条技术经验,是这次写代码的 agent 根据对话记录自己总结的,贴在这里给做同类插件的人参考。 第一,插件的能力要自带传输。面板的目录和 git 都走插件自己的路由,不碰核心 API 网关。网关是 web、终端、SDK 所有入口共用的,一个界面的私有功能不该长在里面。 第二,宿主路由能读任意本地路径,安全上我们凑了六件事。只许本机访问,只收类型正确的 JSON,请求体限 64 KiB,路径必须写全,git 输出按字节截断,客户端断开就停掉子进程。 第三,发布前多翻上游 master。槽位系统、会话接口大部分都在上游,fork 独有的只有 readText 这类小原语。把缺的能力写进包内,面板就能装到任何带槽位系统的构建上,上游下一次发布以后直接装主线。 第四,git 安装装的是源码,包的 prepare 脚本必须纯转译自包含,不碰类型检查,也不依赖开发仓库的结构。pnpm 10 以上首次还要放行一次构建脚本。 第五,发布走 GitHub-only 的 git spec,一条命令装完,不用上 npm,也不占 @deepseek-ai 的命名空间。 |
|
Git 功能这块单独贴一张图,顺便说下它是怎么做的。 Git 标签画的是只读提交图。每个分支一条泳道,合并回到主干,HEAD 和标签名都有徽章,点击提交展开这次改动过的文件。 后端没有用 git 库,直接跑系统的 git 命令,两条就够。列表一条, 两个参数值得说。 边界也做了。提交页最多 100 条,单个提交的文件最多 500 个,git 输出按 256 KiB 截断,截断了就直接报错,不返回半截解析结果。路由是插件自己的,只允许本机访问。 |
|
右侧文件夹面板 + 只读 git tree——两天写出来效率可以,文件树 + git 状态一屏看完很实用。 已收录进手册生态章节:https://github.com/Electricitysheep/dsh-handbook/blob/main/docs/07-ecosystem.md |
|
dsh-compass 发布之后又走了十几个版本,现在停在 v0.11.3。挑几件和这个帖子主题直接相关的新东西记在这里。 文件树现在带 git 状态徽章,未跟踪、已修改、被忽略的文件一眼能分开。文件行可以拖进对话,视觉模型直接把图片内容附加进消息,其他模型收到路径说明,由 agent 用自己的工具处理,不在工作区复制任何文件。git 板块加了和工作区区块同款的外框与标题,工作区里的文件行点开就是该文件的 diff,提交内文件同样可点。diff 预览按行着色,只染文字不染底色。 上下文标签改动最大。它跟着会话事件流实时更新,新注入的文档自己出现,并且能拿到完整历史。宿主侧新增了 /dir/injected-docs 路由,在服务端把持久化日志过滤一遍,只把注入文档相关的事件发给浏览器。这个改动来自一次实测,在 18 万事件的会话上,历史 RPC 一页 50 条消息的响应有 6 到 7 MB,旧方案一次激活要解码约 120 MB,过滤后一次请求只有 KB 级。文档流也做了签名门控,面板只在文档真正变化时重渲染,不再跟着每个流式批次抖动。 过程里踩过两个坑,一并记下。中间有一版自动遍历直接翻共享的会话窗口,把聊天视图自己的「加载更早」消耗掉了,还干扰了滚动锚点,后来改成面板走自己的路由取数据,不碰共享窗口。另外,插件新增宿主侧路由之后要重启 dsh web,只刷新页面换不到新路由。 范围仍然克制,面板只读,提交、暂存、推送这些写操作继续留给 agent。全部版本的发布记录在 https://github.com/Happy2Git/dsh-compass/releases 。 |
|
README 和截图都刷新过了,对应当前 v0.12.0。六张图由仓库里的截图脚本在真实封闭脚手架中自动生成,功能再变重跑一条命令就能重新生成,发布记录见 https://github.com/Happy2Git/dsh-compass/releases/tag/v0.12.0 。 Git 板块,工作区区块与提交树都带外框,工作区文件行点开就是 diff,diff 只染文字色。 上下文板块,当前有效与历史流水都按时间倒序,历史流水自动拿到完整历史。 文件夹板块带 git 状态徽章,文件行可拖进对话,视觉模型直接收图。 README 新增了安全与性能两节。安全上,所有宿主路由仅限回环,请求体 64 KiB 上限,路径必须完全限定,读取失败即关闭,git 只读,图片从不复制进工作区。性能上,文档流做了签名门控,面板只在文档真正变化时重渲染;完整历史走 /dir/injected-docs 在服务端过滤,在 18 万事件的会话上把每次激活约 120 MB 的历史页 JSON 换成单次 KB 级响应。 |
|
@zoahdev @Electricitysheep @leenkcool @lz425-code 上面两条评论把发布后的更新整理了一遍,六张新截图和安全、性能的实测数据都在里面。 顺带把你们几位之前提到的事回一下。zoahdev 说的面板状态持久化已经做了,面板宽度、展开收起、激活标签页都会跨刷新保留,这条修好之后还顺手改了持久化重放的合并方式,旧版本地存储升级时面板不会再消失。Electricitysheep 收录的手册条目如果方便,可以用新截图换掉旧的。leenkcool 指的那个收录入口我们看到了,后面单独整理提交。 lz425-code 你在 issue #1938 里提的问题,如果有和面板相关的部分,欢迎把链接贴过来继续说。 |
|
v0.13.0 发布,这次更新只为一件事:官方主线打通。从官方仓库 master 源码构建的 dsh,现在可以直接装 compass,面板可用,不再需要 fork。 实测路径:上游 master(钉 47f9438)干净构建, 期间修了三个实际问题,都值得记下来:
一条安装提示:pnpm ≥10 的 allowBuilds 键要用它打印的完整 40 位 commit sha,短 sha 会被再次拦下。全部变更见 https://github.com/Happy2Git/dsh-compass/releases/tag/v0.13.0 。 @leenkcool 1728 那边的收录指引看到了,这就向 Blue-Whale-Harness 提 PR,谢谢整理。 |
|
跟进一下 v0.13 之后的更新,两个版本加一个修复,都已在官方 master 源码构建上实测。 v0.14 —— 上下文标签从被动面板变成事件驱动入口。 标签头新增占用条:按实测 UTF-8 字节分「当前有效 / 已压缩」两行,按来源五类着色(指令文件 / 技能注入 / 插件注入 / 跨会话召回 / 运行时注入),不做 token 估算冒充真值。每篇文档带来源标注与实测大小,历史流水头部注明最近一次压缩移出的篇数与体量(12 小时会话实测:当前有效 5 篇 · 46.6 KiB,已压缩 27 篇 · 367.2 KiB)。不在上下文标签时,新注入和压缩边界移动会在「上下文」标签页上挂未读计数徽标,打开即清零,面板折叠时显示圆点——注入、压缩这些事件本身成为入口,不用等用户巡检面板。 v0.15 —— 文件夹标签的目录行有了 git 状态。 之前只有文件行带字母徽章(A/M/D/U/!),目录行只有整目录被忽略时才显示 !。现在目录行聚合其下最强的状态:src 里改了一个文件就显示描边的 M(目录内含修改),含未跟踪显示 U,含删除显示 D,聚合优先级 M > A > D > U > !。同一份 porcelain 输出折叠出聚合,零额外 git 调用。顺带修了一个让徽章整体消失的边界 bug: 一个修复 —— 对话区随面板宽度联动。 抽包时丢了一段关键 CSS:变量发布了但没人消费,上游宿主上面板只是悬浮盖在对话区右侧,拖宽面板中间不动。已补回(针对对话列根节点的稳定 另外,@leenkcool 1728 收录帖那边的 PR(Happy2Git/Blue-Whale-Harness#35)还在审查中,等收录。 全部代码都在 https://github.com/Happy2Git/dsh-compass (main 最新 = 5c47b11),安装方式不变。 |
|
状态持久化做得干净——宽度/折叠/激活标签跨刷新保留,比当初提的 fold-vs-close 分离更进一步。 注册表这边已收录:dsh-subscribe registry(554 插件)里可以直接搜到 dsh-compass。如果需要发布前体检, |
|
一条理念向的分享:dsh-compass 的上下文标签,本质是给 Agent 的"思维透明"加了一个观测窗口——你的模型每一步实际收到了什么,现在可以亲眼看到。 轨迹板块展示的是"Agent 做了什么"(行为投影);上下文标签展示的是"Agent 此刻知道什么"(状态投影)。两者读的是同一份持久日志,一个事件日志、两个投影——行为有出处,知识也该有出处。对长会话排障("它怎么忘了 X")来说,后者往往更直接。 具体能看到的:
安装与用法不变: |
|
接着上一条透明化,补一个角度:上下文注入的透明化,本身就是安全能力。 注入是 Agent 的"隐形输入"——模型被什么影响,通常只有日志知道。compass 把每一份注入文档的来源、路径、大小、时间摊开之后:
一句话:看不见的输入才危险,看得见的输入可以审计。 |







Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
这个面板写了两天,今天刚发布到 GitHub。仓库在 Happy2Git/dsh-compass,先给这里的社区看一眼。
dsh-compass 是一个单包插件,装进 web profile 以后,对话区右侧多出一块固定面板,和左侧边栏对称。面板里有三个标签。
文件夹标签是一棵惰性目录树。列目录时目录排前面,文件排后面,两组各自按名字排序,指向目录的符号链接算目录。点击文件行直接在中部弹出预览,支持 Markdown 渲染和普通文本,256 KiB 以上的文件截断显示。每行都能复制路径,也能用系统默认应用打开。
Git 标签画只读提交图,参照了 vibe-ide 的 GitGraph。泳道按分支排,合并回到主干,HEAD 和标签都有徽章。点击提交懒加载改动文件,新增、修改、删除三种状态,行数变化也一起显示。
上下文标签列出本次会话注入的上下文文档,指令文件和运行时注入分开标记,支持往前翻更早的页面。面板头部还有会话日志下载,导出一个 ZIP。
安装走官方插件通道,一条命令。git 安装会触发包的 prepare 构建,首次需要按提示放行一次。
有一点要说清楚。面板依赖槽位系统,这套系统已经在当前 master 里,但最后一次 npm 发布早于它。所以在下一个版本发布以前,只能装到从 master 构建的 dsh 上,或者装到我们维护的 fork 上。fork 的默认 web profile 已经内置了这套面板,想用插件版本的话,把内置四行在 profile 补丁里禁用即可,README 里有完整说明。
我们把面板和它依赖的能力面一起开源了,git 能力、目录路由、面板本体都写在包内,不碰核心网关。欢迎试用,有什么想法直接在仓库提 issue。
All reactions