Skip to content

Repository files navigation

@dsh-focus/focus-plugin

DSH (DeepSeek Harness) web 聚焦模式插件:?focus=<插槽路径> 让 DSH 页面只显示指定的插槽——消息流、输入区、会话列表、详情面板或任意注册插槽——其余界面隐藏,主视野留给代码。

本仓库也是 intent-flow 工作流的完整展示.intentflow/ 目录记录了每个 feature 从需求 → 设计 → 执行 → 关账的完整 AI 决策轨迹(requirement.md / design.md / later-on.md / report.md),AGENTS.md 是工作流全局规范,_packages/ 是模块现状基线。评审工作流请直接看这些文件。

功能

URL(?focus= 效果
conversation.session 只显示消息流(隐藏输入区、会话头部、侧栏、详情)
conversation.composer 只显示输入区(沉底于视口底部,隐藏消息流等)
conversation.chat.node 消息区域全宽(与 conversation.session 视觉等价)
conversation 对话区整体(含输入区)全宽
sidebar / details 会话列表 / 详情面板全宽
<任意 data-slot 路径> 聚焦三槽内任意已注册插槽(含第三方插件注册的插槽)
无参数 / 未知值 完全正常,插件 no-op

聚焦模式下若 DSH 没有当前会话,插件自动恢复最近的非空白会话(否则消息流视图是空白 hero)。

原理

DSH 的 Web UI 是插槽树(sidebar | conversation | details 三栏),渲染器为每个插槽输出 data-slot="<完整路径>" 的 wrapper。本插件不改 DSH 任何代码,纯 CSS 可见性控制:

  1. location.search?focus=,给 <html> 打上 data-focus="<路径>"
  2. 顶层规则(静态注入):按路径首段把三栏 grid 压成单列轨道——隐藏非目标列容器后,目标列成为唯一 grid item,单轨道无自动放置歧义(规避旧版"详情列被推入 center 列"的 bug);
  3. 嵌套兄弟规则(注册式硬编码):目标插槽的祖先链兄弟(如聚焦 conversation.session 时隐藏 composer 座位与会话头部)生成隐藏 CSS;所有规则预先注册,零时序问题;
  4. 路径专属布局conversation.composer 聚焦附加沉底规则(输入区固定在视口底部,active 相位生效)。

v2 架构设计

核心改进

  • 注册式硬编码规则:零时序问题,官方/第三方可扩展
  • 持续监听保障:处理动态变化(切换会话、插槽重挂载)
  • 快速失败策略:未注册路径直接报错,不静默降级
  • 插件化扩展:第三方可通过 registerRule API 注册自定义规则

架构对比

维度 旧架构(动态枚举) 新架构(注册式)
规则来源 运行时枚举 DOM 预先注册(硬编码)
时序依赖 ✗ 依赖目标渲染 ✓ 零时序
监听策略 ✗ 首次后 disconnect ✓ 持续监听
失败处理 ✗ 静默兜底 ✓ 快速失败
扩展性 ✗ 需改核心代码 ✓ API 注册
稳定性 50%-95% 100%

安装 / 部署

DSH 从 ~/.dsh/profiles/node_modules 解析插件包。把本仓库链接(junction)到该位置,再经 patch 挂载:

# 1. 部署(Windows junction;修改本仓库代码即生效,无需重建)
mklink /J "$env:USERPROFILE\.dsh\profiles\node_modules\@dsh-focus\focus-plugin" "<本仓库绝对路径>"

# 2. 挂载:在 .dsh/dsh.mcp.patch.yml(或任意 --patch overlay)里 insert
#    - id: focus-mode
#      name: '@dsh-focus/focus-plugin'

挂载行的 name 必须精确等于包名(@dsh-focus/focus-plugin),写错会导致 DSH 启动失败(端口打不开)。

  • 首次挂载:需重启 dsh(patch 进 boot graph);
  • 修改插件代码后:无需重启——DSH 的 client-modules 按内容 hash 伺服插件,浏览器刷新即加载新代码。

开发

npm install          # tsdown + typescript + cordis 类型
npm run build        # 构建 lib/client.js
npm run typecheck    # 类型检查

源码结构

  • src/client/index.ts - 插件入口,注册内置规则,安装健康检查
  • src/client/rules.ts - 规则注册系统,支持优先级覆盖和第三方扩展
  • src/client/builtin-rules.ts - 内置规则定义(sidebar/conversation/details)
  • src/client/core.ts - 核心逻辑:路径解析、CSS 生成、持续监听、健康检查

构建产物

  • lib/client.js - DSH 经 /plugins/<id>/client.js 伺服
  • lib/index.js - host 半(空 cordis 插件壳)

调试

# 启用调试模式(URL 参数)
?focus=conversation.session&focus-debug=1

# 健康检查(浏览器控制台)
window.__dshFocusHealth()

# 诊断脚本(浏览器控制台)
# 粘贴 diagnostic.js 内容并运行
  • 基线对齐 @deepseek-ai/dsh@0.1.0-rc.6

🎓 第三方扩展示例

注册自定义规则

// 在第三方插件中
import { registerRule } from '@dsh-focus/focus-plugin'

registerRule({
  path: 'my-plugin.my-slot',
  topSlot: 'conversation',
  hiddenSelectors: [
    '[data-slot="conversation.session"]',
    '[data-composer-seat]',
  ],
  layoutCss: `
    html[data-focus="my-plugin.my-slot"] .my-element {
      position: fixed;
      bottom: 0;
    }
  `,
  description: '我的插件聚焦规则',
  source: 'my-plugin',
  priority: 10,  // 高优先级
})

查询规则

import { listRules, getRuleStats } from '@dsh-focus/focus-plugin'

// 列出所有规则
const rules = listRules()
console.log('Available paths:', rules.map(r => r.path))

// 统计信息
const stats = getRuleStats()
console.log('Total rules:', stats.total)
console.log('By source:', stats.bySource)

规则优先级

  • 优先级数字越大越优先(默认 0)
  • 高优先级规则覆盖低优先级规则
  • 同优先级规则覆盖并警告

内置规则清单

路径 顶层插槽 说明
sidebar sidebar 会话列表全宽显示
conversation conversation 对话区整体全宽(含输入区和消息流)
conversation.session conversation 只显示消息流(隐藏输入区和会话头部)
conversation.composer conversation 只显示输入区,沉底于视口底部(active 相位)
conversation.chat.node conversation 消息节点区域全宽(与 session 视觉等价)
details details 详情面板全宽显示

License

MIT

About

DSH 网页聚焦插件:?focus=<插槽名> 聚焦任意顶层插槽全宽显示,纯 CSS 实现;附完整 intent-flow 设计决策轨迹(需求→设计→执行→关账)DSH (DeepSeek Harness) web focus plugin: ?focus=<slot> shows one top-level slot full-width, pure CSS, no slot shadowing. Includes the complete intent-flow design trail (requirement → design → execute → report).

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages