UI Enhancements

dsh-hover-approve

wydddddcool/dsh-hover-approve · ★ 2

wydddddcool

Anchors an approve/answer bubble to each DSH Web sidebar session row — one-click handling of authorization, questions, plan reviews and blocked goals without opening the conversation.

License
MIT
Added
2026-08-21
Maintenance
active
Install kind
github

No manifest check is available; listing does not imply compatibility or security review.

安装

dsh plugin --profile web add github:wydddddcool/dsh-hover-approve

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

README

Source README · body: en · Read Chinese README

Table of contents
  1. Why
  2. Features
  3. In action
  4. Install
  5. Relationship with DSH
  6. Testing
  7. Limitations
  8. License

Why

DSH conversations regularly need you to stop and act: approve a file write, answer a question, confirm a plan, check why a goal got blocked. The built-in panel makes you open the conversation and scroll to act — switching back and forth breaks your flow.

This plugin keeps the interaction at the session's list row: a bubble pops up anchored to the row, a tail line and dot point at which session is waiting, and you approve / reject / answer right in the bubble — no need to open the conversation.

Features

In action

Real DSH Web UI (bubble anchored to the session row, tail line + dot pointing at the session):

Approval: action / agent note / file highlight / reject or approve

Blocked goal: red reason + objective + open session

  • Auto-appears, no hover needed: anchored to the session row — you always know which session is waiting;
  • Complete information: plain-language action labels (bash → "run terminal command", write → "write file"), highlighted file path, command collapsed to one line (click to expand), agent note shown prominently;
  • Dismiss by clicking outside: click anywhere outside (or the ×) — it stays closed for this round and reappears on the next interaction;
  • Follows the list: bubble and tail track the row on scroll / re-render; concurrent interactions anchor to their own rows, offset horizontally;
  • Archived sessions stay quiet: archived conversations never get a bubble; archiving / unarchiving takes effect immediately (already-shown bubbles close at once).

Install

Quick install (recommended):

dsh plugin --profile web add https://github.com/wydddddcool/dsh-hover-approve

One command installs the dependency and registers the bundle (applies cordis.patch.yml automatically); restart dsh web afterwards.

You can also install manually in your profile (e.g. ~/.dsh/profiles/web):

# 1. Add to package.json dependencies:
#    "dsh-hover-approve": "https://github.com/wydddddcool/dsh-hover-approve"
# 2. Add "dsh-hover-approve" to dsh.profile.bundles (applies cordis.patch.yml)
pnpm install
# 3. Restart dsh web

Local development can use a file: path dependency; note pnpm copies file: deps, so re-sync after editing: cp <src>/lib/client.js ~/.dsh/profiles/web/node_modules/dsh-hover-approve/lib/client.js

Relationship with DSH

This is a community plugin (not an official product) for DeepSeek Harness Web. It reads session state through the official client injection (ctx.sessions / ctx.workspaces / ctx.locale) and answers through the official PendingWait.respond() channel — the same server-side path and audit trail as the in-conversation panel. Responses are bound to the approvalId captured at display time: if the request is replaced or already handled, sending is refused, so you can never approve something you didn't see. Tested against dsh 0.1.0-rc.6 (uses pendingInteraction / projectionValues / sessions.open / PendingWait).

Testing

npm install   # first time: installs jsdom
npm test      # 16 cases: four modes, archive filtering, answer encoding, state switching, retry, viewport clamping, teardown

CI (GitHub Actions) runs the tests on every push.

Limitations

  • The command line only shows when a running call matches callId (bash-like tools); other tools show only the action type and note — same as the built-in panel.
  • Row→session mapping matches by title scoring (exact match first); heavily duplicated titles could mis-anchor in rare cases.
  • The bubble depends on the built-in list DOM structure ([role="treeitem"]). If DSH changes that structure, the bubble may silently stop working (no errors) until adapted.

License

MIT License. DeepSeek is a trademark of DeepSeek AI; this is an independent community project, not affiliated with or endorsed by DeepSeek.