DeepSeek Harness 蓝皮书
开发者指南

Client UI 与 Slot

浏览器侧开发:在 Slot 注册 UI、使用 theme token,并用 React.createElement 编写界面

Client 是插件的浏览器侧半体,负责主题、布局、当前页面状态、工具卡片与 Slot UI。客户端代码运行在浏览器里,不能使用 Node.js 能力;需要文件、命令或服务时,交给 Host 侧,再通过私有 JSON 方法调用。

只写普通 JavaScript

客户端代码不做 TypeScript、JSX 或 bundler 转换。因此:

  • 不使用 TypeScript 类型、as、装饰器、import/require
  • 不使用 JSX;React 代码必须用 React.createElement(...) 编写。
// 客户端代码里的 React 元素
React.createElement('div', { className: 'card' }, '内容')

在 Slot 注册 UI

客户端 UI 必须注册到已查询到的 Slot 中,apply() 不能直接返回 React 元素。Slot 是客户端架构中的具名可注册位置(保留英文)。

注册前先查询可用的 Slot 树,确认目标 Slot 的注册约定与 props,再按其约定编写代码。这样插件卸载时,注册的 UI 也会随之撤销。

theme token

主题通过 token 表达。浏览器客户端包以 ui-theme 维护 --dsw-* 静态标尺与语义别名(--dsw-alias-*),由 ui-layout 把解析后的主题快照应用到文档。功能包消费语义别名,不再定义另一套全局主题。

在插件里覆盖主题或注入样式时,都要当作可逆副作用:随插件 stop、update 或 undefine 撤销。

样式规则

浏览器客户端组件遵循统一的样式约定:

  • 使用 CSS Modules 与 clsx,不引入组件库或 Tailwind。
  • 功能组件使用 --dsw-alias-* 语义 token,不复制静态色板、不写字面颜色。
  • 主题选择器不进入功能组件的 CSS;明暗色覆盖归主题所有方。
  • 字号与行高配对使用,优先复用主题排版变量。
  • 增加过渡或仅悬停控件时,保留键盘焦点可见性与 reduced-motion 行为。

Host 与 Client 通信

Client 通过包内私有 JSON 方法调用 Host(方向 Client → Host),只有无损 JSON 能跨越边界。不要在插件代码里序列化实时数据——服务、事件、会话等都是内部实时对象;只读取任务需要的叶子字段,再构造最小的自有数据对象。

下一步

本页目录