Bundle
dsh-bookmarks
Bookmark assistant replies in DeepSeek Harness: per-message bookmarks with notes and tags, a cross-session bookmark center, and one-click Markdown export.
- Source
- penguin-oo
- stars
- 11 stars
- License
- MIT
- Updated
- Updated 5 days ago
Readme
# dsh-bookmarks
[](https://awesome-dsh-plugin.com/) [](https://github.com/penguin-oo/dsh-bookmarks/actions/workflows/ci.yml)
Bookmark assistant replies in [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH) Web UI: bookmark any finalized assistant reply with a note and tags, browse every bookmark from every session in one center panel, and export them to Markdown in one click.
[中文说明](./README.zh.md)
## Screenshots


## Features
- **Per-message bookmark** — an archive button on each finalized assistant reply (right next to the 👍/👎 feedback buttons), with an inline editor for a note and comma-separated tags.
- **Server-derived snippet** — the bookmark stores a text preview of the actual reply, so the center stays useful even without a note.
- **Cross-session center** — one panel listing bookmarks from all sessions and workspaces, with full-text search, tag filter, inline editing and deletion.
- **Jump back** — every entry opens its session in one click.
- **Markdown export** — one click downloads all bookmarks as `dsh-bookmarks.md`.
- **Keyboard** — `Alt+B` toggles the center from anywhere.
- **Safe writes** — per-item compare-and-set versions (multi-tab safe), server-side validation, and durable storage via the DSH storage domain.
## Install
```sh
dsh plugin --profile web add dsh-bookmarks
```
Then restart DSH (`dsh web`). The plugin appends itself to the profile bundle layer automatically; nothing else to configure.
For a local checkout:
```sh
# from the plugin repo
dsh plugin --profile web add file:./ # relative file spec, anchored to your cwd
```
## Config
The bundle row exposes three limits (all optional):
| Key | Default | Meaning |
|---|---|---|
| `maxNoteBytes` | `4096` | Max UTF-8 bytes of one note (`""` clears a note; omitting the field keeps it). |
| `maxSnippetChars` | `300` | Max characters of the server-derived reply snippet. |
| `maxTags` | `8` | Max tags per bookmark; each tag ≤ 32 chars, trimmed and deduplicated. |
Override them in the profile patch layer (`$DSH_HOME/profiles/web/cordis.patch.yml`):
```yaml
- id: bookmarks
config:
maxNoteBytes: 2048
maxSnippetChars: 200
maxTags: 5
```
## How it works
One npm package hosts both halves of the plugin:
- **Host half** (`lib/index.js`) — the `bookmarks` Remote service (Typert), backed by a storage-domain table (`$DSH_HOME/storages/bookmarks.json`). `put` inspects the persisted session log to validate the target reply and derive its snippet, mirrors the official `message-feedback` durability barrier, and serializes mutations with per-item version tokens.
- **Browser half** (`src/client`, bundled to `lib/client.js`) — mounts the Remote contribution through `ctx.remote.$mount`, then registers two UI slots: `conversation.chat.assistant-actions` (the per-message button) and `sidebar.footer.action` (the center toggle).
## Development
```sh
npm install # zod + esbuild (dev only)
npm run build # bundles src/client into lib/client.js
```
`lib/client.js` is committed and shipped; no build step runs on install.
## Limitations
- Bookmarks are stored in one global row: fine for personal use, not a shared multi-user store.
- The center panel jumps to the bookmarked *session*; it does not auto-scroll to the exact message yet.
- The panel toggle lives in the sidebar footer; use `Alt+B` when the sidebar is collapsed.
## License
[MIT](./LICENSE)
## Acknowledgements
This project is promoted on the [LINUX DO](https://linux.do) community.
Install
dsh plugin --profile web add github:penguin-oo/dsh-bookmarks#6db86b38174652a431c25f8f0ca41a3578c1b923
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-bookmarks from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.