Foreword¶
When running multi-step tasks in Harness, there are three common sources of chaos: tasks scattered throughout the conversation, making them hard to find later; unclear whether a task was proposed by the model or manually copied, making it hard to distinguish; and automatically checking off tasks when the model says “completed” without anyone actually confirming. dsh-task-manager addresses these three issues: collects tasks into a floating panel, labels the source of each annotation, and requires you to make the final decision when the model proposes completion.
What is this¶
dsh-task-manager is maintained by caipanjin, a plugin for DeepSeek Harness (DSH), published on npm, current version 1.1.5. It provides a floating task panel in the bottom right corner, placing model-suggested tasks and manually added tasks in the same place, and additionally handles three things: double confirmation is required to click “Start” before sending the task into the conversation; when the model reports completion, it only proposes without automatically finalizing; and the panel position is remembered by the browser. The README describes it as “a dependency-free small plugin.” The license is MIT.
Core Features¶
-
Two task sources: Tasks written by the model via the
task_writetool are labeled “Model Suggested,” and annotations added in the panel input box are “Manually Added.” Each has a source badge. -
Select text to create tasks: Select a paragraph of text in the conversation, and a “+ Add as Task” button floats nearby. When the selected content is a rendered list (
-,1.,2.etc.), the button changes to “+ Add N tasks,” creating a task for each list item. Since list markers are drawn by CSS::markerand are not included in the selected text, the plugin reads the DOM<li>structure to identify items, rather than regex matching the text. -
Floating panel: Located above the shell overlay, it expands from a compact capsule, is draggable to any position, and its position is saved by the browser.
-
Status dot and status text: Each row displays a status dot and the text “To Do / In Progress / Completed.” Colors are auxiliary (Gray for To Do, Amber for In Progress, Green for Completed).
-
Explicit completion, confirmation to finalize: Each row has only one action button that changes with the status (“Mark In Progress” → “✓ Complete” → “Reopen”). When the model judges a task complete, it only proposes; a banner appears on the panel saying “Confirm All / Ignore,” and it will not truly finalize until you confirm.
-
Double confirmation to start: Clicking “Start” on a row first pops up a confirmation bar; clicking “Send” actually sends “Start executing this task:
” to the dialogue box, and the panel then automatically collapses. -
Delete and Clear: Both model tasks and user tasks have a “✕,” and there is a “Clear Completed” batch removal (excluding pending).
-
Theme and Language: Only uses Harness real theme tokens, automatically following the application’s light/dark mode; provides Simplified Chinese and English.
Installation and Enablement¶
It has been published to npm, and the installation command is:
dsh plugin --profile web add @caipj/dsh-task-manager
You can also install directly from source:
dsh plugin --profile web add github:caipanjin/dsh-task-manager
After installation, restart the Harness host once to let the host-side tool task_write register, and refresh the window. The task capsule will appear in the bottom right corner; click to expand, and it can be dragged to move.
Typical Usage¶
Walk through the steps below as described in the README.
-
Add task: Expand the capsule, type in the input box and click “Add.” The task stays only in the list and is not copied to the chat box.
-
Add from conversation text: Select text and click the floating “+ Add as Task”; if a list is selected, click “+ Add N tasks.”
-
Model tasks: When the model calls
task_write, the task automatically appears and is labeled “Model Suggested.” -
Switch status: Click “Mark In Progress” on To Do, “✓ Complete” on In Progress, and “Reopen” on Completed.
-
Start task: Click “Start” on a row, click “Send” after the confirmation bar appears, and the prompt is sent to the conversation.
-
Completion confirmation: After the model reports completion, a confirmation banner appears. You can “Confirm All” or “Confirm” row by row. When the model reports, in addition to the task ID, you can also write the title directly. The title is matched by normalization (ignoring case, full/half-width, spaces, punctuation), and the first unique match takes effect; unique prefixes are also accepted. If multiple matches are found, an error is reported listing the candidates.
-
Delete / Clear: The “✕” in the row deletes a single item, and “Clear Completed” removes them in batch.
How it Works and Compatibility¶
The host-side (index.js) registers a tool task_write facing the model. Sub-commands include add, set_status, propose_done, remove, replace, clear, and list, and there is a session projection taskManager. The rendering result of the tool embeds a machine tag TASK_STATE::<json>, carrying the complete task list; the projector folds out these tags from the existing tool/result events, without introducing custom session event types.
The client-side (client.js) registers two widgets to the shell.overlay slot: the task card and the floating layer button that appears when text is selected. The client reads model tasks from the projection. User tasks, local state modifications to model tasks (hide / complete), and confirmation status are stored in localStorage—since installed plugins cannot write to the host projection, this state is designed to be on the client side. “Start” calls conversation.send(text) for the current session.
A fix worth noting in version 1.1.5: When the model uses replace to rewrite the task list, previously every task would get a new ID, causing local hide, status modifications, and completion confirmations recorded by ID to be lost. Now replace reuses the IDs of existing tasks based on the title, and only truly new tasks generate a new ID; title matching also uses normalization.
The platform is web (Harness Desktop / Web UI). It requires Harness to expose the shell.overlay slot, sessionProjections service, and the conversation.send / sessions.scope client services. The plugin only uses publicly stable theme tokens (--dsw-alias-*).
Regarding permissions: No network requests, no external services, no telemetry; reads tasks from the session projection, and only writes to its own localStorage keys @caipj/dsh-task-manager:*; adds a new model tool task_write without touching anything else.
Suitable Scenarios and Notes¶
Suitable for developers who want to maintain multi-step tasks in the Harness chat but do not want to manually copy and paste points into the conversation.
Three things should be confirmed before use:
- Does the Harness version expose the
shell.overlayslot,sessionProjectionsservice, and related client services? If not met, the panel will not appear. - This plugin runs with the current dsh process permissions. You should read the source code and license (MIT) before installing to confirm trust.
- Known limitations: Completion/deletion of model tasks is a local override, saved to
localStorageper session, and does not write back to the session log; the local record takes precedence when reopening the session. User tasks only exist locally in the browser/session and do not enter the model context until “Start” is clicked. Creating tasks from selected text relies on DOM structure to identify list items. When text comes from code blocks or plain text (where markers are real characters), it will fall back to splitting by-/1.in the text.
Conclusion¶
dsh-task-manager does something very specific: it adds a task panel to Harness chat with source labels and confirmation requirements, making the execution order and completion status of multi-step tasks at least verifiable. The directory page is at https://www.skillhub.cn/plugins/caipanjin/dsh-task-manager , and the source code is at https://github.com/caipanjin/dsh-task-manager .