packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
让 DeepSeek Harness 网页界面的对话列自适应宽度:随窗口取「列宽 − 64px」,上限 1560px、下限 640px,内置拖拽把手仍然优先。
Fluid conversation width for the DeepSeek Harness web GUI.
The chat column stops being pinned to a fixed reading measure and follows the window instead: column width − 64px, capped at 1560px, floored at 640px. No settings page, no button — resize the window and the column tracks it.
The DSH web client sizes its conversation column from a fixed measure and lets the built-in drag handles override it with an inline --dsh-chat-user-width on the conversation root. This plugin publishes that same custom property from a ResizeObserver on the column, so:
min(columnWidth − 64, 1560) on everyresize, never narrower than the app's own 640px floor.
legitimately overrides the published value. Dragging is unaffected; the value you drag to is what you get.
width in localStorage["dsh.conversation.contentWidth"]. On startup this plugin removes that key and strips any inline echo already published, so a leftover pinned width from an earlier drag cannot silently defeat it.
Embedded conversations are left alone: they define their own content width and ignore --dsh-chat-user-width. Only the main chat region is targeted ([data-conversation-region="chat"] > [data-conversation-scroll]).
The three constants live at the top of apply() in client.js:
const MARGIN = 64; // total side breathing room (px)
const CAP = 1560; // max content width (px)
const MIN = 640; // floor, matches the app's own CONTENT_MINThey are compile-time constants rather than settings on purpose: this plugin has no host half, no settings namespace, and nothing to persist. Edit and reload.
dsh plugin add dsh-fluid-chat-widthOr from a checkout:
dsh plugin add github:helloworld010234/dsh-fluid-chat-widthRestart the client afterwards.
dsh plugin remove dsh-fluid-chat-widthIf you had dragged a handle before installing, the preference key was cleared on boot. Nothing else is left behind — the plugin writes no files, registers no routes, and touches no storage except removing that one key.
Two faces, no build step, no runtime dependencies:
File · Face · Role index.js · host (Node) · Deliberately empty. Satisfies the plugin shape so the bundle patch can mount the package into the web roster. client.js · browser · The whole plugin: one ResizeObserver, one custom property. A hand-written window.__ModuleLoader__.load closure factory. cordis.patch.yml · bundle patch · Inserts the dsh.client row into the profile's layer stack.
There is no bundler and no transpiler — client.js ships as written, which is why the source you read here is the source that runs.
MIT