dsh-a11y

DSH PLUGIN浏览器与联网

仓库 tespio/dsh-a11y · npm dsh-a11y

浏览器与联网 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

为 DeepSeek Harness Web UI 提供无障碍层:统一播报工具生命周期、审批与提问,支持键盘导航与无障碍设置页。

一句话选型结论

按资料字段整理

dsh-a11y 是浏览器与联网类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,列出 4 项功能,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类浏览器与联网 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 1
最近更新 2026-11-11 创建于 2026-11-11
README 15.8 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add dsh-a11y
  1. 1
    确认版本与运行环境

    兼容的 DSH 版本为 0.2.2-rc.1;版本不匹配时安装会报错。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本0.2.2-rc.1版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名dsh-a11y可用 npm view 查看包信息

能做什么

4 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-a11y:为 DeepSeek Harness Web UI 补齐无障碍播报与键盘导航

  • 统一播报工具与审批状态
  • 键盘导航与跳转
  • 无障碍设置页
  • 避免与宿主播报重复

适用场景

联网搜索

上游标签

accessibilitydeepseek-harnessdshdsh-pluginscreen-reader

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-11-12): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询

风险详情

  • 结论说明 静态扫描 低;动态审计无结论(以下以静态为准)→ 总评级 低。
  • 风险计数 严重 0 / 高 0

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。
  • 标注了兼容的 DSH 版本(0.2.2-rc.1),按版本装不容易报错。
  • 列出了 4 项功能,能直接看出它解决什么问题。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在浏览器与联网场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-a11y当前 L5 · 运行验证通过 低风险 0 0.2.2-rc.1 有
dsh-our-free-model L3 · 安装规范通过 低风险 8,796 未标注 有
dsh-web L3 · 安装规范通过 低风险 8,549 未标注 无
BrowserSkill L4 · 沙盒安装通过 低风险 8,456 未标注 有
dsh-pocket L5 · 运行验证通过 低风险 1,656 0.2.0-rc.2 等 12 个 有
Browser4 L4 · 沙盒安装通过 中风险 1,152 未标注 有

仓库档案

浏览器与联网
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方tespio仓库 dsh-a11y · 默认分支 main
分类浏览器与联网browser
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言JavaScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 1收录时的数值,非实时
创建 / 更新2026-11-11 · 2026-11-11最后推送 2026-11-11
本站收录2026-11-12首次进入本站目录的时间

README 全文

15.8 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-a11y

Accessibility layer for the DeepSeek Harness Web UI. This is v1: the
announcement coordinator, keyboard navigation, and an Accessibility settings
page. The v2 author kit (ctx.a11y, `,useFocusTrap,useRovingTabIndex,auditSubtree`) is deliberately not part of this build.

The plugin adds coverage; it does not replace the shipped chat UI.


npm: dsh-a11y@0.1.0

Presentation: PPTX · PDF

Related work and the gap check (2026-11-11)

This package publishes as dsh-a11y on npm. When the build started, the bare
name was unclaimed, but the brief's "no accessibility plugin exists" premise was
already stale:

  • @oh-my-dsh/dsh-accessibility
    (published 0.1.0-beta.3, repo omdsh-dev/dsh-accessibility) is a
    present-day companion with a Settings → Accessibility diagnostic, a
    screen-reader guide, and an experimental Accessible View reading tab. Its
    published line targets DSH 0.1.1-rc.2/0.1.2-rc.1; the repo's migration
    candidate targets 0.2.0-rc.2. Its own README states that it "cannot safely
    replace focus traps, composite-widget keyboard behavior, landmarks, or
    live-region policy from outside the owning components."
  • dsh-a11y-scan runs
    axe-core over local HTML, build output, or URLs. It is a content scanner, not
    a UI live-announcement layer.

dsh-a11y targets the installed DSH 0.2.2-rc.1 and fills the specific gap
the other two leave: a coordinated announcement layer for tool lifecycle,
approvals, and questions, plus skip/latest navigation and the announcement
settings. It overlaps the diagnostic/settings surface only partially.

Install

From npm:

dsh plugin --profile web add dsh-a11y

The latest npm release is 0.1.0.

Or install this checkout as a profile bundle:

# plugin_manager -> install_bundle ->

If you previously installed a local development copy, remove it before
installing the npm package; both register the same slot ids.

The bundle has a no-op Host half (index.js) and a browser half
(client.js, declared by package.json's dsh.client). It installs as a normal
profile bundle; no app.asar edits are involved.

What the host already announces (do not duplicate)

Verified against the shipped @deepseek-ai/dsh-client-ui-chat 0.2.2-rc.1
bundle, lib/client.js:

Moment Host component Live-region markup Text
Turn start RunningStatus span.visuallyHidden[role=status][aria-live=polite][aria-atomic=true] chat.deepDiving ("Deep diving")
Turn end TurnProcessNodeView span.visuallyHidden[role=status][aria-live=polite][aria-atomic=true] message.turnProcess.worked / message.stopped / message.turnProcess.failed
Retry countdown ModelRetryItem span[role=status] (implicit polite) message.retry.status
Terminal turn error TurnErrorItem div[role=status] (implicit polite) message.turnError / message.taskStopped + failure text
Token cap TurnMaxTokensItem div[role=status] (implicit polite) message.maxTokens

Tool rows also render visually-hidden row.running / row.failed text, but
those spans are not live regions; adding/removing them does not announce on
its own. That is part of the gap this plugin fills.

How dsh-a11y coordinates

dsh-a11y never emits turn start or turn end announcements. Its only live
regions are the new pair in shell.overlay (polite + assertive). Turn start,
turn end, retry, terminal turn errors, and token-cap notices stay owned by the
host regions above. This was a deliberate "stay silent" choice, not blind
muting: the host's two role="status" regions are visible in the installed
chat component and their copy was verified from both the installed package and
the extracted app bundle.

If the host later removes those regions, this plugin becomes the only coverage
for tool activity, approvals, and questions, but turn start/end would need a
follow-up.

Announcements

Source: Client state only.

  • Tool started — useChat(snapshot => snapshot.legacy.runningCalls),
    announced when a call reaches phase === 'start' (preparing calls stay
    silent).
  • Tool finished / failed — useChat(snapshot => snapshot.legacy.nodes),
    correlated by callId with the running call. Failure is isError: true;
    the detailed summary comes from error.reason / error.code / the first
    text block, truncated to 96 characters.
  • Approval requested — useSessionStatus(...).pendingInteraction with
    kind === 'approval'; assertive. The tool name and request reason are
    included.
  • Question asked — the same pending-interaction source with
    kind === 'question' or kind === 'plan-review'; assertive.
  • Settings test — the Test button in the Accessibility page pushes a
    forced polite announcement so users can verify the route to their screen
    reader.

Streaming assistant tokens are never announced. Announcements are triggered by
state transitions, not by render counts or token deltas.

Announcements follow the Chat transcript target. In the Trajectory view the
Chat target may not be materialized, so tool transitions can be unavailable
there; the host's own turn boundary regions have the same dependency. This is a
known v1 limitation.

Verbosity and merging

  • Off — no polite announcements. Focus management still runs. The Test
    button still works.
  • Concise — "Tool bash started", "Tool bash finished", "Tool bash failed",
    approvals and questions.
  • Detailed — finished results include a short result summary and duration
    ("Tool read finished in 0.4 seconds. package.json").

Fast tools are merged in the queue: a still-queued start is replaced by its
finish, so a 50 ms tool is spoken once, not twice. The announcement speed
setting controls the gap between queued messages (250 / 700 / 1400 ms). The
queue is capped at 30 items, and identical consecutive text is alternated with
a zero-width space so screen readers do not suppress a repeat.

History paging does not replay old tools: the coordinator primes a sequence
watermark on mount and only treats newer tool-result nodes as live. A tool
that was already running when the session opened still gets its finish
announced.

Navigation

  • Skip link — a visually hidden "Skip to conversation" link is the first
    Tab stop from the document root. The plugin captures the first Tab when
    nothing is focused and focuses the link; Enter (or the next Tab) lands on the
    latest turn boundary inside the transcript, falling back to the composer
    input when there is no turn yet. The link becomes visible when focused.
  • Landmarks — the skip link sits in a labelled nav; the jump button sits
    in a "Conversation navigation" nav; the settings page is a labelled
    section.
  • Per-turn headings — each completed turn contributes an
    h2 ("Turn 3: completed") in conversation.chat.turnTail. It is visually
    hidden, tabIndex=-1, and is the focus target used by the skip link. The
    latest turn's heading carries id="dsh-a11y-turn-latest".
  • Jump to latest turn — a compact button in conversation.composer.dock
    focuses the most recent visible turn heading.
  • Approval focus — when an approval becomes pending, the plugin stores the
    previously focused element, moves focus to the approval card's detail group
    (the host card has no focus move of its own), and on settlement restores the
    previous focus target, or the composer input.
  • Focus ring — the Accessibility settings page can add a 3 px brand-colored
    :focus-visible outline to every control.

The host settings panel already uses its useModalLayer primitive for the
dialog focus trap and focus restore; the plugin does not add a second trap
inside it. Only the approval takeover needed a focus move and restore, which the
coordinator supplies.

Known limitation: the plugin cannot own the transcript container. The host
offers no additive slot at the start of the transcript, so the skip target and
per-turn headings live at turn boundaries (turn tails). Per-turn headings are
therefore navigable in the heading list but describe a turn from its end.
Fixing that properly needs a host change (see "Host findings").

Settings

The Accessibility page is its own settings.section (id: accessibility,
order 30) with:

  • Announcements: Off / Concise / Detailed.
  • Announcement speed: Fast / Normal / Slow.
  • Focus ring: Default / Emphasized.
  • Motion: Follow system / Reduce motion / Allow motion.
  • Text size: 12–22 px, delegated to the host's theme.setFontSize('text', px)
    so it is the same preference as Appearance → Text size.
  • Test announcement and Reset preferences.

Preferences other than text size are stored in localStorage under
dsh-a11y.settings.v1. They are browser-local, normalized on read, and applied
through data-dsh-a11y-focus / data-dsh-a11y-motion on the document root.
There is no Host Config in v1, so nothing is written to the profile patch.

Motion override:

  • Follow system leaves the host's existing prefers-reduced-motion media
    queries untouched.
  • Reduce motion forces near-zero animation and transition durations on the
    document, including when the OS preference is off.
  • Allow motion restores short transitions (150 ms) and 1 s animations when
    the OS preference is on. This is intentionally a broad, opt-in override; it
    is documented as such because it deliberately contradicts the OS.

All styles use --dsw-alias-* color tokens. The only other values are spacing,
type sizes, and radius fallbacks.

Verification status (this build)

Installed with plugin_manager install_bundle into the current profile;
application: applied, no warnings. Live client registration was confirmed by
cordis_inspect_query:

  • settings.section → occupant accessibility, order 30, active.
  • conversation.composer.dock → occupant a11y-coordinator, order 2, active.
  • shell.overlay → occupants a11y-skip-link and a11y-announcer, active.
  • conversation.chat.turnTail → occupant a11y-turn-heading, order 1000,
    active.

Not verified in this environment: no browser-control or screen-reader
automation was available, so the rendered settings page, Narrator/NVDA speech,
zoom, and axe results remain manual. Automated tests cover the formatter,
queue merging, settings normalization, and locale parity:

node test/run.mjs
# or, in a shell that expands globs:
node test/*.mjs

Manual test protocol

  1. Turn start/end, no double-speak. With Narrator or NVDA, send a prompt
    with 3+ tool calls. You should hear "Deep diving" at start and one
    worked/stopped/failed turn-end message, never a second "Turn started" or
    "Turn finished" from this plugin.
  2. Concise. At Concise, each tool's start and finish is distinguishable by
    tool name; failures say "failed".
  3. Detailed. Switch to Detailed and confirm finished messages include a
    result summary and duration.
  4. Approvals. Trigger a tool that requires approval. You should hear the
    assertive approval announcement, focus should land in the approval card, and
    after answering, focus should return to the composer (or the previously
    focused control).
  5. Questions. Trigger a question and confirm one assertive question
    announcement; the host question composer already autofocuses its input.
  6. Skip link. Reload with no focus. Press Tab once: the skip link appears.
    Press Enter (or Tab again): focus lands at the latest turn boundary; the
    screen reader reads the turn heading.
  7. Keyboard only. Start a session, send, stop, approve, and switch sessions
    without a mouse. With the focus-ring setting on Emphasized, every control
    should show a visible outline.
  8. Reduced motion. Set OS reduced motion on, choose Allow motion, and
    confirm host transitions return; then choose Reduce motion with the OS
    preference off and confirm they collapse.
  9. Zoom and width. Browser zoom 200% and a 320 px viewport: the
    Accessibility page rows stack; selects and buttons do not clip.
  10. axe. Run axe-core over the app shell. Plugin-owned surfaces should have
    zero critical violations. Host findings below are recorded, not silently
    patched.

Host findings (for the DSH team)

These are host-level gaps observed while building this plugin. They are not
fixed by global CSS or DOM hacks here. They are tracked in
issue #1.

  1. No skip link. The shell has no "skip to main content" control. The
    plugin can only put its link in shell.overlay, which is after the main
    content in DOM order; the first-Tab focus is implemented with a capture
    handler.
  2. No additive slot at the start of the transcript. Turn tails are the
    earliest plugin-owned position inside the chat flow, so per-turn headings
    describe a turn from its end and the skip target is the latest turn
    boundary. A conversation.chat.turnHead/turn-start list slot (or a
    transcript-start anchor slot) would make this correct.
  3. Approval card has no dialog/landmark/live region and no focus move.
    ApprovalPanel renders a warning strip and buttons inside the composer
    takeover but does not focus it; dsh-a11y supplies the announcement and
    focus move. A role="region"/aria-labelledby and focus move in the host
    would remove the need for both.
  4. Tool lifecycle is silent. row.running / row.failed are visually
    hidden but not live regions. The host could own a single polite tool
    announcer; until then this plugin does.
  5. Question and plan-review cards expose only error role="status". The
    question text itself is not announced when the card appears. The composer
    autofocuses its input, which mitigates but does not cover a pending card
    that appears while focus is elsewhere.
  6. role="status" is used for several unrelated notices (retry, turn
    error, token cap) without an explicit aria-live; behavior depends on the
    screen reader. A consistent polite/assertive policy would help.
  7. Heading order in the shell is uneven. There is no single main landmark
    in the frame; the center column and rightbar are generic containers. A
    `` around the active panel would give screen readers a reliable
    landmark.
  8. Focus ring styling is per-component. Most controls have a visible
    focus style, but the plugin's Emphasized setting is still useful because
    some host controls inherit only a subtle outline.

v2 (not in this build)

The author kit remains the next step:

  • ctx.a11y provided by this package, with announce(), `,useFocusTrap,useRovingTabIndex, andauditSubtree(ref)`.
  • The audit panel that runs the kit against a plugin's own slot and produces
    pass/fail paths plus a manual checklist.
  • Tests for the audit rules against fixture DOM.

ctx.provide() is available to a Client half, so ctx.a11y is feasible. The
kit must audit only the caller's own subtree, never a foreign plugin's DOM.

Package layout

File Purpose
index.js Host half, no-op in v1.
client.js Browser half: dictionaries, bus, coordinator, skip link, turn headings, settings page.
cordis.patch.yml Inserts the dsh-a11y Host row.
locale/en.json, locale/zh.json Plugin Manager metadata and the same strings as the runtime dictionaries.
icon.svg Bundle icon.
test/*.mjs Formatter, queue merging, normalization, locale parity.

License

MIT. See LICENSE.

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-a11y 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add dsh-a11y` 即可。对应的 npm 包名是 `dsh-a11y`。

dsh-a11y 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-a11y 安全吗?

低风险。静态扫描 低;动态审计无结论(以下以静态为准)→ 总评级 低。

dsh-a11y 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-a11y 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.2-rc.1。

dsh-a11y 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-a11y 有哪些功能?

统一播报工具与审批状态、键盘导航与跳转、无障碍设置页、避免与宿主播报重复。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

浏览器与联网
按星标排序,可作替代方案

dsh-our-free-model

dsh-our-free-model

在 DeepSeek Harness 中装上这个 DSH plugin,无需登录、注册或填 API Key,即可直接调用 DeepSeek

L3 · 安装规范通过 8,796 星

dsh-web

dsh-web

侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。

L3 · 安装规范通过 8,549 星

BrowserSkill

BrowserSkill

BrowserSkill 的 DeepSeek Harness 浏览器自动化桥接插件,通过原生浏览器工具控制可见的 Chrome 和 Edg

L4 · 沙盒安装通过 8,456 星

dsh-pocket

dsh-pocket

DSH Pocket 让 DeepSeek Harness 装进口袋:电脑跑 dsh web,手机扫码即实时同步访问(局域网+公网),人在外

L5 · 运行验证通过 1,656 星

Browser4

Browser4

L4 · 沙盒安装通过 1,152 星

agentrq

agentrq

L4 · 沙盒安装通过 1,140 星

tespio 的其它插件

2 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-11-12。