Skip to content

Releases: Nwflower/dsh-claude-style

v0.13.3

Choose a tag to compare

@github-actions github-actions released this 12 Oct 14:41

中文 | English

新增功能

  • 选完 Claude 或 DeepSeek 主题风格后,侧栏顶部、新会话页与账号行的兜底头像只能挂这两家的标志;设置页「外观」里现在可以填自己的品牌名称、上传标志图片与文字标志(PNG / SVG / WebP,不超过 2 MB),选择图片保留原色或按文字颜色着色,并指定一个主色替换按钮、选中标记、链接与焦点环的颜色。图片存在 DSH 主目录的 dsh-claude-style/brand/ 下,由宿主半边新增的 /dsh-claude-style/brand、/brand/mark、/brand/wordmark 三条私有路由读写;设置项新增 brandName、brandInk、brandAccent。

问题修复

  • 等待行曾连带隐藏 dsh-status-rotator 等插件插入的状态行;现在只隐藏宿主文案,第三方状态行保持可见。

New Features

  • With the Claude or DeepSeek theme style chosen, the top of the sidebar, the new-conversation page and the account row's fallback picture could only carry those two brands' marks; the Appearance tab now takes your own brand name, a mark and a wordmark image (PNG / SVG / WebP, up to 2 MB), a choice between the images' own colours and the text colour, and an accent colour for buttons, selected marks, links and focus rings. The images live under dsh-claude-style/brand/ in the DSH home directory, read and written through three new private routes of the host half — /dsh-claude-style/brand, /brand/mark and /brand/wordmark; the settings gain brandName, brandInk and brandAccent.

Bug Fixes

  • The waiting line hid status lines inserted by plugins such as dsh-status-rotator; it now hides only the host wording and leaves third-party status lines visible.

v0.13.2

Choose a tag to compare

@github-actions github-actions released this 11 Oct 14:21

中文 | English

新增功能

  • 设置页「侧栏」多了一行「左侧栏布局」:「宽松」是现在的样子,「紧凑」把左侧栏的间距收小——上侧各行(新会话、插件、自动化任务,以及搜索框独立成行时的那一行)到工作区之间的空隙、工作区标题自身的上下留白、对话行的高度与行间距、两个分区之间的间隔,以及账号区的内边距与它那一行的上下边距。控件的形状、字号、图标与配色不变。新增一项偏好 sidebarLayout(默认 relaxed),把它解析到 <body data-dsh-claude-sidebar-layout>;宿主半边由共享的偏好表生成,因此该键也会出现在 DSH 的设置文档里。

体验优化

  • 同一个文件在一段过程里被改了几次,聊天区就并排列出几行,改动越密集越难看出这个文件一共改了多少。现在同一个文件在同一个过程组里的多次编辑与写入读成一行:这一行是这一组里最早的那一次改动,行尾的 +n -m 是这些改动的累计值,每到达一次改动就滚动一次,展开这一行读到的是全部改动;只改动过一次的文件保持原样,失败与中断的行仍各自保留裁决信息。
  • 「模型正在做什么的那一行」在跟随末尾时停在输入框上方:这一行的固定此前挂在「轮次状态行」这一个开关上,而它属于运行中的这一行本身。现在它随「聊天区动画效果」这一开关,与这一行的说法、扫光同一处;读者自己接管滚动,或跟随的滑行正持有位置时,它照旧让开,回到文档位置随内容走。
  • 首页用量面板的用量热力图,格子悬停提示原本写的是那天的消息条数,现在改成那天的 Token 用量(「9月9日 — 15.9k Token」),与格子深浅取自同一个数字;两份数据来源都带每天的 Token 合计,提示不再随来源换口径。
  • 侧栏搜索框选「独立在品牌行下方」时,那一行自己还留着 8 像素的左右内边距,盒子因此比下面的「新会话」等行窄 16 像素;现在这一行不再留内边距,盒子的左右边框与下面各行的宽度落在同两条边上。
  • 侧栏「新会话」一行右侧的快捷键提示原本是等宽字体的普通文字(Ctrl + N),现在与搜索框的按键同一套样式:每个键一个 20 像素圆角键帽、1 像素描边、12 像素次级文字,两个键之间的「+」不再出现。
  • 样式表里写死的颜色改读令牌:强调色按钮上的文字取填充自己的前景令牌(原先写死纯白,换成浅色填充后对比度没有保障),设置页里插件图标的底色取主文字令牌(原先写死十六进制)。docs/STYLE.md 的形状一节补上实际使用的圆角与描边,并写明它们来自被复制的那枚宿主控件。

问题修复

  • 会话很多时,用量汇总与内容搜索读日志会让宿主进程持续占住一个核心:它们经 sessionQuery.readSession 按 id 读,而这一版会为了定位一个 id 先把整份会话存档列一遍(列一次要打开并解压每个存档的头部帧),改动过的会话越多就越慢,首次运行或任何一次会话变动都按变更个数叠加。现在两处都改走宿主的观察接口 sessionQuery.observeSession,它只观察这一份存档、不先列档,读 N 个会话就是 N 次观察、零次列档(观察的租约在事件到手后立即释放);只发布 readSession 的宿主退回按 id 读,仍然照常工作。按大小与修改时间的增量缓存不变,没有变动的会话照旧跳过,用量数字与负载结构不变。
  • 删除会话的请求体超过上限时,客户端原先只看到连接被重置;现在先答 400,这条应答送出之后再结束连接。
  • 成本计量账本里出现不是真实日期的键时,合并原先按字符串把它当成最新的一天,本地折算出的所有日子与它们的会话一起消失,首页模型图表还会读到一个非法日期而报错;现在这类键在读取时被跳过,其余日子照常合并。
  • 机器上没有成本计量插件时,用量汇总的来源原先报成 cost-meter+local;现在报 local,与「哪个来源作答」的定义一致。
  • 峰谷目录的 24 小时定时器原先在页面问过一次之后一直拉取到进程退出,设置里关掉峰谷功能也停不下来;现在连续 48 小时没有请求就自己停下,下一次请求再启动。
  • 宿主没有网页服务器服务时,插件原先静默地一条路由也没注册,卸载时又按每一条记一次失败;现在报告一次缺少的服务,路由的撤销表里只留真正的撤销函数。
  • 会话内容检索里,整份列举取代在途的尾扫时,旧的一轮结束会把新一轮的状态一起清掉,于是可以再起第三轮并发地读同一批会话;现在只有仍然是最新的一轮才清状态。
  • 关闭状态的弹层卡片原先只把不透明度降到 0,卡片里的按钮仍然留在 Tab 顺序里,键盘读者会停在完全看不见的行上;现在关闭的卡片同时移出绘制、命中与焦点顺序,开关的淡入淡出照旧。
  • 进行中那一行:皮肤把宿主自己的文字藏起来之后,画的替身又标着「装饰」,读屏在这一行上收不到「模型正在做什么」「暂未响应」和计时;现在替身是这一行的可读文字,宿主自己的实时区域照旧播报。
  • 把「动画效果」设为减弱之后,工作强度滑杆顶档的点阵仍按运行时写下的动画时长闪一次;现在这一档不写动画的周期与相位,点阵静止。
  • 几个控件对读屏说不出自己是什么:会话统计那一行只有数字与箭头,工作强度与模型触发器从不报告菜单是否展开,设置页的开关没有名字,权限弹层的当前档位只有勾号,输入输出箭标进了名称。现在统计行有自己的名称、两个触发器跟着菜单报告展开状态、开关取所在行的标题为名、权限弹层的当前档位写 aria-checked、箭标对读屏隐藏。
  • 手机宽度下输入卡片下方那一行与手机插件自己画的度量条落在同一条 28 像素带里,两行文字叠在一起(权限标签上压了 52 像素、模型标签上压了 21 像素);现在输入区会量出那条度量条的高度,把这一行连同上下文圆环整体抬起同样的距离,度量条出现与消失时分别抬起与落回。

安全

  • 宿主没有 connection 服务时,私有路由的回退栅栏原先只看请求方自己写的 Host 头,局域网连接谎报 localhost 即通过;现在先看连接的对端地址,回环地址之外一律拒绝。冒烟的宿主半边新增一条检查:局域网连接加回环 Host 必须被拒。
  • 删除会话时「目录留在会话根目录内」的判定改为比较解析符号链接之后的路径:会话根目录下有指向别处的项目目录链接时,删除不再跟着链接走到根目录之外。

移除

  • 「轮次状态行」整体移除:这一项把宿主的过程控件搬到自己那一轮工作的末尾,并为进行中、已停止与失败的轮次换上插件自己画的火花与文字(用时、输出 tokens、当前动作)。宿主早已把运行中的状态做成对话末尾自己的一行(小鲸鱼、说法与计时),过程控件只在轮次结束之后出现,于是这条状态条只剩停止与失败两种情形还在渲染,画法又与那一行不同。现在宿主自己的控件留在它原来的位置与写法上:已停止与失败的轮次显示宿主自己的「已停止」「处理失败」,用时与输出 tokens 不再显示;设置页「对话」页的「轮次状态行」一行随之消失,早先存下的取值不再被读取。

其他变更

  • 模型标志的 cap 高度回退原先写在同一规则里的两条 height,端到端的 !important 审计因此整条跳过这条规则;现在两条高度分处两条规则,规则的每一处权重都受审计。
  • 两处内部记录的清理:滚动主人记「哪个来源在滑这一格」的表改用弱引用键,弹簧自己走完之后不再把已经分离的对话子树留在内存里;页脚接管挂在宿主自己的账号行与菜单上的监听随功能的拆卸一并摘下,反复开关不再叠加。

New Features

  • The settings page's Sidebar tab gains a Sidebar layout row: Relaxed is how the sidebar looks now, and Compact takes its spacing down — the gap between the top rows (New session, Plugins, Automation tasks, and the search box's own row when it stands alone) and the workspace, the workspace heading's own margins, the conversation rows' height and spacing, the distance between two sections, and the account area's padding and row margins. Control shapes, type sizes, icons and colours are unchanged. A new preference, sidebarLayout (default relaxed), resolves onto <body data-dsh-claude-sidebar-layout>; the host half is generated from the shared preference table, so the key appears in DSH's own settings document too.

Improvements

  • A file changed several times in one piece of work was listed as one row per change, so a dense stretch of edits made it hard to see how much the file had changed in total. The edits and writes of one file inside one process group now stand as a single row: the earliest of them carries the total of those changes in its +n -m tail, rolls once per change as each one lands, and opens onto every change. A file changed once is drawn as before, and a failed or interrupted row keeps its own verdict.
  • The line saying what the model is doing now holds its place above the composer while the conversation follows its tail: that hold used to hang on the Turn status line switch, a switch for a line of its own. It rides the Chat-area animations switch now, together with the line's wording and sweep, and it still steps aside — keeping its document place — while the reader owns the scroll or the follow's glide holds the position.
  • On the home page's usage panel, the heat map's cell tip used to name the day's messages; it now names the tokens that day spent ("Sep 9 — 15.9k tokens"), the same figure the cell's shade is bucketed from. Both sources behind the grid carry a per-day token total, so the tip no longer changes its reading with the source.
  • With the sidebar search box on Standalone, its own row still carried 8px of inline padding, which made the box 16px narrower than the New session row under it; the row adds no padding now, so the box's two edges stand where the rows under it stand.
  • The shortcut hint at the right of the sidebar's New session row was plain monospace text (Ctrl + N); it now wears the search box's own key caps — one 20px cap per key with a 1px hairline and 12px secondary text — and the + between the two keys is gone.
  • Literals in the stylesheets read tokens: the label on a filled accent button takes the fill's own foreground token (it was a hard-coded white, which promised nothing once a palette turns the fill light), and the settings page's plugin mark takes the primary label token (it was a hard-coded hex). The shape section of docs/STYLE.md records the radii and strokes actually in use, with the host control each copy came from.

Bug Fixes

  • With many sessions the usage roll-up and the content search pinned a core while reading logs: they read by id through sessionQuery.readSession, which locates that id by listing the WHOLE stored corpus first (a listing opens and decompresses every stored session's header), so the pass grew with the number of changed logs on a first run and after any session change. Both now read through the host's observation entry point sessionQuery.observeSession, which resolves the one session without listing the corpus: N sessions cost N observations and no listings, each lease released as soon as its events are in hand. A host publishing only readSession falls back to the per-id read and keeps working. The size and modification time cache is unchanged, unchanged logs are still skipped, and the usage figures and payload shape are untouched.
  • A session deletion whose body went past the limit left the client with a reset connection; the 400 is answered first now, and the connection is ended once that answer has gone out.
  • A key in the cost meter's ledger that is not a real date used to become the newest day by string comparison, which dropped every day the local fold contributed, along with its sessions, and left the home page's model chart formatting an invalid date; such a key is skipped as the ledger is read now, and the rest of the days merge as before.
  • With no cost-meter plugin on the machine, the usage roll-up reported its source as cost-meter+local; it reports local now, which is what "which source answered" means.
  • The peak-rate catalog's daily timer kept reaching the source until the process exited once a page had asked, and switching the peak-rate feature off did not stop it; it stands down after 48 hours with no request now, and the next request starts it again.
  • A host without a web server service registered no route in silence and then logged one failure per route as it unloaded; the missing service is reported once now, and the route disposers hold the real disposals alone.
  • In session content search, when a full listing replaced a tail-only pass in flight, the older pass's end cleared the newer pass's state, which let a third pass read the same sessions alongside it; only the pass that is still current clears the state now.
  • A closed popover card only dropped its opacity, so the buttons inside stayed in the tab order and a keyboard reader landed on rows nothing was drawing; a closed card leaves the paint, hit-testing and the tab order together now, and the open and close fades are unchanged.
  • On the live turn's running row, the skin hid the host's own words and marked its replacement decorative, so a screen reader received neither what the model is doing, nor the wait badge, nor the clock; the replacement is the row's readable text now, and the host's own live region still announces the row.
  • With Animation set to Reduced, the reasoning-effort slider's top-rung matrix still flashed once per block on the duration written at run time; that duration and phase are not written in this setting now, and the matrix stands still.
  • Several controls could not say what they were: the conversation-statistics line held only figures and arrows, the effort and model triggers never reported whether their menu was open, the settings page's switches had no name, the permission popover marked its current tier with a check mark alone, and the input and output arrows joined a name. The line carries its own name now, both triggers report the open state with their menu, a switch takes its row's title as its name, the permission popover's current tier writes aria-checked, and the arrows are hidden from a reader.
  • At phone width the line under the composer card and the statistics strip a mobile plugin draws of its own shared one 28px band, so th...
Read more

v0.13.1

Choose a tag to compare

@github-actions github-actions released this 11 Oct 02:02

中文 | English

问题修复

  • 装了 0.12.3 或 0.13.0 之后 DSH 起不来(「The application could not start or stopped unexpectedly」),禁用本插件也一样,只有退回 0.12.2 才能启动:这两版把宿主本体 @deepseek-ai/dsh 写成了运行时依赖,安装本插件时把宿主的整份运行时闭包拉进 profile 的 node_modules(282 个 @deepseek-ai/* 包、lockfile 从 2,522 行长到 11,466 行),与宿主自己那份并存;其他插件按名字导入宿主包时落到这一份新副本上,版本或导出对不上就在冷启动时抛出。现在这条声明去掉了,装本插件不再多装任何宿主包,其他插件照旧从宿主那份解析;本插件运行时要用的宿主包(设置表单的 schema 工厂、加载器递过来的部件与 React)声明在 peerDependencies 里,另有一份 devDependency 供类型检查与测试使用。构建新增一条拒绝:package.json 的 dependencies 里出现 @deepseek-ai/* 即失败。

Bug Fixes

  • DSH would not start after installing 0.12.3 or 0.13.0 ("The application could not start or stopped unexpectedly"); disabling this plugin did not help either, and only going back to 0.12.2 did. Those two versions declared the host itself, @deepseek-ai/dsh, as a runtime dependency, so installing the plugin pulled the host's whole runtime closure into the profile's node_modules (282 @deepseek-ai/* packages; the lockfile grew from 2,522 to 11,466 lines) beside the host's own copy. Another plugin importing a host package by name landed on that new copy, and a version or export that did not line up threw during a cold start. That declaration is gone: installing this plugin adds no host package, and other plugins resolve against the host's copy as before. The host packages this plugin does use at runtime — the schema factory behind the settings form, the parts the loader hands over, and React — are declared in peerDependencies, with a devDependency copy for the type check and the tests. The build now refuses @deepseek-ai/* in dependencies.

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 17:08

中文 | English

体验优化

  • 会话的统计与 Token 用量现在默认「收进上下文」:这些数字就在输入区上下文圆环那张弹层里,输入卡片下面只留那个圆环,不再多出一行;想一眼看到全部读数的人仍可在设置页「对话」页把「对话统计信息位置」改回「独立成行」。已有安装的设置不会被改写,这一项没设过的人升级后看到的是新默认。

问题修复

  • 收起侧栏后,「新会话」那枚加号圆片不再比同一栏的其它图标靠左:宿主把这一格换成一枚 36 像素的图标按钮并让它里面的东西居中,而它自己那个图标座位在收起状态下是空的(图标已隐藏、文字宽度为 0),却仍占着这一行的一份宽度,把圆片顶到栏内中线左边 7 像素;现在这一格交出座位,圆片与上面的收起按钮、下面的插件与搜索图标落在同一条中线上。
  • 手机宽度下,统计数字收进上下文弹层时那枚圆环不再跑出输入卡片:铺在工具栏行上的那条 dock 一直带着桌面端那份左右留白(给权限档位与模型、推理等级两块让出位置),它比这一宽度下的卡片还宽,把贴着它右缘的圆环一起顶出卡片、顶到窗口外;这一宽度下那份留白让位,圆环回到卡片右端、落在推理等级按钮之后。

Improvements

  • The session statistics and the token usage now live Inside the context popover by default: the figures are in the panel the composer's context ring opens, and the input card keeps only the ring below it rather than a line of its own. A reader who wants every reading at a glance can still set Conversation statistics position back to On its own line on the settings page's Conversation tab. Settings already stored are not rewritten: an installation that never set this preference shows the new default after the upgrade.

Bug Fixes

  • With the sidebar collapsed, the New session chip no longer stands left of the column's other icons: the host turns that cell into a 36px icon button and centres what is inside it, while its own icon seat is empty in that state (the icon is hidden, the label is 0 wide) and still took a share of the flex row, pushing the chip 7px left of the column's centre line. The seat now gives up its share, and the chip lines up with the collapse toggle above it and the plugin and search icons below.
  • At a phone's width the context ring no longer leaves the input card when the numbers live in the context popover: the dock laid over the toolbar row kept the desktop reserve that clears the permission preset and the model and reasoning-level controls, which is wider than the card at that width, and it carried the ring pinned to its right edge out of the card and past the window. The reserve now stands down at this width, and the ring returns to the card's right end, after the reasoning-level control.

v0.12.3

Choose a tag to compare

@github-actions github-actions released this 10 Oct 16:05

中文 | English

体验优化

  • 推理回放窗口在宿主两版之间都能用:此前它按较新宿主才写的推理正文槽位找要裁剪的盒子,装在钉住那一版宿主上时找不到,推理期间读者看到的还是整段长文。现在窗口从宿主渲染出来的 Markdown 本身认起,往上取第一个真有盒子的祖先来裁剪,滑动的仍是这段 Markdown。
  • 推理回放窗口不再先按固定高度裁剪再换回整段:此前的窗口一直是四行高,推理写满四行之后文字在窗口里往上滚,推理一停窗口撤下,整段文字接管这一行——窗口的高度与推理最终占的高度不是一回事,切换的那一下整块内容会跳一次。现在窗口跟着推理长高,长到它最终能占的高度(宿主给过程组正文的那个上限,标准档 400px)就停在那个高度上,文字这时才每 0.84 秒往上走两行,走到最新一行停住,上下边缘也在这时才渐隐;推理没长满之前,文字照平时那样一行行往下读,不再被渐隐遮住。

问题修复

  • 0.12.2 起,设置里存着早先「聊天区动画效果」档位(「增强」「重绘」「关闭」)的读者,宿主不再拒绝启动本插件:0.12.2 把这一项改回开关,宿主按开关核对配置,读到早先存下的档位名即判定配置无效,整个插件不启动——插件列表里显示「启动失败」,用量面板、消息搜索、模型说明、随包字体与按需加载的各项功能全部失效,设置里也没有 Claude Style 页。现在这一项同时接受开关值与早先的档位名,存着「增强」「重绘」的照旧开着,存着「关闭」的照旧关着;已经处在「启动失败」的桌面端重启一次即恢复。
  • 手机宽度(390px 及以下)的输入区不再让上下文计量环压住右边的推理等级按钮:此前环按右端定位、等级按钮也按右端排,两者叠在一起,环还常常被挤出卡片;现在这一档为环留出它占的宽度,等级按钮落在它左边,卡片上的三个控件都不再越界。
  • 装了壁纸插件(dsh-plugin-wallpaper-engine)时,配色留在 Claude 也能看到壁纸,文字照样清楚:此前皮肤把不透明画布直接画在窗口、侧栏与对话列上,壁纸被整片盖住;只让开外壳之后,会话正文、表格、侧栏条目与标题栏又直接压在花壁纸上读不清,设置窗口也变成透明。现在壁纸在播时外壳让开,整个窗口铺一层画布色遮罩——浅色是 86% 的象牙白,深色是 82% 的暖黑——侧栏、标题区、会话与底部读数落在同一块底子上;输入卡下面垫一块同宽的画布色托盘,滚过去的正文不会从统计行底下透出来;设置窗口、弹层、卡片与引导层照旧不透明。壁纸关掉后画布原样回来;配色选「跟随宿主」时的共存不变。
  • 经局域网地址或隧道打开的页面(例如手机经 dsh-pocket 访问)不再回到出厂外观:此前这种页面上的主题风格、配色、吉祥物等全部按默认值显示,设置页一改动就报「设置存储服务异常」;现在页面显示 DSH 当前的设置,在运行 DSH 的电脑上改动后不需要刷新就跟上,设置页开头说明改动要在那台电脑上做,控件全部禁用。

Improvements

  • The reasoning's streamed window works across both host versions: it used to look for the reasoning body through a slot only the newer host writes, so on the pinned host it found no box to clip and the reader saw the whole reasoning grow. It now reads the host's rendered Markdown itself and clips the nearest ancestor that has a box, sliding that Markdown inside it.
  • The reasoning's replay window no longer clips to a fixed height and then hands the row back to the whole text: the window stood four lines tall, the text scrolled up inside it once it filled those lines, and the whole reasoning took the row over the moment the reasoning stopped — the window's height and the height the reasoning ended at were two different things, and that switch moved the block. The window now grows with the reasoning and stops at the height it will end up occupying (the host's own cap on a process group's body, 400px in the Standard tier), and only there does the text step up two lines every 0.84 s behind the softened edges, stopping at the newest line. Below that cap the reasoning is read line by line as it is written, with nothing faded.

Bug Fixes

  • Since 0.12.2 the host no longer refuses to start the plugin for a reader whose settings still hold an earlier "Chat-area animations" choice ("enhanced", "redraw" or "off"): 0.12.2 turned that preference back into a switch, the host checked the stored config against a switch, judged the earlier choice name invalid and started nothing of the plugin — the plugin list showed it as failed to start, and the usage dashboard, message search, model copy, bundled fonts and every on-demand feature stopped working, with no Claude Style page in Settings. The preference now takes both the switch value and the earlier choice names: "enhanced" and "redraw" stay on, "off" stays off; a desktop already showing the failure recovers after one restart.
  • On a phone-width composer (390px and under) the context meter no longer sits over the reasoning-level button at the row's right end: the meter is positioned from that end and so was the button, so the two overlapped and the meter was often pushed out of the card; the row now reserves the width the meter takes, the button lands before it, and all three controls stay inside the card.
  • With the wallpaper plugin (dsh-plugin-wallpaper-engine) installed, the wallpaper now shows under the Claude palette and the text stays legible: the skin used to paint opaque canvases over the window, the sidebar and the conversation column and covered the wallpaper whole, and once the shell gave way the transcript, tables, sidebar entries and the title bar sat straight on a busy wallpaper while the settings window went transparent. While a wallpaper is up the shell now gives way and one mask in the canvas colour covers the window — ivory at 86% in light, warm black at 82% in dark — so the sidebar, the header, the transcript and the figures at the bottom read on the same ground; a canvas-coloured tray the width of the composer card keeps the transcript scrolling under the dock row from showing through; the settings window, popovers, cards and overlays keep their fill. The canvases return once the wallpaper goes; coexisting under "follow the host" is unchanged.
  • A page opened through a LAN address or a tunnel (a phone reaching DSH through dsh-pocket, for example) no longer falls back to the default look: such a page showed the theme style, colours, mascot and every other setting at their defaults, and any change on the settings page reported that the settings store was unavailable. The page now shows the settings DSH holds and follows changes made on the computer running DSH without a reload, and its settings page opens with a line saying changes are made on that computer, its controls disabled.

v0.12.2

Choose a tag to compare

@github-actions github-actions released this 10 Oct 09:01

中文 | English

新增功能

  • 设置页「侧栏」页新增「侧栏搜索」下的「搜索框样式」三档:「覆盖品牌」(默认)把搜索框放进品牌行、指针移到侧栏上时盖过品牌;「独立」在品牌行下方给它自己一行并一直显示;「图标」不画插件自己的搜索框,保留 DSH 自己的搜索按钮,只把单击接管过来,点它打开本插件的面板。切换不需要刷新页面。
  • 写在输入卡片下面那一行数字重新有了自己的弹层:这一行此前只显示六个读数,宿主统计行上那些明细(模型用时、工具调用用时、首 token 平均、输出速度,以及缓存命中、未缓存输入、缓存读取、写回、输出这些用量行)在「写在单独一行」这一档下无处可看。现在这一行本身就是宿主那张上下文弹层的第二个触发口——按一下这些数字,弹层就在这一行上方打开,内容仍是同一份:宿主自己的上下文行加上这一段会话的数字明细,两种位置下都由同一份数据填充;按一下再收起,回车与空格同样开合、Esc 收起,弹层开着时这一行自己也报出展开状态。悬停开合仍只归计量环那条路径:指针停在数字上不展开弹层。窗口尺寸或输入区变化时弹层照旧重新量位置。
  • 设置页「对话」页新增「对话统计信息位置」:会话统计与 Token 用量此前只有一个去处——输入区上下文圆环的弹层。现在默认把它们写在输入卡片下面单独一行:轮数与步数、输出速度、读入与写回的 tokens、缓存命中率,末尾就是那个圆环,宿主统计行上的图标一个都不出现;也可以选「收进上下文」,回到弹层那一份。这一行里的数字一有变化就逐个字符重新入场(每走一个步骤、流式输出期间都在动,没变的数字保持不动),缓存命中率与圆环按各自的无极色阶取色(命中率九成的红到 99% 的深绿,占用两成的绿到四成的红,两个色标之间由浏览器在 OKLCH 里插值)。窗口窄到这一行放不下时它按固定顺序让位——先去缓存那截的字样,再去轮数与步数,再去圆环旁的数字(环留下),然后把读入与写回合成一个合计并去掉箭头,最后把数字折叠成 k / M / B——数字不再挤在一起互相压字,窗口宽回来时按同一顺序退回。这一项从此有自己的设置,不再与「重绘权限控件」共用一个开关;设置表单多了一个字段,正在运行的宿主重启一次才会提供它。
  • 设置对话框「Claude Style」页的标题行右端新增一枚 GitHub 标识,按一下在新的标签页里打开插件仓库(https://github.com/Nwflower/dsh-claude-style)。标识的颜色取次一级的文字色,深浅两套配色各自跟随;指针移上去底部铺一层悬停底色、图形加深,键盘焦点落到它上面时出现一圈强调色描边,读屏念出「在 GitHub 上打开本插件」。插件页上那一份沿用宿主自己的标题行,不加这枚标识。

体验优化

  • 中文界面下权限选择器的档位名改用宿主自己的中文名:分段控件上的当前档位与弹层里的每一行此前写死为皮肤的 Claude 英文名(Read only / Accept edits / Full access),中文界面里只有名字下面那行说明是中文;现在界面语言是中文时这几处读宿主 permission.access 文案表里的原文——「仅可查看」「工作区内修改」「完全权限」,宿主调整自己的用词时皮肤跟着变;切成别的界面语言仍是皮肤的名称。
  • 侧栏搜索的会话内容搜索从秒级等待变成即答:每个会话的语料(读者的消息与助手的回答)此前只留在宿主进程内存里,宿主每次重启后的第一次搜索都要把全部会话日志重读一遍——本机 260 个会话约 30 秒;现在它落一份 $DSH_HOME/cache/dsh-claude-style/search/<会话 id>.json,重启后只读这些文件,约 1.4 秒,存档会话里只有修订号变过的才重读,宿主开着的会话按事件序号只读新增的那一段。查询本身也从整篇正则扫描改成小写子串查找,本机 260 个会话、8252 条消息的语料上单次查询 5–20 毫秒(此前约 0.5 秒)。语料缓存按需构建:只有读者真的搜索时才会读日志、才会落盘。在一台还没有缓存的机器上,第一次搜索仍要读完全部会话日志一次。
  • 会话数字那一行不再用 · 把各段隔开:轮数与步数、输出速度、读入与写回的 tokens、缓存命中率之间此前各插一个 · 符号,行一窄就要多让一档;现在这些符号去掉,各段只靠行自己的间距分开(间距从 6px 放到 10px),一行能容下的数字更多,抄出来也是一段干净的话。端到端通道与冒烟用例各新增一条读数:那一行的 DOM 里一个 · 都不出现。
  • 搜索面板里点开一条内容命中,现在落到那条消息所在的一轮,不再只停在这个会话的开头:面板按命中消息的事件序号,从会话的整篇轮次大纲里找出它属于哪一轮,等这一轮进了已加载窗口再经宿主的刻度定位。会话历史很长时,定位前会先把这一轮的记录翻页读进来;找不到对应轮次时停在会话本身,与从前一样。
  • 过程组的标题不再只写「执行了命令,已读取文件,已调用工具等」,改写这一组装了什么:「执行 2 次思考,调用 1 次工具」。没有的项不写,数字随内容增加逐位滚动(160 ms,减弱动效时直接落位),这一段还在进行时整行带着与宿主同样的扫光;控件的可访问名字始终是这句完整的话,读屏念到的与看到的一致。标题放不下整句时(窗口窄,或这一行本身不长)改用简洁写法「思考×2 · 工具×1」,位置宽回来再换回整句——两种写法都不会被省略号截断。能否放下按标题所在容器给它的宽度判断,不按它当前有多宽。计数按过程组内部每一行的种类算:带 data-chat-group-part="reasoning" 的助手步算思考、其余助手步算输出、工具调用算工具、命令与其它记录算记录,工具行内部的调用不重复计入。
  • 轮次进行中,对话末尾那一行不再固定写「深度求索中,用时 N 秒 ···」,而是说出这一轮此刻在做的事:「正在思考」「正在准备工具调用」「正在调用工具」「正在写回答」,后面跟着这一轮已用的时间(用宿主自己的时间单位)。读不出状态时(模型还没写出任何内容、也没有工具在跑)回到宿主自己的「深度求索中」——这正是读者那一刻在宿主界面上看到的同一句话;模型连续 10 秒没有开口时,计时后面再挂出「暂未响应」。说法换掉时走一段三段式交替(transitions.dev 的「Text states swap」):旧的那句一边模糊一边向上淡出,淡出之后才换成新的,新的一句从下方升上来;「动画」设为「减弱」时直接换掉,不做这三段。这一行带扫光,宿主的小鲸鱼与读屏播报照旧,关闭「聊天区动画效果」后宿主原来的写法原样回来。轮次状态行里的同一句说法与这一行共用一处(shared/turn-activity.ts):正在思考、正在准备工具调用、正在调用工具、正在写回答现在读的是同一份文案。
  • 模型推理期间,思考行里的推理文字不再一行行把整列对话往下推着长:它停在四行高的窗口里,上下边缘渐隐,文字每 0.84 秒往上走两行(0.5 秒滑过去、曲线 cubic-bezier(0.22, 1, 0.36, 1)),走到最新一行就停住,读者始终看得见推理的结尾。这一套来自 transitions.dev 的「Reasoning stream」,按实时文字改写:不克隆、不循环。推理一停(或读者把这一行收起),窗口撤下、位移归零,读者打开这一行读到的是完整文本;「动画」设为「减弱」时不设窗口。端到端通道新增 reasoningStream 场景:在真实宿主上核对窗口高度与遮罩、每一步的位移与过渡、位移从不越过内容末尾(实测走到 211px 正好等于文本 303px 减窗口 92px),以及推理结束后窗口撤下、完整文本 303px 铺开。
  • 设置页的「品牌标识」改名为「主题风格」,并从「外观」页移到「通用」页最前面:这一项选的是整套品牌标识与配色色系,此前排在「外观」页首位,而同页的配色、字体与吉祥物都只改一样东西;现在它与用户名、动画效果这些通用项排在一起,「外观」页只剩配色、字体、吉祥物与出现位置。可选的品牌、存下的设置值与切换后的效果都不变。

问题修复

  • DeepSeek 品牌下侧栏品牌区的 HARNESS 徽标重新显示:皮肤此前把宿主标志里的胶囊徽标与徽标上的字形一并隐藏,品牌区只剩下鲸鱼与 deepseek 字样;现在宿主的整幅标志(鲸鱼、deepseek 字样与 HARNESS 徽标)原样保留,徽标沿用 DeepSeek 蓝的胶囊底与反白字形。Claude 品牌下品牌区照旧画皮肤自己的标。
  • 输入行右端的上下文计量环不再跟着宿主的行高、空隙与药丸宽度跑偏:把数字收进上下文弹层那一档下,皮肤把卡片下面那一条 dock 盖到输入行上,此前是按「行高 28px、这一行距容器底 4px、给行尾留出计量环自身的宽度 +8px」这几个写死的数放它——它们都属于宿主,卡片的空隙或行高不同,计量环与读数就整体离开那一行(0.2.0-rc.2 的 macOS 端实测偏 4 CSS px,与本机相差一个空隙),药丸比宿主停放的那个节点宽时行尾的文字还会被药丸底色压住。现在行高与空隙由 composer 每次经过从输入行自己量出来(--dsh-claude-meter-row-offset、--dsh-claude-meter-row-height),留出的宽度按「停放节点与触发按钮两个盒子并起来」再 +8px 算,量在行或容器尺寸变化时做;端到端通道新增 statsOverlay 场景:卡片下方的空隙分别改成 0 与 16px 后 dock 的两个盒子边仍与输入行逐边相同(量出的空隙跟着由 4px 变 0 与 16px),再把触发按钮在停放节点里左移 14px,断言行尾文字与药丸左缘仍留 8px。
  • 进行中的状态行只在插件自己跟随末尾时停在输入框上方:此前只要宿主还报着「跟随在开」,读者往上翻看历史时这一行仍按固定位置浮在输入框上方、压住正在读的内容,直到宿主自己发现读者离开末尾。现在读者接管滚动(滚轮、触摸、拖动滚动条、滚动键、页内查找,以及对话导航跳到某一轮)期间,这一行的固定整个让开,随内容一起走;读者自己回到底部后跟随继续,这一行也回到输入框上方。端到端通道新增 readerScroll 场景:轮次进行中滚一次滚轮,读者滚动之前该行 158 帧停在 426px,之后 382 帧无一处停在固定位置、全部随内容移动。
  • 侧栏搜索的内容匹配不再搜进注入上下文与推理过程:user/message 里由宿主注入的环境快照、Skill 目录、AGENTS.md 与压缩检查点此前一并进了语料,于是搜到的「会话」里出现读者从没打过、模型也没答过的字;现在只收人类发出的消息(按事件自带的 source.kind === 'user')与助手回答里的文本块,推理块、工具调用与工具结果都不进。实测同一条会话里,只出现在 Skill 目录里的字符串与只出现在推理块里的字符串都从命中列表里消失,读者自己发的原文仍照常命中。
  • 会话数字的入场动画不再把整屏内容顶来顶去:数字一变化,新字符就从自己位置下方 8px 滑入,而这一行与对话共用宿主同一个滚动容器——滑入的那几像素越过输入区底边,把容器的可滚动高度顶大 3px(实机测得 1649 → 1652),末尾跟随随即补偿,输入卡片与上方对话跟着上下跳一次,动画落回时再跳一次;流式输出期间每个数字都在动,这一跳就一直重复。现在这一行把自己裁掉(overflow: clip),入场留在行内,容器的可滚动高度不再跟着数字变化。端到端通道的 statsPosition 场景新增一条读数:在同一帧里写一次数字、量容器可滚动高度的增量,必须是 0(改前为 3)。
  • 会话数字那一行不再把上方的对话推来推去:窗口窄到这一行放不下时,它按台阶让位,第三个台阶让出的是计量环旁的数字,而那个数字正是宿主触发按钮的高度——按钮一矮,输入区底部这一行就跟着矮,上方的对话按这一行排、并把末尾钉在它上面,于是数字每跨过这一档,整屏内容就上下跳一次,来回两下。现在让位只让出宽度:触发按钮保持一行的高度(20px 行高加宿主自己的上下各 1px),圆环留在原位,行高不随台阶起落变化,对话也不再移动。端到端通道的 statsPosition 场景新增一条读数:在同一帧里量「让出读数」与「读数在位」两种情况下这一行的高度,两者必须相同。

移除

  • 「聊天区动画效果」不再是三档,也不再是两档分段控件,而是一个开关:开启时播放本插件的这一套,关闭时把聊天区交回宿主。上一版接在「重绘」档上的会话视图(插件自己渲染的对话区:链路折叠与计数行、推理卡片、逐词淡入、按宿主「工作步骤展示」分档的收拢、子会话的第二份视图)整体移除,那套实现来自 dsh-better-display 的整份移植,读者装上那个插件就能得到同样的界面,本插件再维护一份的代价大于收益。此前存下「重绘」或「增强」的读者照旧开着这一项,存下「关闭」的照旧关着,不需要重新设置。同时移除的还有:插件自己的「工作步骤展示」桥接、只为阅读视图装上的宿主内部开发依赖与 TSX 工具链、端到端场景 reader / readerOpen / readerTurnNav / stepDisplay 与冒烟用例 chat-reader。搬到开关下的两处视觉仍出自那个实现,它的许可说明留在第三方声明里。搜索面板点开内容命中仍在会话里落到那一轮,改经宿主的刻度跳转。

其他变更

  • 端到端通道与 packages/testing/dsh-web.cjs 起的临时宿主随启动它的进程一起结束:此前启动进程被强制终止或抛出未捕获的错误时,dsh web 实例留在后台继续占用端口与 $DSH_HOME,它的目录随后被删掉时还会持续占满一个以上的 CPU 核心;现在启动进程无论以哪种方式结束,宿主都在随后一秒内退出。

New Features

  • The Sidebar tab gains a Search box style choice under Sidebar search: Cover the brand (the default) keeps the box in the brand row, standing over the brand while the pointer is over the sidebar; Standalone gives it a row of its own under the brand row, shown always; Icon draws no box of the plugin's and keeps DSH's own search button in place with only its click taken over, so pressing it opens this plugin's palette. Switching needs no reload.
  • The line of numbers under the input card has its own popover again: that line showed six readings, while the detail the host's statistics row carries — model time, tool time, first-token average, output speed, and the usage rows for cache hits, uncached input, cache reads, cache writes and output — had nowhere to be read with the statistics asked onto a line of their own. The line is now the second trigger of the host's context panel: pressing the figures opens that panel above the line, holding the same session's data — the host's own context rows followed by the numbers' own detail rows, filled from one source in either position; pressing again puts it away, Enter or Space does the same from the keyboard, Escape closes it, and the line reports its own expanded state while the panel stands. Opening and closing on hover stays the ring's own path: resting a pointer on the figures never unfolds the panel. The panel re-takes its placement when the window or the composer changes.
  • The settings page's Conversation tab gains Conversation statistics position: the session statistics and the token usage used to have one place to live — the popover of the composer's context ring. By default they now stand on a line of their own below the input card: the turns and steps, the output speed, the tokens read in and written back and the cache-hit share, with the ring itself at the end and none of the host row's icons; Inside the context popover is still available for the panel's own set. A figure on that line re-enters character by character whenever it moves (every step and all through a streaming answer, while the figures that did not move stay still), and the cache share and the ring each take their own colour band (the share from red in the nineties to dark green at 99%, the occupancy from green at a fifth to red at two fifths, mixed between stops by the browser in OKLCH). A window too narrow for the whole line makes it give way in a fixed order — first the cache share's words, then the turns and steps, then the number beside the ring (the ring stays), then the tokens read in and written back as one total without the arrows, and last the counts folded into k / M / B — so figures never crowd each other or draw over one another, and the same order gives them back as the window grows. The row answers to a setting of its own from now on rather than sharing the permission control's switch, and the settings form carries one more field, which a running host serves after a restart.
  • The Claude Style page in the settings dialog now ends its heading row with a GitHub mark; pressing it opens the plugin's repository (https://github.com/Nwflower/dsh-claude-style) in a new tab. The mark takes the secondary label ink, following each palette; the pointer gets the skin's hover plate with a darker mark, the keyboard gets an accent focus ring, and the accessible name reads "Open the plugin on GitHub". The copy on the plugin's own page keeps the host's heading and carries no mark.

Improvements

  • On a Chinese interface the permission selector names its tiers in the host's own Chinese words: the trigger's current tier and every popover row used to read the skin's fixed Claude names (Read only / Accept edits / Full access) with only the description line under each name in Chinese; with the interface in Chinese those names now come from the host's permission.access dictionary — 仅可查看 / 工作区内修改 / 完全权限 — so the skin follows the host when it rewords them, while any other interface language still reads the skin's names.
  • The sidebar search's session-content search answers at once instead of after a wait...
Read more

v0.12.1

Choose a tag to compare

@github-actions github-actions released this 09 Oct 16:16

中文 | English

新增功能

  • 「聊天区动画效果」的「重绘」档换上插件自己的会话视图:它直接占据宿主「对话」视图的位置,标签条上不再多出一个标签,宿主转到「对话」的跳转同样落到它;档位离开「重绘」时宿主的「对话」原样回来。轮次进行中,新出现的一段思考把同一条链上此前的思考、正文与工具收成一行(思考×N · 输出×M · 工具×K),数字随内容跳变,用户插话重新开一条链,收拢走收缩、计数、停顿、展开四段时序;轮次成功结束后过程与中间叙述收起、只留最终回答与它的复制、分叉、反馈操作,失败、中断与等待批准的轮次保持展开,读者选中文字期间推迟折叠,历史轮次随时可以点开。思考在卡片里按阅读节奏滑动跟随,卡片只放思考的文字,读者滚回末尾即重新跟随;收进折叠的思考每段只占一行,写作「思考 · 内容」并带着思考卡片的边框,与中间输出一眼分开,按一下边框随全文展开;正文由宿主的 Markdown 渲染,新出现的词逐个淡入;工具行写出目标、改动行数与慢调用的计时,展开后是宿主自己的工具详情、输入与原始记录。轮次进行中的每一种状态(等待模型、思考、输出、准备与使用工具、等你操作)都由最新一条消息下面同一行说出;等待模型时这一行计时,过 10 秒标出「暂未响应」,进行中的过程也从这一行展开与收起。页面上装有 dsh-better-display 的阅读视图时这一份不登记;桌面端随带的 0.2.0 宿主与 npm 上的 0.2.1 宿主都能读。「动画」设为「减弱」时一律直接落位。
  • 模型选择器的每一行标出该模型此刻的倍率:峰价、谷价与限时活动三种状态各有自己的图标,颜色区分贵与便宜,倍数后面跟着距离切换还有多久,鼠标停在徽章上读到「此刻的判定 · 多久后转为哪个状态」的完整一句,距切换不足一分钟时读 <1m。判定按各家供应商自己发布的作息表与自己的时区做(工作日窗口之外、周末与法定节假日整日算谷价,跨零点的窗口归它开始的那一天,夏令时切换按真实时刻计算,落进夏令时空档的窗边落在跳变那一刻);没有作息表的模型不显示徽章,把标准费率整天在走的供应商按其作息表显示。限时活动按文档声明的日期与时刻边界起止(结束时刻就是切换那一刻,已经结束的活动不会再生效)。作息表来自公开目录 offpeakclock.com 的一份快照:宿主半边取一次、在 $DSH_HOME/cache/dsh-claude-style/peakrate.json 留一份缓存、每 24 小时刷新一次,经 /dsh-claude-style/peakrate 下发(POST 强制重拉),连不上时按插件包里带的那份判定;浏览器半边只在功能装上时读一次,第三方地址不经过页面。构建核对匹配表里每一行点到的那条作息确实在包内快照里、且属于同一个供应方,对不上即构建失败。设置页「输入区」页新增「峰谷电表」子项,关闭后各行的徽章消失,模型选择器关闭时该项目变灰不可操作。

体验优化

  • 设置页「对话」页的「聊天区动画效果」从开关改成三档分段控件:关闭、增强、重绘。「关闭」把聊天区交回宿主;「增强」是原来的全套动效(跟随、自动开合与卷帘门、新文字淡入、文件变更行、聊天气泡动效);「重绘」交给另一套动效,接上的是聊天气泡动效与插件自己的阅读视图。旧版本存下的开关取值照旧生效(开 = 增强,关 = 关闭),不需要重新设置。
  • 页面启动时插件占用的主线程时间减少:设置页、内容搜索、吉祥物、发送动效、对话导航、上下文弹层与封号彩蛋这七个首屏可以缺席的功能离开 lib/client.js,各自成为一个块,由插件已有的资产路由 /dsh-claude-style/assets/ 提供,页面被接管后立即请求、到达后安装。在本地临时宿主上实测(两种产物各载入 20 次取中位数):lib/client.js 从 776 KB 降到 712 KB,前 3 秒的主线程长任务从 713 ms 降到 648 ms,皮肤生效时刻从导航后 298 ms 提前到 280 ms;七个块经 brotli 压缩后共 33 KB,比主产物晚约 5 ms 到达。块与它的 source map 各自按自身内容的哈希命名,浏览器不会把旧的 map 当成新的那份;构建拒绝主产物与块同时携带同一个模块(构建期生成的模块也在其中,它经共享表读主产物里的那一份)。插件更新后页面换代时,块已经在磁盘上:构建把主产物写在最后,先写新资产、再写清单、最后删清单里没有的文件。
  • 设置页「侧栏」页新增「面板悬浮卡片」开关:开启(默认)时右侧栏停靠的面板仍是悬浮卡片——四周留 8px、16px 圆角、1px 描边与投影;关闭后停靠的面板铺满整列、贴住四边,分栏时每栏铺满各自那一栏,两栏之间只留宿主的接缝线。切换不需要刷新页面。
  • 模型选择器每一行的说明改由一张按名字模式认领的有序规则表得出:带上日期后缀、把官方点号写成连字符或下划线(glm-5-3-flashx)或换一个售卖方前缀,仍然读到同一句;k3-256k、ernie-5、minimax-m3-1m、deepseek-v41-flash 这类目录拼法各自落到所在产品线的规则上,不必再逐条登记。带版本数字或最高级的说明写成锚定该版本的规则(glm-5.3、gpt-5.4、qwen3.8-max、step-3.7-flash、celeris-1 等),同产品线的其他版本读到线级文案;目录里现有的 25 个模型 id 里,除 Grok 与 ERNIE 两行按另一条记录改写外,其余解析出的句子与改动前逐条相同。
  • 「重绘」档里轮次进行中的那条状态行(「正在思考」「正在使用工具」这些)上下各收进 30px,贴着最新一条消息读,不再像独占一行。实测:该行与上方轮次之间原有的 26px 空隙收掉,行内文字与它的下一条内容之间的距离也少 30px;这一行仍按内容居中,高度不变。为了让它在压上去时不露出旧内容的接缝,这一行补了一圈底色投影,并抬到上方内容之上。
  • 「重绘」档的思考卡片只留思考本身:参考实现搬来的「思考 · 第 N 步」抬头、「暂停跟随 / 跟随最新」与「完整阅读 / 收起」两个按钮,以及为展开态在会话里量出的阅读高度都不再出现,卡片的边框里就是思考的文字,高度由预览高度与内容决定。跟随仍按阅读节奏走,滚回卡片末尾就重新跟随,而上一版要靠按钮点回来的那一步现在由滚动自己完成;展开一段思考仍是从折叠里那行文字点开,于是每段思考在折叠里保持一行,读全文按一下即可。
  • 「重绘」档的一轮过程现在按宿主「工作步骤展示」的当前档位成形,两侧设置不再各行其是:插件不新增自己的档位控件,只读宿主 ui-chat 命名空间的档位并在每次有轮次开始时重读,读不到时按网页端缺省档「详细」。「简洁」把整条链收成一行,中间输出的正文也进这一行的计数;「标准」收拢最后一段思考之前的全部步骤,中间输出随最后一段思考留在行外;「详细」把结尾的中间输出留成自己的一行、收拢它之前的全部步骤;「完全展开」与「详细」同形,另外把收进折叠的思考画成整张推理卡片(全文,而不是「思考 · 内容」一行),工具仍由读者自己按开。宿主自己的设置行仍是唯一控件,插件不代写。
  • 模型选择器里 Grok 与 ERNIE 两行的说明改写:Grok 的规则从匹配 4.5 改成匹配 Grok 4 整条产品线,grok-4、grok-4.5、grok-4-2026 这些拼法读到同一句「全球最智能的模型之一,支持原生工具使用以及实时搜索功能。」;ERNIE 5 一行改成「2.4 万亿参数的原生全模态大模型。」,不再列激活比例与上下文长度。
  • 插件的样式表以压缩后的文本随包发出:注释与排版只留在源文件里,整张样式表从 349 KB 降到 208 KB,lib/client.js 从 712 KB 降到 570 KB。页面画出的样子不变:端到端通道把压缩前后的两份样式表放到同一个页面上,22 个页面状态逐元素比对计算值,全部一致。压缩还把 !important 审计过去豁免的一部分规则变成可以逐条判定的(同一个属性写两遍的规则,压缩后只剩一条声明):判定之后,输入区停止按钮、侧栏进行中指示与聊天区跟随尾部上页面并不需要的 46 处 !important 从源样式表里去掉了。审计也随之收紧:处在条件不成立的 @media / @supports 里的规则不再参与判定,它们的 !important 不会因为页面当时不在那个条件里就被判成多余。在本地临时宿主上实测(两种产物各载入 20 次、做两轮,取中位数):插件包的求值时间从约 9.0 ms 降到约 8.3 ms;启动阶段的其余计时差别落在两轮之间的波动以内。

问题修复

  • 长会话里流式输出期间的卡顿减少:跟随在每一批文字到达时都要问的几个问题不再落到整个文档上——会话的滚动容器与消息列读一次后保留(换会话、切「轨迹」页签时旧节点会从文档里移除,届时重新读取),流式标记改在消息列里查找,宿主「回到底部」按钮的存在本身就是「跟随已关闭」的判据,而同一帧里读到的高度只读一次,交给收回宿主写下的末尾、判断是否继续滑行这两处共用。在 120 轮、4286 个节点的临时会话上实测:插件发出的文档级查询从 3263 次降到 2762 次(−15%),整页最长的一次停顿从 270ms 降到 234ms;文档越大,省下的每次全页样式重算越多。
  • 模型选择器里当前在用的模型、当它所属的供应商不在第一级列表里时,会单独占一级列表最下面一行——这一行过去绕过了其余各行共用的行构造,因此没有峰谷徽章,也没有厂商标志与说明;现在它与列表里的每一行走同一个构造,徽章、标志、说明和行高内边距都一致。
  • 「重绘」档里收进折叠的一段思考,展开后再点它的文字没有反应,只能点右侧的折角按钮才能收起。文字上的点击此前只在收起时挂着,展开后整行文字只剩选择文字的作用。现在文字两态都可点:收起时点它展开,展开时点它收起;一次以选中文字收尾的落点不改开合,选中文字期间推迟折叠的行为照旧。
  • 进行中的状态行不再随流式内容上下跳动。此前该行只在宿主自己的「跟随还开着」标记下钉住,而流式期间跟随的滑动会把滚动位置停在末尾之前,宿主把这次写入读成读者离开了末尾并摘掉标记,于是每一片内容到达时该行退回文档流、被内容底部推下去,滑动追上来再把它拉回:视口 1280×600 下实测,标记缺席的 115 帧里该行顶边在 447px 与 573px 之间移动,而钉住位是 426px。现在滑动持有位置期间在聊天列上写下自己的标记,该行按宿主标记或滑动标记任一钉住,内容突发的追加不再带动它:同一场景里标记缺席的 112 帧内顶边恒为 426px。往回翻看历史时两个标记都不在,该行照常留在文档位置,不会浮在读者正在读的内容上。
  • 「重绘」档里轮次状态行的文字在长短之间切换时,被替换下去的那一段会暂时折成两行、溢出状态行的高度(视口 1280×900 实测:状态行高始终 32px,而退出中的文字片段为 84×48px)。原因是两层文字在替换的同一帧里用新文字的宽度排布了旧文字:状态行按隐藏的丈量层取宽,绝对定位的文字层虽然被同一层撑开,浏览器在这一帧仍把旧文字按它原来的窄宽度断行。现在丈量层与被替换的两层都不换行,文字生长期间各行始终单行,状态行高度不再跳变。
  • 修复 重新编译后设置页等延后功能从设置里消失、要重新开关插件才回来:构建原先先写 lib/client.js、几秒之后才重写 lib/assets/,而客户端热重载只认主产物,页面在新块落盘之前就换代,按当时那份清单请求新块得到 404,延后的功能各报告一次并退役。现在资产按「先写新文件、再写清单、最后删清单里没有的文件」落盘,lib/client.js 写在最后:换代的那一代要的块已经在磁盘上、也已经在清单里。

其他变更

  • 开发机上新增构建标记 DSH_CLAUDE_STYLE_DEBUG=1:链接安装的检出重建时,资产清单继续带着上一代仍然存在的条目并保留它们的文件,宿主在启动时读到旧主产物的页面不会因为一次重建丢掉延后的功能。发布构建与持续集成里这个标记不生效,清单就是这一次构建自己的资产;构建日志会说明当前处于哪一档。
  • 构建把 Deepy 帧图的矢量化结果与资产的 brotli 压缩结果按输入哈希缓存在 .debug/build-cache/,只改 TypeScript 后的重建从约 14 秒降到约 1.7 秒,lib/ 与不带缓存时逐字节相同;新增 npm run dev,监听构建读取的目录,每次保存后重新构建(带 DSH_CLAUDE_STYLE_DEBUG=1),构建失败时保留上一次的 lib/ 并继续监听。

New Features

  • The Redraw tier of Chat-area animations swaps in the plugin's own conversation view: it takes the place of the host's Chat view itself, no extra tab appears in the strip, and whatever the host sends to Chat lands on it; leaving the Redraw tier brings the host's Chat back as it was. While a turn runs, a new thought folds the thinking, output and tools before it in the same chain into one row (Thinking×N · Output×M · Tools×K) whose figures roll as the work grows, a message from the reader starts a new chain, and each fold runs a shrink, count, pause, reveal sequence. Once a turn completes, its process and interim narration fold away and the final answer stays with its copy, branch and feedback actions; a failed, stopped or waiting turn stays open, a text selection holds the fold, and any past turn opens again. Thinking glides inside its card at reading pace, the card holds the thought's text alone, and scrolling it back to its end resumes the follow; a thought inside a fold takes one line, reading "Thinking · …" inside the thinking card's frame so it never passes for interim output, and a press grows the frame to its whole text; the answer is the host's own Markdown with each new word fading in; a tool row names its target, the lines it changed and how long a slow call has run, and opens onto the host's own tool view, its input and the raw record. Every live state of a running turn (waiting on the model, thinking, writing, preparing and using a tool, waiting for you) is said by one line under the newest message; while the model is silent the line times the wait and marks it "No response yet" past 10 seconds, and the running process opens and closes from it. With dsh-better-display's reading view on the page this one does not register; it reads both the 0.2.0 host the desktop ships and the 0.2.1 host on npm. With Animation set to Reduced everything lands at once.
  • Every row of the model picker now carries the rate in force for that model: peak, off-peak and a dated promotion each get their own mark, the colour separates expensive from cheap, the multiplier is followed by how long it lasts, hovering the badge reads one line — the judgement now, and what it becomes and when — and a switch under a minute away reads <1m. The judgement is made from each provider's own published schedule in that provider's own time zone (outside the weekday windows, and on weekends and public holidays in full, the rate is off-peak; a window crossing midnight belongs to the day it starts; a daylight-saving change is resolved against real instants, so a window edge inside a skipped hour falls at the transition), and a model with no schedule published carries no badge while a provider billing a flat standard rate all day keeps the badge its schedule describes. A dated promotion runs between the day and instant bounds the document states (its closing instant is the switch itself, so an expired promotion never applies again). The schedules come from one snapshot in the public offpeakclock.com catalog: the host half fetches it, keeps a copy in $DSH_HOME/cache/dsh-claude-style/peakrate.json, refreshes every 24 hours and serves it over /dsh-claude-style/peakrate (POST fetches again first), and falls back to the copy shipped in the package when it cannot be reached; the browser half reads it once when the feature installs, and the third-party address never goes through the page. The build checks that every row of the mapping table names a profile the shipped snapshot yields and belongs to the same provider, and fails on a row that does not. The Composer settings tab gains a Peak rate meter sub-row under the model picker: off removes the badges, and turning the picker off greys the row out.

Improvements

  • The Conversation tab's Chat-area animations row is a three-way segmented control now — Off, Enhanced and Redraw — in place of its switch. Off hands the conversation back to the host; Enhanced is the set that was there before (the follow, the automatic folding with its rolling door, the text fade, the file change rows and the send flight); Redraw hands the area to a second set, whose members are the send flight and the plugin's own reading view. A switch value stored by an earlier build keeps its meaning (on reads as Enhanced, off as Off), so nothing has to be set again.
  • Less main-thread time at page start: seven features the first frames can do without — the settings page, content search, the mascot, the send animation, the conversation navigator, the context popover and t...
Read more

v0.12.0

Choose a tag to compare

@github-actions github-actions released this 07 Oct 16:01

中文 | English

新增功能

  • 桌面端把会话标题与标题行里的控件抬进窗口顶端的标题栏:标题靠左、控件靠右排在窗口按钮之前,标题行剩下的内容左移并上提到标题下面;放不下的一侧留在原来的行里。

体验优化

  • 插件主文件缩小一半:浏览器每次启动都要读取并解析的插件主文件此前是 1.6 MB(1,619,502 字节),现在压缩后是 0.8 MB(816,520 字节)。
  • 右侧栏停靠的面板改成一枚悬浮卡片:四周各留 8px、16px 圆角、1px 描边与宿主面板自己的投影,列后面的画布从缝隙里透出来;分栏后每一栏的面板各有一枚卡片,拖出来的浮动面板保持宿主自己的窗口样式。
  • 小鲸鱼的帧图改为矢量取用:Deepy 的 18 张帧图此前由浏览器在某个动作第一次出现时下载 PNG、在画布上重建成矢量、再存进 Cache API;现在构建期就把它们转成矢量,按内容哈希长期缓存。第一次播放不再有重建的停顿,观感与之前一致;随包携带的帧图从 426 KB 变为 658 KB(brotli 后)。
  • 浏览器里的侧栏品牌行:非桌面外壳(浏览器页面)下侧栏品牌行是这一列的第一行,列顶部只有 6px 内边距,logo 贴着窗口上沿;品牌左侧也比「新会话」的加号圆片靠左 8px。现在浏览器页面给这一行加 8px 顶部边距,品牌带上这一行自己的 8px 左内边距,鲸鱼/星芒的左缘与加号圆片的左缘对齐。桌面外壳(Windows 标题栏、macOS)与折叠后的窄栏不变。
  • 进行中的状态行不再随内容上下跳动:宿主把「深度求索中」这一行画成聊天流的最后一行,答案流式追加时它跟着内容底部一起被推下去、跟随的滑动再把它拉回来,盯着末尾看时就是不停跳动。现在只要读者的跟随还开着,这一行就钉在输入框上方(输入框高度 + 上方的渐隐带 + 宿主的 16px 正文内边距),也就是跟随追上时它本来停的位置:突发的追加不再带动它,往回翻看历史时它照常留在文档位置,不会浮在读者正在读的内容上。
  • 分栏的右侧栏:两栏各自仍是独立的圆角卡片,中间那条分栏线不再画(拖动时的提示照旧),两栏之间的距离从 16px 收到 6px,每栏到列边的距离从 8px 收到 6px。
  • 手机宽度下的输入框下沿:权限选择器收起下三角,权限与模型选择器按窄屏上限截断,上下文只留圆环不显示数字;那一行同时不再溢出卡片——模型名随行收缩、输入框下方的停靠层不再保留桌面那两份留白,圆环因此回到卡片里、也不再压在推理等级上。
  • 输入框下沿的权限档位:按钮不再画下三角(任何宽度都是),档位名过长时在按钮内截断;已经打开的档位卡在布局移动时会重新贴回它的触发按钮,而不再留在原处。
  • 宿主的「回到底部」按钮改到输入框上方的正中:它原先长在对话栏右缘,正好压在站在输入卡片上的吉祥物身上;按钮仍是宿主的那个,皮肤只挪位置。

问题修复

  • 启动之后才选的皮肤也会接手页面:页面载入后才在皮肤中心选中别的皮肤时,本主题不让出页面,两套视觉叠在一起。现在无论页面启动时归谁,皮肤到来就让出、离开就接回,都不需要刷新。
  • 右侧栏「开始」页的项目一屏放不下时,整列被上下同时裁掉,既看不到第一项也滚不到最后一项;现在这一列自己滚动,列表短时依旧居中。
  • 发送时飞行的气泡从第一帧就是气泡的颜色(#29):替身此前带两层底色——输入卡片的底色压在上面、气泡的底色在下面——随形状一起互相过渡;形状早已收成气泡,上层还没退完,读者看到的气泡先发白,在 DeepSeek 档下正是 Claude 档那条灰气泡的样子,过半秒才变蓝。现在底色画在那层始终等于形状的壳上,按下那一刻起就是目标气泡自己的颜色,没有哪一层能落在形状后面。卡片的描边与阴影照旧随形状收掉,并在形状归位的那一刻写定、撤掉各自的动画,不会在收窄完成后多留一帧。
  • 成本计量插件停止写入后,用量面板把它覆盖的历史(8/24 起 26 天、11.23B Token)整份丢掉,改由会话日志现折,面板只剩日志还在的那部分(13 天、6.47B);现在两个来源按日期合并,账本认识的天仍用账本的数,只有它没覆盖的日期由折算补上,面板恢复完整历史。
  • 与壁纸插件共存:0.11.1 在启动时已有壁纸渲染(body[data-we-wallpaper])的页面上整页让出,「与其他主题插件同时使用」里壁纸透过侧栏与玻璃弹层的效果随之失效。现在只为皮肤中心的皮肤(html[data-dsh-skin])让路,壁纸在渲染时本主题照常工作。对外契约:不再读取 body[data-we-wallpaper]。
  • 发送的替身不再在真实消息行缺席时淡出:宿主的回显气泡只活约 159 毫秒,真实消息行要一秒以上才挂上,而替身按自己的时间表在 400 毫秒落地淡出,那一段里目标位置空着——读者看到刚发出的气泡淡成页面背景,随后整条又冒出来。现在降落前先确认有一条行在页面上可以交接:没有就把替身停在原地(保持可见、继续跟随目标位置),真实行一到立刻交接;宿主始终没挂上行时按 2.5 秒兜底把页面交还宿主。
  • 设置页不再多出一层内边距:皮肤自己的设置页带了 24px 横向内边距,而宿主的选项列本来就有 24px,于是整页比其余设置页(宿主自己的与别的插件的)向右缩进 24px、顶部也多 20px。现在横向不留内边距,顶部只留宿主行自己的 16px,标题与第一行文字和其余设置页在同一条竖线上。
  • 吉祥物的分段控件回到右侧:吉祥物这一行此前固定把控件排到文字下面(与品牌卡片同一套排法)。现在控件与文字同占一行、靠右对齐,只有在放不下时才落到下一行并从左边开始——判定用文字列的最小宽度(220px),控件本身不收缩。
  • 欢迎语与账号区跟随登录的 DeepSeek 账号:此前这两处只显示自定义用户名或本机系统用户名,登录账号的昵称从不出现;现在桌面端登录后显示账号昵称,自定义用户名仍然优先,账号资料读不到时才回退到 HDSL 昵称与本机系统用户名。
  • 顶栏里的对话 / 轨迹标签条:标题与控件分列两侧时,标签条改取两者之间余下空当的中线(原先按窗口居中,两侧有内容后看着偏左);鼠标在对话区时标签条重新能唤起(本表自己的静置透明度带 !important,唤起规则少了它就一直压不过去,网页端同样受影响)。
  • 顶栏里的会话标题不再过早截断:标题的可用宽度改为直接留出标签条自身的宽度与两侧的空隙,而不是去读标签条「按窗口居中」时的位置——标签条随后会被推到标题与控件之间的中线,那个位置本来就会被放弃,标题因此在小一半的宽度上就开始省略号。标题同时下移 2px,在标题栏里读起来才是垂直居中。
  • 用对话导航跳到某一轮之后,新输出不再把位置拖回页底:跳转算读者自己选定的阅读位置,接管与滚轮相同,跟随与流式滑行在这一期间让开,读者自己回到页底时解除。

其他变更

  • 公开路由变化:GET /dsh-claude-style/deepy/<动作>.png 不再提供,帧图改由 GET /dsh-claude-style/assets/<内容哈希>.svg 提供;品牌标志、厂商组合标与螃蟹帧图同样由这份构建清单决定内联进产物还是走这条路由(小鲸鱼的 18 张帧图走路由)。更新插件后需要重启宿主,早于本次构建的宿主半边没有这条路由,小鲸鱼不会出现(控制台提示一次)。
  • 附带 source map:npm 包里新增 lib/client.js.map,浏览器开发者工具里的报错位置与断点能对应到插件源码。
  • Anthropic 字体的投放点迁到宿主目录:把两款 Anthropic 字体复制进插件包 fonts/ 目录后界面仍用替代字体,那个位置已不再被读取。现在的投放点是 $DSH_HOME/dsh-claude-style/fonts/(没有设置 DSH_HOME 时是 ~/.dsh/dsh-claude-style/fonts/):放在这里的文件优先于包内的同名文件,缺失时照旧 404 回退到系统字体与替代字体。随包分发的四款字体与它们的授权文件改由构建写入 lib/fonts/,仓库里的字体文件移到了 packages/assets/src/fonts/,两款 Anthropic 字体在其 anthropic/ 子目录里,仍然不随 npm 包分发。

New Features

  • On the desktop the conversation's title and the header's controls rise into the window's own caption row — the title at the left, the controls at the right before the window buttons — and what is left of the title row closes up to the left and rides up under the title. A side without room stays in the header's own row.

Improvements

  • The plugin's main file is half the size: the file the browser reads and parses on every start was 1.6 MB (1,619,502 bytes); minified it is now 0.8 MB (816,520 bytes).
  • A panel docked in the right sidebar is a floating card: 8px inside the column on every side, a 16px radius, a 1px hairline and the host's own panel elevation, with the column's canvas showing through the gap. Each column of a split dock gets its own card, and a panel pulled out of the sidebar keeps the host's own floating window.
  • Deepy's frames are taken as vectors: the whale's 18 sheets used to be downloaded as PNGs the first time an animation appeared, rebuilt into a vector on a canvas and kept in the Cache API; the build now produces the vectors and they are cached for good under their content hash. The first play no longer pauses to rebuild and the whale looks the same; the sheets that ship with the package go from 426 KB to 658 KB (brotli).
  • The sidebar brand row in a browser: without a desktop shell the brand row is the column's first row, so 6px of column padding was the whole inset and the logo sat against the window's top edge; the brand also started 8px left of the New session plus chip. A browser page now gives that row 8px of top margin and the brand the row's own 8px leading inset, so the whale or starburst's left edge lands on the chip's. The desktop shells (Windows titlebar, macOS) and the collapsed rail are unchanged.
  • The running status line no longer rides the content: the host draws its "deep diving" row as the chat flow's last row, so every burst of a streaming answer pushes it down and the follow's glide drags it back, which reads as continuous jumping at the tail. While the reader's follow is on, the row is now pinned above the composer — the composer's height, the fade band above it and the host's 16px transcript padding — which is where it already comes to rest once the glide has caught up: a burst no longer moves it, and scrolled back through history it keeps its document place instead of floating over what the reader went back to read.
  • In a split right sidebar each pane stays its own rounded card: the line the dock draws between them is gone (the drag highlight stays), the gap between the two comes in from 16px to 6px, and each pane now sits 6px from the column's edge instead of 8px.
  • The composer's bottom line at a phone's width: the permission control drops its chevron, the permission and model controls truncate at narrow-screen caps, and the context meter keeps the ring without its number. The row no longer runs past the card either — the model name shrinks with it and the dock line under the card gives up the two desktop-sized reserves — so the ring lands inside the card instead of under the reasoning level.
  • The permission tier control on the composer's bottom line drops its chevron at every width, not just on a phone, and a long tier name truncates inside the button. An open tier card is also placed again when the layout under it moves, instead of hanging where its trigger used to be.
  • The host's back-to-end button now sits centred above the composer. Its shipped place is the conversation column's right edge, which is where the mascot stands on the composer card; the button stays the host's own and only its placement is the skin's.

Bug Fixes

  • A skin picked after the page loaded takes the page too: picking another skin in the Skin Center once the page had loaded left this theme on the page, two looks painted over each other. Now the theme gives the page up when a skin arrives and takes it back when the skin leaves, whichever way the page booted, without a reload.
  • The right sidebar's start page clipped its entries at both ends once the list outgrew the pane, hiding the first rows with no way to scroll; the column scrolls now, and still centers the list while it fits.
  • The flying bubble is the bubble's colour from the first frame (#29): the stand-in carried two fills — the composer card's over the bubble's — cross-fading as the shape narrowed, and the shape was already a bubble while the upper fill was still there, so the reader saw a pale bubble (in the DeepSeek palette, the colour the grey bubble has under Claude) that only turned blue half a second later. The fill is now painted on the one layer that is the shape at every step, so it is the destination bubble's own colour from the moment of the press and no fill can fall behind the shape. The card's hairline and shadow still leave with the shape, written and cancelled on the frame the shape settles rather than lingering a frame past it.
  • Once the cost-meter plugin stopped writing, the usage panel discarded the whole history the ledger covered (11.23B tokens over 26 days from 8/24) and fell back to folding the session logs, which left it with only the part the logs still held (6.47B over 13 days); the two accounts now merge by date, the ledger keeps the days it knows and the fold fills only the dates past its newest, so the panel shows the whole history again.
  • Sharing the page with a wallpaper plugin: 0.11.1 gave the whole page up when a wallpaper was already rendering at boot (body[data-we-wallpaper]), which lost the wallpaper showing through the sidebar and the glass popovers described under Alongside other theme plugins. Now only a Skin Center skin (html[data-dsh-skin]) makes the theme yield; while a wallpaper renders the theme keeps working. External contract: body[data-we-wallpaper] is no longer read.
  • The stand-in no longer fades out with no message row to land on: the host's echo bubble lives about 159 ms while the real row takes over a second to mount, and the stand-in faded out on its own 400 ms schedule — with nothing at the destination, the reader watched the bubble they had just sent fade into the page and then the whole message pop back. The hand-over now waits until there is a row on the page to take the message: the stand-in holds where it is (visible, still following the destin...
Read more

v0.11.1

Choose a tag to compare

@Nwflower Nwflower released this 06 Oct 16:43

中文 | English

新增功能

  • 与皮肤中心交接:DSH 皮肤中心把本主题列为可选皮肤。选中它即把整页交给本插件,换选其他皮肤、官方默认或壁纸在跑时页面自动交还,无需刷新。判定读皮肤中心注入服务端 HTML 的 html[data-dsh-skin] 与壁纸插件的 body[data-we-wallpaper],两者任一存在即让路:让路期间不挂样式表、不安装功能、不占用任何文档属性,只保留设置页与偏好。构建在 body 上盖 data-dsh-claude-style-handoff 标记自己支持让路。

New Features

  • Skin center handoff: the DSH Skin Center offers this theme as a selectable skin. Selecting it hands the whole page to this plugin; selecting another skin, the official default, or a running wallpaper takes the page back without a reload. The verdict reads the html[data-dsh-skin] attribute the Skin Center injects into the served document and the wallpaper plugin's body[data-we-wallpaper]; either one means yielding, and while yielded the theme mounts no stylesheet, installs no feature and claims no document attribute, keeping only its settings page and preferences. A build stamps data-dsh-claude-style-handoff on body to say it can do this.

Full Changelog: v0.11.0...v0.11.1

v0.11.0

Choose a tag to compare

@Nwflower Nwflower released this 06 Oct 15:18

中文 | English

新增功能

  • 对话导航:对话区右侧的轮次短横线改由插件绘制,间距与展开后的列表行高一致。鼠标碰到它立刻展开成一张列表,每一轮一行,写着开启这一轮的那条消息,每一行正好落在它那条短横线原来的位置上,正在读的那一轮保持原位;滚轮上下翻,点一行页面滑到那一轮(只滑最后一小段,约三分之一秒),还没加载的早期对话先加载再跳;指针停在列表上时,对话区顶部的对话 / 轨迹标签照常显示。Alt+↑ / Alt+↓ 跳到上一轮或下一轮,连按会接着走,输入框里有草稿时不接管;跳到的那一轮开头闪一条短横线。同时装着 dsh-plugin-msg-nav 时 Alt+↑ / Alt+↓ 留给它。设置页「对话」页新增「对话导航」开关,默认开启,关闭后恢复系统原来的轮次短横线与悬停预览。

体验优化

  • 聊天区跟随的滑动更平稳:流式输出时每来一行,画面滑完都会多跳一下(约 1.7 像素);代码块这样的大块内容到达时,滚动一下子就冲到最快。现在滑动从静止平稳起步、停下时不再跳动;最新一行被压在屏幕下缘的时间按回放测算少了约四分之一到三分之一(一行一行输出时 533 → 400 毫秒,快速输出时 1350 → 1000 毫秒)。超过 1200 像素的距离不再一帧跳过去,而是先到离目标 1200 像素处,再滑完剩下的一段。
  • 聊天气泡动效落地更平滑:飞行结束的那一刻,气泡里的文字会瞬间变深、像换了字重。现在落地时真实气泡在飞行的气泡下面先显示出来,飞行的那份在 0.16 秒内淡出,文字是逐渐变清晰的;上浮的终点也正好落在气泡上,不再差出一两个像素。

问题修复

  • 流式输出时画面不再忽而一下子顶上去、忽而往回掉:正文变长时,聊天区有时一下子跳到最底,有时底部的状态行先往下掉一截再滑回来——宿主自己的贴底与插件的平滑跟随在同一帧里先后改写滚动位置,宿主那一下总是后写、直接画了出来,下一批文字到达时插件又把已经显示出来的位置拉回去。现在宿主的贴底在画出来之前就交给平滑跟随,正文变长时画面只会平稳上移;在本地一段带停顿的模拟输出里,停顿后头几行直接跳到最底的情况从每段都有变为没有,位置往回退的帧数为零。切换会话之后同样如此。
  • 聊天气泡飞行时的底色跟着变成气泡的颜色:输入框的底色画在卡片里层时(首页的输入框就是这样),飞起来的气泡一路保持输入卡片的白底,接上真实气泡的那一刻才突然换成气泡的颜色,工具栏那一行背后还会先露出一条气泡色。现在底色从输入框所在的那一块开始,随形状一起渐变成气泡的颜色,到终点时正好铺满整个气泡。
  • 切换会话与新建会话不再卡住:装着本插件时,点开另一条会话或新建会话,页面会僵住一到两秒,长对话里尤其明显。原因是选中文字的配色作用于整个页面,浏览器每一轮样式重算都要为页面上每个元素算一次选中样式;现在这套配色只作用于对话正文与输入框里承载文字的块级元素(段落、列表、标题、引用、代码)。实测单次切换的样式重算从 0.9–2.4 秒降到 0.11–0.51 秒(未装插件时约 0.05 秒);侧栏、设置页与弹层里的选中配色回到宿主默认。
  • 装卸或更新别的插件之后,本插件的界面不再失去样式:此前别的插件加载、重新加载或更新之后,本插件的整个界面有时会变回宿主原本的样子,插件的标记却还留在页面上。现在无论别的插件如何装卸,本插件的外观都保持不变。
  • 同时装着的别的插件不再丢失样式:一个插件自己挂上去、没有归属标记的样式表,会被下一个加载的插件记在自己名下,并在那个插件重新加载时被删掉——同时装着的表情包插件就曾这样整份失去样式,只能刷新页面恢复。现在这类样式表在本插件看到它的当时就被标记为无主,之后任何插件的加载、重新加载与更新都不再碰它。
  • 小鲸鱼帧图顶端的灰线消失:Deepy 演某几段动画时,帧图最上方有时会闪出一条约 1 像素高的灰线,站在哪里、窗口多大不同就时有时无。现在任何站位、任何一段动画都不再出现,小鲸鱼的样貌与动作不变。
  • 子智能体工作室的节点详情小窗不再把会话统计与 Token 用量带走:打开工作室、点开一个子智能体的节点详情小窗之后,输入区上下文面板里的「会话统计」与「Token 用量」两段画到了那个小窗下面,没有底色地压在对话内容上,上下文面板只剩宿主自己的三行。现在两段仍留在上下文面板里。

New Features

  • Conversation navigator: the turn marks at the conversation's right edge are drawn by the plugin, spaced at the height of the list they open into. Reaching them with the pointer opens that list at once, one row per turn carrying the message that started it, each row exactly where its mark was and the turn being read left in place; the wheel scrolls the list and a click glides the page to the turn (only the last stretch, about a third of a second), loading earlier history first when it is not loaded yet; the Chat / Trajectory tabs at the top of the conversation stay up while the pointer is on the list. Alt+↑ / Alt+↓ jump to the previous or the next turn and keep stepping when repeated, leaving the keys alone while the composer holds a draft; the turn you land on flashes a short line over its start. With dsh-plugin-msg-nav installed too, Alt+↑ / Alt+↓ stay with it. A Conversation navigator switch on the settings page's Conversation tab, on by default; off restores the host's own turn marks and hover preview.

Improvements

  • The chat-area follow glides more evenly: every streamed line ended its glide with an extra hop of about 1.7px, and a large block such as a code block set the scroll off at full speed at once. The glide now builds up from rest and comes to a stop without a hop, and the newest line spends a quarter to a third less time under the bottom edge on a replayed stream (line-by-line output 533 → 400 ms, fast output 1350 → 1000 ms). A distance past 1200px is no longer covered in one frame: the position goes to 1200px short of the target and glides the rest.
  • The send flight lands more smoothly: the moment the flight ended, the bubble's words darkened at once, as if their weight had changed. The real bubble now shows underneath the flying one as it lands, and the flying copy fades out over 0.16 s, so the words sharpen into place; the rise also ends exactly on the bubble rather than a pixel or two past it.

Bug Fixes

  • Streaming no longer jerks the chat area up or drops it back: as the reply grew, the chat area sometimes jumped straight to the end and sometimes the status line at the bottom dropped a step before gliding back — the host's own pin to the end and the plugin's glide both wrote the scroll position in the same frame, the host's write always came last and was painted, and the next piece of text had the glide pull an already painted position back. The host's pin is now handed to the glide before it paints, so a growing reply only ever moves the view up smoothly; on a local simulated stream with pauses, the first lines after a pause no longer jump to the end (previously they did in every burst), and no frame moves the position backwards. The same holds after switching sessions.
  • The send flight's fill turns into the bubble's colour on the way: where the composer paints its fill on an inner layer (as the home page's composer does), the flying bubble kept the composer's white all the way and switched to the bubble's colour only as it met the real bubble, with a strip of bubble colour showing early behind the toolbar row. The fill now starts on the part of the card the composer paints and changes into the bubble's colour along with the shape, covering the whole bubble when it arrives.
  • Switching and starting sessions no longer stalls: with the plugin installed, opening another conversation or starting a new one froze the page for a second or two, worst in long conversations. The selection colours applied to the whole document, so every style pass had the browser compute selection styling for every element on the page; they now apply to the blocks that carry text in the conversation and in the composer — paragraphs, lists, headings, quotes, code. Measured on one switch, style recalculation went from 0.9–2.4 s to 0.11–0.51 s (about 0.05 s with the plugin off); selection colours in the sidebar, settings and popovers go back to the host's own.
  • Loading, reloading or updating another plugin no longer strips this plugin's styling: after another plugin was loaded, reloaded or updated, the whole interface could fall back to the host's own look with this plugin's markers still on the page. The plugin's appearance now survives any other plugin being loaded, reloaded or removed.
  • Another plugin installed beside this one no longer loses its styling: a stylesheet a plugin mounts without an ownership tag is taken into whichever package loads next and deleted when that package reloads — the meme plugin lost its entire styling that way, and only a page refresh brought it back. Such a sheet is now marked as unowned the moment this plugin sees it, and no plugin's load, reload or update touches it afterwards.
  • A grey line no longer flashes along the top of Deepy's frames: while some animations played, a line about one pixel tall could appear at the top of the frame and vanish again, depending on where the whale stood and how large the window was. It no longer appears in any position or animation, and the whale looks and animates exactly as before.
  • A node detail in the subagent studio no longer takes the session statistics and the token usage with it: with the studio open and a subagent node's detail popped up, the session statistics and the token usage sections drew under that popup with no surface of their own, over the conversation, leaving the composer's context panel with only the host's three rows. Both sections stay in the context panel now.

Full Changelog: v0.10.6...v0.11.0