packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
將「新增工作區」流程中喺主機彈出嘅資料夾選擇器,改成輸入名稱嘅對話框,令遠端瀏覽器可以直接建立並開啟工作區。
Make the sidebar's Add workspace button work when you are driving the DeepSeek Harness web UI from somewhere other than the host machine.
The stock flow opens an OS folder chooser on the host. dsh-host-directory-picker-auto
resolves the native backend whenever the bind host is 127.0.0.1 on macOS, and that
backend is a renderless osascript "choose folder with prompt …" call: it puts a Finder
dialog on the host's screen and renders nothing in the browser.
So from a remote browser (Tailscale, LAN, a phone) the button looks completely dead, and
it gets worse than dead — while the hidden dialog is open, WorkspacePickFlow holds
directoryBusy, and shortcutControls.add is a no-op whenever that flag is set. Every
later click is then silently ignored, with no error and nothing on screen.
It occupies both directory-flow holes — the sidebar header button and the composer's Choose workspace — with a name dialog:


New folders land beside the deployment's default workspace, which on this machine is
~/Documents/deepseek-harness/ for a workspace at ~/Documents/deepseek-harness/default-workspace.
It registers at priority: -100, which is the documented way to shadow a single-kind
slot occupant: SlotCore.register sorts entries by ascending priority and the lowest
renders, so this takes the seat instead of throwing already has a registration against
the native/browse picker.
dsh plugin --profile web add file:/path/to/plugins/dsh-quick-workspace
Then restart dsh web so the host half re-imports (see below).
The dialog ships in English and Simplified Chinese (zh), registered as
ctx.locale.register("quickWorkspace", { zh, en }) — 12 keys each, kept parallel.
Traditional Chinese comes from the separate dsh-zh-hant
pack, which converts every bundle's zh dictionary to Traditional with OpenCC. The
zh dictionary here is therefore Simplified on purpose: writing Traditional into
it would make Simplified users read Traditional text, and it would turn the zh-Hant
conversion into a no-op instead of the reverse of this table.
lib/index.js needs a dsh web restart. The client half hot-reloads; the host half
does not. After editing lib/index.js, rm -rf ~/.dsh/profiles/web/node_modules/dsh-quick-workspace
and re-add, or restart the server.process.cwd() is /. dsh web runs as a launchd KeepAlive agent, so the working
directory is the filesystem root, and mkdir("/<name>") fails with a bare EACCES that
tells the user nothing. The parent comes from workspaceRegistry instead, and the root
is refused outright with quick-workspace/no-parent.ctx.connection.rpc.call("/api", "ns/method", payload) resolves to the
{ok, value | error} envelope. Reading .path straight off it yields undefined
without throwing — always unwrap.describe() must be sent {args: {}}; {args: {request: {}}} is rejected
with gateway/arguments-invalid.dsh plugin --profile web remove dsh-quick-workspace (or disable it on the Plugins page),
then restart dsh web. The stock folder picker comes back.