# dsh-minimal-UI-panels > [English](./README.md) · [中文](./README.zh-CN.md)
> All-in-one DeepSeek Harness UI panels — 一个 bundle、一个 loader 行,把产物 / 长期记忆 / 终端 / 记事本**两两配对**成 2 个右侧栏标签页类型,每个标签内部上下可拖分栏。 `dsh-minimal-UI-panels` 把三个原本独立的 DSH 插件合并为一个包,并以**单 loader 行**挂载。面板**两两配对**注册为 `@deepseek-ai/dsh-client-ui-sidebar-right` 的**标签页类型**(`ctx.sidebarRightTabs`):`产物 + 终端`、`长期记忆 + 记事本`,每个标签内部上下叠放、中间可拖动分栏——这样把两个窗格并排就能同时看到 4 个面板。同时提供宿主侧工具/路由,即插即用。 > **DSH 0.1.5 起架构已变**:旧版那个可被第三方占用的 `details` 列已被 `rightbar` 取代,由官方右侧栏(docking kit + 标签类型注册表)接管。本包 0.2.0 完成该迁移——不再有自绘的多面板容器。 ## ✨ 功能一览 | 面板 / 能力 | 说明 | |---|---| | **成对的右侧栏标签页类型** | 每个类型 = **一对面板**,上下叠放、中间是可拖动的分隔条(比例按类型记住,双击回到 50/50)。停靠 / 浮动 / 分屏由官方 docking kit 提供;**把两个窗格并排,就能同时看到 4 个面板**。入口是标签条的「+」→ guide 页 | | **产物面板** | 扫描工作区产物文件,按类型/日期/体积/行数分组排序;代码/配置/数据预览语法高亮;图片 base64 预览(4 MiB 上限);mp4/m4v/webm/ogv 视频流式播放(支持 Range 请求) | | **长期记忆面板** | 三作用域(user/global/workspace)记忆的查看、新增、搜索、编辑;标签分组;内容高亮;配套 `memory_*` 工具与 `/memory` 命令 | | **终端面板** | 深色终端外观的 bash 命令执行器(`bash -lc`),输出收集后返回,下方常驻常用命令提示 | | **记事本面板** | Apple 便签风格多条目记事:侧边列表 + 正文编辑、新建/删除、自动保存(600ms 防抖)、按首行自动命名,存储于 `~/.dsh/notes.json` | ## 📸 截图 产物 / 长期记忆 / 记事本 / 终端四个面板: > ⚠️ 下图拍的是 0.1.x 的自绘 `details` 多面板栏;0.2.0 起面板改由官方右侧栏承载,标签条、分屏与浮动控件的外观以 DSH 自带为准。
## 📦 安装
本插件以**本地 link 依赖**挂载(与 DSH 本地插件一致)。
### 1. 克隆仓库
选一个目录并克隆:
```bash
git clone https://github.com/windrover/dsh-minimal-UI-panels.git
# → <你的路径>/dsh-minimal-UI-panels
```
### 2. 在 DSH profile 中登记
编辑 `~/.dsh/profiles/web/package.json`,把 `link:` 改成**你自己的克隆路径**(`<你的路径>` 是你克隆到的目录):
```jsonc
{
"dependencies": {
"dsh-minimal-ui-panels": "link:<你的路径>/dsh-minimal-UI-panels"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-minimal-ui-panels"
]
}
}
}
```
> 把 `<你的路径>` 换成克隆目录的绝对路径,例如 `link:/Users/me/dev/dsh-minimal-UI-panels`。
> 目录名可以带大写(如 `dsh-minimal-UI-panels`)——**目录名不影响加载**,真正起作用的 identity 是 `package.json` 的 `name`。
### 3. 建立 link
```bash
cd ~/.dsh/profiles/web && pnpm install
```
### 4. 重启 dsh web
**Ctrl+C 退出 → 重新 `dsh web` → 浏览器刷新**。loader 启动时扫描 profile bundles,新代码即生效。
> 若你之前挂载过那几个旧插件,请从 `dsh.profile.bundles` 列表移除它们(本包已取代);同时清理 `~/.dsh/cordis.patch.yml` 中残留的旧行(如 `- id: artifacts-panel`),避免 `patch: entry ... not found` 告警。
## 🖥 使用
- 打开任意会话 → 右侧栏(对话区右上角的展开按钮)→ 点标签条的「+」打开 **guide 页** → 选择 **产物 + 终端** 或 **长期记忆 + 记事本**。
- **同时看 4 个面板**:把标签**拖到窗格的左/右边缘**分出第二个窗格,两格各开一对即可;每对内部的上下比例用中间的分隔条调,双击回到 50/50。空间不够时把右侧栏宽度拖大。
- **终端**:输入命令回车执行(`bash -lc`),输出展示在下半区,常用命令提示常驻。
- **记事本**:点「新建」创建条目,左侧列表可拖动分隔条调宽,点击标题自动隐藏列表聚焦正文,工具栏可手动显示/隐藏列表。
- **`/memory`** 命令(宿主侧):`/memory list|search|get|forget|export` 管理长期记忆。
- 宿主侧还提供模型工具:`memory_*`(write/recall/list/forget/export/import/correct/batch/diagnose)与 `artifacts_list`。
## 🏗 架构
```
dsh-minimal-UI-panels (一个 loader 行 / 一个包)
│
├── lib/index.js ── 宿主半身【薄组合入口】
│ └── import + 按序调用:
│ ├── lib/host/ltm.js ← 原 dsh-long-term-memory(一字不改)
│ │ └── store.js / threats.js / llm.js / automation.js
│ ├── lib/host/artifacts.js ← 原 dsh-artifacts-panel(一字不改)
│ └── lib/host/terminal-notes.js ← 原 dsh-terminal-notes(一字不改)
│ inject = tools, systemPrompt, commands, settings, agents,
│ webServer, workspaceRegistry, subprocess, fs
│
├── src/ ── 浏览器半身源码【改面板 UI 就改这里,受版本控制】
│ ├── composite/client.js ← 组合容器:拥有全部右侧栏注册(2 个 tab 类型 + 可拖分隔条)
│ ├── artifacts/client.js ← 产物面板(只提供组件,不注册 tab 类型)
│ ├── long-term-memory/client.js ← 长期记忆面板(同上,另提供设置卡片)
│ └── terminal-notes/client.js ← 终端 + 记事本两个面板(同上)
│
└── lib/client.js ── 浏览器半身【合并单 bundle = scripts/merge-client.mjs 生成,勿手改】
├── function artifacts(react, react_jsx_runtime, panels) ← 提取自 src/artifacts/client.js
├── function ltm(react, react_jsx_runtime, panels) ← 提取自 src/long-term-memory/client.js
├── function terminalNotes(react, react_jsx_runtime, panels) ← 提取自 src/terminal-notes/client.js
├── function composite(react, react_jsx_runtime, panels) ← 提取自 src/composite/client.js
│ 三个面板 fn 只往 panels 注册表里写 { Component, ns, titleKey, t };composite 读它渲染
└── function apply(ctx) ← 主入口:const panels = {} → 依次 apply(composite 必须最后)
exports.inject = ["slots", "locale", "sidebarRightTabs"]
右侧栏标签页类型(**每个类型 = 一对面板**,每个类型再在 sidebar.right.pane.tab 槽下按自己的 id 注册 body):
dsh-minimal-ui-panels/artifacts-terminal kind "artifacts-terminal" 上:产物 下:终端
dsh-minimal-ui-panels/memory-notes kind "memory-notes" 上:长期记忆 下:记事本
宿主工具/路由: memory_*(9) + artifacts_list, /api/artifacts/*, /api/terminal-notes/*
```
合并流程(详见 `scripts/merge-client.mjs`):
```
src/artifacts/client.js ─┐
src/long-term-memory/client.js ├─ 提取 factory 体 → 改写 react/react_jsx_runtime
src/terminal-notes/client.js │ 绑定、删除子模块内 exports. 语句
src/composite/client.js ─┘ (必须最后合并:它读前面填好的 panels 注册表)
│
▼
lib/client.js (单 __ModuleLoader__.load bundle)
```
> 📌 **源码就在本仓库**(`src/