Skip to content

Releases

1.8.4:侧栏会话菜单「删除会话」(官方只有归档,这一版真正删到底)

Choose a tag to compare

@seeseeczl seeseeczl released this 04 Nov 11:45

本版加了一条真正删除会话的入口:侧栏会话的「⋯」菜单里多一行红色「删除会话」(菜单最末)。
官方只有归档 —— 归档只把一个 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:对话视图第三个标签改为提交记录(列表 + 重置 + 回滚 + 中止)

Choose a tag to compare

@seeseeczl seeseeczl released this 03 Nov 06:52

本版把对话视图环里的「工作区」标签改造成「提交记录」:列出当前分支的提交,
并能重置到某笔提交、回滚某笔提交、中止半途的回滚。

新增

  • 提交记录列表(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

Choose a tag to compare

@seeseeczl seeseeczl released this 15 Oct 16:43

[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.0 tag、
    也补不出忠实的 release
    。其条目保留为历史记录,不追溯改写。

内部

  • 不变量 3 → 5 条,回归 104 → 110 项。
  • M-CLIENT 本版未改动(硬上限只剩 51 行余量,本版不需要动它)。

dsh-sym 1.8.0

Choose a tag to compare

@seeseeczl seeseeczl released this 15 Oct 16:14

[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

Choose a tag to compare

@seeseeczl seeseeczl released this 09 Oct 07:53

[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

Choose a tag to compare

@seeseeczl seeseeczl released this 05 Oct 07:25

[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

Choose a tag to compare

@seeseeczl seeseeczl released this 04 Oct 14:47

[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。所以任何第三方插件的设置页都会拿到同一个齿轮,
    图标改不了,只能靠文字区分(用户"想看界面读数开关"时才找得到)。

文档

  • 新增四角色设计审计产物:审计报告
    与优化计划书,
    以及 21 张证据截图(docs/05-audits/evidence-2026-10-04/)。
  • 审计判为 blocked(14 条结构性 / 18 条打磨);本版只落地了无依赖的第一批 5 条 + 保存按钮配色,
    其余(含需要拍板的竖条形态、计费口径、配置写入时机)留在优化计划书里。

dsh-sym 1.3.1

Choose a tag to compare

@seeseeczl seeseeczl released this 02 Oct 03:29

[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

Choose a tag to compare

@seeseeczl seeseeczl released this 30 Sep 16:07

[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

Choose a tag to compare

@seeseeczl seeseeczl released this 30 Sep 15:33

[1.2.0] - 2026-09-30

新增

  • 快捷按钮条:侧栏右缝里一条竖排的图形按钮,点一下就把预设提示词填进输入框
    (技能类填 /技能名 ,末尾那个空格是关键——客户端据此认作"指令行、开始收参数")。
    默认 4 个按钮:审查改动、跑一遍回归、解释报错、写提交信息
    • 挂在常驻槽上:交互式问卷或审批弹出时不再整条消失
    • 悬浮在侧栏里、不参与布局:拖动侧栏时跟随不同步的问题一并消失
      (位置直接写 style,不走 React state,否则拖动会慢半拍)
    • 包了错误边界并把最近一次渲染错误存下来给设置页看 —— 之前渲染期抛错会被 React
      静默卸载,界面上表现为"什么都没有",最难查
  • 共生体设置:设置 → 插件 → 本插件的标签页,全部配置在这里改,保存立即生效
    • 快捷按钮编辑器:增删、改名、选图标(64 个内置图标,官方 / 菜单那 8 个排在最前)、
      选类型(预设提示词 / 技能)、上下移动、恢复默认
    • 显示项三个开关横排在页首:账户余额、会话计费、内存占用
    • 配置导入 / 导出(JSON 文件)
    • 配置存在浏览器本地存储里,不写进 DSH 的配置文件
  • 保存反馈写明保存了几条、跳过了哪些空内容按钮 —— 静默丢弃会让人以为保存没生效

改进

  • 余额格换到侧栏底部"设置"那一行的右侧:高度和那一行对齐,不再贴在侧栏外那条
    竖线上;并改为挂竖条同槽的浮层,进场不再推动任何元素
  • 余额格去掉按钮底色与 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" 的按钮按普通提示词处理