Repository navigation
Releases
1.8.4:侧栏会话菜单「删除会话」(官方只有归档,这一版真正删到底)
本版加了一条真正删除会话的入口:侧栏会话的「⋯」菜单里多一行红色「删除会话」(菜单最末)。
官方只有归档 —— 归档只把一个 id 记进归档集合,磁盘上的会话日志与投影缓存永远不会删除;
这一版补的就是那个缺口。
新增
- 侧栏会话菜单的「删除会话」(order 901,
danger: true走官方错误色,排在菜单最末)。
点击先弹确认框,写清「永久删除 / 不可撤销」,并列出会话标题与序列号,避免删错行。 - 确认框挂在
shell.overlay,不在菜单行里:菜单一关菜单项就卸载,弹窗若渲染在菜单行内
会刚出现就被销毁(这正是"点了没反应"的成因)。官方归档与改名也是"菜单行发请求、
shell.overlay常驻组件收请求"这个结构。 - 删除做到底:摘归档、摘置顶、从每个工作区的记账里 detach、删投影缓存行、
删磁盘上的会话日志目录,最后广播api-session/removed让列表行立即消失。
说明与边界
- 只删日志目录本身(
…/session-<id>/),父目录是按工作区编码的、别的会话共用,一律不碰。 - 正在运行的会话拒绝删除(409),并如实说明原因。官方归档有一个"停止并归档"档位,
本插件故意不用:删除的语义是"删掉一条已经结束的记录"。 - 找不到日志路径就报失败(501),不谎报成功。路径只从
sessionPersistence.locate()取
(它内部做路径段编码),不做目录扫描 —— 扫描在找不到时会静默跳过。 - 删完不可撤销:没有回收站暂存。要留后路请先用「导出会话日志」把 ZIP 存下来。
功能审计与整改
发布前对删除会话做了一次功能审计,发现并修复三条已在真实代码上复现过的缺陷,
各补回归守卫:
- AUD-001|失败时留下半完成状态:
locateSessionLog()把异常吞成null,而调用方
已摘了归档、置顶与工作区记账,随后返回 501 说"什么都没删"。实测副作用为
["unarchive","unpin","detach"]—— 用户看到"删除失败",刷新后却发现会话从归档里消失。
整改:所有可能失败的定位都排在任何写之前。 - AUD-002|
rm(force)对不存在路径静默成功:日志目录不存在时原实现仍返回ok:true
并广播移除 —— 界面行消失、磁盘文件还在。整改:删前确认目录在、删后 stat 复核;
只有文件确实不在了才广播移除。 - AUD-003|重复安装会让功能彻底无反应:
installDeleteSession()每次新建 store,而注册表
因重复 id 跳过注册 —— 已挂载的确认框订阅旧 store、菜单行写进新 store,两边裂开。
整改:store 只建一次。
顺带修掉:menuPrimitives() 结果缓存(原来每次渲染都 require)、确认框判定补 Button、
删除失败提示改按状态码给本地文案(原来把宿主英文 message 拼进中文界面)。
工程
- 宿主新增认证路由
POST /api/sym.session-delete(SESSION_DELETE_ROUTE,两端各一份常量,
契约测试守卫)。官方session命名空间没有删除能力(21 个方法逐个核过),
客户端又加不了新 Remote,所以只能走宿主自建的同源路由 —— 与sym.git是同一种既有通道。 - 该路由要求
application/json请求体:跨站表单发不出这个类型(会触发预检),
这一条就是 CSRF 闸门,不必另立令牌。 - 新增 10 条回归:id 形状闸门挡路径穿越、live 会话零副作用拒绝、
locate不可用给 501、
真实临时目录被删且父目录保留、路由 405/415/400、两端路由常量一致、菜单行危险色与确认框
两半结构、以及 AUD-001/002/003 的三条守卫。回归总数 162 条全过。 - README 重写:功能表补到 10 项(原缺 Git 状态、提交记录、删除/导出),补上
file://挂载的
两条陷阱与"桌面版没有刷新快捷键"这条限制,测试条目数也更正为 162 条 / 四个文件。
安装
# 从 GitHub(推荐)
dsh plugin --profile desktop add github:seeseeczl/dsh-sym
# 或本 Release 附件的 tarball
dsh plugin --profile desktop add ./dsh-sym-1.8.4.tgz装完 Cmd+Q 完全退出 再打开(宿主插件在启动时装配)。
完整说明见 CHANGELOG.md。
1.8.3:对话视图第三个标签改为提交记录(列表 + 重置 + 回滚 + 中止)
本版把对话视图环里的「工作区」标签改造成「提交记录」:列出当前分支的提交,
并能重置到某笔提交、回滚某笔提交、中止半途的回滚。
新增
- 提交记录列表(
conversation.view的 third tab,order 20):四列 grid ——
提交说明、提交哈希、提交时间、操作位。当前 HEAD 带「当前」标记;时间同一年只写
MM-DD HH:mm、跨年才给完整日期,都是等宽数字。分页加载,首屏 50 条,hasMore由宿主
多读一条判断。不是 git 仓库时给一句说明,不显示空表;顶部条显示「分支 · 仓库名 · 条数」,
这样列表为空时也能看出读的是哪个目录。宽度取官方--dsh-chat-content-width并居中,
内容左缘与对话正文对齐。 - 哈希可一键复制:提交哈希右侧的复制按钮复制完整 40 位哈希(不是显示的短号),
成功后图标短暂变对勾;失败只记降级日志,不假装成功。 - 三个行内操作,各带一次确认:
- 重置到此处 →
reset --mixed,分支退回、改动全留在工作区,黄色(不丢东西); - 回滚到此处 →
reset --hard,丢弃此后提交与未提交改动,红色; - 回滚此次提交 →
revert --no-edit,生成反向提交、历史不改写,红色。
确认框写清「做了什么 / 效果 / 能不能撤销、会不会推送」,破坏性那条还会说出具体会丢
几个已跟踪文件的改动(--hard不删未跟踪文件,所以那些不计)。
- 重置到此处 →
- 中止回滚:冲突后 git 停在半个回滚里,界面给出「中止这次回滚」,不必回命令行。
刷新页面后该入口仍在(状态随列表载荷一起下发)。 - 交互与无障碍:悬停/聚焦即显示说明(不用原生
title,它要停顿约 1 秒);
确认框把焦点圈在弹窗内,Tab 不会跑到背后的表格里,关闭后焦点还给触发按钮。
修复(都是开发期真机踩到、并已加回归守卫的)
git log的记录分隔是<NUL><换行>:%x00之后 git 会另起一行,所以按 NUL 切出来
的每段都带一个前导换行。第一版没剥掉 →%H校验把每个提交都判成坏行 →
界面表现是"列表永远为空"且不报错。- 回滚冲突留下的是
REVERT_HEAD,不是CHERRY_PICK_HEAD:第一版只查后者,
"已有未完成的回滚"这层保护完全失效,之后每次回滚都被 git 以 "you have unmerged files"
拒绝,而界面上没有任何中止入口。 - 确认框弹在视口外:它复用了下拉菜单的
.dshSym_menu(position:fixed却没有
left/top),而节点是 portal 到body末尾的 ——fixed+auto会停在"静态位置",
于是落在看不见的地方,用户看到的是"按钮点了没反应"。现改为屏幕居中,并按官方
update-dialog.css的形制重做(圆角 24、内距 22/24/24、标题 16·500、按钮 44 高竖排),
背景改实色(不再半透明)、加 50% 遮罩。
内部
- 宿主新增
parseGitLog/log/reset/revert/revertState/abortRevert;
认证路由GET|POST /api/sym.git扩展kind=log与action: reset|revert|revert-abort
(action缺失仍是 CR-0002 的切分支,回归有守卫)。 reset的mode是封闭枚举soft / mixed / keep / hard,枚举外一律在跑 git 之前拒绝;
hard是本插件第一个会丢工作的写操作,闸是危险色 + 破坏性确认 + 损失量化,仍只走
argv(reset --hard <完整哈希> --)且不推送。- 客户端新增
describeCommitLog/formatCommitTime/sessionIdOf/CommitLogView。 - 视图正文不投影
sessionId,会话 id 从官方[data-conversation-session]祖先读 ——
按祖先收窄,多实例安全。 - 治理:CR-0007(proposal / design / tasks / spec)、
.project-architect.json的契约与
LOC 阈值(M-HOST 1800→2100、M-CLIENT 3800→4150)、AGENTS.md接口契约段。
dsh-sym 1.8.1
[1.8.1] - 2026-10-16
本版把版本号规则写进项目与 DSH 用户级指令,并把它变成可执行校验;顺带修掉几处
"文档与事实不符"——包括一条与实现不符的已发布说明。
本版是第一条按新规则发布的版本:1.8.0 → 1.8.1(只动第三段)。
新增
- 版本号规则(用户 2026-10-16 定):三段、每段最多两位数字;每次更新只在第三段 +1
(+0.0.1),满 99 才进位,到99.99.99封顶。正典在CHANGELOG.md顶部「发布规则」,
AGENTS.md与PUBLISHING.md只做摘要与引用。本规则不遵循语义化版本。 - 可执行校验(
npm run check第 4 条不变量):校验package.json与所有版本 tag 的格式,
并要求 version 只能是「当前最新 tag」或「它的下一个版本」——顺手写成 1.9.0 会被拦下,
并提示应写 1.8.1。实现是纯函数scripts/version-rule.mjs(零依赖),单测 6 个用例,
覆盖进位边界(1.8.9→1.8.10不进位、1.8.99→1.9.0、1.99.99→2.0.0、封顶)、前导零、
以及v1.8.100这类「像版本号但违规」的 tag 不被静默跳过。 - DSH 用户级指令存档:规则同时写进本机
~/.dsh/AGENTS.md(对本机所有项目生效)。
该文件在版本控制之外,换机/重装即丢,所以仓库存一份逐字节副本
docs/dsh-user-agents.md,由npm run check第 5 条不变量守卫一致性。
修复
- README 与实现不符:读数排示例漏了「上下文压缩」这一格;「共生体设置 → 显示项」
写的是三个开关,实际是四个(多了上下文压缩)。 PUBLISHING.md的手动挂载示例用了错的 insert id(session-cost):应与包内
cordis.patch.yml一致,都是sym-cost。写错会让两条条目同时提供dsh-sym,
客户端的模块图按包名去重、只发出其中一份 —— 表现是宿主新、客户端旧,且不报错。- **
PUBLISHING.md的「这正是本机当前使用的形态」**已不成立(本机现在是 tarball 安装)。 - 文档里的硬编码数字与版本号(
19 个文件/约 240 KB/dsh-sym-1.5.0.tgz)会随版本腐坏,
改成<版本>占位与「跑npm run check:pack看真实值」。 AGENTS.md的环境事实停在 2026-10-09(github:依赖 +sym-dev挂载工作副本),
与实机不符:现在是本地 tarball 依赖,profile patch 里一条 sym 条目都没有。
更正(按本文件规则,已发布条目不改写)
- 1.8.0 的条目描述与实现不符:它把上下文压缩读数写成「压缩 N 次 · 丢失 X」,并说没压过时
显示「尚未压缩过上下文」。实现不是这样 —— 正文只有「压缩 N 次」(没压过就是「压缩 0 次」,
因为 0 是真实读数、不是缺数据,所以不隐藏),丢失的 token 量只在悬停里给。 - 1.7.0 从未作为独立提交存在:它的全部内容(侧栏会话菜单的复制会话 ID / 导出日志)是在
eeb4121这一个提交里落地的,仓库里没有属于 1.7.0 的提交,因此没有v1.7.0tag、
也补不出忠实的 release。其条目保留为历史记录,不追溯改写。
内部
- 不变量 3 → 5 条,回归 104 → 110 项。
M-CLIENT本版未改动(硬上限只剩 51 行余量,本版不需要动它)。
dsh-sym 1.8.0
[1.8.0] - 2026-10-14
本版新增上下文压缩统计读数,并把项目里三条"违反了也不报错"的约定变成可执行校验。
另修正一处过时的环境记载。
新增
- 上下文压缩统计:输入框下方读数排的最后一格(内存之后、上下文表之前),显示
「压缩 N 次 · 丢失 X」;尚未压缩时显示「尚未压缩过上下文」。压缩次数是信息丢失程度的
直接指标 —— 压得越频繁,早期上下文就只剩摘要。compact(历史换摘要)与 prune(剪掉
工具结果)都计入,悬停可看两者各自的次数。
实现上新增宿主投影contextLoss(CR-0004):compaction/*是会话事件、客户端拿不到,
所以由宿主折叠成计数与被压掉的 token 数(不存摘要文本)。
只有compaction/summary与compaction/prune计数 ——start/end不算,
否则失败或取消的压缩会被误记成"压缩成功过"。
修复
- 导出会话日志失败会被显示成成功(对抗性审计 AA-UX-001):原实现直接触发下载就报
「正在导出…」,于是 401/404/500 全都看起来成功。现按官方同款流程先HEAD预检,
只有 2xx 才交给浏览器下载;失败时菜单行显示失败并保持打开。 - 导出的状态反馈从不生效(AA-BE-001):
setState排在关闭菜单之后,而关菜单会卸载该行,
于是「正在导出…」永远不会出现。已调整为与「复制会话 ID」一致的顺序。 - 同一会话连点会重复触发宿主的 ZIP 构建(AA-BE-002):新增在飞折叠,连点复用同一次导出。
- 移除死字段
lastFailed(AA-CODE-001):宿主算了、投影发了,客户端从不使用。
已从折叠、投影、公开契约、字段守卫与验收脚本中一并删除。
内部
- 三条不变量的可执行校验(
npm run check):跨端常量一致性、工作副本与 profile 包副本
一致性、投影wire.view的字段形状。这三处违反了都不报错,只表现为"界面上没出现"。
校验脚本在本次整改中真实拦截了两次漏同步包副本。 - 发布产物核对(
npm run check:pack):核files白名单、exports入口可加载、
包内 patch 不含file://绝对路径。 - 上下文损耗读数的落地验收(
npm run verify:loss):按唯一可靠判据(投影缓存里有没有
那个 key)确认宿主是否真的重新装配,并把结论写成可操作的两步指引。 - 渲染冒烟断言从 3 个组件扩到 8 个(测试总数 97 → 101)。
- 客户端就地压缩 3594 → 3530 行(无行为变更)。
修正
AGENTS.md曾记载"project-architect等技能的附件不存在,照方法论人工执行、不要跑校验
脚本" —— 该记载已过时。附件齐全(15 个脚本、7 份 references、模板),本版补齐了
实际用法与两个踩过的坑(FM/FE 的 ID 必须是哈希格式、报告表格里不要加粗)。
dsh-sym 1.6.0
[1.6.0] - 2026-10-09
本版新增会话头部的 Git 状态胶囊:一眼看到当前分支与工作区改动,并且点分支名就能切分支。
开发期短暂存在过的「创建 PR」入口在同一天撤回。
新增
- Git 状态胶囊:会话头部常驻显示当前分支与工作区相对
HEAD的改动规模(+N −M、未跟踪数),
悬停给出仓库路径与上游领先/落后。数据来自宿主新增的认证路由GET /api/sym.git(只读 git)。 - 点分支名切换本地分支:本地分支数 > 1 时分支名可点,选中即在该会话的工作目录执行
git switch(宿主新增POST /api/sym.git)。分支名先与本地分支白名单比对,再以 argv 传参、
用--终止选项;不用-f/--discard-changes/stash/reset,git 拒绝时原样回显
且工作区保持不变。没有git switch的旧 git(< 2.23)自动回退到git checkout <分支名>。
修改
- 读数跟得上界面:轮询 5s → 2s;宿主侧四次 git 询问改成一轮并行,仓库根路径按目录只读一次、
分支清单 4s 内复用,单次读数从 ~160ms 降到 ~40ms(实测);首次失败按 400/900/1800ms 快速重试,
不再白等一个轮询周期;智能体一轮结束时立刻重读(此时通常刚改完文件)。 - 胶囊在头部右簇里排到官方
open-in-app/schedule-catalog/session-log-download之前
(order: -20)—— 这一行行宽不足时最右的条目最先被裁,排最后会先消失。窄宽度下按容器宽度
逐级收起:未跟踪数 → 增删行数 → 分支名(只留图标)。 - 「创建 PR」入口撤回:所有者一个人在主干预、改完直接推,没有审查环节;宿主端连
git remote get-url origin那一步也一并删除(每次轮询少起一个 git 子进程)。
修复
- 余额 tooltip 一直缺
balanceLoading文案,读不到余额时会直接把键名显示给用户
(补词典齐平守卫时发现)。 - 分支切换的写操作不再复用浏览器请求的
signal:页面刷新或断连不会打断已经开始的git switch。 - 切换期间恰好在飞的那次读,不会再把它之前的旧分支写回读数缓存。
- 分支菜单里的失败理由不再截断在半句冒号上,会带上挡路的文件。
- POST 也能从查询串取
sessionId(此前只认 body,手写请求容易踩空)。
dsh-sym 1.5.0
[1.5.0] - 2026-10-05
本版把「官方命令」加回竖条快捷按钮(走官方 / 菜单自己的 pick 通道,效果与从菜单里选
同一条命令一致),并让三类按钮在竖条与设置页里都按类分组、组内排序。
新增
- 快捷按钮条加回「官方命令」类型:目标 / 计划 / 压缩上下文三条内置命令回到默认清单。
点一下的效果与从输入框左下角+菜单里选中同一条命令完全一致 ——
有参数的命令(目标、计划)落成蓝色命令 chip 并提示输入参数,没有参数的命令(压缩上下文、
权限等)点一下直接执行。
做法是把这次选择交回官方:调用官方/菜单自己的 pick 决策表(commandUi.dispatch),
再把拿到的 claim 按官方菜单点击的同一条路径交给会话输入框,所以 chip 与提示都是官方那一份。
通道走不通时自动降级(有参数命令填草稿、无参数命令走宿主命令通道),不会"点了没反应"。 - 竖条按三类分组:官方命令 / 技能 / 提示词,组间有分割线;图标统一用中性的次级文字色
(浅色 5.50:1 / 深色 8.62:1,19.8px 图标内部标准 4.5:1)。分组表达靠位置与分割线,不靠颜色。 - 已有的按钮配置会自动补回三条官方命令:只在"一个官方命令都没有、且没补过"时补一次,
补在最前;之后你手动删掉不会被再次加回来。 - 设置页按三类分区:每类一个小标题,↑ ↓ 只在本组内移动,改类型自动归到新组。
- 竖条按钮点击后不再变色:执行反馈原来是"成功闪绿、没生效闪红"(2 秒),现在一律保持
中性色,点击态只剩悬停底色。data-state仍写在 DOM 上(自动化验证与调试要用),只是
不再有视觉表现。键盘 Tab 聚焦时的焦点环保留 —— 那是无障碍要求,鼠标点击不会触发它。
变更
- 设置页「名称」列压窄三分之一(150 → 100px),省下的宽度全部归「内容」输入框 ——
它是那一行里唯一的弹性列(flex:1),所以行宽不变、名称仍放得下最长项(如「压缩上下文」),
提示词多露出约 4 个汉字(原来被截断的那条现在能完整显示)。类型下拉与 ↑↓✕ 的宽度不变。 - 竖条图标放大 10%,图标间距同步放大 10%:图标 18 → 19.8px,组内与组间间距 4 → 4.4px;
胶囊外框(宽度、内边距、圆角)与按钮热区(30×30)保持不变。实测图标墨迹 12 → 13px、
整列跨度 207 → 212px。
修复
- 竖条提示词按钮的图标色原本用
--dsw-alias-label-tertiary,浅色主题下对竖条底色实测
只有 2.03:1(低于 3:1 的控件底线,更低于小图标的 4.5:1);现在统一用
--dsw-alias-label-secondary,浅色 5.50:1、深色 8.62:1。 lib/client.js的图标集改为一行一枚(105 枚,净省 308 行),把模块从超限的 3246 行
拉回 2974 行(项目硬上限 3000)。
dsh-sym 1.4.0
[1.4.0] - 2026-10-04
本版全部来自一次四角色(视觉/交互/动效/产品)设计审计:把界面读数层按
"可读、认得出、说得通"重排了一遍。审计报告与优化计划书见 docs/05-audits/2026-10-04-222628-*。
修复
- 峰谷标记在浅色主题下等于不存在:它原是"语义绿字 + 同色描边",实测对底色只有
1.4–1.9:1(AA 正文地板 4.5:1,连图形的 3:1 都不到),8× 放大下只剩一团绿影。
改为文字用--dsw-alias-label-primary、语义绿退成淡底 + 描边——时段语义保留,
可读性不再由颜色承担。复测 13.67:1。 - 状态栏两格读数比同一行的官方读数还浅:两格原用
--dsw-alias-label-tertiary,
实测 3.96:1(官方 "12 轮 198 步" 为 4.14:1)。改用--dsw-alias-label-secondary,
复测 5.71:1(计费)/ 6.98:1(内存)。余额格同族、同样不达标(3.86:1),一并改。 - 计费面板两处文字跌破地板:分组标题 3.45:1、强调蓝字 3.8–4.2:1。
标题与次级行改用label-secondary;蓝字用
color-mix(in srgb, var(--dsw-alias-state-business-primary) 68%, var(--dsw-alias-label-primary))
往 label-primary 方向加深(主题自适应,不会像旧版那样在浅色下退成脏灰)。
复测蓝字 5.5–6.2:1。 - 面板展开时两格同时点亮:激活态选择器原先命中整个读数容器,连并没有被点击的
内存格一起变底色;而从状态栏恰恰看不出是哪一格打开的。现在用:not(.dshSym_mem)
收窄到计费格;内存格也不再显示那个"并非按钮"的悬停底。 - 「保存」按钮是蓝底黑字:
.dshQuickSet_save把--dsw-alias-label-primary
(浅色下即近黑)写在品牌蓝的实心按钮上,实测 4.78:1,且与同一个设置弹窗里官方
「充值」按钮(黑底白字 18.90:1)是两种"主按钮"。改为官方实心按钮配方
--dsw-alias-button-primary-fill+--dsw-alias-label-primary-foreground
(该配方在官方 bundle 里有四处一致写法:.primary/.B10aXW_primary/
._6fYtdq_primaryButton/.kbRY4W_chipActive),复测 18.90:1,与官方同色。- 注意不能只把文字改白:白字压原来那个蓝只有 4.23:1,会真的跌破地板。
- 两个令牌成对回退:都缺席时退回原来的"蓝底黑字"(仍可读),不会退成黑底黑字。
变更
- 设置里的「共生体设置」改名「读数与快捷按钮」,并在页内标题下补一行说明保留内部名。
原因:官方navIcon(id)只认account/models/agent-presets/plugins/
archived-sessions五个内置 id,其余一律回退成齿轮,而settings.section的注册项
只有id / order / label——没有 icon。所以任何第三方插件的设置页都会拿到同一个齿轮,
图标改不了,只能靠文字区分(用户"想看界面读数开关"时才找得到)。
文档
dsh-sym 1.3.1
[1.3.1] - 2026-10-02
修复
- 新会话第一个任务进行中,整行读数不再消失:
CostPill原先在!(view.requests > 0)时
整格return null,而宿主只在assistant/message(一次调用结算、带usage)时才累加
请求数与 token 桶 —— 于是新会话第一轮在结算之前,连内存读数都一起消失,看起来像整个
读数坏了。现在只把「花费」这一半置空,内存读数独立判断、照常显示;没有花费数据时也不再
给它套可点击的账单面板包装(内存本来就是不可点的普通读数)。- 金额在进行中仍然不会出现,这是数据层面的必然:
assistant/chunk的分片里没有 usage
字段,官方tokenUsage投影同样只认assistant/message/assistant/attempt。 - 也不用输出 delta 估算:本会话实测 cacheHit 占 token 的 99.3%、output 仅 0.55%,
估算出来的金额只有真实值的零头。
- 金额在进行中仍然不会出现,这是数据层面的必然:
CostPill的条件 hook:useDisplayOptions()原排在return null之后,第一轮从
「未结算」走到「已结算」时 hook 数量会从 2 变 4,属条件 hook 违规。已提到所有 return 之前。- 竖条在浅色主题下的底色:背景原为
color-mix(in srgb, var(--dsw-specific-menu) 82%, black)
(当初为深色主题「压暗 18%」而写),浅色主题下会把近白的菜单底压成脏灰。改为官方弹层配方:
background: var(--dsw-specific-menu)+--dsw-elevation-stroke-color: var(--dsw-alias-border-l1)
—— 浅色下靠那圈描边定边界,而不是靠压暗。
dsh-sym 1.3.0
[1.3.0] - 2026-10-01
变更
- 账户余额改挂输入框工具行:注册点从
conversation.session.header.utilities移到
conversation.input.right—— 它与模型选择器同在官方的standardControls容器里,
官方渲染顺序就是「right 槽 → 模型选择器」,所以余额落在模型名正左边。
同时删掉position: fixed与量_sidebarCol的像素定位:那是把条目挂在会话头部、却把像素
画到侧栏底部,注册点(会话级,切会话重挂)与视觉位置(全局)是两套生命周期,每次重挂都要
重新测量、命中前重试 25 × 200ms,量不到就停在视口右下角。位置现在由官方工具行布局决定。- 代价一:输入框的实验性语音输入(录音 / 转写)展开时,官方会隐藏整个
standardControls,余额跟着模型选择器一起隐藏;没装该实验 bundle 时永不触发。 - 代价二:官方同一时刻可挂多份会话(右侧栏聊天标签、子代理面板),每份工具行各显示一个余额。
- 代价一:输入框的实验性语音输入(录音 / 转写)展开时,官方会隐藏整个
修复
- 删掉一条重排官方侧栏 footer 的静态 CSS 规则(
_footArea/_footerActions/
_settingsArea)。余额是position: fixed、本就脱流,那条规则帮不上它;它唯一的实际效果是
把官方账户行(头像 + 用户名)推到右侧,用户报的「名字的位置变了」就是它。
dsh-sym 1.2.0
[1.2.0] - 2026-09-30
新增
- 快捷按钮条:侧栏右缝里一条竖排的图形按钮,点一下就把预设提示词填进输入框
(技能类填/技能名,末尾那个空格是关键——客户端据此认作"指令行、开始收参数")。
默认 4 个按钮:审查改动、跑一遍回归、解释报错、写提交信息- 挂在常驻槽上:交互式问卷或审批弹出时不再整条消失
- 悬浮在侧栏里、不参与布局:拖动侧栏时跟随不同步的问题一并消失
(位置直接写style,不走 React state,否则拖动会慢半拍) - 包了错误边界并把最近一次渲染错误存下来给设置页看 —— 之前渲染期抛错会被 React
静默卸载,界面上表现为"什么都没有",最难查
- 共生体设置:设置 → 插件 → 本插件的标签页,全部配置在这里改,保存立即生效
- 快捷按钮编辑器:增删、改名、选图标(64 个内置图标,官方
/菜单那 8 个排在最前)、
选类型(预设提示词 / 技能)、上下移动、恢复默认 - 显示项三个开关横排在页首:账户余额、会话计费、内存占用
- 配置导入 / 导出(JSON 文件)
- 配置存在浏览器本地存储里,不写进 DSH 的配置文件
- 快捷按钮编辑器:增删、改名、选图标(64 个内置图标,官方
- 保存反馈写明保存了几条、跳过了哪些空内容按钮 —— 静默丢弃会让人以为保存没生效
改进
- 余额格换到侧栏底部"设置"那一行的右侧:高度和那一行对齐,不再贴在侧栏外那条
竖线上;并改为挂竖条同槽的浮层,进场不再推动任何元素 - 余额格去掉按钮底色与 hover 变色:它只做"点击刷新",没有跳转,不该披一层按钮皮。
点击刷新与悬停提示(充值 / 赠送 / 上次更新时间)保留 - 余额格的热区收回侧栏内:盒子右边缘从侧栏右边界外 10px 改到内 2px,
越界那 10px 看不见却可点(点在窗口左下角会触发一次刷新)的问题一并消失;
数字的视觉位置没动(右边缘与min-width同步调整,两者抵消) - 竖条与侧栏右边缘的间距、图标与按钮尺寸按实际观感调准(间距 8px,竖条图标 18px、
按钮 30px,图标候选 24px、格子 34px)
修复
- 点完快捷按钮(以及
@引用按钮)光标留在输入框里。它们是<button>,
点一下会把 DOM 焦点抢到自己身上:文字进了草稿,光标却没了,接着打字打不进去。
现在onMouseDown阻止默认行为(鼠标路径下焦点根本不离开输入框),插入成功后再
显式把键盘交回去;交还时先给 DOM 焦点、再让 Lexical 还原它自己记的选区,
否则光标会被丢到开头 - 交还焦点时不再认错输入框。官方同一时刻可以挂多份会话(右侧栏聊天标签、
子代理面板的variant:"embedded"),每份都有自己的输入框;此前按文档顺序取第一个,
可能把光标送进另一份会话。现在按触发按钮所在的会话容器(data-slot)收窄,
容器里没有可用输入框时不越界;光标已经在输入框里时干脆不动它 - 不再谎报"已聚焦"。同一个属性还出现在两种假输入框上:workspace 触发器状态
(contenteditable=false、没有 Lexical 实例)与 settling 阶段(visibility:hidden)。
现在要求同时具备编辑器实例、contenteditable=true、可见;拿不到编辑器实例就
一个focus都不做 —— 裸 focus 会把光标丢到开头,还可能污染 Lexical 的选区 - 成本药丸、侧栏余额药丸不再把输入框的焦点弄丢(正在打字时点一下花费再回来就敲不进去了)。
它们只挡不抢 - 余额不再闪:把四个来源逐一定位并消除 —— 取数失败时清空元素、用
:has(我们的元素)
开关官方 footer 布局、元素出现/消失与数字宽度变化、首次挂载推动布局 - 快捷条在真实环境不显示:宿主改动需要重新加载才生效,投影
apply必须至少改变一次
state 引用,否则客户端视图永不物化 - 竖条渲染期抛错不再静默:加错误边界,并把错误持久化到设置页显示
- 竖条定位不到时退到保底位置而不是隐藏(隐藏是最难查的失败形态)
- 交互式问卷弹出时快捷条不再消失(改挂常驻槽)
- 设置页整页空白:补
remote.settings的条件注入(不注入直接抛),并加错误边界
移除
- 缓存为你省下:面板里的那一行与悬停账单里的同一句话一起撤掉。它是个反事实数字
(命中 token ×(未命中价 − 命中价)),等于假设没有缓存时这些 token 照样按未命中价计费,
用户认为这个说法夸大 - 本来要花:它是
实际支出 + 缓存省下 + 谷时省下的产物,缓存省下撤掉后这个数
在面板上对不上任何一行,一并移除。面板现在只剩:实际支出(标题)、峰谷拆分、
谷时为你省下、挪动建议、本次任务 - 官方指令类型的快捷按钮:类型下拉只剩「预设提示词」与「技能」。官方斜杠命令里
有一部分是客户端自己接管的(file / goal / plan / feedback),插件既执行不了也插不进
输入框,留着只会点了没反应。旧配置里kind: "command"的按钮按普通提示词处理