DSH Personal Workspace: Calendar + Hierarchical Tasks + AI Clarification/Breakdown/Execution/Review + AI Smart Sorting/Daily and Weekly Reports + Desktop Reminders
The plugin will be installed here. Keep web if you are unsure.
npx -y @deepseek-ai/dsh plugin --profile web add @dely0/dsh-personal-workbench@1.15.4
Compatibility and provenance
Personal Workbench is published as @dely0/dsh-personal-workbench and currently resolves to version 1.15.4. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.
⚠️ 一个容易搞反的点:ctx.get('x') 的确不需要把 x 写进 inject(cordis 的 get 文档原话是
"without the inject requirement";会抛 cannot get property "x" without inject 的是代理属性访问那条路)。
但服务端与客户端同一个 get 语义下,只有当提供方 fiber 处于活动态时才拿得到 ——
所以"要不要进 inject"仍应按上面这两级来分:缺了功能就不成立的进,
只是锦上添花的软探测(modelDirectories 就是后者:写进 inject 会让没装
dsh-client-ui-model-selection 的机器上整个面板 pending,丢整块换一个下拉框)。
dsh-personal-workbench is a personal workbench plugin for DeepSeek Harness Web:
calendar + hierarchical task list, natural-language task intake with AI clarification
(text plus image / PDF / DOCX attachments, an optional model picker, and a native
/workbench slash command), multiple AI sessions per task (clarify / consult / break
down / execute / review), execution with user acceptance, AI prioritization for any date,
daily/weekly reports, desktop notifications, per-task task folders, reminders, archives,
and Markdown reviews.
Task folders are named <task-id>-<title-snippet> (the ID is the stable part), so renaming a
task never orphans its folder and two tasks with the same title never share one. Folders you
type by hand are never rewritten.
All task data is stored locally under ~/.dsh/workbench.
Install
# From npm (recommended)
dsh plugin --profile web add @dely0/dsh-personal-workbench
# From source or release tarball
dsh plugin --profile web add git+https://github.com/Dely0/dsh-personal-workbench.git
dsh plugin --profile web add file:/path/to/dsh-personal-workbench-<version>.tgz
Then restart dsh web and hard-refresh the browser.
Compatibility
Minimum: DeepSeek Harness 0.1.5-rc.1 (Web). This is a hard boundary, not a suggestion.
Requirement
Version
Notes
DSH (Web)
0.1.5-rc.1+
Below this, the panel does not start at all (see below)
WeChat reminder channel; falls back to in-page + desktop notifications
On older hosts the panel refuses to start (it does not degrade)
inject declares exactly five services — sessions, workspaces, connection, slots, layout
(see src/client/capabilities.ts; test/capabilities.test.mjs locks the list). Missing any of them
makes cordis keep the plugin pending. If it does load but a slot is missing, apply() logs a
readable reason (what is missing + which version is required) and returns immediately —
registering nothing and writing no DOM.
Why there is no compatibility layer: the old implementation fell back to a self-built DOM leg, which
laid down a full-screen position:fixed; inset:0 layer. When it failed to collapse it covered the
conversation area permanently (user quote: "nothing outside the left column is clickable").
Refusing to start with a clear log is strictly better than half-working degradation.
Server-side features are not gated by this: tasks/calendar/knowledge/ideas, reminders,
reports and the workbench_* agent tools only need 0.1.0-rc.6+. On an older host you can still
use them through the agent — you just get no panel UI.
Official slots only: sidebar.panellist for the sidebar row, main for a null placeholder
(so layout.selectPanel validation passes), shell.overlay for the real content —
it is always mounted, so the draft dialog survives closing the panel.
Whether the panel is visible is answered in exactly one place: decidePanel()
(src/client/panelState.ts, a pure function with table-driven tests).
No cross-plugin DOM coordination. Panel arbitration is owned by the host's single-value
activePanelId. Plugins that do not use official slots and instead take over the center column
via DOM (e.g. dsh-client-ui-task-board, dsh-ssh, dsh-mnemon) may end up active at the same
time. That is a known limitation caused by the host lacking a unified panel registry, not a
defect of this plugin. Accordingly we never read or write another plugin's data-dsh-*
attributes and never dispatch dsh-panel-activate. We only write two attributes of our own:
<html data-dsh-personal-workbench-active> and <html style="--wb-sidebar-w: Npx">
(enforced by test/clientInvariants.test.mjs, I4/I5/I6).
Soft-probing (this does not contradict the above)
Any DSH service that is not present in every supported version must be soft-probed with
ctx.get(name) and never listed in inject. The distinction:
slots / layout are preconditions of the panel feature → they go into inject,
and a missing one means the panel block does not start (with a readable log);
uiWorkspace / dshIm / skills are optional enhancements →
soft-probed; missing one only removes a feature.
Does not depend on dsh-web-ui.
Roadmap
V2: AI prioritization for any date, OS-level notifications, daily/weekly reports
V2: recurring tasks, personal knowledge base / lessons, ideas & idea clusters
@Guojing6 — several 1.15.1 features originate from their fork
Guojing6/dsh-workbench: task folders keyed by task id
(including pre-allocating the id at clarification time), quick-intake attachments (PDF/DOCX text
extraction and images through the host's multimodal pipeline), the model picker, the /workbench
slash command, and consolidating the duplicated request-fence helpers — plus locating two real
bugs this project had been carrying. Re-implemented against this repository's current modules
(their branch is based on v1.10.1); see THIRD_PARTY_NOTICES.md.
@tujunwenjie — the diagnosis and fix branch in issue #3 that
showed the root cause of participating in a non-official sidebar family via DOM injection.
@SnowNight777 — all three v1.15.3 fixes come from their
reports (issues #4 /
#5 /
#7 and PRs
#6 /
#8; commit authorship preserved):
① three task-creation paths never wrote a reminder row (subtasks from a draft, POST /tasks,
PATCH /tasks/:id) — so those tasks could never fire a reminder; ② an in-memory delivery-target
cache caused two linked defects (after a restart the settings page mis-reported a bound target as
"not configured", and isTargetConfigured being false made the scheduler silently skip every due
reminder, including the startup catch-up) — their report cites the draft-notify.ts comment that
had already worked around the same trap, which explains in one line why only task reminders broke;
③ stale session references in reusable AI sessions (after the referenced session was archived or
deleted, clicking did nothing and the stale registry row was never updated, permanently wedging that
chain) — they shipped a , and also found the (the report row's own fallback).
We verified every claim against the code and all three held. See
.