系统控制
A DeepSeek Harness (DSH) web plugin that adds a System menu to the sidebar footer with Restart and Shutdown controls. Restart cycles the launcher ( dsh web exits with code 42 and is relaunched); Shutdown exits cleanly (0). Both are routed over a loopback RPC channel so non-local callers are rejected automatically.
이것은 DeepSeek Harness(DSH) 플러그인입니다. 이 사이트는 GitHub README, 설치 정보, 유지보수 상태, 공개 보안 시그널을 모아 보여줍니다.
업스트림에서 중국어 README를 제공하지 않아 저장소 원본 내용을 표시합니다.
dsh-system-control
A DeepSeek Harness (DSH) web plugin that adds a System menu to the sidebar footer with Restart and Shutdown controls. Restart cycles the launcher (
dsh webexits with code42and is relaunched); Shutdown exits cleanly (0). Both are routed over a loopback RPC channel so non-local callers are rejected automatically.
The plugin is shipped as a two-sided DSH plugin: a host (Node) half that owns the /system RPC channel and calls the existing appExit exit hook, and a browser half that renders the sidebar button + the centered modal dialog.
🌏 中文版本 / Chinese version is also available.
Features
- Sidebar trigger in the sidebar footer mirroring the official settings button shape (wide-bar / collapsed-circle variants).
- Centered modal with two side-by-side actions: Restart service and Shutdown service. Shutdown asks for a second confirmation (auto-reverts after 4 s).
- Loopback-only RPC so anyone hitting the host port from another network is blocked with
403by DSH's existing authority check. - Ack-before-exit: the response is flushed before
appExit()is invoked (80 ms timer), so the browser receives a clean acknowledgement. - Zero changes to DSH core — installed as an ordinary plugin, survives
@deepseek-ai/dshupdates.
Installation
dsh plugin --profile web add dsh-system-control
Restart dsh web. The new 系统 / System button appears at the bottom of the sidebar.
To install from a local checkout:
dsh plugin --profile web add /path/to/dsh-system-control
Exit-code protocol
| Action | Exit code | Launcher behavior |
|---|---|---|
| Shutdown | 0 | The launcher loop exits and the window closes. |
| Restart | 42 | The launcher loop relaunches dsh web. |
| Status | n/a | Probe: returns { exitAvailable, exitType }. |
The companion launcher DSH Web.ps1 already implements this contract:
- exit
0→ close window, - exit
42→ relaunch, - any other code → log and exit.
If you launch DSH through a different mechanism (systemd unit, plain dsh web, etc.) make sure it understands these codes. Anything else will be treated as a hard crash.
How it works
┌────────────────────┐ connection.rpc.call('/system', 'restart', {}) ┌──────────────────────────┐
│ Sidebar button │ ───────────────────────────────────────────────▶ │ HostConnectionService │
│ + modal (browser) │ │ → loopback authority │
└────────────────────┘ │ → /system handler │
│ → ctx.get('appExit')(42)│
└──────────────────────────┘
- The bundle patch inserts a single host row
system-controlthat injectsconnectionand (transitively, viaconnectionstartup)appExit(which the cmdline launcher registers before any plugin mounts). - The host half registers an RPC handler on channel
/systemwithauthority: 'loopback'. Anything not bound to loopback is automatically rejected. - The browser half registers a slot entry under
sidebar.footer.actionwith order20and renders the trigger + modal component. appExit(code)is invoked throughctx.get('timer').timeout(..., 80)so the200 OKresponse can flush first.
RPC contract (host half)
Channel: /system · authority: loopback (non-local callers get 403).
| Endpoint | Returns |
|---|---|
status | { ok: true, value: { exitAvailable: <is function>, exitType: <typeof> } } |
restart | { ok: true, value: { accepted: true, code: 42 } } then appExit(42) after ~80 ms. |
shutdown | { ok: true, value: { accepted: true, code: 0 } } then appExit(0) after ~80 ms. |
| anything else | { ok: false, error: { code: 'internal', message: 'unknown endpoint …' } } |
The status endpoint is purely a sanity probe used by the modal to display "退出通道:可用 / 不可用" in the dialog header.
Repository layout
system-control/
├── cordis.patch.yml # bundle patch: insert the system-control row
├── lib/
│ ├── index.js # host half (Node): /system RPC + appExit bridge
│ └── client.js # browser half: sidebar trigger + modal
├── package.json
└── README.md
The cordis.patch.yml adds a single row to the host composition tree that injects connection. appExit is provided by the cmdline launcher before the tree mounts, so it is consumed implicitly rather than declared in inject: [...].
Compatibility
@deepseek-ai/dsh≥ current web profile (consumesconnection,slots,timer).- Node ≥ 18 (matches DSH host runtime).
- Browser: Chromium-based (uses standard React +
KeyboardEvent/documentAPIs).
License
MIT
보안 및 설치 증거
이 점수는 공개 저장소 메타데이터와 이 사이트에 등록된 설치 증거에만 기반하며, 코드 보안 감사와 다릅니다.
공개 플러그인 카탈로그에서 왔으며, 공개 GitHub 저장소로 연결됩니다.
GitHub 메타데이터에서 라이선스가 감지되지 않았습니다.
최근 180일 내 코드 업데이트가 있습니다.
재현 가능한 정확한 설치 메타데이터가 아직 등록되지 않았습니다. 저장소 설명에 따라 직접 확인하세요.
검사한 패키지 메타데이터에 설치 라이프사이클 스크립트가 선언되지 않았습니다.
missing-license