DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
A

@deepseek-ai/dsh-a11y-announcer

A11y Announcer

用于 DeepSeek Harness Web UI 的无障碍插件:通过 aria-live 区域播报出现的工具调用和已完成的助手消息,以便屏幕阅读器朗读。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:slohmaier/dsh-a11y-announcer#02ddba97739fe737f2b71b524392d1f265cf2684
README兼容性版本

兼容性与来源证明

A11y Announcer 以 @deepseek-ai/dsh-a11y-announcer 发布,当前版本为 0.1.0-rc.8。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/8/25

版本

0.1.0-rc.8prerelease
2026/8/25

相关插件

正在加载相关插件…

最新版
0.1.0-rc.8
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
未声明
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/9/14
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Client Ui Skill Explorer@linxin666/dsh-client-ui-skill-explorerDSH 技能中心:按来源(bundled / project / user / custom / runtime)浏览已加载的技能,在 Web GUI 面板中启用或禁用、创建和删除技能。Client Ui Git Graph@linxin666/dsh-client-ui-git-graph外部 dsh Web GUI 插件:空会话 Git 分支选择器和 Git 图,包含实际的主机端 Git 操作与防护,作为 dsh 配置文件包Client Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。Client Ui Market@linxin666/dsh-client-ui-marketWorkshop 浏览卡片:浏览来自 dsh-market.com 的皮肤、宠物和社区插件,并在 GUI 中安装(资源安装到 DSH 主目录,插件通过可选的插件管理器安装)。

README

dsh-a11y-announcer

Accessibility plugin for the DeepSeek Harness web UI. Announces tool calls as soon as they appear and finished assistant messages through an aria-live region. NVDA/JAWS/VoiceOver read the live region automatically, without moving the user's focus.

Behavior

  • Tool calls are announced shortly after they appear ("Tool: <name + content>"), once their text is briefly stable — NOT when they finish (the start is the interesting moment). A short debounce (TOOL_SETTLE_MS=400ms) avoids reading the very first streaming fragment (e.g. a half token like "ulti" from "multi-...").
  • The last finished assistant message is announced with its full text over the live region (not while streaming).
  • Only the visible answer text is read; the agent's internal reasoning ("Think" block) is excluded so streamed reasoning fragments are not read aloud.
  • Deduplication via data-chat-anchor-key: each element is announced only once; re-renders do not trigger a new announcement.
  • Assistant settle is detected via the data-streaming attribute (dsh removes it once streaming finishes), so only complete text is announced.
  • No replay: nodes already present when loading an old session are not walked through, only new events from now on.

Deep-diving announcement

  • While the dsh "Deep diving..." status (agent working) is active, "Deep diving..." is announced every 5 seconds over the live region for as long as the state persists (first announcement after 5s, then every 5s).
  • Detection by content: a role="status" element whose text contains "Deep diving". IMPORTANT: dsh may additionally render an EMPTY role="status" element; therefore match on text content, not on the first role=status.
  • Fallback: in addition to the MutationObserver, a 1s polling loop (for missed mutations).

How it works

  • Client plugin, discovered via dsh.client metadata (platform: web) and activated as its own bundle (dsh.bundle.patch = cordis.patch.yml with - insert) in the web profile.
  • lib/index.js = plain host loader entry (apply/inject), NO window.__ModuleLoader__ wrapper (server-side, otherwise "window is not defined" and the plugin is not activated).
  • lib/client.js = browser bundle (ModuleLoader wrapper). Uses a MutationObserver on the [data-slot="conversation.session"] container and selects targets via data-chat-flow-kind / data-chat-anchor-key.
  • Assistant settle detection via the data-streaming attribute: dsh renders the assistant markdown root with data-streaming while it streams and REMOVES it once the full text is settled. The plugin observes attribute changes (attributes + attributeFilter: ["data-streaming"]) and only announces when the node is no longer streaming — so it never reads partial output.
  • Tool calls are announced after a short debounce (TOOL_SETTLE_MS=400ms) once their text is briefly stable, without waiting for completion.
  • Text extraction: clones the node and REMOVES the agent's internal reasoning ("Think" block, data-variant="think") before reading textContent. This keeps the hidden, streamed reasoning fragments from being read aloud — only the visible answer text is announced. It also strips known model-artifact lines (a bare "ulti" the LLM occasionally appends). For tool calls, textContent also captures collapsed/hidden content (which innerText would omit).
  • Announcement: a hidden (but assistive-visible) div with aria-live="polite" + role="status"; textContent is set when settled. No element.focus() (moves the user's focus unnecessarily and did not reliably read elements).

Installation

  • Package: this repository (e.g. cloned to /opt/dsh/plugins/dsh-a11y-announcer/).
  • Add as a file dependency in /opt/dsh/package.json and /mnt/ssd/dsh/profiles/web/package.json.
  • Add as a bundle in dsh.profile.bundles (profiles/web/package.json).
  • After changes to lib/client.js: restart dsh web (no bundle build needed, the file is served directly).

Files

  • lib/client.js — browser bundle (MutationObserver + aria-live announcement)
  • lib/index.js — host loader entry (empty)
  • cordis.patch.yml — - insert of the loader entry
  • package.json — dsh.client + dsh.bundle + exports["./client"]

Tests

Logic verified in jsdom (see development test cases):

  • A tool call is announced shortly after appearing ("Tool: ") with its full text, without waiting for completion; streaming fragments (e.g. "ulti" from "multi-...") are not announced thanks to the short debounce.
  • A finished assistant is only announced after text stability (900ms) with the full text, not while streaming.
  • The live region has aria-live="polite".
  • Deduplication via data-chat-anchor-key works.