Introduction¶
The philosophy of DSH is “Everything is a plugin,” but many plugins solve “single-call” problems: retrieval within a single prompt, a single tool, a single interface. Things that span sessions—your preferences, established facts in your project, progress that needs reviewing after a night has passed—are not in its hands by default. You either have to reiterate them every time you start a new session, or set up your own memory table and write your own notification scripts.
Below introduces milestone-17/dsh-bao, a plugin that packages “scheduled tasks + notifications + status + memory” into an assistant layer.
What is it¶
dsh-bao (DSH Bao) is a DSH plugin maintained by milestone-17, positioned as a personal assistant similar to TRAE Bao: cross-session long-term memory, dedicated assistant Agent presets, daily briefs, desktop notifications, and a work status overview panel. It is categorized as “Memory” in the community directory and currently has 0 stars.
It does not create a new storage stack, nor does it replace DSH’s native schedule_*, notify_user, goals, and subagents primitives. Instead, it combines these primitives into a productized outer layer. The implementation is based on Harness’s public plugin API and does not touch private implementations.
Core Features¶
Six capabilities, all corresponding to the implementations documented in the README:
- Long-term Memory: The three tools
bao_remember/bao_recall/bao_forget, plus the “Master’s Long-term Memory” context automatically injected with every model request. Preferences, project facts, and decisions are preserved across sessions. - Dedicated Assistant Preset: Upon installation, it offers an Agent preset named “DSH Bao” (id
aibao) available when creating a new session. The scheduling layer persona answers questions, takes notes, and checks status on its own; heavy lifting is delegated to subagents. The panel has a one-click “Chat with Bao” to start a conversation directly. - Daily Brief: At a fixed local time every day (default 09:00), it aggregates “active scheduled tasks + recently progressed sessions” into a single desktop notification. Configurable with a switch.
- Assistant Proactive Notifications: The
bao_notifytool allows the model to proactively pop up system notifications on behalf of the assistant, such as for periodic summaries or when a decision is needed. - Status Overview: The
bao_statustool answers “what I’ve been busy with / what reminders are pending” in one sentence. - Sidebar Panel: Adds a “DSH Bao” panel where you can view long-term memory, scheduled tasks, recent sessions, and the brief toggle all on one screen. Auto-refreshes every 30 seconds.
How it Works¶
Memory is stored in $DSH_HOME/bao/memory.json. Writing to disk uses atomic writes via temporary files and renaming. Intra-process write chains are serialized. Zero dependencies.
Memory injection is registered as a dynamic runtime context of the system-prompt (with interpolate: false) and re-evaluated before every model request. Notes just recorded can be seen in the next request. There is a trade-off here: choosing “context” over “section” is to coexist with presets that have complete: true. A “complete” section replaces all sections, while a context is always rendered.
Notifications try three channels sequentially, and the first successful one takes effect: Electron native notification (inside the Desktop shell, with app identity and icon), Windows native toast (toast.ps1, WinRT API, via Windows PowerShell 5.1, also works on pure Node Host), or silently returns none if neither works. macOS/Linux uses the Electron channel; pure Node Host currently has no additional channels.
The panel data route GET/POST /bao/api/overview returns a brief JSON. It is read-only: it reads the directory from the schedule service and session rows with sessionTitle. It does not write status or activate sessions. The route has a trust fence and accepts only loopback (localhost / [::1] / 127/8) or hosts matched by trustedHosts, rejecting cross-site requests where the Origin must be the listener itself.
The code structure is simple: The Host half is pure ESM (index.js + memory.js + delivery.js + toast.ps1), and the Client half is a single client.js (loaded via window.__ModuleLoader__.load factory, React comes from the browser module table). No build steps, zero runtime dependencies. Syntax check:
node --check index.js && node --check memory.js && node --check delivery.js && node --check client.js
Installation and Activation¶
Plugin Market Command (Recommended):
dsh plugin --profile <name> add dsh-bao
Install via Discover Page: The repository includes a plugin market index (official format 1). Add one of the following addresses to DSH’s plugin market index settings:
https://raw.githubusercontent.com/milestone-17/dsh-bao/master/market-index.json
https://ghproxy.net/https://raw.githubusercontent.com/milestone-17/dsh-bao/master/market-index.json
The second address is proxied via ghproxy.net and is usable on domestic networks. Then, search for “DSH Bao” on the Discover page to install with one click. Installation pulls from GitHub and pins to the release commit.
Local Directory Installation: In a DSH session, ask the assistant to execute install_bundle from plugin_manager, filling target with the absolute path of that directory; or directly select the local directory in the Plugins settings page.
Manual Mounting without Bundle Channel: Add the following line to the profile’s cordis.patch.yml:
- insert:
- id: aibao
name: 'dsh-bao'
config:
digestTime: '09:30'
Note that when manually mounting, configuration items like digestTime must be written out fully; upgrades will not help you complete them.
Configuration¶
Configuration is written in the config of the plugin line (Loader patch). Ports and switches are as follows. Here are some common items excerpted; see the repository README for the full list:
- insert:
- id: aibao
name: 'dsh-bao'
config:
digestEnabled: true
digestTime: '09:00'
notifyTool: true
statusTool: true
memoryTools: true
memoryInject: true
memoryInjectLimit: 30
memoryNoteMaxChars: 200
sound: true
appUserModelId: 'com.deepseek.dsh'
routePath: '/bao/api'
| Key | Default | Description |
|---|---|---|
enabled |
true |
Master switch; when disabled, tools, routes, and briefs are all unregistered. |
digestEnabled |
true |
Daily brief switch. |
digestTime |
"09:00" |
Local time for triggering the brief, HH:mm (process timezone). |
notifyTool |
true |
Whether to register bao_notify. |
statusTool |
true |
Whether to register bao_status. |
memoryTools |
true |
Whether to register the three memory tools. |
memoryInject |
true |
Whether to inject long-term memory with every request. |
memoryInjectLimit |
30 |
Maximum number of notes referenced in the injected context. |
memoryNoteMaxChars |
200 |
Maximum characters for a single note when injected. |
sessionWindowCount |
5 |
Maximum number of recent sessions listed in the overview. |
sessionWindowMs |
93600000 |
Time window for “recent”, default 26 hours. |
maxLineLength |
90 |
Maximum characters for a single-line summary. |
sound |
true |
Whether system notifications include sound. |
appUserModelId |
"com.deepseek.dsh" |
App identity for Windows toast. |
routePath |
"/bao/api" |
Prefix for the panel data route (within the loopback fence). |
Typical Usage¶
Remember something to use in the next session. In a session, ask the assistant to call bao_remember to record your preferences or project decisions, for example, “Use pnpm for this project, not yarn.” The next time you start a new conversation, this note will be included in the injected long-term memory, so you don’t need to reiterate it. Use bao_recall to read, and bao_forget if you remember it incorrectly.
Check progress every morning. Configure digestEnabled: true and set digestTime to your desired time. At the set time, you will receive a desktop notification containing active scheduled tasks plus recently progressed sessions. You don’t need to write a cron script to scroll through the session list.
Let the assistant come to you when judgment is needed. bao_notify allows the model to proactively pop up notifications, and bao_status lets you ask in one sentence “what I’ve been busy with and what reminders are pending.” Neither requires leaving the current session.
Delegate heavy lifting to subagents. Use the “DSH Bao” preset to start a session. The scheduling layer handles answering and taking notes on its own, while heavy tasks are delegated to subagents. The “Chat with Bao” on the panel can start a conversation directly.
Applicable Scenarios and Notes¶
Suitable for individual developers or small teams: you want the assistant to remember preferences and project facts across sessions, you want to track progress via desktop notifications rather than scrolling through chat history, and you are willing to accept the division of labor “assistant scheduling + subagent execution.” People who already have a mature memory or scheduling system and just want to add tools to a single session do not need this plugin; DSH’s built-in schedule_*, notify_user, goals, and subagents primitives are sufficient. dsh-bao combines these primitives into human-readable briefs, overviews, and panels.
Points to note:
- This plugin runs with the permissions of the current
dshprocess and can read anything visible in your profile. Review the source code before installing to confirm that the paths and routes it accesses meet your expectations. - The license is MIT; features are provided as-is without official support guarantees.
- When manually mounting
cordis.patch.yml, configuration items will not be automatically completed; the plugin’s built-in patch line (wherebundle.patchpoints to./cordis.patch.yml) represents its default values. - Session creation failures (0.2.1 missing
tool-fs-searchrequired config, 0.2.2 aibao preset delegation group missingworkflow-ptc) have appeared twice in the changelog, only exposed by browser-side E2E. If you have modified presets or created custom delegation groups, verify by creating a session after upgrading. - macOS/Linux desktop notifications currently only use the Electron channel. On a pure Node Host behind a firewall, it silently returns
noneand will not throw errors or interrupt the session.
Conclusion¶
The value of dsh-bao lies not in individual features, but in connecting the scattered items of memory, briefs, notifications, and panels into a “assistant proactively finds you” chain, while not taking over DSH’s existing scheduling primitives. The source code is small, has zero runtime dependencies, and the cost of reading it is low.
- Community Directory: https://www.skillhub.cn/plugins/milestone-17/dsh-bao
- Repository: https://github.com/milestone-17/dsh-bao
Note: The community directory is an independent site and has no official affiliation with DeepSeek / Synthesia.