跳过主要内容
Z

dsh-trust-panel

zhengqiuyang/dsh-trust-panel

信任面板:把 dsh 信任插件族九个通道(注入拦截、写拒绝、出网拦截、custody 链校验、工具面/系统提示词漂移、残留扫描、压缩遗忘约束、profile 组成)聚合成右侧栏一块仪表盘——一个状态灯 + 事件卡片,把引擎术语翻译成非安全背景用户能看懂并知道要不要处理的句子;read/egress 引擎随包自带 npm 依赖,未装兄弟插件也能工作,缺失的通道仅显示未安装。

安装

dsh plugin --profile web add github:zhengqiuyang/dsh-trust-panel

README

dsh-trust-panel

If this helps you, please give it a star — it helps others find it. Thanks!

demo: a tool-drift and a forgotten-constraint card acknowledged until the light turns green

One plain-language dashboard for the dsh trust family in your DeepSeek Harness (dsh) web sidebar: every interception, denial, drift and forgotten constraint across nine channels, translated into sentences a non-security user can read and act on. Zero LLM calls.

What you see

A status light, nine channel rows, and event cards — that's it:

  • 🟢 All clear — nothing suspicious
  • 🟡 Caught a few things for you — all handled, nothing to do
  • 🔴 {n} thing(s) worth a look (below) — each such card carries a Got it button; acknowledging it clears the state, and the light falls back on its own

Every event answers the same four questions in order: who, what they tried, what we did about it, whether you must act. Engine jargon (INSTR_OVERRIDE, hash-chain digests, surface drift) stays in the expandable detail; the headline is a sentence like:

Something the agent read tried to send your credentials somewhere. It was quarantined — the agent did not follow it.

A long conversation was summarized — the agent forgot 2 of your instructions. They were re-inserted automatically.

The tools available to your agent changed since the last checkpoint. 1 removed: janitor_scan.

A first-run intro card explains the light and the row semantics in one glance; it dismisses with one click and stays dismissed.

Bilingual (zh/en)

The panel follows the DSH i18n system: events travel from the host as translation keys + params, the client renders them through its zh/en dictionaries with the host's locale service (language switches live, browser language as fallback). A regression test pins the contract: every key the host can produce must exist in both dictionaries.

State-like events (tool-surface / prompt / composition drift) carry a content-derived stable id: acknowledging one sticks across polling, and a genuinely new drift arrives as a genuinely new card.

The nine channels

ChannelSourceWhat it watches
What the agent readsdsh-read-guardprompt injection in files and fetches
What the agent changesdsh-pr-gatewrites outside the promised scope
The activity recorddsh-attest-chaintampering with the custody ledger (verified live)
The tools it can usedsh-mcp-testregistry drift vs baseline
Leftovers in your workspacedsh-janitorscan verdicts
Where data is sentdsh-egress-gatedestinations outside the allow list
The instructions it starts withdsh-prompt-driftsystem-prompt changes
The plugins that are loadeddsh-freezeprofile composition
What it remembersdsh-compaction-guardconstraints lost to compaction

Channels report not installed when their plugin/data source is absent — the panel degrades gracefully and still works standalone: the read/egress engines run from the panel's own npm dependencies, so injection and egress events appear even without the sibling plugins.

Install

dsh plugin --profile web add dsh-trust-panel

Configuration (in cordis.yml): eventsPath (panel event log), maxEvents, and the allow/deny domain lists used by the built-in egress mirror.

Design notes

  • The trust path stays deterministic — the panel only reads files and harness events; it never calls a model.
  • Translation, not display — the engine terminology the family logs internally is mapped to plain sentences in translate.ts; the mapping is unit-tested, so a rule rename cannot silently regress the wording.
  • Poll, don't push (v0.1) — the client polls /trust-panel/api/summary every 5 s; a WebSocket upgrade can come later without changing the model.
  • Web client modules are not plain ESM — dsh's web runtime loads client halves through its window.__ModuleLoader__ module table (react arrives via that table's require, not a bundler). This package authors its client directly in that format and ships it unbuilt; a rolldown build is unnecessary at this size. Undocumented upstream, learned the hard way.
  • Native sidebar tabs are address-driven — registering a tab kind shows nothing until the sidebarRight controller opens it; the panel calls openTab once per session so the light is visible out of the box.

Kill criteria

If the family's engines change their ledger formats in incompatible ways and the sync cannot be maintained, this panel should be retired rather than show stale or wrong translations — a trust UI that lies is worse than none.

Compatibility

  • Verified on DSH 0.2.x (source snapshot 0.2.1-alpha.2, 2026-10-19): disposable-profile install → boot → right-sidebar tab compose → /trust-panel/api/summary responds with live aggregation (including a true-positive tool-surface drift detection during the verification boot), Chinese rendering verified in-browser, acknowledge flow verified across poll cycles by browser automation.
  • Node ≥ 20.

License

MIT

相关插件