deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:2031814001yuyue-tech/dsh-side-chat
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
DSH 侧边对话插件 —— 并行侧边对话:在主对话之外开一条真实并行 agent 会话(独立上下文、共享工作区),结束后把结论摘要带回主对话,主对话上下文不被污染。
纯 JavaScript、MIT 许可。一份源码两种加载方式:既可作为 DSH 动态 Cordis 插件即时加载(免构建),也可作为 npm 包正式安装(跨重启持久)。
/side 命令:/side 你的问题 直接开一条侧对话(Web 面板自动打开)。| 设计要点 | 本插件实现 |
|---|---|
/side 斜杠命令 |
/side [消息] 命令 + 面板「+ 新建」 |
| 独立上下文窗口 | 独立 Session + Agent(继承主会话组合、同工作区) |
| 线程自由切换 | 面板会话列表点击切换 |
| summarize & bring back | side agent 自总结 → 折叠提示行注入主会话 |
| ephemeral / 丢弃 | 关闭即停止 agent;创建即归档(列表隐藏),注册表内存态不跨重启 |
完整设计见 docs/design.md,验收记录见 docs/verification.md。
通过 DSH 动态 Cordis 插件流程加载(免构建、免 npm 依赖):
src/host.js 的完整内容。src/client.js 的完整内容。side,名称 DSH Side Chat。在 DSH profiles 目录安装包(与 web/headless profile 共享的 node_modules):
cd "$DSH_HOME/profiles" # 例如 C:\Users\Lenovo\.dsh\profiles
npm install dsh-side-chat
把包注册为 bundle(与官方 client 插件、dsh-vision 同款机制):在目标 profile 的 package.json(如 profiles/web/package.json)的 dsh.profile.bundles 里加一项:
"dsh": {
"profile": {
"bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-side-chat"]
}
}
包内自带的 cordis.patch.yml 会在启动时自动插入加载行——不要再往 profile 的 cordis.patch.yml 里手动加行,否则重复注册会崩溃。
重启 DSH 即生效。
机制:包内 dsh.client 元数据声明了浏览器半体,DSH 的 client-modules 自动将其编入启动清单(window.__DSH_BOOT__)并从 /plugins/dsh-side-chat/client.js 加载;Host 半体把 RPC 桥接为 /sidechat-api/* HTTP 路由。npm 路径与动态路径共用同一份 src/ 源码,行为一致;lib/ 为构建产物(npm run build 生成,npm run check / npm run smoke 做语法与适配器冒烟验证)。
动态方式零依赖、即改即生效,适合开发调试;npm 方式跨重启持久、可分发,适合日常使用。两者可以共存。
/side 查一下 xxx 直接创建并发送首条消息。Host 半体(src/host.js,DSH Node 进程)
| 职责 | 实现 |
|---|---|
| 侧对话注册表 | 内存 Map,每主会话上限 8 |
| 创建侧会话 | agents.create(注册表 ctx 做 owner;setup 里 composeFrom 继承主 agent 组合) |
| 消息注入 | agent.send(message, 'next-turn', true) |
| 状态同步 | 监听 agent/status、agent/error |
| 摘要带回 | agent.send(总结请求) → whenIdle() → sessions.flush → readSession 取末条 assistant 文本 → mainAgent.inject(摘要, notice 形态)(不唤醒主 agent) |
| 关闭 | handle.dispose() + workspaceRegistry.archiveSession |
| 列表隐藏 | 创建即 archiveSession(归档只是列表记账,不影响 agent 生命周期) |
| 命令 | commands.register 注册 /side |
| RPC | 动态路径 harness.handle;npm 路径桥接为 webServer 路由 /sidechat-api/sidechat/{open,send,state,events,bring-back,close} |
Client 半体(src/client.js,浏览器)
| 职责 | 实现 |
|---|---|
| 入口按钮 | conversation.session.header.actions(id sidechat-toggle,标题栏右侧 ⤳ 图标,支持恢复最小化面板) |
| 侧边面板 | shell.overlay(id sidechat-panel,右侧浮层,可拖拽调宽 300–900px,可最小化为胶囊) |
| 数据刷新 | 面板打开时 1s 轮询 sidechat/state + sidechat/events |
| 消息渲染 | 轻量 Markdown 渲染(React 元素,防 XSS)+ 角色标签 + 时间戳 + 智能自动滚动 |
| 自动开面板 | 监听 openSignal(/side 命令触发) |
| 样式 | styles.insert(npm 路径为 DOM <style> shim)+ --dsw-alias-* 主题变量(明暗自适应,尊重 reduced-motion) |
数据流
面板输入 → host.call('sidechat/send') → sideAgent.send(…, wake) → 侧 agent 处理 → 面板轮询显示回复
带回主对话 → host.call('sidechat/bring-back') → 侧 agent 自总结 → notice 折叠行注入主会话 → 主 agent 下一轮可见
/side 在 Web 输入框的可见性:取决于当前 DSH 版本对自定义命令的暴露程度;面板按钮在所有版本可用。notice 折叠行(一行小字),模型可见全文,界面不刷屏。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。