dsh-region-probe
Manifest validA read-only Cordis Inspect provider that lets an agent see the interface it is driving: outline() reports which UI regions the running shell actually rendered, with occupancy, geometry and current or
dsh-region-probe
A read-only Cordis Inspect provider for DeepSeek Harness: it tells an agent which UI regions the running shell actually rendered — and what they rendered — so a rendering bug can be found by the agent itself, in the real app, without a screenshot or a human looking at the screen.
No UI. No tools. No network. One provider, three read-only methods.
Why this can work at all
The Harness shell renders every UI region as a slot anchor:
<div data-slot="sidebar.workspaces">…what the occupant rendered…</div>
<div data-slot-error="tool.view.demo">…when that occupant failed to render…</div>
(The anchor itself is display: contents — it has no box; the occupant supplies the layout.)
So every region — the ones this DSH version ships, the ones a later version adds, and the ones third-party plugins contribute — carries a stable slot key in the DOM without that region needing to cooperate. This provider reads those anchors, which is why it needs no list of regions, no per-region code, and no CSS class names (the shell's own class names are CSS-module hashes like BynINW_frame and change with every build; slot keys do not).
What an agent can ask
| Method | Answers |
|---|---|
outline() | Every region present in the DOM right now: slot, failed, failedBefore, empty, anchors, nodes, on-screen box (x,y,width,height), a text sample. Plus total, failed, failedEver. |
snapshot({ slot | selector, depth?, limit? }) | The rendered content of one region as a bounded node list: path, tag, role, aria-label, owning slot, own text, geometry, visible, fontSize, color, background. |
failures() | Failure history for this page: which slots failed to render, how many separate times, and whether each is failing now or has recovered (active / recovered / firstSeenAgoMs / lastSeenAgoMs). |
Addressed by slot key (preferred) or by any CSS selector (fallback). depth defaults to 3 (anchor → surface → row → label), capped at 8; limit defaults to 60 nodes, capped at 300.
Reading through the agent's existing inspection tool:
// cordis_inspect_query({ platform: "client", provider: "Regions", method: "outline" })
{
"total": 36, "failed": 0, "failedEver": 1,
"regions": [
{ "slot": "sidebar", "nodes": 137, "x": 0, "y": 0, "width": 280, "height": 900, … },
{ "slot": "main", "nodes": 110, "x": 280, "y": 0, "width": 1160, "height": 900, … },
{ "slot": "sidebar.workspaces", "nodes": 49, "x": 12, "y": 204, "width": 268, "height": 640,
"failed": false, "failedBefore": true, "empty": false,
"text": "会话树 + ⋯ ▶ xiaomi-power-key-proj …" }
]
}
A slot that is a list can render the same key in more than one place (the sidebar panel list renders once expanded and once in the collapsed rail); those anchors are folded into one region with anchors: 2 and the union box.
Failure history
outline() can only see what is broken right now, so a region that rendered broken for a moment and then recovered leaves no trace — exactly the class of bug a single snapshot misses. The provider therefore keeps a bounded ledger (200 entries) for the life of the page:
- it starts with the plugin (
immediately: true), so it sees the page from boot; - a
MutationObserveronchildListre-syncs when a failed anchor appears or disappears, and every answer re-syncs as well, so the ledger is correct even whereMutationObserveris unavailable; - a slot that is no longer failing is marked
recovered: trueand kept; - a slot that fails a second time gets
count: 2.
The reason a region failed is not here — the shell only leaves an empty data-slot-error marker; the error itself goes to the page console.
What it can and cannot see
- ✅ Every region that is in the DOM, including regions contributed by other plugins, plus regions added by future DSH versions — nothing needs to opt in.
- ✅ Shadow roots and same-origin frames are traversed; the node path says so (
#shadow,#frame). - ✅ Regions that are declared but rendered nothing (
empty: true) and regions that failed (failed: true) are distinguished from regions that are missing — the provider never answers a silent empty list: "no region is rendered", "render-error", "selector matched nothing" and "invalid-selector" are different reasons. - ❌ Content inside a cross-origin iframe, and anything painted into a canvas, cannot be read; the provider reports the host element and does not pretend otherwise.
- ⚠️
data-slot/data-slot-errorare renderer implementation details, not a documented contract. If a future shell stops emitting them,outline()returns nothing — usesnapshot({ selector })instead, which does not depend on them. - ⚠️ Which page answered is not determined by this plugin: a Harness host broadcasts an inspect query to every connected page and takes the first valid answer, so in a multi-window setup the geometry you read describes the page that answered.
Install
DSH installs plugins as profile bundles. Plain ESM, no build step, no dependencies.
From the GUI: Plugins page → Add plugin → paste https://github.com/orphiczhou/dsh-region-probe.
From the CLI:
dsh plugin add orphiczhou/dsh-region-probe
From a local checkout: add the directory as the spec in the same dialog.
The client half loads with the page. Install it and reload the Harness page once; from then on cordis_inspect_list shows the Regions provider on the client platform.
Privacy and safety
This bundle gives an agent the ability to read the Harness UI: region names, visible text, computed colours and geometry. It does not click, write, or navigate; it touches no cookie, no localStorage, and makes no network request; every answer is bounded (nodes, depth, text length) and text is truncated. It exists for self-verification, so treat it as a development tool: disable it if you do not want a session to be able to read its own interface.
Compatibility & version policy
This bundle declares no peerDependencies. That is deliberate: peerDependencies on @deepseek-ai/dsh* is the only compatibility field DSH enforces, so declaring none means the plugin does not hard-fail on a runtime upgrade. It talks to exactly one optional client service, cordisInspect, requested with an optional injection (ctx.inject([...], cb)) so that in a composition without the client runner the plugin simply does nothing instead of failing to load.
Development
node test/contract.cjs # 100+ assertions, no DSH install required
node scripts/verify-bundle.mjs
test/contract.cjs runs the real client.js against a miniature DOM that models exactly what the shell produces — data-slot anchors, a data-slot-error anchor, a 0×0 anchor whose content is in its children, a list slot rendered twice, a nested transparent wrapper, an empty region, a shadow host, a same-origin frame, a canvas — then drives a crash → recovery → crash again sequence through the ledger, and judges every answer with the shipped DSH schema engine when one is available locally (it skips that part rather than pretending to pass when it is not).
License
MIT
Comments
Loading…
Similar plugins
by dsh-plugins
A version‑aware adapter registry that decouples third‑party Cordis plugins from dsh’s internal service names, paths, and RPC internals. 基于版本感知适配器注册表,为 dsh Cordis 插件提供运行时兼容层,使第三方插件与内部服务名、模块路径及 RPC 细节解耦
★ 3
↓ 229/wk
TypeScript
Sep 7, 2026
dsh plugin --profile web add @dsh-plugin/dsh-loaderby Neo65536-engineer
Read-only work reports for DeepSeek Harness: reconstruct what an agent task actually did from session logs — tools used, files read/written, commands run, test results, failures, token usage, and whether it finished. Fully offline, no API key, no data leaves your machine.
★ 1
MIT
JavaScript
Sep 26, 2026
dsh plugin --profile web add dsh-agent-logby huiliyi37
官方 DeepSeek Harness 的交互式终端 UI 插件:自研 ANSI 极简交互渲染、流式 Markdown/工具卡、16+ 主题、slash 命令与选择器、输入历史与本地偏好持久化、LSP 诊断、memory记忆,很丝滑的开发体验。
★ 286
↓ 486/wk
Apache-2.0
TypeScript
Sep 30, 2026
dsh plugin --profile terminal add @huiliyi37/dsh-tianshu-tuiComputer Use for macOS desktop applications: reads any app's accessibility tree as text with element indices, then clicks, types, pastes, scrolls, drags, selects text and sets values through it, plus
★ 0
dsh plugin --profile web add dsh-mac-cuaby jianjianzhu
Full-page Harness console for the DeepSeek Harness Web GUI: sessions, plugins, market, MCP, skills and usage in one shell.
★ 0
MIT
JavaScript
Sep 20, 2026
dsh plugin --profile web add dsh-harness-uiDSH 模型健康检查:在会话视图新增「模型健康检查」页签,按「供应商(baseURL分组) → API类型 → 模型 → 路由」四行按钮选定目标,手动发送一条真实裸 HTTP 测试请求(支持 openai-completions / openai-responses / anthropic-messages 三协议,流式与非流式可切),一屏展示耗时、TTFT、HTTP 状态、token 用量、响应内容与三层诊断链(API请求 / 模型响应 / 严格校验),错误全部人话化。可把当前模型一键设为默认(下次打开即预选)。另提供用户显式启动、成功即停的有限自动重试会话(严格/连通两种成功判定、4 条停止条件、致命错误不短路)。不做后台监控、不轮询、不告警、不落盘。
★ 0
dsh plugin --profile web add dsh-model-health-probe