# deepseek-harness-desktop

> 为 DSH Web 界面换上炒股终端外观：红涨绿跌标题栏、A/港/美/加密/外汇滚动跑马灯、市场时段状态栏，可联动 dsh-fun-ticker 自选股与 dsh-longbridge 港美股行情。

## Metadata

- Author: [@ningbainb](https://github.com/ningbainb)
- Repo: <https://github.com/ningbainb/deepseek-harness-desktop.git>
- GitHub: [ningbainb/deepseek-harness-desktop](https://github.com/ningbainb/deepseek-harness-desktop)
- Stars: 156
- Language: TypeScript
- License: [BSD-3-Clause](https://spdx.org/licenses/BSD-3-Clause.html)
- Homepage: <https://ningbainb.github.io/deepseek-harness-desktop/>
- Topics: `ai-agent`, `ai-coding-assistant`, `codex`, `deepseek`, `deepseek-harness`, `desktop-app`, `dsh`, `dsh-plugin`, `electron`, `electron-app`, `gui`, `open-source`, `plugin-system`, `plugins`, `remote-access`, `skills`, `ssh-client`, `windows`, `windows-desktop`
- Forks: 5
- Open Issues: 6
- Last push: 2026-08-20T05:29:52.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:ningbainb/deepseek-harness-desktop/packages/skins/trading
```

## Wiki

## 一句话定位
交易终端皮肤为 DSH Web GUI 换上炒股终端外观：在页面顶部加入带 K 线图标的标题栏与实时行情快签，在中部跑 A 股 / 港股 / 美股 / 指数 / 加密 / 外汇滚动跑马灯，在底部展示市场时段、长桥指数、工作区计数和连接状态。它只动浏览器 DOM 和 CSS，不参与模型请求，适合想换外观、营造盯盘氛围的普通用户。

## 核心能力
- 在页面顶部插入带白色蜡烛 SVG 图标的标题栏，标题钉为「交易终端 · DeepSeek 在线」，并配 –/□/× 三个桌面控件以及 3 个实时行情快签（红涨绿跌配色）
- 在页面中部渲染滚动跑马灯：A 股 / 港股 / 美股 / 指数 / 加密 / 外汇的实时报价，两份相同内容用于无缝循环，滚动速度随条目数自适应
- 在页面底部插入市场时段状态栏：A 股 / 港股 / 美股 的「盘中 / 午休 / 盘前 / 休市」状态、装 dsh-longbridge 时显示港美股指数快照（标签「长桥」），未装时回退到公共指数（标签「指数」）
- 状态栏末尾展示工作区计数格（每 30 秒聚合一次 `workspace.list`）和「就绪 / 已连接 / 在线」连接状态格
- 通过固定 `data-dsh-trading` body 属性的样式表调整浅色与深色两套交易终端色板，并注入品牌红 K 线 favicon
- 客户端生命周期清理器在卸载时收回全部写入：body 属性、三个 chrome 栏、favicon、并在文档标题未被外部覆盖时一并恢复

## 技术实现
- **语言**: TypeScript + CSS Modules（lightningcss 编译进 bundle）
- **关键依赖**: `@deepseek-ai/cordis`（`ctx.effect` 生命周期）、`@deepseek-ai/dsh-client-connection`（客户端 RPC 句柄上的 `workspace.list`）、`@deepseek-ai/cordis`、`lightningcss`（样式编译）、`tsdown`（生成 bundle）、`vitest`（挂载/清理验证）
- **架构模式**: 通过 DSH bundle patch（`cordis.patch.yml`）将 `ui-skin-trading` 插入 Web 插件清单；host 侧 `apply()` 为空占位（运行在 host 进程，皮肤不参与宿主逻辑），浏览器侧 `apply(ctx)` 在 cordis fiber 生命周期内挂载 DOM/CSS 并注册 disposer；样式表随 bundle 的 CSS Modules 自动注入，由 loader 随条目移除
- **入口文件**: `packages/skins/trading/src/index.ts`（host 空入口，4 行）；`packages/skins/trading/src/client/index.ts`（浏览器侧核心入口，370 行）；`packages/skins/trading/src/client/quotes.ts`（505 行三级数据源与解析器）；`packages/skins/trading/src/client/session.ts`（91 行市场时段纯函数）；`packages/skins/trading/src/client/refresh-scheduler.ts`（66 行单定时器多节奏调度）；`packages/skins/trading/src/client/trading.module.css`（692 行主题样式）

## 适用场景
对炒股氛围感兴趣、写代码也想盯盘的普通用户，在 DSH Web 界面切到「交易终端」皮肤后，标题栏与跑马灯会持续显示 A 股、港股、美股、加密和外汇的实时报价与红绿涨跌，状态栏展示三个市场的盘中状态、当前的工作区数与连接状态。皮肤完全不动模型调用链，适合只想把工作台换成交易终端观感、不改变对话体验的用户；同时也是 `dsh-fun-ticker` 和 `dsh-longbridge` 两个数据插件的视觉载体，装上后会把跑马灯替换为用户的自选列表与真实的港美股指数。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | 未声明 | 包内未声明 DSH 版本或 `dsh.compatibility`；通过 bundle patch (`cordis.patch.yml`) 接入客户端机制 |
| Node.js | `^22.19.0 || >=24.0.0` | 仓库根 `package.json` 的 `engines` 声明；皮肤包自身未单独声明 `engines` |
| 平台 | 跨平台 | `package.json` 将客户端标记为 `platform: "web"`，未声明 `os` 或 `cpu` 限制；接口数据在浏览器侧取，没有平台分支 |
| 原生模块 | 无 | 无运行时原生模块依赖；DOM 变更、行情解析、时段计算全部在浏览器 TypeScript 完成 |

## 安装方式

```bash
dsh plugin --profile web add github:ningbainb/deepseek-harness-desktop/packages/skins/trading
```

## 配置项
本插件无需额外配置。源码中未发现用户配置读取逻辑或 `Schema` 字段；皮肤启用由皮肤管理流程（`dsh-skin use trading`）负责，启用后由客户端生命周期自动管理 DOM/CSS 的挂载与清理。

## 常见问题

**Q: 这个皮肤影响模型请求或对话吗？**

A: 不会。包内明确说明它只改变浏览器 DOM 与 CSS，不组装或发送任何 provider 请求，也不订阅任何模型事件；皮肤对模型调用链零侵入。

**Q: 跑马灯的报价数据从哪里来？必须装 fun-ticker 吗？**

A: 不必须。皮肤内置三级数据源：装了 `dsh-fun-ticker` 时跑马灯直接跟随自选列表（走同源代理 `/plugins/dsh-ticker/api`，宿主端转 Binance / Frankfurter / eastmoney / Sina 源）；装了 `dsh-longbridge` 时状态栏指数格走券商快照（loopback RPC `/longbridge` `panel/snapshot`）；两个都没装时回退到公共端点，浏览器直接拉腾讯 `qt.gtimg.cn`（A/港/美股 script-tag）、Binance 24h ticker、Frankfurter ECB 汇率。任一层失败都会安全降级为 `--` 单元格。

**Q: 安装后界面没有变化怎么办？**

A: 安装皮肤包不等于已经选中该皮肤。需要在仓库根目录运行 `dsh-skin use trading` 切换；同一时刻只启用一个皮肤，互斥由 profile 层 `cordis.patch.yml` 的 `disabled: true` 行负责，切换走 HMR 热重载，无需重启。

**Q: 状态栏的指数是实时行情吗？**

A: 装 `dsh-longbridge` 时是它的券商快照；未装时是公共指数，每 30 秒刷新一次；两个插件都没装、且公共端点不可达时，所有指数格回退到 `--`。

**Q: 「工作区 --」是正常的吗？**

A: 正常。该格依赖客户端连接句柄上的 `workspace.list` RPC；连接句柄不可用或 RPC 失败时安全降级为 `--`，不影响其他单元格的渲染。

**Q: 网络屏蔽公共行情站点时会怎么样？**

A: 终端 chrome 仍然正常显示，跑马灯 / 状态栏 / 工作区格全部回退为 `--`。所有 fetch 路径都有 5-8 秒超时与 `try/catch` 保护，皮肤不会抛出错误，也不会让 dsh 主界面崩溃。

**Q: 市场时段（盘中 / 午休 / 盘前 / 休市）准吗？**

A: 准到星期与小时级别：A 股 09:30-11:30 与 13:00-15:00（午休 11:30-13:00），港股 09:30-12:00 与 13:00-16:00，美股 04:00-09:30 盘前 + 09:30-16:00 盘中。文档已明确交易所节假日仍按开市处理，是预期限制而非 bug。

**Q: 关闭或切换皮肤后会留下页面痕迹吗？**

A: 不会。客户端注册的生命周期清理器会移除 body 属性、标题栏、跑马灯、状态栏和 favicon；如果文档标题仍等于皮肤写入的字符串则恢复原标题，被会话标题覆盖时不会被一并回滚。测试覆盖了挂载、清理与「不清掉会话标题」三类场景。

## 上手难度
入门 — 装包加一条 `dsh-skin use trading` 即可生效，没有配置项和命令行参数；默认皮肤功能完整，唯一可选的高级操作是把跑马灯换成自选股（装 `dsh-fun-ticker` 并配置）或把指数换成券商快照（装 `dsh-longbridge` 并登录）。

## 已知问题与限制
- 加载页保持原样：DSH 外壳的启动页先于插件 bundle 渲染，皮肤从定型后的 UI 开始生效
- 主题切换在皮肤内部：皮肤在 `data-ds-dark-theme` 两种状态都钉住自己的调色板；切换 Appearance 得到的是亮/暗两套终端配色，而不是非皮肤外观
- 市场时段仅按工作日与小时建模，交易所节假日仍显示为开市
- 美股报价经腾讯源仅为纽交所 / 纳指常规时段口径，加密和外汇全天候显示
- 默认自选列表（`DEFAULT_TAPE`）约 13 个条目，未装 `dsh-fun-ticker` 时跑马灯固定使用这组

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [deepseek-harness-desktop](https://deepseek-plugin.org/plugins/ningbainb/deepseek-harness-desktop/packages/skins/trading)
Wiki generated by AI (model: `MiniMax-M3`)
