Bundle
dsh-session-allow
DSH Web GUI plugin: session-scoped "Allow for this session" option in the approval dialog (per-mode standing grants, localStorage)
- Source
- AnakinCao
- License
- MIT
- Updated
- Updated 3 days ago
Readme
# dsh-session-allow
> 简体中文: [README.zh.md](README.zh.md)
A DSH (DeepSeek Harness) Web GUI plugin that adds an **"Allow for this session"** option to the approval dialog.
When you pick it, a session-scoped, per-mode standing grant is recorded (persisted in `localStorage`, isolated by session id). Later escalation requests of the **same mode** in this session are auto-approved without a dialog; other modes keep prompting as usual.
## What it does
| Scenario | Behavior |
|---|---|
| A tool asks to escalate to `danger-full-access` | Dialog shows: **Reject / Allow once / Allow danger-full-access for this session** |
| You click "Allow for this session" | The current request is allowed and the mode is granted for this session |
| Same mode is requested again in this session | **Silently auto-approved, no dialog** |
| A different mode is requested (not yet granted) | Still prompts normally |
| Bottom of the dialog | Shows this session's granted modes as revocable chips (click × to revoke) |
| Page refresh / new session | Grants persist per session id / stay isolated per session |
## How it works (no core package changes)
The core approval panel is registered on the `conversation.composer` chain slot at priority 1. This plugin registers the same slot at **priority 0** with an identical selector — the chain slot elects the lowest-priority entry whose `select` returns non-null, so this panel fully replaces the core one. Grants live in `localStorage["dsh.sessionAllow.v1"]`; a matching request is auto-answered `allowed-once` on the wire (the host audit still records `approval/asked` + `approval/decided` as usual).
Grant keys: `mode:<mode>` (parsed from the reason `escalate sandbox to <mode>: ...`); non-escalation reasons fall back to `tool:<tool>:<reason>`.
## Install
Method 1 — recommended, one command (restart `dsh web` afterwards):
```bash
dsh plugin --profile web add https://github.com/AnakinCao/dsh-session-allow.git
```
Method 2 — manual: append to `~/.dsh/profiles/web/cordis.patch.yml`:
```yaml
- insert:
- id: dsh-session-allow
name: 'dsh-session-allow'
```
and place the repository content under `~/.dsh/profiles/web/node_modules/dsh-session-allow/` (or `pnpm add`), then restart dsh.
> Pick ONE method — never mount twice.
## Verify
1. The dialog shows three buttons: Reject / Allow once / Allow … for this session.
2. Click "Allow for this session" → the current request is allowed.
3. Trigger the same mode again → no dialog, executes directly.
4. The chips at the bottom show the granted mode; click × to revoke and the mode prompts again.
5. Open another session → that mode still prompts (grants are per-session).
## Uninstall
```bash
dsh plugin --profile web remove dsh-session-allow
```
or delete the `- insert` entry from the profile's `cordis.patch.yml` and remove `node_modules/dsh-session-allow`. Grant data lives in the browser's `localStorage["dsh.sessionAllow.v1"]` and can be cleared manually.
## File structure
```
dsh-session-allow/
├── package.json # dsh.client / dsh.bundle declaration
├── cordis.patch.yml # loader entry registration
├── lib/
│ ├── index.js # host-side placeholder plugin
│ └── client.js # client bundle (panel takeover + session grants)
├── test/
│ └── behavior.test.mjs # grant / auto-allow / revoke regression tests
└── README.md
```
## License
MIT
Install
dsh plugin --profile web add github:AnakinCao/dsh-session-allow
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-session-allow from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.