# dsh-bookmarks

[![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com/) [![ci](https://github.com/penguin-oo/dsh-bookmarks/actions/workflows/ci.yml/badge.svg)](https://github.com/penguin-oo/dsh-bookmarks/actions/workflows/ci.yml)

给 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)（DSH）Web 界面加「回复收藏夹」：收藏任意一条已完成的 AI 回复（可加备注和标签），在统一的收藏中心里跨会话浏览、搜索、筛选，一键导出 Markdown。

[English](./README.md)

## 截图

![回复旁的收藏按钮](docs/screenshot-actions.png)

![独立的收藏中心界面](docs/screenshot-center.png)

## 功能

- **逐条收藏** — 每条已定稿的 AI 回复旁边有一个归档按钮（就在 👍/👎 反馈按钮旁），点击收藏，并可内联编辑备注与逗号分隔的标签。
- **服务端摘要** — 收藏时宿主端自动从会话日志提取该回复的文本预览，不写备注也能在收藏中心里认出来。
- **跨会话收藏中心** — 一个面板汇集所有会话、所有工作区的收藏，支持全文搜索、标签筛选、内联编辑与删除。
- **一键跳回** — 每条收藏都能直接打开所属会话。
- **导出 Markdown** — 一键下载全部收藏为 `dsh-bookmarks.md`。
- **快捷键** — 任意界面按 `Alt+B` 开关收藏中心。
- **安全写入** — 每条收藏带版本号做 compare-and-set（多标签页安全），服务端严格校验，经 DSH storage domain 持久化。

## 安装

```sh
dsh plugin --profile web add dsh-bookmarks
```

然后重启 DSH（`dsh web`）。插件会自动加入 profile 的 bundle 层，无需其他配置。

本地开发目录安装：

```sh
# 在插件仓库目录里执行（相对路径会锚定到当前目录）
dsh plugin --profile web add file:./
```

## 配置

bundle 行暴露三个可选上限：

| 键 | 默认 | 含义 |
|---|---|---|
| `maxNoteBytes` | `4096` | 单条备注的最大 UTF-8 字节数（`""` 清除备注；省略该字段则保留原值）。 |
| `maxSnippetChars` | `300` | 服务端摘要的最大字符数。 |
| `maxTags` | `8` | 每条收藏的标签上限；单个标签 ≤ 32 字符，自动去空白与去重。 |

在 profile 补丁层（`$DSH_HOME/profiles/web/cordis.patch.yml`）覆盖：

```yaml
- id: bookmarks
  config:
    maxNoteBytes: 2048
    maxSnippetChars: 200
    maxTags: 5
```

## 原理

一个 npm 包承载插件的两个半边：

- **宿主半边**（`lib/index.js`）— `bookmarks` Remote 服务（Typert），数据存于 storage-domain（`$DSH_HOME/storages/bookmarks.json`）。`put` 会读取持久化的会话日志，校验目标回复真实存在并提取摘要，复刻官方 `message-feedback` 的持久性屏障，所有写入按版本号串行 + 冲突对账。
- **浏览器半边**（`src/client`，构建为 `lib/client.js`）— 通过 `ctx.remote.$mount` 挂载 Remote 描述符，再注册两个 UI 槽位：`conversation.chat.assistant-actions`（逐条收藏按钮）与 `sidebar.footer.action`（收藏中心入口）。

## 开发

```sh
npm install            # zod + esbuild（仅开发）
npm run build          # 将 src/client 打包为 lib/client.js
```

`lib/client.js` 随包发布，安装时无构建步骤。

## 已知限制

- 收藏存于单个全局行：个人使用完全够用，但不是多用户共享存储。
- 收藏中心会跳转到所属**会话**，暂不自动滚动到具体消息。
- 中心入口在侧栏底部；侧栏收起时用 `Alt+B`。

## License

[MIT](./LICENSE)

## 致谢

本项目在 [LINUX DO](https://linux.do) 社区推广。

