把 DSH Web 客户端对话列宽度设为其自身宽度的百分比(40–100,默认 100 即铺满整列),取代内置的 680–920px 阅读宽度,并在「设置 > 插件」中提供可折叠的调整卡片。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-wide-conversation
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:yunxiyang/dsh-wide-conversation
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
该插件的 README 只有英文版本。
Give the DSH web client a conversation column that uses the width it has.
The built-in layout sizes the transcript from
--dsh-chat-content-width: clamp(680px, 64% of the column, 920px): on a wide
window a long conversation still reads in a narrow strip with large empty
margins. This plugin pins that axis to a configurable percentage of the
conversation column — 100% means the transcript spans the whole column — and
exposes the percentage as a collapsible Wide Conversation card on the
plugin's own page under Settings > Plugins.
简介 / 快速上手(中文)
这个插件让 DSH 桌面/网页客户端的对话列按可用宽度铺开。
- 内置布局把正文宽度锁在
clamp(680px, 列的 64%, 920px)—— 宽窗口下长对话仍挤在一条窄栏里,两侧留大片空白。本插件把这条宽度轴改成对话列宽度的百分比,100即铺满整列。 - 百分比可以在 设置 > 插件 里调整:
已安装分组里打开dsh-wide-conversation,在wide-conversation这一行点配置,就会出现 Wide Conversation 卡片。卡片默认收起,点标题行展开后可在 40–100 之间调整,点保存生效;收起时标题行右侧直接显示当前百分比。 - 切换宽度即时生效,不需要重启应用;但安装/卸载插件后需要重启该 profile。
- 安装:
dsh plugin --profile <name> add dsh-wide-conversation。 - 插件只影响客户端布局,不碰模型、网络或会话日志,也不写入任何自定义会话事件。
Install
Install into a profile with the dsh CLI. Its plugin subcommand forwards to
pnpm inside the profile directory, so add/remove behave as usual:
dsh plugin --profile <name> add dsh-wide-conversation
Then restart the profile (desktop: Settings → Desktop settings → Restart, or
quit and reopen). The profile's package.json gains the dependency and the
dsh.profile.bundles entry, and the bundled cordis.patch.yml inserts the
plugin into the layer stack — no manual patch editing is required. The insert
declares the row id the browser half claims:
- insert:
- id: wide-conversation
name: 'dsh-wide-conversation'
To remove it:
dsh plugin --profile <name> remove dsh-wide-conversation
Working from a local checkout instead? Point the profile at the directory:
dsh plugin --profile <name> add link:/path/to/dsh-wide-conversation
Before importing a plugin, DSH compares every @deepseek-ai/dsh* range in its
peerDependencies against the running runtime version, so an install into a
newer harness fails at the version check rather than at startup. This package
declares both lines it supports (^0.1.1-rc.2 || ^0.2.0-rc.1) and CI checks the
declaration against them.
Config
Settings > Plugins → the installed dsh-wide-conversation bundle → the
wide-conversation row → Configure opens the Wide Conversation card.
Collapsed by default, opened by clicking its header, which also shows the current
percentage while collapsed.
| field | default | range | meaning |
|---|---|---|---|
widthPercent |
100 |
40–100 |
Width of the conversation content as a percentage of the conversation column. 100 spans the whole column. |
The card stages its edits and writes only on Save; the save is fenced by the
revision the draft started from, so a change made elsewhere in the meantime is
refused and the draft kept for correction rather than overwritten. The value
lives on the plugin's loader entry in the profile's cordis.patch.yml — the
profile is the authority a 0.2 harness validates against. On a 0.1.x harness the
same field is registered as the wide-conversation settings namespace and stored
in the Host settings document instead; the card is the same disclosure. Values
outside the range are rejected by both the card and the schema, so a hand-edited
document cannot drive the column outside it.
How it works
The conversation skeleton resolves its entire horizontal axis from
--dsh-chat-content-width, declared on its own root and overridden by a dragged
--dsh-chat-user-width. Both land as inline styles on the skeleton root, so
an ordinary stylesheet rule loses to the style attribute — the override carries
!important.
lib/client.jsinjects one stylesheet that pins both custom properties tocalc(var(--dsh-wide-percent, 100) * 1%), reclaims the clearance the read column reserved for the old centred 920px measure, and hides the drag handles the percentage now supersedes.- The live percentage is published once onto
document.documentElementas--dsh-wide-percent, so a change repaints on the next style recalculation instead of re-creating the stylesheet or re-rendering React. - The preference is read from whichever settings surface the host provides, and
the card is registered on the seat that surface dispatches by:
- 0.2.x — the entry's form through the
configFormsservice, addressed by the Loader entry id the bundle patch declares (wide-conversation), and the card intoplugins.row.configunder<package name>#<row id>(dsh-wide-conversation#wide-conversation), which is what gives the row its Configure control. - 0.1.x — the
wide-conversationnamespace throughsettingsScope, and the card intosettings.plugin.itemunder that namespace key. Neither service is named in the module-levelinject, so a host that provides only one of the two loses the card rather than the width axis.
- 0.2.x — the entry's form through the
- The card itself is a disclosure, matching the built-in plugin cards: a collapsed row using their tokens and radii, opening to the single width field — plus Save/Discard on the 0.2 row page, which owns its draft. A contributed card inherits no styling from the settings section, so it restates what they use.
The composer card is derived as content + 32px, so it follows the axis
automatically.
No build step
The browser half is a hand-written window.__ModuleLoader__.load closure
factory — the only shape the client module system accepts — so the package ships
no bundler, no build script, and no client dependencies of its own. react
arrives through the injected require table.
The Node half imports @deepseek-ai/schemastery for the Config schema a 0.2
harness reads its form from, marked volatile with extra('volatile', true) —
the marker volatileForm() requires, set through extra() rather than the later
.volatile() builder so a profile whose schemastery predates that builder still
gets a form. That one import is declared twice on purpose, because the two
install shapes resolve it differently:
- as a peer dependency, which is what the harness's profile resolution reads.
A plugin installed with
link:lives outside the profiles tree, so it is a "linked root": its bare imports are routed by the names in its ownpeerDependencies, and the harness hands it the schemastery the harness itself uses. Leave the peer out and the import falls back to native resolution from the checkout, finds nonode_modulesabove it, and the Host half fails to import — taking the whole plugin down with it; - as a dependency, which is what pnpm installs for a package installed from the registry. A plugin installed that way is not offered installation-scope resolution and resolves its own copy instead.
DSH's admission check only evaluates @deepseek-ai/dsh and @deepseek-ai/dsh*
peers, so the schemastery peer neither widens nor narrows what DSH will load.
Compatibility
- Client platform: web (
dsh.client.platform, i.e. the desktop and browser GUI). There is no terminal-face behavior. - Host lines: 0.1.x (
settings.register+settingsScope) and 0.2.x (exported volatileConfig+configForms). The declared DSH peer range covers both;tests/compatibility.test.mjsproves the admission check accepts each. - Writes no session events, so it cannot affect session-log loading.
- The stylesheet rescapes nothing outside the conversation area, but it does
target the skeleton by attribute (
[data-phase]+[data-conversation-scroll]) rather than by hashed CSS-module class name, so it keeps working when class names change. If a future build renames those attributes, the plugin degrades to a no-op rather than breaking the layout.
License
MIT
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 9925
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 9925
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 6712
右下角常驻的小鲸鱼挂件:余额、今日已用与每轮对话消耗(含峰谷价),余额预警与今日预算的泡泡内容都可编辑;泡泡点击序列模块化自定义,支持并列加权 A/B、随机台词与随机图片;内置 30+ 厂商模板(OpenAI / OpenRouter / Kimi / 硅基流动 / 方舟 / 智谱 / MiniMax 等),按模型查余额与订阅额度;另有任务结束音效、导入音频、自定义角色与资源管理。数据全在本机,无遥测。
ccch1mneyyy/dsh-TUI★ 6538
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
omdsh-dev/DSH-better-sidebar★ 4808
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1672
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。